UNPKG

focus-components-v3

Version:

Focus web components to build applications (based on Material Design)

291 lines (227 loc) 28.1 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; var _dec, _class; var _react = require('react'); var _react2 = _interopRequireDefault(_react); var _reactDom = require('react-dom'); var _reactDom2 = _interopRequireDefault(_reactDom); var _i18next = require('i18next'); var _i18next2 = _interopRequireDefault(_i18next); var _material = require('../behaviours/material'); var _material2 = _interopRequireDefault(_material); var _inputComponent = require('../behaviours/input-component'); var _debounce = require('lodash/debounce'); var _debounce2 = _interopRequireDefault(_debounce); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _defaults(obj, defaults) { var keys = Object.getOwnPropertyNames(defaults); for (var i = 0; i < keys.length; i++) { var key = keys[i]; var value = Object.getOwnPropertyDescriptor(defaults, key); if (value && value.configurable && obj[key] === undefined) { Object.defineProperty(obj, key, value); } } return obj; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : _defaults(subClass, superClass); } var AutocompleteTextEdit = (_dec = (0, _material2.default)('materialInput'), _dec(_class = (0, _inputComponent.InputBehaviour)(_class = function (_Component) { _inherits(AutocompleteTextEdit, _Component); function AutocompleteTextEdit(props) { _classCallCheck(this, AutocompleteTextEdit); var _this = _possibleConstructorReturn(this, _Component.call(this, props)); _this.getValue = function () { var inputValue = _this.state.inputValue; if (inputValue !== undefined) { return inputValue; } else { return null; } }; _this._querySearcher = function (value) { var querySearcher = _this.props.querySearcher; var hasSuggestions = _this.state.hasSuggestions; querySearcher(value).then(function (_ref) { var data = _ref.data, totalCount = _ref.totalCount; if (totalCount > 0) { _this.setState({ hasSuggestions: true, suggestions: data, error: '' }); } _this.refs.loader.classList.remove('mdl-progress__indeterminate'); _this.setState({ isLoading: false }); }).catch(function (err) { _this.refs.loader.classList.remove('mdl-progress__indeterminate'); _this.setState({ error: JSON.stringify(err), isLoading: false }); _this.refs.materialInput.classList.add('is-invalid'); }); }; _this._handleonChange = function (_ref2) { var value = _ref2.target.value; var onChange = _this.props.onChange; _this.setState({ inputValue: value }); if (value.trim() == '') { _this.setState({ hasSuggestions: false }); } else { _this.refs.loader.classList.add('mdl-progress__indeterminate'); _this.setState({ isLoading: true }); _this._debouncedQuerySearcher(value); if (onChange) onChange(value); } }; _this.renderSuggestions = function () { var suggestions = _this.state.suggestions; var allSuggestions = suggestions.map(function (_ref3) { var key = _ref3.key, label = _ref3.label; return _react2.default.createElement( 'li', { key: key, onMouseDown: function onMouseDown(e) { _this.onResultClick(label);e.preventDefault(); }, 'data-focus': 'option' }, label ); }); return _react2.default.createElement( 'ul', { ref: 'suggestions', 'data-focus': 'options' }, allSuggestions ); }; _this._handleonFocus = function (e) { var _this$state = _this.state, hasSuggestions = _this$state.hasSuggestions, hasFocus = _this$state.hasFocus; var _this$props = _this.props, showAtFocus = _this$props.showAtFocus, emptyShowAll = _this$props.emptyShowAll; _this.setState({ hasFocus: !_this.state.hasFocus }); if (hasSuggestions && !showAtFocus && hasFocus === false) { _this.setState({ hasSuggestions: false }); } if (!hasSuggestions && e.target.value.trim() === '' && emptyShowAll && hasFocus === false) { // Doing a global search here _this._querySearcher(''); } return true; }; _this.state = { inputValue: _this.props.rawInputValue, suggestions: [], hasSuggestions: false, error: _this.props.error, hasFocus: false, isLoading: false }; return _this; } AutocompleteTextEdit.prototype.componentWillReceiveProps = function componentWillReceiveProps(_ref4) { var error = _ref4.error; if (error) { this.setState({ error: error }); } }; AutocompleteTextEdit.prototype.componentDidMount = function componentDidMount() { var inputTimeout = this.props.inputTimeout; this._debouncedQuerySearcher = (0, _debounce2.default)(this._querySearcher, inputTimeout); }; // Returns the state's inputValue // Gets the defined props' querySearch and returns the object given by the promise // Sets the hasSuggestions' state if the given object has a none empty array // Sets the state's inputValue when the user is typing // Sets the value input with the selected suggestion and hides the dropdown AutocompleteTextEdit.prototype.onResultClick = function onResultClick(value) { var onChange = this.props.onChange; this.refs.inputText.value = value; this.setState({ inputValue: value, hasSuggestions: false, suggestions: [] }); if (onChange) onChange(value); return value; }; // Returns an html list whith the Suggestions // Behaviour when onFocus and onBlur are triggered // Maybe give the option for the floating label AutocompleteTextEdit.prototype.render = function render() { var _state = this.state, inputValue = _state.inputValue, hasSuggestions = _state.hasSuggestions, hasFocus = _state.hasFocus, isLoading = _state.isLoading; var validInputProps = this._checkProps(this.props); var _props = this.props, inputTimeout = _props.inputTimeout, error = _props.error, placeholder = _props.placeholder; validInputProps.value = inputValue === undefined || inputValue === null ? '' : inputValue; validInputProps.onBlur = this._handleonFocus; var inputProps = _extends({}, validInputProps); return _react2.default.createElement( 'div', { 'data-focus': 'autocompleteText' }, _react2.default.createElement( 'div', { className: 'mdl-textfield mdl-js-textfield' + (error ? ' is-invalid' : ''), ref: 'materialInput' }, _react2.default.createElement('div', { 'data-focus': 'loading', 'data-loading': isLoading, className: 'mdl-progress mdl-js-progress', ref: 'loader' }), _react2.default.createElement('input', _extends({ className: 'mdl-textfield__input', type: 'text', ref: 'inputText' }, inputProps)), _react2.default.createElement( 'label', { className: 'mdl-textfield__label' }, _i18next2.default.t(placeholder) ), _react2.default.createElement( 'span', { className: 'mdl-textfield__error', ref: 'errorMessage' }, _i18next2.default.t(error) ) ), hasSuggestions && hasFocus && this.renderSuggestions() ); }; return AutocompleteTextEdit; }(_react.Component)) || _class) || _class); AutocompleteTextEdit.displayName = 'AutocompleteTextEdit'; AutocompleteTextEdit.defaultProps = { emptyShowAll: false, inputTimeout: 200, placeholder: 'Search here...', showAtFocus: false }; AutocompleteTextEdit.propTypes = { emptyShowAll: _react.PropTypes.bool, //Defines if it shows suggestions on focus when the input is empty. error: _react.PropTypes.string, //Error showed message. inputTimeout: _react.PropTypes.number.isRequired, //Timeout to execute the debounce function. onChange: _react.PropTypes.func, //Launches the querySearcher. placeholder: _react.PropTypes.string, //Placeholder field. querySearcher: _react.PropTypes.func.isRequired, //Returns a promise which is connected to the web service. rawInputValue: _react.PropTypes.string, //Field value. showAtFocus: _react.PropTypes.bool //Defines it shows suggestions on focus. }; exports.default = AutocompleteTextEdit; /* EXAMPLE const _querySearcher = query => { let data = [ { key: 'JL', label: 'Joh Lickeur' }, { key: 'GK', label: 'Guénolé Kikabou' }, { key: 'YL', label: 'Yannick Lounivis' } ]; return new Promise((resolve, reject) => { setTimeout(() => { resolve({ data, totalCount: data.length }); }, 500); }); }; <AutocompleteText isEdit={isEdit} querySearcher={_querySearcher} placeholder={'Your search...'} error{Something wrong happend. Retry please...} /> */ module.exports = exports['default']; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImZyLUZSLmpzIl0sIm5hbWVzIjpbIkF1dG9jb21wbGV0ZVRleHRFZGl0IiwicHJvcHMiLCJnZXRWYWx1ZSIsImlucHV0VmFsdWUiLCJzdGF0ZSIsInVuZGVmaW5lZCIsIl9xdWVyeVNlYXJjaGVyIiwicXVlcnlTZWFyY2hlciIsImhhc1N1Z2dlc3Rpb25zIiwidmFsdWUiLCJ0aGVuIiwiZGF0YSIsInRvdGFsQ291bnQiLCJzZXRTdGF0ZSIsInN1Z2dlc3Rpb25zIiwiZXJyb3IiLCJyZWZzIiwibG9hZGVyIiwiY2xhc3NMaXN0IiwicmVtb3ZlIiwiaXNMb2FkaW5nIiwiY2F0Y2giLCJKU09OIiwic3RyaW5naWZ5IiwiZXJyIiwibWF0ZXJpYWxJbnB1dCIsImFkZCIsIl9oYW5kbGVvbkNoYW5nZSIsInRhcmdldCIsIm9uQ2hhbmdlIiwidHJpbSIsIl9kZWJvdW5jZWRRdWVyeVNlYXJjaGVyIiwicmVuZGVyU3VnZ2VzdGlvbnMiLCJhbGxTdWdnZXN0aW9ucyIsIm1hcCIsImtleSIsImxhYmVsIiwiZSIsIm9uUmVzdWx0Q2xpY2siLCJwcmV2ZW50RGVmYXVsdCIsIl9oYW5kbGVvbkZvY3VzIiwiaGFzRm9jdXMiLCJzaG93QXRGb2N1cyIsImVtcHR5U2hvd0FsbCIsInJhd0lucHV0VmFsdWUiLCJjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzIiwiY29tcG9uZW50RGlkTW91bnQiLCJpbnB1dFRpbWVvdXQiLCJpbnB1dFRleHQiLCJyZW5kZXIiLCJ2YWxpZElucHV0UHJvcHMiLCJfY2hlY2tQcm9wcyIsInBsYWNlaG9sZGVyIiwib25CbHVyIiwiaW5wdXRQcm9wcyIsInQiLCJkaXNwbGF5TmFtZSIsImRlZmF1bHRQcm9wcyIsInByb3BUeXBlcyIsImJvb2wiLCJzdHJpbmciLCJudW1iZXIiLCJpc1JlcXVpcmVkIiwiZnVuYyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7OztBQUFBOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7O0FBQ0E7Ozs7Ozs7Ozs7Ozs7O0lBSU1BLG9CLFdBRkwsd0JBQVksZUFBWixDO2NBRUtBLG9COztBQUNGLGFBREVBLG9CQUNGLENBQVlDLEtBQVosRUFBbUI7QUFBQSw4QkFEakJELG9CQUNpQjs7QUFBQSxxREFDZixzQkFBTUMsS0FBTixDQURlOztBQUFBLGNBd0JuQkMsUUF4Qm1CLEdBd0JSLFlBQU87QUFBQSxnQkFDUEMsVUFETyxHQUNPLE1BQUtDLEtBRFosQ0FDUEQsVUFETzs7QUFFZCxnQkFBR0EsZUFBZUUsU0FBbEIsRUFBNkI7QUFDekIsdUJBQU9GLFVBQVA7QUFDSCxhQUZELE1BR0s7QUFDRCx1QkFBTyxJQUFQO0FBQ0g7QUFDSixTQWhDa0I7O0FBQUEsY0FvQ25CRyxjQXBDbUIsR0FvQ0YsaUJBQVM7QUFBQSxnQkFDZkMsYUFEZSxHQUNFLE1BQUtOLEtBRFAsQ0FDZk0sYUFEZTtBQUFBLGdCQUVmQyxjQUZlLEdBRUcsTUFBS0osS0FGUixDQUVmSSxjQUZlOzs7QUFJdEJELDBCQUFjRSxLQUFkLEVBQXFCQyxJQUFyQixDQUEwQixnQkFBd0I7QUFBQSxvQkFBdEJDLElBQXNCLFFBQXRCQSxJQUFzQjtBQUFBLG9CQUFoQkMsVUFBZ0IsUUFBaEJBLFVBQWdCOztBQUM5QyxvQkFBR0EsYUFBYSxDQUFoQixFQUFtQjtBQUNmLDBCQUFLQyxRQUFMLENBQWMsRUFBQ0wsZ0JBQWdCLElBQWpCLEVBQXVCTSxhQUFhSCxJQUFwQyxFQUEwQ0ksT0FBTyxFQUFqRCxFQUFkO0FBQ0g7QUFDRCxzQkFBS0MsSUFBTCxDQUFVQyxNQUFWLENBQWlCQyxTQUFqQixDQUEyQkMsTUFBM0IsQ0FBa0MsNkJBQWxDO0FBQ0Esc0JBQUtOLFFBQUwsQ0FBYyxFQUFDTyxXQUFXLEtBQVosRUFBZDtBQUNILGFBTkQsRUFNR0MsS0FOSCxDQU1TLGVBQU87QUFDWixzQkFBS0wsSUFBTCxDQUFVQyxNQUFWLENBQWlCQyxTQUFqQixDQUEyQkMsTUFBM0IsQ0FBa0MsNkJBQWxDO0FBQ0Esc0JBQUtOLFFBQUwsQ0FBYyxFQUFDRSxPQUFPTyxLQUFLQyxTQUFMLENBQWVDLEdBQWYsQ0FBUixFQUE2QkosV0FBVyxLQUF4QyxFQUFkO0FBQ0Esc0JBQUtKLElBQUwsQ0FBVVMsYUFBVixDQUF3QlAsU0FBeEIsQ0FBa0NRLEdBQWxDLENBQXNDLFlBQXRDO0FBQ0gsYUFWRDtBQVdILFNBbkRrQjs7QUFBQSxjQXNEbkJDLGVBdERtQixHQXNERCxpQkFBdUI7QUFBQSxnQkFBWmxCLEtBQVksU0FBckJtQixNQUFxQixDQUFabkIsS0FBWTtBQUFBLGdCQUM5Qm9CLFFBRDhCLEdBQ2xCLE1BQUs1QixLQURhLENBQzlCNEIsUUFEOEI7O0FBRXJDLGtCQUFLaEIsUUFBTCxDQUFjLEVBQUNWLFlBQVlNLEtBQWIsRUFBZDtBQUNBLGdCQUFHQSxNQUFNcUIsSUFBTixNQUFnQixFQUFuQixFQUF1QjtBQUNuQixzQkFBS2pCLFFBQUwsQ0FBYyxFQUFDTCxnQkFBZ0IsS0FBakIsRUFBZDtBQUNILGFBRkQsTUFHSztBQUNELHNCQUFLUSxJQUFMLENBQVVDLE1BQVYsQ0FBaUJDLFNBQWpCLENBQTJCUSxHQUEzQixDQUErQiw2QkFBL0I7QUFDQSxzQkFBS2IsUUFBTCxDQUFjLEVBQUNPLFdBQVcsSUFBWixFQUFkO0FBQ0Esc0JBQUtXLHVCQUFMLENBQTZCdEIsS0FBN0I7QUFDQSxvQkFBSW9CLFFBQUosRUFBY0EsU0FBU3BCLEtBQVQ7QUFDakI7QUFDSixTQWxFa0I7O0FBQUEsY0E4RW5CdUIsaUJBOUVtQixHQThFQyxZQUFNO0FBQUEsZ0JBQ2ZsQixXQURlLEdBQ0EsTUFBS1YsS0FETCxDQUNmVSxXQURlOztBQUV0QixnQkFBTW1CLGlCQUFpQm5CLFlBQVlvQixHQUFaLENBQWdCO0FBQUEsb0JBQUVDLEdBQUYsU0FBRUEsR0FBRjtBQUFBLG9CQUFPQyxLQUFQLFNBQU9BLEtBQVA7QUFBQSx1QkFBa0I7QUFBQTtBQUFBLHNCQUFJLEtBQUtELEdBQVQsRUFBYyxhQUFhLHFCQUFDRSxDQUFELEVBQU87QUFBQyxrQ0FBS0MsYUFBTCxDQUFtQkYsS0FBbkIsRUFBMkJDLEVBQUVFLGNBQUY7QUFBb0IseUJBQWxGLEVBQW9GLGNBQVcsUUFBL0Y7QUFBMEdIO0FBQTFHLGlCQUFsQjtBQUFBLGFBQWhCLENBQXZCO0FBQ0EsbUJBQ0k7QUFBQTtBQUFBLGtCQUFJLEtBQUksYUFBUixFQUFzQixjQUFXLFNBQWpDO0FBQ0tIO0FBREwsYUFESjtBQUtILFNBdEZrQjs7QUFBQSxjQXlGbkJPLGNBekZtQixHQXlGRixhQUFLO0FBQUEsOEJBQ2lCLE1BQUtwQyxLQUR0QjtBQUFBLGdCQUNYSSxjQURXLGVBQ1hBLGNBRFc7QUFBQSxnQkFDS2lDLFFBREwsZUFDS0EsUUFETDtBQUFBLDhCQUVrQixNQUFLeEMsS0FGdkI7QUFBQSxnQkFFWHlDLFdBRlcsZUFFWEEsV0FGVztBQUFBLGdCQUVFQyxZQUZGLGVBRUVBLFlBRkY7O0FBR2xCLGtCQUFLOUIsUUFBTCxDQUFjLEVBQUM0QixVQUFVLENBQUMsTUFBS3JDLEtBQUwsQ0FBV3FDLFFBQXZCLEVBQWQ7QUFDQSxnQkFBR2pDLGtCQUFrQixDQUFDa0MsV0FBbkIsSUFBa0NELGFBQWEsS0FBbEQsRUFBeUQ7QUFDckQsc0JBQUs1QixRQUFMLENBQWMsRUFBQ0wsZ0JBQWdCLEtBQWpCLEVBQWQ7QUFDSDs7QUFFRCxnQkFBRyxDQUFDQSxjQUFELElBQW1CNkIsRUFBRVQsTUFBRixDQUFTbkIsS0FBVCxDQUFlcUIsSUFBZixPQUEwQixFQUE3QyxJQUFtRGEsWUFBbkQsSUFBbUVGLGFBQWEsS0FBbkYsRUFBMEY7QUFDdEY7QUFDQSxzQkFBS25DLGNBQUwsQ0FBb0IsRUFBcEI7QUFDSDtBQUNELG1CQUFPLElBQVA7QUFDSCxTQXRHa0I7O0FBRWYsY0FBS0YsS0FBTCxHQUFhO0FBQ1RELHdCQUFZLE1BQUtGLEtBQUwsQ0FBVzJDLGFBRGQ7QUFFVDlCLHlCQUFhLEVBRko7QUFHVE4sNEJBQWdCLEtBSFA7QUFJVE8sbUJBQU8sTUFBS2QsS0FBTCxDQUFXYyxLQUpUO0FBS1QwQixzQkFBVSxLQUxEO0FBTVRyQix1QkFBVztBQU5GLFNBQWI7QUFGZTtBQVVsQjs7QUFYQ3BCLHdCLFdBYUY2Qyx5Qiw2Q0FBbUM7QUFBQSxZQUFSOUIsS0FBUSxTQUFSQSxLQUFROztBQUMvQixZQUFHQSxLQUFILEVBQVU7QUFDTixpQkFBS0YsUUFBTCxDQUFjLEVBQUNFLE9BQU9BLEtBQVIsRUFBZDtBQUNIO0FBQ0osSzs7QUFqQkNmLHdCLFdBbUJGOEMsaUIsZ0NBQW9CO0FBQUEsWUFDVEMsWUFEUyxHQUNPLEtBQUs5QyxLQURaLENBQ1Q4QyxZQURTOztBQUVoQixhQUFLaEIsdUJBQUwsR0FBK0Isd0JBQVMsS0FBS3pCLGNBQWQsRUFBOEJ5QyxZQUE5QixDQUEvQjtBQUNILEs7O0FBRUQ7OztBQVdBO0FBQ0E7OztBQWtCQTs7O0FBZUE7QUFyRUUvQyx3QixXQXNFRnNDLGEsMEJBQWM3QixLLEVBQU87QUFBQSxZQUNWb0IsUUFEVSxHQUNFLEtBQUs1QixLQURQLENBQ1Y0QixRQURVOztBQUVqQixhQUFLYixJQUFMLENBQVVnQyxTQUFWLENBQW9CdkMsS0FBcEIsR0FBNEJBLEtBQTVCO0FBQ0EsYUFBS0ksUUFBTCxDQUFjLEVBQUNWLFlBQVlNLEtBQWIsRUFBb0JELGdCQUFnQixLQUFwQyxFQUEyQ00sYUFBYSxFQUF4RCxFQUFkO0FBQ0EsWUFBSWUsUUFBSixFQUFjQSxTQUFTcEIsS0FBVDtBQUNkLGVBQU9BLEtBQVA7QUFDSCxLOztBQUVEOzs7QUFXQTs7O0FBZ0JBO0FBekdFVCx3QixXQTBHRmlELE0scUJBQVM7QUFBQSxxQkFDcUQsS0FBSzdDLEtBRDFEO0FBQUEsWUFDRUQsVUFERixVQUNFQSxVQURGO0FBQUEsWUFDY0ssY0FEZCxVQUNjQSxjQURkO0FBQUEsWUFDOEJpQyxRQUQ5QixVQUM4QkEsUUFEOUI7QUFBQSxZQUN3Q3JCLFNBRHhDLFVBQ3dDQSxTQUR4Qzs7O0FBR0wsWUFBTThCLGtCQUFrQixLQUFLQyxXQUFMLENBQWlCLEtBQUtsRCxLQUF0QixDQUF4Qjs7QUFISyxxQkFLc0MsS0FBS0EsS0FMM0M7QUFBQSxZQUtFOEMsWUFMRixVQUtFQSxZQUxGO0FBQUEsWUFLZ0JoQyxLQUxoQixVQUtnQkEsS0FMaEI7QUFBQSxZQUt1QnFDLFdBTHZCLFVBS3VCQSxXQUx2Qjs7O0FBT0xGLHdCQUFnQnpDLEtBQWhCLEdBQXdCTixlQUFlRSxTQUFmLElBQTRCRixlQUFlLElBQTNDLEdBQW1ELEVBQW5ELEdBQXdEQSxVQUFoRjtBQUNBK0Msd0JBQWdCRyxNQUFoQixHQUF5QixLQUFLYixjQUE5QjtBQUNBLFlBQU1jLDBCQUFpQkosZUFBakIsQ0FBTjtBQUNBLGVBQ0k7QUFBQTtBQUFBLGNBQUssY0FBVyxrQkFBaEI7QUFDSTtBQUFBO0FBQUEsa0JBQUssK0NBQTRDbkMsUUFBUSxhQUFSLEdBQXdCLEVBQXBFLENBQUwsRUFBK0UsS0FBSSxlQUFuRjtBQUNJLHVEQUFLLGNBQVcsU0FBaEIsRUFBMEIsZ0JBQWNLLFNBQXhDLEVBQW1ELFdBQVUsOEJBQTdELEVBQTRGLEtBQUksUUFBaEcsR0FESjtBQUVJLGtFQUFPLFdBQVUsc0JBQWpCLEVBQXdDLE1BQUssTUFBN0MsRUFBb0QsS0FBSSxXQUF4RCxJQUF3RWtDLFVBQXhFLEVBRko7QUFHSTtBQUFBO0FBQUEsc0JBQU8sV0FBVSxzQkFBakI7QUFBeUMsc0NBQVFDLENBQVIsQ0FBVUgsV0FBVjtBQUF6QyxpQkFISjtBQUlJO0FBQUE7QUFBQSxzQkFBTSxXQUFVLHNCQUFoQixFQUF1QyxLQUFJLGNBQTNDO0FBQTJELHNDQUFRRyxDQUFSLENBQVV4QyxLQUFWO0FBQTNEO0FBSkosYUFESjtBQU9LUCw4QkFBa0JpQyxRQUFsQixJQUNHLEtBQUtULGlCQUFMO0FBUlIsU0FESjtBQWFILEs7O1dBaklDaEMsb0I7Ozs7QUFvSU5BLHFCQUFxQndELFdBQXJCLEdBQW1DLHNCQUFuQztBQUNBeEQscUJBQXFCeUQsWUFBckIsR0FBb0M7QUFDaENkLGtCQUFjLEtBRGtCO0FBRWhDSSxrQkFBYyxHQUZrQjtBQUdoQ0ssaUJBQWEsZ0JBSG1CO0FBSWhDVixpQkFBYTtBQUptQixDQUFwQztBQU1BMUMscUJBQXFCMEQsU0FBckIsR0FBaUM7QUFDN0JmLGtCQUFjLGlCQUFVZ0IsSUFESyxFQUNDO0FBQzlCNUMsV0FBTyxpQkFBVTZDLE1BRlksRUFFSjtBQUN6QmIsa0JBQWUsaUJBQVVjLE1BQVYsQ0FBaUJDLFVBSEgsRUFHZTtBQUM1Q2pDLGNBQVUsaUJBQVVrQyxJQUpTLEVBSUg7QUFDMUJYLGlCQUFhLGlCQUFVUSxNQUxNLEVBS0U7QUFDL0JyRCxtQkFBZSxpQkFBVXdELElBQVYsQ0FBZUQsVUFORCxFQU1hO0FBQzFDbEIsbUJBQWUsaUJBQVVnQixNQVBJLEVBT0k7QUFDakNsQixpQkFBYSxpQkFBVWlCLElBUk0sQ0FRRDtBQVJDLENBQWpDO2tCQVVlM0Qsb0I7O0FBR2YiLCJmaWxlIjoiZnItRlIuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgUmVhY3QsIHtDb21wb25lbnQsIFByb3BUeXBlc30gZnJvbSAncmVhY3QnO1xyXG5pbXBvcnQgUmVhY3RET00gZnJvbSAncmVhY3QtZG9tJztcclxuaW1wb3J0IGkxOG5leHQgZnJvbSAnaTE4bmV4dCc7XHJcbmltcG9ydCBNREJlaGF2aW91ciBmcm9tICcuLi9iZWhhdmlvdXJzL21hdGVyaWFsJztcclxuaW1wb3J0IHtJbnB1dEJlaGF2aW91cn0gZnJvbSAnLi4vYmVoYXZpb3Vycy9pbnB1dC1jb21wb25lbnQnO1xyXG5pbXBvcnQgZGVib3VuY2UgZnJvbSAnbG9kYXNoL2RlYm91bmNlJztcclxuXHJcbkBNREJlaGF2aW91cignbWF0ZXJpYWxJbnB1dCcpXHJcbkBJbnB1dEJlaGF2aW91clxyXG5jbGFzcyBBdXRvY29tcGxldGVUZXh0RWRpdCBleHRlbmRzIENvbXBvbmVudCB7XHJcbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xyXG4gICAgICAgIHN1cGVyKHByb3BzKTtcclxuICAgICAgICB0aGlzLnN0YXRlID0ge1xyXG4gICAgICAgICAgICBpbnB1dFZhbHVlOiB0aGlzLnByb3BzLnJhd0lucHV0VmFsdWUsXHJcbiAgICAgICAgICAgIHN1Z2dlc3Rpb25zOiBbXSxcclxuICAgICAgICAgICAgaGFzU3VnZ2VzdGlvbnM6IGZhbHNlLFxyXG4gICAgICAgICAgICBlcnJvcjogdGhpcy5wcm9wcy5lcnJvcixcclxuICAgICAgICAgICAgaGFzRm9jdXM6IGZhbHNlLFxyXG4gICAgICAgICAgICBpc0xvYWRpbmc6IGZhbHNlXHJcbiAgICAgICAgfTtcclxuICAgIH1cclxuXHJcbiAgICBjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKHtlcnJvcn0pIHtcclxuICAgICAgICBpZihlcnJvcikge1xyXG4gICAgICAgICAgICB0aGlzLnNldFN0YXRlKHtlcnJvcjogZXJyb3J9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgY29tcG9uZW50RGlkTW91bnQoKSB7XHJcbiAgICAgICAgY29uc3Qge2lucHV0VGltZW91dH0gPSB0aGlzLnByb3BzO1xyXG4gICAgICAgIHRoaXMuX2RlYm91bmNlZFF1ZXJ5U2VhcmNoZXIgPSBkZWJvdW5jZSh0aGlzLl9xdWVyeVNlYXJjaGVyLCBpbnB1dFRpbWVvdXQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFJldHVybnMgdGhlIHN0YXRlJ3MgaW5wdXRWYWx1ZVxyXG4gICAgZ2V0VmFsdWUgPSAoKSA9PiAge1xyXG4gICAgICAgIGNvbnN0IHtpbnB1dFZhbHVlfSA9IHRoaXMuc3RhdGU7XHJcbiAgICAgICAgaWYoaW5wdXRWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBpbnB1dFZhbHVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICAvLyBHZXRzIHRoZSBkZWZpbmVkIHByb3BzJyBxdWVyeVNlYXJjaCBhbmQgcmV0dXJucyB0aGUgb2JqZWN0IGdpdmVuIGJ5IHRoZSBwcm9taXNlXHJcbiAgICAvLyBTZXRzIHRoZSBoYXNTdWdnZXN0aW9ucycgc3RhdGUgaWYgdGhlIGdpdmVuIG9iamVjdCBoYXMgYSBub25lIGVtcHR5IGFycmF5XHJcbiAgICBfcXVlcnlTZWFyY2hlciA9IHZhbHVlID0+IHtcclxuICAgICAgICBjb25zdCB7cXVlcnlTZWFyY2hlcn0gPSB0aGlzLnByb3BzO1xyXG4gICAgICAgIGNvbnN0IHtoYXNTdWdnZXN0aW9uc30gPSB0aGlzLnN0YXRlO1xyXG5cclxuICAgICAgICBxdWVyeVNlYXJjaGVyKHZhbHVlKS50aGVuKCh7ZGF0YSwgdG90YWxDb3VudH0pID0+IHtcclxuICAgICAgICAgICAgaWYodG90YWxDb3VudCA+IDApIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoe2hhc1N1Z2dlc3Rpb25zOiB0cnVlLCBzdWdnZXN0aW9uczogZGF0YSwgZXJyb3I6ICcnfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5yZWZzLmxvYWRlci5jbGFzc0xpc3QucmVtb3ZlKCdtZGwtcHJvZ3Jlc3NfX2luZGV0ZXJtaW5hdGUnKTtcclxuICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7aXNMb2FkaW5nOiBmYWxzZX0pO1xyXG4gICAgICAgIH0pLmNhdGNoKGVyciA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMucmVmcy5sb2FkZXIuY2xhc3NMaXN0LnJlbW92ZSgnbWRsLXByb2dyZXNzX19pbmRldGVybWluYXRlJyk7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoe2Vycm9yOiBKU09OLnN0cmluZ2lmeShlcnIpLCBpc0xvYWRpbmc6IGZhbHNlfSk7XHJcbiAgICAgICAgICAgIHRoaXMucmVmcy5tYXRlcmlhbElucHV0LmNsYXNzTGlzdC5hZGQoJ2lzLWludmFsaWQnKTtcclxuICAgICAgICB9KTtcclxuICAgIH07XHJcblxyXG4gICAgLy8gU2V0cyB0aGUgc3RhdGUncyBpbnB1dFZhbHVlIHdoZW4gdGhlIHVzZXIgaXMgdHlwaW5nXHJcbiAgICBfaGFuZGxlb25DaGFuZ2UgPSAoe3RhcmdldDoge3ZhbHVlfX0pID0+IHtcclxuICAgICAgICBjb25zdCB7b25DaGFuZ2V9ID0gdGhpcy5wcm9wcztcclxuICAgICAgICB0aGlzLnNldFN0YXRlKHtpbnB1dFZhbHVlOiB2YWx1ZX0pO1xyXG4gICAgICAgIGlmKHZhbHVlLnRyaW0oKSA9PSAnJykge1xyXG4gICAgICAgICAgICB0aGlzLnNldFN0YXRlKHtoYXNTdWdnZXN0aW9uczogZmFsc2V9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMucmVmcy5sb2FkZXIuY2xhc3NMaXN0LmFkZCgnbWRsLXByb2dyZXNzX19pbmRldGVybWluYXRlJyk7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoe2lzTG9hZGluZzogdHJ1ZX0pO1xyXG4gICAgICAgICAgICB0aGlzLl9kZWJvdW5jZWRRdWVyeVNlYXJjaGVyKHZhbHVlKTtcclxuICAgICAgICAgICAgaWYgKG9uQ2hhbmdlKSBvbkNoYW5nZSh2YWx1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuXHJcbiAgICAvLyBTZXRzIHRoZSB2YWx1ZSBpbnB1dCB3aXRoIHRoZSBzZWxlY3RlZCBzdWdnZXN0aW9uIGFuZCBoaWRlcyB0aGUgZHJvcGRvd25cclxuICAgIG9uUmVzdWx0Q2xpY2sodmFsdWUpIHtcclxuICAgICAgICBjb25zdCB7b25DaGFuZ2V9ID0gdGhpcy5wcm9wcztcclxuICAgICAgICB0aGlzLnJlZnMuaW5wdXRUZXh0LnZhbHVlID0gdmFsdWU7XHJcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7aW5wdXRWYWx1ZTogdmFsdWUsIGhhc1N1Z2dlc3Rpb25zOiBmYWxzZSwgc3VnZ2VzdGlvbnM6IFtdfSk7XHJcbiAgICAgICAgaWYgKG9uQ2hhbmdlKSBvbkNoYW5nZSh2YWx1ZSk7XHJcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xyXG4gICAgfTtcclxuXHJcbiAgICAvLyBSZXR1cm5zIGFuIGh0bWwgbGlzdCB3aGl0aCB0aGUgU3VnZ2VzdGlvbnNcclxuICAgIHJlbmRlclN1Z2dlc3Rpb25zID0gKCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHtzdWdnZXN0aW9uc30gPSB0aGlzLnN0YXRlO1xyXG4gICAgICAgIGNvbnN0IGFsbFN1Z2dlc3Rpb25zID0gc3VnZ2VzdGlvbnMubWFwKCh7a2V5LCBsYWJlbH0pID0+IDxsaSBrZXk9e2tleX0gb25Nb3VzZURvd249eyhlKSA9PiB7dGhpcy5vblJlc3VsdENsaWNrKGxhYmVsKTsgZS5wcmV2ZW50RGVmYXVsdCgpO319IGRhdGEtZm9jdXM9J29wdGlvbicgPntsYWJlbH08L2xpPik7XHJcbiAgICAgICAgcmV0dXJuKFxyXG4gICAgICAgICAgICA8dWwgcmVmPSdzdWdnZXN0aW9ucycgZGF0YS1mb2N1cz0nb3B0aW9ucyc+XHJcbiAgICAgICAgICAgICAgICB7YWxsU3VnZ2VzdGlvbnN9XHJcbiAgICAgICAgICAgIDwvdWw+XHJcbiAgICAgICAgKTtcclxuICAgIH07XHJcblxyXG4gICAgLy8gQmVoYXZpb3VyIHdoZW4gb25Gb2N1cyBhbmQgb25CbHVyIGFyZSB0cmlnZ2VyZWRcclxuICAgIF9oYW5kbGVvbkZvY3VzID0gZSA9PiB7XHJcbiAgICAgICAgY29uc3Qge2hhc1N1Z2dlc3Rpb25zLCBoYXNGb2N1c30gPSB0aGlzLnN0YXRlO1xyXG4gICAgICAgIGNvbnN0IHtzaG93QXRGb2N1cywgZW1wdHlTaG93QWxsfSA9IHRoaXMucHJvcHM7XHJcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7aGFzRm9jdXM6ICF0aGlzLnN0YXRlLmhhc0ZvY3VzfSk7XHJcbiAgICAgICAgaWYoaGFzU3VnZ2VzdGlvbnMgJiYgIXNob3dBdEZvY3VzICYmIGhhc0ZvY3VzID09PSBmYWxzZSkge1xyXG4gICAgICAgICAgICB0aGlzLnNldFN0YXRlKHtoYXNTdWdnZXN0aW9uczogZmFsc2V9KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmKCFoYXNTdWdnZXN0aW9ucyAmJiBlLnRhcmdldC52YWx1ZS50cmltKCkgPT09ICcnICYmIGVtcHR5U2hvd0FsbCAmJiBoYXNGb2N1cyA9PT0gZmFsc2UpIHtcclxuICAgICAgICAgICAgLy8gRG9pbmcgYSBnbG9iYWwgc2VhcmNoIGhlcmVcclxuICAgICAgICAgICAgdGhpcy5fcXVlcnlTZWFyY2hlcignJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfTtcclxuXHJcbiAgICAvLyBNYXliZSBnaXZlIHRoZSBvcHRpb24gZm9yIHRoZSBmbG9hdGluZyBsYWJlbFxyXG4gICAgcmVuZGVyKCkge1xyXG4gICAgICAgIGNvbnN0IHtpbnB1dFZhbHVlLCBoYXNTdWdnZXN0aW9ucywgaGFzRm9jdXMsIGlzTG9hZGluZ30gPSB0aGlzLnN0YXRlO1xyXG5cclxuICAgICAgICBjb25zdCB2YWxpZElucHV0UHJvcHMgPSB0aGlzLl9jaGVja1Byb3BzKHRoaXMucHJvcHMpO1xyXG5cclxuICAgICAgICBjb25zdCB7aW5wdXRUaW1lb3V0LCBlcnJvciwgcGxhY2Vob2xkZXJ9ID0gdGhpcy5wcm9wcztcclxuXHJcbiAgICAgICAgdmFsaWRJbnB1dFByb3BzLnZhbHVlID0gaW5wdXRWYWx1ZSA9PT0gdW5kZWZpbmVkIHx8IGlucHV0VmFsdWUgPT09IG51bGwgID8gJycgOiBpbnB1dFZhbHVlO1xyXG4gICAgICAgIHZhbGlkSW5wdXRQcm9wcy5vbkJsdXIgPSB0aGlzLl9oYW5kbGVvbkZvY3VzO1xyXG4gICAgICAgIGNvbnN0IGlucHV0UHJvcHMgPSB7Li4udmFsaWRJbnB1dFByb3BzfTtcclxuICAgICAgICByZXR1cm4oXHJcbiAgICAgICAgICAgIDxkaXYgZGF0YS1mb2N1cz0nYXV0b2NvbXBsZXRlVGV4dCc+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT17YG1kbC10ZXh0ZmllbGQgbWRsLWpzLXRleHRmaWVsZCR7ZXJyb3IgPyAnIGlzLWludmFsaWQnIDogJyd9YH0gcmVmPSdtYXRlcmlhbElucHV0Jz5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtZm9jdXM9J2xvYWRpbmcnIGRhdGEtbG9hZGluZz17aXNMb2FkaW5nfSBjbGFzc05hbWU9J21kbC1wcm9ncmVzcyBtZGwtanMtcHJvZ3Jlc3MnIHJlZj0nbG9hZGVyJy8+XHJcbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzTmFtZT0nbWRsLXRleHRmaWVsZF9faW5wdXQnIHR5cGU9J3RleHQnIHJlZj0naW5wdXRUZXh0JyB7Li4uaW5wdXRQcm9wc30vPlxyXG4gICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzc05hbWU9XCJtZGwtdGV4dGZpZWxkX19sYWJlbFwiPntpMThuZXh0LnQocGxhY2Vob2xkZXIpfTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwibWRsLXRleHRmaWVsZF9fZXJyb3JcIiByZWY9J2Vycm9yTWVzc2FnZSc+e2kxOG5leHQudChlcnJvcil9PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICB7aGFzU3VnZ2VzdGlvbnMgJiYgaGFzRm9jdXMgJiZcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbmRlclN1Z2dlc3Rpb25zKClcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgKTtcclxuICAgIH1cclxufVxyXG5cclxuQXV0b2NvbXBsZXRlVGV4dEVkaXQuZGlzcGxheU5hbWUgPSAnQXV0b2NvbXBsZXRlVGV4dEVkaXQnO1xyXG5BdXRvY29tcGxldGVUZXh0RWRpdC5kZWZhdWx0UHJvcHMgPSB7XHJcbiAgICBlbXB0eVNob3dBbGw6IGZhbHNlLFxyXG4gICAgaW5wdXRUaW1lb3V0OiAyMDAsXHJcbiAgICBwbGFjZWhvbGRlcjogJ1NlYXJjaCBoZXJlLi4uJyxcclxuICAgIHNob3dBdEZvY3VzOiBmYWxzZVxyXG59O1xyXG5BdXRvY29tcGxldGVUZXh0RWRpdC5wcm9wVHlwZXMgPSB7XHJcbiAgICBlbXB0eVNob3dBbGw6IFByb3BUeXBlcy5ib29sLCAvL0RlZmluZXMgaWYgaXQgc2hvd3Mgc3VnZ2VzdGlvbnMgb24gZm9jdXMgd2hlbiB0aGUgaW5wdXQgaXMgZW1wdHkuXHJcbiAgICBlcnJvcjogUHJvcFR5cGVzLnN0cmluZywgLy9FcnJvciBzaG93ZWQgbWVzc2FnZS5cclxuICAgIGlucHV0VGltZW91dCA6IFByb3BUeXBlcy5udW1iZXIuaXNSZXF1aXJlZCwgLy9UaW1lb3V0IHRvIGV4ZWN1dGUgdGhlIGRlYm91bmNlIGZ1bmN0aW9uLlxyXG4gICAgb25DaGFuZ2U6IFByb3BUeXBlcy5mdW5jLCAvL0xhdW5jaGVzIHRoZSBxdWVyeVNlYXJjaGVyLlxyXG4gICAgcGxhY2Vob2xkZXI6IFByb3BUeXBlcy5zdHJpbmcsIC8vUGxhY2Vob2xkZXIgZmllbGQuXHJcbiAgICBxdWVyeVNlYXJjaGVyOiBQcm9wVHlwZXMuZnVuYy5pc1JlcXVpcmVkLCAvL1JldHVybnMgYSBwcm9taXNlIHdoaWNoIGlzIGNvbm5lY3RlZCB0byB0aGUgd2ViIHNlcnZpY2UuXHJcbiAgICByYXdJbnB1dFZhbHVlOiBQcm9wVHlwZXMuc3RyaW5nLCAvL0ZpZWxkIHZhbHVlLlxyXG4gICAgc2hvd0F0Rm9jdXM6IFByb3BUeXBlcy5ib29sIC8vRGVmaW5lcyBpdCBzaG93cyBzdWdnZXN0aW9ucyBvbiBmb2N1cy5cclxufTtcclxuZXhwb3J0IGRlZmF1bHQgQXV0b2NvbXBsZXRlVGV4dEVkaXQ7XHJcblxyXG5cclxuLypcclxuRVhBTVBMRVxyXG5jb25zdCBfcXVlcnlTZWFyY2hlciA9IHF1ZXJ5ID0+IHtcclxubGV0IGRhdGEgPSBbXHJcbntcclxua2V5OiAnSkwnLFxyXG5sYWJlbDogJ0pvaCBMaWNrZXVyJ1xyXG59LFxyXG57XHJcbmtleTogJ0dLJyxcclxubGFiZWw6ICdHdcOpbm9sw6kgS2lrYWJvdSdcclxufSxcclxue1xyXG5rZXk6ICdZTCcsXHJcbmxhYmVsOiAnWWFubmljayBMb3VuaXZpcydcclxufVxyXG5dO1xyXG5yZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG5zZXRUaW1lb3V0KCgpID0+IHtcclxucmVzb2x2ZSh7XHJcbmRhdGEsXHJcbnRvdGFsQ291bnQ6IGRhdGEubGVuZ3RoXHJcbn0pO1xyXG59LCA1MDApO1xyXG59KTtcclxufTtcclxuXHJcbjxBdXRvY29tcGxldGVUZXh0XHJcbmlzRWRpdD17aXNFZGl0fVxyXG5xdWVyeVNlYXJjaGVyPXtfcXVlcnlTZWFyY2hlcn1cclxucGxhY2Vob2xkZXI9eydZb3VyIHNlYXJjaC4uLid9XHJcbmVycm9ye1NvbWV0aGluZyB3cm9uZyBoYXBwZW5kLiBSZXRyeSBwbGVhc2UuLi59XHJcbi8+XHJcbiovXHJcbiJdfQ==