UNPKG

iamferraz-gantt-chart

Version:

Gantt Chart Component using Echarts library

135 lines 19.4 kB
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFzay1kYXRhLW1hbmlwdWxhdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZ2FudHQtY2hhcnQvc3JjL2xpYi9zaGFyZWQvdGFzay1kYXRhLW1hbmlwdWxhdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE1BQU0sT0FBTyxtQkFBbUI7SUFJNUIsWUFBWSxPQUFnQixFQUFFLFdBQW1CO1FBQzdDLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFBO1FBQ3RCLElBQUksQ0FBQyxZQUFZLEdBQUcsV0FBVyxDQUFBO0lBQ25DLENBQUM7SUFFRCxPQUFPLENBQUMsUUFBb0I7UUFDeEIsdUZBQXVGO1FBQ3ZGLElBQUksVUFBVSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUE7UUFFekMsSUFBSSxVQUFVLEdBQUcsRUFBRSxDQUFBO1FBRW5CLEtBQUksSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUFFLEtBQUssR0FBRyxRQUFRLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxFQUFDO1lBQ2hELElBQUksSUFBSSxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQTtZQUUxQiwrQkFBK0I7WUFDL0IsOE1BQThNO1lBQzlNLElBQUksYUFBYSxHQUFHLENBQUMsQ0FBQTtZQUNyQixJQUFJLFNBQVMsR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFBO1lBQzFDLElBQUcsU0FBUyxJQUFJLFNBQVMsSUFBSSxTQUFTLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUM7Z0JBQ3BELElBQUcsU0FBUyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLFNBQVMsQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFDLENBQUM7b0JBQzlELGFBQWEsR0FBRyxDQUFDLENBQUE7YUFDeEI7WUFFRCxJQUFJLEtBQUssR0FBRyxFQUFFLENBQUE7WUFDZCxJQUFHLElBQUksQ0FBQyxZQUFZLElBQUksS0FBSyxFQUFDO2dCQUMxQixLQUFLLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQTthQUNsQztpQkFBSTtnQkFDRCxLQUFLLEdBQUcsU0FBUyxDQUFDLEtBQUssQ0FBQTthQUMxQjtZQUVELElBQUksZ0JBQWdCLEdBQUcsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsY0FBYyxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFFLGFBQWEsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUVwSyxVQUFVLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7U0FDckM7UUFFRCxPQUFPLFVBQVUsQ0FBQTtJQUNyQixDQUFDO0lBRUQsUUFBUSxDQUFDLFFBQW9CO1FBQ3pCLElBQUksVUFBVSxHQUFHLEVBQUUsQ0FBQTtRQUVuQixLQUFJLElBQUksS0FBSyxHQUFHLENBQUMsRUFBRSxLQUFLLEdBQUcsUUFBUSxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsRUFBQztZQUNoRCxJQUFJLElBQUksR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUE7WUFDMUIsSUFBSSxnQkFBZ0IsR0FBRyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ2xHLFVBQVUsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztTQUNyQztRQUNELE9BQU8sVUFBVSxDQUFBO0lBQ3JCLENBQUM7SUFFRCxVQUFVLENBQUMsUUFBb0I7UUFDM0IsSUFBSSxPQUFPLEdBQUcsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQTtRQUN4QyxLQUFJLElBQUksS0FBSyxHQUFHLENBQUMsRUFBRSxLQUFLLEdBQUcsUUFBUSxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsRUFBQztZQUNoRCxJQUFJLElBQUksR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUE7WUFDMUIsSUFBRyxJQUFJLENBQUMsS0FBSyxHQUFHLE9BQU8sRUFBQztnQkFDcEIsT0FBTyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUE7YUFDdkI7U0FDSjtRQUVELE9BQU8sSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUE7SUFDNUIsQ0FBQztJQUVELFVBQVUsQ0FBQyxRQUFvQjtRQUMzQixJQUFJLE9BQU8sR0FBRyxJQUFJLElBQUksQ0FBQyxDQUFDLGdCQUFnQixDQUFDLENBQUE7UUFDekMsS0FBSSxJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUUsS0FBSyxHQUFHLFFBQVEsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLEVBQUM7WUFDaEQsSUFBSSxJQUFJLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFBO1lBQzFCLElBQUcsSUFBSSxDQUFDLEdBQUcsR0FBRyxPQUFPLEVBQUM7Z0JBQ2xCLE9BQU8sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFBO2FBQ3JCO1NBQ0o7UUFFRCxPQUFPLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFBO0lBQzVCLENBQUM7SUFFRCxTQUFTLENBQUMsUUFBb0I7UUFDMUI7Ozs7OztXQU1HO1FBRUYsSUFBRyxJQUFJLENBQUMsWUFBWSxJQUFJLEtBQUssRUFBQztZQUMzQixPQUFPLEVBQUUsQ0FBQTtTQUNaO1FBRUQsSUFBSSxVQUFVLEdBQUcsQ0FBQyxDQUFBO1FBQ2xCLElBQUksWUFBWSxHQUFPLEVBQUUsQ0FBQTtRQUN6Qix1Q0FBdUM7UUFDdkMsS0FBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUM7WUFDcEMsSUFBRyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxJQUFJLFNBQVMsRUFBQztnQkFDaEQsWUFBWSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLENBQUE7Z0JBQ3hDLFlBQVksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLENBQUEsQ0FBQSwwQkFBMEI7Z0JBQ2xHLFlBQVksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFBO2dCQUNoRSxVQUFVLEdBQUcsVUFBVSxHQUFHLENBQUMsQ0FBQTthQUM5Qjs7Z0JBQ0csWUFBWSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQTtTQUN6RTtRQUVELE9BQU8sWUFBWSxDQUFBO0lBQ3ZCLENBQUM7SUFFRCxZQUFZLENBQUMsQ0FBVyxFQUFFLENBQVc7UUFDakMsSUFBSSxRQUFRLEdBQUcsQ0FBQyxDQUFBO1FBQ2hCLElBQUksQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsS0FBSztZQUFFLFFBQVEsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUNyQyxJQUFJLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLEtBQUs7WUFBRSxRQUFRLEdBQUcsQ0FBQyxDQUFDO1FBRXBDLElBQUksY0FBYyxHQUFHLENBQUMsQ0FBQTtRQUN0QixJQUFJLENBQUMsQ0FBQyxVQUFVLEdBQUcsQ0FBQyxDQUFDLFVBQVU7WUFBRSxjQUFjLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDckQsSUFBSSxDQUFDLENBQUMsVUFBVSxHQUFHLENBQUMsQ0FBQyxVQUFVO1lBQUUsY0FBYyxHQUFHLENBQUMsQ0FBQztRQUVwRCxJQUFJLFlBQVksR0FBRyxDQUFDLENBQUE7UUFDcEIsSUFBSSxDQUFDLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQyxRQUFRO1lBQUUsWUFBWSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQy9DLElBQUksQ0FBQyxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUMsUUFBUTtZQUFFLFlBQVksR0FBRyxDQUFDLENBQUM7UUFFOUMsT0FBTyxjQUFjLElBQUksWUFBWSxJQUFJLFFBQVEsQ0FBQztJQUN0RCxDQUFDO0lBRUQsV0FBVyxDQUFDLFFBQW9CLEVBQUUsRUFBTTtRQUNwQyxLQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBQztZQUNwQyxJQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLElBQUksRUFBRSxFQUFDO2dCQUN4QixPQUFPLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUN0QjtTQUNKO1FBRUQsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUVELHVCQUF1QixDQUFDLFVBQWMsRUFBRSxFQUFNO1FBQzFDLEtBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxVQUFVLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFDO1lBQ3RDLElBQUcsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBQztnQkFDdEIsT0FBTyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDeEI7U0FDSjtRQUVELE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7SUFFRCxTQUFTLENBQUMsR0FBVSxFQUFFLEdBQVU7UUFDNUIsT0FBTyxHQUFHLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztJQUN6RCxDQUFDO0lBRUQsaUJBQWlCO1FBQ2Isb0VBQW9FO1FBQ3BFLDJCQUEyQjtRQUUzQixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFBO0lBQy9ELENBQUM7SUFFRCxXQUFXLENBQUMsS0FBWTtRQUNwQixJQUFHLEtBQUssSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU07WUFDM0IsS0FBSyxHQUFHLENBQUMsQ0FBQTtRQUViLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUM5QixDQUFDO0NBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBUYXNrTW9kZWwgfSBmcm9tIFwiLi4vbW9kZWxzL3Rhc2stZGF0YS5tb2RlbFwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIFRhc2tEYXRhTWFuaXB1bGF0b3Ige1xyXG4gICAgQ09MT1VSUzpzdHJpbmdbXVxyXG4gICAgX2VuYWJsZUdyb3VwOiBib29sZWFuXHJcblxyXG4gICAgY29uc3RydWN0b3IoY29sb3VyczpzdHJpbmdbXSwgZW5hYmxlR3JvdXA6Ym9vbGVhbil7XHJcbiAgICAgICAgdGhpcy5DT0xPVVJTID0gY29sb3Vyc1xyXG4gICAgICAgIHRoaXMuX2VuYWJsZUdyb3VwID0gZW5hYmxlR3JvdXBcclxuICAgIH1cclxuXHJcbiAgICBtYXBEYXRhKHRhc2tEYXRhOlRhc2tNb2RlbFtdKTogYW55W117XHJcbiAgICAgICAgLy9JbSBjaGFuZ2luZyB0aGUgaXRlbSBvYmplY3QgdG8gYXJyYXkuLi4gdGhpcyBpcyB3aHkgdGhlIGVuY29kZSBpcyBmaWxsZWQgd2l0aCBpbmRleGVkXHJcbiAgICAgICAgdmFyIF9ncm91cERhdGEgPSB0aGlzLm1hcEdyb3Vwcyh0YXNrRGF0YSlcclxuICAgICAgICBcclxuICAgICAgICB2YXIgbWFwcGVkRGF0YSA9IFtdXHJcbiAgICAgICAgXHJcbiAgICAgICAgZm9yKGxldCBpbmRleCA9IDA7IGluZGV4IDwgdGFza0RhdGEubGVuZ3RoOyBpbmRleCsrKXtcclxuICAgICAgICAgICAgbGV0IGl0ZW0gPSB0YXNrRGF0YVtpbmRleF1cclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIC8vZmlsbGluZyB0aGUgZ3JvdXAgaW5mb3JtYXRpb25cclxuICAgICAgICAgICAgLy8gaGVyZSBJIGdldCB0aGUgdGFza0lEIGdvcnVwcGVkIGJ5IG1hcEdyb3VwcyBmdW5jdGlvbnMgYW5kIGNvbXBhcmUgdGhlIHBvc2l0aW9uIG9mIHRhc2tpZCB3aXRoIHRoZSBhcnJheSBwcmVzZW50IGluIHRoZSBncm91cHBlZC4gSWYgdGhlIGN1cnJlbnQgdGFza2lkIGlzIGluIHRoZSBlbmQgb2YgYXJyYXkgSSBkb250IG5lZWQgdG8gZHJhdyB0aGUgZ3JvdXBcclxuICAgICAgICAgICAgbGV0IGlzVG9EcmF3R3JvdXAgPSAwXHJcbiAgICAgICAgICAgIGxldCBncm91cEluZm8gPSBfZ3JvdXBEYXRhW2l0ZW0uZ3JvdXBOYW1lXVxyXG4gICAgICAgICAgICBpZihncm91cEluZm8gIT0gdW5kZWZpbmVkICYmIGdyb3VwSW5mby50YXNrcy5sZW5ndGggPiAxKXtcclxuICAgICAgICAgICAgICAgIGlmKGdyb3VwSW5mby50YXNrcy5pbmRleE9mKGl0ZW0udGFza0lkKSA8IGdyb3VwSW5mby50YXNrcy5sZW5ndGgtMSlcclxuICAgICAgICAgICAgICAgICAgICBpc1RvRHJhd0dyb3VwID0gMVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICBsZXQgY29sb3IgPSBcIlwiIFxyXG4gICAgICAgICAgICBpZih0aGlzLl9lbmFibGVHcm91cCA9PSBmYWxzZSl7XHJcbiAgICAgICAgICAgICAgICBjb2xvciA9IHRoaXMuZ2V0Q29sb3JIZXgoaW5kZXgpXHJcbiAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgICAgY29sb3IgPSBncm91cEluZm8uY29sb3JcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgbGV0IGluZGV4X2F0dHJpYnV0ZXMgPSBbaW5kZXgsIGl0ZW0udGFza05hbWUsIGl0ZW0uc3RhcnQsIGl0ZW0uZW5kLCBpdGVtLnRhc2tJZCwgaXRlbS5kb25lUGVyY2VudGFnZSwgaXRlbS5vd25lciwgaXRlbS5pbWFnZSwgaXRlbS5ncm91cE5hbWUsIGlzVG9EcmF3R3JvdXAsIGNvbG9yXTtcclxuXHJcbiAgICAgICAgICAgIG1hcHBlZERhdGEucHVzaChpbmRleF9hdHRyaWJ1dGVzKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgcmV0dXJuIG1hcHBlZERhdGFcclxuICAgIH1cclxuICAgIFxyXG4gICAgbWFwWmVicmEodGFza0RhdGE6VGFza01vZGVsW10pOiBhbnlbXXsgICBcclxuICAgICAgICB2YXIgbWFwcGVkRGF0YSA9IFtdXHJcbiAgICAgICAgXHJcbiAgICAgICAgZm9yKGxldCBpbmRleCA9IDA7IGluZGV4IDwgdGFza0RhdGEubGVuZ3RoOyBpbmRleCsrKXsgICAgXHJcbiAgICAgICAgICAgIGxldCBpdGVtID0gdGFza0RhdGFbaW5kZXhdXHJcbiAgICAgICAgICAgIGxldCBpbmRleF9hdHRyaWJ1dGVzID0gW2luZGV4LCB0aGlzLmdldE1pbkRhdGUodGFza0RhdGEpLCB0aGlzLmdldE1heERhdGUodGFza0RhdGEpLCBpdGVtLnRhc2tJZF07XHJcbiAgICAgICAgICAgIG1hcHBlZERhdGEucHVzaChpbmRleF9hdHRyaWJ1dGVzKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG1hcHBlZERhdGFcclxuICAgIH1cclxuICAgIFxyXG4gICAgZ2V0TWluRGF0ZSh0YXNrRGF0YTpUYXNrTW9kZWxbXSk6RGF0ZXtcclxuICAgICAgICBsZXQgbWluRGF0ZSA9IG5ldyBEYXRlKDg2NDAwMDAwMDAwMDAwMDApXHJcbiAgICAgICAgZm9yKGxldCBpbmRleCA9IDA7IGluZGV4IDwgdGFza0RhdGEubGVuZ3RoOyBpbmRleCsrKXtcclxuICAgICAgICAgICAgbGV0IGl0ZW0gPSB0YXNrRGF0YVtpbmRleF1cclxuICAgICAgICAgICAgaWYoaXRlbS5zdGFydCA8IG1pbkRhdGUpe1xyXG4gICAgICAgICAgICAgICAgbWluRGF0ZSA9IGl0ZW0uc3RhcnRcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIFxyXG4gICAgICAgIHJldHVybiBuZXcgRGF0ZShtaW5EYXRlKVxyXG4gICAgfVxyXG4gICAgXHJcbiAgICBnZXRNYXhEYXRlKHRhc2tEYXRhOlRhc2tNb2RlbFtdKTpEYXRle1xyXG4gICAgICAgIGxldCBtYXhEYXRlID0gbmV3IERhdGUoLTg2NDAwMDAwMDAwMDAwMDApXHJcbiAgICAgICAgZm9yKGxldCBpbmRleCA9IDA7IGluZGV4IDwgdGFza0RhdGEubGVuZ3RoOyBpbmRleCsrKXtcclxuICAgICAgICAgICAgbGV0IGl0ZW0gPSB0YXNrRGF0YVtpbmRleF1cclxuICAgICAgICAgICAgaWYoaXRlbS5lbmQgPiBtYXhEYXRlKXtcclxuICAgICAgICAgICAgICAgIG1heERhdGUgPSBpdGVtLmVuZFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgXHJcbiAgICAgICAgcmV0dXJuIG5ldyBEYXRlKG1heERhdGUpXHJcbiAgICB9XHJcbiAgICBcclxuICAgIG1hcEdyb3Vwcyh0YXNrRGF0YTpUYXNrTW9kZWxbXSk6YW55e1xyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIHJldHVybiBhIGhhc2ggXHJcbiAgICAgICAgICogeyBcclxuICAgICAgICAgKiAgXCJncm91cE5hbWUxXCIgPT4geyBjb2xvcjogXCIjMjIyXCIsIHRhc2tzOiBbdGFza0lkMSwgdGFza0lkMiwgLi4uLCB0YXNrSWROXX0gXHJcbiAgICAgICAgICogIFwiZ3JvdXBOYW1lMlwiID0+IHsgY29sb3I6IFwiIzIyMlwiLCB0YXNrczogW3Rhc2tJZDEsIHRhc2tJZDIsIC4uLiwgdGFza0lkTl19IFxyXG4gICAgICAgICAqIH1cclxuICAgICAgICAgKi9cclxuXHJcbiAgICAgICAgIGlmKHRoaXMuX2VuYWJsZUdyb3VwID09IGZhbHNlKXtcclxuICAgICAgICAgICAgcmV0dXJuIHt9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgY291bnRDb2xvciA9IDBcclxuICAgICAgICBsZXQgbWFwcGVkR3JvdXBzOmFueSA9IHt9XHJcbiAgICAgICAgLy9JbSBjcmVhdGluZyBhIG1hcCBvZiBncm91cHMgPT4gdGFza0lkXHJcbiAgICAgICAgZm9yKGxldCBpID0gMDsgaSA8IHRhc2tEYXRhLmxlbmd0aDsgaSsrKXtcclxuICAgICAgICAgICAgaWYobWFwcGVkR3JvdXBzW3Rhc2tEYXRhW2ldLmdyb3VwTmFtZV0gPT0gdW5kZWZpbmVkKXtcclxuICAgICAgICAgICAgICAgIG1hcHBlZEdyb3Vwc1t0YXNrRGF0YVtpXS5ncm91cE5hbWVdID0ge31cclxuICAgICAgICAgICAgICAgIG1hcHBlZEdyb3Vwc1t0YXNrRGF0YVtpXS5ncm91cE5hbWVdLmNvbG9yID0gdGhpcy5nZXRDb2xvckhleChjb3VudENvbG9yKS8vdGhpcy5nZXRSYW5kb21IZXhDb2xvcigpXHJcbiAgICAgICAgICAgICAgICBtYXBwZWRHcm91cHNbdGFza0RhdGFbaV0uZ3JvdXBOYW1lXS50YXNrcyA9IFt0YXNrRGF0YVtpXS50YXNrSWRdXHJcbiAgICAgICAgICAgICAgICBjb3VudENvbG9yID0gY291bnRDb2xvciArIDFcclxuICAgICAgICAgICAgfWVsc2VcclxuICAgICAgICAgICAgICAgIG1hcHBlZEdyb3Vwc1t0YXNrRGF0YVtpXS5ncm91cE5hbWVdLnRhc2tzLnB1c2godGFza0RhdGFbaV0udGFza0lkKVxyXG4gICAgICAgIH0gICAgXHJcbiAgICAgICAgXHJcbiAgICAgICAgcmV0dXJuIG1hcHBlZEdyb3Vwc1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICBjb21wYXJlVGFza3MoYTpUYXNrTW9kZWwsIGI6VGFza01vZGVsKTpudW1iZXIge1xyXG4gICAgICAgIGxldCBkYXRlQ29tcCA9IDBcclxuICAgICAgICBpZiAoYS5zdGFydCA+IGIuc3RhcnQpIGRhdGVDb21wID0gLTE7XHJcbiAgICAgICAgaWYgKGIuc3RhcnQgPiBhLnN0YXJ0KSBkYXRlQ29tcCA9IDE7XHJcbiAgICAgICAgXHJcbiAgICAgICAgbGV0IGdyb3VwT3JkZXJDb21wID0gMFxyXG4gICAgICAgIGlmIChhLmdyb3VwT3JkZXIgPiBiLmdyb3VwT3JkZXIpIGdyb3VwT3JkZXJDb21wID0gLTE7XHJcbiAgICAgICAgaWYgKGIuZ3JvdXBPcmRlciA+IGEuZ3JvdXBPcmRlcikgZ3JvdXBPcmRlckNvbXAgPSAxO1xyXG5cclxuICAgICAgICBsZXQgdGFza05hbWVDb21wID0gMFxyXG4gICAgICAgIGlmIChhLnRhc2tOYW1lID4gYi50YXNrTmFtZSkgdGFza05hbWVDb21wID0gLTE7XHJcbiAgICAgICAgaWYgKGIudGFza05hbWUgPiBhLnRhc2tOYW1lKSB0YXNrTmFtZUNvbXAgPSAxO1xyXG4gICAgICAgIFxyXG4gICAgICAgIHJldHVybiBncm91cE9yZGVyQ29tcCB8fCB0YXNrTmFtZUNvbXAgfHwgZGF0ZUNvbXA7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIGdldFRhc2tCeUlkKHRhc2tEYXRhOlRhc2tNb2RlbFtdLCBpZDphbnkpOlRhc2tNb2RlbHxudWxse1xyXG4gICAgICAgIGZvcihsZXQgaSA9IDA7IGkgPCB0YXNrRGF0YS5sZW5ndGg7IGkrKyl7XHJcbiAgICAgICAgICAgIGlmKHRhc2tEYXRhW2ldLnRhc2tJZCA9PSBpZCl7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGFza0RhdGFbaV07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIGdldFRhc2tCeUlkSW5NYXBwZWREYXRhKG1hcHBlZERhdGE6YW55LCBpZDphbnkpOmFueVtdfG51bGx7XHJcbiAgICAgICAgZm9yKGxldCBpID0gMDsgaSA8IG1hcHBlZERhdGEubGVuZ3RoOyBpKyspe1xyXG4gICAgICAgICAgICBpZihtYXBwZWREYXRhW2ldWzRdID09IGlkKXtcclxuICAgICAgICAgICAgICAgIHJldHVybiBtYXBwZWREYXRhW2ldO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICByYW5kb21JbnQobWluOm51bWJlciwgbWF4Om51bWJlcik6bnVtYmVyIHtcclxuICAgICAgICByZXR1cm4gbWluICsgTWF0aC5mbG9vcigobWF4IC0gbWluKSAqIE1hdGgucmFuZG9tKCkpO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICBnZXRSYW5kb21IZXhDb2xvcigpOiBzdHJpbmd7XHJcbiAgICAgICAgLy92YXIgcmFuZG9tQ29sb3IgPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqMTY3NzcyMTUpLnRvU3RyaW5nKDE2KTtcclxuICAgICAgICAvL3JldHVybiBcIiNcIiArIHJhbmRvbUNvbG9yO1xyXG4gICAgXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuQ09MT1VSU1t0aGlzLnJhbmRvbUludCgwLCB0aGlzLkNPTE9VUlMubGVuZ3RoKV1cclxuICAgIH1cclxuXHJcbiAgICBnZXRDb2xvckhleChpbmRleDpudW1iZXIpOiBzdHJpbmd7XHJcbiAgICAgICAgaWYoaW5kZXggPj0gdGhpcy5DT0xPVVJTLmxlbmd0aClcclxuICAgICAgICAgICAgaW5kZXggPSAwXHJcbiAgICBcclxuICAgICAgICByZXR1cm4gdGhpcy5DT0xPVVJTW2luZGV4XVxyXG4gICAgfVxyXG59XHJcblxyXG4iXX0=