UNPKG

apeman-react-mixins

Version:
162 lines (143 loc) 13.5 kB
/** * Mixin to add touch handlers. * @mixin ApTouchMixin */ 'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); var _ApTouchMixin; var _react = require('react'); var _react2 = _interopRequireDefault(_react); var _reactDom = require('react-dom'); var _reactDom2 = _interopRequireDefault(_reactDom); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } var TOUCH_HAMMER_KEY = '_apTouchHammer'; function createTouchHammer(node, props, getData) { if (!node) { return; } var Hammer = require('hammerjs'); var hammer = new Hammer(node, { cssProps: { userSelect: true } }); if (props.touchOptions) { hammer.set(props.touchOptions); } Object.keys(ApTouchMixin.propTypes).filter(function (key) { return !!props[key]; }).forEach(function (key) { if (/^on/.test(key)) { (function () { var event = key.replace(/^on/, '').toLowerCase(); var handler = props[key]; hammer.on(event, function (e) { e.data = getData(); // Set touching data. handler(e); }); })(); } if (/Direction$/.test(key)) { var gesture = key.replace(/Direction$/, ''); hammer.get(gesture).set({ direction: Hammer['DIRECTION_' + props[key]] }); } if (/Threshold$/.test(key)) { var threshold = key.replace(/Threshold$/, ''); hammer.get(threshold).set({ threshold: props[key] }); } }); return hammer; } function destroyTouchHammer(hammer) { if (!hammer) { return; } hammer.stop(); hammer.destroy(); } function supportsTouch(props) { var touchableKey = Object.keys(ApTouchMixin.propTypes); var _iteratorNormalCompletion = true; var _didIteratorError = false; var _iteratorError = undefined; try { for (var _iterator = Object.keys(props)[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { var key = _step.value; var hit = !! ~touchableKey.indexOf(key); if (hit) { return true; } } } catch (err) { _didIteratorError = true; _iteratorError = err; } finally { try { if (!_iteratorNormalCompletion && _iterator.return) { _iterator.return(); } } finally { if (_didIteratorError) { throw _iteratorError; } } } return false; } /** Enum for touching */ var touchEnums = { directions: ['NONE', 'LEFT', 'RIGHT', 'UP', 'DOWN', 'HORIZONTAL', 'VERTICAL', 'ALL'] }; /** @lends ApTouchMixin */ var ApTouchMixin = (_ApTouchMixin = {}, _defineProperty(_ApTouchMixin, TOUCH_HAMMER_KEY, null), _defineProperty(_ApTouchMixin, 'propTypes', { onTap: _react.PropTypes.func, onDoubleTap: _react.PropTypes.func, onPan: _react.PropTypes.func, onPanStart: _react.PropTypes.func, onPanMove: _react.PropTypes.func, onPanEnd: _react.PropTypes.func, onPanCancel: _react.PropTypes.func, onSwipe: _react.PropTypes.func, onPress: _react.PropTypes.func, onPressUp: _react.PropTypes.func, onPinch: _react.PropTypes.func, onPinchStart: _react.PropTypes.func, onPinchMove: _react.PropTypes.func, onPinchEnd: _react.PropTypes.func, onPinchCancel: _react.PropTypes.func, onRotate: _react.PropTypes.func, onRotateStart: _react.PropTypes.func, onRotateMove: _react.PropTypes.func, onRotateEnd: _react.PropTypes.func, onRotateCancel: _react.PropTypes.func, touchOptions: _react.PropTypes.object, panThreshold: _react.PropTypes.number, panDirection: _react.PropTypes.oneOf(touchEnums.directions), swipeDirection: _react.PropTypes.oneOf(touchEnums.directions) }), _defineProperty(_ApTouchMixin, 'statics', {}), _defineProperty(_ApTouchMixin, 'componentWillMount', function componentWillMount() { var s = this; s.getTouchData = s.getTouchData || function () { return undefined; }; }), _defineProperty(_ApTouchMixin, 'componentDidMount', function componentDidMount() { var s = this; var touchable = supportsTouch(s.props); var getData = function getData() { return s.getTouchData(); }; if (touchable) { s[TOUCH_HAMMER_KEY] = createTouchHammer(_reactDom2.default.findDOMNode(s), s.props, getData); } }), _defineProperty(_ApTouchMixin, 'componentWillUnmount', function componentWillUnmount() { var s = this; var hammer = s[TOUCH_HAMMER_KEY]; if (hammer) { destroyTouchHammer(hammer); } delete s[TOUCH_HAMMER_KEY]; }), _ApTouchMixin); exports.default = Object.freeze(ApTouchMixin); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFwX3RvdWNoX21peGluLmpzeCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUtBOzs7Ozs7OztBQUVBOzs7O0FBQ0E7Ozs7Ozs7O0FBRUEsSUFBTSxtQkFBbUIsZ0JBQXpCOztBQUVBLFNBQVMsaUJBQVQsQ0FBNEIsSUFBNUIsRUFBa0MsS0FBbEMsRUFBeUMsT0FBekMsRUFBa0Q7QUFDaEQsTUFBSSxDQUFDLElBQUwsRUFBVztBQUNUO0FBQ0Q7QUFDRCxNQUFJLFNBQVMsUUFBUSxVQUFSLENBQWI7QUFDQSxNQUFJLFNBQVMsSUFBSSxNQUFKLENBQVcsSUFBWCxFQUFpQjtBQUM1QixjQUFVO0FBQ1Isa0JBQVk7QUFESjtBQURrQixHQUFqQixDQUFiO0FBS0EsTUFBSSxNQUFNLFlBQVYsRUFBd0I7QUFDdEIsV0FBTyxHQUFQLENBQVcsTUFBTSxZQUFqQjtBQUNEO0FBQ0QsU0FBTyxJQUFQLENBQVksYUFBYSxTQUF6QixFQUNHLE1BREgsQ0FDVSxVQUFDLEdBQUQ7QUFBQSxXQUFTLENBQUMsQ0FBQyxNQUFPLEdBQVAsQ0FBWDtBQUFBLEdBRFYsRUFFRyxPQUZILENBRVcsVUFBQyxHQUFELEVBQVM7QUFDaEIsUUFBSSxNQUFNLElBQU4sQ0FBVyxHQUFYLENBQUosRUFBcUI7QUFBQTtBQUNuQixZQUFJLFFBQVEsSUFBSSxPQUFKLENBQVksS0FBWixFQUFtQixFQUFuQixFQUF1QixXQUF2QixFQUFaO0FBQ0EsWUFBSSxVQUFVLE1BQU8sR0FBUCxDQUFkO0FBQ0EsZUFBTyxFQUFQLENBQVUsS0FBVixFQUFpQixVQUFDLENBQUQsRUFBTztBQUN0QixZQUFFLElBQUYsR0FBUyxTQUFULEM7QUFDQSxrQkFBUSxDQUFSO0FBQ0QsU0FIRDtBQUhtQjtBQU9wQjtBQUNELFFBQUksYUFBYSxJQUFiLENBQWtCLEdBQWxCLENBQUosRUFBNEI7QUFDMUIsVUFBSSxVQUFVLElBQUksT0FBSixDQUFZLFlBQVosRUFBMEIsRUFBMUIsQ0FBZDtBQUNBLGFBQU8sR0FBUCxDQUFXLE9BQVgsRUFBb0IsR0FBcEIsQ0FBd0IsRUFBRSxXQUFXLE9BQVEsZUFBZSxNQUFPLEdBQVAsQ0FBdkIsQ0FBYixFQUF4QjtBQUNEO0FBQ0QsUUFBSSxhQUFhLElBQWIsQ0FBa0IsR0FBbEIsQ0FBSixFQUE0QjtBQUMxQixVQUFJLFlBQVksSUFBSSxPQUFKLENBQVksWUFBWixFQUEwQixFQUExQixDQUFoQjtBQUNBLGFBQU8sR0FBUCxDQUFXLFNBQVgsRUFBc0IsR0FBdEIsQ0FBMEIsRUFBRSxXQUFXLE1BQU8sR0FBUCxDQUFiLEVBQTFCO0FBQ0Q7QUFDRixHQW5CSDtBQW9CQSxTQUFPLE1BQVA7QUFDRDs7QUFFRCxTQUFTLGtCQUFULENBQTZCLE1BQTdCLEVBQXFDO0FBQ25DLE1BQUksQ0FBQyxNQUFMLEVBQWE7QUFDWDtBQUNEO0FBQ0QsU0FBTyxJQUFQO0FBQ0EsU0FBTyxPQUFQO0FBQ0Q7O0FBRUQsU0FBUyxhQUFULENBQXdCLEtBQXhCLEVBQStCO0FBQzdCLE1BQUksZUFBZSxPQUFPLElBQVAsQ0FBWSxhQUFhLFNBQXpCLENBQW5CO0FBRDZCO0FBQUE7QUFBQTs7QUFBQTtBQUU3Qix5QkFBZ0IsT0FBTyxJQUFQLENBQVksS0FBWixDQUFoQiw4SEFBb0M7QUFBQSxVQUEzQixHQUEyQjs7QUFDbEMsVUFBSSxNQUFNLENBQUMsRUFBQyxDQUFDLGFBQWEsT0FBYixDQUFxQixHQUFyQixDQUFiO0FBQ0EsVUFBSSxHQUFKLEVBQVM7QUFDUCxlQUFPLElBQVA7QUFDRDtBQUNGO0FBUDRCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7O0FBUTdCLFNBQU8sS0FBUDtBQUNEOzs7QUFHRCxJQUFNLGFBQWE7QUFDakIsY0FBWSxDQUNWLE1BRFUsRUFFVixNQUZVLEVBR1YsT0FIVSxFQUlWLElBSlUsRUFLVixNQUxVLEVBTVYsWUFOVSxFQU9WLFVBUFUsRUFRVixLQVJVO0FBREssQ0FBbkI7OztBQWNBLElBQUksbUVBTUQsZ0JBTkMsRUFNa0IsSUFObEIsK0NBWVM7QUFDVCxTQUFPLGlCQUFNLElBREo7QUFFVCxlQUFhLGlCQUFNLElBRlY7QUFHVCxTQUFPLGlCQUFNLElBSEo7QUFJVCxjQUFZLGlCQUFNLElBSlQ7QUFLVCxhQUFXLGlCQUFNLElBTFI7QUFNVCxZQUFVLGlCQUFNLElBTlA7QUFPVCxlQUFhLGlCQUFNLElBUFY7QUFRVCxXQUFTLGlCQUFNLElBUk47QUFTVCxXQUFTLGlCQUFNLElBVE47QUFVVCxhQUFXLGlCQUFNLElBVlI7QUFXVCxXQUFTLGlCQUFNLElBWE47QUFZVCxnQkFBYyxpQkFBTSxJQVpYO0FBYVQsZUFBYSxpQkFBTSxJQWJWO0FBY1QsY0FBWSxpQkFBTSxJQWRUO0FBZVQsaUJBQWUsaUJBQU0sSUFmWjtBQWdCVCxZQUFVLGlCQUFNLElBaEJQO0FBaUJULGlCQUFlLGlCQUFNLElBakJaO0FBa0JULGdCQUFjLGlCQUFNLElBbEJYO0FBbUJULGVBQWEsaUJBQU0sSUFuQlY7QUFvQlQsa0JBQWdCLGlCQUFNLElBcEJiO0FBcUJULGdCQUFjLGlCQUFNLE1BckJYO0FBc0JULGdCQUFjLGlCQUFNLE1BdEJYO0FBdUJULGdCQUFjLGlCQUFNLEtBQU4sQ0FBWSxXQUFXLFVBQXZCLENBdkJMO0FBd0JULGtCQUFnQixpQkFBTSxLQUFOLENBQVksV0FBVyxVQUF2QjtBQXhCUCxDQVpULDZDQXVDTyxFQXZDUCxzRkE2Q29CO0FBQ3BCLE1BQU0sSUFBSSxJQUFWO0FBQ0EsSUFBRSxZQUFGLEdBQWlCLEVBQUUsWUFBRixJQUFtQjtBQUFBLFdBQU0sU0FBTjtBQUFBLEdBQXBDO0FBQ0QsQ0FoREMsb0ZBa0RtQjtBQUNuQixNQUFNLElBQUksSUFBVjtBQUNBLE1BQUksWUFBWSxjQUFjLEVBQUUsS0FBaEIsQ0FBaEI7QUFDQSxNQUFJLFVBQVUsU0FBVixPQUFVO0FBQUEsV0FBTSxFQUFFLFlBQUYsRUFBTjtBQUFBLEdBQWQ7QUFDQSxNQUFJLFNBQUosRUFBZTtBQUNiLE1BQUcsZ0JBQUgsSUFBd0Isa0JBQWtCLG1CQUFTLFdBQVQsQ0FBcUIsQ0FBckIsQ0FBbEIsRUFBMkMsRUFBRSxLQUE3QyxFQUFvRCxPQUFwRCxDQUF4QjtBQUNEO0FBQ0YsQ0F6REMsMEZBMkRzQjtBQUN0QixNQUFNLElBQUksSUFBVjtBQUNBLE1BQUksU0FBUyxFQUFHLGdCQUFILENBQWI7QUFDQSxNQUFJLE1BQUosRUFBWTtBQUNWLHVCQUFtQixNQUFuQjtBQUNEO0FBQ0QsU0FBTyxFQUFHLGdCQUFILENBQVA7QUFDRCxDQWxFQyxpQkFBSjs7a0JBcUVlLE9BQU8sTUFBUCxDQUFjLFlBQWQsQyIsImZpbGUiOiJhcF90b3VjaF9taXhpbi5qcyIsInNvdXJjZVJvb3QiOiIvVXNlcnMvb2t1bmlzaGluaXNoaS9Qcm9qZWN0cy9hcGVtYW4tcHJvamVjdHMvYXBlbWFuLXJlYWN0LW1peGlucy9saWIiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIE1peGluIHRvIGFkZCB0b3VjaCBoYW5kbGVycy5cbiAqIEBtaXhpbiBBcFRvdWNoTWl4aW5cbiAqL1xuXG4ndXNlIHN0cmljdCdcblxuaW1wb3J0IFJlYWN0LCB7UHJvcFR5cGVzIGFzIHR5cGVzfSBmcm9tICdyZWFjdCdcbmltcG9ydCBSZWFjdERPTSBmcm9tICdyZWFjdC1kb20nXG5cbmNvbnN0IFRPVUNIX0hBTU1FUl9LRVkgPSAnX2FwVG91Y2hIYW1tZXInXG5cbmZ1bmN0aW9uIGNyZWF0ZVRvdWNoSGFtbWVyIChub2RlLCBwcm9wcywgZ2V0RGF0YSkge1xuICBpZiAoIW5vZGUpIHtcbiAgICByZXR1cm5cbiAgfVxuICBsZXQgSGFtbWVyID0gcmVxdWlyZSgnaGFtbWVyanMnKVxuICBsZXQgaGFtbWVyID0gbmV3IEhhbW1lcihub2RlLCB7XG4gICAgY3NzUHJvcHM6IHtcbiAgICAgIHVzZXJTZWxlY3Q6IHRydWVcbiAgICB9XG4gIH0pXG4gIGlmIChwcm9wcy50b3VjaE9wdGlvbnMpIHtcbiAgICBoYW1tZXIuc2V0KHByb3BzLnRvdWNoT3B0aW9ucylcbiAgfVxuICBPYmplY3Qua2V5cyhBcFRvdWNoTWl4aW4ucHJvcFR5cGVzKVxuICAgIC5maWx0ZXIoKGtleSkgPT4gISFwcm9wc1sga2V5IF0pXG4gICAgLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgaWYgKC9eb24vLnRlc3Qoa2V5KSkge1xuICAgICAgICBsZXQgZXZlbnQgPSBrZXkucmVwbGFjZSgvXm9uLywgJycpLnRvTG93ZXJDYXNlKClcbiAgICAgICAgbGV0IGhhbmRsZXIgPSBwcm9wc1sga2V5IF1cbiAgICAgICAgaGFtbWVyLm9uKGV2ZW50LCAoZSkgPT4ge1xuICAgICAgICAgIGUuZGF0YSA9IGdldERhdGEoKSAvLyBTZXQgdG91Y2hpbmcgZGF0YS5cbiAgICAgICAgICBoYW5kbGVyKGUpXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgICBpZiAoL0RpcmVjdGlvbiQvLnRlc3Qoa2V5KSkge1xuICAgICAgICBsZXQgZ2VzdHVyZSA9IGtleS5yZXBsYWNlKC9EaXJlY3Rpb24kLywgJycpXG4gICAgICAgIGhhbW1lci5nZXQoZ2VzdHVyZSkuc2V0KHsgZGlyZWN0aW9uOiBIYW1tZXJbICdESVJFQ1RJT05fJyArIHByb3BzWyBrZXkgXSBdIH0pXG4gICAgICB9XG4gICAgICBpZiAoL1RocmVzaG9sZCQvLnRlc3Qoa2V5KSkge1xuICAgICAgICBsZXQgdGhyZXNob2xkID0ga2V5LnJlcGxhY2UoL1RocmVzaG9sZCQvLCAnJylcbiAgICAgICAgaGFtbWVyLmdldCh0aHJlc2hvbGQpLnNldCh7IHRocmVzaG9sZDogcHJvcHNbIGtleSBdIH0pXG4gICAgICB9XG4gICAgfSlcbiAgcmV0dXJuIGhhbW1lclxufVxuXG5mdW5jdGlvbiBkZXN0cm95VG91Y2hIYW1tZXIgKGhhbW1lcikge1xuICBpZiAoIWhhbW1lcikge1xuICAgIHJldHVyblxuICB9XG4gIGhhbW1lci5zdG9wKClcbiAgaGFtbWVyLmRlc3Ryb3koKVxufVxuXG5mdW5jdGlvbiBzdXBwb3J0c1RvdWNoIChwcm9wcykge1xuICBsZXQgdG91Y2hhYmxlS2V5ID0gT2JqZWN0LmtleXMoQXBUb3VjaE1peGluLnByb3BUeXBlcylcbiAgZm9yIChsZXQga2V5IG9mIE9iamVjdC5rZXlzKHByb3BzKSkge1xuICAgIGxldCBoaXQgPSAhIX50b3VjaGFibGVLZXkuaW5kZXhPZihrZXkpXG4gICAgaWYgKGhpdCkge1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZhbHNlXG59XG5cbi8qKiBFbnVtIGZvciB0b3VjaGluZyAqL1xuY29uc3QgdG91Y2hFbnVtcyA9IHtcbiAgZGlyZWN0aW9uczogW1xuICAgICdOT05FJyxcbiAgICAnTEVGVCcsXG4gICAgJ1JJR0hUJyxcbiAgICAnVVAnLFxuICAgICdET1dOJyxcbiAgICAnSE9SSVpPTlRBTCcsXG4gICAgJ1ZFUlRJQ0FMJyxcbiAgICAnQUxMJ1xuICBdXG59XG5cbi8qKiBAbGVuZHMgQXBUb3VjaE1peGluICovXG5sZXQgQXBUb3VjaE1peGluID0ge1xuXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIC8vIEN1c3RvbVxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gIFtUT1VDSF9IQU1NRVJfS0VZXTogbnVsbCxcblxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAvLyBTcGVjc1xuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gIHByb3BUeXBlczoge1xuICAgIG9uVGFwOiB0eXBlcy5mdW5jLFxuICAgIG9uRG91YmxlVGFwOiB0eXBlcy5mdW5jLFxuICAgIG9uUGFuOiB0eXBlcy5mdW5jLFxuICAgIG9uUGFuU3RhcnQ6IHR5cGVzLmZ1bmMsXG4gICAgb25QYW5Nb3ZlOiB0eXBlcy5mdW5jLFxuICAgIG9uUGFuRW5kOiB0eXBlcy5mdW5jLFxuICAgIG9uUGFuQ2FuY2VsOiB0eXBlcy5mdW5jLFxuICAgIG9uU3dpcGU6IHR5cGVzLmZ1bmMsXG4gICAgb25QcmVzczogdHlwZXMuZnVuYyxcbiAgICBvblByZXNzVXA6IHR5cGVzLmZ1bmMsXG4gICAgb25QaW5jaDogdHlwZXMuZnVuYyxcbiAgICBvblBpbmNoU3RhcnQ6IHR5cGVzLmZ1bmMsXG4gICAgb25QaW5jaE1vdmU6IHR5cGVzLmZ1bmMsXG4gICAgb25QaW5jaEVuZDogdHlwZXMuZnVuYyxcbiAgICBvblBpbmNoQ2FuY2VsOiB0eXBlcy5mdW5jLFxuICAgIG9uUm90YXRlOiB0eXBlcy5mdW5jLFxuICAgIG9uUm90YXRlU3RhcnQ6IHR5cGVzLmZ1bmMsXG4gICAgb25Sb3RhdGVNb3ZlOiB0eXBlcy5mdW5jLFxuICAgIG9uUm90YXRlRW5kOiB0eXBlcy5mdW5jLFxuICAgIG9uUm90YXRlQ2FuY2VsOiB0eXBlcy5mdW5jLFxuICAgIHRvdWNoT3B0aW9uczogdHlwZXMub2JqZWN0LFxuICAgIHBhblRocmVzaG9sZDogdHlwZXMubnVtYmVyLFxuICAgIHBhbkRpcmVjdGlvbjogdHlwZXMub25lT2YodG91Y2hFbnVtcy5kaXJlY3Rpb25zKSxcbiAgICBzd2lwZURpcmVjdGlvbjogdHlwZXMub25lT2YodG91Y2hFbnVtcy5kaXJlY3Rpb25zKVxuICB9LFxuXG4gIHN0YXRpY3M6IHt9LFxuXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIC8vIExpZmVjeWNsZVxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gIGNvbXBvbmVudFdpbGxNb3VudCAoKSB7XG4gICAgY29uc3QgcyA9IHRoaXNcbiAgICBzLmdldFRvdWNoRGF0YSA9IHMuZ2V0VG91Y2hEYXRhIHx8ICgoKSA9PiB1bmRlZmluZWQpXG4gIH0sXG5cbiAgY29tcG9uZW50RGlkTW91bnQgKCkge1xuICAgIGNvbnN0IHMgPSB0aGlzXG4gICAgbGV0IHRvdWNoYWJsZSA9IHN1cHBvcnRzVG91Y2gocy5wcm9wcylcbiAgICBsZXQgZ2V0RGF0YSA9ICgpID0+IHMuZ2V0VG91Y2hEYXRhKClcbiAgICBpZiAodG91Y2hhYmxlKSB7XG4gICAgICBzWyBUT1VDSF9IQU1NRVJfS0VZIF0gPSBjcmVhdGVUb3VjaEhhbW1lcihSZWFjdERPTS5maW5kRE9NTm9kZShzKSwgcy5wcm9wcywgZ2V0RGF0YSlcbiAgICB9XG4gIH0sXG5cbiAgY29tcG9uZW50V2lsbFVubW91bnQgKCkge1xuICAgIGNvbnN0IHMgPSB0aGlzXG4gICAgbGV0IGhhbW1lciA9IHNbIFRPVUNIX0hBTU1FUl9LRVkgXVxuICAgIGlmIChoYW1tZXIpIHtcbiAgICAgIGRlc3Ryb3lUb3VjaEhhbW1lcihoYW1tZXIpXG4gICAgfVxuICAgIGRlbGV0ZSBzWyBUT1VDSF9IQU1NRVJfS0VZIF1cbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBPYmplY3QuZnJlZXplKEFwVG91Y2hNaXhpbilcbiJdfQ==