UNPKG

@uiw/react-native

Version:
357 lines (312 loc) 41.7 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _react = _interopRequireWildcard(require("react")); var _reactNative = require("react-native"); function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); } function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } const TRACK_SIZE = 4; const THUMB_SIZE = 20; const DEFAULT_ANIMATION_CONFIGS = { spring: { friction: 7, tension: 100 }, timing: { duration: 150, easing: _reactNative.Easing.inOut(_reactNative.Easing.ease), delay: 0 } }; const getBoundedValue = ({ value, maxValue, minValue }) => value > maxValue ? maxValue : value < minValue ? minValue : value; class Slider extends _react.Component { constructor(props) { super(props); this.panResponder = void 0; this._previousLeft = 0; this.getCurrentValue = () => this.state.value.__getValue(); this.handlePanResponderGrant = () => { if (this.props.disabled) { return; } this._previousLeft = this.getThumbLeft(this.getCurrentValue()); this.props.onSlidingStart(this.getCurrentValue()); }; this.handlePanResponderEnd = () => { if (this.props.disabled) { return; } this.props.onSlidingComplete(this.getCurrentValue()); }; this.handlePanResponderMove = (_, gestureState) => { if (this.props.disabled) { return; } const value = this.getValue(gestureState); this.state.value.setValue(value); this.props.onChange(this.getCurrentValue()); }; this.measureContainer = event => this.handleMeasure('containerSize', event); this.measureThumb = event => this.handleMeasure('thumbSize', event); this.state = { containerSize: { width: 0, height: 0 }, trackSize: { width: 0, height: 0 }, thumbSize: props.thumbSize || { width: 0, height: 0 }, value: new _reactNative.Animated.Value(getBoundedValue(props)) }; this.panResponder = _reactNative.PanResponder.create({ onPanResponderTerminationRequest: () => false, onStartShouldSetPanResponder: () => true, onStartShouldSetPanResponderCapture: () => true, onMoveShouldSetPanResponder: () => false, onPanResponderGrant: this.handlePanResponderGrant, onPanResponderMove: this.handlePanResponderMove, onPanResponderRelease: this.handlePanResponderEnd, onPanResponderTerminate: this.handlePanResponderEnd }); } componentDidUpdate(prevProps) { const newValue = getBoundedValue(this.props); if (prevProps.value !== newValue) { if (this.props.animateTransitions) { this.setCurrentValueAnimated(newValue); } else { this.setCurrentValue(newValue); } } } setCurrentValue(value) { this.state.value.setValue(value); } setCurrentValueAnimated(value) { const { animationType } = this.props; if (!animationType) { return; } const animationConfig = Object.assign({}, DEFAULT_ANIMATION_CONFIGS[animationType], this.props.animationConfig, { toValue: value }); _reactNative.Animated[animationType](this.state.value, animationConfig).start(); } getThumbLeft(value) { const ratio = (value - this.props.minValue) / (this.props.maxValue - this.props.minValue); return ratio * (this.state.containerSize.width - this.state.thumbSize.width); } getValue(gestureState) { const { vertical, minValue, maxValue } = this.props; const length = this.state.containerSize.width - this.state.thumbSize.width; const thumbLeft = this._previousLeft + (vertical ? gestureState.dy : gestureState.dx); const ratio = thumbLeft / length; if (this.props.step) { return Math.max(minValue, Math.min(maxValue, minValue + Math.round(ratio * (maxValue - minValue) / this.props.step) * this.props.step)); } return Math.max(minValue, Math.min(maxValue, ratio * (maxValue - minValue) + minValue)); } handleMeasure(name, event) { const { width: layoutWidth, height: layoutHeight } = event.nativeEvent.layout; const { vertical } = this.props; const { containerSize, trackSize, thumbSize } = this.state; const width = vertical ? layoutHeight : layoutWidth; const height = vertical ? layoutWidth : layoutHeight; const size = { width, height }; const state = { containerSize, trackSize, thumbSize }; if (state[name]) { state[name] = size; } this.setState({ ...state }); } getMinimumTrackStyles(thumbStart) { const { thumbSize, trackSize } = this.state; const minimumTrackStyle = { position: 'absolute' }; if (this.props.vertical) { minimumTrackStyle.height = _reactNative.Animated.add(thumbStart, thumbSize.height / 2); minimumTrackStyle.marginLeft = -trackSize.width; } else { minimumTrackStyle.width = _reactNative.Animated.add(thumbStart, thumbSize.width / 2); minimumTrackStyle.marginTop = -trackSize.height; } return minimumTrackStyle; } getThumbPositionStyles(thumbStart) { if (this.props.vertical) { return [{ translateX: -(this.state.trackSize.height + this.state.thumbSize.height) / 2 }, { translateY: thumbStart }]; } return [{ translateX: thumbStart }, { translateY: -(this.state.trackSize.height + this.state.thumbSize.height) / 2 }]; } render() { const { style, vertical, // eslint-disable-next-line @typescript-eslint/no-unused-vars step, maxValue, minValue, disabled, shownThumb, // eslint-disable-next-line @typescript-eslint/no-unused-vars animationType, // eslint-disable-next-line @typescript-eslint/no-unused-vars animateTransitions, // eslint-disable-next-line @typescript-eslint/no-unused-vars animationConfig, trackStyle, thumbStyle, minimumTrackTintColor, maximumTrackTintColor, thumbTintColor, // eslint-disable-next-line @typescript-eslint/no-unused-vars onChange, // eslint-disable-next-line @typescript-eslint/no-unused-vars onSlidingComplete, // eslint-disable-next-line @typescript-eslint/no-unused-vars onSlidingStart, ...otherProps } = this.props; const { value, thumbSize, containerSize } = this.state; const touchOverflowStyle = {}; const thumbStart = value.interpolate({ inputRange: [minValue, maxValue], outputRange: [0, containerSize.width - thumbSize.width] // extrapolate: 'clamp', }); const minimumTrackStyle = { ...this.getMinimumTrackStyles(thumbStart), backgroundColor: disabled ? '#a0a5b1' : minimumTrackTintColor }; const valueVisibleStyle = {}; const thumbStyleTransform = thumbStyle && thumbStyle.transform || []; const thumbTrackStyle = {}; if (vertical) { thumbTrackStyle.left = 16 + (trackStyle && trackStyle.width ? (trackStyle.width - 4) / 2 : 0); touchOverflowStyle.height = '100%'; touchOverflowStyle.width = 30; } else { thumbTrackStyle.top = 16 + (trackStyle && trackStyle.height ? (trackStyle.height - 4) / 2 : 0); touchOverflowStyle.height = 30; } return <_reactNative.View onLayout={this.measureContainer} {...otherProps} style={_reactNative.StyleSheet.flatten([vertical ? styles.containerVertical : styles.containerHorizontal, style])}> <_reactNative.View style={_reactNative.StyleSheet.flatten([styles.track, vertical ? { ...styles.trackVertical, height: '100%' } : { ...styles.trackHorizontal, width: '100%' }, trackStyle, { backgroundColor: maximumTrackTintColor, position: 'absolute' }])} /> <_reactNative.Animated.View style={_reactNative.StyleSheet.flatten([styles.track, vertical ? styles.trackVertical : styles.trackHorizontal, trackStyle, minimumTrackStyle])} /> {shownThumb && <_reactNative.Animated.View onLayout={this.measureThumb} style={_reactNative.StyleSheet.flatten([{ backgroundColor: thumbTintColor }, styles.thumb, thumbTrackStyle, thumbStyle, { transform: [...this.getThumbPositionStyles(thumbStart), ...thumbStyleTransform], ...valueVisibleStyle }])} />} <_reactNative.View style={_reactNative.StyleSheet.flatten([styles.touchArea, touchOverflowStyle])} {...this.panResponder.panHandlers} /> </_reactNative.View>; } } exports.default = Slider; Slider.defaultProps = { value: 0, step: 0, maxValue: 1, minValue: 0, height: 6, vertical: false, shownThumb: true, thumbSize: { width: 20, height: 20 }, maximumTrackTintColor: '#cacaca', minimumTrackTintColor: '#008EF0', thumbTintColor: '#fff', animationType: 'timing', onChange: () => {}, onSlidingComplete: () => {}, onSlidingStart: () => {} }; const styles = _reactNative.StyleSheet.create({ containerHorizontal: { height: 30, justifyContent: 'center' }, containerVertical: { width: 30, flexDirection: 'column', alignItems: 'center' }, track: { borderRadius: TRACK_SIZE / 2 }, trackHorizontal: { height: TRACK_SIZE }, trackVertical: { flex: 1, width: TRACK_SIZE }, thumb: { position: 'absolute', width: THUMB_SIZE, height: THUMB_SIZE, borderRadius: THUMB_SIZE / 2 }, touchArea: { backgroundColor: 'transparent' } }); module.exports = exports.default; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9TbGlkZXIvaW5kZXgudHN4Il0sIm5hbWVzIjpbIlRSQUNLX1NJWkUiLCJUSFVNQl9TSVpFIiwiREVGQVVMVF9BTklNQVRJT05fQ09ORklHUyIsInNwcmluZyIsImZyaWN0aW9uIiwidGVuc2lvbiIsInRpbWluZyIsImR1cmF0aW9uIiwiZWFzaW5nIiwiRWFzaW5nIiwiaW5PdXQiLCJlYXNlIiwiZGVsYXkiLCJnZXRCb3VuZGVkVmFsdWUiLCJ2YWx1ZSIsIm1heFZhbHVlIiwibWluVmFsdWUiLCJTbGlkZXIiLCJDb21wb25lbnQiLCJjb25zdHJ1Y3RvciIsInByb3BzIiwicGFuUmVzcG9uZGVyIiwiX3ByZXZpb3VzTGVmdCIsImdldEN1cnJlbnRWYWx1ZSIsInN0YXRlIiwiX19nZXRWYWx1ZSIsImhhbmRsZVBhblJlc3BvbmRlckdyYW50IiwiZGlzYWJsZWQiLCJnZXRUaHVtYkxlZnQiLCJvblNsaWRpbmdTdGFydCIsImhhbmRsZVBhblJlc3BvbmRlckVuZCIsIm9uU2xpZGluZ0NvbXBsZXRlIiwiaGFuZGxlUGFuUmVzcG9uZGVyTW92ZSIsIl8iLCJnZXN0dXJlU3RhdGUiLCJnZXRWYWx1ZSIsInNldFZhbHVlIiwib25DaGFuZ2UiLCJtZWFzdXJlQ29udGFpbmVyIiwiZXZlbnQiLCJoYW5kbGVNZWFzdXJlIiwibWVhc3VyZVRodW1iIiwiY29udGFpbmVyU2l6ZSIsIndpZHRoIiwiaGVpZ2h0IiwidHJhY2tTaXplIiwidGh1bWJTaXplIiwiQW5pbWF0ZWQiLCJWYWx1ZSIsIlBhblJlc3BvbmRlciIsImNyZWF0ZSIsIm9uUGFuUmVzcG9uZGVyVGVybWluYXRpb25SZXF1ZXN0Iiwib25TdGFydFNob3VsZFNldFBhblJlc3BvbmRlciIsIm9uU3RhcnRTaG91bGRTZXRQYW5SZXNwb25kZXJDYXB0dXJlIiwib25Nb3ZlU2hvdWxkU2V0UGFuUmVzcG9uZGVyIiwib25QYW5SZXNwb25kZXJHcmFudCIsIm9uUGFuUmVzcG9uZGVyTW92ZSIsIm9uUGFuUmVzcG9uZGVyUmVsZWFzZSIsIm9uUGFuUmVzcG9uZGVyVGVybWluYXRlIiwiY29tcG9uZW50RGlkVXBkYXRlIiwicHJldlByb3BzIiwibmV3VmFsdWUiLCJhbmltYXRlVHJhbnNpdGlvbnMiLCJzZXRDdXJyZW50VmFsdWVBbmltYXRlZCIsInNldEN1cnJlbnRWYWx1ZSIsImFuaW1hdGlvblR5cGUiLCJhbmltYXRpb25Db25maWciLCJPYmplY3QiLCJhc3NpZ24iLCJ0b1ZhbHVlIiwic3RhcnQiLCJyYXRpbyIsInZlcnRpY2FsIiwibGVuZ3RoIiwidGh1bWJMZWZ0IiwiZHkiLCJkeCIsInN0ZXAiLCJNYXRoIiwibWF4IiwibWluIiwicm91bmQiLCJuYW1lIiwibGF5b3V0V2lkdGgiLCJsYXlvdXRIZWlnaHQiLCJuYXRpdmVFdmVudCIsImxheW91dCIsInNpemUiLCJzZXRTdGF0ZSIsImdldE1pbmltdW1UcmFja1N0eWxlcyIsInRodW1iU3RhcnQiLCJtaW5pbXVtVHJhY2tTdHlsZSIsInBvc2l0aW9uIiwiYWRkIiwibWFyZ2luTGVmdCIsIm1hcmdpblRvcCIsImdldFRodW1iUG9zaXRpb25TdHlsZXMiLCJ0cmFuc2xhdGVYIiwidHJhbnNsYXRlWSIsInJlbmRlciIsInN0eWxlIiwic2hvd25UaHVtYiIsInRyYWNrU3R5bGUiLCJ0aHVtYlN0eWxlIiwibWluaW11bVRyYWNrVGludENvbG9yIiwibWF4aW11bVRyYWNrVGludENvbG9yIiwidGh1bWJUaW50Q29sb3IiLCJvdGhlclByb3BzIiwidG91Y2hPdmVyZmxvd1N0eWxlIiwiaW50ZXJwb2xhdGUiLCJpbnB1dFJhbmdlIiwib3V0cHV0UmFuZ2UiLCJiYWNrZ3JvdW5kQ29sb3IiLCJ2YWx1ZVZpc2libGVTdHlsZSIsInRodW1iU3R5bGVUcmFuc2Zvcm0iLCJ0cmFuc2Zvcm0iLCJ0aHVtYlRyYWNrU3R5bGUiLCJsZWZ0IiwidG9wIiwiU3R5bGVTaGVldCIsImZsYXR0ZW4iLCJzdHlsZXMiLCJjb250YWluZXJWZXJ0aWNhbCIsImNvbnRhaW5lckhvcml6b250YWwiLCJ0cmFjayIsInRyYWNrVmVydGljYWwiLCJ0cmFja0hvcml6b250YWwiLCJ0aHVtYiIsInRvdWNoQXJlYSIsInBhbkhhbmRsZXJzIiwiZGVmYXVsdFByb3BzIiwianVzdGlmeUNvbnRlbnQiLCJmbGV4RGlyZWN0aW9uIiwiYWxpZ25JdGVtcyIsImJvcmRlclJhZGl1cyIsImZsZXgiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFBQTs7QUFDQTs7Ozs7O0FBY0EsTUFBTUEsVUFBVSxHQUFHLENBQW5CO0FBQ0EsTUFBTUMsVUFBVSxHQUFHLEVBQW5CO0FBRUEsTUFBTUMseUJBQXlCLEdBQUc7QUFDaENDLEVBQUFBLE1BQU0sRUFBRTtBQUNOQyxJQUFBQSxRQUFRLEVBQUUsQ0FESjtBQUVOQyxJQUFBQSxPQUFPLEVBQUU7QUFGSCxHQUR3QjtBQUtoQ0MsRUFBQUEsTUFBTSxFQUFFO0FBQ05DLElBQUFBLFFBQVEsRUFBRSxHQURKO0FBRU5DLElBQUFBLE1BQU0sRUFBRUMsb0JBQU9DLEtBQVAsQ0FBYUQsb0JBQU9FLElBQXBCLENBRkY7QUFHTkMsSUFBQUEsS0FBSyxFQUFFO0FBSEQ7QUFMd0IsQ0FBbEM7O0FBa0JBLE1BQU1DLGVBQWUsR0FBRyxDQUFDO0FBQUVDLEVBQUFBLEtBQUY7QUFBU0MsRUFBQUEsUUFBVDtBQUFtQkMsRUFBQUE7QUFBbkIsQ0FBRCxLQUN0QkYsS0FBSyxHQUFJQyxRQUFULEdBQXFCQSxRQUFyQixHQUFnQ0QsS0FBSyxHQUFJRSxRQUFULEdBQXFCQSxRQUFyQixHQUFnQ0YsS0FEbEU7O0FBMENlLE1BQU1HLE1BQU4sU0FBcUJDLGdCQUFyQixDQUF5RDtBQW9CdEVDLEVBQUFBLFdBQVcsQ0FBQ0MsS0FBRCxFQUFxQjtBQUM5QixVQUFNQSxLQUFOO0FBRDhCLFNBbkJoQ0MsWUFtQmdDO0FBQUEsU0FsQmhDQyxhQWtCZ0MsR0FsQlIsQ0FrQlE7O0FBQUEsU0F1RGhDQyxlQXZEZ0MsR0F1RGQsTUFBTyxLQUFLQyxLQUFMLENBQVdWLEtBQVosQ0FBMEJXLFVBQTFCLEVBdkRROztBQUFBLFNBd0RoQ0MsdUJBeERnQyxHQXdETixNQUFNO0FBQzlCLFVBQUksS0FBS04sS0FBTCxDQUFXTyxRQUFmLEVBQXlCO0FBQ3ZCO0FBQ0Q7O0FBQ0QsV0FBS0wsYUFBTCxHQUFxQixLQUFLTSxZQUFMLENBQWtCLEtBQUtMLGVBQUwsRUFBbEIsQ0FBckI7QUFDQSxXQUFLSCxLQUFMLENBQVdTLGNBQVgsQ0FBMkIsS0FBS04sZUFBTCxFQUEzQjtBQUNELEtBOUQrQjs7QUFBQSxTQStEaENPLHFCQS9EZ0MsR0ErRFIsTUFBTTtBQUM1QixVQUFJLEtBQUtWLEtBQUwsQ0FBV08sUUFBZixFQUF5QjtBQUN2QjtBQUNEOztBQUNELFdBQUtQLEtBQUwsQ0FBV1csaUJBQVgsQ0FBOEIsS0FBS1IsZUFBTCxFQUE5QjtBQUNELEtBcEUrQjs7QUFBQSxTQXFFaENTLHNCQXJFZ0MsR0FxRVAsQ0FBQ0MsQ0FBRCxFQUFTQyxZQUFULEtBQW9EO0FBQzNFLFVBQUksS0FBS2QsS0FBTCxDQUFXTyxRQUFmLEVBQXlCO0FBQ3ZCO0FBQ0Q7O0FBQ0QsWUFBTWIsS0FBSyxHQUFHLEtBQUtxQixRQUFMLENBQWNELFlBQWQsQ0FBZDtBQUNBLFdBQUtWLEtBQUwsQ0FBV1YsS0FBWCxDQUFpQnNCLFFBQWpCLENBQTBCdEIsS0FBMUI7QUFDQSxXQUFLTSxLQUFMLENBQVdpQixRQUFYLENBQXFCLEtBQUtkLGVBQUwsRUFBckI7QUFDRCxLQTVFK0I7O0FBQUEsU0EyR2hDZSxnQkEzR2dDLEdBMkdaQyxLQUFELElBQThCLEtBQUtDLGFBQUwsQ0FBbUIsZUFBbkIsRUFBb0NELEtBQXBDLENBM0dqQjs7QUFBQSxTQTRHaENFLFlBNUdnQyxHQTRHaEJGLEtBQUQsSUFBOEIsS0FBS0MsYUFBTCxDQUFtQixXQUFuQixFQUFnQ0QsS0FBaEMsQ0E1R2I7O0FBRTlCLFNBQUtmLEtBQUwsR0FBYTtBQUNYa0IsTUFBQUEsYUFBYSxFQUFFO0FBQUVDLFFBQUFBLEtBQUssRUFBRSxDQUFUO0FBQVlDLFFBQUFBLE1BQU0sRUFBRTtBQUFwQixPQURKO0FBRVhDLE1BQUFBLFNBQVMsRUFBRTtBQUFFRixRQUFBQSxLQUFLLEVBQUUsQ0FBVDtBQUFZQyxRQUFBQSxNQUFNLEVBQUU7QUFBcEIsT0FGQTtBQUdYRSxNQUFBQSxTQUFTLEVBQUUxQixLQUFLLENBQUMwQixTQUFOLElBQW1CO0FBQUVILFFBQUFBLEtBQUssRUFBRSxDQUFUO0FBQVlDLFFBQUFBLE1BQU0sRUFBRTtBQUFwQixPQUhuQjtBQUlYOUIsTUFBQUEsS0FBSyxFQUFFLElBQUlpQyxzQkFBU0MsS0FBYixDQUFtQm5DLGVBQWUsQ0FBQ08sS0FBRCxDQUFsQztBQUpJLEtBQWI7QUFNQSxTQUFLQyxZQUFMLEdBQW9CNEIsMEJBQWFDLE1BQWIsQ0FBb0I7QUFDdENDLE1BQUFBLGdDQUFnQyxFQUFFLE1BQU0sS0FERjtBQUV0Q0MsTUFBQUEsNEJBQTRCLEVBQUUsTUFBTSxJQUZFO0FBR3RDQyxNQUFBQSxtQ0FBbUMsRUFBRSxNQUFNLElBSEw7QUFJdENDLE1BQUFBLDJCQUEyQixFQUFFLE1BQU0sS0FKRztBQUt0Q0MsTUFBQUEsbUJBQW1CLEVBQUUsS0FBSzdCLHVCQUxZO0FBTXRDOEIsTUFBQUEsa0JBQWtCLEVBQUUsS0FBS3hCLHNCQU5hO0FBT3RDeUIsTUFBQUEscUJBQXFCLEVBQUUsS0FBSzNCLHFCQVBVO0FBUXRDNEIsTUFBQUEsdUJBQXVCLEVBQUUsS0FBSzVCO0FBUlEsS0FBcEIsQ0FBcEI7QUFVRDs7QUFDRDZCLEVBQUFBLGtCQUFrQixDQUFDQyxTQUFELEVBQXlCO0FBQ3pDLFVBQU1DLFFBQVEsR0FBR2hELGVBQWUsQ0FBQyxLQUFLTyxLQUFOLENBQWhDOztBQUVBLFFBQUl3QyxTQUFTLENBQUM5QyxLQUFWLEtBQW9CK0MsUUFBeEIsRUFBa0M7QUFDaEMsVUFBSSxLQUFLekMsS0FBTCxDQUFXMEMsa0JBQWYsRUFBbUM7QUFDakMsYUFBS0MsdUJBQUwsQ0FBNkJGLFFBQTdCO0FBQ0QsT0FGRCxNQUVPO0FBQ0wsYUFBS0csZUFBTCxDQUFxQkgsUUFBckI7QUFDRDtBQUNGO0FBQ0Y7O0FBRURHLEVBQUFBLGVBQWUsQ0FBQ2xELEtBQUQsRUFBZ0I7QUFDN0IsU0FBS1UsS0FBTCxDQUFXVixLQUFYLENBQWlCc0IsUUFBakIsQ0FBMEJ0QixLQUExQjtBQUNEOztBQUVEaUQsRUFBQUEsdUJBQXVCLENBQUNqRCxLQUFELEVBQWdCO0FBQ3JDLFVBQU07QUFBRW1ELE1BQUFBO0FBQUYsUUFBb0IsS0FBSzdDLEtBQS9COztBQUNBLFFBQUksQ0FBQzZDLGFBQUwsRUFBb0I7QUFDbEI7QUFDRDs7QUFDRCxVQUFNQyxlQUErQyxHQUFHQyxNQUFNLENBQUNDLE1BQVAsQ0FDdEQsRUFEc0QsRUFFdERsRSx5QkFBeUIsQ0FBQytELGFBQUQsQ0FGNkIsRUFHdEQsS0FBSzdDLEtBQUwsQ0FBVzhDLGVBSDJDLEVBSXREO0FBQ0VHLE1BQUFBLE9BQU8sRUFBRXZEO0FBRFgsS0FKc0QsQ0FBeEQ7O0FBU0FpQywwQkFBU2tCLGFBQVQsRUFBd0IsS0FBS3pDLEtBQUwsQ0FBV1YsS0FBbkMsRUFBMENvRCxlQUExQyxFQUEyREksS0FBM0Q7QUFDRDs7QUFDRDFDLEVBQUFBLFlBQVksQ0FBQ2QsS0FBRCxFQUFnQjtBQUMxQixVQUFNeUQsS0FBSyxHQUFHLENBQUN6RCxLQUFLLEdBQUcsS0FBS00sS0FBTCxDQUFXSixRQUFwQixLQUFrQyxLQUFLSSxLQUFMLENBQVdMLFFBQVgsR0FBdUIsS0FBS0ssS0FBTCxDQUFXSixRQUFwRSxDQUFkO0FBQ0EsV0FBT3VELEtBQUssSUFBSSxLQUFLL0MsS0FBTCxDQUFXa0IsYUFBWCxDQUF5QkMsS0FBekIsR0FBaUMsS0FBS25CLEtBQUwsQ0FBV3NCLFNBQVgsQ0FBcUJILEtBQTFELENBQVo7QUFDRDs7QUF1QkRSLEVBQUFBLFFBQVEsQ0FBQ0QsWUFBRCxFQUF5QztBQUMvQyxVQUFNO0FBQUVzQyxNQUFBQSxRQUFGO0FBQVl4RCxNQUFBQSxRQUFaO0FBQXNCRCxNQUFBQTtBQUF0QixRQUFtQyxLQUFLSyxLQUE5QztBQUNBLFVBQU1xRCxNQUFNLEdBQUcsS0FBS2pELEtBQUwsQ0FBV2tCLGFBQVgsQ0FBeUJDLEtBQXpCLEdBQWlDLEtBQUtuQixLQUFMLENBQVdzQixTQUFYLENBQXFCSCxLQUFyRTtBQUNBLFVBQU0rQixTQUFTLEdBQUcsS0FBS3BELGFBQUwsSUFBc0JrRCxRQUFRLEdBQUd0QyxZQUFZLENBQUN5QyxFQUFoQixHQUFxQnpDLFlBQVksQ0FBQzBDLEVBQWhFLENBQWxCO0FBQ0EsVUFBTUwsS0FBSyxHQUFHRyxTQUFTLEdBQUdELE1BQTFCOztBQUNBLFFBQUksS0FBS3JELEtBQUwsQ0FBV3lELElBQWYsRUFBcUI7QUFDbkIsYUFBT0MsSUFBSSxDQUFDQyxHQUFMLENBQ0wvRCxRQURLLEVBRUw4RCxJQUFJLENBQUNFLEdBQUwsQ0FDRWpFLFFBREYsRUFFRUMsUUFBUSxHQUFJOEQsSUFBSSxDQUFDRyxLQUFMLENBQVlWLEtBQUssSUFBSXhELFFBQVEsR0FBSUMsUUFBaEIsQ0FBTixHQUFvQyxLQUFLSSxLQUFMLENBQVd5RCxJQUExRCxJQUFrRSxLQUFLekQsS0FBTCxDQUFXeUQsSUFGM0YsQ0FGSyxDQUFQO0FBT0Q7O0FBQ0QsV0FBT0MsSUFBSSxDQUFDQyxHQUFMLENBQVMvRCxRQUFULEVBQW9COEQsSUFBSSxDQUFDRSxHQUFMLENBQVNqRSxRQUFULEVBQW9Cd0QsS0FBSyxJQUFJeEQsUUFBUSxHQUFJQyxRQUFoQixDQUFMLEdBQWtDQSxRQUF0RCxDQUFwQixDQUFQO0FBQ0Q7O0FBRUR3QixFQUFBQSxhQUFhLENBQUMwQyxJQUFELEVBQWUzQyxLQUFmLEVBQXlDO0FBQ3BELFVBQU07QUFBRUksTUFBQUEsS0FBSyxFQUFFd0MsV0FBVDtBQUFzQnZDLE1BQUFBLE1BQU0sRUFBRXdDO0FBQTlCLFFBQStDN0MsS0FBSyxDQUFDOEMsV0FBTixDQUFrQkMsTUFBdkU7QUFDQSxVQUFNO0FBQUVkLE1BQUFBO0FBQUYsUUFBZSxLQUFLcEQsS0FBMUI7QUFDQSxVQUFNO0FBQUVzQixNQUFBQSxhQUFGO0FBQWlCRyxNQUFBQSxTQUFqQjtBQUE0QkMsTUFBQUE7QUFBNUIsUUFBMEMsS0FBS3RCLEtBQXJEO0FBQ0EsVUFBTW1CLEtBQUssR0FBRzZCLFFBQVEsR0FBR1ksWUFBSCxHQUFrQkQsV0FBeEM7QUFDQSxVQUFNdkMsTUFBTSxHQUFHNEIsUUFBUSxHQUFHVyxXQUFILEdBQWlCQyxZQUF4QztBQUNBLFVBQU1HLElBQUksR0FBRztBQUFFNUMsTUFBQUEsS0FBRjtBQUFTQyxNQUFBQTtBQUFULEtBQWI7QUFDQSxVQUFNcEIsS0FBSyxHQUFHO0FBQUVrQixNQUFBQSxhQUFGO0FBQWlCRyxNQUFBQSxTQUFqQjtBQUE0QkMsTUFBQUE7QUFBNUIsS0FBZDs7QUFDQSxRQUFJdEIsS0FBSyxDQUFDMEQsSUFBRCxDQUFULEVBQXVDO0FBQ3JDMUQsTUFBQUEsS0FBSyxDQUFDMEQsSUFBRCxDQUFMLEdBQW9DSyxJQUFwQztBQUNEOztBQUNELFNBQUtDLFFBQUwsQ0FBYyxFQUFFLEdBQUdoRTtBQUFMLEtBQWQ7QUFDRDs7QUFHRGlFLEVBQUFBLHFCQUFxQixDQUFDQyxVQUFELEVBQTZDO0FBQ2hFLFVBQU07QUFBRTVDLE1BQUFBLFNBQUY7QUFBYUQsTUFBQUE7QUFBYixRQUEyQixLQUFLckIsS0FBdEM7QUFDQSxVQUFNbUUsaUJBTUwsR0FBRztBQUFFQyxNQUFBQSxRQUFRLEVBQUU7QUFBWixLQU5KOztBQVFBLFFBQUksS0FBS3hFLEtBQUwsQ0FBV29ELFFBQWYsRUFBeUI7QUFDdkJtQixNQUFBQSxpQkFBaUIsQ0FBQy9DLE1BQWxCLEdBQTJCRyxzQkFBUzhDLEdBQVQsQ0FBYUgsVUFBYixFQUF5QjVDLFNBQVMsQ0FBQ0YsTUFBVixHQUFtQixDQUE1QyxDQUEzQjtBQUNBK0MsTUFBQUEsaUJBQWlCLENBQUNHLFVBQWxCLEdBQStCLENBQUNqRCxTQUFTLENBQUNGLEtBQTFDO0FBQ0QsS0FIRCxNQUdPO0FBQ0xnRCxNQUFBQSxpQkFBaUIsQ0FBQ2hELEtBQWxCLEdBQTBCSSxzQkFBUzhDLEdBQVQsQ0FBYUgsVUFBYixFQUF5QjVDLFNBQVMsQ0FBQ0gsS0FBVixHQUFrQixDQUEzQyxDQUExQjtBQUNBZ0QsTUFBQUEsaUJBQWlCLENBQUNJLFNBQWxCLEdBQThCLENBQUNsRCxTQUFTLENBQUNELE1BQXpDO0FBQ0Q7O0FBQ0QsV0FBTytDLGlCQUFQO0FBQ0Q7O0FBQ0RLLEVBQUFBLHNCQUFzQixDQUFDTixVQUFELEVBQTZDO0FBQ2pFLFFBQUksS0FBS3RFLEtBQUwsQ0FBV29ELFFBQWYsRUFBeUI7QUFDdkIsYUFBTyxDQUNMO0FBQ0V5QixRQUFBQSxVQUFVLEVBQUUsRUFBRSxLQUFLekUsS0FBTCxDQUFXcUIsU0FBWCxDQUFxQkQsTUFBckIsR0FBOEIsS0FBS3BCLEtBQUwsQ0FBV3NCLFNBQVgsQ0FBcUJGLE1BQXJELElBQStEO0FBRDdFLE9BREssRUFJTDtBQUFFc0QsUUFBQUEsVUFBVSxFQUFFUjtBQUFkLE9BSkssQ0FBUDtBQU1EOztBQUNELFdBQU8sQ0FDTDtBQUFFTyxNQUFBQSxVQUFVLEVBQUVQO0FBQWQsS0FESyxFQUVMO0FBQ0VRLE1BQUFBLFVBQVUsRUFBRSxFQUFFLEtBQUsxRSxLQUFMLENBQVdxQixTQUFYLENBQXFCRCxNQUFyQixHQUE4QixLQUFLcEIsS0FBTCxDQUFXc0IsU0FBWCxDQUFxQkYsTUFBckQsSUFBK0Q7QUFEN0UsS0FGSyxDQUFQO0FBTUQ7O0FBQ0R1RCxFQUFBQSxNQUFNLEdBQUc7QUFDUCxVQUFNO0FBQ0pDLE1BQUFBLEtBREk7QUFFSjVCLE1BQUFBLFFBRkk7QUFHSjtBQUNBSyxNQUFBQSxJQUpJO0FBS0o5RCxNQUFBQSxRQUxJO0FBTUpDLE1BQUFBLFFBTkk7QUFPSlcsTUFBQUEsUUFQSTtBQVFKMEUsTUFBQUEsVUFSSTtBQVNKO0FBQ0FwQyxNQUFBQSxhQVZJO0FBV0o7QUFDQUgsTUFBQUEsa0JBWkk7QUFhSjtBQUNBSSxNQUFBQSxlQWRJO0FBZUpvQyxNQUFBQSxVQWZJO0FBZ0JKQyxNQUFBQSxVQWhCSTtBQWlCSkMsTUFBQUEscUJBakJJO0FBa0JKQyxNQUFBQSxxQkFsQkk7QUFtQkpDLE1BQUFBLGNBbkJJO0FBb0JKO0FBQ0FyRSxNQUFBQSxRQXJCSTtBQXNCSjtBQUNBTixNQUFBQSxpQkF2Qkk7QUF3Qko7QUFDQUYsTUFBQUEsY0F6Qkk7QUEwQkosU0FBRzhFO0FBMUJDLFFBMkJGLEtBQUt2RixLQTNCVDtBQTRCQSxVQUFNO0FBQUVOLE1BQUFBLEtBQUY7QUFBU2dDLE1BQUFBLFNBQVQ7QUFBb0JKLE1BQUFBO0FBQXBCLFFBQXNDLEtBQUtsQixLQUFqRDtBQUNBLFVBQU1vRixrQkFBa0IsR0FBRyxFQUEzQjtBQUNBLFVBQU1sQixVQUFVLEdBQUc1RSxLQUFLLENBQUMrRixXQUFOLENBQWtCO0FBQ25DQyxNQUFBQSxVQUFVLEVBQUUsQ0FBQzlGLFFBQUQsRUFBWUQsUUFBWixDQUR1QjtBQUVuQ2dHLE1BQUFBLFdBQVcsRUFBRSxDQUFDLENBQUQsRUFBSXJFLGFBQWEsQ0FBQ0MsS0FBZCxHQUFzQkcsU0FBUyxDQUFDSCxLQUFwQyxDQUZzQixDQUduQzs7QUFIbUMsS0FBbEIsQ0FBbkI7QUFLQSxVQUFNZ0QsaUJBQWlCLEdBQUcsRUFDeEIsR0FBRyxLQUFLRixxQkFBTCxDQUEyQkMsVUFBM0IsQ0FEcUI7QUFFeEJzQixNQUFBQSxlQUFlLEVBQUVyRixRQUFRLEdBQUcsU0FBSCxHQUFlNkU7QUFGaEIsS0FBMUI7QUFJQSxVQUFNUyxpQkFBaUIsR0FBRyxFQUExQjtBQUNBLFVBQU1DLG1CQUFtQixHQUFJWCxVQUFVLElBQUtBLFVBQUQsQ0FBZ0NZLFNBQS9DLElBQTZELEVBQXpGO0FBQ0EsVUFBTUMsZUFBZSxHQUFHLEVBQXhCOztBQUNBLFFBQUk1QyxRQUFKLEVBQWM7QUFDWjRDLE1BQUFBLGVBQWUsQ0FBQ0MsSUFBaEIsR0FBdUIsTUFBTWYsVUFBVSxJQUFJQSxVQUFVLENBQUMzRCxLQUF6QixHQUFpQyxDQUFFMkQsVUFBVSxDQUFDM0QsS0FBWixHQUErQixDQUFoQyxJQUFxQyxDQUF0RSxHQUEwRSxDQUFoRixDQUF2QjtBQUNBaUUsTUFBQUEsa0JBQWtCLENBQUNoRSxNQUFuQixHQUE0QixNQUE1QjtBQUNBZ0UsTUFBQUEsa0JBQWtCLENBQUNqRSxLQUFuQixHQUEyQixFQUEzQjtBQUNELEtBSkQsTUFJTztBQUNMeUUsTUFBQUEsZUFBZSxDQUFDRSxHQUFoQixHQUFzQixNQUFNaEIsVUFBVSxJQUFJQSxVQUFVLENBQUMxRCxNQUF6QixHQUFrQyxDQUFFMEQsVUFBVSxDQUFDMUQsTUFBWixHQUFnQyxDQUFqQyxJQUFzQyxDQUF4RSxHQUE0RSxDQUFsRixDQUF0QjtBQUNBZ0UsTUFBQUEsa0JBQWtCLENBQUNoRSxNQUFuQixHQUE0QixFQUE1QjtBQUNEOztBQUNELFdBQ0UsbUJBQ0UsU0FBUyxDQUFDLEtBQUtOLGdCQUFOLENBRFgsQ0FFRSxJQUFJcUUsVUFBSixDQUZGLENBR0UsTUFBTSxDQUFDWSx3QkFBV0MsT0FBWCxDQUFtQixDQUFDaEQsUUFBUSxHQUFHaUQsTUFBTSxDQUFDQyxpQkFBVixHQUE4QkQsTUFBTSxDQUFDRSxtQkFBOUMsRUFBbUV2QixLQUFuRSxDQUFuQixDQUFELENBSFI7QUFLTixRQUFRLG1CQUNFLE1BQU0sQ0FBQ21CLHdCQUFXQyxPQUFYLENBQW1CLENBQ3hCQyxNQUFNLENBQUNHLEtBRGlCLEVBRXhCcEQsUUFBUSxHQUFHLEVBQUUsR0FBR2lELE1BQU0sQ0FBQ0ksYUFBWjtBQUEyQmpGLFFBQUFBLE1BQU0sRUFBRTtBQUFuQyxPQUFILEdBQWlELEVBQUUsR0FBRzZFLE1BQU0sQ0FBQ0ssZUFBWjtBQUE2Qm5GLFFBQUFBLEtBQUssRUFBRTtBQUFwQyxPQUZqQyxFQUd4QjJELFVBSHdCLEVBSXhCO0FBQUVVLFFBQUFBLGVBQWUsRUFBRVAscUJBQW5CO0FBQTBDYixRQUFBQSxRQUFRLEVBQUU7QUFBcEQsT0FKd0IsQ0FBbkIsQ0FBRCxDQURSO0FBUVIsUUFBUSxDQUFDLHNCQUFTLElBQVYsQ0FDRSxNQUFNLENBQUMyQix3QkFBV0MsT0FBWCxDQUFtQixDQUN4QkMsTUFBTSxDQUFDRyxLQURpQixFQUV4QnBELFFBQVEsR0FBR2lELE1BQU0sQ0FBQ0ksYUFBVixHQUEwQkosTUFBTSxDQUFDSyxlQUZqQixFQUd4QnhCLFVBSHdCLEVBSXhCWCxpQkFKd0IsQ0FBbkIsQ0FBRCxDQURSO0FBUVIsUUFBUSxDQUFDVSxVQUFVLElBQ1QsQ0FBQyxzQkFBUyxJQUFWLENBQ0UsU0FBUyxDQUFDLEtBQUs1RCxZQUFOLENBRFgsQ0FFRSxNQUFNLENBQUM4RSx3QkFBV0MsT0FBWCxDQUFtQixDQUN4QjtBQUFFUixRQUFBQSxlQUFlLEVBQUVOO0FBQW5CLE9BRHdCLEVBRXhCZSxNQUFNLENBQUNNLEtBRmlCLEVBR3hCWCxlQUh3QixFQUl4QmIsVUFKd0IsRUFLeEI7QUFDRVksUUFBQUEsU0FBUyxFQUFFLENBQUMsR0FBRyxLQUFLbkIsc0JBQUwsQ0FBNEJOLFVBQTVCLENBQUosRUFBNkMsR0FBR3dCLG1CQUFoRCxDQURiO0FBRUUsV0FBR0Q7QUFGTCxPQUx3QixDQUFuQixDQUFELENBRlIsR0FERjtBQWVSLFFBQVEsbUJBQU0sTUFBTSxDQUFDTSx3QkFBV0MsT0FBWCxDQUFtQixDQUFDQyxNQUFNLENBQUNPLFNBQVIsRUFBbUJwQixrQkFBbkIsQ0FBbkIsQ0FBRCxDQUFaLENBQXlFLElBQUksS0FBS3ZGLFlBQUwsQ0FBa0I0RyxXQUF0QixDQUF6RTtBQUNSLE1BQU0sb0JBdENGO0FBd0NEOztBQS9QcUU7OztBQUFuRGhILE0sQ0FHWmlILFksR0FBZTtBQUNwQnBILEVBQUFBLEtBQUssRUFBRSxDQURhO0FBRXBCK0QsRUFBQUEsSUFBSSxFQUFFLENBRmM7QUFHcEI5RCxFQUFBQSxRQUFRLEVBQUUsQ0FIVTtBQUlwQkMsRUFBQUEsUUFBUSxFQUFFLENBSlU7QUFLcEI0QixFQUFBQSxNQUFNLEVBQUUsQ0FMWTtBQU1wQjRCLEVBQUFBLFFBQVEsRUFBRSxLQU5VO0FBT3BCNkIsRUFBQUEsVUFBVSxFQUFFLElBUFE7QUFRcEJ2RCxFQUFBQSxTQUFTLEVBQUU7QUFBRUgsSUFBQUEsS0FBSyxFQUFFLEVBQVQ7QUFBYUMsSUFBQUEsTUFBTSxFQUFFO0FBQXJCLEdBUlM7QUFTcEI2RCxFQUFBQSxxQkFBcUIsRUFBRSxTQVRIO0FBVXBCRCxFQUFBQSxxQkFBcUIsRUFBRSxTQVZIO0FBV3BCRSxFQUFBQSxjQUFjLEVBQUUsTUFYSTtBQVlwQnpDLEVBQUFBLGFBQWEsRUFBRSxRQVpLO0FBYXBCNUIsRUFBQUEsUUFBUSxFQUFFLE1BQU0sQ0FBRSxDQWJFO0FBY3BCTixFQUFBQSxpQkFBaUIsRUFBRSxNQUFNLENBQUUsQ0FkUDtBQWVwQkYsRUFBQUEsY0FBYyxFQUFFLE1BQU0sQ0FBRTtBQWZKLEM7O0FBK1B4QixNQUFNNEYsTUFBTSxHQUFHRix3QkFBV3JFLE1BQVgsQ0FBa0I7QUFDL0J5RSxFQUFBQSxtQkFBbUIsRUFBRTtBQUNuQi9FLElBQUFBLE1BQU0sRUFBRSxFQURXO0FBRW5CdUYsSUFBQUEsY0FBYyxFQUFFO0FBRkcsR0FEVTtBQUsvQlQsRUFBQUEsaUJBQWlCLEVBQUU7QUFDakIvRSxJQUFBQSxLQUFLLEVBQUUsRUFEVTtBQUVqQnlGLElBQUFBLGFBQWEsRUFBRSxRQUZFO0FBR2pCQyxJQUFBQSxVQUFVLEVBQUU7QUFISyxHQUxZO0FBVS9CVCxFQUFBQSxLQUFLLEVBQUU7QUFDTFUsSUFBQUEsWUFBWSxFQUFFdEksVUFBVSxHQUFHO0FBRHRCLEdBVndCO0FBYS9COEgsRUFBQUEsZUFBZSxFQUFFO0FBQ2ZsRixJQUFBQSxNQUFNLEVBQUU1QztBQURPLEdBYmM7QUFnQi9CNkgsRUFBQUEsYUFBYSxFQUFFO0FBQ2JVLElBQUFBLElBQUksRUFBRSxDQURPO0FBRWI1RixJQUFBQSxLQUFLLEVBQUUzQztBQUZNLEdBaEJnQjtBQW9CL0IrSCxFQUFBQSxLQUFLLEVBQUU7QUFDTG5DLElBQUFBLFFBQVEsRUFBRSxVQURMO0FBRUxqRCxJQUFBQSxLQUFLLEVBQUUxQyxVQUZGO0FBR0wyQyxJQUFBQSxNQUFNLEVBQUUzQyxVQUhIO0FBSUxxSSxJQUFBQSxZQUFZLEVBQUVySSxVQUFVLEdBQUc7QUFKdEIsR0FwQndCO0FBMEIvQitILEVBQUFBLFNBQVMsRUFBRTtBQUNUaEIsSUFBQUEsZUFBZSxFQUFFO0FBRFI7QUExQm9CLENBQWxCLENBQWYiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgUmVhY3QsIHsgQ29tcG9uZW50IH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHtcbiAgVmlldyxcbiAgVmlld1Byb3BzLFxuICBUcmFuc2Zvcm1zU3R5bGUsXG4gIFZpZXdTdHlsZSxcbiAgRWFzaW5nLFxuICBMYXlvdXRDaGFuZ2VFdmVudCxcbiAgQW5pbWF0ZWQsXG4gIFBhblJlc3BvbmRlcixcbiAgUGFuUmVzcG9uZGVySW5zdGFuY2UsXG4gIFBhblJlc3BvbmRlckdlc3R1cmVTdGF0ZSxcbiAgU3R5bGVTaGVldCxcbn0gZnJvbSAncmVhY3QtbmF0aXZlJztcblxuY29uc3QgVFJBQ0tfU0laRSA9IDQ7XG5jb25zdCBUSFVNQl9TSVpFID0gMjA7XG5cbmNvbnN0IERFRkFVTFRfQU5JTUFUSU9OX0NPTkZJR1MgPSB7XG4gIHNwcmluZzoge1xuICAgIGZyaWN0aW9uOiA3LFxuICAgIHRlbnNpb246IDEwMCxcbiAgfSxcbiAgdGltaW5nOiB7XG4gICAgZHVyYXRpb246IDE1MCxcbiAgICBlYXNpbmc6IEVhc2luZy5pbk91dChFYXNpbmcuZWFzZSksXG4gICAgZGVsYXk6IDAsXG4gIH0sXG59O1xuXG50eXBlIEJvdW5kZWRWYWx1ZSA9IHtcbiAgdmFsdWU/OiBudW1iZXI7XG4gIG1heFZhbHVlPzogbnVtYmVyO1xuICBtaW5WYWx1ZT86IG51bWJlcjtcbn07XG5cbmNvbnN0IGdldEJvdW5kZWRWYWx1ZSA9ICh7IHZhbHVlLCBtYXhWYWx1ZSwgbWluVmFsdWUgfTogQm91bmRlZFZhbHVlKSA9PlxuICB2YWx1ZSEgPiBtYXhWYWx1ZSEgPyBtYXhWYWx1ZSA6IHZhbHVlISA8IG1pblZhbHVlISA/IG1pblZhbHVlIDogdmFsdWU7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVjdFByb3BzIHtcbiAgd2lkdGg6IG51bWJlcjtcbiAgaGVpZ2h0OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2xpZGVyUHJvcHMgZXh0ZW5kcyBWaWV3UHJvcHMge1xuICB2YWx1ZT86IG51bWJlcjtcbiAgc3RlcD86IG51bWJlcjtcbiAgbWF4VmFsdWU/OiBudW1iZXI7XG4gIG1pblZhbHVlPzogbnVtYmVyO1xuICAvKipcbiAgICog5YC85Li6IGB0cnVlYCDml7bvvIxTbGlkZXIg5Li65Z6C55u05pa55ZCRXG4gICAqL1xuICB2ZXJ0aWNhbD86IGJvb2xlYW47XG4gIC8qKlxuICAgKiDmmK/lkKbnpoHnlKhcbiAgICovXG4gIGRpc2FibGVkPzogYm9vbGVhbjtcbiAgc2hvd25UaHVtYj86IGJvb2xlYW47XG4gIHRodW1iU2l6ZT86IFJlY3RQcm9wcztcbiAgYW5pbWF0aW9uVHlwZT86IGtleW9mIHR5cGVvZiBERUZBVUxUX0FOSU1BVElPTl9DT05GSUdTO1xuICBtYXhpbXVtVHJhY2tUaW50Q29sb3I/OiBzdHJpbmc7XG4gIG1pbmltdW1UcmFja1RpbnRDb2xvcj86IHN0cmluZztcbiAgdGh1bWJUaW50Q29sb3I/OiBzdHJpbmc7XG4gIHRyYWNrU3R5bGU/OiBWaWV3U3R5bGU7XG4gIHRodW1iU3R5bGU/OiBWaWV3U3R5bGU7XG4gIGFuaW1hdGVUcmFuc2l0aW9ucz86IGJvb2xlYW47XG4gIGFuaW1hdGlvbkNvbmZpZz86IEFuaW1hdGVkLlNwcmluZ0FuaW1hdGlvbkNvbmZpZztcbiAgb25DaGFuZ2U/OiAodmFsdWU6IG51bWJlcikgPT4gdm9pZDtcbiAgb25TbGlkaW5nQ29tcGxldGU/OiAodmFsdWU6IG51bWJlcikgPT4gdm9pZDtcbiAgb25TbGlkaW5nU3RhcnQ/OiAodmFsdWU6IG51bWJlcikgPT4gdm9pZDtcbn1cbmV4cG9ydCBpbnRlcmZhY2UgU2xpZGVyU3RhdGUge1xuICBjb250YWluZXJTaXplOiBSZWN0UHJvcHM7XG4gIHRyYWNrU2l6ZTogUmVjdFByb3BzO1xuICB0aHVtYlNpemU6IFJlY3RQcm9wcztcbiAgdmFsdWU6IEFuaW1hdGVkLlZhbHVlO1xufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTbGlkZXIgZXh0ZW5kcyBDb21wb25lbnQ8U2xpZGVyUHJvcHMsIFNsaWRlclN0YXRlPiB7XG4gIHBhblJlc3BvbmRlcjogUGFuUmVzcG9uZGVySW5zdGFuY2U7XG4gIF9wcmV2aW91c0xlZnQ6IG51bWJlciA9IDA7XG4gIHN0YXRpYyBkZWZhdWx0UHJvcHMgPSB7XG4gICAgdmFsdWU6IDAsXG4gICAgc3RlcDogMCxcbiAgICBtYXhWYWx1ZTogMSxcbiAgICBtaW5WYWx1ZTogMCxcbiAgICBoZWlnaHQ6IDYsXG4gICAgdmVydGljYWw6IGZhbHNlLFxuICAgIHNob3duVGh1bWI6IHRydWUsXG4gICAgdGh1bWJTaXplOiB7IHdpZHRoOiAyMCwgaGVpZ2h0OiAyMCB9LFxuICAgIG1heGltdW1UcmFja1RpbnRDb2xvcjogJyNjYWNhY2EnLFxuICAgIG1pbmltdW1UcmFja1RpbnRDb2xvcjogJyMwMDhFRjAnLFxuICAgIHRodW1iVGludENvbG9yOiAnI2ZmZicsXG4gICAgYW5pbWF0aW9uVHlwZTogJ3RpbWluZycsXG4gICAgb25DaGFuZ2U6ICgpID0+IHt9LFxuICAgIG9uU2xpZGluZ0NvbXBsZXRlOiAoKSA9PiB7fSxcbiAgICBvblNsaWRpbmdTdGFydDogKCkgPT4ge30sXG4gIH07XG4gIGNvbnN0cnVjdG9yKHByb3BzOiBTbGlkZXJQcm9wcykge1xuICAgIHN1cGVyKHByb3BzKTtcbiAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgY29udGFpbmVyU2l6ZTogeyB3aWR0aDogMCwgaGVpZ2h0OiAwIH0sXG4gICAgICB0cmFja1NpemU6IHsgd2lkdGg6IDAsIGhlaWdodDogMCB9LFxuICAgICAgdGh1bWJTaXplOiBwcm9wcy50aHVtYlNpemUgfHwgeyB3aWR0aDogMCwgaGVpZ2h0OiAwIH0sXG4gICAgICB2YWx1ZTogbmV3IEFuaW1hdGVkLlZhbHVlKGdldEJvdW5kZWRWYWx1ZShwcm9wcykgYXMgbnVtYmVyKSxcbiAgICB9O1xuICAgIHRoaXMucGFuUmVzcG9uZGVyID0gUGFuUmVzcG9uZGVyLmNyZWF0ZSh7XG4gICAgICBvblBhblJlc3BvbmRlclRlcm1pbmF0aW9uUmVxdWVzdDogKCkgPT4gZmFsc2UsXG4gICAgICBvblN0YXJ0U2hvdWxkU2V0UGFuUmVzcG9uZGVyOiAoKSA9PiB0cnVlLFxuICAgICAgb25TdGFydFNob3VsZFNldFBhblJlc3BvbmRlckNhcHR1cmU6ICgpID0+IHRydWUsXG4gICAgICBvbk1vdmVTaG91bGRTZXRQYW5SZXNwb25kZXI6ICgpID0+IGZhbHNlLFxuICAgICAgb25QYW5SZXNwb25kZXJHcmFudDogdGhpcy5oYW5kbGVQYW5SZXNwb25kZXJHcmFudCxcbiAgICAgIG9uUGFuUmVzcG9uZGVyTW92ZTogdGhpcy5oYW5kbGVQYW5SZXNwb25kZXJNb3ZlLFxuICAgICAgb25QYW5SZXNwb25kZXJSZWxlYXNlOiB0aGlzLmhhbmRsZVBhblJlc3BvbmRlckVuZCxcbiAgICAgIG9uUGFuUmVzcG9uZGVyVGVybWluYXRlOiB0aGlzLmhhbmRsZVBhblJlc3BvbmRlckVuZCxcbiAgICB9KTtcbiAgfVxuICBjb21wb25lbnREaWRVcGRhdGUocHJldlByb3BzOiBTbGlkZXJQcm9wcykge1xuICAgIGNvbnN0IG5ld1ZhbHVlID0gZ2V0Qm91bmRlZFZhbHVlKHRoaXMucHJvcHMpO1xuXG4gICAgaWYgKHByZXZQcm9wcy52YWx1ZSAhPT0gbmV3VmFsdWUpIHtcbiAgICAgIGlmICh0aGlzLnByb3BzLmFuaW1hdGVUcmFuc2l0aW9ucykge1xuICAgICAgICB0aGlzLnNldEN1cnJlbnRWYWx1ZUFuaW1hdGVkKG5ld1ZhbHVlISk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnNldEN1cnJlbnRWYWx1ZShuZXdWYWx1ZSEpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHNldEN1cnJlbnRWYWx1ZSh2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5zdGF0ZS52YWx1ZS5zZXRWYWx1ZSh2YWx1ZSk7XG4gIH1cblxuICBzZXRDdXJyZW50VmFsdWVBbmltYXRlZCh2YWx1ZTogbnVtYmVyKSB7XG4gICAgY29uc3QgeyBhbmltYXRpb25UeXBlIH0gPSB0aGlzLnByb3BzO1xuICAgIGlmICghYW5pbWF0aW9uVHlwZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBhbmltYXRpb25Db25maWc6IEFuaW1hdGVkLlNwcmluZ0FuaW1hdGlvbkNvbmZpZyA9IE9iamVjdC5hc3NpZ24oXG4gICAgICB7fSxcbiAgICAgIERFRkFVTFRfQU5JTUFUSU9OX0NPTkZJR1NbYW5pbWF0aW9uVHlwZV0sXG4gICAgICB0aGlzLnByb3BzLmFuaW1hdGlvbkNvbmZpZyxcbiAgICAgIHtcbiAgICAgICAgdG9WYWx1ZTogdmFsdWUsXG4gICAgICB9LFxuICAgICk7XG5cbiAgICBBbmltYXRlZFthbmltYXRpb25UeXBlXSh0aGlzLnN0YXRlLnZhbHVlLCBhbmltYXRpb25Db25maWcpLnN0YXJ0KCk7XG4gIH1cbiAgZ2V0VGh1bWJMZWZ0KHZhbHVlOiBudW1iZXIpIHtcbiAgICBjb25zdCByYXRpbyA9ICh2YWx1ZSAtIHRoaXMucHJvcHMubWluVmFsdWUhKSAvICh0aGlzLnByb3BzLm1heFZhbHVlISAtIHRoaXMucHJvcHMubWluVmFsdWUhKTtcbiAgICByZXR1cm4gcmF0aW8gKiAodGhpcy5zdGF0ZS5jb250YWluZXJTaXplLndpZHRoIC0gdGhpcy5zdGF0ZS50aHVtYlNpemUud2lkdGgpO1xuICB9XG4gIGdldEN1cnJlbnRWYWx1ZSA9ICgpID0+ICh0aGlzLnN0YXRlLnZhbHVlIGFzIGFueSkuX19nZXRWYWx1ZSgpO1xuICBoYW5kbGVQYW5SZXNwb25kZXJHcmFudCA9ICgpID0+IHtcbiAgICBpZiAodGhpcy5wcm9wcy5kaXNhYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLl9wcmV2aW91c0xlZnQgPSB0aGlzLmdldFRodW1iTGVmdCh0aGlzLmdldEN1cnJlbnRWYWx1ZSgpKTtcbiAgICB0aGlzLnByb3BzLm9uU2xpZGluZ1N0YXJ0ISh0aGlzLmdldEN1cnJlbnRWYWx1ZSgpKTtcbiAgfTtcbiAgaGFuZGxlUGFuUmVzcG9uZGVyRW5kID0gKCkgPT4ge1xuICAgIGlmICh0aGlzLnByb3BzLmRpc2FibGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMucHJvcHMub25TbGlkaW5nQ29tcGxldGUhKHRoaXMuZ2V0Q3VycmVudFZhbHVlKCkpO1xuICB9O1xuICBoYW5kbGVQYW5SZXNwb25kZXJNb3ZlID0gKF86IGFueSwgZ2VzdHVyZVN0YXRlOiBQYW5SZXNwb25kZXJHZXN0dXJlU3RhdGUpID0+IHtcbiAgICBpZiAodGhpcy5wcm9wcy5kaXNhYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZ2V0VmFsdWUoZ2VzdHVyZVN0YXRlKTtcbiAgICB0aGlzLnN0YXRlLnZhbHVlLnNldFZhbHVlKHZhbHVlKTtcbiAgICB0aGlzLnByb3BzLm9uQ2hhbmdlISh0aGlzLmdldEN1cnJlbnRWYWx1ZSgpKTtcbiAgfTtcbiAgZ2V0VmFsdWUoZ2VzdHVyZVN0YXRlOiBQYW5SZXNwb25kZXJHZXN0dXJlU3RhdGUpIHtcbiAgICBjb25zdCB7IHZlcnRpY2FsLCBtaW5WYWx1ZSwgbWF4VmFsdWUgfSA9IHRoaXMucHJvcHM7XG4gICAgY29uc3QgbGVuZ3RoID0gdGhpcy5zdGF0ZS5jb250YWluZXJTaXplLndpZHRoIC0gdGhpcy5zdGF0ZS50aHVtYlNpemUud2lkdGg7XG4gICAgY29uc3QgdGh1bWJMZWZ0ID0gdGhpcy5fcHJldmlvdXNMZWZ0ICsgKHZlcnRpY2FsID8gZ2VzdHVyZVN0YXRlLmR5IDogZ2VzdHVyZVN0YXRlLmR4KTtcbiAgICBjb25zdCByYXRpbyA9IHRodW1iTGVmdCAvIGxlbmd0aDtcbiAgICBpZiAodGhpcy5wcm9wcy5zdGVwKSB7XG4gICAgICByZXR1cm4gTWF0aC5tYXgoXG4gICAgICAgIG1pblZhbHVlISxcbiAgICAgICAgTWF0aC5taW4oXG4gICAgICAgICAgbWF4VmFsdWUhLFxuICAgICAgICAgIG1pblZhbHVlISArIE1hdGgucm91bmQoKHJhdGlvICogKG1heFZhbHVlISAtIG1pblZhbHVlISkpIC8gdGhpcy5wcm9wcy5zdGVwKSAqIHRoaXMucHJvcHMuc3RlcCxcbiAgICAgICAgKSxcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBNYXRoLm1heChtaW5WYWx1ZSEsIE1hdGgubWluKG1heFZhbHVlISwgcmF0aW8gKiAobWF4VmFsdWUhIC0gbWluVmFsdWUhKSArIG1pblZhbHVlISkpO1xuICB9XG5cbiAgaGFuZGxlTWVhc3VyZShuYW1lOiBzdHJpbmcsIGV2ZW50OiBMYXlvdXRDaGFuZ2VFdmVudCkge1xuICAgIGNvbnN0IHsgd2lkdGg6IGxheW91dFdpZHRoLCBoZWlnaHQ6IGxheW91dEhlaWdodCB9ID0gZXZlbnQubmF0aXZlRXZlbnQubGF5b3V0O1xuICAgIGNvbnN0IHsgdmVydGljYWwgfSA9IHRoaXMucHJvcHM7XG4gICAgY29uc3QgeyBjb250YWluZXJTaXplLCB0cmFja1NpemUsIHRodW1iU2l6ZSB9ID0gdGhpcy5zdGF0ZTtcbiAgICBjb25zdCB3aWR0aCA9IHZlcnRpY2FsID8gbGF5b3V0SGVpZ2h0IDogbGF5b3V0V2lkdGg7XG4gICAgY29uc3QgaGVpZ2h0ID0gdmVydGljYWwgPyBsYXlvdXRXaWR0aCA6IGxheW91dEhlaWdodDtcbiAgICBjb25zdCBzaXplID0geyB3aWR0aCwgaGVpZ2h0IH07XG4gICAgY29uc3Qgc3RhdGUgPSB7IGNvbnRhaW5lclNpemUsIHRyYWNrU2l6ZSwgdGh1bWJTaXplIH07XG4gICAgaWYgKHN0YXRlW25hbWUgYXMga2V5b2YgdHlwZW9mIHN0YXRlXSkge1xuICAgICAgc3RhdGVbbmFtZSBhcyBrZXlvZiB0eXBlb2Ygc3RhdGVdID0gc2l6ZTtcbiAgICB9XG4gICAgdGhpcy5zZXRTdGF0ZSh7IC4uLnN0YXRlIH0pO1xuICB9XG4gIG1lYXN1cmVDb250YWluZXIgPSAoZXZlbnQ6IExheW91dENoYW5nZUV2ZW50KSA9PiB0aGlzLmhhbmRsZU1lYXN1cmUoJ2NvbnRhaW5lclNpemUnLCBldmVudCk7XG4gIG1lYXN1cmVUaHVtYiA9IChldmVudDogTGF5b3V0Q2hhbmdlRXZlbnQpID0+IHRoaXMuaGFuZGxlTWVhc3VyZSgndGh1bWJTaXplJywgZXZlbnQpO1xuICBnZXRNaW5pbXVtVHJhY2tTdHlsZXModGh1bWJTdGFydDogQW5pbWF0ZWQuQW5pbWF0ZWRJbnRlcnBvbGF0aW9uKSB7XG4gICAgY29uc3QgeyB0aHVtYlNpemUsIHRyYWNrU2l6ZSB9ID0gdGhpcy5zdGF0ZTtcbiAgICBjb25zdCBtaW5pbXVtVHJhY2tTdHlsZToge1xuICAgICAgcG9zaXRpb246IFZpZXdTdHlsZVsncG9zaXRpb24nXTtcbiAgICAgIGhlaWdodD86IEFuaW1hdGVkLkFuaW1hdGVkQWRkaXRpb247XG4gICAgICB3aWR0aD86IEFuaW1hdGVkLkFuaW1hdGVkQWRkaXRpb247XG4gICAgICBtYXJnaW5MZWZ0PzogVmlld1N0eWxlWydtYXJnaW5MZWZ0J107XG4gICAgICBtYXJnaW5Ub3A/OiBWaWV3U3R5bGVbJ21hcmdpblRvcCddO1xuICAgIH0gPSB7IHBvc2l0aW9uOiAnYWJzb2x1dGUnIH07XG5cbiAgICBpZiAodGhpcy5wcm9wcy52ZXJ0aWNhbCkge1xuICAgICAgbWluaW11bVRyYWNrU3R5bGUuaGVpZ2h0ID0gQW5pbWF0ZWQuYWRkKHRodW1iU3RhcnQsIHRodW1iU2l6ZS5oZWlnaHQgLyAyKTtcbiAgICAgIG1pbmltdW1UcmFja1N0eWxlLm1hcmdpbkxlZnQgPSAtdHJhY2tTaXplLndpZHRoO1xuICAgIH0gZWxzZSB7XG4gICAgICBtaW5pbXVtVHJhY2tTdHlsZS53aWR0aCA9IEFuaW1hdGVkLmFkZCh0aHVtYlN0YXJ0LCB0aHVtYlNpemUud2lkdGggLyAyKTtcbiAgICAgIG1pbmltdW1UcmFja1N0eWxlLm1hcmdpblRvcCA9IC10cmFja1NpemUuaGVpZ2h0O1xuICAgIH1cbiAgICByZXR1cm4gbWluaW11bVRyYWNrU3R5bGU7XG4gIH1cbiAgZ2V0VGh1bWJQb3NpdGlvblN0eWxlcyh0aHVtYlN0YXJ0OiBBbmltYXRlZC5BbmltYXRlZEludGVycG9sYXRpb24pIHtcbiAgICBpZiAodGhpcy5wcm9wcy52ZXJ0aWNhbCkge1xuICAgICAgcmV0dXJuIFtcbiAgICAgICAge1xuICAgICAgICAgIHRyYW5zbGF0ZVg6IC0odGhpcy5zdGF0ZS50cmFja1NpemUuaGVpZ2h0ICsgdGhpcy5zdGF0ZS50aHVtYlNpemUuaGVpZ2h0KSAvIDIsXG4gICAgICAgIH0sXG4gICAgICAgIHsgdHJhbnNsYXRlWTogdGh1bWJTdGFydCB9LFxuICAgICAgXTtcbiAgICB9XG4gICAgcmV0dXJuIFtcbiAgICAgIHsgdHJhbnNsYXRlWDogdGh1bWJTdGFydCB9LFxuICAgICAge1xuICAgICAgICB0cmFuc2xhdGVZOiAtKHRoaXMuc3RhdGUudHJhY2tTaXplLmhlaWdodCArIHRoaXMuc3RhdGUudGh1bWJTaXplLmhlaWdodCkgLyAyLFxuICAgICAgfSxcbiAgICBdO1xuICB9XG4gIHJlbmRlcigpIHtcbiAgICBjb25zdCB7XG4gICAgICBzdHlsZSxcbiAgICAgIHZlcnRpY2FsLFxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgc3RlcCxcbiAgICAgIG1heFZhbHVlLFxuICAgICAgbWluVmFsdWUsXG4gICAgICBkaXNhYmxlZCxcbiAgICAgIHNob3duVGh1bWIsXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICBhbmltYXRpb25UeXBlLFxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgYW5pbWF0ZVRyYW5zaXRpb25zLFxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgYW5pbWF0aW9uQ29uZmlnLFxuICAgICAgdHJhY2tTdHlsZSxcbiAgICAgIHRodW1iU3R5bGUsXG4gICAgICBtaW5pbXVtVHJhY2tUaW50Q29sb3IsXG4gICAgICBtYXhpbXVtVHJhY2tUaW50Q29sb3IsXG4gICAgICB0aHVtYlRpbnRDb2xvcixcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgIG9uQ2hhbmdlLFxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgICAgb25TbGlkaW5nQ29tcGxldGUsXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gICAgICBvblNsaWRpbmdTdGFydCxcbiAgICAgIC4uLm90aGVyUHJvcHNcbiAgICB9ID0gdGhpcy5wcm9wcztcbiAgICBjb25zdCB7IHZhbHVlLCB0aHVtYlNpemUsIGNvbnRhaW5lclNpemUgfSA9IHRoaXMuc3RhdGU7XG4gICAgY29uc3QgdG91Y2hPdmVyZmxvd1N0eWxlID0ge30gYXMgVmlld1N0eWxlO1xuICAgIGNvbnN0IHRodW1iU3RhcnQgPSB2YWx1ZS5pbnRlcnBvbGF0ZSh7XG4gICAgICBpbnB1dFJhbmdlOiBbbWluVmFsdWUhLCBtYXhWYWx1ZSFdLFxuICAgICAgb3V0cHV0UmFuZ2U6IFswLCBjb250YWluZXJTaXplLndpZHRoIC0gdGh1bWJTaXplLndpZHRoXSxcbiAgICAgIC8vIGV4dHJhcG9sYXRlOiAnY2xhbXAnLFxuICAgIH0pO1xuICAgIGNvbnN0IG1pbmltdW1UcmFja1N0eWxlID0ge1xuICAgICAgLi4udGhpcy5nZXRNaW5pbXVtVHJhY2tTdHlsZXModGh1bWJTdGFydCksXG4gICAgICBiYWNrZ3JvdW5kQ29sb3I6IGRpc2FibGVkID8gJyNhMGE1YjEnIDogbWluaW11bVRyYWNrVGludENvbG9yLFxuICAgIH07XG4gICAgY29uc3QgdmFsdWVWaXNpYmxlU3R5bGUgPSB7fTtcbiAgICBjb25zdCB0aHVtYlN0eWxlVHJhbnNmb3JtID0gKHRodW1iU3R5bGUgJiYgKHRodW1iU3R5bGUgYXMgVHJhbnNmb3Jtc1N0eWxlKS50cmFuc2Zvcm0pIHx8IFtdO1xuICAgIGNvbnN0IHRodW1iVHJhY2tTdHlsZSA9IHt9IGFzIFZpZXdTdHlsZTtcbiAgICBpZiAodmVydGljYWwpIHtcbiAgICAgIHRodW1iVHJhY2tTdHlsZS5sZWZ0ID0gMTYgKyAodHJhY2tTdHlsZSAmJiB0cmFja1N0eWxlLndpZHRoID8gKCh0cmFja1N0eWxlLndpZHRoIGFzIG51bWJlcikgLSA0KSAvIDIgOiAwKTtcbiAgICAgIHRvdWNoT3ZlcmZsb3dTdHlsZS5oZWlnaHQgPSAnMTAwJSc7XG4gICAgICB0b3VjaE92ZXJmbG93U3R5bGUud2lkdGggPSAzMDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGh1bWJUcmFja1N0eWxlLnRvcCA9IDE2ICsgKHRyYWNrU3R5bGUgJiYgdHJhY2tTdHlsZS5oZWlnaHQgPyAoKHRyYWNrU3R5bGUuaGVpZ2h0IGFzIG51bWJlcikgLSA0KSAvIDIgOiAwKTtcbiAgICAgIHRvdWNoT3ZlcmZsb3dTdHlsZS5oZWlnaHQgPSAzMDtcbiAgICB9XG4gICAgcmV0dXJuIChcbiAgICAgIDxWaWV3XG4gICAgICAgIG9uTGF5b3V0PXt0aGlzLm1lYXN1cmVDb250YWluZXJ9XG4gICAgICAgIHsuLi5vdGhlclByb3BzfVxuICAgICAgICBzdHlsZT17U3R5bGVTaGVldC5mbGF0dGVuKFt2ZXJ0aWNhbCA/IHN0eWxlcy5jb250YWluZXJWZXJ0aWNhbCA6IHN0eWxlcy5jb250YWluZXJIb3Jpem9udGFsLCBzdHlsZV0pfVxuICAgICAgPlxuICAgICAgICA8Vmlld1xuICAgICAgICAgIHN0eWxlPXtTdHlsZVNoZWV0LmZsYXR0ZW4oW1xuICAgICAgICAgICAgc3R5bGVzLnRyYWNrLFxuICAgICAgICAgICAgdmVydGljYWwgPyB7IC4uLnN0eWxlcy50cmFja1ZlcnRpY2FsLCBoZWlnaHQ6ICcxMDAlJyB9IDogeyAuLi5zdHlsZXMudHJhY2tIb3Jpem9udGFsLCB3aWR0aDogJzEwMCUnIH0sXG4gICAgICAgICAgICB0cmFja1N0eWxlLFxuICAgICAgICAgICAgeyBiYWNrZ3JvdW5kQ29sb3I6IG1heGltdW1UcmFja1RpbnRDb2xvciwgcG9zaXRpb246ICdhYnNvbHV0ZScgfSxcbiAgICAgICAgICBdKX1cbiAgICAgICAgLz5cbiAgICAgICAgPEFuaW1hdGVkLlZpZXdcbiAgICAgICAgICBzdHlsZT17U3R5bGVTaGVldC5mbGF0dGVuKFtcbiAgICAgICAgICAgIHN0eWxlcy50cmFjayxcbiAgICAgICAgICAgIHZlcnRpY2FsID8gc3R5bGVzLnRyYWNrVmVydGljYWwgOiBzdHlsZXMudHJhY2tIb3Jpem9udGFsLFxuICAgICAgICAgICAgdHJhY2tTdHlsZSxcbiAgICAgICAgICAgIG1pbmltdW1UcmFja1N0eWxlLFxuICAgICAgICAgIF0pfVxuICAgICAgICAvPlxuICAgICAgICB7c2hvd25UaHVtYiAmJiAoXG4gICAgICAgICAgPEFuaW1hdGVkLlZpZXdcbiAgICAgICAgICAgIG9uTGF5b3V0PXt0aGlzLm1lYXN1cmVUaHVtYn1cbiAgICAgICAgICAgIHN0eWxlPXtTdHlsZVNoZWV0LmZsYXR0ZW4oW1xuICAgICAgICAgICAgICB7IGJhY2tncm91bmRDb2xvcjogdGh1bWJUaW50Q29sb3IgfSxcbiAgICAgICAgICAgICAgc3R5bGVzLnRodW1iLFxuICAgICAgICAgICAgICB0aHVtYlRyYWNrU3R5bGUsXG4gICAgICAgICAgICAgIHRodW1iU3R5bGUsXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB0cmFuc2Zvcm06IFsuLi50aGlzLmdldFRodW1iUG9zaXRpb25TdHlsZXModGh1bWJTdGFydCksIC4uLnRodW1iU3R5bGVUcmFuc2Zvcm1dLFxuICAgICAgICAgICAgICAgIC4uLnZhbHVlVmlzaWJsZVN0eWxlLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSl9XG4gICAgICAgICAgLz5cbiAgICAgICAgKX1cbiAgICAgICAgPFZpZXcgc3R5bGU9e1N0eWxlU2hlZXQuZmxhdHRlbihbc3R5bGVzLnRvdWNoQXJlYSwgdG91Y2hPdmVyZmxvd1N0eWxlXSl9IHsuLi50aGlzLnBhblJlc3BvbmRlci5wYW5IYW5kbGVyc30gLz5cbiAgICAgIDwvVmlldz5cbiAgICApO1xuICB9XG59XG5cbmNvbnN0IHN0eWxlcyA9IFN0eWxlU2hlZXQuY3JlYXRlKHtcbiAgY29udGFpbmVySG9yaXpvbnRhbDoge1xuICAgIGhlaWdodDogMzAsXG4gICAganVzdGlmeUNvbnRlbnQ6ICdjZW50ZXInLFxuICB9LFxuICBjb250YWluZXJWZXJ0aWNhbDoge1xuICAgIHdpZHRoOiAzMCxcbiAgICBmbGV4RGlyZWN0aW9uOiAnY29sdW1uJyxcbiAgICBhbGlnbkl0ZW1zOiAnY2VudGVyJyxcbiAgfSxcbiAgdHJhY2s6IHtcbiAgICBib3JkZXJSYWRpdXM6IFRSQUNLX1NJWkUgLyAyLFxuICB9LFxuICB0cmFja0hvcml6b250YWw6IHtcbiAgICBoZWlnaHQ6IFRSQUNLX1NJWkUsXG4gIH0sXG4gIHRyYWNrVmVydGljYWw6IHtcbiAgICBmbGV4OiAxLFxuICAgIHdpZHRoOiBUUkFDS19TSVpFLFxuICB9LFxuICB0aHVtYjoge1xuICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuICAgIHdpZHRoOiBUSFVNQl9TSVpFLFxuICAgIGhlaWdodDogVEhVTUJfU0laRSxcbiAgICBib3JkZXJSYWRpdXM6IFRIVU1CX1NJWkUgLyAyLFxuICB9LFxuICB0b3VjaEFyZWE6IHtcbiAgICBiYWNrZ3JvdW5kQ29sb3I6ICd0cmFuc3BhcmVudCcsXG4gIH0sXG59KTtcbiJdfQ==