dcl-npc-toolkit-ai-version
Version:
A collection of tools for creating Non-Player-Characters (NPCs). These are capable of having conversations with the player, and play different animations. AI usage is added atop of it
426 lines • 62.3 kB
JavaScript
import ReactEcs, { UiEntity } from '@dcl/sdk/react-ecs';
import { buttonClick, displayButton, displayDialog, displayFirstButtonContainer, displayImage, displayPortrait, displaySecondButtonContainer, displaySkipable, getButtonText, getbuttonSize, getFontSize, getButtonFontSize, getImage, getImageAtlasMapping, getLeftClickTheme, getPortrait, getSkipableTheme, getText, getTextColor, getTextPosition, getTheme, handleDialogClick, imageHeight, imageWidth, portraitHeight, portraitWidth, positionImageX, positionImageY, positionPortaitX, positionPortaitY, realHeight, realWidth, skipDialogs, getWindowHeight } from './dialog';
import { sourcesComponentsCoordinates } from './uiResources';
import { activeNPC } from './npc';
export let lightTheme = 'https://decentraland.org/images/ui/light-atlas-v3.png';
export let darkTheme = 'https://decentraland.org/images/ui/dark-atlas-v3.png';
export let bubblesTexture = 'https://decentraland.org/images/ui/dialog-bubbles.png';
export let section = {
...sourcesComponentsCoordinates.backgrounds.NPCDialog,
atlasHeight: sourcesComponentsCoordinates.atlasHeight,
atlasWidth: sourcesComponentsCoordinates.atlasWidth
};
export let skipButtonSection = {
...sourcesComponentsCoordinates.buttons.F,
atlasHeight: sourcesComponentsCoordinates.atlasHeight,
atlasWidth: sourcesComponentsCoordinates.atlasWidth
};
export let skipButtonSectionBlack = {
...sourcesComponentsCoordinates.buttons.FBlack,
atlasHeight: sourcesComponentsCoordinates.atlasHeight,
atlasWidth: sourcesComponentsCoordinates.atlasWidth
};
export let leftClickSection = {
...sourcesComponentsCoordinates.icons.ClickWhite,
atlasHeight: sourcesComponentsCoordinates.atlasHeight,
atlasWidth: sourcesComponentsCoordinates.atlasWidth
};
export let leftClickSectionbBlack = {
...sourcesComponentsCoordinates.icons.ClickDark,
atlasHeight: sourcesComponentsCoordinates.atlasHeight,
atlasWidth: sourcesComponentsCoordinates.atlasWidth
};
export let primaryButtonSection = {
...sourcesComponentsCoordinates.buttons.E,
atlasHeight: sourcesComponentsCoordinates.atlasHeight,
atlasWidth: sourcesComponentsCoordinates.atlasWidth
};
export let secondaryButtonSection = {
...sourcesComponentsCoordinates.buttons.F,
atlasHeight: sourcesComponentsCoordinates.atlasHeight,
atlasWidth: sourcesComponentsCoordinates.atlasWidth
};
export let darkButtonSection = {
...sourcesComponentsCoordinates.buttons.buttonF,
atlasHeight: sourcesComponentsCoordinates.atlasHeight,
atlasWidth: sourcesComponentsCoordinates.atlasWidth
};
export let darkButtonCorner = {
...sourcesComponentsCoordinates.buttons.buttonFCorner,
atlasHeight: sourcesComponentsCoordinates.atlasHeight,
atlasWidth: sourcesComponentsCoordinates.atlasWidth
};
export let darkButtonEdge = {
...sourcesComponentsCoordinates.buttons.buttonFEdge,
atlasHeight: sourcesComponentsCoordinates.atlasHeight,
atlasWidth: sourcesComponentsCoordinates.atlasWidth
};
export let redButtonSection = {
...sourcesComponentsCoordinates.buttons.buttonE,
atlasHeight: sourcesComponentsCoordinates.atlasHeight,
atlasWidth: sourcesComponentsCoordinates.atlasWidth
};
export let redButtonCorner = {
...sourcesComponentsCoordinates.buttons.buttonECorner,
atlasHeight: sourcesComponentsCoordinates.atlasHeight,
atlasWidth: sourcesComponentsCoordinates.atlasWidth
};
export let redButtonEdge = {
...sourcesComponentsCoordinates.buttons.buttonEEdge,
atlasHeight: sourcesComponentsCoordinates.atlasHeight,
atlasWidth: sourcesComponentsCoordinates.atlasWidth
};
export let modalScale = 1;
export let modelFontSizeScale = 1;
let modalTextWrapScale = 1;
export function setupNPCUiScaling(inModalScale, inFontSize, inModalTextWrapScale) {
modalScale = inModalScale;
modelFontSizeScale = inFontSize;
modalTextWrapScale = inModalTextWrapScale;
console.log('NPC-TOOLKIT', 'Scale UI:', modalScale, 'TextFontSize:', modelFontSizeScale, 'TextWrapScaling:', modalTextWrapScale);
}
function getScaledSize(size) {
return size * modalScale;
}
function getScaledFontSize(size) {
return size * modelFontSizeScale;
}
function getScaledTextWrap(size) {
return size * modalTextWrapScale;
}
function getScaledButtonWidth(button) {
return typeof (getbuttonSize(button)) === 'number' ? getScaledSize(getbuttonSize(button)) : 'auto';
}
export const NpcUtilsUi = () => {
const width = getScaledSize(realWidth(700));
const height = getScaledSize(realHeight(284));
return (ReactEcs.createElement(UiEntity, { uiTransform: {
display: displayDialog() ? 'flex' : 'none',
flexDirection: 'column',
alignItems: 'center',
justifyContent: 'center',
positionType: 'absolute',
position: { bottom: '10%', left: '50%' },
margin: { top: -height / 2, left: -width / 2 },
padding: { top: 40, bottom: 40 },
width,
height: typeof (getWindowHeight()) === 'number' ? getWindowHeight() : 'auto'
} },
ReactEcs.createElement(UiEntity, { uiTransform: {
positionType: 'absolute',
position: { top: 0, left: 0 },
width: '100%',
height: '100%'
}, uiBackground: {
textureMode: 'stretch',
texture: {
src: getTheme()
},
uvs: getImageAtlasMapping(section)
}, onMouseDown: () => {
handleDialogClick();
} }),
ReactEcs.createElement(UiEntity, { uiTransform: {
display: displayPortrait() ? 'flex' : 'none',
width: getScaledSize(portraitWidth()),
height: getScaledSize(portraitHeight()),
positionType: 'absolute',
position: {
bottom: getScaledSize(positionPortaitY()),
left: getScaledSize(positionPortaitX())
}
}, uiBackground: {
textureMode: 'stretch',
texture: {
src: getPortrait()
}
} }),
ReactEcs.createElement(UiEntity, { uiTransform: {
display: displayImage() ? 'flex' : 'none',
width: getScaledSize(imageWidth()),
height: getScaledSize(imageHeight()),
positionType: 'absolute',
position: { bottom: positionImageY(), right: positionImageX() }
}, uiBackground: {
textureMode: 'stretch',
texture: {
src: getImage()
}
} }),
ReactEcs.createElement(UiEntity, { uiTransform: {
display: displaySkipable() ? 'flex' : 'none',
width: getScaledSize(15),
height: getScaledSize(15),
positionType: 'absolute',
position: { bottom: '7%', left: '25%' }
}, uiBackground: {
textureMode: 'stretch',
texture: {
src: getTheme()
},
uvs: getImageAtlasMapping(getSkipableTheme())
}, onMouseDown: () => {
skipDialogs(activeNPC);
} },
ReactEcs.createElement(UiEntity, { uiTransform: {
display: 'flex',
positionType: 'absolute',
position: { left: '215%' }
}, uiText: {
value: 'Skip',
color: getTextColor(),
fontSize: getScaledFontSize(12)
} })),
ReactEcs.createElement(UiEntity, { uiTransform: {
display: 'flex',
width: getScaledSize(24),
height: getScaledSize(36),
positionType: 'absolute',
position: { bottom: '5%', right: '2%' }
}, uiBackground: {
textureMode: 'stretch',
texture: {
src: getTheme()
},
uvs: getImageAtlasMapping(getLeftClickTheme())
} }),
ReactEcs.createElement(UiEntity, { uiTransform: {
height: 'auto',
width: 'auto',
alignSelf: 'flex-start',
alignItems: 'flex-start',
justifyContent: 'flex-start',
flexDirection: 'row',
position: getTextPosition(),
display: 'flex',
flexGrow: 1,
minHeight: 100
}, uiText: {
value: getText(),
color: getTextColor(),
fontSize: getScaledFontSize(getFontSize()),
textAlign: 'middle-left'
} }),
ReactEcs.createElement(UiEntity, { uiTransform: {
width: getScaledButtonWidth(450),
alignItems: 'center',
flexDirection: 'row',
justifyContent: 'center',
display: displayFirstButtonContainer() ? 'flex' : 'none',
} },
ReactEcs.createElement(UiEntity, { onMouseDown: () => {
buttonClick(0);
} },
ReactEcs.createElement(UiEntity, { uiTransform: {
height: 'auto',
width: getScaledSize(12)
}, uiBackground: {
textureMode: 'stretch',
texture: {
src: getTheme()
},
uvs: getImageAtlasMapping(darkButtonCorner)
} }),
ReactEcs.createElement(UiEntity, { uiTransform: {
width: getScaledButtonWidth(0),
maxWidth: getScaledSize(300),
height: getScaledSize(45),
flexDirection: 'row',
alignItems: 'center',
justifyContent: 'flex-start',
alignContent: 'flex-start',
display: displayButton(1) ? 'flex' : 'none',
}, uiBackground: {
textureMode: 'stretch',
texture: {
src: getTheme()
},
uvs: getImageAtlasMapping(darkButtonSection)
} },
ReactEcs.createElement(UiEntity, { uiTransform: {
width: getScaledSize(25),
height: getScaledSize(25),
margin: { right: getScaledSize(5) },
positionType: 'absolute'
}, uiBackground: {
textureMode: 'stretch',
texture: {
src: getTheme()
},
uvs: getImageAtlasMapping(secondaryButtonSection)
} }),
ReactEcs.createElement(UiEntity, { uiTransform: {
width: 'auto',
overflow: 'hidden',
maxWidth: getScaledSize(217),
padding: { right: getScaledSize(5) },
margin: { left: getScaledSize(30) }
}, uiText: { value: getButtonText(0), fontSize: getScaledFontSize(getButtonFontSize(0)), textAlign: 'middle-left' } })),
ReactEcs.createElement(UiEntity, { uiTransform: {
height: 'auto',
width: getScaledSize(12),
margin: { right: '5%' },
}, uiBackground: {
textureMode: 'stretch',
texture: {
src: getTheme()
},
uvs: getImageAtlasMapping(darkButtonEdge)
} })),
ReactEcs.createElement(UiEntity, { onMouseDown: () => {
buttonClick(1);
} },
ReactEcs.createElement(UiEntity, { uiTransform: {
height: 'auto',
width: getScaledSize(12)
}, uiBackground: {
textureMode: 'stretch',
texture: {
src: getTheme()
},
uvs: getImageAtlasMapping(redButtonCorner)
} }),
ReactEcs.createElement(UiEntity, { uiTransform: {
width: getScaledButtonWidth(1),
maxWidth: getScaledSize(300),
height: getScaledSize(45),
flexDirection: 'row',
alignItems: 'center',
justifyContent: 'flex-start',
alignContent: 'flex-start',
display: displayButton(2) ? 'flex' : 'none',
}, uiBackground: {
textureMode: 'stretch',
texture: {
src: getTheme()
},
uvs: getImageAtlasMapping(redButtonSection)
} },
ReactEcs.createElement(UiEntity, { uiTransform: {
width: getScaledSize(25),
height: getScaledSize(25),
margin: { right: getScaledSize(5) },
positionType: 'absolute',
}, uiBackground: {
textureMode: 'stretch',
texture: {
src: getTheme()
},
uvs: getImageAtlasMapping(primaryButtonSection)
} }),
ReactEcs.createElement(UiEntity, { uiTransform: {
width: 'auto',
maxWidth: getScaledSize(217),
overflow: 'hidden',
padding: { right: getScaledSize(5) },
margin: { left: getScaledSize(30) }
}, uiText: { value: getButtonText(1), fontSize: getScaledFontSize(getButtonFontSize(1)), textAlign: 'middle-left' } })),
ReactEcs.createElement(UiEntity, { uiTransform: {
height: 'auto',
width: getScaledSize(12)
}, uiBackground: {
textureMode: 'stretch',
texture: {
src: getTheme()
},
uvs: getImageAtlasMapping(redButtonEdge)
} }))),
ReactEcs.createElement(UiEntity, { uiTransform: {
width: getScaledButtonWidth(450),
alignItems: 'center',
flexDirection: 'row',
justifyContent: 'center',
margin: { top: getScaledSize(20) },
display: displaySecondButtonContainer() ? 'flex' : 'none',
} },
ReactEcs.createElement(UiEntity, { onMouseDown: () => {
buttonClick(3);
} },
ReactEcs.createElement(UiEntity, { uiTransform: {
height: 'auto',
width: getScaledSize(12),
}, uiBackground: {
textureMode: 'stretch',
texture: {
src: getTheme()
},
uvs: getImageAtlasMapping(darkButtonCorner)
} }),
ReactEcs.createElement(UiEntity, { uiTransform: {
width: getScaledButtonWidth(2),
maxWidth: getScaledSize(300),
overflow: 'hidden',
height: getScaledSize(45),
alignItems: 'center',
justifyContent: 'center',
alignContent: 'flex-start',
display: displayButton(3) ? 'flex' : 'none'
}, uiBackground: {
textureMode: 'stretch',
texture: {
src: getTheme()
},
uvs: getImageAtlasMapping(darkButtonSection)
} },
ReactEcs.createElement(UiEntity, { uiTransform: {
width: 'auto',
maxWidth: getScaledSize(252),
overflow: 'hidden',
}, uiText: { value: getButtonText(2), fontSize: getScaledFontSize(getButtonFontSize(2)), textAlign: 'middle-left' } })),
ReactEcs.createElement(UiEntity, { uiTransform: {
height: 'auto',
width: getScaledSize(12),
margin: { right: '5%' },
}, uiBackground: {
textureMode: 'stretch',
texture: {
src: getTheme()
},
uvs: getImageAtlasMapping(darkButtonEdge)
} })),
ReactEcs.createElement(UiEntity, { onMouseDown: () => {
buttonClick(4);
} },
ReactEcs.createElement(UiEntity, { uiTransform: {
height: 'auto',
width: getScaledSize(12),
}, uiBackground: {
textureMode: 'stretch',
texture: {
src: getTheme()
},
uvs: getImageAtlasMapping(darkButtonCorner)
} }),
ReactEcs.createElement(UiEntity, { uiTransform: {
width: getScaledButtonWidth(3),
maxWidth: getScaledSize(300),
overflow: 'hidden',
height: getScaledSize(45),
alignItems: 'center',
justifyContent: 'center',
alignContent: 'flex-start',
display: displayButton(4) ? 'flex' : 'none',
}, uiBackground: {
textureMode: 'stretch',
texture: {
src: getTheme()
},
uvs: getImageAtlasMapping(darkButtonSection)
} },
ReactEcs.createElement(UiEntity, { uiTransform: {
width: 'auto',
maxWidth: getScaledSize(252),
overflow: 'hidden',
}, uiText: { value: getButtonText(3), fontSize: getScaledFontSize(getButtonFontSize(3)), textAlign: 'middle-left' } })),
ReactEcs.createElement(UiEntity, { uiTransform: {
height: 'auto',
width: getScaledSize(12),
}, uiBackground: {
textureMode: 'stretch',
texture: {
src: getTheme()
},
uvs: getImageAtlasMapping(darkButtonEdge)
} })))));
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidWkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvdWkudHN4Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sUUFBUSxFQUFFLEVBQW1DLFFBQVEsRUFBRSxNQUFNLG9CQUFvQixDQUFBO0FBRXhGLE9BQU8sRUFDTCxXQUFXLEVBRVgsYUFBYSxFQUNiLGFBQWEsRUFDYiwyQkFBMkIsRUFDM0IsWUFBWSxFQUNaLGVBQWUsRUFDZiw0QkFBNEIsRUFDNUIsZUFBZSxFQUNmLGFBQWEsRUFDYixhQUFhLEVBQ2IsV0FBVyxFQUNYLGlCQUFpQixFQUNqQixRQUFRLEVBQ1Isb0JBQW9CLEVBQ3BCLGlCQUFpQixFQUNqQixXQUFXLEVBQ1gsZ0JBQWdCLEVBQ2hCLE9BQU8sRUFDUCxZQUFZLEVBQ1osZUFBZSxFQUNmLFFBQVEsRUFDUixpQkFBaUIsRUFDakIsV0FBVyxFQUNYLFVBQVUsRUFDVixjQUFjLEVBQ2QsYUFBYSxFQUNiLGNBQWMsRUFDZCxjQUFjLEVBQ2QsZ0JBQWdCLEVBQ2hCLGdCQUFnQixFQUdoQixVQUFVLEVBQ1YsU0FBUyxFQUNULFdBQVcsRUFDWCxlQUFlLEVBQ2hCLE1BQU0sVUFBVSxDQUFBO0FBQ2pCLE9BQU8sRUFBRSw0QkFBNEIsRUFBRSxNQUFNLGVBQWUsQ0FBQTtBQUM1RCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sT0FBTyxDQUFBO0FBRWpDLE1BQU0sQ0FBQyxJQUFJLFVBQVUsR0FBRyx1REFBdUQsQ0FBQTtBQUMvRSxNQUFNLENBQUMsSUFBSSxTQUFTLEdBQUcsc0RBQXNELENBQUE7QUFFN0UsTUFBTSxDQUFDLElBQUksY0FBYyxHQUFHLHVEQUF1RCxDQUFBO0FBRW5GLE1BQU0sQ0FBQyxJQUFJLE9BQU8sR0FBRztJQUNuQixHQUFHLDRCQUE0QixDQUFDLFdBQVcsQ0FBQyxTQUFTO0lBQ3JELFdBQVcsRUFBRSw0QkFBNEIsQ0FBQyxXQUFXO0lBQ3JELFVBQVUsRUFBRSw0QkFBNEIsQ0FBQyxVQUFVO0NBQ3BE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QkFDWixXQUFXLEVBQUUsU0FBUzt3QkFDdEIsT0FBTyxFQUFFOzRCQUNQLEdBQUcsRUFBRSxRQUFRLEVBQUU7eUJBQ2hCO3dCQUNELEdBQUcsRUFBRSxvQkFBb0IsQ0FBQyxpQkFBaUIsQ0FBQztxQkFDN0M7b0JBRUQsdUJBQUMsUUFBUSxJQUNQLFdBQVcsRUFBRTs0QkFDWCxLQUFLLEVBQUUsTUFBTTs0QkFDYixRQUFRLEVBQUUsYUFBYSxDQUFDLEdBQUcsQ0FBQzs0QkFDNUIsUUFBUSxFQUFFLFFBQVE7eUJBQ25CLEVBQ0QsTUFBTSxFQUFFLEVBQUUsS0FBSyxFQUFFLGFBQWEsQ0FBQyxDQUFDLENBQUMsRUFBRSxRQUFRLEVBQUUsaUJBQWlCLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxTQUFTLEVBQUUsYUFBYSxFQUFFLEdBQ2hILENBQ087Z0JBQ1gsdUJBQUMsUUFBUSxJQUNQLFdBQVcsRUFBRTt3QkFDWCxNQUFNLEVBQUUsTUFBTTt3QkFDZCxLQUFLLEVBQUUsYUFBYSxDQUFDLEVBQUUsQ0FBQztxQkFDekIsRUFDRCxZQUFZLEVBQUU7d0JBQ1osV0FBVyxFQUFFLFNBQVM7d0JBQ3RCLE9BQU8sRUFBRTs0QkFDUCxHQUFHLEVBQUUsUUFBUSxFQUFFO3lCQUNoQjt3QkFDRCxHQUFHLEVBQUUsb0JBQW9CLENBQUMsY0FBYyxDQUFDO3FCQUMxQyxHQUNELENBQ08sQ0FDRixDQUNGLENBQ1osQ0FBQTtBQUNILENBQUMsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbG9yNCB9IGZyb20gJ0BkY2wvc2RrL21hdGgnXG5pbXBvcnQgUmVhY3RFY3MsIHsgQnV0dG9uLCBMYWJlbCwgUmVhY3RFY3NSZW5kZXJlciwgVWlFbnRpdHkgfSBmcm9tICdAZGNsL3Nkay9yZWFjdC1lY3MnXG5pbXBvcnQgeyBFbnRpdHkgfSBmcm9tICdAZGNsL3Nkay9lY3MnXG5pbXBvcnQge1xuICBidXR0b25DbGljayxcbiAgY29uZmlybVRleHQsXG4gIGRpc3BsYXlCdXR0b24sXG4gIGRpc3BsYXlEaWFsb2csXG4gIGRpc3BsYXlGaXJzdEJ1dHRvbkNvbnRhaW5lcixcbiAgZGlzcGxheUltYWdlLFxuICBkaXNwbGF5UG9ydHJhaXQsXG4gIGRpc3BsYXlTZWNvbmRCdXR0b25Db250YWluZXIsXG4gIGRpc3BsYXlTa2lwYWJsZSxcbiAgZ2V0QnV0dG9uVGV4dCxcbiAgZ2V0YnV0dG9uU2l6ZSxcbiAgZ2V0Rm9udFNpemUsXG4gIGdldEJ1dHRvbkZvbnRTaXplLFxuICBnZXRJbWFnZSxcbiAgZ2V0SW1hZ2VBdGxhc01hcHBpbmcsXG4gIGdldExlZnRDbGlja1RoZW1lLFxuICBnZXRQb3J0cmFpdCxcbiAgZ2V0U2tpcGFibGVUaGVtZSxcbiAgZ2V0VGV4dCxcbiAgZ2V0VGV4dENvbG9yLFxuICBnZXRUZXh0UG9zaXRpb24sXG4gIGdldFRoZW1lLFxuICBoYW5kbGVEaWFsb2dDbGljayxcbiAgaW1hZ2VIZWlnaHQsXG4gIGltYWdlV2lkdGgsXG4gIHBvcnRyYWl0SGVpZ2h0LFxuICBwb3J0cmFpdFdpZHRoLFxuICBwb3NpdGlvbkltYWdlWCxcbiAgcG9zaXRpb25JbWFnZVksXG4gIHBvc2l0aW9uUG9ydGFpdFgsXG4gIHBvc2l0aW9uUG9ydGFpdFksXG4gIHBvc2l0aW9uVGV4dFgsXG4gIHBvc2l0aW9uVGV4dFksXG4gIHJlYWxIZWlnaHQsXG4gIHJlYWxXaWR0aCxcbiAgc2tpcERpYWxvZ3MsXG4gIGdldFdpbmRvd0hlaWdodFxufSBmcm9tICcuL2RpYWxvZydcbmltcG9ydCB7IHNvdXJjZXNDb21wb25lbnRzQ29vcmRpbmF0ZXMgfSBmcm9tICcuL3VpUmVzb3VyY2VzJ1xuaW1wb3J0IHsgYWN0aXZlTlBDIH0gZnJvbSAnLi9ucGMnXG5cbmV4cG9ydCBsZXQgbGlnaHRUaGVtZSA9ICdodHRwczovL2RlY2VudHJhbGFuZC5vcmcvaW1hZ2VzL3VpL2xpZ2h0LWF0bGFzLXYzLnBuZydcbmV4cG9ydCBsZXQgZGFya1RoZW1lID0gJ2h0dHBzOi8vZGVjZW50cmFsYW5kLm9yZy9pbWFnZXMvdWkvZGFyay1hdGxhcy12My5wbmcnXG5cbmV4cG9ydCBsZXQgYnViYmxlc1RleHR1cmUgPSAnaHR0cHM6Ly9kZWNlbnRyYWxhbmQub3JnL2ltYWdlcy91aS9kaWFsb2ctYnViYmxlcy5wbmcnXG5cbmV4cG9ydCBsZXQgc2VjdGlvbiA9IHtcbiAgLi4uc291cmNlc0NvbXBvbmVudHNDb29yZGluYXRlcy5iYWNrZ3JvdW5kcy5OUENEaWFsb2csXG4gIGF0bGFzSGVpZ2h0OiBzb3VyY2VzQ29tcG9uZW50c0Nvb3JkaW5hdGVzLmF0bGFzSGVpZ2h0LFxuICBhdGxhc1dpZHRoOiBzb3VyY2VzQ29tcG9uZW50c0Nvb3JkaW5hdGVzLmF0bGFzV2lkdGhcbn1cblxuZXhwb3J0IGxldCBza2lwQnV0dG9uU2VjdGlvbiA9IHtcbiAgLi4uc291cmNlc0NvbXBvbmVudHNDb29yZGluYXRlcy5idXR0b25zLkYsXG4gIGF0bGFzSGVpZ2h0OiBzb3VyY2VzQ29tcG9uZW50c0Nvb3JkaW5hdGVzLmF0bGFzSGVpZ2h0LFxuICBhdGxhc1dpZHRoOiBzb3VyY2VzQ29tcG9uZW50c0Nvb3JkaW5hdGVzLmF0bGFzV2lkdGhcbn1cblxuZXhwb3J0IGxldCBza2lwQnV0dG9uU2VjdGlvbkJsYWNrID0ge1xuICAuLi5zb3VyY2VzQ29tcG9uZW50c0Nvb3JkaW5hdGVzLmJ1dHRvbnMuRkJsYWNrLFxuICBhdGxhc0hlaWdodDogc291cmNlc0NvbXBvbmVudHNDb29yZGluYXRlcy5hdGxhc0hlaWdodCxcbiAgYXRsYXNXaWR0aDogc291cmNlc0NvbXBvbmVudHNDb29yZGluYXRlcy5hdGxhc1dpZHRoXG59XG5cbmV4cG9ydCBsZXQgbGVmdENsaWNrU2VjdGlvbiA9IHtcbiAgLi4uc291cmNlc0NvbXBvbmVudHNDb29yZGluYXRlcy5pY29ucy5DbGlja1doaXRlLFxuICBhdGxhc0hlaWdodDogc291cmNlc0NvbXBvbmVudHNDb29yZGluYXRlcy5hdGxhc0hlaWdodCxcbiAgYXRsYXNXaWR0aDogc291cmNlc0NvbXBvbmVudHNDb29yZGluYXRlcy5hdGxhc1dpZHRoXG59XG5cbmV4cG9ydCBsZXQgbGVmdENsaWNrU2VjdGlvbmJCbGFjayA9IHtcbiAgLi4uc291cmNlc0NvbXBvbmVudHNDb29yZGluYXRlcy5pY29ucy5DbGlja0RhcmssXG4gIGF0bGFzSGVpZ2h0OiBzb3VyY2VzQ29tcG9uZW50c0Nvb3JkaW5hdGVzLmF0bGFzSGVpZ2h0LFxuICBhdGxhc1dpZHRoOiBzb3VyY2VzQ29tcG9uZW50c0Nvb3JkaW5hdGVzLmF0bGFzV2lkdGhcbn1cblxuZXhwb3J0IGxldCBwcmltYXJ5QnV0dG9uU2VjdGlvbiA9IHtcbiAgLi4uc291cmNlc0NvbXBvbmVudHNDb29yZGluYXRlcy5idXR0b25zLkUsXG4gIGF0bGFzSGVpZ2h0OiBzb3VyY2VzQ29tcG9uZW50c0Nvb3JkaW5hdGVzLmF0bGFzSGVpZ2h0LFxuICBhdGxhc1dpZHRoOiBzb3VyY2VzQ29tcG9uZW50c0Nvb3JkaW5hdGVzLmF0bGFzV2lkdGhcbn1cblxuZXhwb3J0IGxldCBzZWNvbmRhcnlCdXR0b25TZWN0aW9uID0ge1xuICAuLi5zb3VyY2VzQ29tcG9uZW50c0Nvb3JkaW5hdGVzLmJ1dHRvbnMuRixcbiAgYXRsYXNIZWlnaHQ6IHNvdXJjZXNDb21wb25lbnRzQ29vcmRpbmF0ZXMuYXRsYXNIZWlnaHQsXG4gIGF0bGFzV2lkdGg6IHNvdXJjZXNDb21wb25lbnRzQ29vcmRpbmF0ZXMuYXRsYXNXaWR0aFxufVxuXG5leHBvcnQgbGV0IGRhcmtCdXR0b25TZWN0aW9uID0ge1xuICAuLi5zb3VyY2VzQ29tcG9uZW50c0Nvb3JkaW5hdGVzLmJ1dHRvbnMuYnV0dG9uRixcbiAgYXRsYXNIZWlnaHQ6IHNvdXJjZXNDb21wb25lbnRzQ29vcmRpbmF0ZXMuYXRsYXNIZWlnaHQsXG4gIGF0bGFzV2lkdGg6IHNvdXJjZXNDb21wb25lbnRzQ29vcmRpbmF0ZXMuYXRsYXNXaWR0aFxufVxuXG5leHBvcnQgbGV0IGRhcmtCdXR0b25Db3JuZXIgPSB7XG4gIC4uLnNvdXJjZXNDb21wb25lbnRzQ29vcmRpbmF0ZXMuYnV0dG9ucy5idXR0b25GQ29ybmVyLFxuICBhdGxhc0hlaWdodDogc291cmNlc0NvbXBvbmVudHNDb29yZGluYXRlcy5hdGxhc0hlaWdodCxcbiAgYXRsYXNXaWR0aDogc291cmNlc0NvbXBvbmVudHNDb29yZGluYXRlcy5hdGxhc1dpZHRoXG59XG5cbmV4cG9ydCBsZXQgZGFya0J1dHRvbkVkZ2UgPSB7XG4gIC4uLnNvdXJjZXNDb21wb25lbnRzQ29vcmRpbmF0ZXMuYnV0dG9ucy5idXR0b25GRWRnZSxcbiAgYXRsYXNIZWlnaHQ6IHNvdXJjZXNDb21wb25lbnRzQ29vcmRpbmF0ZXMuYXRsYXNIZWlnaHQsXG4gIGF0bGFzV2lkdGg6IHNvdXJjZXNDb21wb25lbnRzQ29vcmRpbmF0ZXMuYXRsYXNXaWR0aFxufVxuXG5leHBvcnQgbGV0IHJlZEJ1dHRvblNlY3Rpb24gPSB7XG4gIC4uLnNvdXJjZXNDb21wb25lbnRzQ29vcmRpbmF0ZXMuYnV0dG9ucy5idXR0b25FLFxuICBhdGxhc0hlaWdodDogc291cmNlc0NvbXBvbmVudHNDb29yZGluYXRlcy5hdGxhc0hlaWdodCxcbiAgYXRsYXNXaWR0aDogc291cmNlc0NvbXBvbmVudHNDb29yZGluYXRlcy5hdGxhc1dpZHRoXG59XG5cbmV4cG9ydCBsZXQgcmVkQnV0dG9uQ29ybmVyID0ge1xuICAuLi5zb3VyY2VzQ29tcG9uZW50c0Nvb3JkaW5hdGVzLmJ1dHRvbnMuYnV0dG9uRUNvcm5lcixcbiAgYXRsYXNIZWlnaHQ6IHNvdXJjZXNDb21wb25lbnRzQ29vcmRpbmF0ZXMuYXRsYXNIZWlnaHQsXG4gIGF0bGFzV2lkdGg6IHNvdXJjZXNDb21wb25lbnRzQ29vcmRpbmF0ZXMuYXRsYXNXaWR0aFxufVxuXG5leHBvcnQgbGV0IHJlZEJ1dHRvbkVkZ2UgPSB7XG4gIC4uLnNvdXJjZXNDb21wb25lbnRzQ29vcmRpbmF0ZXMuYnV0dG9ucy5idXR0b25FRWRnZSxcbiAgYXRsYXNIZWlnaHQ6IHNvdXJjZXNDb21wb25lbnRzQ29vcmRpbmF0ZXMuYXRsYXNIZWlnaHQsXG4gIGF0bGFzV2lkdGg6IHNvdXJjZXNDb21wb25lbnRzQ29vcmRpbmF0ZXMuYXRsYXNXaWR0aFxufVxuXG5leHBvcnQgbGV0IG1vZGFsU2NhbGUgPSAxXG5leHBvcnQgbGV0IG1vZGVsRm9udFNpemVTY2FsZSA9IDFcbmxldCBtb2RhbFRleHRXcmFwU2NhbGUgPSAxXG5cbmV4cG9ydCBmdW5jdGlvbiBzZXR1cE5QQ1VpU2NhbGluZyhpbk1vZGFsU2NhbGU6IG51bWJlciwgaW5Gb250U2l6ZTogbnVtYmVyLCBpbk1vZGFsVGV4dFdyYXBTY2FsZTogbnVtYmVyKSB7XG4gIG1vZGFsU2NhbGUgPSBpbk1vZGFsU2NhbGVcbiAgbW9kZWxGb250U2l6ZVNjYWxlID0gaW5Gb250U2l6ZVxuICBtb2RhbFRleHRXcmFwU2NhbGUgPSBpbk1vZGFsVGV4dFdyYXBTY2FsZVxuICBjb25zb2xlLmxvZyhcbiAgICAnTlBDLVRPT0xLSVQnLFxuICAgICdTY2FsZSBVSTonLFxuICAgIG1vZGFsU2NhbGUsXG4gICAgJ1RleHRGb250U2l6ZTonLFxuICAgIG1vZGVsRm9udFNpemVTY2FsZSxcbiAgICAnVGV4dFdyYXBTY2FsaW5nOicsXG4gICAgbW9kYWxUZXh0V3JhcFNjYWxlXG4gIClcbn1cblxuZnVuY3Rpb24gZ2V0U2NhbGVkU2l6ZShzaXplOiBudW1iZXIpOiBudW1iZXIge1xuICByZXR1cm4gc2l6ZSAqIG1vZGFsU2NhbGVcbn1cbmZ1bmN0aW9uIGdldFNjYWxlZEZvbnRTaXplKHNpemU6IG51bWJlcik6IG51bWJlciB7XG4gIHJldHVybiBzaXplICogbW9kZWxGb250U2l6ZVNjYWxlXG59XG5mdW5jdGlvbiBnZXRTY2FsZWRUZXh0V3JhcChzaXplOiBudW1iZXIpOiBudW1iZXIge1xuICByZXR1cm4gc2l6ZSAqIG1vZGFsVGV4dFdyYXBTY2FsZVxufVxuZnVuY3Rpb24gZ2V0U2NhbGVkQnV0dG9uV2lkdGgoYnV0dG9uOiBudW1iZXIpIHtcbiAgcmV0dXJuIHR5cGVvZiAoZ2V0YnV0dG9uU2l6ZShidXR0b24pKSA9PT0gJ251bWJlcicgPyBnZXRTY2FsZWRTaXplKGdldGJ1dHRvblNpemUoYnV0dG9uKSBhcyBudW1iZXIpIDogJ2F1dG8nXG59XG5cbmV4cG9ydCBjb25zdCBOcGNVdGlsc1VpID0gKCkgPT4ge1xuICBjb25zdCB3aWR0aCA9IGdldFNjYWxlZFNpemUocmVhbFdpZHRoKDcwMCkpXG4gIGNvbnN0IGhlaWdodCA9IGdldFNjYWxlZFNpemUocmVhbEhlaWdodCgyODQpKVxuXG4gIHJldHVybiAoXG4gICAgPFVpRW50aXR5XG4gICAgICB1aVRyYW5zZm9ybT17e1xuICAgICAgICBkaXNwbGF5OiBkaXNwbGF5RGlhbG9nKCkgPyAnZmxleCcgOiAnbm9uZScsXG4gICAgICAgIGZsZXhEaXJlY3Rpb246ICdjb2x1bW4nLFxuICAgICAgICBhbGlnbkl0ZW1zOiAnY2VudGVyJyxcbiAgICAgICAganVzdGlmeUNvbnRlbnQ6ICdjZW50ZXInLFxuICAgICAgICBwb3NpdGlvblR5cGU6ICdhYnNvbHV0ZScsXG4gICAgICAgIHBvc2l0aW9uOiB7IGJvdHRvbTogJzEwJScsIGxlZnQ6ICc1MCUnIH0sXG4gICAgICAgIG1hcmdpbjogeyB0b3A6IC1oZWlnaHQgLyAyLCBsZWZ0OiAtd2lkdGggLyAyIH0sXG4gICAgICAgIHBhZGRpbmc6IHsgdG9wOiA0MCwgYm90dG9tOiA0MCB9LFxuICAgICAgICB3aWR0aCxcbiAgICAgICAgaGVpZ2h0OiB0eXBlb2YgKGdldFdpbmRvd0hlaWdodCgpKSA9PT0gJ251bWJlcicgPyBnZXRXaW5kb3dIZWlnaHQoKSBhcyBudW1iZXIgOiAnYXV0bydcbiAgICAgIH19XG4gICAgPlxuICAgICAgPFVpRW50aXR5XG4gICAgICAgIHVpVHJhbnNmb3JtPXt7XG4gICAgICAgICAgcG9zaXRpb25UeXBlOiAnYWJzb2x1dGUnLFxuICAgICAgICAgIHBvc2l0aW9uOiB7IHRvcDogMCwgbGVmdDogMCB9LFxuICAgICAgICAgIHdpZHRoOiAnMTAwJScsXG4gICAgICAgICAgaGVpZ2h0OiAnMTAwJSdcbiAgICAgICAgfX1cbiAgICAgICAgdWlCYWNrZ3JvdW5kPXt7XG4gICAgICAgICAgdGV4dHVyZU1vZGU6ICdzdHJldGNoJyxcbiAgICAgICAgICB0ZXh0dXJlOiB7XG4gICAgICAgICAgICBzcmM6IGdldFRoZW1lKClcbiAgICAgICAgICB9LFxuICAgICAgICAgIHV2czogZ2V0SW1hZ2VBdGxhc01hcHBpbmcoc2VjdGlvbilcbiAgICAgICAgfX1cbiAgICAgICAgb25Nb3VzZURvd249eygpID0+IHtcbiAgICAgICAgICBoYW5kbGVEaWFsb2dDbGljaygpXG4gICAgICAgIH19XG4gICAgICAvPlxuXG4gICAgICA8VWlFbnRpdHlcbiAgICAgICAgdWlUcmFuc2Zvcm09e3tcbiAgICAgICAgICBkaXNwbGF5OiBkaXNwbGF5UG9ydHJhaXQoKSA/ICdmbGV4JyA6ICdub25lJyxcbiAgICAgICAgICB3aWR0aDogZ2V0U2NhbGVkU2l6ZShwb3J0cmFpdFdpZHRoKCkpLFxuICAgICAgICAgIGhlaWdodDogZ2V0U2NhbGVkU2l6ZShwb3J0cmFpdEhlaWdodCgpKSxcbiAgICAgICAgICBwb3NpdGlvblR5cGU6ICdhYnNvbHV0ZScsXG4gICAgICAgICAgcG9zaXRpb246IHtcbiAgICAgICAgICAgIGJvdHRvbTogZ2V0U2NhbGVkU2l6ZShwb3NpdGlvblBvcnRhaXRZKCkpLFxuICAgICAgICAgICAgbGVmdDogZ2V0U2NhbGVkU2l6ZShwb3NpdGlvblBvcnRhaXRYKCkpXG4gICAgICAgICAgfVxuICAgICAgICB9fVxuICAgICAgICB1aUJhY2tncm91bmQ9e3tcbiAgICAgICAgICB0ZXh0dXJlTW9kZTogJ3N0cmV0Y2gnLFxuICAgICAgICAgIHRleHR1cmU6IHtcbiAgICAgICAgICAgIHNyYzogZ2V0UG9ydHJhaXQoKVxuICAgICAgICAgIH1cbiAgICAgICAgICAvLyB1dnM6IGdldEltYWdlQXRsYXNNYXBwaW5nKHNraXBCdXR0b25TZWN0aW9uKSxcbiAgICAgICAgfX1cbiAgICAgIC8+XG5cbiAgICAgIDxVaUVudGl0eVxuICAgICAgICB1aVRyYW5zZm9ybT17e1xuICAgICAgICAgIGRpc3BsYXk6IGRpc3BsYXlJbWFnZSgpID8gJ2ZsZXgnIDogJ25vbmUnLFxuICAgICAgICAgIHdpZHRoOiBnZXRTY2FsZWRTaXplKGltYWdlV2lkdGgoKSksXG4gICAgICAgICAgaGVpZ2h0OiBnZXRTY2FsZWRTaXplKGltYWdlSGVpZ2h0KCkpLFxuICAgICAgICAgIHBvc2l0aW9uVHlwZTogJ2Fic29sdXRlJyxcbiAgICAgICAgICBwb3NpdGlvbjogeyBib3R0b206IHBvc2l0aW9uSW1hZ2VZKCksIHJpZ2h0OiBwb3NpdGlvbkltYWdlWCgpIH1cbiAgICAgICAgfX1cbiAgICAgICAgdWlCYWNrZ3JvdW5kPXt7XG4gICAgICAgICAgdGV4dHVyZU1vZGU6ICdzdHJldGNoJyxcbiAgICAgICAgICB0ZXh0dXJlOiB7XG4gICAgICAgICAgICBzcmM6IGdldEltYWdlKClcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gdXZzOiBnZXRJbWFnZUF0bGFzTWFwcGluZyhza2lwQnV0dG9uU2VjdGlvbiksXG4gICAgICAgIH19XG4gICAgICAvPlxuXG4gICAgICA8VWlFbnRpdHlcbiAgICAgICAgdWlUcmFuc2Zvcm09e3tcbiAgICAgICAgICBkaXNwbGF5OiBkaXNwbGF5U2tpcGFibGUoKSA/ICdmbGV4JyA6ICdub25lJyxcbiAgICAgICAgICB3aWR0aDogZ2V0U2NhbGVkU2l6ZSgxNSksXG4gICAgICAgICAgaGVpZ2h0OiBnZXRTY2FsZWRTaXplKDE1KSxcbiAgICAgICAgICBwb3NpdGlvblR5cGU6ICdhYnNvbHV0ZScsXG4gICAgICAgICAgcG9zaXRpb246IHsgYm90dG9tOiAnNyUnLCBsZWZ0OiAnMjUlJyB9XG4gICAgICAgIH19XG4gICAgICAgIHVpQmFja2dyb3VuZD17e1xuICAgICAgICAgIHRleHR1cmVNb2RlOiAnc3RyZXRjaCcsXG4gICAgICAgICAgdGV4dHVyZToge1xuICAgICAgICAgICAgc3JjOiBnZXRUaGVtZSgpXG4gICAgICAgICAgfSxcbiAgICAgICAgICB1dnM6IGdldEltYWdlQXRsYXNNYXBwaW5nKGdldFNraXBhYmxlVGhlbWUoKSlcbiAgICAgICAgfX1cbiAgICAgICAgb25Nb3VzZURvd249eygpID0+IHtcbiAgICAgICAgICBza2lwRGlhbG9ncyhhY3RpdmVOUEMpXG4gICAgICAgIH19XG4gICAgICA+XG4gICAgICAgIDxVaUVudGl0eVxuICAgICAgICAgIHVpVHJhbnNmb3JtPXt7XG4gICAgICAgICAgICBkaXNwbGF5OiAnZmxleCcsXG4gICAgICAgICAgICBwb3NpdGlvblR5cGU6ICdhYnNvbHV0ZScsXG4gICAgICAgICAgICBwb3NpdGlvbjogeyBsZWZ0OiAnMjE1JScgfVxuICAgICAgICAgIH19XG4gICAgICAgICAgdWlUZXh0PXt7XG4gICAgICAgICAgICB2YWx1ZTogJ1NraXAnLFxuICAgICAgICAgICAgY29sb3I6IGdldFRleHRDb2xvcigpLFxuICAgICAgICAgICAgZm9udFNpemU6IGdldFNjYWxlZEZvbnRTaXplKDEyKVxuICAgICAgICAgIH19XG4gICAgICAgIC8+XG4gICAgICA8L1VpRW50aXR5PlxuXG4gICAgICA8VWlFbnRpdHlcbiAgICAgICAgdWlUcmFuc2Zvcm09e3tcbiAgICAgICAgICBkaXNwbGF5OiAnZmxleCcsXG4gICAgICAgICAgd2lkdGg6IGdldFNjYWxlZFNpemUoMjQpLFxuICAgICAgICAgIGhlaWdodDogZ2V0U2NhbGVkU2l6ZSgzNiksXG4gICAgICAgICAgcG9zaXRpb25UeXBlOiAnYWJzb2x1dGUnLFxuICAgICAgICAgIHBvc2l0aW9uOiB7IGJvdHRvbTogJzUlJywgcmlnaHQ6ICcyJScgfVxuICAgICAgICB9fVxuICAgICAgICB1aUJhY2tncm91bmQ9e3tcbiAgICAgICAgICB0ZXh0dXJlTW9kZTogJ3N0cmV0Y2gnLFxuICAgICAgICAgIHRleHR1cmU6IHtcbiAgICAgICAgICAgIHNyYzogZ2V0VGhlbWUoKVxuICAgICAgICAgIH0sXG4gICAgICAgICAgdXZzOiBnZXRJbWFnZUF0bGFzTWFwcGluZyhnZXRMZWZ0Q2xpY2tUaGVtZSgpKVxuICAgICAgICB9fVxuICAgICAgLz5cblxuICAgICAgPFVpRW50aXR5XG4gICAgICAgIHVpVHJhbnNmb3JtPXt7XG4gICAgICAgICAgaGVpZ2h0OiAnYXV0bycsXG4gICAgICAgICAgd2lkdGg6ICdhdXRvJyxcbiAgICAgICAgICBhbGlnblNlbGY6ICdmbGV4LXN0YXJ0JyxcbiAgICAgICAgICBhbGlnbkl0ZW1zOiAnZmxleC1zdGFydCcsXG4gICAgICAgICAganVzdGlmeUNvbnRlbnQ6ICdmbGV4LXN0YXJ0JyxcbiAgICAgICAgICBmbGV4RGlyZWN0aW9uOiAncm93JyxcbiAgICAgICAgICBwb3NpdGlvbjogZ2V0VGV4dFBvc2l0aW9uKCksXG4gICAgICAgICAgZGlzcGxheTogJ2ZsZXgnLFxuICAgICAgICAgIGZsZXhHcm93OiAxLFxuICAgICAgICAgIG1pbkhlaWdodDogMTAwXG4gICAgICAgIH19XG4gICAgICAgIHVpVGV4dD17e1xuICAgICAgICAgIHZhbHVlOiBnZXRUZXh0KCksXG4gICAgICAgICAgY29sb3I6IGdldFRleHRDb2xvcigpLFxuICAgICAgICAgIGZvbnRTaXplOiBnZXRTY2FsZWRGb250U2l6ZShnZXRGb250U2l6ZSgpKSxcbiAgICAgICAgICB0ZXh0QWxpZ246ICdtaWRkbGUtbGVmdCdcbiAgICAgICAgfX1cbiAgICAgIC8+XG5cbiAgICAgIDxVaUVudGl0eVxuICAgICAgICB1aVRyYW5zZm9ybT17e1xuICAgICAgICAgIHdpZHRoOiBnZXRTY2FsZWRCdXR0b25XaWR0aCg0NTApLFxuICAgICAgICAgIGFsaWduSXRlbXM6ICdjZW50ZXInLFxuICAgICAgICAgIGZsZXhEaXJlY3Rpb246ICdyb3cnLFxuICAgICAgICAgIGp1c3RpZnlDb250ZW50OiAnY2VudGVyJyxcbiAgICAgICAgICBkaXNwbGF5OiBkaXNwbGF5Rmlyc3RCdXR0b25Db250YWluZXIoKSA/ICdmbGV4JyA6ICdub25lJyxcbiAgICAgICAgfX1cbiAgICAgID5cbiAgICAgICAgey8qIEJ1dHRvbjEgKFRvcC1MZWZ0KSAqL31cbiAgICAgICAgPFVpRW50aXR5XG4gICAgICAgICAgb25Nb3VzZURvd249eygpID0+IHtcbiAgICAgICAgICAgIGJ1dHRvbkNsaWNrKDApXG4gICAgICAgICAgfX1cbiAgICAgICAgPlxuICAgICAgICAgIDxVa