iamferraz-gantt-chart
Version:
Gantt Chart Component using Echarts library
135 lines • 19.4 kB
JavaScript
export class TaskDataManipulator {
constructor(colours, enableGroup) {
this.COLOURS = colours;
this._enableGroup = enableGroup;
}
mapData(taskData) {
//Im changing the item object to array... this is why the encode is filled with indexed
var _groupData = this.mapGroups(taskData);
var mappedData = [];
for (let index = 0; index < taskData.length; index++) {
let item = taskData[index];
//filling the group information
// here I get the taskID gorupped by mapGroups functions and compare the position of taskid with the array present in the groupped. If the current taskid is in the end of array I dont need to draw the group
let isToDrawGroup = 0;
let groupInfo = _groupData[item.groupName];
if (groupInfo != undefined && groupInfo.tasks.length > 1) {
if (groupInfo.tasks.indexOf(item.taskId) < groupInfo.tasks.length - 1)
isToDrawGroup = 1;
}
let color = "";
if (this._enableGroup == false) {
color = this.getColorHex(index);
}
else {
color = groupInfo.color;
}
let index_attributes = [index, item.taskName, item.start, item.end, item.taskId, item.donePercentage, item.owner, item.image, item.groupName, isToDrawGroup, color];
mappedData.push(index_attributes);
}
return mappedData;
}
mapZebra(taskData) {
var mappedData = [];
for (let index = 0; index < taskData.length; index++) {
let item = taskData[index];
let index_attributes = [index, this.getMinDate(taskData), this.getMaxDate(taskData), item.taskId];
mappedData.push(index_attributes);
}
return mappedData;
}
getMinDate(taskData) {
let minDate = new Date(8640000000000000);
for (let index = 0; index < taskData.length; index++) {
let item = taskData[index];
if (item.start < minDate) {
minDate = item.start;
}
}
return new Date(minDate);
}
getMaxDate(taskData) {
let maxDate = new Date(-8640000000000000);
for (let index = 0; index < taskData.length; index++) {
let item = taskData[index];
if (item.end > maxDate) {
maxDate = item.end;
}
}
return new Date(maxDate);
}
mapGroups(taskData) {
/**
* return a hash
* {
* "groupName1" => { color: "#222", tasks: [taskId1, taskId2, ..., taskIdN]}
* "groupName2" => { color: "#222", tasks: [taskId1, taskId2, ..., taskIdN]}
* }
*/
if (this._enableGroup == false) {
return {};
}
let countColor = 0;
let mappedGroups = {};
//Im creating a map of groups => taskId
for (let i = 0; i < taskData.length; i++) {
if (mappedGroups[taskData[i].groupName] == undefined) {
mappedGroups[taskData[i].groupName] = {};
mappedGroups[taskData[i].groupName].color = this.getColorHex(countColor); //this.getRandomHexColor()
mappedGroups[taskData[i].groupName].tasks = [taskData[i].taskId];
countColor = countColor + 1;
}
else
mappedGroups[taskData[i].groupName].tasks.push(taskData[i].taskId);
}
return mappedGroups;
}
compareTasks(a, b) {
let dateComp = 0;
if (a.start > b.start)
dateComp = -1;
if (b.start > a.start)
dateComp = 1;
let groupOrderComp = 0;
if (a.groupOrder > b.groupOrder)
groupOrderComp = -1;
if (b.groupOrder > a.groupOrder)
groupOrderComp = 1;
let taskNameComp = 0;
if (a.taskName > b.taskName)
taskNameComp = -1;
if (b.taskName > a.taskName)
taskNameComp = 1;
return groupOrderComp || taskNameComp || dateComp;
}
getTaskById(taskData, id) {
for (let i = 0; i < taskData.length; i++) {
if (taskData[i].taskId == id) {
return taskData[i];
}
}
return null;
}
getTaskByIdInMappedData(mappedData, id) {
for (let i = 0; i < mappedData.length; i++) {
if (mappedData[i][4] == id) {
return mappedData[i];
}
}
return null;
}
randomInt(min, max) {
return min + Math.floor((max - min) * Math.random());
}
getRandomHexColor() {
//var randomColor = Math.floor(Math.random()*16777215).toString(16);
//return "#" + randomColor;
return this.COLOURS[this.randomInt(0, this.COLOURS.length)];
}
getColorHex(index) {
if (index >= this.COLOURS.length)
index = 0;
return this.COLOURS[index];
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFzay1kYXRhLW1hbmlwdWxhdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZ2FudHQtY2hhcnQvc3JjL2xpYi9zaGFyZWQvdGFzay1kYXRhLW1hbmlwdWxhdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE1BQU0sT0FBTyxtQkFBbUI7SUFJNUIsWUFBWSxPQUFnQixFQUFFLFdBQW1CO1FBQzdDLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFBO1FBQ3RCLElBQUksQ0FBQyxZQUFZLEdBQUcsV0FBVyxDQUFBO0lBQ25DLENBQUM7SUFFRCxPQUFPLENBQUMsUUFBb0I7UUFDeEIsdUZBQXVGO1FBQ3ZGLElBQUksVUFBVSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUE7UUFFekMsSUFBSSxVQUFVLEdBQUcsRUFBRSxDQUFBO1FBRW5CLEtBQUksSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUFFLEtBQUssR0FBRyxRQUFRLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxFQUFDO1lBQ2hELElBQUksSUFBSSxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQTtZQUUxQiwrQkFBK0I7WUFDL0IsOE1BQThNO1lBQzlNLElBQUksYUFBYSxHQUFHLENBQUMsQ0FBQTtZQUNyQixJQUFJLFNBQVMsR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFBO1lBQzFDLElBQUcsU0FBUyxJQUFJLFNBQVMsSUFBSSxTQUFTLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUM7Z0JBQ3BELElBQUcsU0FBUyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLFNBQVMsQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFDLENBQUM7b0JBQzlELGFBQWEsR0FBRyxDQUFDLENBQUE7YUFDeEI7WUFFRCxJQUFJLEtBQUssR0FBRyxFQUFF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QUN6RCxDQUFDO0lBRUQsaUJBQWlCO1FBQ2Isb0VBQW9FO1FBQ3BFLDJCQUEyQjtRQUUzQixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFBO0lBQy9ELENBQUM7SUFFRCxXQUFXLENBQUMsS0FBWTtRQUNwQixJQUFHLEtBQUssSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU07WUFDM0IsS0FBSyxHQUFHLENBQUMsQ0FBQTtRQUViLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUM5QixDQUFDO0NBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBUYXNrTW9kZWwgfSBmcm9tIFwiLi4vbW9kZWxzL3Rhc2stZGF0YS5tb2RlbFwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIFRhc2tEYXRhTWFuaXB1bGF0b3Ige1xyXG4gICAgQ09MT1VSUzpzdHJpbmdbXVxyXG4gICAgX2VuYWJsZUdyb3VwOiBib29sZWFuXHJcblxyXG4gICAgY29uc3RydWN0b3IoY29sb3VyczpzdHJpbmdbXSwgZW5hYmxlR3JvdXA6Ym9vbGVhbil7XHJcbiAgICAgICAgdGhpcy5DT0xPVVJTID0gY29sb3Vyc1xyXG4gICAgICAgIHRoaXMuX2VuYWJsZUdyb3VwID0gZW5hYmxlR3JvdXBcclxuICAgIH1cclxuXHJcbiAgICBtYXBEYXRhKHRhc2tEYXRhOlRhc2tNb2RlbFtdKTogYW55W117XHJcbiAgICAgICAgLy9JbSBjaGFuZ2luZyB0aGUgaXRlbSBvYmplY3QgdG8gYXJyYXkuLi4gdGhpcyBpcyB3aHkgdGhlIGVuY29kZSBpcyBmaWxsZWQgd2l0aCBpbmRleGVkXHJcbiAgICAgICAgdmFyIF9ncm91cERhdGEgPSB0aGlzLm1hcEdyb3Vwcyh0YXNrRGF0YSlcclxuICAgICAgICBcclxuICAgICAgICB2YXIgbWFwcGVkRGF0YSA9IFtdXHJcbiAgICAgICAgXHJcbiAgICAgICAgZm9yKGxldCBpbmRleCA9IDA7IGluZGV4IDwgdGFza0RhdGEubGVuZ3RoOyBpbmRleCsrKXtcclxuICAgICAgICAgICAgbGV0IGl0ZW0gPSB0YXNrRGF0YVtpbmRleF1cclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIC8vZmlsbGluZyB0aGUgZ3JvdXAgaW5mb3JtYXRpb25cclxuICAgICAgICAgICAgLy8gaGVyZSBJIGdldCB0aGUgdGFza0lEIGdvcnVwcGVkIGJ5IG1hcEdyb3VwcyBmdW5jdGlvbnMgYW5kIGNvbXBhcmUgdGhlIHBvc2l0aW9uIG9mIHRhc2tpZCB3aXRoIHRoZSBhcnJheSBwcmVzZW50IGluIHRoZSBncm91cHBlZC4gSWYgdGhlIGN1cnJlbnQgdGFza2lkIGlzIGluIHRoZSBlbmQgb2YgYXJyYXkgSSBkb250IG5lZWQgdG8gZHJhdyB0aGUgZ3JvdXBcclxuICAgICAgICAgICAgbGV0IGlzVG9EcmF3R3JvdXAgPSAwXHJcbiAgICAgICAgICAgIGxldCBncm91cEluZm8gPSBfZ3JvdXBEYXRhW2l0ZW0uZ3JvdXBOYW1lXVxyXG4gICAgICAgICAgICBpZihncm91cEluZm8gIT0gdW5kZWZpbmVkICYmIGdyb3VwSW5mby50YXNrcy5sZW5ndGggPiAxKXtcclxuICAgICAgICAgICAgICAgIGlmKGdyb3VwSW5mby50YXNrcy5pbmRleE9mKGl0ZW0udGFza0lkKSA8IGdyb3VwSW5mby50YXNrcy5sZW5ndGgtMSlcclxuICAgICAgICAgICAgICAgICAgICBpc1RvRHJhd0dyb3VwID0gMVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICBsZXQgY29sb3IgPSBcIlwiIFxyXG4gICAgICAgICAgICBpZih0aGlzLl9lbmFibGVHcm91cCA9PSBmYWxzZSl7XHJcbiAgICAgICAgICAgICAgICBjb2xvciA9IHRoaXMuZ2V0Q29sb3JIZXgoaW5kZXgpXHJcbiAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgICAgY29sb3IgPSBncm91cEluZm8uY29sb3JcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgbGV0IGluZGV4X2F0dHJpYnV0ZXMgPSBbaW5kZXgsIGl0ZW0udGFza05hbWUsIGl0ZW0uc3RhcnQsIGl0ZW0uZW5kLCBpdGVtLnRhc2tJZCwgaXRlbS5kb25lUGVyY2VudGFnZSwgaXRlbS5vd25lciwgaXRlbS5pbWFnZSwgaXRlbS5ncm91cE5hbWUsIGlzVG9EcmF3R3JvdXAsIGNvbG9yXTtcclxuXHJcbiAgICAgICAgICAgIG1hcHBlZERhdGEucHVzaChpbmRleF9hdHRyaWJ1dGVzKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgcmV0dXJuIG1hcHBlZERhdGFcclxuICAgIH1cclxuICAgIFxyXG4gICAgbWFwWmVicmEodGFza0RhdGE6VGFza01vZGVsW10pOiBhbnlbXXsgICBcclxuICAgICAgICB2YXIgbWFwcGVkRGF0YSA9IFtdXHJcbiAgICAgICAgXHJcbiAgICAgICAgZm9yKGxldCBpbmRleCA9IDA7IGluZGV4IDwgdGFza0RhdGEubGVuZ3RoOyBpbmRleCsrKXsgICAgXHJcbiAgICAgICAgICAgIGxldCBpdGVtID0gdGFza0RhdGFbaW5kZXhdXHJcbiAgICAgICAgICAgIGxldCBpbmRleF9hdHRyaWJ1dGVzID0gW2luZGV4LCB0aGlzLmdldE1pbkRhdGUodGFza0RhdGEpLCB0aGlzLmdldE1heERhdGUodGFza0RhdGEpLCBpdGVtLnRhc2tJZF07XHJcbiAgICAgICAgICAgIG1hcHBlZERhdGEucHVzaChpbmRleF9hdHRyaWJ1dGVzKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG1hcHBlZERhdGFcclxuICAgIH1cclxuICAgIFxyXG4gICAgZ2V0TWluRGF0ZSh0YXNrRGF0YTpUYXNrTW9kZWxbXSk6RGF0ZXtcclxuICAgICAgICBsZXQgbWluRGF0ZSA9IG5ldyBEYXRlKDg2NDAwMDAwMDAwMDAwMDApXHJcbiAgICAgICAgZm9yKGxldCBpbmRleCA9IDA7IGluZGV4IDwgdGFza0RhdGEubGVuZ3RoOyBpbmRleCsrKXtcclxuICAgICAgICAgICAgbGV0IGl0ZW0gPSB0YXNrRGF0YVtpbmRleF1cclxuICAgICAgICAgICAgaWYoaXRlbS5zdGFydCA8IG1pbkRhdGUpe1xyXG4gICAgICAgICAgICAgICAgbWluRGF0ZSA9IGl0ZW0uc3RhcnRcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIFxyXG4gICAgICAgIHJldHVybiBuZXcgRGF0ZShtaW5EYXRlKVxyXG4gICAgfVxyXG4gICAgXHJcbiAgICBnZXRNYXhEYXRlKHRhc2tEYXRhOlRhc2tNb2RlbFtdKTpEYXRle1xyXG4gICAgICAgIGxldCBtYXhEYXRlID0gbmV3IERhdGUoLTg2NDAwMDAwMDAwMDAwMDApXHJcbiAgICAgICAgZm9yKGxldCBpbmRleCA9IDA7IGluZGV4IDwgdGFza0RhdGEubGVuZ3RoOyBpbmRleCsrKXtcclxuICAgICAgICAgICAgbGV0IGl0ZW0gPSB0YXNrRGF0YVtpbmRleF1cclxuICAgICAgICAgICAgaWYoaXRlbS5lbmQgPiBtYXhEYXRlKXtcclxuICAgICAgICAgICAgICAgIG1heERhdGUgPSBpdGVtLmVuZFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgXHJcbiAgICAgICAgcmV0dXJuIG5ldyBEYXRlKG1heERhdGUpXHJcbiAgICB9XHJcbiAgICBcclxuICAgIG1hcEdyb3Vwcyh0YXNrRGF0YTpUYXNrTW9kZWxbXSk6YW55e1xyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIHJldHVybiBhIGhhc2ggXHJcbiAgICAgICAgICogeyBcclxuICAgICAgICAgKiAgXCJncm91cE5hbWUxXCIgPT4geyBjb2xvcjogXCIjMjIyXCIsIHRhc2tzOiBbdGFza0lkMSwgdGFza0lkMiwgLi4uLCB0YXNrSWROXX0gXHJcbiAgICAgICAgICogIFwiZ3JvdXBOYW1lMlwiID0+IHsgY29sb3I6IFwiIzIyMlwiLCB0YXNrczogW3Rhc2tJZDEsIHRhc2tJZDIsIC4uLiwgdGFza0lkTl19IFxyXG4gICAgICAgICAqIH1cclxuICAgICAgICAgKi9cclxuXHJcbiAgICAgICAgIGlmKHRoaXMuX2VuYWJsZUdyb3VwID09IGZhbHNlKXtcclxuICAgICAgICAgICAgcmV0dXJuIHt9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgY291bnRDb2xvciA9IDBcclxuICAgICAgICBsZXQgbWFwcGVkR3JvdXBzOmFueSA9IHt9XHJcbiAgICAgICAgLy9JbSBjcmVhdGluZyBhIG1hcCBvZiBncm91cHMgPT4gdGFza0lkXHJcbiAgICAgICAgZm9yKGxldCBpID0gMDsgaSA8IHRhc2tEYXRhLmxlbmd0aDsgaSsrKXtcclxuICAgICAgICAgICAgaWYobWFwcGVkR3JvdXBzW3Rhc2tEYXRhW2ldLmdyb3VwTmFtZV0gPT0gdW5kZWZpbmVkKXtcclxuICAgICAgICAgICAgICAgIG1hcHBlZEdyb3Vwc1t0YXNrRGF0YVtpXS5ncm91cE5hbWVdID0ge31cclxuICAgICAgICAgICAgICAgIG1hcHBlZEdyb3Vwc1t0YXNrRGF0YVtpXS5ncm91cE5hbWVdLmNvbG9yID0gdGhpcy5nZXRDb2xvckhleChjb3VudENvbG9yKS8vdGhpcy5nZXRSYW5kb21IZXhDb2xvcigpXHJcbiAgICAgICAgICAgICAgICBtYXBwZWRHcm91cHNbdGFza0RhdGFbaV0uZ3JvdXBOYW1lXS50YXNrcyA9IFt0YXNrRGF0YVtpXS50YXNrSWRdXHJcbiAgICAgICAgICAgICAgICBjb3VudENvbG9yID0gY291bnRDb2xvciArIDFcclxuICAgICAgICAgICAgfWVsc2VcclxuICAgICAgICAgICAgICAgIG1hcHBlZEdyb3Vwc1t0YXNrRGF0YVtpXS5ncm91cE5hbWVdLnRhc2tzLnB1c2godGFza0RhdGFbaV0udGFza0lkKVxyXG4gICAgICAgIH0gICAgXHJcbiAgICAgICAgXHJcbiAgICAgICAgcmV0dXJuIG1hcHBlZEdyb3Vwc1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICBjb21wYXJlVGFza3MoYTpUYXNrTW9kZWwsIGI6VGFza01vZGVsKTpudW1iZXIge1xyXG4gICAgICAgIGxldCBkYXRlQ29tcCA9IDBcclxuICAgICAgICBpZiAoYS5zdGFydCA+IGIuc3RhcnQpIGRhdGVDb21wID0gLTE7XHJcbiAgICAgICAgaWYgKGIuc3RhcnQgPiBhLnN0YXJ0KSBkYXRlQ29tcCA9IDE7XHJcbiAgICAgICAgXHJcbiAgICAgICAgbGV0IGdyb3VwT3JkZXJDb21wID0gMFxyXG4gICAgICAgIGlmIChhLmdyb3VwT3JkZXIgPiBiLmdyb3VwT3JkZXIpIGdyb3VwT3JkZXJDb21wID0gLTE7XHJcbiAgICAgICAgaWYgKGIuZ3JvdXBPcmRlciA+IGEuZ3JvdXBPcmRlcikgZ3JvdXBPcmRlckNvbXAgPSAxO1xyXG5cclxuICAgICAgICBsZXQgdGFza05hbWVDb21wID0gMFxyXG4gICAgICAgIGlmIChhLnRhc2tOYW1lID4gYi50YXNrTmFtZSkgdGFza05hbWVDb21wID0gLTE7XHJcbiAgICAgICAgaWYgKGIudGFza05hbWUgPiBhLnRhc2tOYW1lKSB0YXNrTmFtZUNvbXAgPSAxO1xyXG4gICAgICAgIFxyXG4gICAgICAgIHJldHVybiBncm91cE9yZGVyQ29tcCB8fCB0YXNrTmFtZUNvbXAgfHwgZGF0ZUNvbXA7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIGdldFRhc2tCeUlkKHRhc2tEYXRhOlRhc2tNb2RlbFtdLCBpZDphbnkpOlRhc2tNb2RlbHxudWxse1xyXG4gICAgICAgIGZvcihsZXQgaSA9IDA7IGkgPCB0YXNrRGF0YS5sZW5ndGg7IGkrKyl7XHJcbiAgICAgICAgICAgIGlmKHRhc2tEYXRhW2ldLnRhc2tJZCA9PSBpZCl7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGFza0RhdGFbaV07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIGdldFRhc2tCeUlkSW5NYXBwZWREYXRhKG1hcHBlZERhdGE6YW55LCBpZDphbnkpOmFueVtdfG51bGx7XHJcbiAgICAgICAgZm9yKGxldCBpID0gMDsgaSA8IG1hcHBlZERhdGEubGVuZ3RoOyBpKyspe1xyXG4gICAgICAgICAgICBpZihtYXBwZWREYXRhW2ldWzRdID09IGlkKXtcclxuICAgICAgICAgICAgICAgIHJldHVybiBtYXBwZWREYXRhW2ldO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICByYW5kb21JbnQobWluOm51bWJlciwgbWF4Om51bWJlcik6bnVtYmVyIHtcclxuICAgICAgICByZXR1cm4gbWluICsgTWF0aC5mbG9vcigobWF4IC0gbWluKSAqIE1hdGgucmFuZG9tKCkpO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICBnZXRSYW5kb21IZXhDb2xvcigpOiBzdHJpbmd7XHJcbiAgICAgICAgLy92YXIgcmFuZG9tQ29sb3IgPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqMTY3NzcyMTUpLnRvU3RyaW5nKDE2KTtcclxuICAgICAgICAvL3JldHVybiBcIiNcIiArIHJhbmRvbUNvbG9yO1xyXG4gICAgXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuQ09MT1VSU1t0aGlzLnJhbmRvbUludCgwLCB0aGlzLkNPTE9VUlMubGVuZ3RoKV1cclxuICAgIH1cclxuXHJcbiAgICBnZXRDb2xvckhleChpbmRleDpudW1iZXIpOiBzdHJpbmd7XHJcbiAgICAgICAgaWYoaW5kZXggPj0gdGhpcy5DT0xPVVJTLmxlbmd0aClcclxuICAgICAgICAgICAgaW5kZXggPSAwXHJcbiAgICBcclxuICAgICAgICByZXR1cm4gdGhpcy5DT0xPVVJTW2luZGV4XVxyXG4gICAgfVxyXG59XHJcblxyXG4iXX0=