@formql/core
Version:
FormQL - A framework for building dynamic forms
134 lines • 21.3 kB
JavaScript
import { __decorate } from "tslib";
import { Injectable } from '@angular/core';
import { UUID } from 'angular2-uuid';
let DndService = class DndService {
synchroniseSectionModel(page, event) {
let sourceSection = page.sections.find(s => s.sectionId === event.sourceWrapperId);
let sourceComponent = null;
if (event.sourceObjectId === 'new') {
sourceComponent = this.newComponent();
event.sourceObjectId = sourceComponent.componentId;
sourceSection = page.sections.find(s => s.sectionId === event.targetWrapperId);
if (sourceSection)
sourceSection.components.push(sourceComponent);
else
return page; // this should never happen
}
else
sourceComponent = sourceSection.components.find(c => c.componentId === event.sourceObjectId);
if (!sourceComponent)
return;
// has the component been moved across position type (header/body)?
if (sourceComponent.position.type !== event.positionType)
sourceComponent.position.type = event.positionType;
// has the component been placed in a differnet CSS grid area?
if (sourceComponent.position.id !== event.targetPositionId)
sourceComponent.position.id = event.targetPositionId;
if (event.sourceWrapperId !== event.targetWrapperId) {
let targetSection = this.transferComponent(page, sourceSection, event);
targetSection.template.reRender = true;
targetSection = this.reorderComponents(targetSection, sourceComponent, event);
}
else
sourceSection = this.reorderComponents(sourceSection, sourceComponent, event);
sourceSection.template.reRender = true;
return page;
}
synchronisePageModel(page, event) {
let sourceSection = null;
if (event.sourceObjectId === 'new') {
sourceSection = this.newSection();
page.sections.push(sourceSection);
}
else
sourceSection = page.sections.find(s => s.sectionId === event.sourceObjectId);
// can't find the source section, model must be in different page
if (sourceSection != null) {
if (sourceSection.position.id !== event.targetPositionId)
sourceSection.position.id = event.targetPositionId;
page.template.reRender = true;
page = this.reorderSections(page, sourceSection, event);
}
return page;
}
reorderComponents(section, sourceCompoment, event) {
let components = section.components.filter(c => c.position.id === sourceCompoment.position.id);
const targetComponent = components.find(c => c.componentId === event.targetIndexId);
if (targetComponent) {
sourceCompoment.position.index = targetComponent.position.index;
targetComponent.position.index = targetComponent.position.index + 0.5;
}
components = components.sort((left, right) => {
return left.position.index - right.position.index;
});
for (let i = 0; i < components.length; i++) {
components[i].position.index = i;
}
return section;
}
reorderSections(page, sourceSection, event) {
let sections = page.sections.filter(c => c.position.id === sourceSection.position.id);
const targetSection = sections.find(c => c.sectionId === event.targetIndexId);
if (targetSection) {
sourceSection.position.index = targetSection.position.index;
targetSection.position.index = targetSection.position.index + 0.5;
}
sections = sections.sort((left, right) => {
return left.position.index - right.position.index;
});
for (let i = 0; i < sections.length; i++)
sections[i].position.index = i;
return page;
}
transferComponent(page, sourceSection, event) {
const targetSection = page.sections.find(s => s.sectionId === event.targetWrapperId);
if (!targetSection)
return null;
const component = sourceSection.components.find(c => c.componentId === event.sourceObjectId);
if (!component)
return null;
const index = sourceSection.components.findIndex(s => s.componentId === event.sourceObjectId);
targetSection.components.push(component);
sourceSection.components.splice(index, 1);
return targetSection;
}
newSection() {
return {
sectionId: UUID.UUID(),
sectionName: 'New section',
components: [],
template: {
header: {
gridTemplateColumns: '1fr',
gridTemplateRows: '1fr',
gridTemplateAreas: '"ID1_1"'
},
body: {
gridTemplateColumns: '1fr',
gridTemplateRows: '1fr',
gridTemplateAreas: '"ID1_1"'
}
},
position: {
id: '-1',
index: 0
}
};
}
newComponent() {
return {
componentId: UUID.UUID(),
label: 'New Component',
componentName: 'FormQLLabelComponent',
position: {
id: '-1',
index: 0
}
};
}
};
DndService = __decorate([
Injectable()
], DndService);
export { DndService };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG5kLnNlcnZpY2UuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AZm9ybXFsL2NvcmUvIiwic291cmNlcyI6WyJzZXJ2aWNlcy9kbmQuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUkzQyxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBS3JDLElBQWEsVUFBVSxHQUF2QixNQUFhLFVBQVU7SUFFbkIsdUJBQXVCLENBQUMsSUFBYyxFQUFFLEtBQWU7UUFDbkQsSUFBSSxhQUFhLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxLQUFLLEtBQUssQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUNuRixJQUFJLGVBQWUsR0FBRyxJQUFJLENBQUM7UUFDM0IsSUFBSSxLQUFLLENBQUMsY0FBYyxLQUFLLEtBQUssRUFBRTtZQUNoQyxlQUFlLEdBQUcsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ3RDLEtBQUssQ0FBQyxjQUFjLEdBQUcsZUFBZSxDQUFDLFdBQVcsQ0FBQztZQUNuRCxhQUFhLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxLQUFLLEtBQUssQ0FBQyxlQUFlLENBQUMsQ0FBQztZQUMvRSxJQUFJLGFBQWE7Z0JBQ2IsYUFBYSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7O2dCQUUvQyxPQUFPLElBQUksQ0FBQyxDQUFDLDJCQUEyQjtTQUMvQzs7WUFDRyxlQUFlLEdBQUcsYUFBYSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsV0FBVyxLQUFLLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUVqRyxJQUFJLENBQUMsZUFBZTtZQUNoQixPQUFPO1FBRVgsbUVBQW1FO1FBQ25FLElBQUksZUFBZSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEtBQUssS0FBSyxDQUFDLFlBQVk7WUFDcEQsZUFBZSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDLFlBQVksQ0FBQztRQUV2RCw4REFBOEQ7UUFDOUQsSUFBSSxlQUFlLENBQUMsUUFBUSxDQUFDLEVBQUUsS0FBSyxLQUFLLENBQUMsZ0JBQWdCO1lBQ3RELGVBQWUsQ0FBQyxRQUFRLENBQUMsRUFBRSxHQUFHLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQztRQUV6RCxJQUFJLEtBQUssQ0FBQyxlQUFlLEtBQUssS0FBSyxDQUFDLGVBQWUsRUFBRTtZQUNqRCxJQUFJLGFBQWEsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxFQUFFLGFBQWEsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUN2RSxhQUFhLENBQUMsUUFBUSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7WUFDdkMsYUFBYSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxhQUFhLEVBQUUsZUFBZSxFQUFFLEtBQUssQ0FBQyxDQUFDO1NBQ2pGOztZQUNHLGFBQWEsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsYUFBYSxFQUFFLGVBQWUsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUVsRixhQUFhLENBQUMsUUFBUSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7UUFDdkMsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUVELG9CQUFvQixDQUFDLElBQWMsRUFBRSxLQUFlO1FBQ2hELElBQUksYUFBYSxHQUFHLElBQUksQ0FBQztRQUV6QixJQUFJLEtBQUssQ0FBQyxjQUFjLEtBQUssS0FBSyxFQUFFO1lBQ2hDLGFBQWEsR0FBRyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDbEMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7U0FDckM7O1lBQ0csYUFBYSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsS0FBSyxLQUFLLENBQUMsY0FBYyxDQUFDLENBQUM7UUFFbEYsaUVBQWlFO1FBQ2pFLElBQUksYUFBYSxJQUFJLElBQUksRUFBRTtZQUN2QixJQUFJLGFBQWEsQ0FBQyxRQUFRLENBQUMsRUFBRSxLQUFLLEtBQUssQ0FBQyxnQkFBZ0I7Z0JBQ3BELGFBQWEsQ0FBQyxRQUFRLENBQUMsRUFBRSxHQUFHLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQztZQUV2RCxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7WUFFOUIsSUFBSSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLGFBQWEsRUFBRSxLQUFLLENBQUMsQ0FBQztTQUMzRDtRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7SUFFTyxpQkFBaUIsQ0FBQyxPQUFvQixFQUFFLGVBQW1DLEVBQUUsS0FBZTtRQUNoRyxJQUFJLFVBQVUsR0FBRyxPQUFPLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsRUFBRSxLQUFLLGVBQWUsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUM7UUFFL0YsTUFBTSxlQUFlLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxXQUFXLEtBQUssS0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBRXBGLElBQUksZUFBZSxFQUFFO1lBQ2pCLGVBQWUsQ0FBQyxRQUFRLENBQUMsS0FBSyxHQUFHLGVBQWUsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO1lBQ2hFLGVBQWUsQ0FBQyxRQUFRLENBQUMsS0FBSyxHQUFHLGVBQWUsQ0FBQyxRQUFRLENBQUMsS0FBSyxHQUFHLEdBQUcsQ0FBQztTQUN6RTtRQUVELFVBQVUsR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBd0IsRUFBRSxLQUF5QixFQUFFLEVBQUU7WUFDakYsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztRQUN0RCxDQUFDLENBQUMsQ0FBQztRQUNILEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxVQUFVLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ3hDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQztTQUNwQztRQUNELE9BQU8sT0FBTyxDQUFDO0lBQ25CLENBQUM7SUFFTyxlQUFlLENBQUMsSUFBYyxFQUFFLGFBQTBCLEVBQUUsS0FBZTtRQUMvRSxJQUFJLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsRUFBRSxLQUFLLGFBQWEsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUM7UUFFdEYsTUFBTSxhQUFhLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLEtBQUssS0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBRTlFLElBQUksYUFBYSxFQUFFO1lBQ2YsYUFBYSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEdBQUcsYUFBYSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7WUFDNUQsYUFBYSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEdBQUcsYUFBYSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEdBQUcsR0FBRyxDQUFDO1NBQ3JFO1FBRUQsUUFBUSxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFpQixFQUFFLEtBQWtCLEVBQUUsRUFBRTtZQUMvRCxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO1FBQ3RELENBQUMsQ0FBQyxDQUFDO1FBQ0gsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFO1lBQ3BDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQztRQUVuQyxPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBRU8saUJBQWlCLENBQUMsSUFBYyxFQUFFLGFBQTBCLEVBQUUsS0FBZTtRQUNqRixNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLEtBQUssS0FBSyxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQ3JGLElBQUksQ0FBQyxhQUFhO1lBQ2QsT0FBTyxJQUFJLENBQUM7UUFFaEIsTUFBTSxTQUFTLEdBQUcsYUFBYSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsV0FBVyxLQUFLLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUM3RixJQUFJLENBQUMsU0FBUztZQUNWLE9BQU8sSUFBSSxDQUFDO1FBRWhCLE1BQU0sS0FBSyxHQUFHLGFBQWEsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFdBQVcsS0FBSyxLQUFLLENBQUMsY0FBYyxDQUFDLENBQUM7UUFFOUYsYUFBYSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDekMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBRTFDLE9BQU8sYUFBYSxDQUFDO0lBQ3pCLENBQUM7SUFFTyxVQUFVO1FBQ2QsT0FBb0I7WUFDaEIsU0FBUyxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUU7WUFDdEIsV0FBVyxFQUFFLGFBQWE7WUFDMUIsVUFBVSxFQUFFLEVBQUU7WUFDZCxRQUFRLEVBQWdCO2dCQUNwQixNQUFNLEVBQWM7b0JBQ2hCLG1CQUFtQixFQUFFLEtBQUs7b0JBQzFCLGdCQUFnQixFQUFFLEtBQUs7b0JBQ3ZCLGlCQUFpQixFQUFFLFNBQVM7aUJBQy9CO2dCQUNELElBQUksRUFBYTtvQkFDYixtQkFBbUIsRUFBRSxLQUFLO29CQUMxQixnQkFBZ0IsRUFBRSxLQUFLO29CQUN2QixpQkFBaUIsRUFBRSxTQUFTO2lCQUMvQjthQUNKO1lBQ0QsUUFBUSxFQUFpQjtnQkFDckIsRUFBRSxFQUFFLElBQUk7Z0JBQ1IsS0FBSyxFQUFFLENBQUM7YUFDWDtTQUNKLENBQUM7SUFDTixDQUFDO0lBRU8sWUFBWTtRQUNoQixPQUEyQjtZQUN2QixXQUFXLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRTtZQUN4QixLQUFLLEVBQUUsZUFBZTtZQUN0QixhQUFhLEVBQUUsc0JBQXNCO1lBQ3JDLFFBQVEsRUFBaUI7Z0JBQ3JCLEVBQUUsRUFBRSxJQUFJO2dCQUNSLEtBQUssRUFBRSxDQUFDO2FBQ1g7U0FDSixDQUFDO0lBQ04sQ0FBQztDQUNKLENBQUE7QUFySlksVUFBVTtJQUR0QixVQUFVLEVBQUU7R0FDQSxVQUFVLENBcUp0QjtTQXJKWSxVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBGb3JtQ29tcG9uZW50IH0gZnJvbSAnLi4vbW9kZWxzL2Zvcm0tY29tcG9uZW50Lm1vZGVsJztcclxuaW1wb3J0IHsgRm9ybVNlY3Rpb24gfSBmcm9tICcuLi9tb2RlbHMvZm9ybS1zZWN0aW9uLm1vZGVsJztcclxuaW1wb3J0IHsgRm9ybVBhZ2UgfSBmcm9tICcuLi9tb2RlbHMvZm9ybS1wYWdlLm1vZGVsJztcclxuaW1wb3J0IHsgVVVJRCB9IGZyb20gJ2FuZ3VsYXIyLXV1aWQnO1xyXG5pbXBvcnQgeyBEbmRFdmVudCB9IGZyb20gJy4uL21vZGVscy9kbmQubW9kZWwnO1xyXG5pbXBvcnQgeyBHcmlkU3R5bGUsIEdyaWRUZW1wbGF0ZSwgR3JpZFBvc2l0aW9uIH0gZnJvbSAnLi4vbW9kZWxzL3N0eWxlLm1vZGVsJztcclxuXHJcbkBJbmplY3RhYmxlKClcclxuZXhwb3J0IGNsYXNzIERuZFNlcnZpY2Uge1xyXG5cclxuICAgIHN5bmNocm9uaXNlU2VjdGlvbk1vZGVsKHBhZ2U6IEZvcm1QYWdlLCBldmVudDogRG5kRXZlbnQpIHtcclxuICAgICAgICBsZXQgc291cmNlU2VjdGlvbiA9IHBhZ2Uuc2VjdGlvbnMuZmluZChzID0+IHMuc2VjdGlvbklkID09PSBldmVudC5zb3VyY2VXcmFwcGVySWQpO1xyXG4gICAgICAgIGxldCBzb3VyY2VDb21wb25lbnQgPSBudWxsO1xyXG4gICAgICAgIGlmIChldmVudC5zb3VyY2VPYmplY3RJZCA9PT0gJ25ldycpIHtcclxuICAgICAgICAgICAgc291cmNlQ29tcG9uZW50ID0gdGhpcy5uZXdDb21wb25lbnQoKTtcclxuICAgICAgICAgICAgZXZlbnQuc291cmNlT2JqZWN0SWQgPSBzb3VyY2VDb21wb25lbnQuY29tcG9uZW50SWQ7XHJcbiAgICAgICAgICAgIHNvdXJjZVNlY3Rpb24gPSBwYWdlLnNlY3Rpb25zLmZpbmQocyA9PiBzLnNlY3Rpb25JZCA9PT0gZXZlbnQudGFyZ2V0V3JhcHBlcklkKTtcclxuICAgICAgICAgICAgaWYgKHNvdXJjZVNlY3Rpb24pXHJcbiAgICAgICAgICAgICAgICBzb3VyY2VTZWN0aW9uLmNvbXBvbmVudHMucHVzaChzb3VyY2VDb21wb25lbnQpO1xyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcGFnZTsgLy8gdGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuXHJcbiAgICAgICAgfSBlbHNlXHJcbiAgICAgICAgICAgIHNvdXJjZUNvbXBvbmVudCA9IHNvdXJjZVNlY3Rpb24uY29tcG9uZW50cy5maW5kKGMgPT4gYy5jb21wb25lbnRJZCA9PT0gZXZlbnQuc291cmNlT2JqZWN0SWQpO1xyXG5cclxuICAgICAgICBpZiAoIXNvdXJjZUNvbXBvbmVudClcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgICAvLyBoYXMgdGhlIGNvbXBvbmVudCBiZWVuIG1vdmVkIGFjcm9zcyBwb3NpdGlvbiB0eXBlIChoZWFkZXIvYm9keSk/XHJcbiAgICAgICAgaWYgKHNvdXJjZUNvbXBvbmVudC5wb3NpdGlvbi50eXBlICE9PSBldmVudC5wb3NpdGlvblR5cGUpXHJcbiAgICAgICAgICAgIHNvdXJjZUNvbXBvbmVudC5wb3NpdGlvbi50eXBlID0gZXZlbnQucG9zaXRpb25UeXBlO1xyXG5cclxuICAgICAgICAvLyBoYXMgdGhlIGNvbXBvbmVudCBiZWVuIHBsYWNlZCBpbiBhIGRpZmZlcm5ldCBDU1MgZ3JpZCBhcmVhP1xyXG4gICAgICAgIGlmIChzb3VyY2VDb21wb25lbnQucG9zaXRpb24uaWQgIT09IGV2ZW50LnRhcmdldFBvc2l0aW9uSWQpXHJcbiAgICAgICAgICAgIHNvdXJjZUNvbXBvbmVudC5wb3NpdGlvbi5pZCA9IGV2ZW50LnRhcmdldFBvc2l0aW9uSWQ7XHJcblxyXG4gICAgICAgIGlmIChldmVudC5zb3VyY2VXcmFwcGVySWQgIT09IGV2ZW50LnRhcmdldFdyYXBwZXJJZCkge1xyXG4gICAgICAgICAgICBsZXQgdGFyZ2V0U2VjdGlvbiA9IHRoaXMudHJhbnNmZXJDb21wb25lbnQocGFnZSwgc291cmNlU2VjdGlvbiwgZXZlbnQpO1xyXG4gICAgICAgICAgICB0YXJnZXRTZWN0aW9uLnRlbXBsYXRlLnJlUmVuZGVyID0gdHJ1ZTtcclxuICAgICAgICAgICAgdGFyZ2V0U2VjdGlvbiA9IHRoaXMucmVvcmRlckNvbXBvbmVudHModGFyZ2V0U2VjdGlvbiwgc291cmNlQ29tcG9uZW50LCBldmVudCk7XHJcbiAgICAgICAgfSBlbHNlXHJcbiAgICAgICAgICAgIHNvdXJjZVNlY3Rpb24gPSB0aGlzLnJlb3JkZXJDb21wb25lbnRzKHNvdXJjZVNlY3Rpb24sIHNvdXJjZUNvbXBvbmVudCwgZXZlbnQpO1xyXG5cclxuICAgICAgICBzb3VyY2VTZWN0aW9uLnRlbXBsYXRlLnJlUmVuZGVyID0gdHJ1ZTtcclxuICAgICAgICByZXR1cm4gcGFnZTtcclxuICAgIH1cclxuXHJcbiAgICBzeW5jaHJvbmlzZVBhZ2VNb2RlbChwYWdlOiBGb3JtUGFnZSwgZXZlbnQ6IERuZEV2ZW50KSB7XHJcbiAgICAgICAgbGV0IHNvdXJjZVNlY3Rpb24gPSBudWxsO1xyXG5cclxuICAgICAgICBpZiAoZXZlbnQuc291cmNlT2JqZWN0SWQgPT09ICduZXcnKSB7XHJcbiAgICAgICAgICAgIHNvdXJjZVNlY3Rpb24gPSB0aGlzLm5ld1NlY3Rpb24oKTtcclxuICAgICAgICAgICAgcGFnZS5zZWN0aW9ucy5wdXNoKHNvdXJjZVNlY3Rpb24pO1xyXG4gICAgICAgIH0gZWxzZVxyXG4gICAgICAgICAgICBzb3VyY2VTZWN0aW9uID0gcGFnZS5zZWN0aW9ucy5maW5kKHMgPT4gcy5zZWN0aW9uSWQgPT09IGV2ZW50LnNvdXJjZU9iamVjdElkKTtcclxuXHJcbiAgICAgICAgLy8gY2FuJ3QgZmluZCB0aGUgc291cmNlIHNlY3Rpb24sIG1vZGVsIG11c3QgYmUgaW4gZGlmZmVyZW50IHBhZ2VcclxuICAgICAgICBpZiAoc291cmNlU2VjdGlvbiAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIGlmIChzb3VyY2VTZWN0aW9uLnBvc2l0aW9uLmlkICE9PSBldmVudC50YXJnZXRQb3NpdGlvbklkKVxyXG4gICAgICAgICAgICAgICAgc291cmNlU2VjdGlvbi5wb3NpdGlvbi5pZCA9IGV2ZW50LnRhcmdldFBvc2l0aW9uSWQ7XHJcblxyXG4gICAgICAgICAgICBwYWdlLnRlbXBsYXRlLnJlUmVuZGVyID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgICAgIHBhZ2UgPSB0aGlzLnJlb3JkZXJTZWN0aW9ucyhwYWdlLCBzb3VyY2VTZWN0aW9uLCBldmVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBwYWdlO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgcmVvcmRlckNvbXBvbmVudHMoc2VjdGlvbjogRm9ybVNlY3Rpb24sIHNvdXJjZUNvbXBvbWVudDogRm9ybUNvbXBvbmVudDxhbnk+LCBldmVudDogRG5kRXZlbnQpIHtcclxuICAgICAgICBsZXQgY29tcG9uZW50cyA9IHNlY3Rpb24uY29tcG9uZW50cy5maWx0ZXIoYyA9PiBjLnBvc2l0aW9uLmlkID09PSBzb3VyY2VDb21wb21lbnQucG9zaXRpb24uaWQpO1xyXG5cclxuICAgICAgICBjb25zdCB0YXJnZXRDb21wb25lbnQgPSBjb21wb25lbnRzLmZpbmQoYyA9PiBjLmNvbXBvbmVudElkID09PSBldmVudC50YXJnZXRJbmRleElkKTtcclxuXHJcbiAgICAgICAgaWYgKHRhcmdldENvbXBvbmVudCkge1xyXG4gICAgICAgICAgICBzb3VyY2VDb21wb21lbnQucG9zaXRpb24uaW5kZXggPSB0YXJnZXRDb21wb25lbnQucG9zaXRpb24uaW5kZXg7XHJcbiAgICAgICAgICAgIHRhcmdldENvbXBvbmVudC5wb3NpdGlvbi5pbmRleCA9IHRhcmdldENvbXBvbmVudC5wb3NpdGlvbi5pbmRleCArIDAuNTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbXBvbmVudHMgPSBjb21wb25lbnRzLnNvcnQoKGxlZnQ6IEZvcm1Db21wb25lbnQ8YW55PiwgcmlnaHQ6IEZvcm1Db21wb25lbnQ8YW55PikgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gbGVmdC5wb3NpdGlvbi5pbmRleCAtIHJpZ2h0LnBvc2l0aW9uLmluZGV4O1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29tcG9uZW50cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBjb21wb25lbnRzW2ldLnBvc2l0aW9uLmluZGV4ID0gaTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHNlY3Rpb247XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSByZW9yZGVyU2VjdGlvbnMocGFnZTogRm9ybVBhZ2UsIHNvdXJjZVNlY3Rpb246IEZvcm1TZWN0aW9uLCBldmVudDogRG5kRXZlbnQpIHtcclxuICAgICAgICBsZXQgc2VjdGlvbnMgPSBwYWdlLnNlY3Rpb25zLmZpbHRlcihjID0+IGMucG9zaXRpb24uaWQgPT09IHNvdXJjZVNlY3Rpb24ucG9zaXRpb24uaWQpO1xyXG5cclxuICAgICAgICBjb25zdCB0YXJnZXRTZWN0aW9uID0gc2VjdGlvbnMuZmluZChjID0+IGMuc2VjdGlvbklkID09PSBldmVudC50YXJnZXRJbmRleElkKTtcclxuXHJcbiAgICAgICAgaWYgKHRhcmdldFNlY3Rpb24pIHtcclxuICAgICAgICAgICAgc291cmNlU2VjdGlvbi5wb3NpdGlvbi5pbmRleCA9IHRhcmdldFNlY3Rpb24ucG9zaXRpb24uaW5kZXg7XHJcbiAgICAgICAgICAgIHRhcmdldFNlY3Rpb24ucG9zaXRpb24uaW5kZXggPSB0YXJnZXRTZWN0aW9uLnBvc2l0aW9uLmluZGV4ICsgMC41O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgc2VjdGlvbnMgPSBzZWN0aW9ucy5zb3J0KChsZWZ0OiBGb3JtU2VjdGlvbiwgcmlnaHQ6IEZvcm1TZWN0aW9uKSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiBsZWZ0LnBvc2l0aW9uLmluZGV4IC0gcmlnaHQucG9zaXRpb24uaW5kZXg7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZWN0aW9ucy5sZW5ndGg7IGkrKylcclxuICAgICAgICAgICAgc2VjdGlvbnNbaV0ucG9zaXRpb24uaW5kZXggPSBpO1xyXG5cclxuICAgICAgICByZXR1cm4gcGFnZTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHRyYW5zZmVyQ29tcG9uZW50KHBhZ2U6IEZvcm1QYWdlLCBzb3VyY2VTZWN0aW9uOiBGb3JtU2VjdGlvbiwgZXZlbnQ6IERuZEV2ZW50KSB7XHJcbiAgICAgICAgY29uc3QgdGFyZ2V0U2VjdGlvbiA9IHBhZ2Uuc2VjdGlvbnMuZmluZChzID0+IHMuc2VjdGlvbklkID09PSBldmVudC50YXJnZXRXcmFwcGVySWQpO1xyXG4gICAgICAgIGlmICghdGFyZ2V0U2VjdGlvbilcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcblxyXG4gICAgICAgIGNvbnN0IGNvbXBvbmVudCA9IHNvdXJjZVNlY3Rpb24uY29tcG9uZW50cy5maW5kKGMgPT4gYy5jb21wb25lbnRJZCA9PT0gZXZlbnQuc291cmNlT2JqZWN0SWQpO1xyXG4gICAgICAgIGlmICghY29tcG9uZW50KVxyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuXHJcbiAgICAgICAgY29uc3QgaW5kZXggPSBzb3VyY2VTZWN0aW9uLmNvbXBvbmVudHMuZmluZEluZGV4KHMgPT4gcy5jb21wb25lbnRJZCA9PT0gZXZlbnQuc291cmNlT2JqZWN0SWQpO1xyXG5cclxuICAgICAgICB0YXJnZXRTZWN0aW9uLmNvbXBvbmVudHMucHVzaChjb21wb25lbnQpO1xyXG4gICAgICAgIHNvdXJjZVNlY3Rpb24uY29tcG9uZW50cy5zcGxpY2UoaW5kZXgsIDEpO1xyXG5cclxuICAgICAgICByZXR1cm4gdGFyZ2V0U2VjdGlvbjtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIG5ld1NlY3Rpb24oKTogRm9ybVNlY3Rpb24ge1xyXG4gICAgICAgIHJldHVybiA8Rm9ybVNlY3Rpb24+e1xyXG4gICAgICAgICAgICBzZWN0aW9uSWQ6IFVVSUQuVVVJRCgpLFxyXG4gICAgICAgICAgICBzZWN0aW9uTmFtZTogJ05ldyBzZWN0aW9uJyxcclxuICAgICAgICAgICAgY29tcG9uZW50czogW10sXHJcbiAgICAgICAgICAgIHRlbXBsYXRlOiA8R3JpZFRlbXBsYXRlPntcclxuICAgICAgICAgICAgICAgIGhlYWRlcjogPEdyaWRTdHlsZT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGdyaWRUZW1wbGF0ZUNvbHVtbnM6ICcxZnInLFxyXG4gICAgICAgICAgICAgICAgICAgIGdyaWRUZW1wbGF0ZVJvd3M6ICcxZnInLFxyXG4gICAgICAgICAgICAgICAgICAgIGdyaWRUZW1wbGF0ZUFyZWFzOiAnXCJJRDFfMVwiJ1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGJvZHk6IDxHcmlkU3R5bGU+e1xyXG4gICAgICAgICAgICAgICAgICAgIGdyaWRUZW1wbGF0ZUNvbHVtbnM6ICcxZnInLFxyXG4gICAgICAgICAgICAgICAgICAgIGdyaWRUZW1wbGF0ZVJvd3M6ICcxZnInLFxyXG4gICAgICAgICAgICAgICAgICAgIGdyaWRUZW1wbGF0ZUFyZWFzOiAnXCJJRDFfMVwiJ1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBwb3NpdGlvbjogPEdyaWRQb3NpdGlvbj4ge1xyXG4gICAgICAgICAgICAgICAgaWQ6ICctMScsXHJcbiAgICAgICAgICAgICAgICBpbmRleDogMFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIG5ld0NvbXBvbmVudCgpOiBGb3JtQ29tcG9uZW50PGFueT4ge1xyXG4gICAgICAgIHJldHVybiA8Rm9ybUNvbXBvbmVudDxhbnk+PntcclxuICAgICAgICAgICAgY29tcG9uZW50SWQ6IFVVSUQuVVVJRCgpLFxyXG4gICAgICAgICAgICBsYWJlbDogJ05ldyBDb21wb25lbnQnLFxyXG4gICAgICAgICAgICBjb21wb25lbnROYW1lOiAnRm9ybVFMTGFiZWxDb21wb25lbnQnLFxyXG4gICAgICAgICAgICBwb3NpdGlvbjogPEdyaWRQb3NpdGlvbj4ge1xyXG4gICAgICAgICAgICAgICAgaWQ6ICctMScsXHJcbiAgICAgICAgICAgICAgICBpbmRleDogMFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuICAgIH1cclxufVxyXG4iXX0=