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>

244 lines (221 loc) 29.6 kB
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); } 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); } import React, { Component } from "react"; import { mount } from "enzyme"; import TestRenderer from "react-test-renderer"; import DatePicker from ".."; import { convertDateToString } from "../core"; import { act } from "react-dom/test-utils"; var DatePickerMounter = function (_Component) { _inherits(DatePickerMounter, _Component); var _super = _createSuper(DatePickerMounter); function DatePickerMounter() { var _this; _classCallCheck(this, DatePickerMounter); 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(), visible: true }; return _this; } _createClass(DatePickerMounter, [{ key: "render", value: function render() { var _this2 = this; var _this$state = this.state, value = _this$state.value, visible = _this$state.visible; return React.createElement(DatePicker, _extends({ shortcuts: [{ label: "祖国生日", value: new Date("2020-10-01") }], 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 DatePickerMounter; }(Component); describe("DatePicker", function () { beforeAll(function () { jest.useFakeTimers(); }); afterAll(function () { jest.useRealTimers(); }); it("是否正确渲染", function () { var wrapper = TestRenderer.create(React.createElement(DatePicker, null)); expect(wrapper).toMatchSnapshot(); }); it("内部驱动", function () { var val = new Date(); var wrapper = mount(React.createElement(DatePicker, { defaultValue: val, defaultVisible: false, closeOnSelect: true })); expect(wrapper.find("input").at(0).props().value).toBe(convertDateToString(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" } }); expect(wrapper.find("input").props().value).toBe("2020-02-22"); 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); }); act(function () { wrapper.find(".adui-date-day").at(14).simulate("click"); var expectedVal = convertDateToString(new Date(wrapper.find(".adui-date-day").at(14).props()["aria-label"])); jest.advanceTimersByTime(350); wrapper.update(); expect(wrapper.find("input").at(0).props().value).toBe(expectedVal); expect(wrapper.find("Popover").at(0).props().visible).toBe(false); }); }); it("外部控制", function () { var val = new Date(); var wrapper = mount(React.createElement(DatePicker, { value: new Date(), visible: true, closeOnSelect: true })); expect(wrapper.find("input").at(0).props().value).toBe(convertDateToString(val)); expect(wrapper.find("Popover").at(0).props().visible).toBe(true); act(function () { wrapper.find(".adui-date-day").at(14).simulate("click"); jest.advanceTimersByTime(350); wrapper.update(); expect(wrapper.find("input").at(0).props().value).toBe(convertDateToString(val)); }); act(function () { wrapper.find(".adui-date-day").at(15).simulate("click"); jest.advanceTimersByTime(350); wrapper.update(); expect(wrapper.find("input").at(0).props().value).toBe(convertDateToString(val)); expect(wrapper.find("Popover").at(0).props().visible).toBe(true); }); var mounter = mount(React.createElement(DatePickerMounter, null)); var today = convertDateToString(new Date()); mounter.find("input").simulate("change", { target: { value: "2020-02-22" } }); expect(convertDateToString(mounter.state().value)).toBe("2020-02-22"); mounter.find("input").simulate("change", { target: { value: "2020-02-31" } }); expect(convertDateToString(mounter.state().value)).toBe("2020-02-22"); mounter.find("input").simulate("change", { target: { value: "" } }); expect(convertDateToString(mounter.state().value)).toBe(""); expect(mounter.find("Popover").at(0).props().visible).toBe(true); act(function () { mounter.find(".adui-date-day").at(15).simulate("click"); jest.runAllTimers(); mounter.update(); expect(mounter.find("Popover").at(0).props().visible).toBe(false); }); }); it("DayPicker 操作", function () { var today = new Date(); var wrapper = mount(React.createElement(DatePickerMounter, null)); wrapper.find("button").at(0).simulate("click"); act(function () { wrapper.find(".adui-date-day").at(15).simulate("click"); jest.runAllTimers(); wrapper.update(); if (today.getFullYear() > wrapper.state().value.getFullYear()) { expect(today.getMonth() - wrapper.state().value.getMonth()).toBe(-11); } else { expect(today.getMonth() - wrapper.state().value.getMonth()).toBe(1); } }); act(function () { wrapper.find(".adui-date-shortcut").at(0).simulate("click"); jest.runAllTimers(); wrapper.update(); expect(convertDateToString(wrapper.state().value)).toBe("2020-10-01"); }); var wrapperForCoverage0 = mount(React.createElement(DatePickerMounter, { disabled: true })); wrapperForCoverage0.state().component.handleVisibleChange(false); jest.runAllTimers(); }); it("DayPicker 年月切换", function () { var wrapper = mount(React.createElement(DatePickerMounter, null)); act(function () { wrapper.find("select").at(0).simulate("change", { target: { value: "2018" } }); 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(); }); }); }); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJSZWFjdCIsIkNvbXBvbmVudCIsIm1vdW50IiwiVGVzdFJlbmRlcmVyIiwiRGF0ZVBpY2tlciIsImNvbnZlcnREYXRlVG9TdHJpbmciLCJhY3QiLCJEYXRlUGlja2VyTW91bnRlciIsInN0YXRlIiwiY29tcG9uZW50IiwidmFsdWUiLCJEYXRlIiwidmlzaWJsZSIsImxhYmVsIiwic2V0U3RhdGUiLCJ2YWwiLCJib29sIiwicHJvcHMiLCJkZXNjcmliZSIsImJlZm9yZUFsbCIsImplc3QiLCJ1c2VGYWtlVGltZXJzIiwiYWZ0ZXJBbGwiLCJ1c2VSZWFsVGltZXJzIiwiaXQiLCJ3cmFwcGVyIiwiY3JlYXRlIiwiZXhwZWN0IiwidG9NYXRjaFNuYXBzaG90IiwiZmluZCIsImF0IiwidG9CZSIsInNpbXVsYXRlIiwidGFyZ2V0Iiwia2V5Iiwia2V5Q29kZSIsInJ1bkFsbFRpbWVycyIsInVwZGF0ZSIsImV4cGVjdGVkVmFsIiwiYWR2YW5jZVRpbWVyc0J5VGltZSIsIm1vdW50ZXIiLCJ0b2RheSIsImdldEZ1bGxZZWFyIiwiZ2V0TW9udGgiLCJ3cmFwcGVyRm9yQ292ZXJhZ2UwIiwiaGFuZGxlVmlzaWJsZUNoYW5nZSJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2NvbXBvbmVudHMvZGF0ZS1waWNrZXIvX190ZXN0c19fL0RhdGVQaWNrZXIudGVzdC50c3giXSwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgKi9cbi8vIEB0cy1ub2NoZWNrXG5pbXBvcnQgUmVhY3QsIHsgQ29tcG9uZW50IH0gZnJvbSBcInJlYWN0XCJcbmltcG9ydCB7IG1vdW50IH0gZnJvbSBcImVuenltZVwiXG5pbXBvcnQgVGVzdFJlbmRlcmVyIGZyb20gXCJyZWFjdC10ZXN0LXJlbmRlcmVyXCJcbmltcG9ydCBEYXRlUGlja2VyIGZyb20gXCIuLlwiXG5pbXBvcnQgeyBjb252ZXJ0RGF0ZVRvU3RyaW5nIH0gZnJvbSBcIi4uL2NvcmVcIlxuaW1wb3J0IHsgYWN0IH0gZnJvbSBcInJlYWN0LWRvbS90ZXN0LXV0aWxzXCJcblxuY2xhc3MgRGF0ZVBpY2tlck1vdW50ZXIgZXh0ZW5kcyBDb21wb25lbnQge1xuICBzdGF0ZSA9IHtcbiAgICBjb21wb25lbnQ6IG51bGwsXG4gICAgdmFsdWU6IG5ldyBEYXRlKCksXG4gICAgdmlzaWJsZTogdHJ1ZSxcbiAgfVxuXG4gIHJlbmRlcigpIHtcbiAgICBjb25zdCB7IHZhbHVlLCB2aXNpYmxlIH0gPSB0aGlzLnN0YXRlXG4gICAgcmV0dXJuIChcbiAgICAgIDxEYXRlUGlja2VyXG4gICAgICAgIHNob3J0Y3V0cz17W1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGxhYmVsOiBcIuelluWbveeUn+aXpVwiLFxuICAgICAgICAgICAgdmFsdWU6IG5ldyBEYXRlKFwiMjAyMC0xMC0wMVwiKSxcbiAgICAgICAgICB9LFxuICAgICAgICBdfVxuICAgICAgICByZWY9eyhjb21wb25lbnQpID0+IHtcbiAgICAgICAgICBpZiAoIXRoaXMuc3RhdGUuY29tcG9uZW50KSB7XG4gICAgICAgICAgICB0aGlzLnNldFN0YXRlKHsgY29tcG9uZW50IH0pXG4gICAgICAgICAgfVxuICAgICAgICB9fVxuICAgICAgICBjbG9zZU9uU2VsZWN0XG4gICAgICAgIHZhbHVlPXt2YWx1ZX1cbiAgICAgICAgdmlzaWJsZT17dmlzaWJsZX1cbiAgICAgICAgb25DaGFuZ2U9eyh2YWwpID0+IHRoaXMuc2V0U3RhdGUoeyB2YWx1ZTogdmFsIH0pfVxuICAgICAgICBvblZpc2libGVDaGFuZ2U9eyhib29sKSA9PiB0aGlzLnNldFN0YXRlKHsgdmlzaWJsZTogYm9vbCB9KX1cbiAgICAgICAgey4uLnRoaXMucHJvcHN9XG4gICAgICAvPlxuICAgIClcbiAgfVxufVxuXG5kZXNjcmliZShcIkRhdGVQaWNrZXJcIiwgKCkgPT4ge1xuICBiZWZvcmVBbGwoKCkgPT4ge1xuICAgIGplc3QudXNlRmFrZVRpbWVycygpXG4gIH0pXG5cbiAgYWZ0ZXJBbGwoKCkgPT4ge1xuICAgIGplc3QudXNlUmVhbFRpbWVycygpXG4gIH0pXG5cbiAgaXQoXCLmmK/lkKbmraPnoa7muLLmn5NcIiwgKCkgPT4ge1xuICAgIGNvbnN0IHdyYXBwZXIgPSBUZXN0UmVuZGVyZXIuY3JlYXRlKDxEYXRlUGlja2VyIC8+KVxuICAgIGV4cGVjdCh3cmFwcGVyKS50b01hdGNoU25hcHNob3QoKVxuICB9KVxuXG4gIGl0KFwi5YaF6YOo6amx5YqoXCIsICgpID0+IHtcbiAgICBjb25zdCB2YWwgPSBuZXcgRGF0ZSgpXG4gICAgY29uc3Qgd3JhcHBlciA9IG1vdW50KFxuICAgICAgPERhdGVQaWNrZXIgZGVmYXVsdFZhbHVlPXt2YWx9IGRlZmF1bHRWaXNpYmxlPXtmYWxzZX0gY2xvc2VPblNlbGVjdCAvPlxuICAgIClcbiAgICBleHBlY3Qod3JhcHBlci5maW5kKFwiaW5wdXRcIikuYXQoMCkucHJvcHMoKS52YWx1ZSkudG9CZShcbiAgICAgIGNvbnZlcnREYXRlVG9TdHJpbmcodmFsKVxuICAgIClcblxuICAgIHdyYXBwZXIuZmluZChcImlucHV0XCIpLnNpbXVsYXRlKFwiZm9jdXNcIilcblxuICAgIGV4cGVjdCh3cmFwcGVyLmZpbmQoXCJQb3BvdmVyXCIpLmF0KDApLnByb3BzKCkudmlzaWJsZSkudG9CZSh0cnVlKVxuXG4gICAgd3JhcHBlci5maW5kKFwiaW5wdXRcIikuc2ltdWxhdGUoXCJjaGFuZ2VcIiwgeyB0YXJnZXQ6IHsgdmFsdWU6IFwiXCIgfSB9KVxuICAgIGV4cGVjdCh3cmFwcGVyLmZpbmQoXCJpbnB1dFwiKS5wcm9wcygpLnZhbHVlKS50b0JlKFwiXCIpXG5cbiAgICB3cmFwcGVyXG4gICAgICAuZmluZChcImlucHV0XCIpXG4gICAgICAuc2ltdWxhdGUoXCJjaGFuZ2VcIiwgeyB0YXJnZXQ6IHsgdmFsdWU6IFwiMjAyMC0wMi0yMlwiIH0gfSlcbiAgICBleHBlY3Qod3JhcHBlci5maW5kKFwiaW5wdXRcIikucHJvcHMoKS52YWx1ZSkudG9CZShcIjIwMjAtMDItMjJcIilcblxuICAgIGFjdCgoKSA9PiB7XG4gICAgICB3cmFwcGVyLmZpbmQoXCJpbnB1dFwiKS5zaW11bGF0ZShcImtleWRvd25cIiwgeyBrZXk6IFwiZW50ZXJcIiwga2V5Q29kZTogMTMgfSlcbiAgICAgIGplc3QucnVuQWxsVGltZXJzKClcbiAgICAgIHdyYXBwZXIudXBkYXRlKClcbiAgICAgIGV4cGVjdCh3cmFwcGVyLmZpbmQoXCJQb3BvdmVyXCIpLmF0KDApLnByb3BzKCkudmlzaWJsZSkudG9CZShmYWxzZSlcbiAgICB9KVxuXG4gICAgYWN0KCgpID0+IHtcbiAgICAgIHdyYXBwZXIuZmluZChcIi5hZHVpLWRhdGUtZGF5XCIpLmF0KDE0KS5zaW11bGF0ZShcImNsaWNrXCIpXG4gICAgICBjb25zdCBleHBlY3RlZFZhbCA9IGNvbnZlcnREYXRlVG9TdHJpbmcoXG4gICAgICAgIG5ldyBEYXRlKHdyYXBwZXIuZmluZChcIi5hZHVpLWRhdGUtZGF5XCIpLmF0KDE0KS5wcm9wcygpW1wiYXJpYS1sYWJlbFwiXSlcbiAgICAgIClcbiAgICAgIC8vIOetieW+hSAzNTBtc1xuICAgICAgamVzdC5hZHZhbmNlVGltZXJzQnlUaW1lKDM1MClcbiAgICAgIHdyYXBwZXIudXBkYXRlKClcbiAgICAgIGV4cGVjdCh3cmFwcGVyLmZpbmQoXCJpbnB1dFwiKS5hdCgwKS5wcm9wcygpLnZhbHVlKS50b0JlKGV4cGVjdGVkVmFsKVxuICAgICAgZXhwZWN0KHdyYXBwZXIuZmluZChcIlBvcG92ZXJcIikuYXQoMCkucHJvcHMoKS52aXNpYmxlKS50b0JlKGZhbHNlKVxuICAgIH0pXG4gIH0pXG5cbiAgaXQoXCLlpJbpg6jmjqfliLZcIiwgKCkgPT4ge1xuICAgIC8qKlxuICAgICAqIOS7peS4i+mDveaYr+mqjOivgeWklumDqOaOp+WItuaXtuWGhemDqOeahOWkseaViFxuICAgICAqL1xuICAgIGNvbnN0IHZhbCA9IG5ldyBEYXRlKClcbiAgICBjb25zdCB3cmFwcGVyID0gbW91bnQoXG4gICAgICA8RGF0ZVBpY2tlciB2YWx1ZT17bmV3IERhdGUoKX0gdmlzaWJsZSBjbG9zZU9uU2VsZWN0IC8+XG4gICAgKVxuICAgIGV4cGVjdCh3cmFwcGVyLmZpbmQoXCJpbnB1dFwiKS5hdCgwKS5wcm9wcygpLnZhbHVlKS50b0JlKFxuICAgICAgY29udmVydERhdGVUb1N0cmluZyh2YWwpXG4gICAgKVxuXG4gICAgZXhwZWN0KHdyYXBwZXIuZmluZChcIlBvcG92ZXJcIikuYXQoMCkucHJvcHMoKS52aXNpYmxlKS50b0JlKHRydWUpXG5cbiAgICBhY3QoKCkgPT4ge1xuICAgICAgd3JhcHBlci5maW5kKFwiLmFkdWktZGF0ZS1kYXlcIikuYXQoMTQpLnNpbXVsYXRlKFwiY2xpY2tcIilcbiAgICAgIC8vIOetieW+hSAzNTBtc1xuICAgICAgamVzdC5hZHZhbmNlVGltZXJzQnlUaW1lKDM1MClcbiAgICAgIHdyYXBwZXIudXBkYXRlKClcbiAgICAgIGV4cGVjdCh3cmFwcGVyLmZpbmQoXCJpbnB1dFwiKS5hdCgwKS5wcm9wcygpLnZhbHVlKS50b0JlKFxuICAgICAgICBjb252ZXJ0RGF0ZVRvU3RyaW5nKHZhbClcbiAgICAgIClcbiAgICB9KVxuXG4gICAgYWN0KCgpID0+IHtcbiAgICAgIHdyYXBwZXIuZmluZChcIi5hZHVpLWRhdGUtZGF5XCIpLmF0KDE1KS5zaW11bGF0ZShcImNsaWNrXCIpXG4gICAgICAvLyDnrYnlvoUgMzUwbXNcbiAgICAgIGplc3QuYWR2YW5jZVRpbWVyc0J5VGltZSgzNTApXG4gICAgICB3cmFwcGVyLnVwZGF0ZSgpXG4gICAgICBleHBlY3Qod3JhcHBlci5maW5kKFwiaW5wdXRcIikuYXQoMCkucHJvcHMoKS52YWx1ZSkudG9CZShcbiAgICAgICAgY29udmVydERhdGVUb1N0cmluZyh2YWwpXG4gICAgICApXG4gICAgICBleHBlY3Qod3JhcHBlci5maW5kKFwiUG9wb3ZlclwiKS5hdCgwKS5wcm9wcygpLnZpc2libGUpLnRvQmUodHJ1ZSlcbiAgICB9KVxuXG4gICAgLyoqXG4gICAgICog5Lul5LiL5piv6aqM6K+B5aSW6YOo5o6n5Yi25pe2IGdldERlcml2ZWRTdGF0ZUZyb21Qcm9wcyDnmoTmnInmlYhcbiAgICAgKi9cbiAgICBjb25zdCBtb3VudGVyID0gbW91bnQoPERhdGVQaWNrZXJNb3VudGVyIC8+KVxuICAgIGNvbnN0IHRvZGF5ID0gY29udmVydERhdGVUb1N0cmluZyhuZXcgRGF0ZSgpKVxuICAgIG1vdW50ZXJcbiAgICAgIC5maW5kKFwiaW5wdXRcIilcbiAgICAgIC5zaW11bGF0ZShcImNoYW5nZVwiLCB7IHRhcmdldDogeyB2YWx1ZTogXCIyMDIwLTAyLTIyXCIgfSB9KVxuICAgIGV4cGVjdChjb252ZXJ0RGF0ZVRvU3RyaW5nKG1vdW50ZXIuc3RhdGUoKS52YWx1ZSkpLnRvQmUoXCIyMDIwLTAyLTIyXCIpXG4gICAgbW91bnRlclxuICAgICAgLmZpbmQoXCJpbnB1dFwiKVxuICAgICAgLnNpbXVsYXRlKFwiY2hhbmdlXCIsIHsgdGFyZ2V0OiB7IHZhbHVlOiBcIjIwMjAtMDItMzFcIiB9IH0pXG4gICAgZXhwZWN0KGNvbnZlcnREYXRlVG9TdHJpbmcobW91bnRlci5zdGF0ZSgpLnZhbHVlKSkudG9CZShcIjIwMjAtMDItMjJcIilcbiAgICBtb3VudGVyLmZpbmQoXCJpbnB1dFwiKS5zaW11bGF0ZShcImNoYW5nZVwiLCB7IHRhcmdldDogeyB2YWx1ZTogXCJcIiB9IH0pXG4gICAgZXhwZWN0KGNvbnZlcnREYXRlVG9TdHJpbmcobW91bnRlci5zdGF0ZSgpLnZhbHVlKSkudG9CZShcIlwiKVxuICAgIGV4cGVjdChtb3VudGVyLmZpbmQoXCJQb3BvdmVyXCIpLmF0KDApLnByb3BzKCkudmlzaWJsZSkudG9CZSh0cnVlKVxuICAgIGFjdCgoKSA9PiB7XG4gICAgICBtb3VudGVyLmZpbmQoXCIuYWR1aS1kYXRlLWRheVwiKS5hdCgxNSkuc2ltdWxhdGUoXCJjbGlja1wiKVxuICAgICAgamVzdC5ydW5BbGxUaW1lcnMoKVxuICAgICAgbW91bnRlci51cGRhdGUoKVxuICAgICAgZXhwZWN0KG1vdW50ZXIuZmluZChcIlBvcG92ZXJcIikuYXQoMCkucHJvcHMoKS52aXNpYmxlKS50b0JlKGZhbHNlKVxuICAgIH0pXG4gIH0pXG5cbiAgaXQoXCJEYXlQaWNrZXIg5pON5L2cXCIsICgpID0+IHtcbiAgICBjb25zdCB0b2RheSA9IG5ldyBEYXRlKClcbiAgICBjb25zdCB3cmFwcGVyID0gbW91bnQoPERhdGVQaWNrZXJNb3VudGVyIC8+KVxuICAgIHdyYXBwZXIuZmluZChcImJ1dHRvblwiKS5hdCgwKS5zaW11bGF0ZShcImNsaWNrXCIpXG4gICAgYWN0KCgpID0+IHtcbiAgICAgIHdyYXBwZXIuZmluZChcIi5hZHVpLWRhdGUtZGF5XCIpLmF0KDE1KS5zaW11bGF0ZShcImNsaWNrXCIpXG4gICAgICBqZXN0LnJ1bkFsbFRpbWVycygpXG4gICAgICB3cmFwcGVyLnVwZGF0ZSgpXG4gICAgICBpZiAodG9kYXkuZ2V0RnVsbFllYXIoKSA+IHdyYXBwZXIuc3RhdGUoKS52YWx1ZS5nZXRGdWxsWWVhcigpKSB7XG4gICAgICAgIGV4cGVjdCh0b2RheS5nZXRNb250aCgpIC0gd3JhcHBlci5zdGF0ZSgpLnZhbHVlLmdldE1vbnRoKCkpLnRvQmUoLTExKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZXhwZWN0KHRvZGF5LmdldE1vbnRoKCkgLSB3cmFwcGVyLnN0YXRlKCkudmFsdWUuZ2V0TW9udGgoKSkudG9CZSgxKVxuICAgICAgfVxuICAgIH0pXG5cbiAgICBhY3QoKCkgPT4ge1xuICAgICAgd3JhcHBlci5maW5kKFwiLmFkdWktZGF0ZS1zaG9ydGN1dFwiKS5hdCgwKS5zaW11bGF0ZShcImNsaWNrXCIpXG4gICAgICBqZXN0LnJ1bkFsbFRpbWVycygpXG4gICAgICB3cmFwcGVyLnVwZGF0ZSgpXG4gICAgICBleHBlY3QoY29udmVydERhdGVUb1N0cmluZyh3cmFwcGVyLnN0YXRlKCkudmFsdWUpKS50b0JlKFwiMjAyMC0xMC0wMVwiKVxuICAgIH0pXG5cbiAgICBjb25zdCB3cmFwcGVyRm9yQ292ZXJhZ2UwID0gbW91bnQoPERhdGVQaWNrZXJNb3VudGVyIGRpc2FibGVkIC8+KVxuICAgIHdyYXBwZXJGb3JDb3ZlcmFnZTAuc3RhdGUoKS5jb21wb25lbnQuaGFuZGxlVmlzaWJsZUNoYW5nZShmYWxzZSlcbiAgICBqZXN0LnJ1bkFsbFRpbWVycygpXG4gIH0pXG5cbiAgaXQoXCJEYXlQaWNrZXIg5bm05pyI5YiH5o2iXCIsICgpID0+IHtcbiAgICBjb25zdCB3cmFwcGVyID0gbW91bnQoPERhdGVQaWNrZXJNb3VudGVyIC8+KVxuICAgIGFjdCgoKSA9PiB7XG4gICAgICB3cmFwcGVyXG4gICAgICAgIC5maW5kKFwic2VsZWN0XCIpXG4gICAgICAgIC5hdCgwKVxuICAgICAgICAuc2ltdWxhdGUoXCJjaGFuZ2VcIiwgeyB0YXJnZXQ6IHsgdmFsdWU6IFwiMjAxOFwiIH0gfSlcbiAgICAgIHdyYXBwZXJcbiAgICAgICAgLmZpbmQoXCJzZWxlY3RcIilcbiAgICAgICAgLmF0KDEpXG4gICAgICAgIC5zaW11bGF0ZShcImNoYW5nZVwiLCB7IHRhcmdldDogeyB2YWx1ZTogXCIxXCIgfSB9KVxuICAgICAgamVzdC5ydW5BbGxUaW1lcnMoKVxuICAgICAgd3JhcHBlci51cGRhdGUoKVxuICAgICAgd3JhcHBlci5maW5kKFwiLmFkdWktZGF0ZS1kYXlcIikuYXQoMTQpLnNpbXVsYXRlKFwiY2xpY2tcIilcbiAgICAgIGplc3QucnVuQWxsVGltZXJzKClcbiAgICAgIHdyYXBwZXIudXBkYXRlKClcbiAgICB9KVxuICB9KVxufSlcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBRUEsT0FBT0EsS0FBUCxJQUFnQkMsU0FBaEIsUUFBaUMsT0FBakM7QUFDQSxTQUFTQyxLQUFULFFBQXNCLFFBQXRCO0FBQ0EsT0FBT0MsWUFBUCxNQUF5QixxQkFBekI7QUFDQSxPQUFPQyxVQUFQLE1BQXVCLElBQXZCO0FBQ0EsU0FBU0MsbUJBQVQsUUFBb0MsU0FBcEM7QUFDQSxTQUFTQyxHQUFULFFBQW9CLHNCQUFwQjs7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