chain.js 124 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818
  1. /**
  2. * @fileoverview added by tsickle
  3. * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
  4. */
  5. import * as tslib_1 from "tslib";
  6. // tslint:disable:max-line-length max-file-line-count
  7. import { add, subtract } from '../index';
  8. import { getDate, getFullYear, getHours, getMilliseconds, getMinutes, getMonth, getSeconds } from '../utils/date-getters';
  9. import { setDate, setFullYear, setHours, setMilliseconds, setMinutes, setMonth, setSeconds } from '../utils/date-setters';
  10. import { cloneDate } from '../create/clone';
  11. import { isArray, isBoolean, isDate, isDateValid, isFunction, isNumber, isObject, isString, isUndefined } from '../utils/type-checks';
  12. import { formatDate } from '../format';
  13. import { ISO_8601, RFC_2822 } from '../create/from-string-and-format';
  14. import { getDateOffset, getUTCOffset, hasAlignedHourOffset, isDaylightSavingTime, setOffsetToParsedOffset, setUTCOffset } from '../units/offset';
  15. import { isLeapYear, parseTwoDigitYear } from '../units/year';
  16. import { isAfter, isBefore, isBetween, isSame, isSameOrAfter, isSameOrBefore } from '../utils/date-compare';
  17. import { daysInMonth } from '../units/month';
  18. import { getDayOfWeek, getISODayOfWeek, getLocaleDayOfWeek, parseWeekday, setDayOfWeek, setISODayOfWeek, setLocaleDayOfWeek } from '../units/day-of-week';
  19. import { getISOWeek, getWeek, setISOWeek, setWeek } from '../units/week';
  20. import { getISOWeeksInYear, getISOWeekYear, getSetISOWeekYear, getSetWeekYear, getWeeksInYear, getWeekYear } from '../units/week-year';
  21. import { endOf, startOf } from '../utils/start-end-of';
  22. import { getQuarter, setQuarter } from '../units/quarter';
  23. import { getDayOfYear, setDayOfYear } from '../units/day-of-year';
  24. import { getZoneAbbr, getZoneName } from '../units/timezone';
  25. import { diff } from '../moment/diff';
  26. import { calendar } from '../moment/calendar';
  27. import { defineLocale, getLocale, getSetGlobalLocale, listLocales } from '../locale/locales';
  28. import { max, min } from '../moment/min-max';
  29. import { isDuration } from '../duration/constructor';
  30. import { createLocalOrUTC } from '../create/from-anything';
  31. import { createDuration } from '../duration/create';
  32. /** @type {?} */
  33. export var moment = ((/** @type {?} */ (_moment)));
  34. /**
  35. * @record
  36. */
  37. export function MomentFn() { }
  38. if (false) {
  39. /** @type {?} */
  40. MomentFn.prototype.ISO_8601;
  41. /** @type {?} */
  42. MomentFn.prototype.RFC_2822;
  43. /* Skipping unhandled member: (input?: DateInput | Khronos, format?: string | string[], localeKey?: string | boolean, strict?: boolean, isUTC?: boolean): Khronos;*/
  44. /**
  45. * @param {?=} input
  46. * @param {?=} format
  47. * @param {?=} localeKey
  48. * @param {?=} strict
  49. * @return {?}
  50. */
  51. MomentFn.prototype.utc = function (input, format, localeKey, strict) { };
  52. /**
  53. * @param {?=} input
  54. * @param {?=} format
  55. * @param {?=} localeKey
  56. * @param {?=} strict
  57. * @return {?}
  58. */
  59. MomentFn.prototype.parseZone = function (input, format, localeKey, strict) { };
  60. /**
  61. * @param {?} num
  62. * @return {?}
  63. */
  64. MomentFn.prototype.unix = function (num) { };
  65. /**
  66. * @param {?=} key
  67. * @param {?=} values
  68. * @return {?}
  69. */
  70. MomentFn.prototype.locale = function (key, values) { };
  71. /**
  72. * @param {?=} inp
  73. * @param {?=} unit
  74. * @return {?}
  75. */
  76. MomentFn.prototype.duration = function (inp, unit) { };
  77. /**
  78. * @param {?} name
  79. * @param {?=} config
  80. * @return {?}
  81. */
  82. MomentFn.prototype.defineLocale = function (name, config) { };
  83. /**
  84. * @param {?} input
  85. * @return {?}
  86. */
  87. MomentFn.prototype.parseTwoDigitYear = function (input) { };
  88. /**
  89. * @param {?=} input
  90. * @return {?}
  91. */
  92. MomentFn.prototype.isDate = function (input) { };
  93. /**
  94. * @return {?}
  95. */
  96. MomentFn.prototype.months = function () { };
  97. /**
  98. * @param {?} index
  99. * @return {?}
  100. */
  101. MomentFn.prototype.months = function (index) { };
  102. /**
  103. * @param {?} format
  104. * @return {?}
  105. */
  106. MomentFn.prototype.months = function (format) { };
  107. /**
  108. * @param {?} format
  109. * @param {?} index
  110. * @return {?}
  111. */
  112. MomentFn.prototype.months = function (format, index) { };
  113. /**
  114. * @return {?}
  115. */
  116. MomentFn.prototype.monthsShort = function () { };
  117. /**
  118. * @param {?} index
  119. * @return {?}
  120. */
  121. MomentFn.prototype.monthsShort = function (index) { };
  122. /**
  123. * @param {?} format
  124. * @return {?}
  125. */
  126. MomentFn.prototype.monthsShort = function (format) { };
  127. /**
  128. * @param {?} format
  129. * @param {?} index
  130. * @return {?}
  131. */
  132. MomentFn.prototype.monthsShort = function (format, index) { };
  133. /**
  134. * @return {?}
  135. */
  136. MomentFn.prototype.weekdays = function () { };
  137. /**
  138. * @param {?} index
  139. * @return {?}
  140. */
  141. MomentFn.prototype.weekdays = function (index) { };
  142. /**
  143. * @param {?} format
  144. * @return {?}
  145. */
  146. MomentFn.prototype.weekdays = function (format) { };
  147. /**
  148. * @param {?} format
  149. * @param {?} index
  150. * @return {?}
  151. */
  152. MomentFn.prototype.weekdays = function (format, index) { };
  153. /**
  154. * @param {?} localeSorted
  155. * @return {?}
  156. */
  157. MomentFn.prototype.weekdays = function (localeSorted) { };
  158. /**
  159. * @param {?} localeSorted
  160. * @param {?} index
  161. * @return {?}
  162. */
  163. MomentFn.prototype.weekdays = function (localeSorted, index) { };
  164. /**
  165. * @param {?} localeSorted
  166. * @param {?} format
  167. * @return {?}
  168. */
  169. MomentFn.prototype.weekdays = function (localeSorted, format) { };
  170. /**
  171. * @param {?} localeSorted
  172. * @param {?} format
  173. * @param {?} index
  174. * @return {?}
  175. */
  176. MomentFn.prototype.weekdays = function (localeSorted, format, index) { };
  177. /**
  178. * @return {?}
  179. */
  180. MomentFn.prototype.weekdaysShort = function () { };
  181. /**
  182. * @param {?} index
  183. * @return {?}
  184. */
  185. MomentFn.prototype.weekdaysShort = function (index) { };
  186. /**
  187. * @param {?} format
  188. * @return {?}
  189. */
  190. MomentFn.prototype.weekdaysShort = function (format) { };
  191. /**
  192. * @param {?} format
  193. * @param {?} index
  194. * @return {?}
  195. */
  196. MomentFn.prototype.weekdaysShort = function (format, index) { };
  197. /**
  198. * @param {?} localeSorted
  199. * @return {?}
  200. */
  201. MomentFn.prototype.weekdaysShort = function (localeSorted) { };
  202. /**
  203. * @param {?} localeSorted
  204. * @param {?} index
  205. * @return {?}
  206. */
  207. MomentFn.prototype.weekdaysShort = function (localeSorted, index) { };
  208. /**
  209. * @param {?} localeSorted
  210. * @param {?} format
  211. * @return {?}
  212. */
  213. MomentFn.prototype.weekdaysShort = function (localeSorted, format) { };
  214. /**
  215. * @param {?} localeSorted
  216. * @param {?} format
  217. * @param {?} index
  218. * @return {?}
  219. */
  220. MomentFn.prototype.weekdaysShort = function (localeSorted, format, index) { };
  221. /**
  222. * @return {?}
  223. */
  224. MomentFn.prototype.weekdaysMin = function () { };
  225. /**
  226. * @param {?} index
  227. * @return {?}
  228. */
  229. MomentFn.prototype.weekdaysMin = function (index) { };
  230. /**
  231. * @param {?} format
  232. * @return {?}
  233. */
  234. MomentFn.prototype.weekdaysMin = function (format) { };
  235. /**
  236. * @param {?} format
  237. * @param {?} index
  238. * @return {?}
  239. */
  240. MomentFn.prototype.weekdaysMin = function (format, index) { };
  241. /**
  242. * @param {?} localeSorted
  243. * @return {?}
  244. */
  245. MomentFn.prototype.weekdaysMin = function (localeSorted) { };
  246. /**
  247. * @param {?} localeSorted
  248. * @param {?} index
  249. * @return {?}
  250. */
  251. MomentFn.prototype.weekdaysMin = function (localeSorted, index) { };
  252. /**
  253. * @param {?} localeSorted
  254. * @param {?} format
  255. * @return {?}
  256. */
  257. MomentFn.prototype.weekdaysMin = function (localeSorted, format) { };
  258. /**
  259. * @param {?} localeSorted
  260. * @param {?} format
  261. * @param {?} index
  262. * @return {?}
  263. */
  264. MomentFn.prototype.weekdaysMin = function (localeSorted, format, index) { };
  265. /**
  266. * @param {?} threshold
  267. * @return {?}
  268. */
  269. MomentFn.prototype.relativeTimeThreshold = function (threshold) { };
  270. /**
  271. * @param {?} threshold
  272. * @param {?} limit
  273. * @return {?}
  274. */
  275. MomentFn.prototype.relativeTimeThreshold = function (threshold, limit) { };
  276. /**
  277. * @param {...?} dates
  278. * @return {?}
  279. */
  280. MomentFn.prototype.min = function (dates) { };
  281. /**
  282. * @param {...?} dates
  283. * @return {?}
  284. */
  285. MomentFn.prototype.max = function (dates) { };
  286. /**
  287. * @param {?=} key
  288. * @return {?}
  289. */
  290. MomentFn.prototype.localeData = function (key) { };
  291. /**
  292. * @param {?} language
  293. * @param {?=} localeSpec
  294. * @return {?}
  295. */
  296. MomentFn.prototype.updateLocale = function (language, localeSpec) { };
  297. /**
  298. * @param {?} m
  299. * @param {?} now
  300. * @return {?}
  301. */
  302. MomentFn.prototype.calendarFormat = function (m, now) { };
  303. /**
  304. * @param {?} m
  305. * @param {?} now
  306. * @return {?}
  307. */
  308. MomentFn.prototype.calendarFormat = function (m, now) { };
  309. /**
  310. * @return {?}
  311. */
  312. MomentFn.prototype.invalid = function () { };
  313. /**
  314. * @return {?}
  315. */
  316. MomentFn.prototype.locales = function () { };
  317. /**
  318. * @param {?} m
  319. * @param {?=} keepTime
  320. * @return {?}
  321. */
  322. MomentFn.prototype.updateOffset = function (m, keepTime) { };
  323. }
  324. /**
  325. * @param {?=} input
  326. * @param {?=} format
  327. * @param {?=} localeKey
  328. * @param {?=} strict
  329. * @param {?=} isUTC
  330. * @return {?}
  331. */
  332. function _moment(input, format, localeKey, strict, isUTC) {
  333. if (input instanceof Khronos) {
  334. /** @type {?} */
  335. var _date = input.clone();
  336. return isUTC ? _date.utc() : _date;
  337. }
  338. if (isBoolean(localeKey)) {
  339. return new Khronos(input, format, null, localeKey, isUTC);
  340. }
  341. return new Khronos(input, format, localeKey, strict, isUTC);
  342. }
  343. moment.utc = (/**
  344. * @param {?=} input
  345. * @param {?=} format
  346. * @param {?=} localeKey
  347. * @param {?=} strict
  348. * @return {?}
  349. */
  350. function (input, format, localeKey, strict) {
  351. return _moment(input, format, localeKey, strict, true);
  352. });
  353. moment.parseZone = (/**
  354. * @param {?=} input
  355. * @param {?=} format
  356. * @param {?=} localeKey
  357. * @param {?=} strict
  358. * @return {?}
  359. */
  360. function (input, format, localeKey, strict) {
  361. return _moment(input, format, localeKey, strict, true).parseZone();
  362. });
  363. moment.locale = getSetGlobalLocale;
  364. moment.localeData = (/**
  365. * @param {?=} key
  366. * @return {?}
  367. */
  368. function (key) {
  369. if (key instanceof Khronos) {
  370. return key.localeData();
  371. }
  372. return getLocale(key);
  373. });
  374. // moment.utc = createUTC;
  375. moment.unix = (/**
  376. * @param {?} inp
  377. * @return {?}
  378. */
  379. function (inp) { return new Khronos(inp * 1000); });
  380. moment.ISO_8601 = ISO_8601;
  381. moment.RFC_2822 = RFC_2822;
  382. moment.defineLocale = defineLocale;
  383. moment.parseTwoDigitYear = parseTwoDigitYear;
  384. moment.isDate = isDate;
  385. moment.invalid = (/**
  386. * @return {?}
  387. */
  388. function _invalid() {
  389. return new Khronos(new Date(NaN));
  390. });
  391. // duration(inp?: Duration | DateInput | Khronos, unit?: MomentUnitOfTime): Duration;
  392. moment.duration = (/**
  393. * @param {?=} input
  394. * @param {?=} unit
  395. * @return {?}
  396. */
  397. function (input, unit) {
  398. /** @type {?} */
  399. var _unit = mapUnitOfTime(unit);
  400. if (isDate(input)) {
  401. throw new Error('todo implement');
  402. }
  403. if (input == null) {
  404. return createDuration();
  405. }
  406. if (isDuration(input)) {
  407. return createDuration(input, _unit, { _locale: input._locale });
  408. }
  409. if (isString(input) || isNumber(input) || isDuration(input) || isObject(input)) {
  410. return createDuration(input, _unit);
  411. }
  412. throw new Error('todo implement');
  413. });
  414. moment.min = (/**
  415. * @param {...?} dates
  416. * @return {?}
  417. */
  418. function _min() {
  419. var dates = [];
  420. for (var _i = 0; _i < arguments.length; _i++) {
  421. dates[_i] = arguments[_i];
  422. }
  423. /** @type {?} */
  424. var _firstArg = dates[0];
  425. /** @type {?} */
  426. var _dates = (isArray(_firstArg) ? _firstArg : dates)
  427. // tslint:disable-next-line
  428. .map((/**
  429. * @param {?} date
  430. * @return {?}
  431. */
  432. function (date) { return _moment(date); }))
  433. .map((/**
  434. * @param {?} date
  435. * @return {?}
  436. */
  437. function (date) { return date.toDate(); }));
  438. /** @type {?} */
  439. var _date = min.apply(void 0, tslib_1.__spread(_dates));
  440. return new Khronos(_date);
  441. });
  442. moment.max = (/**
  443. * @param {...?} dates
  444. * @return {?}
  445. */
  446. function _max() {
  447. var dates = [];
  448. for (var _i = 0; _i < arguments.length; _i++) {
  449. dates[_i] = arguments[_i];
  450. }
  451. /** @type {?} */
  452. var _firstArg = dates[0];
  453. /** @type {?} */
  454. var _dates = (isArray(_firstArg) ? _firstArg : dates)
  455. // tslint:disable-next-line
  456. .map((/**
  457. * @param {?} date
  458. * @return {?}
  459. */
  460. function (date) { return _moment(date); }))
  461. .map((/**
  462. * @param {?} date
  463. * @return {?}
  464. */
  465. function (date) { return date.toDate(); }));
  466. /** @type {?} */
  467. var _date = max.apply(void 0, tslib_1.__spread(_dates));
  468. return new Khronos(_date);
  469. });
  470. moment.locales = (/**
  471. * @return {?}
  472. */
  473. function () {
  474. return listLocales();
  475. });
  476. /**
  477. * @record
  478. */
  479. export function MomentInputObject() { }
  480. if (false) {
  481. /** @type {?|undefined} */
  482. MomentInputObject.prototype.years;
  483. /** @type {?|undefined} */
  484. MomentInputObject.prototype.year;
  485. /** @type {?|undefined} */
  486. MomentInputObject.prototype.y;
  487. /** @type {?|undefined} */
  488. MomentInputObject.prototype.months;
  489. /** @type {?|undefined} */
  490. MomentInputObject.prototype.month;
  491. /** @type {?|undefined} */
  492. MomentInputObject.prototype.M;
  493. /** @type {?|undefined} */
  494. MomentInputObject.prototype.days;
  495. /** @type {?|undefined} */
  496. MomentInputObject.prototype.day;
  497. /** @type {?|undefined} */
  498. MomentInputObject.prototype.d;
  499. /** @type {?|undefined} */
  500. MomentInputObject.prototype.dates;
  501. /** @type {?|undefined} */
  502. MomentInputObject.prototype.date;
  503. /** @type {?|undefined} */
  504. MomentInputObject.prototype.D;
  505. /** @type {?|undefined} */
  506. MomentInputObject.prototype.hours;
  507. /** @type {?|undefined} */
  508. MomentInputObject.prototype.hour;
  509. /** @type {?|undefined} */
  510. MomentInputObject.prototype.h;
  511. /** @type {?|undefined} */
  512. MomentInputObject.prototype.minutes;
  513. /** @type {?|undefined} */
  514. MomentInputObject.prototype.minute;
  515. /** @type {?|undefined} */
  516. MomentInputObject.prototype.m;
  517. /** @type {?|undefined} */
  518. MomentInputObject.prototype.seconds;
  519. /** @type {?|undefined} */
  520. MomentInputObject.prototype.second;
  521. /** @type {?|undefined} */
  522. MomentInputObject.prototype.s;
  523. /** @type {?|undefined} */
  524. MomentInputObject.prototype.milliseconds;
  525. /** @type {?|undefined} */
  526. MomentInputObject.prototype.millisecond;
  527. /** @type {?|undefined} */
  528. MomentInputObject.prototype.ms;
  529. /** @type {?|undefined} */
  530. MomentInputObject.prototype.w;
  531. /** @type {?|undefined} */
  532. MomentInputObject.prototype.week;
  533. /** @type {?|undefined} */
  534. MomentInputObject.prototype.weeks;
  535. /** @type {?|undefined} */
  536. MomentInputObject.prototype.Q;
  537. /** @type {?|undefined} */
  538. MomentInputObject.prototype.quarter;
  539. /** @type {?|undefined} */
  540. MomentInputObject.prototype.quarters;
  541. /** @type {?|undefined} */
  542. MomentInputObject.prototype.weekYear;
  543. }
  544. /** @type {?} */
  545. var _unitsPriority = {
  546. year: 1,
  547. month: 8,
  548. week: 5,
  549. isoWeek: 5,
  550. day: 11,
  551. weekday: 11,
  552. isoWeekday: 11,
  553. hours: 13,
  554. weekYear: 1,
  555. isoWeekYear: 1,
  556. quarter: 7,
  557. date: 9,
  558. dayOfYear: 4,
  559. minutes: 14,
  560. seconds: 15,
  561. milliseconds: 16
  562. };
  563. // todo: do I need 2 mappers?
  564. /** @type {?} */
  565. var _timeHashMap = {
  566. y: 'year',
  567. years: 'year',
  568. year: 'year',
  569. M: 'month',
  570. months: 'month',
  571. month: 'month',
  572. w: 'week',
  573. weeks: 'week',
  574. week: 'week',
  575. d: 'day',
  576. days: 'day',
  577. day: 'day',
  578. date: 'date',
  579. dates: 'date',
  580. D: 'date',
  581. h: 'hours',
  582. hour: 'hours',
  583. hours: 'hours',
  584. m: 'minutes',
  585. minute: 'minutes',
  586. minutes: 'minutes',
  587. s: 'seconds',
  588. second: 'seconds',
  589. seconds: 'seconds',
  590. ms: 'milliseconds',
  591. millisecond: 'milliseconds',
  592. milliseconds: 'milliseconds',
  593. quarter: 'quarter',
  594. quarters: 'quarter',
  595. q: 'quarter',
  596. Q: 'quarter',
  597. isoWeek: 'isoWeek',
  598. isoWeeks: 'isoWeek',
  599. W: 'isoWeek',
  600. weekYear: 'weekYear',
  601. weekYears: 'weekYear',
  602. gg: 'weekYears',
  603. isoWeekYear: 'isoWeekYear',
  604. isoWeekYears: 'isoWeekYear',
  605. GG: 'isoWeekYear',
  606. dayOfYear: 'dayOfYear',
  607. dayOfYears: 'dayOfYear',
  608. DDD: 'dayOfYear',
  609. weekday: 'weekday',
  610. weekdays: 'weekday',
  611. e: 'weekday',
  612. isoWeekday: 'isoWeekday',
  613. isoWeekdays: 'isoWeekday',
  614. E: 'isoWeekday'
  615. };
  616. /**
  617. * @param {?} period
  618. * @return {?}
  619. */
  620. function mapUnitOfTime(period) {
  621. return (/** @type {?} */ (_timeHashMap[period]));
  622. }
  623. /**
  624. * @param {?} obj
  625. * @return {?}
  626. */
  627. function mapMomentInputObject(obj) {
  628. /** @type {?} */
  629. var _res = {};
  630. return Object.keys(obj)
  631. .reduce((/**
  632. * @param {?} res
  633. * @param {?} key
  634. * @return {?}
  635. */
  636. function (res, key) {
  637. res[mapUnitOfTime(key)] = obj[key];
  638. return res;
  639. }), _res);
  640. }
  641. var Khronos = /** @class */ (function () {
  642. function Khronos(input, format, localeKey, strict, isUTC, offset) {
  643. if (strict === void 0) { strict = false; }
  644. if (isUTC === void 0) { isUTC = false; }
  645. this._date = new Date();
  646. this._isUTC = false;
  647. // locale will be needed to format invalid date message
  648. this._locale = getLocale(localeKey);
  649. // parse invalid input
  650. if (input === '' || input === null || (isNumber(input) && isNaN(input))) {
  651. this._date = new Date(NaN);
  652. return this;
  653. }
  654. this._isUTC = isUTC;
  655. if (this._isUTC) {
  656. this._offset = 0;
  657. }
  658. if (offset || offset === 0) {
  659. this._offset = offset;
  660. }
  661. this._isStrict = strict;
  662. this._format = format;
  663. if (!input && input !== 0 && !format) {
  664. this._date = new Date();
  665. return this;
  666. }
  667. if (isDate(input)) {
  668. this._date = cloneDate(input);
  669. return this;
  670. }
  671. // this._date = parseDate(input, format, localeKey, strict, isUTC);
  672. /** @type {?} */
  673. var config = createLocalOrUTC(input, format, localeKey, strict, isUTC);
  674. this._date = config._d;
  675. this._offset = isNumber(config._offset) ? config._offset : this._offset;
  676. this._isUTC = config._isUTC;
  677. this._isStrict = config._strict;
  678. this._format = config._f;
  679. this._tzm = config._tzm;
  680. }
  681. /**
  682. * @return {?}
  683. */
  684. Khronos.prototype._toConfig = /**
  685. * @return {?}
  686. */
  687. function () {
  688. return { _isUTC: this._isUTC, _locale: this._locale, _offset: this._offset, _tzm: this._tzm };
  689. };
  690. /**
  691. * @param {?=} localeKey
  692. * @return {?}
  693. */
  694. Khronos.prototype.locale = /**
  695. * @param {?=} localeKey
  696. * @return {?}
  697. */
  698. function (localeKey) {
  699. if (isUndefined(localeKey)) {
  700. return this._locale._abbr;
  701. }
  702. if (localeKey instanceof Khronos) {
  703. this._locale = localeKey._locale;
  704. return this;
  705. }
  706. /** @type {?} */
  707. var newLocaleData = getLocale(localeKey);
  708. if (newLocaleData != null) {
  709. this._locale = newLocaleData;
  710. }
  711. return this;
  712. };
  713. /**
  714. * @return {?}
  715. */
  716. Khronos.prototype.localeData = /**
  717. * @return {?}
  718. */
  719. function () {
  720. return this._locale;
  721. };
  722. // Basic
  723. // Basic
  724. /**
  725. * @param {?} val
  726. * @param {?=} period
  727. * @return {?}
  728. */
  729. Khronos.prototype.add =
  730. // Basic
  731. /**
  732. * @param {?} val
  733. * @param {?=} period
  734. * @return {?}
  735. */
  736. function (val, period) {
  737. var _this = this;
  738. if (isString(val)) {
  739. this._date = add(this._date, parseInt(val, 10), mapUnitOfTime(period));
  740. }
  741. if (isNumber(val)) {
  742. this._date = add(this._date, val, mapUnitOfTime(period));
  743. }
  744. if (isObject(val)) {
  745. /** @type {?} */
  746. var _mapped_1 = mapMomentInputObject(val);
  747. Object.keys(_mapped_1)
  748. .forEach((/**
  749. * @param {?} key
  750. * @return {?}
  751. */
  752. function (key) { return add(_this._date, _mapped_1[key], key); }));
  753. }
  754. return this;
  755. };
  756. // fixme: for some reason here 'null' for time is fine
  757. // fixme: for some reason here 'null' for time is fine
  758. /**
  759. * @param {?=} time
  760. * @param {?=} formats
  761. * @return {?}
  762. */
  763. Khronos.prototype.calendar =
  764. // fixme: for some reason here 'null' for time is fine
  765. /**
  766. * @param {?=} time
  767. * @param {?=} formats
  768. * @return {?}
  769. */
  770. function (time, formats) {
  771. /** @type {?} */
  772. var _time = time instanceof Khronos ? time : new Khronos(time || new Date());
  773. /** @type {?} */
  774. var _offset = (this._offset || 0) - (_time._offset || 0);
  775. /** @type {?} */
  776. var _config = Object.assign(this._toConfig(), { _offset: _offset });
  777. return calendar(this._date, _time._date, formats, this._locale, _config);
  778. };
  779. /**
  780. * @return {?}
  781. */
  782. Khronos.prototype.clone = /**
  783. * @return {?}
  784. */
  785. function () {
  786. /** @type {?} */
  787. var localeKey = this._locale && this._locale._abbr || 'en';
  788. // return new Khronos(cloneDate(this._date), this._format, localeKey, this._isStrict, this._isUTC);
  789. // fails if isUTC and offset
  790. // return new Khronos(new Date(this.valueOf()),
  791. return new Khronos(this._date, this._format, localeKey, this._isStrict, this._isUTC, this._offset);
  792. };
  793. /**
  794. * @param {?} b
  795. * @param {?=} unitOfTime
  796. * @param {?=} precise
  797. * @return {?}
  798. */
  799. Khronos.prototype.diff = /**
  800. * @param {?} b
  801. * @param {?=} unitOfTime
  802. * @param {?=} precise
  803. * @return {?}
  804. */
  805. function (b, unitOfTime, precise) {
  806. /** @type {?} */
  807. var unit = mapUnitOfTime(unitOfTime);
  808. /** @type {?} */
  809. var _b = b instanceof Khronos ? b : new Khronos(b);
  810. // const zoneDelta = (_b.utcOffset() - this.utcOffset());
  811. // const config = Object.assign(this._toConfig(), {
  812. // _offset: 0,
  813. // _isUTC: true,
  814. // _zoneDelta: zoneDelta
  815. // });
  816. // return diff(new Date(this.valueOf()), new Date(_b.valueOf()), unit, precise, config);
  817. return diff(this._date, _b.toDate(), unit, precise, this._toConfig());
  818. };
  819. /**
  820. * @param {?=} period
  821. * @return {?}
  822. */
  823. Khronos.prototype.endOf = /**
  824. * @param {?=} period
  825. * @return {?}
  826. */
  827. function (period) {
  828. /** @type {?} */
  829. var _per = mapUnitOfTime(period);
  830. this._date = endOf(this._date, _per, this._isUTC);
  831. return this;
  832. };
  833. /**
  834. * @param {?=} format
  835. * @return {?}
  836. */
  837. Khronos.prototype.format = /**
  838. * @param {?=} format
  839. * @return {?}
  840. */
  841. function (format) {
  842. return formatDate(this._date, format, this._locale && this._locale._abbr, this._isUTC, this._offset);
  843. };
  844. // todo: implement
  845. // todo: implement
  846. /**
  847. * @param {?=} time
  848. * @param {?=} withoutSuffix
  849. * @return {?}
  850. */
  851. Khronos.prototype.from =
  852. // todo: implement
  853. /**
  854. * @param {?=} time
  855. * @param {?=} withoutSuffix
  856. * @return {?}
  857. */
  858. function (time, withoutSuffix) {
  859. /** @type {?} */
  860. var _time = _moment(time);
  861. if (this.isValid() && _time.isValid()) {
  862. return createDuration({ to: this.toDate(), from: _time.toDate() })
  863. .locale(this.locale())
  864. .humanize(!withoutSuffix);
  865. }
  866. return this.localeData().invalidDate;
  867. };
  868. /**
  869. * @param {?=} withoutSuffix
  870. * @return {?}
  871. */
  872. Khronos.prototype.fromNow = /**
  873. * @param {?=} withoutSuffix
  874. * @return {?}
  875. */
  876. function (withoutSuffix) {
  877. return this.from(new Date(), withoutSuffix);
  878. };
  879. /**
  880. * @param {?} inp
  881. * @param {?=} suffix
  882. * @return {?}
  883. */
  884. Khronos.prototype.to = /**
  885. * @param {?} inp
  886. * @param {?=} suffix
  887. * @return {?}
  888. */
  889. function (inp, suffix) {
  890. throw new Error("TODO: Implement");
  891. };
  892. /**
  893. * @param {?=} withoutPrefix
  894. * @return {?}
  895. */
  896. Khronos.prototype.toNow = /**
  897. * @param {?=} withoutPrefix
  898. * @return {?}
  899. */
  900. function (withoutPrefix) {
  901. throw new Error("TODO: Implement");
  902. };
  903. /**
  904. * @param {?} val
  905. * @param {?=} period
  906. * @return {?}
  907. */
  908. Khronos.prototype.subtract = /**
  909. * @param {?} val
  910. * @param {?=} period
  911. * @return {?}
  912. */
  913. function (val, period) {
  914. var _this = this;
  915. if (isString(val)) {
  916. this._date = subtract(this._date, parseInt(val, 10), mapUnitOfTime(period));
  917. return this;
  918. }
  919. if (isNumber(val)) {
  920. this._date = subtract(this._date, val, mapUnitOfTime(period));
  921. }
  922. if (isObject(val)) {
  923. /** @type {?} */
  924. var _mapped_2 = mapMomentInputObject(val);
  925. Object.keys(_mapped_2)
  926. .forEach((/**
  927. * @param {?} key
  928. * @return {?}
  929. */
  930. function (key) { return subtract(_this._date, _mapped_2[key], key); }));
  931. }
  932. return this;
  933. };
  934. /**
  935. * @param {?} period
  936. * @return {?}
  937. */
  938. Khronos.prototype.get = /**
  939. * @param {?} period
  940. * @return {?}
  941. */
  942. function (period) {
  943. if (period === 'dayOfYear') {
  944. return this.dayOfYear();
  945. }
  946. /** @type {?} */
  947. var unit = mapUnitOfTime(period);
  948. switch (unit) {
  949. case 'year':
  950. return this.year();
  951. case 'month':
  952. return this.month();
  953. // | 'week'
  954. case 'date':
  955. return this.date();
  956. case 'day':
  957. return this.day();
  958. case 'hours':
  959. return this.hours();
  960. case 'minutes':
  961. return this.minutes();
  962. case 'seconds':
  963. return this.seconds();
  964. case 'milliseconds':
  965. return this.milliseconds();
  966. case 'week':
  967. return this.week();
  968. case 'isoWeek':
  969. return this.isoWeek();
  970. case 'weekYear':
  971. return this.weekYear();
  972. case 'isoWeekYear':
  973. return this.isoWeekYear();
  974. case 'weekday':
  975. return this.weekday();
  976. case 'isoWeekday':
  977. return this.isoWeekday();
  978. case 'quarter':
  979. return this.quarter();
  980. default:
  981. throw new Error("Unknown moment.get('" + period + "')");
  982. }
  983. };
  984. /**
  985. * @param {?} period
  986. * @param {?=} input
  987. * @return {?}
  988. */
  989. Khronos.prototype.set = /**
  990. * @param {?} period
  991. * @param {?=} input
  992. * @return {?}
  993. */
  994. function (period, input) {
  995. var _this = this;
  996. if (isString(period)) {
  997. /** @type {?} */
  998. var unit = mapUnitOfTime(period);
  999. switch (unit) {
  1000. case 'year':
  1001. return this.year(input);
  1002. case 'month':
  1003. return this.month(input);
  1004. // | 'week'
  1005. case 'day':
  1006. return this.day(input);
  1007. case 'date':
  1008. return this.date(input);
  1009. case 'hours':
  1010. return this.hours(input);
  1011. case 'minutes':
  1012. return this.minutes(input);
  1013. case 'seconds':
  1014. return this.seconds(input);
  1015. case 'milliseconds':
  1016. return this.milliseconds(input);
  1017. case 'week':
  1018. return this.week(input);
  1019. case 'isoWeek':
  1020. return this.isoWeek(input);
  1021. case 'weekYear':
  1022. return this.weekYear(input);
  1023. case 'isoWeekYear':
  1024. return this.isoWeekYear(input);
  1025. case 'weekday':
  1026. return this.weekday(input);
  1027. case 'isoWeekday':
  1028. return this.isoWeekday(input);
  1029. case 'quarter':
  1030. return this.quarter(input);
  1031. default:
  1032. throw new Error("Unknown moment.get('" + period + "')");
  1033. }
  1034. }
  1035. if (isObject(period)) {
  1036. /** @type {?} */
  1037. var _mapped_3 = mapMomentInputObject(period);
  1038. Object.keys(_mapped_3)
  1039. .sort((/**
  1040. * @param {?} a
  1041. * @param {?} b
  1042. * @return {?}
  1043. */
  1044. function (a, b) {
  1045. return _unitsPriority[a] - _unitsPriority[b];
  1046. }))
  1047. .forEach((/**
  1048. * @param {?} key
  1049. * @return {?}
  1050. */
  1051. function (key) { return _this.set(key, _mapped_3[key]); }));
  1052. }
  1053. return this;
  1054. };
  1055. /**
  1056. * @return {?}
  1057. */
  1058. Khronos.prototype.toString = /**
  1059. * @return {?}
  1060. */
  1061. function () {
  1062. return this.format('ddd MMM DD YYYY HH:mm:ss [GMT]ZZ');
  1063. };
  1064. /**
  1065. * @return {?}
  1066. */
  1067. Khronos.prototype.toISOString = /**
  1068. * @return {?}
  1069. */
  1070. function () {
  1071. if (!this.isValid()) {
  1072. return null;
  1073. }
  1074. if (getFullYear(this._date, true) < 0 || getFullYear(this._date, true) > 9999) {
  1075. return this.format('YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]');
  1076. }
  1077. if (isFunction(Date.prototype.toISOString)) {
  1078. // native implementation is ~50x faster, use it when we can
  1079. return this.toDate().toISOString();
  1080. }
  1081. return this.format('YYYY-MM-DD[T]HH:mm:ss.SSS[Z]');
  1082. };
  1083. /**
  1084. * @return {?}
  1085. */
  1086. Khronos.prototype.inspect = /**
  1087. * @return {?}
  1088. */
  1089. function () {
  1090. throw new Error('TODO: implement');
  1091. };
  1092. /**
  1093. * @return {?}
  1094. */
  1095. Khronos.prototype.toJSON = /**
  1096. * @return {?}
  1097. */
  1098. function () {
  1099. return this.toISOString();
  1100. };
  1101. /**
  1102. * @return {?}
  1103. */
  1104. Khronos.prototype.toDate = /**
  1105. * @return {?}
  1106. */
  1107. function () {
  1108. return new Date(this.valueOf());
  1109. };
  1110. /**
  1111. * @return {?}
  1112. */
  1113. Khronos.prototype.toObject = /**
  1114. * @return {?}
  1115. */
  1116. function () {
  1117. return {
  1118. // years: getFullYear(this._date, this._isUTC),
  1119. // months: getMonth(this._date, this._isUTC),
  1120. year: getFullYear(this._date, this._isUTC),
  1121. month: getMonth(this._date, this._isUTC),
  1122. date: getDate(this._date, this._isUTC),
  1123. hours: getHours(this._date, this._isUTC),
  1124. minutes: getMinutes(this._date, this._isUTC),
  1125. seconds: getSeconds(this._date, this._isUTC),
  1126. milliseconds: getMilliseconds(this._date, this._isUTC)
  1127. };
  1128. };
  1129. /**
  1130. * @return {?}
  1131. */
  1132. Khronos.prototype.toArray = /**
  1133. * @return {?}
  1134. */
  1135. function () {
  1136. return [this.year(), this.month(), this.date(), this.hour(), this.minute(), this.second(), this.millisecond()];
  1137. };
  1138. // Dates boolean algebra
  1139. // Dates boolean algebra
  1140. /**
  1141. * @param {?} date
  1142. * @param {?=} unit
  1143. * @return {?}
  1144. */
  1145. Khronos.prototype.isAfter =
  1146. // Dates boolean algebra
  1147. /**
  1148. * @param {?} date
  1149. * @param {?=} unit
  1150. * @return {?}
  1151. */
  1152. function (date, unit) {
  1153. /** @type {?} */
  1154. var _unit = unit ? mapUnitOfTime(unit) : void 0;
  1155. return isAfter(this._date, date.toDate(), _unit);
  1156. };
  1157. /**
  1158. * @param {?} date
  1159. * @param {?=} unit
  1160. * @return {?}
  1161. */
  1162. Khronos.prototype.isBefore = /**
  1163. * @param {?} date
  1164. * @param {?=} unit
  1165. * @return {?}
  1166. */
  1167. function (date, unit) {
  1168. /** @type {?} */
  1169. var _unit = unit ? mapUnitOfTime(unit) : void 0;
  1170. return isBefore(this.toDate(), date.toDate(), _unit);
  1171. };
  1172. /**
  1173. * @param {?} from
  1174. * @param {?} to
  1175. * @param {?=} unit
  1176. * @param {?=} inclusivity
  1177. * @return {?}
  1178. */
  1179. Khronos.prototype.isBetween = /**
  1180. * @param {?} from
  1181. * @param {?} to
  1182. * @param {?=} unit
  1183. * @param {?=} inclusivity
  1184. * @return {?}
  1185. */
  1186. function (from, to, unit, inclusivity) {
  1187. /** @type {?} */
  1188. var _unit = unit ? mapUnitOfTime(unit) : void 0;
  1189. return isBetween(this.toDate(), from.toDate(), to.toDate(), _unit, inclusivity);
  1190. };
  1191. /**
  1192. * @param {?} date
  1193. * @param {?=} unit
  1194. * @return {?}
  1195. */
  1196. Khronos.prototype.isSame = /**
  1197. * @param {?} date
  1198. * @param {?=} unit
  1199. * @return {?}
  1200. */
  1201. function (date, unit) {
  1202. /** @type {?} */
  1203. var _unit = unit ? mapUnitOfTime(unit) : void 0;
  1204. return isSame(this._date, date.toDate(), _unit);
  1205. };
  1206. /**
  1207. * @param {?} date
  1208. * @param {?=} unit
  1209. * @return {?}
  1210. */
  1211. Khronos.prototype.isSameOrAfter = /**
  1212. * @param {?} date
  1213. * @param {?=} unit
  1214. * @return {?}
  1215. */
  1216. function (date, unit) {
  1217. /** @type {?} */
  1218. var _unit = unit ? mapUnitOfTime(unit) : void 0;
  1219. return isSameOrAfter(this._date, date.toDate(), _unit);
  1220. };
  1221. /**
  1222. * @param {?} date
  1223. * @param {?=} unit
  1224. * @return {?}
  1225. */
  1226. Khronos.prototype.isSameOrBefore = /**
  1227. * @param {?} date
  1228. * @param {?=} unit
  1229. * @return {?}
  1230. */
  1231. function (date, unit) {
  1232. /** @type {?} */
  1233. var _unit = unit ? mapUnitOfTime(unit) : void 0;
  1234. return isSameOrBefore(this._date, date.toDate(), _unit);
  1235. };
  1236. /**
  1237. * @return {?}
  1238. */
  1239. Khronos.prototype.isValid = /**
  1240. * @return {?}
  1241. */
  1242. function () {
  1243. return isDateValid(this._date);
  1244. };
  1245. /**
  1246. * @return {?}
  1247. */
  1248. Khronos.prototype.valueOf = /**
  1249. * @return {?}
  1250. */
  1251. function () {
  1252. return this._date.valueOf() - ((this._offset || 0) * 60000);
  1253. };
  1254. /**
  1255. * @return {?}
  1256. */
  1257. Khronos.prototype.unix = /**
  1258. * @return {?}
  1259. */
  1260. function () {
  1261. // return getUnixTime(this._date);
  1262. return Math.floor(this.valueOf() / 1000);
  1263. };
  1264. /**
  1265. * @param {?=} b
  1266. * @param {?=} keepLocalTime
  1267. * @return {?}
  1268. */
  1269. Khronos.prototype.utcOffset = /**
  1270. * @param {?=} b
  1271. * @param {?=} keepLocalTime
  1272. * @return {?}
  1273. */
  1274. function (b, keepLocalTime) {
  1275. /** @type {?} */
  1276. var _config = this._toConfig();
  1277. if (!b && b !== 0) {
  1278. return getUTCOffset(this._date, _config);
  1279. }
  1280. this._date = setUTCOffset(this._date, b, keepLocalTime, false, _config);
  1281. this._offset = _config._offset;
  1282. this._isUTC = _config._isUTC;
  1283. return this;
  1284. };
  1285. /**
  1286. * @param {?=} keepLocalTime
  1287. * @return {?}
  1288. */
  1289. Khronos.prototype.utc = /**
  1290. * @param {?=} keepLocalTime
  1291. * @return {?}
  1292. */
  1293. function (keepLocalTime) {
  1294. return this.utcOffset(0, keepLocalTime);
  1295. };
  1296. /**
  1297. * @param {?=} keepLocalTime
  1298. * @return {?}
  1299. */
  1300. Khronos.prototype.local = /**
  1301. * @param {?=} keepLocalTime
  1302. * @return {?}
  1303. */
  1304. function (keepLocalTime) {
  1305. if (this._isUTC) {
  1306. this.utcOffset(0, keepLocalTime);
  1307. this._isUTC = false;
  1308. if (keepLocalTime) {
  1309. this.subtract(getDateOffset(this._date), 'm');
  1310. }
  1311. }
  1312. return this;
  1313. };
  1314. /**
  1315. * @param {?=} input
  1316. * @return {?}
  1317. */
  1318. Khronos.prototype.parseZone = /**
  1319. * @param {?=} input
  1320. * @return {?}
  1321. */
  1322. function (input) {
  1323. /** @type {?} */
  1324. var _config = this._toConfig();
  1325. this._date = setOffsetToParsedOffset(this._date, input, _config);
  1326. this._offset = _config._offset;
  1327. this._isUTC = _config._isUTC;
  1328. return this;
  1329. };
  1330. /**
  1331. * @param {?=} input
  1332. * @return {?}
  1333. */
  1334. Khronos.prototype.hasAlignedHourOffset = /**
  1335. * @param {?=} input
  1336. * @return {?}
  1337. */
  1338. function (input) {
  1339. return hasAlignedHourOffset(this._date, input ? input._date : void 0);
  1340. };
  1341. /**
  1342. * @return {?}
  1343. */
  1344. Khronos.prototype.isDST = /**
  1345. * @return {?}
  1346. */
  1347. function () {
  1348. return isDaylightSavingTime(this._date);
  1349. };
  1350. /**
  1351. * @return {?}
  1352. */
  1353. Khronos.prototype.isLocal = /**
  1354. * @return {?}
  1355. */
  1356. function () {
  1357. return !this._isUTC;
  1358. };
  1359. /**
  1360. * @return {?}
  1361. */
  1362. Khronos.prototype.isUtcOffset = /**
  1363. * @return {?}
  1364. */
  1365. function () {
  1366. return this._isUTC;
  1367. };
  1368. /**
  1369. * @return {?}
  1370. */
  1371. Khronos.prototype.isUTC = /**
  1372. * @return {?}
  1373. */
  1374. function () {
  1375. return this.isUtc();
  1376. };
  1377. /**
  1378. * @return {?}
  1379. */
  1380. Khronos.prototype.isUtc = /**
  1381. * @return {?}
  1382. */
  1383. function () {
  1384. return this._isUTC && this._offset === 0;
  1385. };
  1386. // Timezone
  1387. // Timezone
  1388. /**
  1389. * @return {?}
  1390. */
  1391. Khronos.prototype.zoneAbbr =
  1392. // Timezone
  1393. /**
  1394. * @return {?}
  1395. */
  1396. function () {
  1397. return getZoneAbbr(this._isUTC);
  1398. };
  1399. /**
  1400. * @return {?}
  1401. */
  1402. Khronos.prototype.zoneName = /**
  1403. * @return {?}
  1404. */
  1405. function () {
  1406. return getZoneName(this._isUTC);
  1407. };
  1408. /**
  1409. * @param {?=} year
  1410. * @return {?}
  1411. */
  1412. Khronos.prototype.year = /**
  1413. * @param {?=} year
  1414. * @return {?}
  1415. */
  1416. function (year) {
  1417. if (!year && year !== 0) {
  1418. return getFullYear(this._date, this._isUTC);
  1419. }
  1420. this._date = cloneDate(setFullYear(this._date, year));
  1421. return this;
  1422. };
  1423. /**
  1424. * @param {?=} val
  1425. * @return {?}
  1426. */
  1427. Khronos.prototype.weekYear = /**
  1428. * @param {?=} val
  1429. * @return {?}
  1430. */
  1431. function (val) {
  1432. if (!val && val !== 0) {
  1433. return getWeekYear(this._date, this._locale, this.isUTC());
  1434. }
  1435. /** @type {?} */
  1436. var date = getSetWeekYear(this._date, val, this._locale, this.isUTC());
  1437. if (isDate(date)) {
  1438. this._date = date;
  1439. }
  1440. return this;
  1441. };
  1442. /**
  1443. * @param {?=} val
  1444. * @return {?}
  1445. */
  1446. Khronos.prototype.isoWeekYear = /**
  1447. * @param {?=} val
  1448. * @return {?}
  1449. */
  1450. function (val) {
  1451. if (!val && val !== 0) {
  1452. return getISOWeekYear(this._date, this.isUTC());
  1453. }
  1454. /** @type {?} */
  1455. var date = getSetISOWeekYear(this._date, val, this.isUtc());
  1456. if (isDate(date)) {
  1457. this._date = date;
  1458. }
  1459. return this;
  1460. };
  1461. /**
  1462. * @return {?}
  1463. */
  1464. Khronos.prototype.isLeapYear = /**
  1465. * @return {?}
  1466. */
  1467. function () {
  1468. return isLeapYear(getFullYear(this.toDate(), this.isUTC()));
  1469. };
  1470. /**
  1471. * @param {?=} month
  1472. * @return {?}
  1473. */
  1474. Khronos.prototype.month = /**
  1475. * @param {?=} month
  1476. * @return {?}
  1477. */
  1478. function (month) {
  1479. if (!month && month !== 0) {
  1480. return getMonth(this._date, this._isUTC);
  1481. }
  1482. /** @type {?} */
  1483. var _month = month;
  1484. if (isString(month)) {
  1485. /** @type {?} */
  1486. var locale = this._locale || getLocale();
  1487. _month = locale.monthsParse(month);
  1488. }
  1489. if (isNumber(_month)) {
  1490. this._date = cloneDate(setMonth(this._date, _month, this._isUTC));
  1491. }
  1492. return this;
  1493. };
  1494. /**
  1495. * @param {?=} hours
  1496. * @return {?}
  1497. */
  1498. Khronos.prototype.hour = /**
  1499. * @param {?=} hours
  1500. * @return {?}
  1501. */
  1502. function (hours) {
  1503. return this.hours(hours);
  1504. };
  1505. /**
  1506. * @param {?=} hours
  1507. * @return {?}
  1508. */
  1509. Khronos.prototype.hours = /**
  1510. * @param {?=} hours
  1511. * @return {?}
  1512. */
  1513. function (hours) {
  1514. if (!hours && hours !== 0) {
  1515. return getHours(this._date, this._isUTC);
  1516. }
  1517. this._date = cloneDate(setHours(this._date, hours, this._isUTC));
  1518. return this;
  1519. };
  1520. /**
  1521. * @param {?=} minutes
  1522. * @return {?}
  1523. */
  1524. Khronos.prototype.minute = /**
  1525. * @param {?=} minutes
  1526. * @return {?}
  1527. */
  1528. function (minutes) {
  1529. return this.minutes(minutes);
  1530. };
  1531. /**
  1532. * @param {?=} minutes
  1533. * @return {?}
  1534. */
  1535. Khronos.prototype.minutes = /**
  1536. * @param {?=} minutes
  1537. * @return {?}
  1538. */
  1539. function (minutes) {
  1540. if (!minutes && minutes !== 0) {
  1541. return getMinutes(this._date, this._isUTC);
  1542. }
  1543. this._date = cloneDate(setMinutes(this._date, minutes, this._isUTC));
  1544. return this;
  1545. };
  1546. /**
  1547. * @param {?=} seconds
  1548. * @return {?}
  1549. */
  1550. Khronos.prototype.second = /**
  1551. * @param {?=} seconds
  1552. * @return {?}
  1553. */
  1554. function (seconds) {
  1555. return this.seconds(seconds);
  1556. };
  1557. /**
  1558. * @param {?=} seconds
  1559. * @return {?}
  1560. */
  1561. Khronos.prototype.seconds = /**
  1562. * @param {?=} seconds
  1563. * @return {?}
  1564. */
  1565. function (seconds) {
  1566. if (!seconds && seconds !== 0) {
  1567. return getSeconds(this._date, this._isUTC);
  1568. }
  1569. this._date = cloneDate(setSeconds(this._date, seconds, this._isUTC));
  1570. return this;
  1571. };
  1572. /**
  1573. * @param {?=} ms
  1574. * @return {?}
  1575. */
  1576. Khronos.prototype.millisecond = /**
  1577. * @param {?=} ms
  1578. * @return {?}
  1579. */
  1580. function (ms) {
  1581. return this.milliseconds(ms);
  1582. };
  1583. /**
  1584. * @param {?=} seconds
  1585. * @return {?}
  1586. */
  1587. Khronos.prototype.milliseconds = /**
  1588. * @param {?=} seconds
  1589. * @return {?}
  1590. */
  1591. function (seconds) {
  1592. if (!seconds && seconds !== 0) {
  1593. return getMilliseconds(this._date, this._isUTC);
  1594. }
  1595. this._date = cloneDate(setMilliseconds(this._date, seconds, this._isUTC));
  1596. return this;
  1597. };
  1598. /**
  1599. * @param {?=} date
  1600. * @return {?}
  1601. */
  1602. Khronos.prototype.date = /**
  1603. * @param {?=} date
  1604. * @return {?}
  1605. */
  1606. function (date) {
  1607. if (!date && date !== 0) {
  1608. return getDate(this._date, this._isUTC);
  1609. }
  1610. this._date = cloneDate(setDate(this._date, date, this._isUTC));
  1611. return this;
  1612. };
  1613. /**
  1614. * @param {?=} input
  1615. * @return {?}
  1616. */
  1617. Khronos.prototype.day = /**
  1618. * @param {?=} input
  1619. * @return {?}
  1620. */
  1621. function (input) {
  1622. if (!input && input !== 0) {
  1623. return getDayOfWeek(this._date, this._isUTC);
  1624. }
  1625. /** @type {?} */
  1626. var _input = input;
  1627. if (isString(input)) {
  1628. _input = parseWeekday(input, this._locale);
  1629. }
  1630. if (isNumber(_input)) {
  1631. this._date = setDayOfWeek(this._date, _input, this._locale, this._isUTC);
  1632. }
  1633. return this;
  1634. };
  1635. /**
  1636. * @param {?=} val
  1637. * @return {?}
  1638. */
  1639. Khronos.prototype.weekday = /**
  1640. * @param {?=} val
  1641. * @return {?}
  1642. */
  1643. function (val) {
  1644. if (!val && val !== 0) {
  1645. return getLocaleDayOfWeek(this._date, this._locale, this._isUTC);
  1646. }
  1647. this._date = setLocaleDayOfWeek(this._date, val, { locale: this._locale, isUTC: this._isUTC });
  1648. return this;
  1649. };
  1650. /**
  1651. * @param {?=} val
  1652. * @return {?}
  1653. */
  1654. Khronos.prototype.isoWeekday = /**
  1655. * @param {?=} val
  1656. * @return {?}
  1657. */
  1658. function (val) {
  1659. if (!val && val !== 0) {
  1660. return getISODayOfWeek(this._date);
  1661. }
  1662. this._date = setISODayOfWeek(this._date, val);
  1663. return this;
  1664. };
  1665. /**
  1666. * @param {?=} val
  1667. * @return {?}
  1668. */
  1669. Khronos.prototype.dayOfYear = /**
  1670. * @param {?=} val
  1671. * @return {?}
  1672. */
  1673. function (val) {
  1674. if (!val && val !== 0) {
  1675. return getDayOfYear(this._date);
  1676. }
  1677. this._date = setDayOfYear(this._date, val);
  1678. return this;
  1679. };
  1680. /**
  1681. * @param {?=} input
  1682. * @return {?}
  1683. */
  1684. Khronos.prototype.week = /**
  1685. * @param {?=} input
  1686. * @return {?}
  1687. */
  1688. function (input) {
  1689. if (!input && input !== 0) {
  1690. return getWeek(this._date, this._locale);
  1691. }
  1692. this._date = setWeek(this._date, input, this._locale);
  1693. return this;
  1694. };
  1695. /**
  1696. * @param {?=} input
  1697. * @return {?}
  1698. */
  1699. Khronos.prototype.weeks = /**
  1700. * @param {?=} input
  1701. * @return {?}
  1702. */
  1703. function (input) {
  1704. return this.week(input);
  1705. };
  1706. /**
  1707. * @param {?=} val
  1708. * @return {?}
  1709. */
  1710. Khronos.prototype.isoWeek = /**
  1711. * @param {?=} val
  1712. * @return {?}
  1713. */
  1714. function (val) {
  1715. if (!val && val !== 0) {
  1716. return getISOWeek(this._date);
  1717. }
  1718. this._date = setISOWeek(this._date, val);
  1719. return this;
  1720. };
  1721. /**
  1722. * @param {?=} val
  1723. * @return {?}
  1724. */
  1725. Khronos.prototype.isoWeeks = /**
  1726. * @param {?=} val
  1727. * @return {?}
  1728. */
  1729. function (val) {
  1730. return this.isoWeek(val);
  1731. };
  1732. /**
  1733. * @return {?}
  1734. */
  1735. Khronos.prototype.weeksInYear = /**
  1736. * @return {?}
  1737. */
  1738. function () {
  1739. return getWeeksInYear(this._date, this._isUTC, this._locale);
  1740. };
  1741. /**
  1742. * @return {?}
  1743. */
  1744. Khronos.prototype.isoWeeksInYear = /**
  1745. * @return {?}
  1746. */
  1747. function () {
  1748. return getISOWeeksInYear(this._date, this._isUTC);
  1749. };
  1750. /**
  1751. * @return {?}
  1752. */
  1753. Khronos.prototype.daysInMonth = /**
  1754. * @return {?}
  1755. */
  1756. function () {
  1757. return daysInMonth(getFullYear(this._date, this._isUTC), getMonth(this._date, this._isUTC));
  1758. };
  1759. /**
  1760. * @param {?=} val
  1761. * @return {?}
  1762. */
  1763. Khronos.prototype.quarter = /**
  1764. * @param {?=} val
  1765. * @return {?}
  1766. */
  1767. function (val) {
  1768. if (!val && val !== 0) {
  1769. return getQuarter(this._date, this._isUTC);
  1770. }
  1771. this._date = setQuarter(this._date, val, this._isUTC);
  1772. return this;
  1773. };
  1774. /**
  1775. * @param {?=} val
  1776. * @return {?}
  1777. */
  1778. Khronos.prototype.quarters = /**
  1779. * @param {?=} val
  1780. * @return {?}
  1781. */
  1782. function (val) {
  1783. return this.quarter(val);
  1784. };
  1785. /**
  1786. * @param {?=} period
  1787. * @return {?}
  1788. */
  1789. Khronos.prototype.startOf = /**
  1790. * @param {?=} period
  1791. * @return {?}
  1792. */
  1793. function (period) {
  1794. /** @type {?} */
  1795. var _per = mapUnitOfTime(period);
  1796. this._date = startOf(this._date, _per, this._isUTC);
  1797. return this;
  1798. };
  1799. return Khronos;
  1800. }());
  1801. export { Khronos };
  1802. if (false) {
  1803. /** @type {?} */
  1804. Khronos.prototype._date;
  1805. /** @type {?} */
  1806. Khronos.prototype._isUTC;
  1807. /** @type {?} */
  1808. Khronos.prototype._isStrict;
  1809. /** @type {?} */
  1810. Khronos.prototype._locale;
  1811. /** @type {?} */
  1812. Khronos.prototype._format;
  1813. /** @type {?} */
  1814. Khronos.prototype._offset;
  1815. /** @type {?} */
  1816. Khronos.prototype._tzm;
  1817. }
  1818. //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhaW4uanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZ3gtYm9vdHN0cmFwL2Nocm9ub3MvIiwic291cmNlcyI6WyJ0ZXN0L2NoYWluLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUNBLE9BQU8sRUFBRSxHQUFHLEVBQWEsUUFBUSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBRXBELE9BQU8sRUFDTCxPQUFPLEVBQUUsV0FBVyxFQUFFLFFBQVEsRUFBRSxlQUFlLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBRWxGLE1BQU0sdUJBQXVCLENBQUM7QUFDL0IsT0FBTyxFQUNMLE9BQU8sRUFBRSxXQUFXLEVBQUUsUUFBUSxFQUFFLGVBQWUsRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUNyRSxVQUFVLEVBQ1gsTUFBTSx1QkFBdUIsQ0FBQztBQUMvQixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDNUMsT0FBTyxFQUNMLE9BQU8sRUFDUCxTQUFTLEVBQUUsTUFBTSxFQUFFLFdBQVcsRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQ3hFLFdBQVcsRUFDWixNQUFNLHNCQUFzQixDQUFDO0FBQzlCLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDdkMsT0FBTyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUV0RSxPQUFPLEVBQ0wsYUFBYSxFQUNiLFlBQVksRUFBRSxvQkFBb0IsRUFBRSxvQkFBb0IsRUFBRSx1QkFBdUIsRUFDakYsWUFBWSxFQUNiLE1BQU0saUJBQWlCLENBQUM7QUFDekIsT0FBTyxFQUFFLFVBQVUsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM5RCxPQUFPLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxjQUFjLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUM1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SyxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFdEQsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDOzs7OztJQUtELDBCQUFROzs7O0lBQVIsVUFBUyxHQUFZO1FBQ25CLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUMzQixDQUFDOzs7OztJQUVELHlCQUFPOzs7O0lBQVAsVUFBUSxNQUF5Qjs7WUFDekIsSUFBSSxHQUFHLGFBQWEsQ0FBQyxNQUFNLENBQUM7UUFDbEMsSUFBSSxDQUFDLEtBQUssR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRXBELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVILGNBQUM7QUFBRCxDQUFDLEFBM3dCRCxJQTJ3QkM7Ozs7SUExd0JDLHdCQUF5Qjs7SUFDekIseUJBQWU7O0lBQ2YsNEJBQW1COztJQUNuQiwwQkFBZ0I7O0lBQ2hCLDBCQUEyQjs7SUFDM0IsMEJBQWdCOztJQUNoQix1QkFBYSIsInNvdXJjZXNDb250ZW50IjpbIi8vIHRzbGludDpkaXNhYmxlOm1heC1saW5lLWxlbmd0aCBtYXgtZmlsZS1saW5lLWNvdW50XG5pbXBvcnQgeyBhZGQsIHBhcnNlRGF0ZSwgc3VidHJhY3QgfSBmcm9tICcuLi9pbmRleCc7XG5pbXBvcnQgeyBEYXRlQXJyYXksIERhdGVPYmplY3QsIFVuaXRPZlRpbWUgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQge1xuICBnZXREYXRlLCBnZXRGdWxsWWVhciwgZ2V0SG91cnMsIGdldE1pbGxpc2Vjb25kcywgZ2V0TWludXRlcywgZ2V0TW9udGgsIGdldFNlY29uZHMsXG4gIGdldFVuaXhUaW1lXG59IGZyb20gJy4uL3V0aWxzL2RhdGUtZ2V0dGVycyc7XG5pbXBvcnQge1xuICBzZXREYXRlLCBzZXRGdWxsWWVhciwgc2V0SG91cnMsIHNldE1pbGxpc2Vjb25kcywgc2V0TWludXRlcywgc2V0TW9udGgsXG4gIHNldFNlY29uZHNcbn0gZnJvbSAnLi4vdXRpbHMvZGF0ZS1zZXR0ZXJzJztcbmltcG9ydCB7IGNsb25lRGF0ZSB9IGZyb20gJy4uL2NyZWF0ZS9jbG9uZSc7XG5pbXBvcnQge1xuICBpc0FycmF5LFxuICBpc0Jvb2xlYW4sIGlzRGF0ZSwgaXNEYXRlVmFsaWQsIGlzRnVuY3Rpb24sIGlzTnVtYmVyLCBpc09iamVjdCwgaXNTdHJpbmcsXG4gIGlzVW5kZWZpbmVkXG59IGZyb20gJy4uL3V0aWxzL3R5cGUtY2hlY2tzJztcbmltcG9ydCB7IGZvcm1hdERhdGUgfSBmcm9tICcuLi9mb3JtYXQnO1xuaW1wb3J0IHsgSVNPXzg2MDEsIFJGQ18yODIyIH0gZnJvbSAnLi4vY3JlYXRlL2Zyb20tc3RyaW5nLWFuZC1mb3JtYXQnO1xuaW1wb3J0IHsgTG9jYWxlLCBMb2NhbGVEYXRhIH0gZnJvbSAnLi4vbG9jYWxlL2xvY2FsZS5jbGFzcyc7XG5pbXBvcnQge1xuICBnZXREYXRlT2Zmc2V0LFxuICBnZXRVVENPZmZzZXQsIGhhc0FsaWduZWRIb3VyT2Zmc2V0LCBpc0RheWxpZ2h0U2F2aW5nVGltZSwgc2V0T2Zmc2V0VG9QYXJzZWRPZmZzZXQsXG4gIHNldFVUQ09mZnNldFxufSBmcm9tICcuLi91bml0cy9vZmZzZXQnO1xuaW1wb3J0IHsgaXNMZWFwWWVhciwgcGFyc2VUd29EaWdpdFllYXIgfSBmcm9tICcuLi91bml0cy95ZWFyJztcbmltcG9ydCB7IGlzQWZ0ZXIsIGlzQmVmb3JlLCBpc0JldHdlZW4sIGlzU2FtZSwgaXNTYW1lT3JBZnRlciwgaXNTYW1lT3JCZWZvcmUgfSBmcm9tICcuLi91dGlscy9kYXRlLWNvbXBhcmUnO1xuaW1wb3J0IHsgZGF5c0luTW9udGggfSBmcm9tICcuLi91bml0cy9tb250aCc7XG5pbXBvcnQge1xuICBnZXREYXlPZldlZWssIGdldElTT0RheU9mV2VlaywgZ2V0TG9jYWxlRGF5T2ZXZWVrLCBwYXJzZVdlZWtkYXksIHNldERheU9mV2Vlaywgc2V0SVNPRGF5T2ZXZWVrLFxuICBzZXRMb2NhbGVEYXlPZldlZWtcbn0gZnJvbSAnLi4vdW5pdHMvZGF5LW9mLXdlZWsnO1xuaW1wb3J0IHsgZ2V0SVNPV2VlaywgZ2V0V2Vlaywgc2V0SVNPV2Vlaywgc2V0V2VlayB9IGZyb20gJy4uL3VuaXRzL3dlZWsnO1xuaW1wb3J0IHtcbiAgZ2V0SVNPV2Vla3NJblllYXIsIGdldElTT1dlZWtZZWFyLCBnZXRTZXRJU09XZWVrWWVhciwgZ2V0U2V0V2Vla1llYXIsIGdldFdlZWtzSW5ZZWFyLFxuICBnZXRXZWVrWWVhclxufSBmcm9tICcuLi91bml0cy93ZWVrLXllYXInO1xuaW1wb3J0IHsgZW5kT2YsIHN0YXJ0T2YgfSBmcm9tICcuLi91dGlscy9zdGFydC1lbmQtb2YnO1xuaW1wb3J0IHsgZ2V0UXVhcnRlciwgc2V0UXVhcnRlciB9IGZyb20gJy4uL3VuaXRzL3F1YXJ0ZXInO1xuaW1wb3J0IHsgZ2V0RGF5T2ZZZWFyLCBzZXREYXlPZlllYXIgfSBmcm9tICcuLi91bml0cy9kYXktb2YteWVhcic7XG5pbXBvcnQgeyBnZXRab25lQWJiciwgZ2V0Wm9uZU5hbWUgfSBmcm9tICcuLi91bml0cy90aW1lem9uZSc7XG5pbXBvcnQgeyBkaWZmIH0gZnJvbSAnLi4vbW9tZW50L2RpZmYnO1xuaW1wb3J0IHsgRGF0ZVBhcnNpbmdDb25maWcgfSBmcm9tICcuLi9jcmVhdGUvcGFyc2luZy50eXBlcyc7XG5pbXBvcnQgeyBjYWxlbmRhciwgQ2FsZW5kYXJTcGVjIH0gZnJvbSAnLi4vbW9tZW50L2NhbGVuZGFyJztcbmltcG9ydCB7IGRlZmluZUxvY2FsZSwgZ2V0TG9jYWxlLCBnZXRTZXRHbG9iYWxMb2NhbGUsIGxpc3RMb2NhbGVzIH0gZnJvbSAnLi4vbG9jYWxlL2xvY2FsZXMnO1xuaW1wb3J0IHsgbWF4LCBtaW4gfSBmcm9tICcuLi9tb21lbnQvbWluLW1heCc7XG5pbXBvcnQgeyBEdXJhdGlvbiwgaXNEdXJhdGlvbiB9IGZyb20gJy4uL2R1cmF0aW9uL2NvbnN0cnVjdG9yJztcbmltcG9ydCB7IGNyZWF0ZUxvY2FsT3JVVEMgfSBmcm9tICcuLi9jcmVhdGUvZnJvbS1hbnl0aGluZyc7XG5pbXBvcnQgeyBjcmVhdGVEdXJhdGlvbiB9IGZyb20gJy4uL2R1cmF0aW9uL2NyZWF0ZSc7XG5cbmV4cG9ydCB0eXBlIERhdGVJbnB1dCA9IHN0cmluZyB8IG51bWJlciB8IERhdGUgfCBzdHJpbmdbXSB8IERhdGVBcnJheSB8IE1vbWVudElucHV0T2JqZWN0O1xuXG5leHBvcnQgY29uc3QgbW9tZW50OiBNb21lbnRGbiA9IChfbW9tZW50IGFzIE1vbWVudEZuKTtcblxuZXhwb3J0IGludGVyZmFjZSBNb21lbnRGbiB7XG4gIChpbnB1dD86IERhdGVJbnB1dCB8IEtocm9ub3MsIGZvcm1hdD86IHN0cmluZyB8IHN0cmluZ1tdLCBsb2NhbGVLZXk/OiBzdHJpbmcgfCBib29sZWFuLCBzdHJpY3Q/OiBib29sZWFuLCBpc1VUQz86IGJvb2xlYW4pOiBLaHJvbm9zO1xuXG4gIElTT184NjAxOiBzdHJpbmc7XG4gIFJGQ18yODIyOiBzdHJpbmc7XG5cbiAgdXRjKGlucHV0PzogRGF0ZUlucHV0IHwgS2hyb25vcywgZm9ybWF0Pzogc3RyaW5nIHwgc3RyaW5nW10sIGxvY2FsZUtleT86IHN0cmluZyB8IGJvb2xlYW4sIHN0cmljdD86IGJvb2xlYW4pOiBLaHJvbm9zO1xuXG4gIHBhcnNlWm9uZShpbnB1dD86IERhdGVJbnB1dCB8IEtocm9ub3MsIGZvcm1hdD86IHN0cmluZyB8IHN0cmluZ1tdLCBsb2NhbGVLZXk/OiBzdHJpbmcgfCBib29sZWFuLCBzdHJpY3Q/OiBib29sZWFuKTogS2hyb25vcztcblxuICB1bml4KG51bTogbnVtYmVyKTogS2hyb25vcztcblxuICBsb2NhbGUoa2V5Pzogc3RyaW5nIHwgc3RyaW5nW10sIHZhbHVlcz86IExvY2FsZURhdGEpOiBzdHJpbmc7XG5cbiAgZHVyYXRpb24oaW5wPzogRHVyYXRpb24gfCBEYXRlSW5wdXQgfCBLaHJvbm9zLCB1bml0PzogTW9tZW50VW5pdE9mVGltZSk6IER1cmF0aW9uO1xuXG4gIGRlZmluZUxvY2FsZShuYW1lOiBzdHJpbmcsIGNvbmZpZz86IExvY2FsZURhdGEpOiBMb2NhbGU7XG5cbiAgcGFyc2VUd29EaWdpdFllYXIoaW5wdXQ6IHN0cmluZyk6IG51bWJlcjtcblxuICBpc0RhdGUoaW5wdXQ/OiBhbnkpOiBpbnB1dCBpcyBEYXRlO1xuXG4gIG1vbnRocygpOiBzdHJpbmdbXTtcblxuICBtb250aHMoaW5kZXg6IG51bWJlcik6IHN0cmluZztcblxuICBtb250aHMoZm9ybWF0OiBzdHJpbmcpOiBzdHJpbmdbXTtcblxuICBtb250aHMoZm9ybWF0OiBzdHJpbmcsIGluZGV4OiBudW1iZXIpOiBzdHJpbmc7XG5cbiAgbW9udGhzU2hvcnQoKTogc3RyaW5nW107XG5cbiAgbW9udGhzU2hvcnQoaW5kZXg6IG51bWJlcik6IHN0cmluZztcblxuICBtb250aHNTaG9ydChmb3JtYXQ6IHN0cmluZyk6IHN0cmluZ1tdO1xuXG4gIG1vbnRoc1Nob3J0KGZvcm1hdDogc3RyaW5nLCBpbmRleDogbnVtYmVyKTogc3RyaW5nO1xuXG4gIHdlZWtkYXlzKCk6IHN0cmluZ1tdO1xuXG4gIHdlZWtkYXlzKGluZGV4OiBudW1iZXIpOiBzdHJpbmc7XG5cbiAgd2Vla2RheXMoZm9ybWF0OiBzdHJpbmcpOiBzdHJpbmdbXTtcblxuICB3ZWVrZGF5cyhmb3JtYXQ6IHN0cmluZywgaW5kZXg6IG51bWJlcik6IHN0cmluZztcblxuICB3ZWVrZGF5cyhsb2NhbGVTb3J0ZWQ6IGJvb2xlYW4pOiBzdHJpbmdbXTtcblxuICB3ZWVrZGF5cyhsb2NhbGVTb3J0ZWQ6IGJvb2xlYW4sIGluZGV4OiBudW1iZXIpOiBzdHJpbmc7XG5cbiAgd2Vla2RheXMobG9jYWxlU29ydGVkOiBib29sZWFuLCBmb3JtYXQ6IHN0cmluZyk6IHN0cmluZ1tdO1xuXG4gIHdlZWtkYXlzKGxvY2FsZVNvcnRlZDogYm9vbGVhbiwgZm9ybWF0OiBzdHJpbmcsIGluZGV4OiBudW1iZXIpOiBzdHJpbmc7XG5cbiAgd2Vla2RheXNTaG9ydCgpOiBzdHJpbmdbXTtcblxuICB3ZWVrZGF5c1Nob3J0KGluZGV4OiBudW1iZXIpOiBzdHJpbmc7XG5cbiAgd2Vla2RheXNTaG9ydChmb3JtYXQ6IHN0cmluZyk6IHN0cmluZ1tdO1xuXG4gIHdlZWtkYXlzU2hvcnQoZm9ybWF0OiBzdHJpbmcsIGluZGV4OiBudW1iZXIpOiBzdHJpbmc7XG5cbiAgd2Vla2RheXNTaG9ydChsb2NhbGVTb3J0ZWQ6IGJvb2xlYW4pOiBzdHJpbmdbXTtcblxuICB3ZWVrZGF5c1Nob3J0KGxvY2FsZVNvcnRlZDogYm9vbGVhbiwgaW5kZXg6IG51bWJlcik6IHN0cmluZztcblxuICB3ZWVrZGF5c1Nob3J0KGxvY2FsZVNvcnRlZDogYm9vbGVhbiwgZm9ybWF0OiBzdHJpbmcpOiBzdHJpbmdbXTtcblxuICB3ZWVrZGF5c1Nob3J0KGxvY2FsZVNvcnRlZDogYm9vbGVhbiwgZm9ybWF0OiBzdHJpbmcsIGluZGV4OiBudW1iZXIpOiBzdHJpbmc7XG5cbiAgd2Vla2RheXNNaW4oKTogc3RyaW5nW107XG5cbiAgd2Vla2RheXNNaW4oaW5kZXg6IG51bWJlcik6IHN0cmluZztcblxuICB3ZWVrZGF5c01pbihmb3JtYXQ6IHN0cmluZyk6IHN0cmluZ1tdO1xuXG4gIHdlZWtkYXlzTWluKGZvcm1hdDogc3RyaW5nLCBpbmRleDogbnVtYmVyKTogc3RyaW5nO1xuXG4gIHdlZWtkYXlzTWluKGxvY2FsZVNvcnRlZDogYm9vbGVhbik6IHN0cmluZ1tdO1xuXG4gIHdlZWtkYXlzTWluKGxvY2FsZVNvcnRlZDogYm9vbGVhbiwgaW5kZXg6IG51bWJlcik6IHN0cmluZztcblxuICB3ZWVrZGF5c01pbihsb2NhbGVTb3J0ZWQ6IGJvb2xlYW4sIGZvcm1hdDogc3RyaW5nKTogc3RyaW5nW107XG5cbiAgd2Vla2RheXNNaW4obG9jYWxlU29ydGVkOiBib29sZWFuLCBmb3JtYXQ6IHN0cmluZywgaW5kZXg6IG51bWJlcik6IHN0cmluZztcblxuICByZWxhdGl2ZVRpbWVUaHJlc2hvbGQodGhyZXNob2xkOiBzdHJpbmcpOiBudW1iZXIgfCBib29sZWFuO1xuXG4gIHJlbGF0aXZlVGltZVRocmVzaG9sZCh0aHJlc2hvbGQ6IHN0cmluZywgbGltaXQ6IG51bWJlcik6IGJvb2xlYW47XG5cbiAgbWluKC4uLmRhdGVzOiAoKERhdGVJbnB1dCB8IEtocm9ub3MpW10gfCAoRGF0ZUlucHV0IHwgS2hyb25vcykpW10pOiBLaHJvbm9zO1xuXG4gIG1heCguLi5kYXRlczogKChEYXRlSW5wdXQgfCBLaHJvbm9zKVtdIHwgKERhdGVJbnB1dCB8IEtocm9ub3MpKVtdKTogS2hyb25vcztcblxuICBsb2NhbGVEYXRhKGtleT86IHN0cmluZyB8IHN0cmluZ1tdIHwgS2hyb25vcyk6IExvY2FsZTtcblxuICB1cGRhdGVMb2NhbGUobGFuZ3VhZ2U6IHN0cmluZywgbG9jYWxlU3BlYz86IExvY2FsZURhdGEpOiBMb2NhbGU7XG5cbiAgY2FsZW5kYXJGb3JtYXQobTogRGF0ZSwgbm93OiBEYXRlKTogc3RyaW5nO1xuXG4gIC8vIHRvZG86IHJlbW92ZSB0aGlzXG4gIGNhbGVuZGFyRm9ybWF0KG06IEtocm9ub3MsIG5vdzogS2hyb25vcyk6IHN0cmluZztcblxuICAvLyB0b2RvOiBpbXBsZW1lbnRcbiAgaW52YWxpZCgpOiBLaHJvbm9zO1xuXG4gIGxvY2FsZXMoKTogc3RyaW5nW107XG5cbiAgLy8gdG9kbzogaW1wbGVtZW50XG4gIHVwZGF0ZU9mZnNldChtOiBLaHJvbm9zLCBrZWVwVGltZT86IGJvb2xlYW4pOiB2b2lkO1xufVxuXG5mdW5jdGlvbiBfbW9tZW50KGlucHV0PzogRGF0ZUlucHV0IHwgS2hyb25vcywgZm9ybWF0Pzogc3RyaW5nIHwgc3RyaW5nW10sIGxvY2FsZUtleT86IHN0cmluZyB8IGJvb2xlYW4sIHN0cmljdD86IGJvb2xlYW4sIGlzVVRDPzogYm9vbGVhbik6IEtocm9ub3Mge1xuICBpZiAoaW5wdXQgaW5zdGFuY2VvZiBLaHJvbm9zKSB7XG4gICAgY29uc3QgX2RhdGUgPSBpbnB1dC5jbG9uZSgpO1xuXG4gICAgcmV0dXJuIGlzVVRDID8gX2RhdGUudXRjKCkgOiBfZGF0ZTtcbiAgfVxuXG4gIGlmIChpc0Jvb2xlYW4obG9jYWxlS2V5KSkge1xuICAgIHJldHVybiBuZXcgS2hyb25vcyhpbnB1dCwgZm9ybWF0LCBudWxsLCBsb2NhbGVLZXksIGlzVVRDKTtcbiAgfVxuXG4gIHJldHVybiBuZXcgS2hyb25vcyhpbnB1dCwgZm9ybWF0LCBsb2NhbGVLZXksIHN0cmljdCwgaXNVVEMpO1xufVxuXG5tb21lbnQudXRjID0gKGlucHV0PzogRGF0ZUlucHV0IHwgS2hyb25vcywgZm9ybWF0Pzogc3RyaW5nLCBsb2NhbGVLZXk/OiBzdHJpbmcgfCBib29sZWFuLCBzdHJpY3Q/OiBib29sZWFuKTogS2hyb25vcyA9PiB7XG4gIHJldHVybiBfbW9tZW50KGlucHV0LCBmb3JtYXQsIGxvY2FsZUtleSwgc3RyaWN0LCB0cnVlKTtcbn07XG5cbm1vbWVudC5wYXJzZVpvbmUgPSAoaW5wdXQ/OiBEYXRlSW5wdXQgfCBLaHJvbm9zLCBmb3JtYXQ/OiBzdHJpbmcsIGxvY2FsZUtleT86IHN0cmluZyB8IGJvb2xlYW4sIHN0cmljdD86IGJvb2xlYW4pOiBLaHJvbm9zID0+IHtcbiAgcmV0dXJuIF9tb21lbnQoaW5wdXQsIGZvcm1hdCwgbG9jYWxlS2V5LCBzdHJpY3QsIHRydWUpLnBhcnNlWm9uZSgpO1xufTtcblxubW9tZW50LmxvY2FsZSA9IGdldFNldEdsb2JhbExvY2FsZTtcbm1vbWVudC5sb2NhbGVEYXRhID0gKGtleT86IHN0cmluZyB8IHN0cmluZ1tdIHwgS2hyb25vcyk6IExvY2FsZSA9PiB7XG4gIGlmIChrZXkgaW5zdGFuY2VvZiBLaHJvbm9zKSB7XG4gICAgcmV0dXJuIGtleS5sb2NhbGVEYXRhKCk7XG4gIH1cblxuICByZXR1cm4gZ2V0TG9jYWxlKGtleSk7XG59O1xuXG4vLyBtb21lbnQudXRjID0gY3JlYXRlVVRDO1xubW9tZW50LnVuaXggPSAoaW5wOiBudW1iZXIpID0+IG5ldyBLaHJvbm9zKGlucCAqIDEwMDApO1xubW9tZW50LklTT184NjAxID0gSVNPXzg2MDE7XG5tb21lbnQuUkZDXzI4MjIgPSBSRkNfMjgyMjtcbm1vbWVudC5kZWZpbmVMb2NhbGUgPSBkZWZpbmVMb2NhbGU7XG5tb21lbnQucGFyc2VUd29EaWdpdFllYXIgPSBwYXJzZVR3b0RpZ2l0WWVhcjtcbm1vbWVudC5pc0RhdGUgPSBpc0RhdGU7XG5tb21lbnQuaW52YWxpZCA9IGZ1bmN0aW9uIF9pbnZhbGlkKCk6IEtocm9ub3Mge1xuICByZXR1cm4gbmV3IEtocm9ub3MobmV3IERhdGUoTmFOKSk7XG59O1xuXG4vLyBkdXJhdGlvbihpbnA/OiBEdXJhdGlvbiB8IERhdGVJbnB1dCB8IEtocm9ub3MsIHVuaXQ/OiBNb21lbnRVbml0T2ZUaW1lKTogRHVyYXRpb247XG5tb21lbnQuZHVyYXRpb24gPSAoaW5wdXQ/OiBEdXJhdGlvbiB8IERhdGVJbnB1dCB8IEtocm9ub3MsIHVuaXQ/OiBNb21lbnRVbml0T2ZUaW1lKTogRHVyYXRpb24gPT4ge1xuICBjb25zdCBfdW5pdCA9IG1hcFVuaXRPZlRpbWUodW5pdCk7XG4gIGlmIChpc0RhdGUoaW5wdXQpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCd0b2RvIGltcGxlbWVudCcpO1xuICB9XG5cbiAgaWYgKGlucHV0ID09IG51bGwpIHtcbiAgICByZXR1cm4gY3JlYXRlRHVyYXRpb24oKTtcbiAgfVxuXG4gIGlmIChpc0R1cmF0aW9uKGlucHV0KSkge1xuICAgIHJldHVybiBjcmVhdGVEdXJhdGlvbihpbnB1dCwgX3VuaXQsIHsgX2xvY2FsZTogaW5wdXQuX2xvY2FsZSB9KTtcbiAgfVxuXG4gIGlmIChpc1N0cmluZyhpbnB1dCkgfHwgaXNOdW1iZXIoaW5wdXQpIHx8IGlzRHVyYXRpb24oaW5wdXQpIHx8IGlzT2JqZWN0PERhdGVPYmplY3Q+KGlucHV0KSkge1xuICAgIHJldHVybiBjcmVhdGVEdXJhdGlvbihpbnB1dCwgX3VuaXQpO1xuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKCd0b2RvIGltcGxlbWVudCcpO1xufTtcblxubW9tZW50Lm1pbiA9IGZ1bmN0aW9uIF9taW4oLi4uZGF0ZXM6ICgoRGF0ZUlucHV0IHwgS2hyb25vcylbXSB8IChEYXRlSW5wdXQgfCBLaHJvbm9zKSlbXSk6IEtocm9ub3Mge1xuICBjb25zdCBfZmlyc3RBcmcgPSBkYXRlc1swXTtcbiAgY29uc3QgX2RhdGVzID0gKGlzQXJyYXkoX2ZpcnN0QXJnKSA/IF9maXJzdEFyZyA6IGRhdGVzKVxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmVcbiAgICAubWFwKChkYXRlOiBLaHJvbm9zKSA9PiBfbW9tZW50KGRhdGUpKVxuICAgIC5tYXAoZGF0ZSA9PiBkYXRlLnRvRGF0ZSgpKTtcblxuICBjb25zdCBfZGF0ZSA9IG1pbiguLi5fZGF0ZXMpO1xuXG4gIHJldHVybiBuZXcgS2hyb25vcyhfZGF0ZSk7XG59O1xuXG5tb21lbnQubWF4ID0gZnVuY3Rpb24gX21heCguLi5kYXRlczogKChEYXRlSW5wdXQgfCBLaHJvbm9zKVtdIHwgKERhdGVJbnB1dCB8IEtocm9ub3MpKVtdKTogS2hyb25vcyB7XG4gIGNvbnN0IF9maXJzdEFyZyA9IGRhdGVzWzBdO1xuICBjb25zdCBfZGF0ZXMgPSAoaXNBcnJheShfZmlyc3RBcmcpID8gX2ZpcnN0QXJnIDogZGF0ZXMpXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZVxuICAgIC5tYXAoKGRhdGU6IEtocm9ub3MpID0+IF9tb21lbnQoZGF0ZSkpXG4gICAgLm1hcChkYXRlID0+IGRhdGUudG9EYXRlKCkpO1xuXG4gIGNvbnN0IF9kYXRlID0gbWF4KC4uLl9kYXRlcyk7XG5cbiAgcmV0dXJuIG5ldyBLaHJvbm9zKF9kYXRlKTtcbn07XG5cbm1vbWVudC5sb2NhbGVzID0gKCk6IHN0cmluZ1tdID0+IHtcbiAgcmV0dXJuIGxpc3RMb2NhbGVzKCk7XG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIE1vbWVudElucHV0T2JqZWN0IHtcbiAgeWVhcnM/OiBudW1iZXI7XG4gIHllYXI/OiBudW1iZXI7XG4gIHk/OiBudW1iZXI7XG5cbiAgbW9udGhzPzogbnVtYmVyO1xuICBtb250aD86IG51bWJlcjtcbiAgTT86IG51bWJlcjtcblxuICBkYXlzPzogbnVtYmVyO1xuICBkYXk/OiBudW1iZXI7XG4gIGQ/OiBudW1iZXI7XG5cbiAgZGF0ZXM/OiBudW1iZXI7XG4gIGRhdGU/OiBudW1iZXI7XG4gIEQ/OiBudW1iZXI7XG5cbiAgaG91cnM/OiBudW1iZXI7XG4gIGhvdXI/OiBudW1iZXI7XG4gIGg/OiBudW1iZXI7XG5cbiAgbWludXRlcz86IG51bWJlcjtcbiAgbWludXRlPzogbnVtYmVyO1xuICBtPzogbnVtYmVyO1xuXG4gIHNlY29uZHM/OiBudW1iZXI7XG4gIHNlY29uZD86IG51bWJlcjtcbiAgcz86IG51bWJlcjtcblxuICBtaWxsaXNlY29uZHM/OiBudW1iZXI7XG4gIG1pbGxpc2Vjb25kPzogbnVtYmVyO1xuICBtcz86IG51bWJlcjtcblxuICB3PzogbnVtYmVyO1xuICB3ZWVrPzogbnVtYmVyO1xuICB3ZWVrcz86IG51bWJlcjtcblxuICBRPzogbnVtYmVyO1xuICBxdWFydGVyPzogbnVtYmVyO1xuICBxdWFydGVycz86IG51bWJlcjtcblxuICB3ZWVrWWVhcj86IG51bWJlcjtcbn1cblxuZXhwb3J0IHR5cGUgTW9tZW50VW5pdE9mVGltZSA9IChcbiAgJ3llYXInIHwgJ3llYXJzJyB8ICd5JyB8XG4gICdtb250aCcgfCAnbW9udGhzJyB8ICdNJyB8XG4gICd3ZWVrJyB8ICd3ZWVrcycgfCAndycgfFxuICAnZGF5JyB8ICdkYXlzJyB8ICdkJyB8XG4gICdob3VyJyB8ICdob3VycycgfCAnaCcgfFxuICAnbWludXRlJyB8ICdtaW51dGVzJyB8ICdtJyB8XG4gICdzZWNvbmQnIHwgJ3NlY29uZHMnIHwgJ3MnIHxcbiAgJ21pbGxpc2Vjb25kJyB8ICdtaWxsaXNlY29uZHMnIHwgJ21zJyB8XG4gICdxJyB8ICdxdWFydGVyJyB8ICdxdWFydGVycycgfCAnUScgfFxuICAnaXNvV2VlaycgfCAnaXNvV2Vla3MnIHwgJ1cnIHxcbiAgJ2RhdGUnIHwgJ2RhdGVzJyB8ICdEJ1xuICApO1xuXG5leHBvcnQgdHlwZSBNb21lbnRBbGwgPSBNb21lbnRVbml0T2ZUaW1lIHxcbiAgJ3dlZWtZZWFyJyB8ICd3ZWVrWWVhcnMnIHwgJ2dnJyB8XG4gICdpc29XZWVrWWVhcicgfCAnaXNvV2Vla1llYXJzJyB8ICdHRycgfFxuICAnZGF5T2ZZZWFyJyB8ICdkYXlPZlllYXJzJyB8ICdEREQnIHxcbiAgJ3dlZWtkYXknIHwgJ3dlZWtkYXlzJyB8ICdlJyB8XG4gICdpc29XZWVrZGF5JyB8ICdpc29XZWVrZGF5cycgfCAnRSc7XG5cbmNvbnN0IF91bml0c1ByaW9yaXR5OiB7W2tleSBpbiBVbml0T2ZUaW1lXTogbnVtYmVyfSA9IHtcbiAgeWVhcjogMSxcbiAgbW9udGg6IDgsXG4gIHdlZWs6IDUsXG4gIGlzb1dlZWs6IDUsXG4gIGRheTogMTEsXG4gIHdlZWtkYXk6IDExLFxuICBpc29XZWVrZGF5OiAxMSxcbiAgaG91cnM6IDEzLFxuICB3ZWVrWWVhcjogMSxcbiAgaXNvV2Vla1llYXI6IDEsXG4gIHF1YXJ0ZXI6IDcsXG4gIGRhdGU6IDksXG4gIGRheU9mWWVhcjogNCxcbiAgbWludXRlczogMTQsXG4gIHNlY29uZHM6IDE1LFxuICBtaWxsaXNlY29uZHM6IDE2XG59O1xuXG4vLyB0b2RvOiBkbyBJIG5lZWQgMiBtYXBwZXJzP1xuY29uc3QgX3RpbWVIYXNoTWFwOiB7IFtrZXkgaW4gTW9tZW50QWxsXTogVW5pdE9mVGltZSB8IHN0cmluZyB9ID0ge1xuICB5OiAneWVhcicsXG4gIHllYXJzOiAneWVhcicsXG4gIHllYXI6ICd5ZWFyJyxcbiAgTTogJ21vbnRoJyxcbiAgbW9udGhzOiAnbW9udGgnLFxuICBtb250aDogJ21vbnRoJyxcbiAgdzogJ3dlZWsnLFxuICB3ZWVrczogJ3dlZWsnLFxuICB3ZWVrOiAnd2VlaycsXG5cbiAgZDogJ2RheScsXG4gIGRheXM6ICdkYXknLFxuICBkYXk6ICdkYXknLFxuXG4gIGRhdGU6ICdkYXRlJyxcbiAgZGF0ZXM6ICdkYXRlJyxcbiAgRDogJ2RhdGUnLFxuXG4gIGg6ICdob3VycycsXG4gIGhvdXI6ICdob3VycycsXG4gIGhvdXJzOiAnaG91cnMnLFxuICBtOiAnbWludXRlcycsXG4gIG1pbnV0ZTogJ21pbnV0ZXMnLFxuICBtaW51dGVzOiAnbWludXRlcycsXG4gIHM6ICdzZWNvbmRzJyxcbiAgc2Vjb25kOiAnc2Vjb25kcycsXG4gIHNlY29uZHM6ICdzZWNvbmRzJyxcbiAgbXM6ICdtaWxsaXNlY29uZHMnLFxuICBtaWxsaXNlY29uZDogJ21pbGxpc2Vjb25kcycsXG4gIG1pbGxpc2Vjb25kczogJ21pbGxpc2Vjb25kcycsXG4gIHF1YXJ0ZXI6ICdxdWFydGVyJyxcbiAgcXVhcnRlcnM6ICdxdWFydGVyJyxcbiAgcTogJ3F1YXJ0ZXInLFxuICBROiAncXVhcnRlcicsXG4gIGlzb1dlZWs6ICdpc29XZWVrJyxcbiAgaXNvV2Vla3M6ICdpc29XZWVrJyxcbiAgVzogJ2lzb1dlZWsnLFxuICB3ZWVrWWVhcjogJ3dlZWtZZWFyJyxcbiAgd2Vla1llYXJzOiAnd2Vla1llYXInLFxuICBnZzogJ3dlZWtZZWFycycsXG4gIGlzb1dlZWtZZWFyOiAnaXNvV2Vla1llYXInLFxuICBpc29XZWVrWWVhcnM6ICdpc29XZWVrWWVhcicsXG4gIEdHOiAnaXNvV2Vla1llYXInLFxuICBkYXlPZlllYXI6ICdkYXlPZlllYXInLFxuICBkYXlPZlllYXJzOiAnZGF5T2ZZZWFyJyxcbiAgREREOiAnZGF5T2ZZZWFyJyxcbiAgd2Vla2RheTogJ3dlZWtkYXknLFxuICB3ZWVrZGF5czogJ3dlZWtkYXknLFxuICBlOiAnd2Vla2RheScsXG4gIGlzb1dlZWtkYXk6ICdpc29XZWVrZGF5JyxcbiAgaXNvV2Vla2RheXM6ICdpc29XZWVrZGF5JyxcbiAgRTogJ2lzb1dlZWtkYXknXG59O1xuXG5mdW5jdGlvbiBtYXBVbml0T2ZUaW1lKHBlcmlvZDogTW9tZW50QWxsKTogVW5pdE9mVGltZSB7XG4gIHJldHVybiBfdGltZUhhc2hNYXBbcGVyaW9kXSBhcyBVbml0T2ZUaW1lO1xufVxuXG5mdW5jdGlvbiBtYXBNb21lbnRJbnB1dE9iamVjdChvYmo6IE1vbWVudElucHV0T2JqZWN0KToge1trZXkgaW4gVW5pdE9mVGltZV0/OiBudW1iZXJ9IHtcbiAgY29uc3QgX3Jlczoge1trZXkgaW4gVW5pdE9mVGltZV0/OiBudW1iZXJ9ID0ge307XG5cbiAgcmV0dXJuIE9iamVjdC5rZXlzKG9iailcbiAgICAucmVkdWNlKChyZXMsIGtleToga2V5b2YgTW9tZW50SW5wdXRPYmplY3QpID0+IHtcbiAgICAgIHJlc1ttYXBVbml0T2ZUaW1lKGtleSldID0gb2JqW2tleV07XG5cbiAgICAgIHJldHVybiByZXM7XG4gICAgfSwgX3Jlcyk7XG59XG5cbmV4cG9ydCBjbGFzcyBLaHJvbm9zIHtcbiAgX2RhdGU6IERhdGUgPSBuZXcgRGF0ZSgpO1xuICBfaXNVVEMgPSBmYWxzZTtcbiAgX2lzU3RyaWN0OiBib29sZWFuO1xuICBfbG9jYWxlOiBMb2NhbGU7XG4gIF9mb3JtYXQ6IHN0cmluZyB8IHN0cmluZ1tdO1xuICBfb2Zmc2V0OiBudW1iZXI7XG4gIF90em06IG51bWJlcjtcblxuICBjb25zdHJ1Y3RvcihpbnB1dD86IERhdGVJbnB1dCxcbiAgICAgICAgICAgICAgZm9ybWF0Pzogc3RyaW5nIHwgc3RyaW5nW10sXG4gICAgICAgICAgICAgIGxvY2FsZUtleT86IHN0cmluZyxcbiAgICAgICAgICAgICAgc3RyaWN0ID0gZmFsc2UsXG4gICAgICAgICAgICAgIGlzVVRDID0gZmFsc2UsXG4gICAgICAgICAgICAgIG9mZnNldD86IG51bWJlcikge1xuICAgIC8vIGxvY2FsZSB3aWxsIGJlIG5lZWRlZCB0byBmb3JtYXQgaW52YWxpZCBkYXRlIG1lc3NhZ2VcbiAgICB0aGlzLl9sb2NhbGUgPSBnZXRMb2NhbGUobG9jYWxlS2V5KTtcbiAgICAvLyBwYXJzZSBpbnZhbGlkIGlucHV0XG4gICAgaWYgKGlucHV0ID09PSAnJyB8fCBpbnB1dCA9PT0gbnVsbCB8fCAoaXNOdW1iZXIoaW5wdXQpICYmIGlzTmFOKGlucHV0KSkpIHtcbiAgICAgIHRoaXMuX2RhdGUgPSBuZXcgRGF0ZShOYU4pO1xuXG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICB0aGlzLl9pc1VUQyA9IGlzVVRDO1xuICAgIGlmICh0aGlzLl9pc1VUQykge1xuICAgICAgdGhpcy5fb2Zmc2V0ID0gMDtcbiAgICB9XG4gICAgaWYgKG9mZnNldCB8fCBvZmZzZXQgPT09IDApIHtcbiAgICAgIHRoaXMuX29mZnNldCA9IG9mZnNldDtcbiAgICB9XG4gICAgdGhpcy5faXNTdHJpY3QgPSBzdHJpY3Q7XG4gICAgdGhpcy5fZm9ybWF0ID0gZm9ybWF0O1xuXG4gICAgaWYgKCFpbnB1dCAmJiBpbnB1dCAhPT0gMCAmJiAhZm9ybWF0KSB7XG4gICAgICB0aGlzLl9kYXRlID0gbmV3IERhdGUoKTtcblxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgaWYgKGlzRGF0ZShpbnB1dCkpIHtcbiAgICAgIHRoaXMuX2RhdGUgPSBjbG9uZURhdGUoaW5wdXQpO1xuXG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvLyB0aGlzLl9kYXRlID0gcGFyc2VEYXRlKGlucHV0LCBmb3JtYXQsIGxvY2FsZUtleSwgc3RyaWN0LCBpc1VUQyk7XG4gICAgY29uc3QgY29uZmlnID0gY3JlYXRlTG9jYWxPclVUQyhpbnB1dCwgZm9ybWF0LCBsb2NhbGVLZXksIHN0cmljdCwgaXNVVEMpO1xuICAgIHRoaXMuX2RhdGUgPSBjb25maWcuX2Q7XG4gICAgdGhpcy5fb2Zmc2V0ID0gaXNOdW1iZXIoY29uZmlnLl9vZmZzZXQpID8gY29uZmlnLl9vZmZzZXQgOiB0aGlzLl9vZmZzZXQ7XG4gICAgdGhpcy5faXNVVEMgPSBjb25maWcuX2lzVVRDO1xuICAgIHRoaXMuX2lzU3RyaWN0ID0gY29uZmlnLl9zdHJpY3Q7XG4gICAgdGhpcy5fZm9ybWF0ID0gY29uZmlnLl9mO1xuICAgIHRoaXMuX3R6bSA9IGNvbmZpZy5fdHptO1xuICB9XG5cbiAgX3RvQ29uZmlnKCk6IERhdGVQYXJzaW5nQ29uZmlnIHtcbiAgICByZXR1cm4geyBfaXNVVEM6IHRoaXMuX2lzVVRDLCBfbG9jYWxlOiB0aGlzLl9sb2NhbGUsIF9vZmZzZXQ6IHRoaXMuX29mZnNldCwgX3R6bTogdGhpcy5fdHptIH07XG4gIH1cblxuICAvLyBMb2NhbGVcbiAgbG9jYWxlKCk6IHN0cmluZztcbiAgbG9jYWxlKGxvY2FsZUtleTogc3RyaW5nIHwgc3RyaW5nW10gfCBLaHJvbm9zKTogS2hyb25vcztcbiAgbG9jYWxlKGxvY2FsZUtleT86IHN0cmluZyB8IHN0cmluZ1tdIHwgS2hyb25vcyk6IEtocm9ub3MgfCBzdHJpbmcge1xuICAgIGlmIChpc1VuZGVmaW5lZChsb2NhbGVLZXkpKSB7XG4gICAgICByZXR1cm4gdGhpcy5fbG9jYWxlLl9hYmJyO1xuICAgIH1cblxuICAgIGlmIChsb2NhbGVLZXkgaW5zdGFuY2VvZiBLaHJvbm9zKSB7XG4gICAgICB0aGlzLl9sb2NhbGUgPSBsb2NhbGVLZXkuX2xvY2FsZTtcblxuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgY29uc3QgbmV3TG9jYWxlRGF0YSA9IGdldExvY2FsZShsb2NhbGVLZXkpO1xuICAgIGlmIChuZXdMb2NhbGVEYXRhICE9IG51bGwpIHtcbiAgICAgIHRoaXMuX2xvY2FsZSA9IG5ld0xvY2FsZURhdGE7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBsb2NhbGVEYXRhKCk6IExvY2FsZSB7XG4gICAgcmV0dXJuIHRoaXMuX2xvY2FsZTtcbiAgfVxuXG4gIC8vIEJhc2ljXG5cbiAgYWRkKHZhbDogbnVtYmVyIHwgc3RyaW5nIHwgTW9tZW50SW5wdXRPYmplY3QsIHBlcmlvZD86IFVuaXRPZlRpbWUgfCBNb21lbnRVbml0T2ZUaW1lKTogS2hyb25vcyB7XG4gICAgaWYgKGlzU3RyaW5nKHZhbCkpIHtcbiAgICAgIHRoaXMuX2RhdGUgPSBhZGQodGhpcy5fZGF0ZSwgcGFyc2VJbnQodmFsLCAxMCksIG1hcFVuaXRPZlRpbWUocGVyaW9kKSk7XG4gICAgfVxuXG4gICAgaWYgKGlzTnVtYmVyKHZhbCkpIHtcbiAgICAgIHRoaXMuX2RhdGUgPSBhZGQodGhpcy5fZGF0ZSwgdmFsLCBtYXBVbml0T2ZUaW1lKHBlcmlvZCkpO1xuICAgIH1cblxuICAgIGlmIChpc09iamVjdDxNb21lbnRJbnB1dE9iamVjdD4odmFsKSkge1xuICAgICAgY29uc3QgX21hcHBlZCA9IG1hcE1vbWVudElucHV0T2JqZWN0KHZhbCk7XG4gICAgICBPYmplY3Qua2V5cyhfbWFwcGVkKVxuICAgICAgICAuZm9yRWFjaCgoa2V5OiBVbml0T2ZUaW1lKSA9PiBhZGQodGhpcy5fZGF0ZSwgX21hcHBlZFtrZXldLCBrZXkpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIGZpeG1lOiBmb3Igc29tZSByZWFzb24gaGVyZSAnbnVsbCcgZm9yIHRpbWUgaXMgZmluZVxuICBjYWxlbmRhcih0aW1lPzogRGF0ZUlucHV0IHwgS2hyb25vcywgZm9ybWF0cz86IENhbGVuZGFyU3BlYyk6IHN0cmluZyB7XG4gICAgY29uc3QgX3RpbWUgPSB0aW1lIGluc3RhbmNlb2YgS2hyb25vcyA/IHRpbWUgOiBuZXcgS2hyb25vcyh0aW1lIHx8IG5ldyBEYXRlKCkpO1xuICAgIGNvbnN0IF9vZmZzZXQgPSAodGhpcy5fb2Zmc2V0IHx8IDApIC0gKF90aW1lLl9vZmZzZXQgfHwgMCk7XG4gICAgY29uc3QgX2NvbmZpZyA9IE9iamVjdC5hc3NpZ24odGhpcy5fdG9Db25maWcoKSwgeyBfb2Zmc2V0IH0pO1xuXG4gICAgcmV0dXJuIGNhbGVuZGFyKHRoaXMuX2RhdGUsIF90aW1lLl9kYXRlLFxuICAgICAgZm9ybWF0cywgdGhpcy5fbG9jYWxlLCBfY29uZmlnKTtcbiAgfVxuXG4gIGNsb25lKCk6IEtocm9ub3Mge1xuICAgIGNvbnN0IGxvY2FsZUtleSA9IHRoaXMuX2xvY2FsZSAmJiB0aGlzLl9sb2NhbGUuX2FiYnIgfHwgJ2VuJztcblxuICAgIC8vIHJldHVybiBuZXcgS2hyb25vcyhjbG9uZURhdGUodGhpcy5fZGF0ZSksIHRoaXMuX2Zvcm1hdCwgbG9jYWxlS2V5LCB0aGlzLl9pc1N0cmljdCwgdGhpcy5faXNVVEMpO1xuICAgIC8vIGZhaWxzIGlmIGlzVVRDIGFuZCBvZmZzZXRcbiAgICAvLyByZXR1cm4gbmV3IEtocm9ub3MobmV3IERhdGUodGhpcy52YWx1ZU9mKCkpLFxuICAgIHJldHVybiBuZXcgS2hyb25vcyh0aGlzLl9kYXRlLFxuICAgICAgdGhpcy5fZm9ybWF0LFxuICAgICAgbG9jYWxlS2V5LFxuICAgICAgdGhpcy5faXNTdHJpY3QsXG4gICAgICB0aGlzLl9pc1VUQyxcbiAgICAgIHRoaXMuX29mZnNldCk7XG4gIH1cblxuICBkaWZmKGI6IERhdGVJbnB1dCB8IEtocm9ub3MsIHVuaXRPZlRpbWU/OiBNb21lbnRVbml0T2ZUaW1lLCBwcmVjaXNlPzogYm9vbGVhbik6IG51bWJlciB7XG4gICAgY29uc3QgdW5pdCA9IG1hcFVuaXRPZlRpbWUodW5pdE9mVGltZSk7XG4gICAgY29uc3QgX2IgPSBiIGluc3RhbmNlb2YgS2hyb25vcyA/IGIgOiBuZXcgS2hyb25vcyhiKTtcbiAgICAvLyBjb25zdCB6b25lRGVsdGEgPSAoX2IudXRjT2Zmc2V0KCkgLSB0aGlzLnV0Y09mZnNldCgpKTtcbiAgICAvLyBjb25zdCBjb25maWcgPSBPYmplY3QuYXNzaWduKHRoaXMuX3RvQ29uZmlnKCksIHtcbiAgICAvLyAgIF9vZmZzZXQ6IDAsXG4gICAgLy8gICBfaXNVVEM6IHRydWUsXG4gICAgLy8gICBfem9uZURlbHRhOiB6b25lRGVsdGFcbiAgICAvLyB9KTtcbiAgICAvLyByZXR1cm4gZGlmZihuZXcgRGF0ZSh0aGlzLnZhbHVlT2YoKSksIG5ldyBEYXRlKF9iLnZhbHVlT2YoKSksIHVuaXQsIHByZWNpc2UsIGNvbmZpZyk7XG5cbiAgICByZXR1cm4gZGlmZih0aGlzLl9kYXRlLCBfYi50b0RhdGUoKSwgdW5pdCwgcHJlY2lzZSwgdGhpcy5fdG9Db25maWcoKSk7XG4gIH1cblxuICBlbmRPZihwZXJpb2Q/OiBNb21lbnRVbml0T2ZUaW1lKTogS2hyb25vcyB7XG4gICAgY29uc3QgX3BlciA9IG1hcFVuaXRPZlRpbWUocGVyaW9kKTtcbiAgICB0aGlzLl9kYXRlID0gZW5kT2YodGhpcy5fZGF0ZSwgX3BlciwgdGhpcy5faXNVVEMpO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBmb3JtYXQoZm9ybWF0Pzogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gZm9ybWF0RGF0ZSh0aGlzLl9kYXRlLCBmb3JtYXQsIHRoaXMuX2xvY2FsZSAmJiB0aGlzLl9sb2NhbGUuX2FiYnIsIHRoaXMuX2lzVVRDLCB0aGlzLl9vZmZzZXQpO1xuICB9XG5cbiAgLy8gdG9kbzogaW1wbGVtZW50XG4gIGZyb20odGltZT86IERhdGVJbnB1dCB8IEtocm9ub3MsIHdpdGhvdXRTdWZmaXg/OiBib29sZWFuKTogc3RyaW5nIHtcbiAgICBjb25zdCBfdGltZSA9IF9tb21lbnQodGltZSk7XG4gICAgaWYgKHRoaXMuaXNWYWxpZCgpICYmIF90aW1lLmlzVmFsaWQoKSkge1xuICAgICAgcmV0dXJuIGNyZWF0ZUR1cmF0aW9uKHsgdG86IHRoaXMudG9EYXRlKCksIGZyb206IF90aW1lLnRvRGF0ZSgpIH0pXG4gICAgICAgIC5sb2NhbGUodGhpcy5sb2NhbGUoKSlcbiAgICAgICAgLmh1bWFuaXplKCF3aXRob3V0U3VmZml4KTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5sb2NhbGVEYXRhKCkuaW52YWxpZERhdGU7XG4gIH1cblxuICBmcm9tTm93KHdpdGhvdXRTdWZmaXg/OiBib29sZWFuKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5mcm9tKG5ldyBEYXRlKCksIHdpdGhvdXRTdWZmaXgpO1xuICB9XG5cbiAgdG8oaW5wOiBEYXRlSW5wdXQgfCBLaHJvbm9zLCBzdWZmaXg/OiBib29sZWFuKTogc3RyaW5nIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFRPRE86IEltcGxlbWVudGApO1xuICB9XG5cbiAgdG9Ob3cod2l0aG91dFByZWZpeD86IGJvb2xlYW4pOiBzdHJpbmcge1xuICAgIHRocm93IG5ldyBFcnJvcihgVE9ETzogSW1wbGVtZW50YCk7XG4gIH1cblxuICBzdWJ0cmFjdCh2YWw6IG51bWJlciB8IHN0cmluZyB8IE1vbWVudElucHV0T2JqZWN0LCBwZXJpb2Q/OiBVbml0T2ZUaW1lIHwgTW9tZW50VW5pdE9mVGltZSk6IEtocm9ub3Mge1xuICAgIGlmIChpc1N0cmluZyh2YWwpKSB7XG4gICAgICB0aGlzLl9kYXRlID0gc3VidHJhY3QodGhpcy5fZGF0ZSwgcGFyc2VJbnQodmFsLCAxMCksIG1hcFVuaXRPZlRpbWUocGVyaW9kKSk7XG5cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIGlmIChpc051bWJlcih2YWwpKSB7XG4gICAgICB0aGlzLl9kYXRlID0gc3VidHJhY3QodGhpcy5fZGF0ZSwgdmFsLCBtYXBVbml0T2ZUaW1lKHBlcmlvZCkpO1xuICAgIH1cblxuICAgIGlmIChpc09iamVjdDxNb21lbnRJbnB1dE9iamVjdD4odmFsKSkge1xuICAgICAgY29uc3QgX21hcHBlZCA9IG1hcE1vbWVudElucHV0T2JqZWN0KHZhbCk7XG4gICAgICBPYmplY3Qua2V5cyhfbWFwcGVkKVxuICAgICAgICAuZm9yRWFjaCgoa2V5OiBVbml0T2ZUaW1lKSA9PiBzdWJ0cmFjdCh0aGlzLl9kYXRlLCBfbWFwcGVkW2tleV0sIGtleSkpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgZ2V0KHBlcmlvZDogTW9tZW50QWxsKTogbnVtYmVyIHtcbiAgICBpZiAocGVyaW9kID09PSAnZGF5T2ZZZWFyJykge1xuICAgICAgcmV0dXJuIHRoaXMuZGF5T2ZZZWFyKCk7XG4gICAgfVxuXG4gICAgY29uc3QgdW5pdCA9IG1hcFVuaXRPZlRpbWUocGVyaW9kKTtcbiAgICBzd2l0Y2ggKHVuaXQpIHtcbiAgICAgIGNhc2UgJ3llYXInOlxuICAgICAgICByZXR1cm4gdGhpcy55ZWFyKCk7XG4gICAgICBjYXNlICdtb250aCc6XG4gICAgICAgIHJldHVybiB0aGlzLm1vbnRoKCk7XG4gICAgICAvLyB8ICd3ZWVrJ1xuICAgICAgY2FzZSAnZGF0ZSc6XG4gICAgICAgIHJldHVybiB0aGlzLmRhdGUoKTtcbiAgICAgIGNhc2UgJ2RheSc6XG4gICAgICAgIHJldHVybiB0aGlzLmRheSgpO1xuICAgICAgY2FzZSAnaG91cnMnOlxuICAgICAgICByZXR1cm4gdGhpcy5ob3VycygpO1xuICAgICAgY2FzZSAnbWludXRlcyc6XG4gICAgICAgIHJldHVybiB0aGlzLm1pbnV0ZXMoKTtcbiAgICAgIGNhc2UgJ3NlY29uZHMnOlxuICAgICAgICByZXR1cm4gdGhpcy5zZWNvbmRzKCk7XG4gICAgICBjYXNlICdtaWxsaXNlY29uZHMnOlxuICAgICAgICByZXR1cm4gdGhpcy5taWxsaXNlY29uZHMoKTtcbiAgICAgIGNhc2UgJ3dlZWsnOlxuICAgICAgICByZXR1cm4gdGhpcy53ZWVrKCk7XG4gICAgICBjYXNlICdpc29XZWVrJzpcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNvV2VlaygpO1xuICAgICAgY2FzZSAnd2Vla1llYXInOlxuICAgICAgICByZXR1cm4gdGhpcy53ZWVrWWVhcigpO1xuICAgICAgY2FzZSAnaXNvV2Vla1llYXInOlxuICAgICAgICByZXR1cm4gdGhpcy5pc29XZWVrWWVhcigpO1xuICAgICAgY2FzZSAnd2Vla2RheSc6XG4gICAgICAgIHJldHVybiB0aGlzLndlZWtkYXkoKTtcbiAgICAgIGNhc2UgJ2lzb1dlZWtkYXknOlxuICAgICAgICByZXR1cm4gdGhpcy5pc29XZWVrZGF5KCk7XG4gICAgICBjYXNlICdxdWFydGVyJzpcbiAgICAgICAgcmV0dXJuIHRoaXMucXVhcnRlcigpO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIG1vbWVudC5nZXQoJyR7cGVyaW9kfScpYCk7XG4gICAgfVxuICB9XG5cbiAgc2V0KHBlcmlvZDogTW9tZW50QWxsIHwgTW9tZW50SW5wdXRPYmplY3QsIGlucHV0PzogbnVtYmVyKTogS2hyb25vcyB7XG5cbiAgICBpZiAoaXNTdHJpbmcocGVyaW9kKSkge1xuICAgICAgY29uc3QgdW5pdCA9IG1hcFVuaXRPZlRpbWUocGVyaW9kKTtcbiAgICAgIHN3aXRjaCAodW5pdCkge1xuICAgICAgICBjYXNlICd5ZWFyJzpcbiAgICAgICAgICByZXR1cm4gdGhpcy55ZWFyKGlucHV0KTtcbiAgICAgICAgY2FzZSAnbW9udGgnOlxuICAgICAgICAgIHJldHVybiB0aGlzLm1vbnRoKGlucHV0KTtcbiAgICAgICAgLy8gfCAnd2VlaydcbiAgICAgICAgY2FzZSAnZGF5JzpcbiAgICAgICAgICByZXR1cm4gdGhpcy5kYXkoaW5wdXQpO1xuICAgICAgICBjYXNlICdkYXRlJzpcbiAgICAgICAgICByZXR1cm4gdGhpcy5kYXRlKGlucHV0KTtcbiAgICAgICAgY2FzZSAnaG91cnMnOlxuICAgICAgICAgIHJldHVybiB0aGlzLmhvdXJzKGlucHV0KTtcbiAgICAgICAgY2FzZSAnbWludXRlcyc6XG4gICAgICAgICAgcmV0dXJuIHRoaXMubWludXRlcyhpbnB1dCk7XG4gICAgICAgIGNhc2UgJ3NlY29uZHMnOlxuICAgICAgICAgIHJldHVybiB0aGlzLnNlY29uZHMoaW5wdXQpO1xuICAgICAgICBjYXNlICdtaWxsaXNlY29uZHMnOlxuICAgICAgICAgIHJldHVybiB0aGlzLm1pbGxpc2Vjb25kcyhpbnB1dCk7XG4gICAgICAgIGNhc2UgJ3dlZWsnOlxuICAgICAgICAgIHJldHVybiB0aGlzLndlZWsoaW5wdXQpO1xuICAgICAgICBjYXNlICdpc29XZWVrJzpcbiAgICAgICAgICByZXR1cm4gdGhpcy5pc29XZWVrKGlucHV0KTtcbiAgICAgICAgY2FzZSAnd2Vla1llYXInOlxuICAgICAgICAgIHJldHVybiB0aGlzLndlZWtZZWFyKGlucHV0KTtcbiAgICAgICAgY2FzZSAnaXNvV2Vla1llYXInOlxuICAgICAgICAgIHJldHVybiB0aGlzLmlzb1dlZWtZZWFyKGlucHV0KTtcbiAgICAgICAgY2FzZSAnd2Vla2RheSc6XG4gICAgICAgICAgcmV0dXJuIHRoaXMud2Vla2RheShpbnB1dCk7XG4gICAgICAgIGNhc2UgJ2lzb1dlZWtkYXknOlxuICAgICAgICAgIHJldHVybiB0aGlzLmlzb1dlZWtkYXkoaW5wdXQpO1xuICAgICAgICBjYXNlICdxdWFydGVyJzpcbiAgICAgICAgICByZXR1cm4gdGhpcy5xdWFydGVyKGlucHV0KTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gbW9tZW50LmdldCgnJHtwZXJpb2R9JylgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoaXNPYmplY3Q8TW9tZW50SW5wdXRPYmplY3Q+KHBlcmlvZCkpIHtcbiAgICAgIGNvbnN0IF9tYXBwZWQgPSBtYXBNb21lbnRJbnB1dE9iamVjdChwZXJpb2QpO1xuICAgICAgT2JqZWN0LmtleXMoX21hcHBlZClcbiAgICAgICAgLnNvcnQoZnVuY3Rpb24oYTogVW5pdE9mVGltZSwgYjogVW5pdE9mVGltZSk6IG51bWJlciB7XG4gICAgICAgICAgcmV0dXJuIF91bml0c1ByaW9yaXR5W2FdIC0gX3VuaXRzUHJpb3JpdHlbYl07XG4gICAgICAgIH0pXG4gICAgICAgIC5mb3JFYWNoKChrZXk6IFVuaXRPZlRpbWUpID0+IHRoaXMuc2V0KGtleSwgX21hcHBlZFtrZXldKSk7XG4gICAgfVxuXG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZm9ybWF0KCdkZGQgTU1NIEREIFlZWVkgSEg6bW06c3MgW0dNVF1aWicpO1xuICB9XG5cbiAgdG9JU09TdHJpbmcoKTogc3RyaW5nIHtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZCgpKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAoZ2V0RnVsbFllYXIodGhpcy5fZGF0ZSwgdHJ1ZSkgPCAwIHx8IGdldEZ1bGxZZWFyKHRoaXMuX2RhdGUsIHRydWUpID4gOTk5OSkge1xuICAgICAgcmV0dXJuIHRoaXMuZm9ybWF0KCdZWVlZWVktTU0tRERbVF1ISDptbTpzcy5TU1NbWl0nKTtcbiAgICB9XG5cbiAgICBpZiAoaXNGdW5jdGlvbihEYXRlLnByb3RvdHlwZS50b0lTT1N0cmluZykpIHtcbiAgICAgIC8vIG5hdGl2ZSBpbXBsZW1lbnRhdGlvbiBpcyB+NTB4IGZhc3RlciwgdXNlIGl0IHdoZW4gd2UgY2FuXG4gICAgICByZXR1cm4gdGhpcy50b0RhdGUoKS50b0lTT1N0cmluZygpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmZvcm1hdCgnWVlZWS1NTS1ERFtUXUhIOm1tOnNzLlNTU1taXScpO1xuICB9XG5cbiAgaW5zcGVjdCgpOiBzdHJpbmcge1xuICAgIHRocm93IG5ldyBFcnJvcignVE9ETzogaW1wbGVtZW50Jyk7XG4gIH1cblxuICB0b0pTT04oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy50b0lTT1N0cmluZygpO1xuICB9XG5cbiAgdG9EYXRlKCk6IERhdGUge1xuICAgIHJldHVybiBuZXcgRGF0ZSh0aGlzLnZhbHVlT2YoKSk7XG4gIH1cblxuICB0b09iamVjdCgpOiB7W2tleSBpbiBNb21lbnRVbml0T2ZUaW1lXT86IG51bWJlcn0ge1xuICAgIHJldHVybiB7XG4gICAgICAvLyB5ZWFyczogZ2V0RnVsbFllYXIodGhpcy5fZGF0ZSwgdGhpcy5faXNVVEMpLFxuICAgICAgLy8gbW9udGhzOiBnZXRNb250aCh0aGlzLl9kYXRlLCB0aGlzLl9pc1VUQyksXG5cbiAgICAgIHllYXI6IGdldEZ1bGxZZWFyKHRoaXMuX2RhdGUsIHRoaXMuX2lzVVRDKSxcbiAgICAgIG1vbnRoOiBnZXRNb250aCh0aGlzLl9kYXRlLCB0aGlzLl9pc1VUQyksXG4gICAgICBkYXRlOiBnZXREYXRlKHRoaXMuX2RhdGUsIHRoaXMuX2lzVVRDKSxcbiAgICAgIGhvdXJzOiBnZXRIb3Vycyh0aGlzLl9kYXRlLCB0aGlzLl9pc1VUQyksXG4gICAgICBtaW51dGVzOiBnZXRNaW51dGVzKHRoaXMuX2RhdGUsIHRoaXMuX2lzVVRDKSxcbiAgICAgIHNlY29uZHM6IGdldFNlY29uZHModGhpcy5fZGF0ZSwgdGhpcy5faXNVVEMpLFxuICAgICAgbWlsbGlzZWNvbmRzOiBnZXRNaWxsaXNlY29uZHModGhpcy5fZGF0ZSwgdGhpcy5faXNVVEMpXG4gICAgfTtcbiAgfVxuXG4gIHRvQXJyYXkoKTogRGF0ZUFycmF5IHtcbiAgICByZXR1cm4gW3RoaXMueWVhcigpLCB0aGlzLm1vbnRoKCksIHRoaXMuZGF0ZSgpLCB0aGlzLmhvdXIoKSwgdGhpcy5taW51dGUoKSwgdGhpcy5zZWNvbmQoKSwgdGhpcy5taWxsaXNlY29uZCgpXTtcbiAgfVxuXG5cbiAgLy8gRGF0ZXMgYm9vbGVhbiBhbGdlYnJhXG5cbiAgaXNBZnRlcihkYXRlOiBLaHJvbm9zLCB1bml0PzogTW9tZW50VW5pdE9mVGltZSk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IF91bml0ID0gdW5pdCA/IG1hcFVuaXRPZlRpbWUodW5pdCkgOiB2b2lkIDA7XG5cbiAgICByZXR1cm4gaXNBZnRlcih0aGlzLl9kYXRlLCBkYXRlLnRvRGF0ZSgpLCBfdW5pdCk7XG4gIH1cblxuICBpc0JlZm9yZShkYXRlOiBLaHJvbm9zLCB1bml0PzogTW9tZW50VW5pdE9mVGltZSk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IF91bml0ID0gdW5pdCA/IG1hcFVuaXRPZlRpbWUodW5pdCkgOiB2b2lkIDA7XG5cbiAgICByZXR1cm4gaXNCZWZvcmUodGhpcy50b0RhdGUoKSwgZGF0ZS50b0RhdGUoKSwgX3VuaXQpO1xuICB9XG5cbiAgaXNCZXR3ZWVuKGZyb206IEtocm9ub3MsIHRvOiBLaHJvbm9zLCB1bml0PzogTW9tZW50VW5pdE9mVGltZSwgaW5jbHVzaXZpdHk/OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCBfdW5pdCA9IHVuaXQgPyBtYXBVbml0T2ZUaW1lKHVuaXQpIDogdm9pZCAwO1xuXG4gICAgcmV0dXJuIGlzQmV0d2Vlbih0aGlzLnRvRGF0ZSgpLCBmcm9tLnRvRGF0ZSgpLCB0by50b0RhdGUoKSwgX3VuaXQsIGluY2x1c2l2aXR5KTtcbiAgfVxuXG4gIGlzU2FtZShkYXRlOiBLaHJvbm9zLCB1bml0PzogTW9tZW50VW5pdE9mVGltZSk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IF91bml0ID0gdW5pdCA/IG1hcFVuaXRPZlRpbWUodW5pdCkgOiB2b2lkIDA7XG5cbiAgICByZXR1cm4gaXNTYW1lKHRoaXMuX2RhdGUsIGRhdGUudG9EYXRlKCksIF91bml0KTtcbiAgfVxuXG4gIGlzU2FtZU9yQWZ0ZXIoZGF0ZTogS2hyb25vcywgdW5pdD86IE1vbWVudFVuaXRPZlRpbWUpOiBib29sZWFuIHtcbiAgICBjb25zdCBfdW5pdCA9IHVuaXQgPyBtYXBVbml0T2ZUaW1lKHVuaXQpIDogdm9pZCAwO1xuXG4gICAgcmV0dXJuIGlzU2FtZU9yQWZ0ZXIodGhpcy5fZGF0ZSwgZGF0ZS50b0RhdGUoKSwgX3VuaXQpO1xuICB9XG5cbiAgaXNTYW1lT3JCZWZvcmUoZGF0ZTogS2hyb25vcywgdW5pdD86IE1vbWVudFVuaXRPZlRpbWUpOiBib29sZWFuIHtcbiAgICBjb25zdCBfdW5pdCA9IHVuaXQgPyBtYXBVbml0T2ZUaW1lKHVuaXQpIDogdm9pZCAwO1xuXG4gICAgcmV0dXJuIGlzU2FtZU9yQmVmb3JlKHRoaXMuX2RhdGUsIGRhdGUudG9EYXRlKCksIF91bml0KTtcbiAgfVxuXG4gIGlzVmFsaWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGlzRGF0ZVZhbGlkKHRoaXMuX2RhdGUpO1xuICB9XG5cbiAgdmFsdWVPZigpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9kYXRlLnZhbHVlT2YoKSAtICgodGhpcy5fb2Zmc2V0IHx8IDApICogNjAwMDApO1xuICB9XG5cbiAgdW5peCgpOiBudW1iZXIge1xuICAgIC8vIHJldHVybiBnZXRVbml4VGltZSh0aGlzLl9kYXRlKTtcbiAgICByZXR1cm4gTWF0aC5mbG9vcih0aGlzLnZhbHVlT2YoKSAvIDEwMDApO1xuICB9XG5cblxuICAvLyBPZmZzZXRcblxuICB1dGNPZmZzZXQoKTogbnVtYmVyO1xuICB1dGNPZmZzZXQoYjogbnVtYmVyIHwgc3RyaW5nLCBrZWVwTG9jYWxUaW1lPzogYm9vbGVhbik6IEtocm9ub3M7XG4gIHV0Y09mZnNldChiPzogbnVtYmVyIHwgc3RyaW5nLCBrZWVwTG9jYWxUaW1lPzogYm9vbGVhbik6IG51bWJlciB8IEtocm9ub3Mge1xuICAgIGNvbnN0IF9jb25maWcgPSB0aGlzLl90b0NvbmZpZygpO1xuXG4gICAgaWYgKCFiICYmIGIgIT09IDApIHtcbiAgICAgIHJldHVybiBnZXRVVENPZmZzZXQodGhpcy5fZGF0ZSwgX2NvbmZpZyk7XG4gICAgfVxuXG4gICAgdGhpcy5fZGF0ZSA9IHNldFVUQ09mZnNldCh0aGlzLl9kYXRlLCBiLCBrZWVwTG9jYWxUaW1lLCBmYWxzZSwgX2NvbmZpZyk7XG5cbiAgICB0aGlzLl9vZmZzZXQgPSBfY29uZmlnLl9vZmZzZXQ7XG4gICAgdGhpcy5faXNVVEMgPSBfY29uZmlnLl9pc1VUQztcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgdXRjKGtlZXBMb2NhbFRpbWU/OiBib29sZWFuKTogS2hyb25vcyB7XG4gICAgcmV0dXJuIHRoaXMudXRjT2Zmc2V0KDAsIGtlZXBMb2NhbFRpbWUpO1xuICB9XG5cbiAgbG9jYWwoa2VlcExvY2FsVGltZT86IGJvb2xlYW4pOiBLaHJvbm9zIHtcbiAgICBpZiAodGhpcy5faXNVVEMpIHtcbiAgICAgIHRoaXMudXRjT2Zmc2V0KDAsIGtlZXBMb2NhbFRpbWUpO1xuICAgICAgdGhpcy5faXNVVEMgPSBmYWxzZTtcblxuICAgICAgaWYgKGtlZXBMb2NhbFRpbWUpIHtcbiAgICAgICAgdGhpcy5zdWJ0cmFjdChnZXREYXRlT2Zmc2V0KHRoaXMuX2RhdGUpLCAnbScpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgcGFyc2Vab25lKGlucHV0Pzogc3RyaW5nKTogS2hyb25vcyB7XG4gICAgY29uc3QgX2NvbmZpZyA9IHRoaXMuX3RvQ29uZmlnKCk7XG4gICAgdGhpcy5fZGF0ZSA9IHNldE9mZnNldFRvUGFyc2VkT2Zmc2V0KHRoaXMuX2RhdGUsIGlucHV0LCBfY29uZmlnKTtcblxuICAgIHRoaXMuX29mZnNldCA9IF9jb25maWcuX29mZnNldDtcbiAgICB0aGlzLl9pc1VUQyA9IF9jb25maWcuX2lzVVRDO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBoYXNBbGlnbmVkSG91ck9mZnNldChpbnB1dD86IEtocm9ub3MpOiBib29sZWFuIHtcbiAgICByZXR1cm4gaGFzQWxpZ25lZEhvdXJPZmZzZXQodGhpcy5fZGF0ZSwgaW5wdXQgPyBpbnB1dC5fZGF0ZSA6IHZvaWQgMCk7XG4gIH1cblxuICBpc0RTVCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gaXNEYXlsaWdodFNhdmluZ1RpbWUodGhpcy5fZGF0ZSk7XG4gIH1cblxuICBpc0xvY2FsKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhdGhpcy5faXNVVEM7XG4gIH1cblxuICBpc1V0Y09mZnNldCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5faXNVVEM7XG4gIH1cblxuICBpc1VUQygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pc1V0YygpO1xuICB9XG5cbiAgaXNVdGMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2lzVVRDICYmIHRoaXMuX29mZnNldCA9PT0gMDtcbiAgfVxuXG4gIC8vIFRpbWV6b25lXG5cbiAgem9uZUFiYnIoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gZ2V0Wm9uZUFiYnIodGhpcy5faXNVVEMpO1xuICB9XG5cbiAgem9uZU5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gZ2V0Wm9uZU5hbWUodGhpcy5faXNVVEMpO1xuICB9XG5cbiAgLy8gWWVhclxuXG4gIHllYXIoKTogbnVtYmVyO1xuICB5ZWFyKHllYXI6IG51bWJlcik6IEtocm9ub3M7XG4gIHllYXIoeWVhcj86IG51bWJlcik6IEtocm9ub3MgfCBudW1iZXIge1xuICAgIGlmICgheWVhciAmJiB5ZWFyICE9PSAwKSB7XG4gICAgICByZXR1cm4gZ2V0RnVsbFllYXIodGhpcy5fZGF0ZSwgdGhpcy5faXNVVEMpO1xuICAgIH1cblxuICAgIHRoaXMuX2RhdGUgPSBjbG9uZURhdGUoc2V0RnVsbFllYXIodGhpcy5fZGF0ZSwgeWVhcikpO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICB3ZWVrWWVhcigpOiBudW1iZXI7XG4gIHdlZWtZZWFyKHZhbDogbnVtYmVyKTogS2hyb25vcztcbiAgd2Vla1llYXIodmFsPzogbnVtYmVyKTogS2hyb25vcyB8IG51bWJlciB7XG4gICAgaWYgKCF2YWwgJiYgdmFsICE9PSAwKSB7XG4gICAgICByZXR1cm4gZ2V0V2Vla1llYXIodGhpcy5fZGF0ZSwgdGhpcy5fbG9jYWxlLCB0aGlzLmlzVVRDKCkpO1xuICAgIH1cblxuICAgIGNvbnN0IGRhdGUgPSBnZXRTZXRXZWVrWWVhcih0aGlzLl9kYXRlLCB2YWwsIHRoaXMuX2xvY2FsZSwgdGhpcy5pc1VUQygpKTtcbiAgICBpZiAoaXNEYXRlKGRhdGUpKSB7XG4gICAgICB0aGlzLl9kYXRlID0gZGF0ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGlzb1dlZWtZZWFyKCk6IG51bWJlciA7XG4gIGlzb1dlZWtZZWFyKHZhbDogbnVtYmVyKTogS2hyb25vcyA7XG4gIGlzb1dlZWtZZWFyKHZhbD86IG51bWJlcik6IEtocm9ub3MgfCBudW1iZXIge1xuICAgIGlmICghdmFsICYmIHZhbCAhPT0gMCkge1xuICAgICAgcmV0dXJuIGdldElTT1dlZWtZZWFyKHRoaXMuX2RhdGUsIHRoaXMuaXNVVEMoKSk7XG4gICAgfVxuXG4gICAgY29uc3QgZGF0ZSA9IGdldFNldElTT1dlZWtZZWFyKHRoaXMuX2RhdGUsIHZhbCwgdGhpcy5pc1V0YygpKTtcblxuICAgIGlmIChpc0RhdGUoZGF0ZSkpIHtcbiAgICAgIHRoaXMuX2RhdGUgPSBkYXRlO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgaXNMZWFwWWVhcigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gaXNMZWFwWWVhcihnZXRGdWxsWWVhcih0aGlzLnRvRGF0ZSgpLCB0aGlzLmlzVVRDKCkpKTtcbiAgfVxuXG4gIC8vIE1vbnRoXG5cbiAgbW9udGgoKTogbnVtYmVyO1xuICBtb250aChtb250aDogbnVtYmVyIHwgc3RyaW5nKTogS2hyb25vcztcbiAgbW9udGgobW9udGg/OiBudW1iZXIgfCBzdHJpbmcpOiBLaHJvbm9zIHwgbnVtYmVyIHtcbiAgICBpZiAoIW1vbnRoICYmIG1vbnRoICE9PSAwKSB7XG4gICAgICByZXR1cm4gZ2V0TW9udGgodGhpcy5fZGF0ZSwgdGhpcy5faXNVVEMpO1xuICAgIH1cblxuICAgIGxldCBfbW9udGggPSBtb250aDtcblxuICAgIGlmIChpc1N0cmluZyhtb250aCkpIHtcbiAgICAgIGNvbnN0IGxvY2FsZSA9IHRoaXMuX2xvY2FsZSB8fCBnZXRMb2NhbGUoKTtcbiAgICAgIF9tb250aCA9IGxvY2FsZS5tb250aHNQYXJzZShtb250aCk7XG4gICAgfVxuXG4gICAgaWYgKGlzTnVtYmVyKF9tb250aCkpIHtcbiAgICAgIHRoaXMuX2RhdGUgPSBjbG9uZURhdGUoc2V0TW9udGgodGhpcy5fZGF0ZSwgX21vbnRoLCB0aGlzLl9pc1VUQykpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqIEBkZXByZWNhdGVkICovXG4gIGhvdXIoKTogbnVtYmVyO1xuICBob3VyKGhvdXJzOiBudW1iZXIpOiBLaHJvbm9zO1xuICBob3VyKGhvdXJzPzogbnVtYmVyKTogS2hyb25vcyB8IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuaG91cnMoaG91cnMpO1xuICB9XG5cbiAgaG91cnMoKTogbnVtYmVyO1xuICBob3Vycyhob3VyczogbnVtYmVyKTogS2hyb25vcztcbiAgaG91cnMoaG91cnM/OiBudW1iZXIpOiBLaHJvbm9zIHwgbnVtYmVyIHtcbiAgICBpZiAoIWhvdXJzICYmIGhvdXJzICE9PSAwKSB7XG4gICAgICByZXR1cm4gZ2V0SG91cnModGhpcy5fZGF0ZSwgdGhpcy5faXNVVEMpO1xuICAgIH1cblxuICAgIHRoaXMuX2RhdGUgPSBjbG9uZURhdGUoc2V0SG91cnModGhpcy5fZGF0ZSwgaG91cnMsIHRoaXMuX2lzVVRDKSk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKiBAZGVwcmVjYXRlZCAqL1xuICBtaW51dGUoKTogbnVtYmVyO1xuICBtaW51dGUobWludXRlczogbnVtYmVyKTogS2hyb25vcztcbiAgbWludXRlKG1pbnV0ZXM/OiBudW1iZXIpOiBLaHJvbm9zIHwgbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5taW51dGVzKG1pbnV0ZXMpO1xuICB9XG5cbiAgbWludXRlcygpOiBudW1iZXI7XG4gIG1pbnV0ZXMobWludXRlczogbnVtYmVyKTogS2hyb25vcztcbiAgbWludXRlcyhtaW51dGVzPzogbnVtYmVyKTogS2hyb25vcyB8IG51bWJlciB7XG4gICAgaWYgKCFtaW51dGVzICYmIG1pbnV0ZXMgIT09IDApIHtcbiAgICAgIHJldHVybiBnZXRNaW51dGVzKHRoaXMuX2RhdGUsIHRoaXMuX2lzVVRDKTtcbiAgICB9XG5cbiAgICB0aGlzLl9kYXRlID0gY2xvbmVEYXRlKHNldE1pbnV0ZXModGhpcy5fZGF0ZSwgbWludXRlcywgdGhpcy5faXNVVEMpKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqIEBkZXByZWNhdGVkICovXG4gIHNlY29uZCgpOiBudW1iZXI7XG4gIHNlY29uZChzZWNvbmRzOiBudW1iZXIpOiBLaHJvbm9zO1xuICBzZWNvbmQoc2Vjb25kcz86IG51bWJlcik6IEtocm9ub3MgfCBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnNlY29uZHMoc2Vjb25kcyk7XG4gIH1cblxuICBzZWNvbmRzKCk6IG51bWJlcjtcbiAgc2Vjb25kcyhzZWNvbmRzOiBudW1iZXIpOiBLaHJvbm9zO1xuICBzZWNvbmRzKHNlY29uZHM/OiBudW1iZXIpOiBLaHJvbm9zIHwgbnVtYmVyIHtcbiAgICBpZiAoIXNlY29uZHMgJiYgc2Vjb25kcyAhPT0gMCkge1xuICAgICAgcmV0dXJuIGdldFNlY29uZHModGhpcy5fZGF0ZSwgdGhpcy5faXNVVEMpO1xuICAgIH1cblxuICAgIHRoaXMuX2RhdGUgPSBjbG9uZURhdGUoc2V0U2Vjb25kcyh0aGlzLl9kYXRlLCBzZWNvbmRzLCB0aGlzLl9pc1VUQykpO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKiogQGRlcHJlY2F0ZWQgKi9cbiAgbWlsbGlzZWNvbmQoKTogbnVtYmVyO1xuICBtaWxsaXNlY29uZChtczogbnVtYmVyKTogS2hyb25vcztcbiAgbWlsbGlzZWNvbmQobXM/OiBudW1iZXIpOiBLaHJvbm9zIHwgbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5taWxsaXNlY29uZHMobXMpO1xuICB9XG5cbiAgbWlsbGlzZWNvbmRzKCk6IG51bWJlcjtcbiAgbWlsbGlzZWNvbmRzKHNlY29uZHM6IG51bWJlcik6IEtocm9ub3M7XG4gIG1pbGxpc2Vjb25kcyhzZWNvbmRzPzogbnVtYmVyKTogS2hyb25vcyB8IG51bWJlciB7XG4gICAgaWYgKCFzZWNvbmRzICYmIHNlY29uZHMgIT09IDApIHtcbiAgICAgIHJldHVybiBnZXRNaWxsaXNlY29uZHModGhpcy5fZGF0ZSwgdGhpcy5faXNVVEMpO1xuICAgIH1cblxuICAgIHRoaXMuX2RhdGUgPSBjbG9uZURhdGUoc2V0TWlsbGlzZWNvbmRzKHRoaXMuX2RhdGUsIHNlY29uZHMsIHRoaXMuX2lzVVRDKSk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8vIERheVxuXG4gIGRhdGUoKTogbnVtYmVyO1xuICBkYXRlKGRhdGU6IG51bWJlcik6IEtocm9ub3M7XG4gIGRhdGUoZGF0ZT86IG51bWJlcik6IEtocm9ub3MgfCBudW1iZXIge1xuICAgIGlmICghZGF0ZSAmJiBkYXRlICE9PSAwKSB7XG4gICAgICByZXR1cm4gZ2V0RGF0ZSh0aGlzLl9kYXRlLCB0aGlzLl9pc1VUQyk7XG4gICAgfVxuXG4gICAgdGhpcy5fZGF0ZSA9IGNsb25lRGF0ZShzZXREYXRlKHRoaXMuX2RhdGUsIGRhdGUsIHRoaXMuX2lzVVRDKSk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGRheSgpOiBudW1iZXIgO1xuICBkYXkoaW5wdXQ6IG51bWJlciB8IHN0cmluZyk6IEtocm9ub3MgO1xuICBkYXkoaW5wdXQ/OiBudW1iZXIgfCBzdHJpbmcpOiBLaHJvbm9zIHwgbnVtYmVyIHtcbiAgICBpZiAoIWlucHV0ICYmIGlucHV0ICE9PSAwKSB7XG4gICAgICByZXR1cm4gZ2V0RGF5T2ZXZWVrKHRoaXMuX2RhdGUsIHRoaXMuX2lzVVRDKTtcbiAgICB9XG5cbiAgICBsZXQgX2lucHV0ID0gaW5wdXQ7XG5cbiAgICBpZiAoaXNTdHJpbmcoaW5wdXQpKSB7XG4gICAgICBfaW5wdXQgPSBwYXJzZVdlZWtkYXkoaW5wdXQsIHRoaXMuX2xvY2FsZSk7XG4gICAgfVxuXG4gICAgaWYgKGlzTnVtYmVyKF9pbnB1dCkpIHtcbiAgICAgIHRoaXMuX2RhdGUgPSBzZXREYXlPZldlZWsodGhpcy5fZGF0ZSwgX2lucHV0LCB0aGlzLl9sb2NhbGUsIHRoaXMuX2lzVVRDKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIHdlZWtkYXkoKTogbnVtYmVyIDtcbiAgd2Vla2RheSh2YWw6IG51bWJlcik6IEtocm9ub3MgO1xuICB3ZWVrZGF5KHZhbD86IG51bWJlcik6IEtocm9ub3MgfCBudW1iZXIge1xuICAgIGlmICghdmFsICYmIHZhbCAhPT0gMCkge1xuICAgICAgcmV0dXJuIGdldExvY2FsZURheU9mV2Vlayh0aGlzLl9kYXRlLCB0aGlzLl9sb2NhbGUsIHRoaXMuX2lzVVRDKTtcbiAgICB9XG5cbiAgICB0aGlzLl9kYXRlID0gc2V0TG9jYWxlRGF5T2ZXZWVrKHRoaXMuX2RhdGUsIHZhbCwgeyBsb2NhbGU6IHRoaXMuX2xvY2FsZSwgaXNVVEM6IHRoaXMuX2lzVVRDIH0pO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBpc29XZWVrZGF5KCk6IG51bWJlciA7XG4gIGlzb1dlZWtkYXkodmFsOiBudW1iZXIgfCBzdHJpbmcpOiBLaHJvbm9zIDtcbiAgaXNvV2Vla2RheSh2YWw/OiBudW1iZXIgfCBzdHJpbmcpOiBLaHJvbm9zIHwgbnVtYmVyIHtcbiAgICBpZiAoIXZhbCAmJiB2YWwgIT09IDApIHtcbiAgICAgIHJldHVybiBnZXRJU09EYXlPZldlZWsodGhpcy5fZGF0ZSk7XG4gICAgfVxuXG4gICAgdGhpcy5fZGF0ZSA9IHNldElTT0RheU9mV2Vlayh0aGlzLl9kYXRlLCB2YWwpO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBkYXlPZlllYXIoKTogbnVtYmVyO1xuICBkYXlPZlllYXIodmFsOiBudW1iZXIpOiBLaHJvbm9zO1xuICBkYXlPZlllYXIodmFsPzogbnVtYmVyKTogS2hyb25vcyB8IG51bWJlciB7XG4gICAgaWYgKCF2YWwgJiYgdmFsICE9PSAwKSB7XG4gICAgICByZXR1cm4gZ2V0RGF5T2ZZZWFyKHRoaXMuX2RhdGUpO1xuICAgIH1cblxuICAgIHRoaXMuX2RhdGUgPSBzZXREYXlPZlllYXIodGhpcy5fZGF0ZSwgdmFsKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gV2Vla1xuXG4gIHdlZWsoKTogbnVtYmVyO1xuICB3ZWVrKGlucHV0OiBudW1iZXIpOiBLaHJvbm9zO1xuICB3ZWVrKGlucHV0PzogbnVtYmVyKTogS2hyb25vcyB8IG51bWJlciB7XG4gICAgaWYgKCFpbnB1dCAmJiBpbnB1dCAhPT0gMCkge1xuICAgICAgcmV0dXJuIGdldFdlZWsodGhpcy5fZGF0ZSwgdGhpcy5fbG9jYWxlKTtcbiAgICB9XG5cbiAgICB0aGlzLl9kYXRlID0gc2V0V2Vlayh0aGlzLl9kYXRlLCBpbnB1dCwgdGhpcy5fbG9jYWxlKTtcblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqIEBkZXByZWNhdGVkICovXG4gIHdlZWtzKCk6IG51bWJlcjtcbiAgd2Vla3MoaW5wdXQ6IG51bWJlcik6IEtocm9ub3M7XG4gIHdlZWtzKGlucHV0PzogbnVtYmVyKTogS2hyb25vcyB8IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMud2VlayhpbnB1dCk7XG4gIH1cblxuICBpc29XZWVrKCk6IG51bWJlciA7XG4gIGlzb1dlZWsodmFsOiBudW1iZXIpOiBLaHJvbm9zIDtcbiAgaXNvV2Vlayh2YWw/OiBudW1iZXIpOiBLaHJvbm9zIHwgbnVtYmVyIHtcbiAgICBpZiAoIXZhbCAmJiB2YWwgIT09IDApIHtcbiAgICAgIHJldHVybiBnZXRJU09XZWVrKHRoaXMuX2RhdGUpO1xuICAgIH1cblxuICAgIHRoaXMuX2RhdGUgPSBzZXRJU09XZWVrKHRoaXMuX2RhdGUsIHZhbCk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKiBAZGVwcmVjYXRlZCAqL1xuICBpc29XZWVrcygpOiBudW1iZXIgO1xuICBpc29XZWVrcyh2YWw6IG51bWJlcik6IEtocm9ub3MgO1xuICBpc29XZWVrcyh2YWw/OiBudW1iZXIpOiBLaHJvbm9zIHwgbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5pc29XZWVrKHZhbCk7XG4gIH1cblxuICB3ZWVrc0luWWVhcigpOiBudW1iZXIge1xuICAgIHJldHVybiBnZXRXZWVrc0luWWVhcih0aGlzLl9kYXRlLCB0aGlzLl9pc1VUQywgdGhpcy5fbG9jYWxlKTtcbiAgfVxuXG4gIGlzb1dlZWtzSW5ZZWFyKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIGdldElTT1dlZWtzSW5ZZWFyKHRoaXMuX2RhdGUsIHRoaXMuX2lzVVRDKTtcbiAgfVxuXG5cbiAgZGF5c0luTW9udGgoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gZGF5c0luTW9udGgoZ2V0RnVsbFllYXIodGhpcy5fZGF0ZSwgdGhpcy5faXNVVEMpLCBnZXRNb250aCh0aGlzLl9kYXRlLCB0aGlzLl9pc1VUQykpO1xuICB9XG5cblxuICBxdWFydGVyKCk6IG51bWJlcjtcbiAgcXVhcnRlcih2YWw6IG51bWJlcik6IEtocm9ub3M7XG4gIHF1YXJ0ZXIodmFsPzogbnVtYmVyKTogS2hyb25vcyB8IG51bWJlciB7XG4gICAgaWYgKCF2YWwgJiYgdmFsICE9PSAwKSB7XG4gICAgICByZXR1cm4gZ2V0UXVhcnRlcih0aGlzLl9kYXRlLCB0aGlzLl9pc1VUQyk7XG4gICAgfVxuXG4gICAgdGhpcy5fZGF0ZSA9IHNldFF1YXJ0ZXIodGhpcy5fZGF0ZSwgdmFsLCB0aGlzLl9pc1VUQyk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKiBAZGVwcmVjYXRlZCAqL1xuICBxdWFydGVycygpOiBudW1iZXI7XG4gIHF1YXJ0ZXJzKHZhbDogbnVtYmVyKTogS2hyb25vcztcbiAgcXVhcnRlcnModmFsPzogbnVtYmVyKTogS2hyb25vcyB8IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMucXVhcnRlcih2YWwpO1xuICB9XG5cbiAgc3RhcnRPZihwZXJpb2Q/OiBNb21lbnRVbml0T2ZUaW1lKTogS2hyb25vcyB7XG4gICAgY29uc3QgX3BlciA9IG1hcFVuaXRPZlRpbWUocGVyaW9kKTtcbiAgICB0aGlzLl9kYXRlID0gc3RhcnRPZih0aGlzLl9kYXRlLCBfcGVyLCB0aGlzLl9pc1VUQyk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG59XG4iXX0=