UNPKG

adui

Version:

<div> <img src="https://wxa.wxs.qq.com/mpweb/delivery/legacy/wxadtouch/upload/t1/od834zef_52939fc6.png" style="margin:40px 0 0 -8px; background-color: #fcfcfc; box-shadow: none;" /> </div>

289 lines (256 loc) 37.3 kB
"use strict"; function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); } var _react = _interopRequireWildcard(require("react")); var _enzyme = require("enzyme"); var _reactTestRenderer = _interopRequireDefault(require("react-test-renderer")); var _ = _interopRequireDefault(require("..")); var _core = require("../core"); var _testUtils = require("react-dom/test-utils"); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(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; } function _extends() { _extends = Object.assign ? Object.assign.bind() : 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; }; return _extends.apply(this, arguments); } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); Object.defineProperty(subClass, "prototype", { writable: false }); if (superClass) _setPrototypeOf(subClass, superClass); } function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); } function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; } function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } else if (call !== void 0) { throw new TypeError("Derived constructors may only return object or undefined"); } return _assertThisInitialized(self); } function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; } function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } } function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); } var RangePicker = _["default"].RangePicker; var RangePickerMounter = function (_Component) { _inherits(RangePickerMounter, _Component); var _super = _createSuper(RangePickerMounter); function RangePickerMounter() { var _this; _classCallCheck(this, RangePickerMounter); for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } _this = _super.call.apply(_super, [this].concat(args)); _this.state = { component: null, value: [new Date(), new Date()], visible: true }; return _this; } _createClass(RangePickerMounter, [{ key: "render", value: function render() { var _this2 = this; var _this$state = this.state, value = _this$state.value, visible = _this$state.visible; return _react["default"].createElement(RangePicker, _extends({ shortcuts: [{ label: "祖国生日", value: [new Date("2020-10-01"), new Date("2020-10-07")] }], ref: function ref(component) { if (!_this2.state.component) { _this2.setState({ component: component }); } }, closeOnSelect: true, value: value, visible: visible, onChange: function onChange(val) { return _this2.setState({ value: val }); }, onVisibleChange: function onVisibleChange(bool) { return _this2.setState({ visible: bool }); } }, this.props)); } }]); return RangePickerMounter; }(_react.Component); describe("RangePicker", function () { beforeAll(function () { jest.useFakeTimers(); }); afterAll(function () { jest.useRealTimers(); }); it("是否正确渲染", function () { var wrapper = _reactTestRenderer["default"].create(_react["default"].createElement(RangePicker, null)); expect(wrapper).toMatchSnapshot(); }); it("内部驱动", function () { var val = [new Date("2020-02-02"), new Date("2020-03-01")]; var wrapper = (0, _enzyme.mount)(_react["default"].createElement(RangePicker, { defaultValue: val, defaultVisible: false, closeOnSelect: true })); expect(wrapper.find("input").at(0).props().value).toBe((0, _core.convertDateRangeToString)(val)); wrapper.find("input").simulate("focus"); expect(wrapper.find("Popover").at(0).props().visible).toBe(true); wrapper.find("input").simulate("change", { target: { value: "" } }); expect(wrapper.find("input").props().value).toBe(""); wrapper.find("input").simulate("change", { target: { value: "2020-02-22 - 2020-02-28" } }); expect(wrapper.find("input").props().value).toBe("2020-02-22 - 2020-02-28"); (0, _testUtils.act)(function () { wrapper.find("input").simulate("keydown", { key: "enter", keyCode: 13 }); jest.runAllTimers(); wrapper.update(); expect(wrapper.find("Popover").at(0).props().visible).toBe(false); }); (0, _testUtils.act)(function () { wrapper.find(".adui-date-day").at(14).simulate("click"); wrapper.find(".adui-date-day").at(15).simulate("click"); var expectedVal = (0, _core.convertDateRangeToString)([new Date(wrapper.find(".adui-date-day").at(14).props()["aria-label"] + " 12:00"), new Date(wrapper.find(".adui-date-day").at(15).props()["aria-label"] + " 12:00")]); jest.advanceTimersByTime(350); wrapper.update(); expect(wrapper.find("Popover").at(0).props().visible).toBe(false); }); }); it("外部控制", function () { var val = [new Date(), new Date()]; var wrapper = (0, _enzyme.mount)(_react["default"].createElement(RangePicker, { value: [new Date(), new Date()], visible: true, closeOnSelect: true })); expect(wrapper.find("input").at(0).props().value).toBe((0, _core.convertDateRangeToString)(val)); expect(wrapper.find("Popover").at(0).props().visible).toBe(true); (0, _testUtils.act)(function () { wrapper.find(".adui-date-day").at(14).simulate("click"); wrapper.find(".adui-date-day").at(15).simulate("click"); jest.advanceTimersByTime(350); wrapper.update(); expect(wrapper.find("input").at(0).props().value).toBe((0, _core.convertDateRangeToString)(val)); }); (0, _testUtils.act)(function () { wrapper.find(".adui-date-day").at(15).simulate("click"); wrapper.find(".adui-date-day").at(16).simulate("click"); jest.advanceTimersByTime(350); wrapper.update(); expect(wrapper.find("input").at(0).props().value).toBe((0, _core.convertDateRangeToString)(val)); expect(wrapper.find("Popover").at(0).props().visible).toBe(true); }); var mounter = (0, _enzyme.mount)(_react["default"].createElement(RangePickerMounter, null)); var today = (0, _core.convertDateRangeToString)(new Date()); mounter.find("input").simulate("change", { target: { value: "2020-02-22 - 2020-02-26" } }); expect((0, _core.convertDateRangeToString)(mounter.state().value)).toBe("2020-02-22 - 2020-02-26"); mounter.find("input").simulate("change", { target: { value: "2020-02-25 - 2020-02-26" } }); expect((0, _core.convertDateRangeToString)(mounter.state().value)).toBe("2020-02-25 - 2020-02-26"); mounter.find("input").simulate("change", { target: { value: "" } }); expect((0, _core.convertDateRangeToString)(mounter.state().value)).toBe(""); expect(mounter.find("Popover").at(0).props().visible).toBe(true); (0, _testUtils.act)(function () { mounter.find(".adui-date-day").at(15).simulate("click"); mounter.find(".adui-date-day").at(16).simulate("click"); jest.runAllTimers(); mounter.update(); }); }); it("DayPicker 操作", function () { var today = new Date(); var wrapper = (0, _enzyme.mount)(_react["default"].createElement(RangePickerMounter, null)); var expectedRange = []; (0, _testUtils.act)(function () { wrapper.find(".adui-date-day").at(10).simulate("click"); expectedRange[0] = new Date(wrapper.find(".adui-date-day").at(10).props()["aria-label"] + " 12:00"); wrapper.find("button").at(1).simulate("click"); wrapper.find("button").at(1).simulate("click"); jest.runAllTimers(); wrapper.update(); }); (0, _testUtils.act)(function () { wrapper.find(".adui-date-day").at(10).simulate("click"); expectedRange[1] = new Date(wrapper.find(".adui-date-day").at(10).props()["aria-label"] + " 12:00"); jest.runAllTimers(); wrapper.update(); expect((0, _core.convertDateRangeToString)(wrapper.state().value) === (0, _core.convertDateRangeToString)(expectedRange)).toBe(true); }); (0, _testUtils.act)(function () { wrapper.find(".adui-date-shortcut").at(0).simulate("keydown", { key: "enter", keyCode: 13 }); jest.runAllTimers(); wrapper.update(); expect((0, _core.convertDateRangeToString)(wrapper.state().value)).toBe("2020-10-01 - 2020-10-07"); }); var wrapperForCoverage0 = (0, _enzyme.mount)(_react["default"].createElement(RangePickerMounter, { disabled: true })); wrapperForCoverage0.state().component.handleVisibleChange(false); wrapperForCoverage0.find(".adui-date-day").at(14).simulate("mouseenter"); wrapperForCoverage0.find(".adui-date-day").at(14).simulate("mouseleave"); jest.runAllTimers(); }); it("测试 min max", function () { var wrapper = (0, _enzyme.mount)(_react["default"].createElement(RangePickerMounter, { minDate: new Date("2018-12-31"), maxDate: new Date("2020-01-01") })); (0, _testUtils.act)(function () { wrapper.find("select").at(0).simulate("change", { target: { value: "2019" } }); wrapper.find("select").at(1).simulate("change", { target: { value: "1" } }); jest.runAllTimers(); wrapper.update(); wrapper.find(".adui-date-day").at(14).simulate("click"); jest.runAllTimers(); wrapper.update(); wrapper.find("select").at(1).simulate("change", { target: { value: "11" } }); wrapper.find("select").at(0).simulate("change", { target: { value: "2020" } }); jest.runAllTimers(); wrapper.update(); wrapper.find(".adui-date-day").at(14).simulate("click"); jest.runAllTimers(); wrapper.update(); }); }); }); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJSYW5nZVBpY2tlciIsIkRhdGVQaWNrZXIiLCJSYW5nZVBpY2tlck1vdW50ZXIiLCJzdGF0ZSIsImNvbXBvbmVudCIsInZhbHVlIiwiRGF0ZSIsInZpc2libGUiLCJsYWJlbCIsInNldFN0YXRlIiwidmFsIiwiYm9vbCIsInByb3BzIiwiQ29tcG9uZW50IiwiZGVzY3JpYmUiLCJiZWZvcmVBbGwiLCJqZXN0IiwidXNlRmFrZVRpbWVycyIsImFmdGVyQWxsIiwidXNlUmVhbFRpbWVycyIsIml0Iiwid3JhcHBlciIsIlRlc3RSZW5kZXJlciIsImNyZWF0ZSIsImV4cGVjdCIsInRvTWF0Y2hTbmFwc2hvdCIsIm1vdW50IiwiZmluZCIsImF0IiwidG9CZSIsImNvbnZlcnREYXRlUmFuZ2VUb1N0cmluZyIsInNpbXVsYXRlIiwidGFyZ2V0IiwiYWN0Iiwia2V5Iiwia2V5Q29kZSIsInJ1bkFsbFRpbWVycyIsInVwZGF0ZSIsImV4cGVjdGVkVmFsIiwiYWR2YW5jZVRpbWVyc0J5VGltZSIsIm1vdW50ZXIiLCJ0b2RheSIsImV4cGVjdGVkUmFuZ2UiLCJ3cmFwcGVyRm9yQ292ZXJhZ2UwIiwiaGFuZGxlVmlzaWJsZUNoYW5nZSJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2NvbXBvbmVudHMvZGF0ZS1waWNrZXIvX190ZXN0c19fL1JhbmdlUGlja2VyLnRlc3QudHN4Il0sInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlICovXG4vLyBAdHMtbm9jaGVja1xuaW1wb3J0IFJlYWN0LCB7IENvbXBvbmVudCB9IGZyb20gXCJyZWFjdFwiXG5pbXBvcnQgeyBtb3VudCB9IGZyb20gXCJlbnp5bWVcIlxuaW1wb3J0IFRlc3RSZW5kZXJlciBmcm9tIFwicmVhY3QtdGVzdC1yZW5kZXJlclwiXG5pbXBvcnQgRGF0ZVBpY2tlciBmcm9tIFwiLi5cIlxuaW1wb3J0IHsgY29udmVydERhdGVSYW5nZVRvU3RyaW5nLCBjb252ZXJ0RGF0ZVRvU3RyaW5nIH0gZnJvbSBcIi4uL2NvcmVcIlxuaW1wb3J0IHsgYWN0IH0gZnJvbSBcInJlYWN0LWRvbS90ZXN0LXV0aWxzXCJcblxuY29uc3QgUmFuZ2VQaWNrZXIgPSBEYXRlUGlja2VyLlJhbmdlUGlja2VyXG5cbmNsYXNzIFJhbmdlUGlja2VyTW91bnRlciBleHRlbmRzIENvbXBvbmVudCB7XG4gIHN0YXRlID0ge1xuICAgIGNvbXBvbmVudDogbnVsbCxcbiAgICB2YWx1ZTogW25ldyBEYXRlKCksIG5ldyBEYXRlKCldLFxuICAgIHZpc2libGU6IHRydWUsXG4gIH1cblxuICByZW5kZXIoKSB7XG4gICAgY29uc3QgeyB2YWx1ZSwgdmlzaWJsZSB9ID0gdGhpcy5zdGF0ZVxuICAgIHJldHVybiAoXG4gICAgICA8UmFuZ2VQaWNrZXJcbiAgICAgICAgc2hvcnRjdXRzPXtbXG4gICAgICAgICAge1xuICAgICAgICAgICAgbGFiZWw6IFwi56WW5Zu955Sf5pelXCIsXG4gICAgICAgICAgICB2YWx1ZTogW25ldyBEYXRlKFwiMjAyMC0xMC0wMVwiKSwgbmV3IERhdGUoXCIyMDIwLTEwLTA3XCIpXSxcbiAgICAgICAgICB9LFxuICAgICAgICBdfVxuICAgICAgICByZWY9eyhjb21wb25lbnQpID0+IHtcbiAgICAgICAgICBpZiAoIXRoaXMuc3RhdGUuY29tcG9uZW50KSB7XG4gICAgICAgICAgICB0aGlzLnNldFN0YXRlKHsgY29tcG9uZW50IH0pXG4gICAgICAgICAgfVxuICAgICAgICB9fVxuICAgICAgICBjbG9zZU9uU2VsZWN0XG4gICAgICAgIHZhbHVlPXt2YWx1ZX1cbiAgICAgICAgdmlzaWJsZT17dmlzaWJsZX1cbiAgICAgICAgb25DaGFuZ2U9eyh2YWwpID0+IHRoaXMuc2V0U3RhdGUoeyB2YWx1ZTogdmFsIH0pfVxuICAgICAgICBvblZpc2libGVDaGFuZ2U9eyhib29sKSA9PiB0aGlzLnNldFN0YXRlKHsgdmlzaWJsZTogYm9vbCB9KX1cbiAgICAgICAgey4uLnRoaXMucHJvcHN9XG4gICAgICAvPlxuICAgIClcbiAgfVxufVxuXG5kZXNjcmliZShcIlJhbmdlUGlja2VyXCIsICgpID0+IHtcbiAgYmVmb3JlQWxsKCgpID0+IHtcbiAgICBqZXN0LnVzZUZha2VUaW1lcnMoKVxuICB9KVxuXG4gIGFmdGVyQWxsKCgpID0+IHtcbiAgICBqZXN0LnVzZVJlYWxUaW1lcnMoKVxuICB9KVxuXG4gIGl0KFwi5piv5ZCm5q2j56Gu5riy5p+TXCIsICgpID0+IHtcbiAgICBjb25zdCB3cmFwcGVyID0gVGVzdFJlbmRlcmVyLmNyZWF0ZSg8UmFuZ2VQaWNrZXIgLz4pXG4gICAgZXhwZWN0KHdyYXBwZXIpLnRvTWF0Y2hTbmFwc2hvdCgpXG4gIH0pXG5cbiAgaXQoXCLlhoXpg6jpqbHliqhcIiwgKCkgPT4ge1xuICAgIGNvbnN0IHZhbCA9IFtuZXcgRGF0ZShcIjIwMjAtMDItMDJcIiksIG5ldyBEYXRlKFwiMjAyMC0wMy0wMVwiKV1cbiAgICBjb25zdCB3cmFwcGVyID0gbW91bnQoXG4gICAgICA8UmFuZ2VQaWNrZXIgZGVmYXVsdFZhbHVlPXt2YWx9IGRlZmF1bHRWaXNpYmxlPXtmYWxzZX0gY2xvc2VPblNlbGVjdCAvPlxuICAgIClcbiAgICBleHBlY3Qod3JhcHBlci5maW5kKFwiaW5wdXRcIikuYXQoMCkucHJvcHMoKS52YWx1ZSkudG9CZShcbiAgICAgIGNvbnZlcnREYXRlUmFuZ2VUb1N0cmluZyh2YWwpXG4gICAgKVxuXG4gICAgd3JhcHBlci5maW5kKFwiaW5wdXRcIikuc2ltdWxhdGUoXCJmb2N1c1wiKVxuXG4gICAgZXhwZWN0KHdyYXBwZXIuZmluZChcIlBvcG92ZXJcIikuYXQoMCkucHJvcHMoKS52aXNpYmxlKS50b0JlKHRydWUpXG5cbiAgICB3cmFwcGVyLmZpbmQoXCJpbnB1dFwiKS5zaW11bGF0ZShcImNoYW5nZVwiLCB7IHRhcmdldDogeyB2YWx1ZTogXCJcIiB9IH0pXG4gICAgZXhwZWN0KHdyYXBwZXIuZmluZChcImlucHV0XCIpLnByb3BzKCkudmFsdWUpLnRvQmUoXCJcIilcblxuICAgIHdyYXBwZXJcbiAgICAgIC5maW5kKFwiaW5wdXRcIilcbiAgICAgIC5zaW11bGF0ZShcImNoYW5nZVwiLCB7IHRhcmdldDogeyB2YWx1ZTogXCIyMDIwLTAyLTIyIC0gMjAyMC0wMi0yOFwiIH0gfSlcbiAgICBleHBlY3Qod3JhcHBlci5maW5kKFwiaW5wdXRcIikucHJvcHMoKS52YWx1ZSkudG9CZShcIjIwMjAtMDItMjIgLSAyMDIwLTAyLTI4XCIpXG5cbiAgICBhY3QoKCkgPT4ge1xuICAgICAgd3JhcHBlci5maW5kKFwiaW5wdXRcIikuc2ltdWxhdGUoXCJrZXlkb3duXCIsIHsga2V5OiBcImVudGVyXCIsIGtleUNvZGU6IDEzIH0pXG4gICAgICBqZXN0LnJ1bkFsbFRpbWVycygpXG4gICAgICB3cmFwcGVyLnVwZGF0ZSgpXG4gICAgICBleHBlY3Qod3JhcHBlci5maW5kKFwiUG9wb3ZlclwiKS5hdCgwKS5wcm9wcygpLnZpc2libGUpLnRvQmUoZmFsc2UpXG4gICAgfSlcblxuICAgIGFjdCgoKSA9PiB7XG4gICAgICB3cmFwcGVyLmZpbmQoXCIuYWR1aS1kYXRlLWRheVwiKS5hdCgxNCkuc2ltdWxhdGUoXCJjbGlja1wiKVxuICAgICAgd3JhcHBlci5maW5kKFwiLmFkdWktZGF0ZS1kYXlcIikuYXQoMTUpLnNpbXVsYXRlKFwiY2xpY2tcIilcbiAgICAgIGNvbnN0IGV4cGVjdGVkVmFsID0gY29udmVydERhdGVSYW5nZVRvU3RyaW5nKFtcbiAgICAgICAgbmV3IERhdGUoXG4gICAgICAgICAgd3JhcHBlci5maW5kKFwiLmFkdWktZGF0ZS1kYXlcIikuYXQoMTQpLnByb3BzKClbXCJhcmlhLWxhYmVsXCJdICsgXCIgMTI6MDBcIlxuICAgICAgICApLFxuICAgICAgICBuZXcgRGF0ZShcbiAgICAgICAgICB3cmFwcGVyLmZpbmQoXCIuYWR1aS1kYXRlLWRheVwiKS5hdCgxNSkucHJvcHMoKVtcImFyaWEtbGFiZWxcIl0gKyBcIiAxMjowMFwiXG4gICAgICAgICksXG4gICAgICBdKVxuICAgICAgLy8g562J5b6FIDM1MG1zXG4gICAgICBqZXN0LmFkdmFuY2VUaW1lcnNCeVRpbWUoMzUwKVxuICAgICAgd3JhcHBlci51cGRhdGUoKVxuICAgICAgZXhwZWN0KHdyYXBwZXIuZmluZChcIlBvcG92ZXJcIikuYXQoMCkucHJvcHMoKS52aXNpYmxlKS50b0JlKGZhbHNlKVxuICAgIH0pXG4gIH0pXG5cbiAgaXQoXCLlpJbpg6jmjqfliLZcIiwgKCkgPT4ge1xuICAgIC8qKlxuICAgICAqIOS7peS4i+mDveaYr+mqjOivgeWklumDqOaOp+WItuaXtuWGhemDqOeahOWkseaViFxuICAgICAqL1xuICAgIGNvbnN0IHZhbCA9IFtuZXcgRGF0ZSgpLCBuZXcgRGF0ZSgpXVxuICAgIGNvbnN0IHdyYXBwZXIgPSBtb3VudChcbiAgICAgIDxSYW5nZVBpY2tlciB2YWx1ZT17W25ldyBEYXRlKCksIG5ldyBEYXRlKCldfSB2aXNpYmxlIGNsb3NlT25TZWxlY3QgLz5cbiAgICApXG4gICAgZXhwZWN0KHdyYXBwZXIuZmluZChcImlucHV0XCIpLmF0KDApLnByb3BzKCkudmFsdWUpLnRvQmUoXG4gICAgICBjb252ZXJ0RGF0ZVJhbmdlVG9TdHJpbmcodmFsKVxuICAgIClcblxuICAgIGV4cGVjdCh3cmFwcGVyLmZpbmQoXCJQb3BvdmVyXCIpLmF0KDApLnByb3BzKCkudmlzaWJsZSkudG9CZSh0cnVlKVxuXG4gICAgYWN0KCgpID0+IHtcbiAgICAgIHdyYXBwZXIuZmluZChcIi5hZHVpLWRhdGUtZGF5XCIpLmF0KDE0KS5zaW11bGF0ZShcImNsaWNrXCIpXG4gICAgICB3cmFwcGVyLmZpbmQoXCIuYWR1aS1kYXRlLWRheVwiKS5hdCgxNSkuc2ltdWxhdGUoXCJjbGlja1wiKVxuICAgICAgLy8g562J5b6FIDM1MG1zXG4gICAgICBqZXN0LmFkdmFuY2VUaW1lcnNCeVRpbWUoMzUwKVxuICAgICAgd3JhcHBlci51cGRhdGUoKVxuICAgICAgZXhwZWN0KHdyYXBwZXIuZmluZChcImlucHV0XCIpLmF0KDApLnByb3BzKCkudmFsdWUpLnRvQmUoXG4gICAgICAgIGNvbnZlcnREYXRlUmFuZ2VUb1N0cmluZyh2YWwpXG4gICAgICApXG4gICAgfSlcblxuICAgIGFjdCgoKSA9PiB7XG4gICAgICB3cmFwcGVyLmZpbmQoXCIuYWR1aS1kYXRlLWRheVwiKS5hdCgxNSkuc2ltdWxhdGUoXCJjbGlja1wiKVxuICAgICAgd3JhcHBlci5maW5kKFwiLmFkdWktZGF0ZS1kYXlcIikuYXQoMTYpLnNpbXVsYXRlKFwiY2xpY2tcIilcbiAgICAgIC8vIOetieW+hSAzNTBtc1xuICAgICAgamVzdC5hZHZhbmNlVGltZXJzQnlUaW1lKDM1MClcbiAgICAgIHdyYXBwZXIudXBkYXRlKClcbiAgICAgIGV4cGVjdCh3cmFwcGVyLmZpbmQoXCJpbnB1dFwiKS5hdCgwKS5wcm9wcygpLnZhbHVlKS50b0JlKFxuICAgICAgICBjb252ZXJ0RGF0ZVJhbmdlVG9TdHJpbmcodmFsKVxuICAgICAgKVxuICAgICAgZXhwZWN0KHdyYXBwZXIuZmluZChcIlBvcG92ZXJcIikuYXQoMCkucHJvcHMoKS52aXNpYmxlKS50b0JlKHRydWUpXG4gICAgfSlcblxuICAgIC8qKlxuICAgICAqIOS7peS4i+aYr+mqjOivgeWklumDqOaOp+WItuaXtiBnZXREZXJpdmVkU3RhdGVGcm9tUHJvcHMg55qE5pyJ5pWIXG4gICAgICovXG4gICAgY29uc3QgbW91bnRlciA9IG1vdW50KDxSYW5nZVBpY2tlck1vdW50ZXIgLz4pXG4gICAgY29uc3QgdG9kYXkgPSBjb252ZXJ0RGF0ZVJhbmdlVG9TdHJpbmcobmV3IERhdGUoKSlcbiAgICBtb3VudGVyXG4gICAgICAuZmluZChcImlucHV0XCIpXG4gICAgICAuc2ltdWxhdGUoXCJjaGFuZ2VcIiwgeyB0YXJnZXQ6IHsgdmFsdWU6IFwiMjAyMC0wMi0yMiAtIDIwMjAtMDItMjZcIiB9IH0pXG4gICAgZXhwZWN0KGNvbnZlcnREYXRlUmFuZ2VUb1N0cmluZyhtb3VudGVyLnN0YXRlKCkudmFsdWUpKS50b0JlKFxuICAgICAgXCIyMDIwLTAyLTIyIC0gMjAyMC0wMi0yNlwiXG4gICAgKVxuICAgIG1vdW50ZXJcbiAgICAgIC5maW5kKFwiaW5wdXRcIilcbiAgICAgIC5zaW11bGF0ZShcImNoYW5nZVwiLCB7IHRhcmdldDogeyB2YWx1ZTogXCIyMDIwLTAyLTI1IC0gMjAyMC0wMi0yNlwiIH0gfSlcbiAgICBleHBlY3QoY29udmVydERhdGVSYW5nZVRvU3RyaW5nKG1vdW50ZXIuc3RhdGUoKS52YWx1ZSkpLnRvQmUoXG4gICAgICBcIjIwMjAtMDItMjUgLSAyMDIwLTAyLTI2XCJcbiAgICApXG4gICAgbW91bnRlci5maW5kKFwiaW5wdXRcIikuc2ltdWxhdGUoXCJjaGFuZ2VcIiwgeyB0YXJnZXQ6IHsgdmFsdWU6IFwiXCIgfSB9KVxuICAgIGV4cGVjdChjb252ZXJ0RGF0ZVJhbmdlVG9TdHJpbmcobW91bnRlci5zdGF0ZSgpLnZhbHVlKSkudG9CZShcIlwiKVxuICAgIGV4cGVjdChtb3VudGVyLmZpbmQoXCJQb3BvdmVyXCIpLmF0KDApLnByb3BzKCkudmlzaWJsZSkudG9CZSh0cnVlKVxuICAgIGFjdCgoKSA9PiB7XG4gICAgICBtb3VudGVyLmZpbmQoXCIuYWR1aS1kYXRlLWRheVwiKS5hdCgxNSkuc2ltdWxhdGUoXCJjbGlja1wiKVxuICAgICAgbW91bnRlci5maW5kKFwiLmFkdWktZGF0ZS1kYXlcIikuYXQoMTYpLnNpbXVsYXRlKFwiY2xpY2tcIilcbiAgICAgIGplc3QucnVuQWxsVGltZXJzKClcbiAgICAgIG1vdW50ZXIudXBkYXRlKClcbiAgICB9KVxuICB9KVxuXG4gIGl0KFwiRGF5UGlja2VyIOaTjeS9nFwiLCAoKSA9PiB7XG4gICAgY29uc3QgdG9kYXkgPSBuZXcgRGF0ZSgpXG4gICAgY29uc3Qgd3JhcHBlciA9IG1vdW50KDxSYW5nZVBpY2tlck1vdW50ZXIgLz4pXG4gICAgY29uc3QgZXhwZWN0ZWRSYW5nZSA9IFtdXG4gICAgYWN0KCgpID0+IHtcbiAgICAgIHdyYXBwZXIuZmluZChcIi5hZHVpLWRhdGUtZGF5XCIpLmF0KDEwKS5zaW11bGF0ZShcImNsaWNrXCIpXG4gICAgICBleHBlY3RlZFJhbmdlWzBdID0gbmV3IERhdGUoXG4gICAgICAgIHdyYXBwZXIuZmluZChcIi5hZHVpLWRhdGUtZGF5XCIpLmF0KDEwKS5wcm9wcygpW1wiYXJpYS1sYWJlbFwiXSArIFwiIDEyOjAwXCJcbiAgICAgIClcbiAgICAgIHdyYXBwZXIuZmluZChcImJ1dHRvblwiKS5hdCgxKS5zaW11bGF0ZShcImNsaWNrXCIpXG4gICAgICB3cmFwcGVyLmZpbmQoXCJidXR0b25cIikuYXQoMSkuc2ltdWxhdGUoXCJjbGlja1wiKVxuICAgICAgamVzdC5ydW5BbGxUaW1lcnMoKVxuICAgICAgd3JhcHBlci51cGRhdGUoKVxuICAgIH0pXG5cbiAgICBhY3QoKCkgPT4ge1xuICAgICAgd3JhcHBlci5maW5kKFwiLmFkdWktZGF0ZS1kYXlcIikuYXQoMTApLnNpbXVsYXRlKFwiY2xpY2tcIilcbiAgICAgIGV4cGVjdGVkUmFuZ2VbMV0gPSBuZXcgRGF0ZShcbiAgICAgICAgd3JhcHBlci5maW5kKFwiLmFkdWktZGF0ZS1kYXlcIikuYXQoMTApLnByb3BzKClbXCJhcmlhLWxhYmVsXCJdICsgXCIgMTI6MDBcIlxuICAgICAgKVxuICAgICAgamVzdC5ydW5BbGxUaW1lcnMoKVxuICAgICAgd3JhcHBlci51cGRhdGUoKVxuICAgICAgZXhwZWN0KFxuICAgICAgICBjb252ZXJ0RGF0ZVJhbmdlVG9TdHJpbmcod3JhcHBlci5zdGF0ZSgpLnZhbHVlKSA9PT1cbiAgICAgICAgICBjb252ZXJ0RGF0ZVJhbmdlVG9TdHJpbmcoZXhwZWN0ZWRSYW5nZSlcbiAgICAgICkudG9CZSh0cnVlKVxuICAgIH0pXG5cbiAgICBhY3QoKCkgPT4ge1xuICAgICAgd3JhcHBlclxuICAgICAgICAuZmluZChcIi5hZHVpLWRhdGUtc2hvcnRjdXRcIilcbiAgICAgICAgLmF0KDApXG4gICAgICAgIC5zaW11bGF0ZShcImtleWRvd25cIiwgeyBrZXk6IFwiZW50ZXJcIiwga2V5Q29kZTogMTMgfSlcbiAgICAgIGplc3QucnVuQWxsVGltZXJzKClcbiAgICAgIHdyYXBwZXIudXBkYXRlKClcbiAgICAgIGV4cGVjdChjb252ZXJ0RGF0ZVJhbmdlVG9TdHJpbmcod3JhcHBlci5zdGF0ZSgpLnZhbHVlKSkudG9CZShcbiAgICAgICAgXCIyMDIwLTEwLTAxIC0gMjAyMC0xMC0wN1wiXG4gICAgICApXG4gICAgfSlcblxuICAgIGNvbnN0IHdyYXBwZXJGb3JDb3ZlcmFnZTAgPSBtb3VudCg8UmFuZ2VQaWNrZXJNb3VudGVyIGRpc2FibGVkIC8+KVxuICAgIHdyYXBwZXJGb3JDb3ZlcmFnZTAuc3RhdGUoKS5jb21wb25lbnQuaGFuZGxlVmlzaWJsZUNoYW5nZShmYWxzZSlcbiAgICB3cmFwcGVyRm9yQ292ZXJhZ2UwLmZpbmQoXCIuYWR1aS1kYXRlLWRheVwiKS5hdCgxNCkuc2ltdWxhdGUoXCJtb3VzZWVudGVyXCIpXG4gICAgd3JhcHBlckZvckNvdmVyYWdlMC5maW5kKFwiLmFkdWktZGF0ZS1kYXlcIikuYXQoMTQpLnNpbXVsYXRlKFwibW91c2VsZWF2ZVwiKVxuICAgIGplc3QucnVuQWxsVGltZXJzKClcbiAgfSlcblxuICBpdChcIua1i+ivlSBtaW4gbWF4XCIsICgpID0+IHtcbiAgICBjb25zdCB3cmFwcGVyID0gbW91bnQoXG4gICAgICA8UmFuZ2VQaWNrZXJNb3VudGVyXG4gICAgICAgIG1pbkRhdGU9e25ldyBEYXRlKFwiMjAxOC0xMi0zMVwiKX1cbiAgICAgICAgbWF4RGF0ZT17bmV3IERhdGUoXCIyMDIwLTAxLTAxXCIpfVxuICAgICAgLz5cbiAgICApXG4gICAgYWN0KCgpID0+IHtcbiAgICAgIHdyYXBwZXJcbiAgICAgICAgLmZpbmQoXCJzZWxlY3RcIilcbiAgICAgICAgLmF0KDApXG4gICAgICAgIC5zaW11bGF0ZShcImNoYW5nZVwiLCB7IHRhcmdldDogeyB2YWx1ZTogXCIyMDE5XCIgfSB9KVxuICAgICAgd3JhcHBlclxuICAgICAgICAuZmluZChcInNlbGVjdFwiKVxuICAgICAgICAuYXQoMSlcbiAgICAgICAgLnNpbXVsYXRlKFwiY2hhbmdlXCIsIHsgdGFyZ2V0OiB7IHZhbHVlOiBcIjFcIiB9IH0pXG4gICAgICBqZXN0LnJ1bkFsbFRpbWVycygpXG4gICAgICB3cmFwcGVyLnVwZGF0ZSgpXG4gICAgICB3cmFwcGVyLmZpbmQoXCIuYWR1aS1kYXRlLWRheVwiKS5hdCgxNCkuc2ltdWxhdGUoXCJjbGlja1wiKVxuICAgICAgamVzdC5ydW5BbGxUaW1lcnMoKVxuICAgICAgd3JhcHBlci51cGRhdGUoKVxuICAgICAgd3JhcHBlclxuICAgICAgICAuZmluZChcInNlbGVjdFwiKVxuICAgICAgICAuYXQoMSlcbiAgICAgICAgLnNpbXVsYXRlKFwiY2hhbmdlXCIsIHsgdGFyZ2V0OiB7IHZhbHVlOiBcIjExXCIgfSB9KVxuICAgICAgd3JhcHBlclxuICAgICAgICAuZmluZChcInNlbGVjdFwiKVxuICAgICAgICAuYXQoMClcbiAgICAgICAgLnNpbXVsYXRlKFwiY2hhbmdlXCIsIHsgdGFyZ2V0OiB7IHZhbHVlOiBcIjIwMjBcIiB9IH0pXG4gICAgICBqZXN0LnJ1bkFsbFRpbWVycygpXG4gICAgICB3cmFwcGVyLnVwZGF0ZSgpXG4gICAgICB3cmFwcGVyLmZpbmQoXCIuYWR1aS1kYXRlLWRheVwiKS5hdCgxNCkuc2ltdWxhdGUoXCJjbGlja1wiKVxuICAgICAgamVzdC5ydW5BbGxUaW1lcnMoKVxuICAgICAgd3JhcHBlci51cGRhdGUoKVxuICAgIH0pXG4gIH0pXG59KVxuIl0sIm1hcHBpbmdzIjoiOzs7O0FBRUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUVBLElBQU1BLFdBQVcsR0FBR0MsWUFBQSxDQUFXRCxXQUEvQjs7SUFFTUUsa0I7Ozs7Ozs7Ozs7Ozs7OztVQUNKQyxLLEdBQVE7TUFDTkMsU0FBUyxFQUFFLElBREw7TUFFTkMsS0FBSyxFQUFFLENBQUMsSUFBSUMsSUFBSixFQUFELEVBQWEsSUFBSUEsSUFBSixF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