dcl-ui-toolkit
Version:
A collection of UI helpers to make it easier to build a Decentraland scene using the SDK 7.
226 lines • 33.5 kB
JavaScript
import ReactEcs, { UiEntity } from '@dcl/sdk/react-ecs';
import { UIObject } from '../../UIObject';
import { PromptCloseIcon, PromptCloseIconStyles, } from './components/CloseIcon';
import { PromptText } from './components/Text';
import { PromptIcon } from './components/Icon';
import { PromptButton } from './components/Button';
import { PromptCheckbox } from './components/Checkbox';
import { PromptSwitch } from './components/Switch';
import { PromptInput } from './components/Input';
import { getImageAtlasMapping } from '../../../utils/imageUtils';
import { AtlasTheme, sourcesComponentsCoordinates } from '../../../constants/resources';
export var PromptStyles;
(function (PromptStyles) {
PromptStyles["LIGHT"] = "light";
PromptStyles["DARK"] = "dark";
PromptStyles["LIGHTLARGE"] = "lightlarge";
PromptStyles["DARKLARGE"] = "darklarge";
PromptStyles["LIGHTSLANTED"] = "lightslanted";
PromptStyles["DARKSLANTED"] = "darkslanted";
})(PromptStyles || (PromptStyles = {}));
const promptInitialConfig = {
startHidden: true,
style: PromptStyles.LIGHT,
width: 400,
height: 250,
onClose: () => { },
};
export class Prompt extends UIObject {
constructor({ startHidden = promptInitialConfig.startHidden, style = promptInitialConfig.style, width, height, onClose = promptInitialConfig.onClose, }) {
super({ startHidden });
this._close = () => {
this.onClose();
this.hide();
};
this.style = style;
this.width = width;
this.height = height;
this.onClose = onClose;
this._texture = AtlasTheme.ATLAS_PATH_LIGHT;
this._section = {
...sourcesComponentsCoordinates.backgrounds.promptBackground,
atlasHeight: sourcesComponentsCoordinates.atlasHeight,
atlasWidth: sourcesComponentsCoordinates.atlasWidth,
};
this._closeIconData = {
width: 32,
height: 32,
style: PromptCloseIconStyles.CLOSED,
onMouseDown: this._close,
parent: this,
};
this._setStyle();
this.isDarkTheme = this._texture !== AtlasTheme.ATLAS_PATH_LIGHT;
this.closeIcon = new PromptCloseIcon(this._closeIconData);
this._components = [];
this._btn = [];
this._closeIconBtn = [this.closeIcon];
}
addTextBox(config) {
const uiInput = new PromptInput({
...config,
...this._getPromptComponentCustomConfig(),
});
this._components.push(uiInput);
return uiInput;
}
addSwitch(config) {
const uiSwitch = new PromptSwitch({
...config,
...this._getPromptComponentCustomConfig(),
});
this._components.push(uiSwitch);
return uiSwitch;
}
addCheckbox(config) {
const uiCheckbox = new PromptCheckbox({
...config,
...this._getPromptComponentCustomConfig(),
});
this._components.push(uiCheckbox);
return uiCheckbox;
}
addButton(config) {
const uiButton = new PromptButton({
...config,
...this._getPromptComponentCustomConfig(),
});
this._btn.push(uiButton);
return uiButton;
}
addText(config) {
const uiText = new PromptText({
...config,
...this._getPromptComponentCustomConfig(),
});
this._components.push(uiText);
return uiText;
}
addIcon(config) {
const uiIcon = new PromptIcon({
...config,
...this._getPromptComponentCustomConfig(),
});
this._components.push(uiIcon);
return uiIcon;
}
render(key) {
const width = this.realWidth();
const height = this.realHeight();
return (ReactEcs.createElement(UiEntity, { uiTransform: {
width: '100%',
height: '100%',
alignItems: 'center',
justifyContent: 'center',
positionType: 'absolute'
} },
ReactEcs.createElement(UiEntity, { key: key, uiTransform: {
display: this.visible ? 'flex' : 'none',
flexDirection: 'column',
positionType: 'absolute',
justifyContent: 'center',
width: this.width != 'auto' ? this.width : 'auto',
height: this.height != 'auto' ? this.height : 'auto',
} },
ReactEcs.createElement(UiEntity, { uiTransform: {
positionType: 'absolute',
position: { top: 0, left: 0 },
width: '100%',
height: '100%',
}, uiBackground: {
textureMode: 'stretch',
texture: {
src: this._texture,
},
uvs: getImageAtlasMapping(this._section),
} }),
this.visible &&
this._closeIconBtn.map((component, idx) => component.render(`prompt-component-${idx}`)),
ReactEcs.createElement(UiEntity, { uiTransform: {
flexDirection: 'column',
alignSelf: 'center',
justifyContent: 'flex-end',
width: this.width != 'auto' ? width : 'auto',
height: this.height != 'auto' ? height : 'auto',
margin: { top: 20 }
} },
this.visible &&
this._components.map((component, idx) => component.render(`prompt-component-${idx}`)),
ReactEcs.createElement(UiEntity, { uiTransform: {
justifyContent: 'center',
margin: { left: 20, right: 10 }
} }, this.visible &&
this._btn.map((component, idx) => component.render(`prompt-component-${idx}`)))))));
}
_getPromptComponentCustomConfig() {
return {
parent: this,
};
}
realWidth() {
return this.posWidth ? this.posWidth : this._section.sourceWidth;
}
realHeight() {
return this.posHeight ? this.posHeight : this._section.sourceHeight;
}
_setStyle() {
switch (this.style) {
case PromptStyles.LIGHT:
this._section = {
...sourcesComponentsCoordinates.backgrounds.promptBackground,
atlasHeight: sourcesComponentsCoordinates.atlasHeight,
atlasWidth: sourcesComponentsCoordinates.atlasWidth,
};
this._texture = AtlasTheme.ATLAS_PATH_LIGHT;
break;
case PromptStyles.DARK:
this._section = {
...sourcesComponentsCoordinates.backgrounds.promptBackground,
atlasHeight: sourcesComponentsCoordinates.atlasHeight,
atlasWidth: sourcesComponentsCoordinates.atlasWidth,
};
this._texture = AtlasTheme.ATLAS_PATH_DARK;
this._closeIconData.style = PromptCloseIconStyles.CLOSEW;
break;
case PromptStyles.LIGHTLARGE:
this._section = {
...sourcesComponentsCoordinates.backgrounds.promptLargeBackground,
atlasHeight: sourcesComponentsCoordinates.atlasHeight,
atlasWidth: sourcesComponentsCoordinates.atlasWidth,
};
this._texture = AtlasTheme.ATLAS_PATH_LIGHT;
this._closeIconData.style = PromptCloseIconStyles.CLOSED;
break;
case PromptStyles.DARKLARGE:
this._section = {
...sourcesComponentsCoordinates.backgrounds.promptLargeBackground,
atlasHeight: sourcesComponentsCoordinates.atlasHeight,
atlasWidth: sourcesComponentsCoordinates.atlasWidth,
};
this._texture = AtlasTheme.ATLAS_PATH_DARK;
this._closeIconData.style = PromptCloseIconStyles.CLOSEW;
break;
case PromptStyles.LIGHTSLANTED:
this._section = {
...sourcesComponentsCoordinates.backgrounds.promptSlantedBackground,
atlasHeight: sourcesComponentsCoordinates.atlasHeight,
atlasWidth: sourcesComponentsCoordinates.atlasWidth,
};
this._texture = AtlasTheme.ATLAS_PATH_LIGHT;
this._closeIconData.style = PromptCloseIconStyles.CLOSED;
this._closeIconData.xPosition = 15;
break;
case PromptStyles.DARKSLANTED:
this._section = {
...sourcesComponentsCoordinates.backgrounds.promptSlantedBackground,
atlasHeight: sourcesComponentsCoordinates.atlasHeight,
atlasWidth: sourcesComponentsCoordinates.atlasWidth,
};
this._texture = AtlasTheme.ATLAS_PATH_DARK;
this._closeIconData.style = PromptCloseIconStyles.CLOSEW;
this._closeIconData.xPosition = 15;
break;
}
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvdWktZW50aXRpZXMvcHJvbXB0cy9Qcm9tcHQvaW5kZXgudHN4Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sUUFBUSxFQUFFLEVBQUUsUUFBUSxFQUFFLE1BQU0sb0JBQW9CLENBQUE7QUFHdkQsT0FBTyxFQUFFLFFBQVEsRUFBa0IsTUFBTSxnQkFBZ0IsQ0FBQTtBQUV6RCxPQUFPLEVBQ0wsZUFBZSxFQUVmLHFCQUFxQixHQUN0QixNQUFNLHdCQUF3QixDQUFBO0FBQy9CLE9BQU8sRUFBRSxVQUFVLEVBQW9CLE1BQU0sbUJBQW1CLENBQUE7QUFDaEUsT0FBTyxFQUFFLFVBQVUsRUFBb0IsTUFBTSxtQkFBbUIsQ0FBQTtBQUNoRSxPQUFPLEVBQUUsWUFBWSxFQUFzQixNQUFNLHFCQUFxQixDQUFBO0FBQ3RFLE9BQU8sRUFBRSxjQUFjLEVBQXdCLE1BQU0sdUJBQXVCLENBQUE7QUFDNUUsT0FBTyxFQUFFLFlBQVksRUFBc0IsTUFBTSxxQkFBcUIsQ0FBQTtBQUN0RSxPQUFPLEVBQUUsV0FBVyxFQUFxQixNQUFNLG9CQUFvQixDQUFBO0FBRW5FLE9BQU8sRUFBRSxvQkFBb0IsRUFBa0IsTUFBTSwyQkFBMkIsQ0FBQTtBQUVoRixPQUFPLEVBQUUsVUFBVSxFQUFFLDRCQUE0QixFQUFFLE1BQU0sOEJBQThCLENBQUE7QUFHdkYsTUFBTSxDQUFOLElBQVksWUFPWDtBQVBELFdBQVksWUFBWTtJQUN0QiwrQkFBZSxDQUFBO0lBQ2YsNkJBQWEsQ0FBQTtJQUNiLHlDQUF5QixDQUFBO0lBQ3pCLHVDQUF1QixDQUFBO0lBQ3ZCLDZDQUE2QixDQUFBO0lBQzdCLDJDQUEyQixDQUFBO0FBQzdCLENBQUMsRUFQVyxZQUFZLEtBQVosWUFBWSxRQU92QjtBQVlELE1BQU0sbUJBQW1CLEdBQTJCO0lBQ2xELFdBQVcsRUFBRSxJQUFJO0lBQ2pCLEtBQUssRUFBRSxZQUFZ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S0FBSyxHQUFHLHFCQUFxQixDQUFDLE1BQU0sQ0FBQTtnQkFDeEQsSUFBSSxDQUFDLGNBQWMsQ0FBQyxTQUFTLEdBQUcsRUFBRSxDQUFBO2dCQUVsQyxNQUFLO1NBQ1I7SUFDSCxDQUFDO0NBT0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgUmVhY3RFY3MsIHsgVWlFbnRpdHkgfSBmcm9tICdAZGNsL3Nkay9yZWFjdC1lY3MnXG5pbXBvcnQgeyBDYWxsYmFjayB9IGZyb20gJ0BkY2wvcmVhY3QtZWNzL2Rpc3QvY29tcG9uZW50cy9saXN0ZW5lcnMvdHlwZXMnXG5cbmltcG9ydCB7IFVJT2JqZWN0LCBVSU9iamVjdENvbmZpZyB9IGZyb20gJy4uLy4uL1VJT2JqZWN0J1xuXG5pbXBvcnQge1xuICBQcm9tcHRDbG9zZUljb24sXG4gIFByb21wdENsb3NlSWNvbkNvbmZpZyxcbiAgUHJvbXB0Q2xvc2VJY29uU3R5bGVzLFxufSBmcm9tICcuL2NvbXBvbmVudHMvQ2xvc2VJY29uJ1xuaW1wb3J0IHsgUHJvbXB0VGV4dCwgUHJvbXB0VGV4dENvbmZpZyB9IGZyb20gJy4vY29tcG9uZW50cy9UZXh0J1xuaW1wb3J0IHsgUHJvbXB0SWNvbiwgUHJvbXB0SWNvbkNvbmZpZyB9IGZyb20gJy4vY29tcG9uZW50cy9JY29uJ1xuaW1wb3J0IHsgUHJvbXB0QnV0dG9uLCBQcm9tcHRCdXR0b25Db25maWcgfSBmcm9tICcuL2NvbXBvbmVudHMvQnV0dG9uJ1xuaW1wb3J0IHsgUHJvbXB0Q2hlY2tib3gsIFByb21wdENoZWNrYm94Q29uZmlnIH0gZnJvbSAnLi9jb21wb25lbnRzL0NoZWNrYm94J1xuaW1wb3J0IHsgUHJvbXB0U3dpdGNoLCBQcm9tcHRTd2l0Y2hDb25maWcgfSBmcm9tICcuL2NvbXBvbmVudHMvU3dpdGNoJ1xuaW1wb3J0IHsgUHJvbXB0SW5wdXQsIFByb21wdElucHV0Q29uZmlnIH0gZnJvbSAnLi9jb21wb25lbnRzL0lucHV0J1xuXG5pbXBvcnQgeyBnZXRJbWFnZUF0bGFzTWFwcGluZywgSW1hZ2VBdGxhc0RhdGEgfSBmcm9tICcuLi8uLi8uLi91dGlscy9pbWFnZVV0aWxzJ1xuXG5pbXBvcnQgeyBBdGxhc1RoZW1lLCBzb3VyY2VzQ29tcG9uZW50c0Nvb3JkaW5hdGVzIH0gZnJvbSAnLi4vLi4vLi4vY29uc3RhbnRzL3Jlc291cmNlcydcbmltcG9ydCB7IElQcm9tcHQgfSBmcm9tICcuL0lQcm9tcHQnXG5cbmV4cG9ydCBlbnVtIFByb21wdFN0eWxlcyB7XG4gIExJR0hUID0gYGxpZ2h0YCxcbiAgREFSSyA9IGBkYXJrYCxcbiAgTElHSFRMQVJHRSA9IGBsaWdodGxhcmdlYCxcbiAgREFSS0xBUkdFID0gYGRhcmtsYXJnZWAsXG4gIExJR0hUU0xBTlRFRCA9IGBsaWdodHNsYW50ZWRgLFxuICBEQVJLU0xBTlRFRCA9IGBkYXJrc2xhbnRlZGAsXG59XG5cbmV4cG9ydCB0eXBlIFByb21wdEV4dGVybmFsQ29uZmlnID0gVUlPYmplY3RDb25maWcgJiB7XG4gIHdpZHRoPzogbnVtYmVyIHwgJ2F1dG8nXG4gIGhlaWdodD86IG51bWJlciB8ICdhdXRvJ1xuICBvbkNsb3NlPzogQ2FsbGJhY2tcbn1cblxuZXhwb3J0IHR5cGUgUHJvbXB0Q29uZmlnID0gUHJvbXB0RXh0ZXJuYWxDb25maWcgJiB7XG4gIHN0eWxlPzogUHJvbXB0U3R5bGVzXG59XG5cbmNvbnN0IHByb21wdEluaXRpYWxDb25maWc6IFJlcXVpcmVkPFByb21wdENvbmZpZz4gPSB7XG4gIHN0YXJ0SGlkZGVuOiB0cnVlLFxuICBzdHlsZTogUHJvbXB0U3R5bGVzLkxJR0hULFxuICB3aWR0aDogNDAwLFxuICBoZWlnaHQ6IDI1MCxcbiAgb25DbG9zZTogKCkgPT4geyB9LFxufSBhcyBjb25zdFxuXG4vKipcbiAqIENyZWF0ZXMgYSBwcm9tcHQgb2JqZWN0IHRoYXQgaW5jbHVkZXMgYSBiYWNrZ3JvdW5kIGFuZCBhIGNsb3NlIGljb24sIGFuZCBzdXBwb3J0cyBhZGRpbmcgYXMgbWFueSBjdXN0b20gVUkgZWxlbWVudHMgYXMgZGVzaXJlZFxuICogQHBhcmFtIHtib29sZWFufSBbc3RhcnRIaWRkZW49dHJ1ZV0gc3RhcnRpbmcgaGlkZGVuXG4gKiBAcGFyYW0ge1Byb21wdFN0eWxlc30gW3N0eWxlPVByb21wdFN0eWxlcy5MSUdIVF06IHBpY2sgZnJvbSBhIGZldyBwcmVkZWZpbmVkIG9wdGlvbnMgb2YgY29sb3IsIHNoYXBlIGFuZCBzaXplLCBvciBwcm92aWRlIHRoZSBzdHJpbmcgcGF0aCB0byBhIGN1c3RvbSBpbWFnZVxuICogQHBhcmFtIHtudW1iZXIgfCBhdXRvfSB3aWR0aCBiYWNrZ3JvdW5kIHdpZHRoXG4gKiBAcGFyYW0ge251bWJlciB8IGF1dG99IGhlaWdodCBiYWNrZ3JvdW5kIGhlaWdodFxuICogQHBhcmFtIHtDYWxsYmFja30gb25DbG9zZSBjYWxsYmFjayBvbiBwcm9tcHQgY2xvc2VcbiAqXG4gKi9cbmV4cG9ydCBjbGFzcyBQcm9tcHQgZXh0ZW5kcyBVSU9iamVjdCBpbXBsZW1lbnRzIElQcm9tcHQge1xuICBwdWJsaWMgY2xvc2VJY29uOiBQcm9tcHRDbG9zZUljb25cblxuICBwdWJsaWMgc3R5bGU6IFByb21wdFN0eWxlc1xuICBwdWJsaWMgd2lkdGg6IG51bWJlciB8ICdhdXRvJyB8IHVuZGVmaW5lZFxuICBwdWJsaWMgaGVpZ2h0OiBudW1iZXIgfCAnYXV0bycgfCB1bmRlZmluZWRcbiAgcHVibGljIHBvc1dpZHRoOiBudW1iZXIgfCB1bmRlZmluZWRcbiAgcHVibGljIHBvc0hlaWdodDogbnVtYmVyIHwgdW5kZWZpbmVkXG4gIHB1YmxpYyBvbkNsb3NlOiBDYWxsYmFja1xuXG4gIHByaXZhdGUgX3RleHR1cmU6IEF0bGFzVGhlbWVcbiAgcHJpdmF0ZSBfc2VjdGlvbjogSW1hZ2VBdGxhc0RhdGFcbiAgcHJpdmF0ZSBfY29tcG9uZW50czogKFxuXG4gICAgfCBQcm9tcHRUZXh0XG4gICAgfCBQcm9tcHRJY29uXG4gICAgfCBQcm9tcHRDaGVja2JveFxuICAgIHwgUHJvbXB0U3dpdGNoXG4gICAgfCBQcm9tcHRJbnB1dFxuICApW11cbiAgcHJpdmF0ZSBfYnRuOiAoXG4gICAgfCBQcm9tcHRCdXR0b25cbiAgKVtdXG4gIHByaXZhdGUgX2Nsb3NlSWNvbkJ0bjogKFxuICAgIHwgUHJvbXB0Q2xvc2VJY29uXG4gIClbXVxuICBwcml2YXRlIHJlYWRvbmx5IF9jbG9zZUljb25EYXRhOiBQcm9tcHRDbG9zZUljb25Db25maWdcbiAgcHVibGljIHJlYWRvbmx5IGlzRGFya1RoZW1lOiBib29sZWFuXG5cbiAgY29uc3RydWN0b3Ioe1xuICAgIHN0YXJ0SGlkZGVuID0gcHJvbXB0SW5pdGlhbENvbmZpZy5zdGFydEhpZGRlbixcbiAgICBzdHlsZSA9IHByb21wdEluaXRpYWxDb25maWcuc3R5bGUsXG4gICAgd2lkdGgsXG4gICAgaGVpZ2h0LFxuICAgIG9uQ2xvc2UgPSBwcm9tcHRJbml0aWFsQ29uZmlnLm9uQ2xvc2UsXG4gIH06IFByb21wdENvbmZpZykge1xuICAgIHN1cGVyKHsgc3RhcnRIaWRkZW4gfSlcblxuICAgIHRoaXMuc3R5bGUgPSBzdHlsZVxuICAgIHRoaXMud2lkdGggPSB3aWR0aFxuICAgIHRoaXMuaGVpZ2h0ID0gaGVpZ2h0XG4gICAgdGhpcy5vbkNsb3NlID0gb25DbG9zZVxuXG4gICAgdGhpcy5fdGV4dHVyZSA9IEF0bGFzVGhlbWUuQVRMQVNfUEFUSF9MSUdIVFxuXG4gICAgdGhpcy5fc2VjdGlvbiA9IHtcbiAgICAgIC4uLnNvdXJjZXNDb21wb25lbnRzQ29vcmRpbmF0ZXMuYmFja2dyb3VuZHMucHJvbXB0QmFja2dyb3VuZCxcbiAgICAgIGF0bGFzSGVpZ2h0OiBzb3VyY2VzQ29tcG9uZW50c0Nvb3JkaW5hdGVzLmF0bGFzSGVpZ2h0LFxuICAgICAgYXRsYXNXaWR0aDogc291cmNlc0NvbXBvbmVudHNDb29yZGluYXRlcy5hdGxhc1dpZHRoLFxuICAgIH1cblxuICAgIHRoaXMuX2Nsb3NlSWNvbkRhdGEgPSB7XG4gICAgICB3aWR0aDogMzIsXG4gICAgICBoZWlnaHQ6IDMyLFxuICAgICAgc3R5bGU6IFByb21wdENsb3NlSWNvblN0eWxlcy5DTE9TRUQsXG4gICAgICBvbk1vdXNlRG93bjogdGhpcy5fY2xvc2UsXG4gICAgICBwYXJlbnQ6IHRoaXMsXG4gICAgfVxuXG4gICAgdGhpcy5fc2V0U3R5bGUoKVxuXG4gICAgdGhpcy5pc0RhcmtUaGVtZSA9IHRoaXMuX3RleHR1cmUgIT09IEF0bGFzVGhlbWUuQVRMQVNfUEFUSF9MSUdIVFxuXG4gICAgdGhpcy5jbG9zZUljb24gPSBuZXcgUHJvbXB0Q2xvc2VJY29uKHRoaXMuX2Nsb3NlSWNvbkRhdGEpXG5cbiAgICB0aGlzLl9jb21wb25lbnRzID0gW11cblxuICAgIHRoaXMuX2J0biA9IFtdXG5cbiAgICB0aGlzLl9jbG9zZUljb25CdG4gPSBbdGhpcy5jbG9zZUljb25dXG5cbiAgfVxuXG4gIHB1YmxpYyBhZGRUZXh0Qm94KGNvbmZpZzogT21pdDxQcm9tcHRJbnB1dENvbmZpZywgJ3BhcmVudCc+KTogUHJvbXB0SW5wdXQge1xuICAgIGNvbnN0IHVpSW5wdXQgPSBuZXcgUHJvbXB0SW5wdXQoe1xuICAgICAgLi4uY29uZmlnLFxuICAgICAgLi4udGhpcy5fZ2V0UHJvbXB0Q29tcG9uZW50Q3VzdG9tQ29uZmlnKCksXG4gICAgfSlcblxuICAgIHRoaXMuX2NvbXBvbmVudHMucHVzaCh1aUlucHV0KVxuXG4gICAgcmV0dXJuIHVpSW5wdXRcbiAgfVxuXG4gIHB1YmxpYyBhZGRTd2l0Y2goY29uZmlnOiBPbWl0PFByb21wdFN3aXRjaENvbmZpZywgJ3BhcmVudCc+KTogUHJvbXB0U3dpdGNoIHtcbiAgICBjb25zdCB1aVN3aXRjaCA9IG5ldyBQcm9tcHRTd2l0Y2goe1xuICAgICAgLi4uY29uZmlnLFxuICAgICAgLi4udGhpcy5fZ2V0UHJvbXB0Q29tcG9uZW50Q3VzdG9tQ29uZmlnKCksXG4gICAgfSlcblxuICAgIHRoaXMuX2NvbXBvbmVudHMucHVzaCh1aVN3aXRjaClcblxuICAgIHJldHVybiB1aVN3aXRjaFxuICB9XG5cbiAgcHVibGljIGFkZENoZWNrYm94KGNvbmZpZzogT21pdDxQcm9tcHRDaGVja2JveENvbmZpZywgJ3BhcmVudCc+KTogUHJvbXB0Q2hlY2tib3gge1xuICAgIGNvbnN0IHVpQ2hlY2tib3ggPSBuZXcgUHJvbXB0Q2hlY2tib3goe1xuICAgICAgLi4uY29uZmlnLFxuICAgICAgLi4udGhpcy5fZ2V0UHJvbXB0Q29tcG9uZW50Q3VzdG9tQ29uZmlnKCksXG4gICAgfSlcblxuICAgIHRoaXMuX2NvbXBvbmVudHMucHVzaCh1aUNoZWNrYm94KVxuXG4gICAgcmV0dXJuIHVpQ2hlY2tib3hcbiAgfVxuXG4gIHB1YmxpYyBhZGRCdXR0b24oY29uZmlnOiBPbWl0PFByb21wdEJ1dHRvbkNvbmZpZywgJ3BhcmVudCc+KTogUHJvbXB0QnV0dG9uIHtcbiAgICBjb25zdCB1aUJ1dHRvbiA9IG5ldyBQcm9tcHRCdXR0b24oe1xuICAgICAgLi4uY29uZmlnLFxuICAgICAgLi4udGhpcy5fZ2V0UHJvbXB0Q29tcG9uZW50Q3VzdG9tQ29uZmlnKCksXG4gICAgfSlcblxuICAgIHRoaXMuX2J0bi5wdXNoKHVpQnV0dG9uKVxuXG4gICAgcmV0dXJuIHVpQnV0dG9uXG4gIH1cblxuICBwdWJsaWMgYWRkVGV4dChjb25maWc6IE9taXQ8UHJvbXB0VGV4dENvbmZpZywgJ3BhcmVudCc+KTogUHJvbXB0VGV4dCB7XG4gICAgY29uc3QgdWlUZXh0ID0gbmV3IFByb21wdFRleHQoe1xuICAgICAgLi4uY29uZmlnLFxuICAgICAgLi4udGhpcy5fZ2V0UHJvbXB0Q29tcG9uZW50Q3VzdG9tQ29uZmlnKCksXG4gICAgfSlcblxuICAgIHRoaXMuX2NvbXBvbmVudHMucHVzaCh1aVRleHQpXG5cbiAgICByZXR1cm4gdWlUZXh0XG4gIH1cblxuICBwdWJsaWMgYWRkSWNvbihjb25maWc6IE9taXQ8UHJvbXB0SWNvbkNvbmZpZywgJ3BhcmVudCc+KTogUHJvbXB0SWNvbiB7XG4gICAgY29uc3QgdWlJY29uID0gbmV3IFByb21wdEljb24oe1xuICAgICAgLi4uY29uZmlnLFxuICAgICAgLi4udGhpcy5fZ2V0UHJvbXB0Q29tcG9uZW50Q3VzdG9tQ29uZmlnKCksXG4gICAgfSlcblxuICAgIHRoaXMuX2NvbXBvbmVudHMucHVzaCh1aUljb24pXG5cbiAgICByZXR1cm4gdWlJY29uXG4gIH1cblxuICBwdWJsaWMgcmVuZGVyKGtleT86IHN0cmluZyk6IFJlYWN0RWNzLkpTWC5FbGVtZW50IHtcbiAgICBjb25zdCB3aWR0aCA9IHRoaXMucmVhbFdpZHRoKClcbiAgICBjb25zdCBoZWlnaHQgPSB0aGlzLnJlYWxIZWlnaHQoKVxuXG4gICAgcmV0dXJuIChcbiAgICAgIDxVaUVudGl0eVxuICAgICAgICB1aVRyYW5zZm9ybT17e1xuICAgICAgICAgIHdpZHRoOiAnMTAwJScsXG4gICAgICAgICAgaGVpZ2h0OiAnMTAwJScsXG4gICAgICAgICAgYWxpZ25JdGVtczogJ2NlbnRlcicsXG4gICAgICAgICAganVzdGlmeUNvbnRlbnQ6ICdjZW50ZXInLFxuICAgICAgICAgIHBvc2l0aW9uVHlwZTogJ2Fic29sdXRlJ1xuICAgICAgICB9fVxuICAgICAgPlxuICAgICAgICA8VWlFbnRpdHlcbiAgICAgICAgICBrZXk9e2tleX1cbiAgICAgICAgICB1aVRyYW5zZm9ybT17e1xuICAgICAgICAgICAgZGlzcGxheTogdGhpcy52aXNpYmxlID8gJ2ZsZXgnIDogJ25vbmUnLFxuICAgICAgICAgICAgZmxleERpcmVjdGlvbjogJ2NvbHVtbicsXG4gICAgICAgICAgICBwb3NpdGlvblR5cGU6ICdhYnNvbHV0ZScsXG4gICAgICAgICAgICBqdXN0aWZ5Q29udGVudDogJ2NlbnRlcicsXG4gICAgICAgICAgICB3aWR0aDogdGhpcy53aWR0aCAhPSAnYXV0bycgPyB0aGlzLndpZHRoIDogJ2F1dG8nLFxuICAgICAgICAgICAgaGVpZ2h0OiB0aGlzLmhlaWdodCAhPSAnYXV0bycgPyB0aGlzLmhlaWdodCA6ICdhdXRvJyxcbiAgICAgICAgICB9fVxuICAgICAgICA+XG4gICAgICAgICAgPFVpRW50aXR5XG4gICAgICAgICAgICB1aVRyYW5zZm9ybT17e1xuICAgICAgICAgICAgICBwb3NpdGlvblR5cGU6ICdhYnNvbHV0ZScsXG4gICAgICAgICAgICAgIHBvc2l0aW9uOiB7IHRvcDogMCwgbGVmdDogMCB9LFxuICAgICAgICAgICAgICB3aWR0aDogJzEwMCUnLFxuICAgICAgICAgICAgICBoZWlnaHQ6ICcxMDAlJyxcbiAgICAgICAgICAgIH19XG4gICAgICAgICAgICB1aUJhY2tncm91bmQ9e3tcbiAgICAgICAgICAgICAgdGV4dHVyZU1vZGU6ICdzdHJldGNoJyxcbiAgICAgICAgICAgICAgdGV4dHVyZToge1xuICAgICAgICAgICAgICAgIHNyYzogdGhpcy5fdGV4dHVyZSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgdXZzOiBnZXRJbWFnZUF0bGFzTWFwcGluZyh0aGlzLl9zZWN0aW9uKSxcbiAgICAgICAgICAgIH19XG4gICAgICAgICAgLz5cbiAgICAgICAgICB7dGhpcy52aXNpYmxlICYmXG4gICAgICAgICAgICB0aGlzLl9jbG9zZUljb25CdG4ubWFwKChjb21wb25lbnQsIGlkeCkgPT4gY29tcG9uZW50LnJlbmRlcihgcHJvbXB0LWNvbXBvbmVudC0ke2lkeH1gKSl9XG4gICAgICAgICAgPFVpRW50aXR5XG4gICAgICAgICAgICB1aVRyYW5zZm9ybT17e1xuICAgICAgICAgICAgICBmbGV4RGlyZWN0aW9uOiAnY29sdW1uJyxcbiAgICAgICAgICAgICAgYWxpZ25TZWxmOiAnY2VudGVyJyxcbiAgICAgICAgICAgICAganVzdGlmeUNvbnRlbnQ6ICdmbGV4LWVuZCcsXG4gICAgICAgICAgICAgIHdpZHRoOiB0aGlzLndpZHRoICE9ICdhdXRvJyA/IHdpZHRoIDogJ2F1dG8nLFxuICAgICAgICAgICAgICBoZWlnaHQ6IHRoaXMuaGVpZ2h0ICE9ICdhdXRvJyA/IGhlaWdodCA6ICdhdXRvJyxcbiAgICAgICAgICAgICAgbWFyZ2luOiB7dG9wOiAyMH1cbiAgICAgICAgICAgIH19XG4gICAgICAgICAgPlxuICAgICAgICAgICAge3RoaXMudmlzaWJsZSAmJlxuICAgICAgICAgICAgICB0aGlzLl9jb21wb25lbnRzLm1hcCgoY29tcG9uZW50LCBpZHgpID0+IGNvbXBvbmVudC5yZW5kZXIoYHByb21wdC1jb21wb25lbnQtJHtpZHh9YCkpfVxuICAgICAgICAgICAgPFVpRW50aXR5XG4gICAgICAgICAgICAgIHVpVHJhbnNmb3JtPXt7XG4gICAgICAgICAgICAgICAganVzdGlmeUNvbnRlbnQ6ICdjZW50ZXInLFxuICAgICAgICAgICAgICAgIG1hcmdpbjoge2xlZnQ6IDIwLCByaWdodDogMTB9XG4gICAgICAgICAgICAgIH19PlxuICAgICAgICAgICAgICB7dGhpcy52aXNpYmxlICYmXG4gICAgICAgICAgICAgICAgdGhpcy5fYnRuLm1hcCgoY29tcG9uZW50LCBpZHgpID0+IGNvbXBvbmVudC5yZW5kZXIoYHByb21wdC1jb21wb25lbnQtJHtpZHh9YCkpfVxuICAgICAgICAgICAgPC9VaUVudGl0eT5cbiAgICAgICAgICA8L1VpRW50aXR5PlxuICAgICAgICA8L1VpRW50aXR5PlxuICAgICAgPC9VaUVudGl0eT5cbiAgICApXG4gIH1cblxuICBwcml2YXRlIF9nZXRQcm9tcHRDb21wb25lbnRDdXN0b21Db25maWcoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHBhcmVudDogdGhpcyxcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgcmVhbFdpZHRoKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMucG9zV2lkdGggPyB0aGlzLnBvc1dpZHRoIDogdGhpcy5fc2VjdGlvbi5zb3VyY2VXaWR0aFxuICB9XG5cbiAgcHVibGljIHJlYWxIZWlnaHQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5wb3NIZWlnaHQgPyB0aGlzLnBvc0hlaWdodCA6IHRoaXMuX3NlY3Rpb24uc291cmNlSGVpZ2h0XG4gIH1cblxuICBwcml2YXRlIF9zZXRTdHlsZSgpIHtcbiAgICBzd2l0Y2ggKHRoaXMuc3R5bGUpIHtcbiAgICAgIGNhc2UgUHJvbXB0U3R5bGVzLkxJR0hUOlxuICAgICAgICB0aGlzLl9zZWN0aW9uID0ge1xuICAgICAgICAgIC4uLnNvdXJjZXNDb21wb25lbnRzQ29vcmRpbmF0ZXMuYmFja2dyb3VuZHMucHJvbXB0QmFja2dyb3VuZCxcbiAgICAgICAgICBhdGxhc0hlaWdodDogc291cmNlc0NvbXBvbmVudHNDb29yZGluYXRlcy5hdGxhc0hlaWdodCxcbiAgICAgICAgICBhdGxhc1dpZHRoOiBzb3VyY2VzQ29tcG9uZW50c0Nvb3JkaW5hdGVzLmF0bGFzV2lkdGgsXG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl90ZXh0dXJlID0gQXRsYXNUaGVtZS5BVExBU19QQVRIX0xJR0hUXG5cbiAgICAgICAgLy8gdGhpcy5fY2xvc2VJY29uRGF0YS5zdHlsZSA9IFByb21wdENsb3NlSWNvblN0eWxlcy5DTE9TRURcblxuICAgICAgICBicmVha1xuICAgICAgY2FzZSBQcm9tcHRTdHlsZXMuREFSSzpcbiAgICAgICAgdGhpcy5fc2VjdGlvbiA9IHtcbiAgICAgICAgICAuLi5zb3VyY2VzQ29tcG9uZW50c0Nvb3JkaW5hdGVzLmJhY2tncm91bmRzLnByb21wdEJhY2tncm91bmQsXG4gICAgICAgICAgYXRsYXNIZWlnaHQ6IHNvdXJjZXNDb21wb25lbnRzQ29vcmRpbmF0ZXMuYXRsYXNIZWlnaHQsXG4gICAgICAgICAgYXRsYXNXaWR0aDogc291cmNlc0NvbXBvbmVudHNDb29yZGluYXRlcy5hdGxhc1dpZHRoLFxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fdGV4dHVyZSA9IEF0bGFzVGhlbWUuQVRMQVNfUEFUSF9EQVJLXG5cbiAgICAgICAgdGhpcy5fY2xvc2VJY29uRGF0YS5zdHlsZSA9IFByb21wdENsb3NlSWNvblN0eWxlcy5DTE9TRVdcblxuICAgICAgICBicmVha1xuICAgICAgY2FzZSBQcm9tcHRTdHlsZXMuTElHSFRMQVJHRTpcbiAgICAgICAgdGhpcy5fc2VjdGlvbiA9IHtcbiAgICAgICAgICAuLi5zb3VyY2VzQ29tcG9uZW50c0Nvb3JkaW5hdGVzLmJhY2tncm91bmRzLnByb21wdExhcmdlQmFja2dyb3VuZCxcbiAgICAgICAgICBhdGxhc0hlaWdodDogc291cmNlc0NvbXBvbmVudHNDb29yZGluYXRlcy5hdGxhc0hlaWdodCxcbiAgICAgICAgICBhdGxhc1dpZHRoOiBzb3VyY2VzQ29tcG9uZW50c0Nvb3JkaW5hdGVzLmF0bGFzV2lkdGgsXG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl90ZXh0dXJlID0gQXRsYXNUaGVtZS5BVExBU19QQVRIX0xJR0hUXG5cbiAgICAgICAgdGhpcy5fY2xvc2VJY29uRGF0YS5zdHlsZSA9IFByb21wdENsb3NlSWNvblN0eWxlcy5DTE9TRURcblxuICAgICAgICBicmVha1xuICAgICAgY2FzZSBQcm9tcHRTdHlsZXMuREFSS0xBUkdFOlxuICAgICAgICB0aGlzLl9zZWN0aW9uID0ge1xuICAgICAgICAgIC4uLnNvdXJjZXNDb21wb25lbnRzQ29vcmRpbmF0ZXMuYmFja2dyb3VuZHMucHJvbXB0TGFyZ2VCYWNrZ3JvdW5kLFxuICAgICAgICAgIGF0bGFzSGVpZ2h0OiBzb3VyY2VzQ29tcG9uZW50c0Nvb3JkaW5hdGVzLmF0bGFzSGVpZ2h0LFxuICAgICAgICAgIGF0bGFzV2lkdGg6IHNvdXJjZXNDb21wb25lbnRzQ29vcmRpbmF0ZXMuYXRsYXNXaWR0aCxcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX3RleHR1cmUgPSBBdGxhc1RoZW1lLkFUTEFTX1BBVEhfREFSS1xuXG4gICAgICAgIHRoaXMuX2Nsb3NlSWNvbkRhdGEuc3R5bGUgPSBQcm9tcHRDbG9zZUljb25TdHlsZXMuQ0xPU0VXXG5cbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgUHJvbXB0U3R5bGVzLkxJR0hUU0xBTlRFRDpcbiAgICAgICAgdGhpcy5fc2VjdGlvbiA9IHtcbiAgICAgICAgICAuLi5zb3VyY2VzQ29tcG9uZW50c0Nvb3JkaW5hdGVzLmJhY2tncm91bmRzLnByb21wdFNsYW50ZWRCYWNrZ3JvdW5kLFxuICAgICAgICAgIGF0bGFzSGVpZ2h0OiBzb3VyY2VzQ29tcG9uZW50c0Nvb3JkaW5hdGVzLmF0bGFzSGVpZ2h0LFxuICAgICAgICAgIGF0bGFzV2lkdGg6IHNvdXJjZXNDb21wb25lbnRzQ29vcmRpbmF0ZXMuYXRsYXNXaWR0aCxcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX3RleHR1cmUgPSBBdGxhc1RoZW1lLkFUTEFTX1BBVEhfTElHSFRcblxuICAgICAgICB0aGlzLl9jbG9zZUljb25EYXRhLnN0eWxlID0gUHJvbXB0Q2xvc2VJY29uU3R5bGVzLkNMT1NFRFxuICAgICAgICB0aGlzLl9jbG9zZUljb25EYXRhLnhQb3NpdGlvbiA9IDE1XG5cbiAgICAgICAgYnJlYWtcblxuICAgICAgY2FzZSBQcm9tcHRTdHlsZXMuREFSS1NMQU5URUQ6XG4gICAgICAgIHRoaXMuX3NlY3Rpb24gPSB7XG4gICAgICAgICAgLi4uc291cmNlc0NvbXBvbmVudHNDb29yZGluYXRlcy5iYWNrZ3JvdW5kcy5wcm9tcHRTbGFudGVkQmFja2dyb3VuZCxcbiAgICAgICAgICBhdGxhc0hlaWdodDogc291cmNlc0NvbXBvbmVudHNDb29yZGluYXRlcy5hdGxhc0hlaWdodCxcbiAgICAgICAgICBhdGxhc1dpZHRoOiBzb3VyY2VzQ29tcG9uZW50c0Nvb3JkaW5hdGVzLmF0bGFzV2lkdGgsXG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl90ZXh0dXJlID0gQXRsYXNUaGVtZS5BVExBU19QQVRIX0RBUktcblxuICAgICAgICB0aGlzLl9jbG9zZUljb25EYXRhLnN0eWxlID0gUHJvbXB0Q2xvc2VJY29uU3R5bGVzLkNMT1NFV1xuICAgICAgICB0aGlzLl9jbG9zZUljb25EYXRhLnhQb3NpdGlvbiA9IDE1XG5cbiAgICAgICAgYnJlYWtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9jbG9zZSA9ICgpOiB2b2lkID0+IHtcbiAgICB0aGlzLm9uQ2xvc2UoKVxuXG4gICAgdGhpcy5oaWRlKClcbiAgfVxufVxuIl19