Last active
December 28, 2023 01:54
-
-
Save lvenezia/173737e5d254c4d855d61f3a789df909 to your computer and use it in GitHub Desktop.
Create a new snippet from a blank template.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
name: VonageExcelScriptLab | |
description: Embed a Vonage Business Communications dialer into Microsoft Excel Online | |
host: EXCEL | |
api_set: {} | |
script: | |
content: |+ | |
function handleSelectionChanged(event) { | |
return Excel.run(function (context) { | |
var range = context.workbook.getSelectedRange().load(); | |
return context.sync().then(function () { | |
const selectedContent = JSON.stringify(range.values, null, 4); | |
const rowString = JSON.stringify(range.rowIndex, null, 4); | |
const rowIndex = Number(rowString) + 1; | |
if (selectedContent.match("Dial")) { | |
placeCall(rowIndex); | |
} | |
}); | |
}).catch(errorHandlerFunction); | |
} | |
function placeCall(row) { | |
return Excel.run(function (context) { | |
var toNumberRange = context.workbook.worksheets | |
.getItem("Sheet1") | |
.getRange("D" + row) | |
.load(); | |
return context.sync().then(function () { | |
const toNumber = JSON.stringify(toNumberRange.values, null, 4); | |
//console.log("toNumber: " + toNumber); | |
VonageDialer.placeCall(toNumber); | |
}); | |
}).catch(errorHandlerFunction); | |
} | |
function populateSampleData() { | |
return Excel.run(function (context) { | |
var worksheet = context.workbook.worksheets.getItem("Sheet1"); | |
const data = [ | |
["Company", "Contact Last", "Contact First", "Number", ""], | |
["Widget Zone", "Anderson", "Wendy", "555-555-5555", "Dial"], | |
["Widgets Galore", "Burns", "Ryan", "555-555-5555", "Dial"], | |
["Widgets Emporium", "Johnson", "Amanda", "555-555-5555", "Dial"] | |
]; | |
var range = worksheet.getRange("A2:E5"); | |
range.values = data; | |
range.format.autofitColumns(); | |
return context.sync().then(function () { }); | |
}).catch(errorHandlerFunction); | |
} | |
function translateContacts(excelData) { | |
excelData = JSON.parse(excelData); | |
let len = excelData.length, | |
contactsData = [], | |
obj = new Object(), | |
objString = "", | |
i; | |
for (i = 0; i < len; i += 1) { | |
if (excelData[i][4] == "Dial") { | |
obj["provider"] = "excel"; | |
obj["id"] = i; | |
obj["label"] = excelData[i][2] + " " + excelData[i][1] + " of " + excelData[i][0]; | |
obj["type"] = "Contact"; | |
const ph = libphonenumber.parsePhoneNumber(excelData[i][3], countryCode); | |
obj["phoneNumber"] = ph.format("INTERNATIONAL").replace(/\D/g, ""); | |
objString = JSON.stringify(obj); | |
contactsData.push(JSON.parse(objString)); | |
} | |
} | |
return contactsData; | |
} | |
function filterContacts(query, contacts) { | |
const sortedContacts = contacts.sort(function (a, b) { | |
const labelA = a.label.toUpperCase(); // ignore upper and lowercase | |
const labelB = b.label.toUpperCase(); // ignore upper and lowercase | |
if (labelA < labelB) { | |
return -1; | |
} | |
if (labelA > labelB) { | |
return 1; | |
} | |
// names must be equal | |
return 0; | |
}); | |
let filteredContacts = []; | |
for (let i = 0; i < sortedContacts.length; i++) { | |
if ( | |
JSON.stringify(Object.values(sortedContacts[i]).filter(item => item !== "excel")) | |
.toUpperCase() | |
.indexOf(query.toUpperCase()) > 0 | |
) { | |
filteredContacts.push(sortedContacts[i]); | |
const ph = libphonenumber.parsePhoneNumber(sortedContacts[i].phoneNumber, countryCode); | |
sortedContacts[i].phoneNumber = ph.format("INTERNATIONAL"); | |
} | |
} | |
return filteredContacts; | |
} | |
function errorHandlerFunction(e) { | |
console.log(e); | |
} | |
const countryCode = "US"; | |
VonageDialer.setCountryCode(countryCode); | |
VonageDialer.init( | |
{ | |
features: { | |
contactsProvider: true, | |
openContact: true | |
} | |
}, | |
(dialer) => { | |
dialer.registerSvgIcon( | |
"excel", | |
"data: image / svg + xml; utf8; base64, PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB3aWR0aD0iMTkwIiBoZWlnaHQ9IjE2NiIgdmlld0JveD0iMCAwIDE5MCAxNjYiPjxkZWZzPjxyZWN0IGlkPSJqIiB3aWR0aD0iMTQyIiBoZWlnaHQ9IjE2NiIgcng9IjgiLz48bGluZWFyR3JhZGllbnQgaWQ9ImwiIHgxPSI2LjI5NCUiIHgyPSIxMDMuNDAyJSIgeTE9IjAlIiB5Mj0iMTAzLjUlIj48c3RvcCBvZmZzZXQ9IjAlIiBzdG9wLWNvbG9yPSIjMDA3NDM4Ii8 + PHN0b3Agb2Zmc2V0PSI5Ny4zNCUiIHN0b3AtY29sb3I9IiMwMDhCNDQiLz48L2xpbmVhckdyYWRpZW50PjxyZWN0IGlkPSJtIiB3aWR0aD0iNzEiIGhlaWdodD0iNDIiIHk9IjQxIi8 + PHBhdHRlcm4gaWQ9Im4iIHdpZHRoPSI1MTIiIGhlaWdodD0iNTEyIiB4PSItNTEyIiB5PSItNDcxIiBwYXR0ZXJuVW5pdHM9InVzZXJTcGFjZU9uVXNlIj48dXNlIHhsaW5rOmhyZWY9IiNhIi8 + PC9wYXR0ZXJuPjxmaWx0ZXIgaWQ9Im8iIHdpZHRoPSIxMDIuOCUiIGhlaWdodD0iMTA0LjglIiB4PSItMS40JSIgeT0iLTIuNCUiIGZpbHRlclVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCI + PGZlT2Zmc2V0IGR4PSItMSIgaW49IlNvdXJjZUFscGhhIiByZXN1bHQ9InNoYWRvd09mZnNldElubmVyMSIvPjxmZUNvbXBvc2l0ZSBpbj0ic2hhZG93T2Zmc2V0SW5uZXIxIiBpbjI9IlNvdXJjZUFscGhhIiBrMj0iLTEiIGszPSIxIiBvcGVyYXRvcj0iYXJpdGhtZXRpYyIgcmVzdWx0PSJzaGFkb3dJbm5lcklubmVyMSIvPjxmZUNvbG9yTWF0cml4IGluPSJzaGFkb3dJbm5lcklubmVyMSIgcmVzdWx0PSJzaGFkb3dNYXRyaXhJbm5lcjEiIHZhbHVlcz0iMCAwIDAgMCAxICAgMCAwIDAgMCAxICAgMCAwIDAgMCAxICAwIDAgMCAwLjEgMCIvPjxmZUdhdXNzaWFuQmx1ciBpbj0iU291cmNlQWxwaGEiIHJlc3VsdD0ic2hhZG93Qmx1cklubmVyMiIgc3RkRGV2aWF0aW9uPSIuNSIvPjxmZU9mZnNldCBkeT0iMSIgaW49InNoYWRvd0JsdXJJbm5lcjIiIHJlc3VsdD0ic2hhZG93T2Zmc2V0SW5uZXIyIi8 + PGZlQ29tcG9zaXRlIGluPSJzaGFkb3dPZmZzZXRJbm5lcjIiIGluMj0iU291cmNlQWxwaGEiIGsyPSItMSIgazM9IjEiIG9wZXJhdG9yPSJhcml0aG1ldGljIiByZXN1bHQ9InNoYWRvd0lubmVySW5uZXIyIi8 + PGZlQ29sb3JNYXRyaXggaW49InNoYWRvd0lubmVySW5uZXIyIiByZXN1bHQ9InNoYWRvd01hdHJpeElubmVyMiIgdmFsdWVzPSIwIDAgMCAwIDAgICAwIDAgMCAwIDAgICAwIDAgMCAwIDAgIDAgMCAwIDAuMDggMCIvPjxmZU1lcmdlPjxmZU1lcmdlTm9kZSBpbj0ic2hhZG93TWF0cml4SW5uZXIxIi8 + PGZlTWVyZ2VOb2RlIGluPSJzaGFkb3dNYXRyaXhJbm5lcjIiLz48L2ZlTWVyZ2U + PC9maWx0ZXI + PGxpbmVhckdyYWRpZW50IGlkPSJwIiB4MT0iMTA3LjQ2NiUiIHgyPSI2LjI5NCUiIHkxPSIxMDcuODMxJSIgeTI9IjAlIj48c3RvcCBvZmZzZXQ9IjAlIiBzdG9wLWNvbG9yPSIjMDBENTc2Ii8 + PHN0b3Agb2Zmc2V0PSI5Ny4wMjYlIiBzdG9wLWNvbG9yPSIjMDBBMDU0Ii8 + PC9saW5lYXJHcmFkaWVudD48cmVjdCBpZD0icSIgd2lkdGg9IjcxIiBoZWlnaHQ9IjQyIiB4PSI3MSIgeT0iNDEiLz48cGF0dGVybiBpZD0iciIgd2lkdGg9IjUxMiIgaGVpZ2h0PSI1MTIiIHg9Ii00NDEiIHk9Ii00NzEiIHBhdHRlcm5Vbml0cz0idXNlclNwYWNlT25Vc2UiPjx1c2UgeGxpbms6aHJlZj0iI2IiLz48L3BhdHRlcm4 + PGZpbHRlciBpZD0icyIgd2lkdGg9IjE0My43JSIgaGVpZ2h0PSIxNzMuOCUiIHg9Ii0yMS44JSIgeT0iLTM2LjklIiBmaWx0ZXJVbml0cz0ib2JqZWN0Qm91bmRpbmdCb3giPjxmZU9mZnNldCBkeT0iLTEiIGluPSJTb3VyY2VBbHBoYSIgcmVzdWx0PSJzaGFkb3dPZmZzZXRJbm5lcjEiLz48ZmVDb21wb3NpdGUgaW49InNoYWRvd09mZnNldElubmVyMSIgaW4yPSJTb3VyY2VBbHBoYSIgazI9Ii0xIiBrMz0iMSIgb3BlcmF0b3I9ImFyaXRobWV0aWMiIHJlc3VsdD0ic2hhZG93SW5uZXJJbm5lcjEiLz48ZmVDb2xvck1hdHJpeCBpbj0ic2hhZG93SW5uZXJJbm5lcjEiIHJlc3VsdD0ic2hhZG93TWF0cml4SW5uZXIxIiB2YWx1ZXM9IjAgMCAwIDAgMSAgIDAgMCAwIDAgMSAgIDAgMCAwIDAgMSAgMCAwIDAgMC4wNSAwIi8 + PGZlR2F1c3NpYW5CbHVyIGluPSJTb3VyY2VBbHBoYSIgcmVzdWx0PSJzaGFkb3dCbHVySW5uZXIyIiBzdGREZXZpYXRpb249IjEwIi8 + PGZlT2Zmc2V0IGR5PSIxMSIgaW49InNoYWRvd0JsdXJJbm5lcjIiIHJlc3VsdD0ic2hhZG93T2Zmc2V0SW5uZXIyIi8 + PGZlQ29tcG9zaXRlIGluPSJzaGFkb3dPZmZzZXRJbm5lcjIiIGluMj0iU291cmNlQWxwaGEiIGsyPSItMSIgazM9IjEiIG9wZXJhdG9yPSJhcml0aG1ldGljIiByZXN1bHQ9InNoYWRvd0lubmVySW5uZXIyIi8 + PGZlQ29sb3JNYXRyaXggaW49InNoYWRvd0lubmVySW5uZXIyIiByZXN1bHQ9InNoYWRvd01hdHJpeElubmVyMiIgdmFsdWVzPSIwIDAgMCAwIDAgICAwIDAgMCAwIDAgICAwIDAgMCAwIDAgIDAgMCAwIDAuMTQgMCIvPjxmZU9mZnNldCBkeD0iMSIgZHk9IjEiIGluPSJTb3VyY2VBbHBoYSIgcmVzdWx0PSJzaGFkb3dPZmZzZXRJbm5lcjMiLz48ZmVDb21wb3NpdGUgaW49InNoYWRvd09mZnNldElubmVyMyIgaW4yPSJTb3VyY2VBbHBoYSIgazI9Ii0xIiBrMz0iMSIgb3BlcmF0b3I9ImFyaXRobWV0aWMiIHJlc3VsdD0ic2hhZG93SW5uZXJJbm5lcjMiLz48ZmVDb2xvck1hdHJpeCBpbj0ic2hhZG93SW5uZXJJbm5lcjMiIHJlc3VsdD0ic2hhZG93TWF0cml4SW5uZXIzIiB2YWx1ZXM9IjAgMCAwIDAgMCAgIDAgMCAwIDAgMCAgIDAgMCAwIDAgMCAgMCAwIDAgMC4xNSAwIi8 + PGZlTWVyZ2U + PGZlTWVyZ2VOb2RlIGluPSJzaGFkb3dNYXRyaXhJbm5lcjEiLz48ZmVNZXJnZU5vZGUgaW49InNoYWRvd01hdHJpeElubmVyMiIvPjxmZU1lcmdlTm9kZSBpbj0ic2hhZG93TWF0cml4SW5uZXIzIi8 + PC9mZU1lcmdlPjwvZmlsdGVyPjxsaW5lYXJHcmFkaWVudCBpZD0idCIgeDE9IjYuMjk0JSIgeDI9IjEwNy40NjYlIiB5MT0iMCUiIHkyPSIxMDcuODMxJSI + PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzAwN0U0MiIvPjxzdG9wIG9mZnNldD0iOTUuOTgzJSIgc3RvcC1jb2xvcj0iIzAwOUE1MCIvPjwvbGluZWFyR3JhZGllbnQ + PHJlY3QgaWQ9InUiIHdpZHRoPSI3MSIgaGVpZ2h0PSI0MiIgeT0iLTEiLz48cGF0dGVybiBpZD0idiIgd2lkdGg9IjUxMiIgaGVpZ2h0PSI1MTIiIHg9Ii01MTIiIHk9Ii01MTMiIHBhdHRlcm5Vbml0cz0idXNlclNwYWNlT25Vc2UiPjx1c2UgeGxpbms6aHJlZj0iI2MiLz48L3BhdHRlcm4 + PGZpbHRlciBpZD0idyIgd2lkdGg9IjEwMS40JSIgaGVpZ2h0PSIxMDIuNCUiIHg9Ii0uNyUiIHk9Ii0xLjIlIiBmaWx0ZXJVbml0cz0ib2JqZWN0Qm91bmRpbmdCb3giPjxmZU9mZnNldCBkeT0iLTEiIGluPSJTb3VyY2VBbHBoYSIgcmVzdWx0PSJzaGFkb3dPZmZzZXRJbm5lcjEiLz48ZmVDb21wb3NpdGUgaW49InNoYWRvd09mZnNldElubmVyMSIgaW4yPSJTb3VyY2VBbHBoYSIgazI9Ii0xIiBrMz0iMSIgb3BlcmF0b3I9ImFyaXRobWV0aWMiIHJlc3VsdD0ic2hhZG93SW5uZXJJbm5lcjEiLz48ZmVDb2xvck1hdHJpeCBpbj0ic2hhZG93SW5uZXJJbm5lcjEiIHZhbHVlcz0iMCAwIDAgMCAxICAgMCAwIDAgMCAxICAgMCAwIDAgMCAxICAwIDAgMCAwLjE1IDAiLz48L2ZpbHRlcj48bGluZWFyR3JhZGllbnQgaWQ9IngiIHgxPSI2LjI5NCUiIHgyPSIxMDcuNDY2JSIgeTE9IjAlIiB5Mj0iMTA3LjgzMSUiPjxzdG9wIG9mZnNldD0iMCUiIHN0b3AtY29sb3I9IiMwMEFENjEiLz48c3RvcCBvZmZzZXQ9IjEwMCUiIHN0b3AtY29sb3I9IiMwMEUxOEMiLz48L2xpbmVhckdyYWRpZW50PjxyZWN0IGlkPSJ5IiB3aWR0aD0iNzEiIGhlaWdodD0iNDIiIHg9IjcxIiB5PSItMSIvPjxwYXR0ZXJuIGlkPSJ6IiB3aWR0aD0iNTEyIiBoZWlnaHQ9IjUxMiIgeD0iLTQ0MSIgeT0iLTUxMyIgcGF0dGVyblVuaXRzPSJ1c2VyU3BhY2VPblVzZSI + PHVzZSB4bGluazpocmVmPSIjZCIvPjwvcGF0dGVybj48ZmlsdGVyIGlkPSJBIiB3aWR0aD0iMTAyLjglIiBoZWlnaHQ9IjEwNC44JSIgeD0iLTEuNCUiIHk9Ii0yLjQlIiBmaWx0ZXJVbml0cz0ib2JqZWN0Qm91bmRpbmdCb3giPjxmZU9mZnNldCBkeT0iLTEiIGluPSJTb3VyY2VBbHBoYSIgcmVzdWx0PSJzaGFkb3dPZmZzZXRJbm5lcjEiLz48ZmVDb21wb3NpdGUgaW49InNoYWRvd09mZnNldElubmVyMSIgaW4yPSJTb3VyY2VBbHBoYSIgazI9Ii0xIiBrMz0iMSIgb3BlcmF0b3I9ImFyaXRobWV0aWMiIHJlc3VsdD0ic2hhZG93SW5uZXJJbm5lcjEiLz48ZmVDb2xvck1hdHJpeCBpbj0ic2hhZG93SW5uZXJJbm5lcjEiIHJlc3VsdD0ic2hhZG93TWF0cml4SW5uZXIxIiB2YWx1ZXM9IjAgMCAwIDAgMSAgIDAgMCAwIDAgMSAgIDAgMCAwIDAgMSAgMCAwIDAgMC4xNSAwIi8 + PGZlT2Zmc2V0IGR4PSIyIiBpbj0iU291cmNlQWxwaGEiIHJlc3VsdD0ic2hhZG93T2Zmc2V0SW5uZXIyIi8 + PGZlQ29tcG9zaXRlIGluPSJzaGFkb3dPZmZzZXRJbm5lcjIiIGluMj0iU291cmNlQWxwaGEiIGsyPSItMSIgazM9IjEiIG9wZXJhdG9yPSJhcml0aG1ldGljIiByZXN1bHQ9InNoYWRvd0lubmVySW5uZXIyIi8 + PGZlQ29sb3JNYXRyaXggaW49InNoYWRvd0lubmVySW5uZXIyIiByZXN1bHQ9InNoYWRvd01hdHJpeElubmVyMiIgdmFsdWVzPSIwIDAgMCAwIDAgICAwIDAgMCAwIDAuNzA5ODAzOTIyICAgMCAwIDAgMCAwLjM3MjU0OTAyICAwIDAgMCAwLjYzIDAiLz48ZmVNZXJnZT48ZmVNZXJnZU5vZGUgaW49InNoYWRvd01hdHJpeElubmVyMSIvPjxmZU1lcmdlTm9kZSBpbj0ic2hhZG93TWF0cml4SW5uZXIyIi8 + PC9mZU1lcmdlPjwvZmlsdGVyPjxsaW5lYXJHcmFkaWVudCBpZD0iQiIgeDE9IjEwNy40NjYlIiB4Mj0iOS4zMDMlIiB5MT0iMTA3LjgzMSUiIHkyPSIzLjIwNyUiPjxzdG9wIG9mZnNldD0iMCUiIHN0b3AtY29sb3I9IiMwMDNEMjAiLz48c3RvcCBvZmZzZXQ9IjEwMCUiIHN0b3AtY29sb3I9IiMwMDRGMkEiLz48L2xpbmVhckdyYWRpZW50PjxyZWN0IGlkPSJDIiB3aWR0aD0iNzEiIGhlaWdodD0iNDIiIHk9IjgzIi8 + PHBhdHRlcm4gaWQ9IkQiIHdpZHRoPSI1MTIiIGhlaWdodD0iNTEyIiB4PSItNTEyIiB5PSItNDI5IiBwYXR0ZXJuVW5pdHM9InVzZXJTcGFjZU9uVXNlIj48dXNlIHhsaW5rOmhyZWY9IiNlIi8 + PC9wYXR0ZXJuPjxmaWx0ZXIgaWQ9IkUiIHdpZHRoPSIxMDIuOCUiIGhlaWdodD0iMTA0LjglIiB4PSItMS40JSIgeT0iLTIuNCUiIGZpbHRlclVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCI + PGZlT2Zmc2V0IGR4PSItMSIgaW49IlNvdXJjZUFscGhhIiByZXN1bHQ9InNoYWRvd09mZnNldElubmVyMSIvPjxmZUNvbXBvc2l0ZSBpbj0ic2hhZG93T2Zmc2V0SW5uZXIxIiBpbjI9IlNvdXJjZUFscGhhIiBrMj0iLTEiIGszPSIxIiBvcGVyYXRvcj0iYXJpdGhtZXRpYyIgcmVzdWx0PSJzaGFkb3dJbm5lcklubmVyMSIvPjxmZUNvbG9yTWF0cml4IGluPSJzaGFkb3dJbm5lcklubmVyMSIgcmVzdWx0PSJzaGFkb3dNYXRyaXhJbm5lcjEiIHZhbHVlcz0iMCAwIDAgMCAxICAgMCAwIDAgMCAxICAgMCAwIDAgMCAxICAwIDAgMCAwLjcgMCIvPjxmZU9mZnNldCBkeD0iMiIgZHk9IjEiIGluPSJTb3VyY2VBbHBoYSIgcmVzdWx0PSJzaGFkb3dPZmZzZXRJbm5lcjIiLz48ZmVDb21wb3NpdGUgaW49InNoYWRvd09mZnNldElubmVyMiIgaW4yPSJTb3VyY2VBbHBoYSIgazI9Ii0xIiBrMz0iMSIgb3BlcmF0b3I9ImFyaXRobWV0aWMiIHJlc3VsdD0ic2hhZG93SW5uZXJJbm5lcjIiLz48ZmVDb2xvck1hdHJpeCBpbj0ic2hhZG93SW5uZXJJbm5lcjIiIHJlc3VsdD0ic2hhZG93TWF0cml4SW5uZXIyIiB2YWx1ZXM9IjAgMCAwIDAgMCAgIDAgMCAwIDAgMCAgIDAgMCAwIDAgMCAgMCAwIDAgMC4wOCAwIi8 + PGZlTWVyZ2U + PGZlTWVyZ2VOb2RlIGluPSJzaGFkb3dNYXRyaXhJbm5lcjEiLz48ZmVNZXJnZU5vZGUgaW49InNoYWRvd01hdHJpeElubmVyMiIvPjwvZmVNZXJnZT48L2ZpbHRlcj48bGluZWFyR3JhZGllbnQgaWQ9IkYiIHgxPSIxMDcuNDY2JSIgeDI9IjkuMzAzJSIgeTE9IjEwNy44MzElIiB5Mj0iMy4yMDclIj48c3RvcCBvZmZzZXQ9IjAlIiBzdG9wLWNvbG9yPSIjMDBDMTY1Ii8 + PHN0b3Agb2Zmc2V0PSIxMDAlIiBzdG9wLWNvbG9yPSIjMDA4RDQ2Ii8 + PC9saW5lYXJHcmFkaWVudD48cmVjdCBpZD0iRyIgd2lkdGg9IjcxIiBoZWlnaHQ9IjQyIiB4PSI3MSIgeT0iODMiLz48cGF0dGVybiBpZD0iSCIgd2lkdGg9IjUxMiIgaGVpZ2h0PSI1MTIiIHg9Ii00NDEiIHk9Ii00MjkiIHBhdHRlcm5Vbml0cz0idXNlclNwYWNlT25Vc2UiPjx1c2UgeGxpbms6aHJlZj0iI2YiLz48L3BhdHRlcm4 + PGZpbHRlciBpZD0iSSIgd2lkdGg9IjEwMS40JSIgaGVpZ2h0PSIxMDIuNCUiIHg9Ii0uNyUiIHk9Ii0xLjIlIiBmaWx0ZXJVbml0cz0ib2JqZWN0Qm91bmRpbmdCb3giPjxmZU9mZnNldCBkeT0iLTEiIGluPSJTb3VyY2VBbHBoYSIgcmVzdWx0PSJzaGFkb3dPZmZzZXRJbm5lcjEiLz48ZmVDb21wb3NpdGUgaW49InNoYWRvd09mZnNldElubmVyMSIgaW4yPSJTb3VyY2VBbHBoYSIgazI9Ii0xIiBrMz0iMSIgb3BlcmF0b3I9ImFyaXRobWV0aWMiIHJlc3VsdD0ic2hhZG93SW5uZXJJbm5lcjEiLz48ZmVDb2xvck1hdHJpeCBpbj0ic2hhZG93SW5uZXJJbm5lcjEiIHJlc3VsdD0ic2hhZG93TWF0cml4SW5uZXIxIiB2YWx1ZXM9IjAgMCAwIDAgMCAgIDAgMCAwIDAgMCAgIDAgMCAwIDAgMCAgMCAwIDAgMC4xMiAwIi8 + PGZlT2Zmc2V0IGR4PSIxIiBkeT0iMSIgaW49IlNvdXJjZUFscGhhIiByZXN1bHQ9InNoYWRvd09mZnNldElubmVyMiIvPjxmZUNvbXBvc2l0ZSBpbj0ic2hhZG93T2Zmc2V0SW5uZXIyIiBpbjI9IlNvdXJjZUFscGhhIiBrMj0iLTEiIGszPSIxIiBvcGVyYXRvcj0iYXJpdGhtZXRpYyIgcmVzdWx0PSJzaGFkb3dJbm5lcklubmVyMiIvPjxmZUNvbG9yTWF0cml4IGluPSJzaGFkb3dJbm5lcklubmVyMiIgcmVzdWx0PSJzaGFkb3dNYXRyaXhJbm5lcjIiIHZhbHVlcz0iMCAwIDAgMCAwICAgMCAwIDAgMCAwICAgMCAwIDAgMCAwICAwIDAgMCAwLjA1IDAiLz48ZmVNZXJnZT48ZmVNZXJnZU5vZGUgaW49InNoYWRvd01hdHJpeElubmVyMSIvPjxmZU1lcmdlTm9kZSBpbj0ic2hhZG93TWF0cml4SW5uZXIyIi8 + PC9mZU1lcmdlPjwvZmlsdGVyPjxsaW5lYXJHcmFkaWVudCBpZD0iSiIgeDE9IjEwNy40NjYlIiB4Mj0iOS4zMDMlIiB5MT0iMTA3LjgzMSUiIHkyPSIzLjIwNyUiPjxzdG9wIG9mZnNldD0iMCUiIHN0b3AtY29sb3I9IiMwMDUyMkUiLz48c3RvcCBvZmZzZXQ9IjEwMCUiIHN0b3AtY29sb3I9IiMwMDNCMjAiLz48L2xpbmVhckdyYWRpZW50PjxyZWN0IGlkPSJLIiB3aWR0aD0iNzEiIGhlaWdodD0iNDIiIHk9IjEyNSIvPjxwYXR0ZXJuIGlkPSJMIiB3aWR0aD0iNTEyIiBoZWlnaHQ9IjUxMiIgeD0iLTUxMiIgeT0iLTM4NyIgcGF0dGVyblVuaXRzPSJ1c2VyU3BhY2VPblVzZSI + PHVzZSB4bGluazpocmVmPSIjZyIvPjwvcGF0dGVybj48ZmlsdGVyIGlkPSJNIiB3aWR0aD0iMTAyLjglIiBoZWlnaHQ9IjEwNC44JSIgeD0iLTEuNCUiIHk9Ii0yLjQlIiBmaWx0ZXJVbml0cz0ib2JqZWN0Qm91bmRpbmdCb3giPjxmZU9mZnNldCBkeD0iLTEiIGluPSJTb3VyY2VBbHBoYSIgcmVzdWx0PSJzaGFkb3dPZmZzZXRJbm5lcjEiLz48ZmVDb21wb3NpdGUgaW49InNoYWRvd09mZnNldElubmVyMSIgaW4yPSJTb3VyY2VBbHBoYSIgazI9Ii0xIiBrMz0iMSIgb3BlcmF0b3I9ImFyaXRobWV0aWMiIHJlc3VsdD0ic2hhZG93SW5uZXJJbm5lcjEiLz48ZmVDb2xvck1hdHJpeCBpbj0ic2hhZG93SW5uZXJJbm5lcjEiIHJlc3VsdD0ic2hhZG93TWF0cml4SW5uZXIxIiB2YWx1ZXM9IjAgMCAwIDAgMSAgIDAgMCAwIDAgMSAgIDAgMCAwIDAgMSAgMCAwIDAgMC4xNSAwIi8 + PGZlT2Zmc2V0IGR4PSIxIiBpbj0iU291cmNlQWxwaGEiIHJlc3VsdD0ic2hhZG93T2Zmc2V0SW5uZXIyIi8 + PGZlQ29tcG9zaXRlIGluPSJzaGFkb3dPZmZzZXRJbm5lcjIiIGluMj0iU291cmNlQWxwaGEiIGsyPSItMSIgazM9IjEiIG9wZXJhdG9yPSJhcml0aG1ldGljIiByZXN1bHQ9InNoYWRvd0lubmVySW5uZXIyIi8 + PGZlQ29sb3JNYXRyaXggaW49InNoYWRvd0lubmVySW5uZXIyIiByZXN1bHQ9InNoYWRvd01hdHJpeElubmVyMiIgdmFsdWVzPSIwIDAgMCAwIDEgICAwIDAgMCAwIDEgICAwIDAgMCAwIDEgIDAgMCAwIDAuMTUgMCIvPjxmZU9mZnNldCBkeD0iMiIgZHk9IjEiIGluPSJTb3VyY2VBbHBoYSIgcmVzdWx0PSJzaGFkb3dPZmZzZXRJbm5lcjMiLz48ZmVDb21wb3NpdGUgaW49InNoYWRvd09mZnNldElubmVyMyIgaW4yPSJTb3VyY2VBbHBoYSIgazI9Ii0xIiBrMz0iMSIgb3BlcmF0b3I9ImFyaXRobWV0aWMiIHJlc3VsdD0ic2hhZG93SW5uZXJJbm5lcjMiLz48ZmVDb2xvck1hdHJpeCBpbj0ic2hhZG93SW5uZXJJbm5lcjMiIHJlc3VsdD0ic2hhZG93TWF0cml4SW5uZXIzIiB2YWx1ZXM9IjAgMCAwIDAgMCAgIDAgMCAwIDAgMCAgIDAgMCAwIDAgMCAgMCAwIDAgMC4wOCAwIi8 + PGZlTWVyZ2U + PGZlTWVyZ2VOb2RlIGluPSJzaGFkb3dNYXRyaXhJbm5lcjEiLz48ZmVNZXJnZU5vZGUgaW49InNoYWRvd01hdHJpeElubmVyMiIvPjxmZU1lcmdlTm9kZSBpbj0ic2hhZG93TWF0cml4SW5uZXIzIi8 + PC9mZU1lcmdlPjwvZmlsdGVyPjxsaW5lYXJHcmFkaWVudCBpZD0iTiIgeDE9IjEwNy40NjYlIiB4Mj0iOS4zMDMlIiB5MT0iMTA3LjgzMSUiIHkyPSIzLjIwNyUiPjxzdG9wIG9mZnNldD0iMCUiIHN0b3AtY29sb3I9IiMwMDZEM0QiLz48c3RvcCBvZmZzZXQ9IjEwMCUiIHN0b3AtY29sb3I9IiMwMDRDMjkiLz48L2xpbmVhckdyYWRpZW50PjxyZWN0IGlkPSJPIiB3aWR0aD0iNzEiIGhlaWdodD0iNDIiIHg9IjcxIiB5PSIxMjUiLz48cGF0dGVybiBpZD0iUCIgd2lkdGg9IjUxMiIgaGVpZ2h0PSI1MTIiIHg9Ii00NDEiIHk9Ii0zODciIHBhdHRlcm5Vbml0cz0idXNlclNwYWNlT25Vc2UiPjx1c2UgeGxpbms6aHJlZj0iI2giLz48L3BhdHRlcm4 + PGZpbHRlciBpZD0iUSIgd2lkdGg9IjEwMi44JSIgaGVpZ2h0PSIxMDQuOCUiIHg9Ii0xLjQlIiB5PSItMi40JSIgZmlsdGVyVW5pdHM9Im9iamVjdEJvdW5kaW5nQm94Ij48ZmVPZmZzZXQgZHg9Ii0xIiBpbj0iU291cmNlQWxwaGEiIHJlc3VsdD0ic2hhZG93T2Zmc2V0SW5uZXIxIi8 + PGZlQ29tcG9zaXRlIGluPSJzaGFkb3dPZmZzZXRJbm5lcjEiIGluMj0iU291cmNlQWxwaGEiIGsyPSItMSIgazM9IjEiIG9wZXJhdG9yPSJhcml0aG1ldGljIiByZXN1bHQ9InNoYWRvd0lubmVySW5uZXIxIi8 + PGZlQ29sb3JNYXRyaXggaW49InNoYWRvd0lubmVySW5uZXIxIiByZXN1bHQ9InNoYWRvd01hdHJpeElubmVyMSIgdmFsdWVzPSIwIDAgMCAwIDEgICAwIDAgMCAwIDEgICAwIDAgMCAwIDEgIDAgMCAwIDAuMDggMCIvPjxmZU9mZnNldCBkeD0iMiIgZHk9IjEiIGluPSJTb3VyY2VBbHBoYSIgcmVzdWx0PSJzaGFkb3dPZmZzZXRJbm5lcjIiLz48ZmVDb21wb3NpdGUgaW49InNoYWRvd09mZnNldElubmVyMiIgaW4yPSJTb3VyY2VBbHBoYSIgazI9Ii0xIiBrMz0iMSIgb3BlcmF0b3I9ImFyaXRobWV0aWMiIHJlc3VsdD0ic2hhZG93SW5uZXJJbm5lcjIiLz48ZmVDb2xvck1hdHJpeCBpbj0ic2hhZG93SW5uZXJJbm5lcjIiIHJlc3VsdD0ic2hhZG93TWF0cml4SW5uZXIyIiB2YWx1ZXM9IjAgMCAwIDAgMCAgIDAgMCAwIDAgMCAgIDAgMCAwIDAgMCAgMCAwIDAgMC4wMSAwIi8 + PGZlTWVyZ2U + PGZlTWVyZ2VOb2RlIGluPSJzaGFkb3dNYXRyaXhJbm5lcjEiLz48ZmVNZXJnZU5vZGUgaW49InNoYWRvd01hdHJpeElubmVyMiIvPjwvZmVNZXJnZT48L2ZpbHRlcj48cmVjdCBpZD0iUiIgd2lkdGg9IjE0MiIgaGVpZ2h0PSIxNjYiIHJ4PSI4Ii8 + PGZpbHRlciBpZD0iUyIgd2lkdGg9IjExNyUiIGhlaWdodD0iMTE3JSIgeD0iLTguNSUiIHk9Ii04LjUlIiBmaWx0ZXJVbml0cz0ib2JqZWN0Qm91bmRpbmdCb3giPjxmZUdhdXNzaWFuQmx1ciBpbj0iU291cmNlR3JhcGhpYyIgc3RkRGV2aWF0aW9uPSIzIi8 + PC9maWx0ZXI + PGxpbmVhckdyYWRpZW50IGlkPSJWIiB4MT0iMTEzLjE3NyUiIHgyPSIyLjE1MSUiIHkxPSIxMDQuNjczJSIgeTI9IjkuNzEzJSI + PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzAwODAzNCIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iIzAwNEYyMSIvPjwvbGluZWFyR3JhZGllbnQ + PHJhZGlhbEdyYWRpZW50IGlkPSJXIiBjeD0iODYuNjAxJSIgY3k9Ijg0LjIxJSIgcj0iNjIuMzk4JSIgZng9Ijg2LjYwMSUiIGZ5PSI4NC4yMSUiPjxzdG9wIG9mZnNldD0iMCUiIHN0b3AtY29sb3I9IiMwMTgxMzciLz48c3RvcCBvZmZzZXQ9IjEwMCUiIHN0b3AtY29sb3I9IiMwMDdFMzUiIHN0b3Atb3BhY2l0eT0iMCIvPjwvcmFkaWFsR3JhZGllbnQ + PHJlY3QgaWQ9IlUiIHdpZHRoPSI5NiIgaGVpZ2h0PSI5NiIgcng9IjgiLz48cGF0dGVybiBpZD0iWCIgd2lkdGg9IjUxMiIgaGVpZ2h0PSI1MTIiIHg9Ii01MTIiIHk9Ii01MTIiIHBhdHRlcm5Vbml0cz0idXNlclNwYWNlT25Vc2UiPjx1c2UgeGxpbms6aHJlZj0iI2kiLz48L3BhdHRlcm4 + PHJlY3QgaWQ9ImFhIiB3aWR0aD0iOTYiIGhlaWdodD0iOTgiIHk9Ii0xIiByeD0iOCIvPjxmaWx0ZXIgaWQ9IloiIHdpZHRoPSIxMDMuMSUiIGhlaWdodD0iMTAzLjElIiB4PSItMS42JSIgeT0iLTEuNSUiIGZpbHRlclVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCI + PGZlR2F1c3NpYW5CbHVyIGluPSJTb3VyY2VBbHBoYSIgcmVzdWx0PSJzaGFkb3dCbHVySW5uZXIxIiBzdGREZXZpYXRpb249Ii4yNSIvPjxmZU9mZnNldCBkeD0iLTEiIGluPSJzaGFkb3dCbHVySW5uZXIxIiByZXN1bHQ9InNoYWRvd09mZnNldElubmVyMSIvPjxmZUNvbXBvc2l0ZSBpbj0ic2hhZG93T2Zmc2V0SW5uZXIxIiBpbjI9IlNvdXJjZUFscGhhIiBrMj0iLTEiIGszPSIxIiBvcGVyYXRvcj0iYXJpdGhtZXRpYyIgcmVzdWx0PSJzaGFkb3dJbm5lcklubmVyMSIvPjxmZUNvbG9yTWF0cml4IGluPSJzaGFkb3dJbm5lcklubmVyMSIgcmVzdWx0PSJzaGFkb3dNYXRyaXhJbm5lcjEiIHZhbHVlcz0iMCAwIDAgMCAwLjAxOTkyNjc3MzMgICAwIDAgMCAwIDAuNjU5NzMxMDggICAwIDAgMCAwIDAuMzEyNDA4NzQyICAwIDAgMCAxIDAiLz48ZmVHYXVzc2lhbkJsdXIgaW49IlNvdXJjZUFscGhhIiByZXN1bHQ9InNoYWRvd0JsdXJJbm5lcjIiIHN0ZERldmlhdGlvbj0iLjUiLz48ZmVPZmZzZXQgZHg9IjIiIGluPSJzaGFkb3dCbHVySW5uZXIyIiByZXN1bHQ9InNoYWRvd09mZnNldElubmVyMiIvPjxmZUNvbXBvc2l0ZSBpbj0ic2hhZG93T2Zmc2V0SW5uZXIyIiBpbjI9IlNvdXJjZUFscGhhIiBrMj0iLTEiIGszPSIxIiBvcGVyYXRvcj0iYXJpdGhtZXRpYyIgcmVzdWx0PSJzaGFkb3dJbm5lcklubmVyMiIvPjxmZUNvbG9yTWF0cml4IGluPSJzaGFkb3dJbm5lcklubmVyMiIgcmVzdWx0PSJzaGFkb3dNYXRyaXhJbm5lcjIiIHZhbHVlcz0iMCAwIDAgMCAwICAgMCAwIDAgMCAwLjQ2NjY2NjY2NyAgIDAgMCAwIDAgMC4yNTA5ODAzOTIgIDAgMCAwIDEgMCIvPjxmZU1lcmdlPjxmZU1lcmdlTm9kZSBpbj0ic2hhZG93TWF0cml4SW5uZXIxIi8 + PGZlTWVyZ2VOb2RlIGluPSJzaGFkb3dNYXRyaXhJbm5lcjIiLz48L2ZlTWVyZ2U + PC9maWx0ZXI + PGxpbmVhckdyYWRpZW50IGlkPSJhZCIgeDE9IjI5LjQ2OCUiIHgyPSI5Ny45NjMlIiB5MT0iNTAlIiB5Mj0iNTAlIj48c3RvcCBvZmZzZXQ9IjAlIiBzdG9wLWNvbG9yPSIjRjBGMEYwIi8 + PHN0b3Agb2Zmc2V0PSIxMDAlIiBzdG9wLWNvbG9yPSIjRkZGIi8 + PC9saW5lYXJHcmFkaWVudD48cG9seWdvbiBpZD0iYWMiIHBvaW50cz0iMjUgNzMuMTA3IDQxLjc1NiA0Ni45NiAyNi41NzIgMjMgMzguMTQ0IDIzIDQ3Ljk3NyA0MS4wOTkgNTcuNjEgMjMgNjkuMDgyIDIzIDUzLjgzIDQ3LjMzNiA3MC41ODcgNzMuMTA3IDU4LjY0NyA3My4xMDcgNDcuNzc3IDUzLjc3OCAzNi44NzMgNzMuMTA3Ii8 + PGZpbHRlciBpZD0iYWIiIHdpZHRoPSIxNDEuNyUiIGhlaWdodD0iMTM3LjklIiB4PSItMjAuOCUiIHk9Ii0xNyUiIGZpbHRlclVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCI + PGZlT2Zmc2V0IGR5PSIxIiBpbj0iU291cmNlQWxwaGEiIHJlc3VsdD0ic2hhZG93T2Zmc2V0T3V0ZXIxIi8 + PGZlR2F1c3NpYW5CbHVyIGluPSJzaGFkb3dPZmZzZXRPdXRlcjEiIHJlc3VsdD0ic2hhZG93Qmx1ck91dGVyMSIgc3RkRGV2aWF0aW9uPSIzIi8 + PGZlQ29sb3JNYXRyaXggaW49InNoYWRvd0JsdXJPdXRlcjEiIHJlc3VsdD0ic2hhZG93TWF0cml4T3V0ZXIxIiB2YWx1ZXM9IjAgMCAwIDAgMCAgIDAgMCAwIDAgMCAgIDAgMCAwIDAgMCAgMCAwIDAgMC4xIDAiLz48ZmVPZmZzZXQgZHk9IjEiIGluPSJTb3VyY2VBbHBoYSIgcmVzdWx0PSJzaGFkb3dPZmZzZXRPdXRlcjIiLz48ZmVHYXVzc2lhbkJsdXIgaW49InNoYWRvd09mZnNldE91dGVyMiIgcmVzdWx0PSJzaGFkb3dCbHVyT3V0ZXIyIiBzdGREZXZpYXRpb249Ii41Ii8 + PGZlQ29sb3JNYXRyaXggaW49InNoYWRvd0JsdXJPdXRlcjIiIHJlc3VsdD0ic2hhZG93TWF0cml4T3V0ZXIyIiB2YWx1ZXM9IjAgMCAwIDAgMCAgIDAgMCAwIDAgMCAgIDAgMCAwIDAgMCAgMCAwIDAgMC4xIDAiLz48ZmVNZXJnZT48ZmVNZXJnZU5vZGUgaW49InNoYWRvd01hdHJpeE91dGVyMSIvPjxmZU1lcmdlTm9kZSBpbj0ic2hhZG93TWF0cml4T3V0ZXIyIi8 + PC9mZU1lcmdlPjwvZmlsdGVyPjwvZGVmcz48ZyBmaWxsPSJub25lIiBmaWxsLXJ1bGU9ImV2ZW5vZGQiPjxnIHRyYW5zZm9ybT0idHJhbnNsYXRlKDQ4KSI + PG1hc2sgaWQ9ImsiIGZpbGw9IiNmZmYiPjx1c2UgeGxpbms6aHJlZj0iI2oiLz48L21hc2s + PGcgbWFzaz0idXJsKCNrKSI + PHVzZSBmaWxsPSJ1cmwoI2wpIiB4bGluazpocmVmPSIjbSIvPjx1c2UgZmlsbD0idXJsKCNuKSIgZmlsbC1vcGFjaXR5PSIuMDEyIiB4bGluazpocmVmPSIjbSIvPjx1c2UgZmlsbD0iIzAwMCIgZmlsdGVyPSJ1cmwoI28pIiB4bGluazpocmVmPSIjbSIvPjwvZz48ZyBtYXNrPSJ1cmwoI2spIj48dXNlIGZpbGw9InVybCgjcCkiIHhsaW5rOmhyZWY9IiNxIi8 + PHVzZSBmaWxsPSJ1cmwoI3IpIiBmaWxsLW9wYWNpdHk9Ii4wMTIiIHhsaW5rOmhyZWY9IiNxIi8 + PHVzZSBmaWxsPSIjMDAwIiBmaWx0ZXI9InVybCgjcykiIHhsaW5rOmhyZWY9IiNxIi8 + PC9nPjxnIG1hc2s9InVybCgjaykiPjx1c2UgZmlsbD0idXJsKCN0KSIgeGxpbms6aHJlZj0iI3UiLz48dXNlIGZpbGw9InVybCgjdikiIGZpbGwtb3BhY2l0eT0iLjAxMiIgeGxpbms6aHJlZj0iI3UiLz48dXNlIGZpbGw9IiMwMDAiIGZpbHRlcj0idXJsKCN3KSIgeGxpbms6aHJlZj0iI3UiLz48L2c + PGcgbWFzaz0idXJsKCNrKSI + PHVzZSBmaWxsPSJ1cmwoI3gpIiB4bGluazpocmVmPSIjeSIvPjx1c2UgZmlsbD0idXJsKCN6KSIgZmlsbC1vcGFjaXR5PSIuMDEyIiB4bGluazpocmVmPSIjeSIvPjx1c2UgZmlsbD0iIzAwMCIgZmlsdGVyPSJ1cmwoI0EpIiB4bGluazpocmVmPSIjeSIvPjwvZz48ZyBtYXNrPSJ1cmwoI2spIj48dXNlIGZpbGw9InVybCgjQikiIHhsaW5rOmhyZWY9IiNDIi8 + PHVzZSBmaWxsPSJ1cmwoI0QpIiBmaWxsLW9wYWNpdHk9Ii4wMTIiIHhsaW5rOmhyZWY9IiNDIi8 + PHVzZSBmaWxsPSIjMDAwIiBmaWx0ZXI9InVybCgjRSkiIHhsaW5rOmhyZWY9IiNDIi8 + PC9nPjxnIG1hc2s9InVybCgjaykiPjx1c2UgZmlsbD0idXJsKCNGKSIgeGxpbms6aHJlZj0iI0ciLz48dXNlIGZpbGw9InVybCgjSCkiIGZpbGwtb3BhY2l0eT0iLjAxMiIgeGxpbms6aHJlZj0iI0ciLz48dXNlIGZpbGw9IiMwMDAiIGZpbHRlcj0idXJsKCNJKSIgeGxpbms6aHJlZj0iI0ciLz48L2c + PGcgbWFzaz0idXJsKCNrKSI + PHVzZSBmaWxsPSJ1cmwoI0opIiB4bGluazpocmVmPSIjSyIvPjx1c2UgZmlsbD0idXJsKCNMKSIgZmlsbC1vcGFjaXR5PSIuMDEyIiB4bGluazpocmVmPSIjSyIvPjx1c2UgZmlsbD0iIzAwMCIgZmlsdGVyPSJ1cmwoI00pIiB4bGluazpocmVmPSIjSyIvPjwvZz48ZyBtYXNrPSJ1cmwoI2spIj48dXNlIGZpbGw9InVybCgjTikiIHhsaW5rOmhyZWY9IiNPIi8 + PHVzZSBmaWxsPSJ1cmwoI1ApIiBmaWxsLW9wYWNpdHk9Ii4wMTIiIHhsaW5rOmhyZWY9IiNPIi8 + PHVzZSBmaWxsPSIjMDAwIiBmaWx0ZXI9InVybCgjUSkiIHhsaW5rOmhyZWY9IiNPIi8 + PC9nPjwvZz48ZyB0cmFuc2Zvcm09InRyYW5zbGF0ZSg0OCkiPjxtYXNrIGlkPSJUIiBmaWxsPSIjZmZmIj48dXNlIHhsaW5rOmhyZWY9IiNSIi8 + PC9tYXNrPjxwYXRoIGZpbGw9IiMwMDAiIGZpbGwtb3BhY2l0eT0iLjEiIGQ9Ik0tNDAsMzcgTDQwLDM3IEM0NC40MTgyNzgsMzcgNDgsNDAuNTgxNzIyIDQ4LDQ1IEw0OCwxMjUgQzQ4LDEyOS40MTgyNzggMzQuNDE4Mjc4LDE0MyAzMCwxNDMgTC01MCwxNDMgQy01NC40MTgyNzgsMTQzIC01OCwxMzkuNDE4Mjc4IC01OCwxMzUgTC01OCw1NSBDLTU4LDUwLjU4MTcyMiAtNDQuNDE4Mjc4LDM3IC00MCwzNyBaIiBmaWx0ZXI9InVybCgjUykiIG1hc2s9InVybCgjVCkiLz48L2c + PGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCAzNSkiPjxtYXNrIGlkPSJZIiBmaWxsPSIjZmZmIj48dXNlIHhsaW5rOmhyZWY9IiNVIi8 + PC9tYXNrPjx1c2UgZmlsbD0idXJsKCNWKSIgeGxpbms6aHJlZj0iI1UiLz48dXNlIGZpbGw9InVybCgjVykiIHhsaW5rOmhyZWY9IiNVIi8 + PHVzZSBmaWxsPSJ1cmwoI1gpIiBmaWxsLW9wYWNpdHk9Ii4wMTMiIHhsaW5rOmhyZWY9IiNVIi8 + PGcgZmlsbD0iIzAwMCIgbWFzaz0idXJsKCNZKSI + PHVzZSBmaWx0ZXI9InVybCgjWikiIHhsaW5rOmhyZWY9IiNhYSIvPjwvZz48ZyBtYXNrPSJ1cmwoI1kpIj48dXNlIGZpbGw9IiMwMDAiIGZpbHRlcj0idXJsKCNhYikiIHhsaW5rOmhyZWY9IiNhYyIvPjx1c2UgZmlsbD0idXJsKCNhZCkiIHhsaW5rOmhyZWY9IiNhYyIvPjwvZz48L2c + PC9nPjwvc3ZnPg ==" | |
); | |
const searchContactables = (query, callback) => { | |
Excel.run(function(context) { | |
const worksheet = context.workbook.worksheets.getItem("Sheet1"); | |
const range = worksheet.getRange("A3:E999"); | |
range.load("values"); | |
return context.sync().then(function() { | |
const excelData = JSON.stringify(range.values, null, 4); | |
const contactsData = translateContacts(excelData); | |
const filteredContacts = filterContacts(query.replace(/[^A-Za-z0-9_]/g, ""), contactsData); | |
callback(filteredContacts); | |
}); | |
}).catch(errorHandlerFunction); | |
}; | |
dialer.setOnSearchContactables(searchContactables); | |
dialer.setOnDialerEvent((event) => { | |
//search for contact | |
Excel.run(function(context) { | |
var worksheet = context.workbook.worksheets.getItem("Sheet1"); | |
var range = worksheet.getRange("A3:E999"); | |
range.load("values"); | |
return context.sync().then(function() { | |
const excelData = JSON.stringify(range.values, null, 4); | |
const contactsData = translateContacts(excelData); | |
const query = "" + event.data.phoneNumber; | |
const filteredContacts = filterContacts(query.replace(/[^A-Za-z0-9_]/g, ""), contactsData); | |
const interactionContact = filteredContacts[0]; | |
switch (event.type) { | |
case "CALL_START": { | |
if (filteredContacts.length > 0) { | |
dialer.setInteractionContact(event.data.id, { | |
provider: interactionContact.provider, | |
id: "" + interactionContact.id, | |
label: interactionContact.label, | |
type: interactionContact.type | |
}); | |
} | |
break; | |
} | |
case "CALL_END": { | |
//console.log(event.data.contact); // <- carries the assigned contact object | |
break; | |
} | |
case "OPEN_CONTACT": { | |
//console.log("open contact event" + JSON.stringify(event)); | |
const rowNumber = event.data.id + 3; | |
const rowString = "A" + rowNumber + ":D" + rowNumber; | |
const row = worksheet.getRange(rowString); | |
row.select(); | |
break; | |
} | |
default: { | |
//console.log("Unhandled event", event); | |
} | |
} | |
}); | |
}).catch(errorHandlerFunction); | |
}); | |
} | |
); | |
Excel.run(function(context) { | |
//start with selection at upper left | |
var worksheet = context.workbook.worksheets.getItem("Sheet1"); | |
var initSelection = worksheet.getRange("A1"); | |
initSelection.select(); | |
//format dial buttons | |
var range = worksheet.getRange("E:E"); | |
const conditionalFormat = range.conditionalFormats.add(Excel.ConditionalFormatType.containsText); | |
conditionalFormat.textComparison.format.font.color = "white"; | |
conditionalFormat.textComparison.format.fill.color = "purple"; | |
conditionalFormat.textComparison.rule = { | |
operator: Excel.ConditionalTextOperator.contains, | |
text: "Dial" | |
}; | |
//add handler for selection change | |
worksheet.onSelectionChanged.add(handleSelectionChanged); | |
return context.sync().then(function() { | |
//console.log("Event handler successfully registered for onSelectionChangedevent in the worksheet."); | |
}); | |
}).catch(errorHandlerFunction); | |
language: typescript | |
template: | |
content: >- | |
<center><button onclick="populateSampleData()">Populate Sample | |
Data</button></center> | |
<div class='vonage-dialer-container'></div> | |
<script data-provider='uc' data-autoload="false" | |
src='https://apps.gunify.vonage.com/cti/common/vonage.dialer.sdk.js'> | |
</script> | |
<script | |
src="https://unpkg.com/libphonenumber-js@1.9.6/bundle/libphonenumber-max.js"> | |
</script> | |
language: html | |
style: | |
content: |- | |
section.samples { | |
margin-top: 20px; | |
} | |
section.samples .ms-Button, section.setup .ms-Button { | |
display: block; | |
margin-bottom: 5px; | |
margin-left: 20px; | |
min-width: 80px; | |
} | |
language: css | |
libraries: |- | |
https://appsforoffice.microsoft.com/lib/1/hosted/office.js | |
@types/office-js | |
office-ui-fabric-js@1.4.0/dist/css/fabric.min.css | |
office-ui-fabric-js@1.4.0/dist/css/fabric.components.min.css | |
core-js@2.4.1/client/core.min.js | |
@types/core-js | |
jquery@3.1.1 | |
@types/jquery@3.3.1 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment