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 hidden or 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