@silverbirder/caat
Version:
CaAT is the Google Apps Script Library that Calculate the Assigned Time.
366 lines (328 loc) • 31.7 kB
JavaScript
function Group() {
}
function Member() {
}/******/ (function(modules) { // webpackBootstrap
/******/ // The module cache
/******/ var installedModules = {};
/******/
/******/ // The require function
/******/ function __webpack_require__(moduleId) {
/******/
/******/ // Check if module is in cache
/******/ if(installedModules[moduleId]) {
/******/ return installedModules[moduleId].exports;
/******/ }
/******/ // Create a new module (and put it into the cache)
/******/ var module = installedModules[moduleId] = {
/******/ i: moduleId,
/******/ l: false,
/******/ exports: {}
/******/ };
/******/
/******/ // Execute the module function
/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
/******/
/******/ // Flag the module as loaded
/******/ module.l = true;
/******/
/******/ // Return the exports of the module
/******/ return module.exports;
/******/ }
/******/
/******/
/******/ // expose the modules object (__webpack_modules__)
/******/ __webpack_require__.m = modules;
/******/
/******/ // expose the module cache
/******/ __webpack_require__.c = installedModules;
/******/
/******/ // define getter function for harmony exports
/******/ __webpack_require__.d = function(exports, name, getter) {
/******/ if(!__webpack_require__.o(exports, name)) {
/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
/******/ }
/******/ };
/******/
/******/ // define __esModule on exports
/******/ __webpack_require__.r = function(exports) {
/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
/******/ }
/******/ Object.defineProperty(exports, '__esModule', { value: true });
/******/ };
/******/
/******/ // create a fake namespace object
/******/ // mode & 1: value is a module id, require it
/******/ // mode & 2: merge all properties of value into the ns
/******/ // mode & 4: return value when already ns object
/******/ // mode & 8|1: behave like require
/******/ __webpack_require__.t = function(value, mode) {
/******/ if(mode & 1) value = __webpack_require__(value);
/******/ if(mode & 8) return value;
/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
/******/ var ns = Object.create(null);
/******/ __webpack_require__.r(ns);
/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
/******/ return ns;
/******/ };
/******/
/******/ // getDefaultExport function for compatibility with non-harmony modules
/******/ __webpack_require__.n = function(module) {
/******/ var getter = module && module.__esModule ?
/******/ function getDefault() { return module['default']; } :
/******/ function getModuleExports() { return module; };
/******/ __webpack_require__.d(getter, 'a', getter);
/******/ return getter;
/******/ };
/******/
/******/ // Object.prototype.hasOwnProperty.call
/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
/******/
/******/ // __webpack_public_path__
/******/ __webpack_require__.p = "";
/******/
/******/
/******/ // Load entry module and return exports
/******/ return __webpack_require__(__webpack_require__.s = "./src/index.ts");
/******/ })
/************************************************************************/
/******/ ({
/***/ "./node_modules/webpack/buildin/global.js":
/*!***********************************!*\
!*** (webpack)/buildin/global.js ***!
\***********************************/
/*! no static exports found */
/***/ (function(module, exports) {
var g;
// This works in non-strict mode
g = (function() {
return this;
})();
try {
// This works if eval is allowed (see CSP)
g = g || new Function("return this")();
} catch (e) {
// This works if the window reference is available
if (typeof window === "object") g = window;
}
// g can still be undefined, but nothing to do about it...
// We return undefined, instead of nothing here, so it's
// easier to handle this case. if(!global) { ...}
module.exports = g;
/***/ }),
/***/ "./src/calendar/calendarAppImpl.ts":
/*!*****************************************!*\
!*** ./src/calendar/calendarAppImpl.ts ***!
\*****************************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
var CalendarAppImpl = /** @class */ (function () {
function CalendarAppImpl() {
}
CalendarAppImpl.prototype.getCalendarById = function (id) {
var calendar = CalendarApp.getCalendarById(id);
return calendar;
};
return CalendarAppImpl;
}());
/* harmony default export */ __webpack_exports__["default"] = (CalendarAppImpl);
/***/ }),
/***/ "./src/group/groupImpl.ts":
/*!********************************!*\
!*** ./src/group/groupImpl.ts ***!
\********************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _utils_dateUtils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../utils/dateUtils */ "./src/utils/dateUtils.ts");
/* harmony import */ var _calendar_calendarAppImpl__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../calendar/calendarAppImpl */ "./src/calendar/calendarAppImpl.ts");
var GroupImpl = /** @class */ (function () {
function GroupImpl(id, config, calendar) {
this.id = id;
var defaultHolidayWords = {
morning: new RegExp('(?!)'),
afternoon: new RegExp('(?!)'),
all: new RegExp('(?!)')
};
var defaultConfig = {
startDate: new Date(),
endDate: new Date(),
members: [],
holidayWords: defaultHolidayWords
};
this.config = config || defaultConfig;
this.calendarApp = calendar || new _calendar_calendarAppImpl__WEBPACK_IMPORTED_MODULE_1__["default"]();
}
GroupImpl.prototype.fetchHolidays = function () {
var _this = this;
var holidays = [];
var calendar = this.calendarApp.getCalendarById(this.id);
calendar.getEvents(this.config.startDate, this.config.endDate).forEach(function (event) {
var allDay = event.isAllDayEvent();
if (!allDay) {
return;
}
var title = event.getTitle();
var am = _this.config.holidayWords.morning.test(title);
var pm = _this.config.holidayWords.afternoon.test(title);
var all = am === true || pm === true ? false : _this.config.holidayWords.all.test(title);
if (am === false && pm === false && all === false) {
return;
}
var members = _this.config.members.filter(function (member) {
return member.match.test(title);
}, title).map(function (member) {
return member.name;
});
var movePoint = Object(_utils_dateUtils__WEBPACK_IMPORTED_MODULE_0__["copyDate"])(event.getStartTime());
while (movePoint.getTime() < event.getEndTime().getTime()) {
if (movePoint.getTime() <= _this.config.endDate.getTime() && movePoint.getTime() >= _this.config.startDate.getTime()) {
holidays.push({
morning: am,
afternoon: pm,
all: all,
title: title,
inMember: members,
toDate: Object(_utils_dateUtils__WEBPACK_IMPORTED_MODULE_0__["copyDate"])(movePoint)
});
}
movePoint.setDate(movePoint.getDate() + 1);
}
});
return holidays;
};
return GroupImpl;
}());
/* harmony default export */ __webpack_exports__["default"] = (GroupImpl);
/***/ }),
/***/ "./src/index.ts":
/*!**********************!*\
!*** ./src/index.ts ***!
\**********************/
/*! exports provided: Member, Group */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* WEBPACK VAR INJECTION */(function(global) {/* harmony import */ var _member_memberImpl__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./member/memberImpl */ "./src/member/memberImpl.ts");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Member", function() { return _member_memberImpl__WEBPACK_IMPORTED_MODULE_0__["default"]; });
/* harmony import */ var _group_groupImpl__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./group/groupImpl */ "./src/group/groupImpl.ts");
/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Group", function() { return _group_groupImpl__WEBPACK_IMPORTED_MODULE_1__["default"]; });
global.Group = _group_groupImpl__WEBPACK_IMPORTED_MODULE_1__["default"];
global.Member = _member_memberImpl__WEBPACK_IMPORTED_MODULE_0__["default"];
/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(/*! ./../node_modules/webpack/buildin/global.js */ "./node_modules/webpack/buildin/global.js")))
/***/ }),
/***/ "./src/member/memberImpl.ts":
/*!**********************************!*\
!*** ./src/member/memberImpl.ts ***!
\**********************************/
/*! exports provided: default */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony import */ var _utils_dateUtils__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../utils/dateUtils */ "./src/utils/dateUtils.ts");
/* harmony import */ var _calendar_calendarAppImpl__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../calendar/calendarAppImpl */ "./src/calendar/calendarAppImpl.ts");
var MemberImpl = /** @class */ (function () {
function MemberImpl(id, config, calendarApp) {
this.id = id;
var defaultConfig = {
everyMinutes: 15,
ignore: new RegExp('(?!)'),
startDate: new Date(),
endDate: new Date(),
cutTimeRange: []
};
this.config = config || defaultConfig;
this.calendarApp = calendarApp || new _calendar_calendarAppImpl__WEBPACK_IMPORTED_MODULE_1__["default"]();
}
MemberImpl.prototype.fetchSchedules = function () {
var _this = this;
var schedules = [];
var calendar = this.calendarApp.getCalendarById(this.id);
var workingTimeRange = [];
calendar.getEvents(this.config.startDate, this.config.endDate).forEach(function (event) {
var title = event.getTitle();
var startDate = Object(_utils_dateUtils__WEBPACK_IMPORTED_MODULE_0__["copyDate"])(event.getStartTime());
var endDate = Object(_utils_dateUtils__WEBPACK_IMPORTED_MODULE_0__["copyDate"])(event.getEndTime());
// Note: If you are OWNER and not attend the events, status is OWNER.
var status = event.getMyStatus();
var ignore = _this.config.ignore.test(title);
var allDay = event.isAllDayEvent();
// Note: Google Apps Script can't enum.
var statusStr = status === null ? 'MAYBE' : status.toString();
var noNeedCalcAssignMinute = statusStr === 'NO' || ignore || allDay;
var originalAssignMinute = _this._calcAssignMinute(startDate, endDate, [], []);
var assignMinute = 0;
var cut = false;
if (!noNeedCalcAssignMinute) {
assignMinute = _this._calcAssignMinute(startDate, endDate, _this.config.cutTimeRange, workingTimeRange);
cut = originalAssignMinute !== assignMinute;
}
schedules.push({
status: statusStr,
ignore: ignore,
allDay: allDay,
cut: cut,
start: startDate,
end: endDate,
assignMinute: assignMinute,
originalAssignMinute: originalAssignMinute,
title: event.getTitle(),
description: event.getDescription()
});
});
return schedules;
};
/*
ex.
start: 2020-01-01 11:00
end: 2020-01-01 13:00
cut: [{from: 2020-01-01 12:00, to: 2020-01-01 13:00}]
=> assignMinute = 60m;
*/
MemberImpl.prototype._calcAssignMinute = function (start, end, cut, work) {
var calculatedAssignMinute = 0;
var movePoint = Object(_utils_dateUtils__WEBPACK_IMPORTED_MODULE_0__["copyDate"])(start);
while (movePoint.getTime() < end.getTime()) {
movePoint.setTime(movePoint.getTime() + 1);
var inCutTime = cut.some(function (range) {
return (movePoint.getTime() <= range.to.getTime() && movePoint.getTime() >= range.from.getTime());
});
var isDuplicate = work.some(function (range) {
return (movePoint.getTime() <= range.to.getTime() && movePoint.getTime() >= range.from.getTime());
});
movePoint.setTime(movePoint.getTime() - 1);
if (!inCutTime && !isDuplicate) {
calculatedAssignMinute += this.config.everyMinutes;
var from = Object(_utils_dateUtils__WEBPACK_IMPORTED_MODULE_0__["copyDate"])(movePoint);
var to = Object(_utils_dateUtils__WEBPACK_IMPORTED_MODULE_0__["copyDate"])(movePoint);
to = new Date(to.setMinutes(to.getMinutes() + this.config.everyMinutes));
work.push({ from: from, to: to });
}
movePoint.setMinutes(movePoint.getMinutes() + this.config.everyMinutes);
}
return calculatedAssignMinute;
};
return MemberImpl;
}());
/* harmony default export */ __webpack_exports__["default"] = (MemberImpl);
/***/ }),
/***/ "./src/utils/dateUtils.ts":
/*!********************************!*\
!*** ./src/utils/dateUtils.ts ***!
\********************************/
/*! exports provided: copyDate */
/***/ (function(module, __webpack_exports__, __webpack_require__) {
"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "copyDate", function() { return copyDate; });
function copyDate(d) {
return new Date(d.getTime());
}
;
/***/ })
/******/ });
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vLyh3ZWJwYWNrKS9idWlsZGluL2dsb2JhbC5qcyIsIndlYnBhY2s6Ly8vLi9zcmMvY2FsZW5kYXIvY2FsZW5kYXJBcHBJbXBsLnRzIiwid2VicGFjazovLy8uL3NyYy9ncm91cC9ncm91cEltcGwudHMiLCJ3ZWJwYWNrOi8vLy4vc3JjL2luZGV4LnRzIiwid2VicGFjazovLy8uL3NyYy9tZW1iZXIvbWVtYmVySW1wbC50cyIsIndlYnBhY2s6Ly8vLi9zcmMvdXRpbHMvZGF0ZVV0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7UUFBQTtRQUNBOztRQUVBO1FBQ0E7O1FBRUE7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7O1FBRUE7UUFDQTs7UUFFQTtRQUNBOztRQUVBO1FBQ0E7UUFDQTs7O1FBR0E7UUFDQTs7UUFFQTtRQUNBOztRQUVBO1FBQ0E7UUFDQTtRQUNBLDBDQUEwQyxnQ0FBZ0M7UUFDMUU7UUFDQTs7UUFFQTtRQUNBO1FBQ0E7UUFDQSx3REFBd0Qsa0JBQWtCO1FBQzFFO1FBQ0EsaURBQWlELGNBQWM7UUFDL0Q7O1FBRUE7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBO1FBQ0E7UUFDQTtRQUNBLHlDQUF5QyxpQ0FBaUM7UUFDMUUsZ0hBQWdILG1CQUFtQixFQUFFO1FBQ3JJO1FBQ0E7O1FBRUE7UUFDQTtRQUNBO1FBQ0EsMkJBQTJCLDBCQUEwQixFQUFFO1FBQ3ZELGlDQUFpQyxlQUFlO1FBQ2hEO1FBQ0E7UUFDQTs7UUFFQTtRQUNBLHNEQUFzRCwrREFBK0Q7O1FBRXJIO1FBQ0E7OztRQUdBO1FBQ0E7Ozs7Ozs7Ozs7OztBQ2xGQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxDQUFDOztBQUVEO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLDRDQUE0Qzs7QUFFNUM7Ozs7Ozs7Ozs7Ozs7QUNuQkE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNjLDhFQUFlLEVBQUM7Ozs7Ozs7Ozs7Ozs7QUNUL0I7QUFBQTtBQUFBO0FBQThDO0FBQ1k7QUFDMUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsMkNBQTJDLGlFQUFlO0FBQzFEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0EsYUFBYTtBQUNiLDRCQUE0QixpRUFBUTtBQUNwQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0NBQWdDLGlFQUFRO0FBQ3hDLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0E7QUFDQSxTQUFTO0FBQ1Q7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNjLHdFQUFTLEVBQUM7Ozs7Ozs7Ozs7Ozs7QUMzRHpCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQTZDO0FBQ0g7QUFDMUMsZUFBZSx3REFBUztBQUN4QixnQkFBZ0IsMERBQVU7QUFDMkI7Ozs7Ozs7Ozs7Ozs7O0FDSnJEO0FBQUE7QUFBQTtBQUE4QztBQUNZO0FBQzFEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSw4Q0FBOEMsaUVBQWU7QUFDN0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDRCQUE0QixpRUFBUTtBQUNwQywwQkFBMEIsaUVBQVE7QUFDbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2IsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGVBQWUsNkNBQTZDO0FBQzVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esd0JBQXdCLGlFQUFRO0FBQ2hDO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBO0FBQ0EsMkJBQTJCLGlFQUFRO0FBQ25DLHlCQUF5QixpRUFBUTtBQUNqQztBQUNBLDJCQUEyQixxQkFBcUI7QUFDaEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsQ0FBQztBQUNjLHlFQUFVLEVBQUM7Ozs7Ozs7Ozs7Ozs7QUNyRjFCO0FBQUE7QUFBTztBQUNQO0FBQ0E7QUFDQSIsImZpbGUiOiJpbmRleC5qcyIsInNvdXJjZXNDb250ZW50IjpbIiBcdC8vIFRoZSBtb2R1bGUgY2FjaGVcbiBcdHZhciBpbnN0YWxsZWRNb2R1bGVzID0ge307XG5cbiBcdC8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG4gXHRmdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cbiBcdFx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG4gXHRcdGlmKGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdKSB7XG4gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG4gXHRcdH1cbiBcdFx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcbiBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuIFx0XHRcdGk6IG1vZHVsZUlkLFxuIFx0XHRcdGw6IGZhbHNlLFxuIFx0XHRcdGV4cG9ydHM6IHt9XG4gXHRcdH07XG5cbiBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4gXHRcdG1vZHVsZXNbbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG4gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbiBcdFx0bW9kdWxlLmwgPSB0cnVlO1xuXG4gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4gXHRcdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbiBcdH1cblxuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGUgY2FjaGVcbiBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG5cbiBcdC8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb24gZm9yIGhhcm1vbnkgZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7XG4gXHRcdGlmKCFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywgbmFtZSkpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgbmFtZSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGdldHRlciB9KTtcbiBcdFx0fVxuIFx0fTtcblxuIFx0Ly8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yID0gZnVuY3Rpb24oZXhwb3J0cykge1xuIFx0XHRpZih0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9TdHJpbmdUYWcpIHtcbiBcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTtcbiBcdFx0fVxuIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuIFx0fTtcblxuIFx0Ly8gY3JlYXRlIGEgZmFrZSBuYW1lc3BhY2Ugb2JqZWN0XG4gXHQvLyBtb2RlICYgMTogdmFsdWUgaXMgYSBtb2R1bGUgaWQsIHJlcXVpcmUgaXRcbiBcdC8vIG1vZGUgJiAyOiBtZXJnZSBhbGwgcHJvcGVydGllcyBvZiB2YWx1ZSBpbnRvIHRoZSBuc1xuIFx0Ly8gbW9kZSAmIDQ6IHJldHVybiB2YWx1ZSB3aGVuIGFscmVhZHkgbnMgb2JqZWN0XG4gXHQvLyBtb2RlICYgOHwxOiBiZWhhdmUgbGlrZSByZXF1aXJlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnQgPSBmdW5jdGlvbih2YWx1ZSwgbW9kZSkge1xuIFx0XHRpZihtb2RlICYgMSkgdmFsdWUgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKHZhbHVlKTtcbiBcdFx0aWYobW9kZSAmIDgpIHJldHVybiB2YWx1ZTtcbiBcdFx0aWYoKG1vZGUgJiA0KSAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICYmIHZhbHVlLl9fZXNNb2R1bGUpIHJldHVybiB2YWx1ZTtcbiBcdFx0dmFyIG5zID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5yKG5zKTtcbiBcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KG5zLCAnZGVmYXVsdCcsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHZhbHVlIH0pO1xuIFx0XHRpZihtb2RlICYgMiAmJiB0eXBlb2YgdmFsdWUgIT0gJ3N0cmluZycpIGZvcih2YXIga2V5IGluIHZhbHVlKSBfX3dlYnBhY2tfcmVxdWlyZV9fLmQobnMsIGtleSwgZnVuY3Rpb24oa2V5KSB7IHJldHVybiB2YWx1ZVtrZXldOyB9LmJpbmQobnVsbCwga2V5KSk7XG4gXHRcdHJldHVybiBucztcbiBcdH07XG5cbiBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSBmdW5jdGlvbihtb2R1bGUpIHtcbiBcdFx0dmFyIGdldHRlciA9IG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSA/XG4gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbiBcdFx0XHRmdW5jdGlvbiBnZXRNb2R1bGVFeHBvcnRzKCkgeyByZXR1cm4gbW9kdWxlOyB9O1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCAnYScsIGdldHRlcik7XG4gXHRcdHJldHVybiBnZXR0ZXI7XG4gXHR9O1xuXG4gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHkpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIHByb3BlcnR5KTsgfTtcblxuIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbiBcdF9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiXCI7XG5cblxuIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhfX3dlYnBhY2tfcmVxdWlyZV9fLnMgPSBcIi4vc3JjL2luZGV4LnRzXCIpO1xuIiwidmFyIGc7XG5cbi8vIFRoaXMgd29ya3MgaW4gbm9uLXN0cmljdCBtb2RlXG5nID0gKGZ1bmN0aW9uKCkge1xuXHRyZXR1cm4gdGhpcztcbn0pKCk7XG5cbnRyeSB7XG5cdC8vIFRoaXMgd29ya3MgaWYgZXZhbCBpcyBhbGxvd2VkIChzZWUgQ1NQKVxuXHRnID0gZyB8fCBuZXcgRnVuY3Rpb24oXCJyZXR1cm4gdGhpc1wiKSgpO1xufSBjYXRjaCAoZSkge1xuXHQvLyBUaGlzIHdvcmtzIGlmIHRoZSB3aW5kb3cgcmVmZXJlbmNlIGlzIGF2YWlsYWJsZVxuXHRpZiAodHlwZW9mIHdpbmRvdyA9PT0gXCJvYmplY3RcIikgZyA9IHdpbmRvdztcbn1cblxuLy8gZyBjYW4gc3RpbGwgYmUgdW5kZWZpbmVkLCBidXQgbm90aGluZyB0byBkbyBhYm91dCBpdC4uLlxuLy8gV2UgcmV0dXJuIHVuZGVmaW5lZCwgaW5zdGVhZCBvZiBub3RoaW5nIGhlcmUsIHNvIGl0J3Ncbi8vIGVhc2llciB0byBoYW5kbGUgdGhpcyBjYXNlLiBpZighZ2xvYmFsKSB7IC4uLn1cblxubW9kdWxlLmV4cG9ydHMgPSBnO1xuIiwidmFyIENhbGVuZGFyQXBwSW1wbCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBDYWxlbmRhckFwcEltcGwoKSB7XG4gICAgfVxuICAgIENhbGVuZGFyQXBwSW1wbC5wcm90b3R5cGUuZ2V0Q2FsZW5kYXJCeUlkID0gZnVuY3Rpb24gKGlkKSB7XG4gICAgICAgIHZhciBjYWxlbmRhciA9IENhbGVuZGFyQXBwLmdldENhbGVuZGFyQnlJZChpZCk7XG4gICAgICAgIHJldHVybiBjYWxlbmRhcjtcbiAgICB9O1xuICAgIHJldHVybiBDYWxlbmRhckFwcEltcGw7XG59KCkpO1xuZXhwb3J0IGRlZmF1bHQgQ2FsZW5kYXJBcHBJbXBsO1xuIiwiaW1wb3J0IHsgY29weURhdGUgfSBmcm9tIFwiLi4vdXRpbHMvZGF0ZVV0aWxzXCI7XG5pbXBvcnQgQ2FsZW5kYXJBcHBJbXBsIGZyb20gXCIuLi9jYWxlbmRhci9jYWxlbmRhckFwcEltcGxcIjtcbnZhciBHcm91cEltcGwgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gR3JvdXBJbXBsKGlkLCBjb25maWcsIGNhbGVuZGFyKSB7XG4gICAgICAgIHRoaXMuaWQgPSBpZDtcbiAgICAgICAgdmFyIGRlZmF1bHRIb2xpZGF5V29yZHMgPSB7XG4gICAgICAgICAgICBtb3JuaW5nOiBuZXcgUmVnRXhwKCcoPyEpJyksXG4gICAgICAgICAgICBhZnRlcm5vb246IG5ldyBSZWdFeHAoJyg/ISknKSxcbiAgICAgICAgICAgIGFsbDogbmV3IFJlZ0V4cCgnKD8hKScpLFxuICAgICAgICB9O1xuICAgICAgICB2YXIgZGVmYXVsdENvbmZpZyA9IHtcbiAgICAgICAgICAgIHN0YXJ0RGF0ZTogbmV3IERhdGUoKSxcbiAgICAgICAgICAgIGVuZERhdGU6IG5ldyBEYXRlKCksXG4gICAgICAgICAgICBtZW1iZXJzOiBbXSxcbiAgICAgICAgICAgIGhvbGlkYXlXb3JkczogZGVmYXVsdEhvbGlkYXlXb3Jkc1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZyB8fCBkZWZhdWx0Q29uZmlnO1xuICAgICAgICB0aGlzLmNhbGVuZGFyQXBwID0gY2FsZW5kYXIgfHwgbmV3IENhbGVuZGFyQXBwSW1wbCgpO1xuICAgIH1cbiAgICBHcm91cEltcGwucHJvdG90eXBlLmZldGNoSG9saWRheXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHZhciBob2xpZGF5cyA9IFtdO1xuICAgICAgICB2YXIgY2FsZW5kYXIgPSB0aGlzLmNhbGVuZGFyQXBwLmdldENhbGVuZGFyQnlJZCh0aGlzLmlkKTtcbiAgICAgICAgY2FsZW5kYXIuZ2V0RXZlbnRzKHRoaXMuY29uZmlnLnN0YXJ0RGF0ZSwgdGhpcy5jb25maWcuZW5kRGF0ZSkuZm9yRWFjaChmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgICAgIHZhciBhbGxEYXkgPSBldmVudC5pc0FsbERheUV2ZW50KCk7XG4gICAgICAgICAgICBpZiAoIWFsbERheSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciB0aXRsZSA9IGV2ZW50LmdldFRpdGxlKCk7XG4gICAgICAgICAgICB2YXIgYW0gPSBfdGhpcy5jb25maWcuaG9saWRheVdvcmRzLm1vcm5pbmcudGVzdCh0aXRsZSk7XG4gICAgICAgICAgICB2YXIgcG0gPSBfdGhpcy5jb25maWcuaG9saWRheVdvcmRzLmFmdGVybm9vbi50ZXN0KHRpdGxlKTtcbiAgICAgICAgICAgIHZhciBhbGwgPSBhbSA9PT0gdHJ1ZSB8fCBwbSA9PT0gdHJ1ZSA/IGZhbHNlIDogX3RoaXMuY29uZmlnLmhvbGlkYXlXb3Jkcy5hbGwudGVzdCh0aXRsZSk7XG4gICAgICAgICAgICBpZiAoYW0gPT09IGZhbHNlICYmIHBtID09PSBmYWxzZSAmJiBhbGwgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIG1lbWJlcnMgPSBfdGhpcy5jb25maWcubWVtYmVycy5maWx0ZXIoZnVuY3Rpb24gKG1lbWJlcikge1xuICAgICAgICAgICAgICAgIHJldHVybiBtZW1iZXIubWF0Y2gudGVzdCh0aXRsZSk7XG4gICAgICAgICAgICB9LCB0aXRsZSkubWFwKGZ1bmN0aW9uIChtZW1iZXIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbWVtYmVyLm5hbWU7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHZhciBtb3ZlUG9pbnQgPSBjb3B5RGF0ZShldmVudC5nZXRTdGFydFRpbWUoKSk7XG4gICAgICAgICAgICB3aGlsZSAobW92ZVBvaW50LmdldFRpbWUoKSA8IGV2ZW50LmdldEVuZFRpbWUoKS5nZXRUaW1lKCkpIHtcbiAgICAgICAgICAgICAgICBpZiAobW92ZVBvaW50LmdldFRpbWUoKSA8PSBfdGhpcy5jb25maWcuZW5kRGF0ZS5nZXRUaW1lKCkgJiYgbW92ZVBvaW50LmdldFRpbWUoKSA+PSBfdGhpcy5jb25maWcuc3RhcnREYXRlLmdldFRpbWUoKSkge1xuICAgICAgICAgICAgICAgICAgICBob2xpZGF5cy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1vcm5pbmc6IGFtLFxuICAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXJub29uOiBwbSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGFsbDogYWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6IHRpdGxlLFxuICAgICAgICAgICAgICAgICAgICAgICAgaW5NZW1iZXI6IG1lbWJlcnMsXG4gICAgICAgICAgICAgICAgICAgICAgICB0b0RhdGU6IGNvcHlEYXRlKG1vdmVQb2ludCksXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBtb3ZlUG9pbnQuc2V0RGF0ZShtb3ZlUG9pbnQuZ2V0RGF0ZSgpICsgMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gaG9saWRheXM7XG4gICAgfTtcbiAgICByZXR1cm4gR3JvdXBJbXBsO1xufSgpKTtcbmV4cG9ydCBkZWZhdWx0IEdyb3VwSW1wbDtcbiIsImltcG9ydCBNZW1iZXJJbXBsIGZyb20gXCIuL21lbWJlci9tZW1iZXJJbXBsXCI7XG5pbXBvcnQgR3JvdXBJbXBsIGZyb20gXCIuL2dyb3VwL2dyb3VwSW1wbFwiO1xuZ2xvYmFsLkdyb3VwID0gR3JvdXBJbXBsO1xuZ2xvYmFsLk1lbWJlciA9IE1lbWJlckltcGw7XG5leHBvcnQgeyBNZW1iZXJJbXBsIGFzIE1lbWJlciwgR3JvdXBJbXBsIGFzIEdyb3VwLCB9O1xuIiwiaW1wb3J0IHsgY29weURhdGUgfSBmcm9tIFwiLi4vdXRpbHMvZGF0ZVV0aWxzXCI7XG5pbXBvcnQgQ2FsZW5kYXJBcHBJbXBsIGZyb20gXCIuLi9jYWxlbmRhci9jYWxlbmRhckFwcEltcGxcIjtcbnZhciBNZW1iZXJJbXBsID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIE1lbWJlckltcGwoaWQsIGNvbmZpZywgY2FsZW5kYXJBcHApIHtcbiAgICAgICAgdGhpcy5pZCA9IGlkO1xuICAgICAgICB2YXIgZGVmYXVsdENvbmZpZyA9IHtcbiAgICAgICAgICAgIGV2ZXJ5TWludXRlczogMTUsXG4gICAgICAgICAgICBpZ25vcmU6IG5ldyBSZWdFeHAoJyg/ISknKSxcbiAgICAgICAgICAgIHN0YXJ0RGF0ZTogbmV3IERhdGUoKSxcbiAgICAgICAgICAgIGVuZERhdGU6IG5ldyBEYXRlKCksXG4gICAgICAgICAgICBjdXRUaW1lUmFuZ2U6IFtdLFxuICAgICAgICB9O1xuICAgICAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZyB8fCBkZWZhdWx0Q29uZmlnO1xuICAgICAgICB0aGlzLmNhbGVuZGFyQXBwID0gY2FsZW5kYXJBcHAgfHwgbmV3IENhbGVuZGFyQXBwSW1wbCgpO1xuICAgIH1cbiAgICBNZW1iZXJJbXBsLnByb3RvdHlwZS5mZXRjaFNjaGVkdWxlcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcbiAgICAgICAgdmFyIHNjaGVkdWxlcyA9IFtdO1xuICAgICAgICB2YXIgY2FsZW5kYXIgPSB0aGlzLmNhbGVuZGFyQXBwLmdldENhbGVuZGFyQnlJZCh0aGlzLmlkKTtcbiAgICAgICAgdmFyIHdvcmtpbmdUaW1lUmFuZ2UgPSBbXTtcbiAgICAgICAgY2FsZW5kYXIuZ2V0RXZlbnRzKHRoaXMuY29uZmlnLnN0YXJ0RGF0ZSwgdGhpcy5jb25maWcuZW5kRGF0ZSkuZm9yRWFjaChmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgICAgIHZhciB0aXRsZSA9IGV2ZW50LmdldFRpdGxlKCk7XG4gICAgICAgICAgICB2YXIgc3RhcnREYXRlID0gY29weURhdGUoZXZlbnQuZ2V0U3RhcnRUaW1lKCkpO1xuICAgICAgICAgICAgdmFyIGVuZERhdGUgPSBjb3B5RGF0ZShldmVudC5nZXRFbmRUaW1lKCkpO1xuICAgICAgICAgICAgLy8gTm90ZTogSWYgeW91IGFyZSBPV05FUiBhbmQgbm90IGF0dGVuZCB0aGUgZXZlbnRzLCBzdGF0dXMgaXMgT1dORVIuXG4gICAgICAgICAgICB2YXIgc3RhdHVzID0gZXZlbnQuZ2V0TXlTdGF0dXMoKTtcbiAgICAgICAgICAgIHZhciBpZ25vcmUgPSBfdGhpcy5jb25maWcuaWdub3JlLnRlc3QodGl0bGUpO1xuICAgICAgICAgICAgdmFyIGFsbERheSA9IGV2ZW50LmlzQWxsRGF5RXZlbnQoKTtcbiAgICAgICAgICAgIC8vIE5vdGU6IEdvb2dsZSBBcHBzIFNjcmlwdCBjYW4ndCBlbnVtLlxuICAgICAgICAgICAgdmFyIHN0YXR1c1N0ciA9IHN0YXR1cyA9PT0gbnVsbCA/ICdNQVlCRScgOiBzdGF0dXMudG9TdHJpbmcoKTtcbiAgICAgICAgICAgIHZhciBub05lZWRDYWxjQXNzaWduTWludXRlID0gc3RhdHVzU3RyID09PSAnTk8nIHx8IGlnbm9yZSB8fCBhbGxEYXk7XG4gICAgICAgICAgICB2YXIgb3JpZ2luYWxBc3NpZ25NaW51dGUgPSBfdGhpcy5fY2FsY0Fzc2lnbk1pbnV0ZShzdGFydERhdGUsIGVuZERhdGUsIFtdLCBbXSk7XG4gICAgICAgICAgICB2YXIgYXNzaWduTWludXRlID0gMDtcbiAgICAgICAgICAgIHZhciBjdXQgPSBmYWxzZTtcbiAgICAgICAgICAgIGlmICghbm9OZWVkQ2FsY0Fzc2lnbk1pbnV0ZSkge1xuICAgICAgICAgICAgICAgIGFzc2lnbk1pbnV0ZSA9IF90aGlzLl9jYWxjQXNzaWduTWludXRlKHN0YXJ0RGF0ZSwgZW5kRGF0ZSwgX3RoaXMuY29uZmlnLmN1dFRpbWVSYW5nZSwgd29ya2luZ1RpbWVSYW5nZSk7XG4gICAgICAgICAgICAgICAgY3V0ID0gb3JpZ2luYWxBc3NpZ25NaW51dGUgIT09IGFzc2lnbk1pbnV0ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNjaGVkdWxlcy5wdXNoKHtcbiAgICAgICAgICAgICAgICBzdGF0dXM6IHN0YXR1c1N0cixcbiAgICAgICAgICAgICAgICBpZ25vcmU6IGlnbm9yZSxcbiAgICAgICAgICAgICAgICBhbGxEYXk6IGFsbERheSxcbiAgICAgICAgICAgICAgICBjdXQ6IGN1dCxcbiAgICAgICAgICAgICAgICBzdGFydDogc3RhcnREYXRlLFxuICAgICAgICAgICAgICAgIGVuZDogZW5kRGF0ZSxcbiAgICAgICAgICAgICAgICBhc3NpZ25NaW51dGU6IGFzc2lnbk1pbnV0ZSxcbiAgICAgICAgICAgICAgICBvcmlnaW5hbEFzc2lnbk1pbnV0ZTogb3JpZ2luYWxBc3NpZ25NaW51dGUsXG4gICAgICAgICAgICAgICAgdGl0bGU6IGV2ZW50LmdldFRpdGxlKCksXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246IGV2ZW50LmdldERlc2NyaXB0aW9uKCksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBzY2hlZHVsZXM7XG4gICAgfTtcbiAgICAvKlxuICAgICAgICBleC5cbiAgICAgICAgc3RhcnQ6IDIwMjAtMDEtMDEgMTE6MDBcbiAgICAgICAgZW5kOiAyMDIwLTAxLTAxIDEzOjAwXG4gICAgICAgIGN1dDogW3tmcm9tOiAyMDIwLTAxLTAxIDEyOjAwLCB0bzogMjAyMC0wMS0wMSAxMzowMH1dXG4gICAgICAgID0+IGFzc2lnbk1pbnV0ZSA9IDYwbTtcbiAgICAgKi9cbiAgICBNZW1iZXJJbXBsLnByb3RvdHlwZS5fY2FsY0Fzc2lnbk1pbnV0ZSA9IGZ1bmN0aW9uIChzdGFydCwgZW5kLCBjdXQsIHdvcmspIHtcbiAgICAgICAgdmFyIGNhbGN1bGF0ZWRBc3NpZ25NaW51dGUgPSAwO1xuICAgICAgICB2YXIgbW92ZVBvaW50ID0gY29weURhdGUoc3RhcnQpO1xuICAgICAgICB3aGlsZSAobW92ZVBvaW50LmdldFRpbWUoKSA8IGVuZC5nZXRUaW1lKCkpIHtcbiAgICAgICAgICAgIG1vdmVQb2ludC5zZXRUaW1lKG1vdmVQb2ludC5nZXRUaW1lKCkgKyAxKTtcbiAgICAgICAgICAgIHZhciBpbkN1dFRpbWUgPSBjdXQuc29tZShmdW5jdGlvbiAocmFuZ2UpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gKG1vdmVQb2ludC5nZXRUaW1lKCkgPD0gcmFuZ2UudG8uZ2V0VGltZSgpICYmIG1vdmVQb2ludC5nZXRUaW1lKCkgPj0gcmFuZ2UuZnJvbS5nZXRUaW1lKCkpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB2YXIgaXNEdXBsaWNhdGUgPSB3b3JrLnNvbWUoZnVuY3Rpb24gKHJhbmdlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIChtb3ZlUG9pbnQuZ2V0VGltZSgpIDw9IHJhbmdlLnRvLmdldFRpbWUoKSAmJiBtb3ZlUG9pbnQuZ2V0VGltZSgpID49IHJhbmdlLmZyb20uZ2V0VGltZSgpKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgbW92ZVBvaW50LnNldFRpbWUobW92ZVBvaW50LmdldFRpbWUoKSAtIDEpO1xuICAgICAgICAgICAgaWYgKCFpbkN1dFRpbWUgJiYgIWlzRHVwbGljYXRlKSB7XG4gICAgICAgICAgICAgICAgY2FsY3VsYXRlZEFzc2lnbk1pbnV0ZSArPSB0aGlzLmNvbmZpZy5ldmVyeU1pbnV0ZXM7XG4gICAgICAgICAgICAgICAgdmFyIGZyb20gPSBjb3B5RGF0ZShtb3ZlUG9pbnQpO1xuICAgICAgICAgICAgICAgIHZhciB0byA9IGNvcHlEYXRlKG1vdmVQb2ludCk7XG4gICAgICAgICAgICAgICAgdG8gPSBuZXcgRGF0ZSh0by5zZXRNaW51dGVzKHRvLmdldE1pbnV0ZXMoKSArIHRoaXMuY29uZmlnLmV2ZXJ5TWludXRlcykpO1xuICAgICAgICAgICAgICAgIHdvcmsucHVzaCh7IGZyb206IGZyb20sIHRvOiB0byB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG1vdmVQb2ludC5zZXRNaW51dGVzKG1vdmVQb2ludC5nZXRNaW51dGVzKCkgKyB0aGlzLmNvbmZpZy5ldmVyeU1pbnV0ZXMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjYWxjdWxhdGVkQXNzaWduTWludXRlO1xuICAgIH07XG4gICAgcmV0dXJuIE1lbWJlckltcGw7XG59KCkpO1xuZXhwb3J0IGRlZmF1bHQgTWVtYmVySW1wbDtcbiIsImV4cG9ydCBmdW5jdGlvbiBjb3B5RGF0ZShkKSB7XG4gICAgcmV0dXJuIG5ldyBEYXRlKGQuZ2V0VGltZSgpKTtcbn1cbjtcbiJdLCJzb3VyY2VSb290IjoiIn0=