@tai-kun/surrealdb
Version:
The SurrealDB SDK for JavaScript
226 lines (224 loc) • 26.5 kB
JavaScript
"use strict";
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
var __export = (target, all) => {
for (var name in all)
__defProp(target, name, { get: all[name], enumerable: true });
};
var __copyProps = (to, from, except, desc) => {
if (from && typeof from === "object" || typeof from === "function") {
for (let key of __getOwnPropNames(from))
if (!__hasOwnProp.call(to, key) && key !== except)
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
}
return to;
};
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
// src/data-types/standard/datetime.ts
var datetime_exports = {};
__export(datetime_exports, {
default: () => Datetime
});
module.exports = __toCommonJS(datetime_exports);
var import_encodable_datatypes = require("../encodable/index.cjs");
var import_errors = require("../../errors/index.cjs");
var import_utils = require("../../utils/index.cjs");
var import_datetime = require("../_internals/datetime.cjs");
var import_define = require("../_internals/define.cjs");
var MILLISECONDS_PER_SECOND = 1e3;
var NANOSECONDS_PER_SECOND = 1e9;
var NANOSECONDS_PER_SECOND_BIG = 1000000000n;
var NANOSECONDS_PER_MILLISECOND_BIG = 1000000n;
var NANOSECONDS_PER_MICROSECOND_BIG = 1000n;
var MAX_DATE_MILLISECONDS = 864e13;
var MIN_DATE_MILLISECONDS = -864e13;
var toBigInt = /* @__PURE__ */ __name((v) => typeof v === "bigint" ? v : (0, import_utils.isSafeNumber)(v) ? BigInt(Math.trunc(v)) : null, "toBigInt");
var _Datetime = class _Datetime extends Date {
processNsTime(nsTime) {
if (nsTime == null) {
return super.setTime(NaN);
}
let ns = Math.abs(Number(nsTime % NANOSECONDS_PER_SECOND_BIG));
const msTime = super.setTime(
Number(nsTime / NANOSECONDS_PER_MILLISECOND_BIG)
);
if (ns > 0) {
if (msTime < 0) {
ns = NANOSECONDS_PER_SECOND - ns;
}
if (msTime >= MAX_DATE_MILLISECONDS || msTime <= MIN_DATE_MILLISECONDS) {
return super.setTime(NaN);
}
}
return msTime === msTime ? ns : NaN;
}
constructor(...args) {
super();
if (args[0] === void 0) {
const msTime = toBigInt(super.getTime());
this._nanoseconds = msTime === null ? NaN : this.processNsTime(msTime * NANOSECONDS_PER_MILLISECOND_BIG);
} else if (args.length === 1) {
const v = args[0];
let nsTime;
if (Array.isArray(v)) {
const s = toBigInt(v[0]);
const ns = toBigInt(v[1]);
if (s !== null && ns !== null) {
nsTime = s * NANOSECONDS_PER_SECOND_BIG + ns;
}
} else if (typeof v === "object" && v && "seconds" in v && "nanoseconds" in v) {
const s = toBigInt(v.seconds);
const ns = toBigInt(v.nanoseconds);
if (s !== null && ns !== null) {
nsTime = s * NANOSECONDS_PER_SECOND_BIG + ns;
}
} else if (typeof v === "string" || typeof v === "number" || v instanceof Date) {
const msTime = toBigInt(
typeof v === "string" ? Date.parse(v) : typeof v === "number" ? v : v.getTime()
);
if (msTime !== null) {
nsTime = msTime * NANOSECONDS_PER_MILLISECOND_BIG;
}
} else {
nsTime = v;
}
this._nanoseconds = this.processNsTime(nsTime);
} else if (typeof args[0] === "number" && typeof args[1] === "number" && (() => {
for (let i = 8, required = false; i >= 2; i--) {
if (typeof args[i] === "number") {
required = true;
} else if (args[i] === void 0) {
if (required) {
return false;
}
} else {
return false;
}
}
return true;
})()) {
const parts = args.filter((a) => a !== void 0);
const time = Date.UTC(...parts);
const nsTimeOfMs = toBigInt(time);
const nsTimeOfUs = toBigInt(args[7] ?? 0);
const nsTimeOfNs = toBigInt(args[8] ?? 0);
const nsTime = nsTimeOfMs === null || nsTimeOfUs === null || nsTimeOfNs === null ? null : nsTimeOfMs * NANOSECONDS_PER_MILLISECOND_BIG + nsTimeOfUs * NANOSECONDS_PER_MICROSECOND_BIG + nsTimeOfNs;
this._nanoseconds = this.processNsTime(nsTime);
} else {
throw new import_errors.SurrealValueError(
"Date, BigInt, Array or Object arguments",
String(args)
);
}
(0, import_define.defineAsDatetime)(this);
}
get seconds() {
let s = Math.trunc(super.getTime() / MILLISECONDS_PER_SECOND);
if (s <= 0 && this._nanoseconds > 0) {
s -= 1;
}
return s;
}
set seconds(s) {
this.setCompact([s, this.nanoseconds]);
}
get nanoseconds() {
return this._nanoseconds;
}
set nanoseconds(ns) {
this.setCompact([this.seconds, ns]);
}
getCompact() {
return [this.seconds, this.nanoseconds];
}
setCompact(compact) {
const s = toBigInt(compact[0]);
const ns = toBigInt(compact[1]);
const nsTime = s !== null && ns !== null ? s * NANOSECONDS_PER_SECOND_BIG + ns : null;
this._nanoseconds = this.processNsTime(nsTime);
return super.getTime();
}
getMicroseconds() {
return Math.trunc(this.nanoseconds / 1e3) % 1e3;
}
setMicroseconds(us) {
this.nanoseconds = // マイクロ秒 3 桁分を 0 にする。
this.nanoseconds - this.getMicroseconds() * 1e3 + us * 1e3;
return this.getTime();
}
getUTCMicroseconds() {
return this.getMicroseconds();
}
setUTCMicroseconds(us) {
return this.setMicroseconds(us);
}
getNanoseconds() {
return this.nanoseconds % 1e3;
}
setNanoseconds(ns) {
this.nanoseconds = // ナノ秒 3 桁分を 0 にする。
this.nanoseconds - this.getNanoseconds() + ns;
return this.getTime();
}
getUTCNanoseconds() {
return this.getNanoseconds();
}
setUTCNanoseconds(ns) {
return this.setNanoseconds(ns);
}
setTime(time) {
if (typeof time === "number") {
const msTime = super.setTime(time);
const ns = msTime % 1e3 * 1e6;
this._nanoseconds = msTime < 0 && ns > 0 ? NANOSECONDS_PER_SECOND - ns : ns;
} else {
this._nanoseconds = this.processNsTime(time);
}
return super.getTime();
}
setMilliseconds(ms) {
const time = super.setMilliseconds(ms);
return this.setCompact([
time / 1e3,
time % 1e3 * 1e6 + this.nanoseconds % 1e6
]);
}
setUTCMilliseconds(ms) {
return this.setMilliseconds(ms);
}
toISOString() {
return (0, import_datetime.toISOString)(this, this.nanoseconds);
}
toDate() {
return new Date(this.seconds * 1e3 + this.nanoseconds / 1e6);
}
toCBOR() {
return [
import_encodable_datatypes.CBOR_TAG_DATETIME,
[this.seconds, this.nanoseconds]
];
}
toJSON() {
return this.toISOString();
}
toSurql() {
const iso = this.toISOString();
return "d" + (0, import_utils.quoteStr)(iso);
}
toPlainObject() {
return {
seconds: this.seconds,
nanoseconds: this.nanoseconds
};
}
clone() {
const This = this.constructor;
return new This(this);
}
};
__name(_Datetime, "Datetime");
var Datetime = _Datetime;
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2RhdGEtdHlwZXMvc3RhbmRhcmQvZGF0ZXRpbWUudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImltcG9ydCB7XG4gIENCT1JfVEFHX0RBVEVUSU1FLFxuICB0eXBlIERhdGV0aW1lU291cmNlLFxuICB0eXBlIEVuY29kYWJsZSxcbn0gZnJvbSBcIkB0YWkta3VuL3N1cnJlYWxkYi9lbmNvZGFibGUtZGF0YXR5cGVzXCI7XG5pbXBvcnQgeyBTdXJyZWFsVmFsdWVFcnJvciB9IGZyb20gXCJAdGFpLWt1bi9zdXJyZWFsZGIvZXJyb3JzXCI7XG5pbXBvcnQgeyBpc1NhZmVOdW1iZXIsIHF1b3RlU3RyIH0gZnJvbSBcIkB0YWkta3VuL3N1cnJlYWxkYi91dGlsc1wiO1xuaW1wb3J0IHsgdG9JU09TdHJpbmcgfSBmcm9tIFwiLi4vX2ludGVybmFscy9kYXRldGltZVwiO1xuaW1wb3J0IHsgZGVmaW5lQXNEYXRldGltZSB9IGZyb20gXCIuLi9faW50ZXJuYWxzL2RlZmluZVwiO1xuXG5leHBvcnQgdHlwZSAqIGZyb20gXCIuLi9lbmNvZGFibGUvZGF0ZXRpbWVcIjtcblxuY29uc3QgTUlMTElTRUNPTkRTX1BFUl9TRUNPTkQgPSAxZTM7XG5jb25zdCBOQU5PU0VDT05EU19QRVJfU0VDT05EID0gMWU5O1xuXG5jb25zdCBOQU5PU0VDT05EU19QRVJfU0VDT05EX0JJRyA9IDFfMDAwXzAwMF8wMDBuO1xuY29uc3QgTkFOT1NFQ09ORFNfUEVSX01JTExJU0VDT05EX0JJRyA9IDFfMDAwXzAwMG47XG5jb25zdCBOQU5PU0VDT05EU19QRVJfTUlDUk9TRUNPTkRfQklHID0gMV8wMDBuO1xuXG5jb25zdCBNQVhfREFURV9NSUxMSVNFQ09ORFMgPSA4XzY0MF8wMDBfMDAwXzAwMF8wMDA7XG5jb25zdCBNSU5fREFURV9NSUxMSVNFQ09ORFMgPSAtOF82NDBfMDAwXzAwMF8wMDBfMDAwO1xuXG5jb25zdCB0b0JpZ0ludCA9ICh2OiBudW1iZXIgfCBiaWdpbnQpOiBiaWdpbnQgfCBudWxsID0+XG4gIHR5cGVvZiB2ID09PSBcImJpZ2ludFwiXG4gICAgPyB2XG4gICAgOiBpc1NhZmVOdW1iZXIodilcbiAgICA/IEJpZ0ludChNYXRoLnRydW5jKHYpKVxuICAgIDogbnVsbDtcblxuZXhwb3J0IGludGVyZmFjZSBEYXRldGltZUxpa2Uge1xuICByZWFkb25seSBzZWNvbmRzOiBudW1iZXI7XG4gIHJlYWRvbmx5IG5hbm9zZWNvbmRzOiBudW1iZXI7XG59XG5cbi8qKlxuICogW0FQSSBSZWZlcmVuY2VdKGh0dHBzOi8vdGFpLWt1bi5naXRodWIuaW8vc3VycmVhbGRiLmpzL3YyL2FwaS9kYXRhL2RhdGV0aW1lKVxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBEYXRldGltZSBleHRlbmRzIERhdGUgaW1wbGVtZW50cyBFbmNvZGFibGUge1xuICBwcm90ZWN0ZWQgX25hbm9zZWNvbmRzOiBudW1iZXI7XG5cbiAgcHJvdGVjdGVkIHByb2Nlc3NOc1RpbWUobnNUaW1lOiBiaWdpbnQgfCBudWxsIHwgdW5kZWZpbmVkKTogbnVtYmVyIHtcbiAgICBpZiAobnNUaW1lID09IG51bGwpIHtcbiAgICAgIHJldHVybiBzdXBlci5zZXRUaW1lKE5hTik7IC8vIGFuZCByZXR1cm5zIE5hTlxuICAgIH1cblxuICAgIGxldCBucyA9IE1hdGguYWJzKE51bWJlcihuc1RpbWUgJSBOQU5PU0VDT05EU19QRVJfU0VDT05EX0JJRykpO1xuICAgIGNvbnN0IG1zVGltZSA9IHN1cGVyLnNldFRpbWUoXG4gICAgICBOdW1iZXIobnNUaW1lIC8gTkFOT1NFQ09ORFNfUEVSX01JTExJU0VDT05EX0JJRyksXG4gICAgKTtcblxuICAgIGlmIChucyA+IDApIHtcbiAgICAgIGlmIChtc1RpbWUgPCAwKSB7XG4gICAgICAgIG5zID0gTkFOT1NFQ09ORFNfUEVSX1NFQ09ORCAtIG5zO1xuICAgICAgfVxuXG4gICAgICAvLyBcdTMwREZcdTMwRUFcdTc5RDJcdTY2NDJcdTUyM0JcdTMwNENcdTRFMEFcdTk2NTBcdTUwMjQvXHU0RTBCXHU5NjUwXHU1MDI0XHUzMDZBXHUzMDg5XHUzMDAxXHUzMERFXHUzMEE0XHUzMEFGXHUzMEVEXHU3OUQyXHU0RUU1XHU0RTBCXHUzMDZGIDAgXHUzMDg4XHUzMDhBXHU1OTI3XHUzMDREXHUzMDRGXHUzMDZBXHUzMDhDXHUzMDZBXHUzMDQ0XHUzMDAyXG4gICAgICBpZiAobXNUaW1lID49IE1BWF9EQVRFX01JTExJU0VDT05EUyB8fCBtc1RpbWUgPD0gTUlOX0RBVEVfTUlMTElTRUNPTkRTKSB7XG4gICAgICAgIHJldHVybiBzdXBlci5zZXRUaW1lKE5hTik7IC8vIGFuZCByZXR1cm5zIE5hTlxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBtc1RpbWUgPT09IG1zVGltZVxuICAgICAgPyBuc1xuICAgICAgOiBOYU47XG4gIH1cblxuICBjb25zdHJ1Y3RvcihcbiAgICB2YWx1ZT86XG4gICAgICB8IERhdGV0aW1lU291cmNlXG4gICAgICB8IG51bWJlclxuICAgICAgfCBiaWdpbnRcbiAgICAgIHwgRGF0ZVxuICAgICAgfCBEYXRldGltZUxpa2VcbiAgICAgIHwgdW5kZWZpbmVkLFxuICApO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHllYXI6IG51bWJlcixcbiAgICBtb250aEluZGV4OiBudW1iZXIsXG4gICAgZGF0ZT86IG51bWJlciB8IHVuZGVmaW5lZCxcbiAgICBob3Vycz86IG51bWJlciB8IHVuZGVmaW5lZCxcbiAgICBtaW51dGVzPzogbnVtYmVyIHwgdW5kZWZpbmVkLFxuICAgIHNlY29uZHM/OiBudW1iZXIgfCB1bmRlZmluZWQsXG4gICAgbWlsbGlzZWNvbmRzPzogbnVtYmVyIHwgdW5kZWZpbmVkLFxuICAgIG1pY3Jvc2Vjb25kcz86IG51bWJlciB8IHVuZGVmaW5lZCxcbiAgICBuYW5vc2Vjb25kcz86IG51bWJlciB8IHVuZGVmaW5lZCxcbiAgKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICAuLi5hcmdzOiBbXG4gICAgICAoXG4gICAgICAgIHwgRGF0ZXRpbWVTb3VyY2VcbiAgICAgICAgfCBudW1iZXJcbiAgICAgICAgfCBiaWdpbnRcbiAgICAgICAgfCBEYXRlXG4gICAgICAgIHwgRGF0ZXRpbWVMaWtlXG4gICAgICAgIHwgdW5kZWZpbmVkXG4gICAgICApPyxcbiAgICBdIHwgW1xuICAgICAgbnVtYmVyLFxuICAgICAgbnVtYmVyLFxuICAgICAgKG51bWJlciB8IHVuZGVmaW5lZCk/LFxuICAgICAgKG51bWJlciB8IHVuZGVmaW5lZCk/LFxuICAgICAgKG51bWJlciB8IHVuZGVmaW5lZCk/LFxuICAgICAgKG51bWJlciB8IHVuZGVmaW5lZCk/LFxuICAgICAgKG51bWJlciB8IHVuZGVmaW5lZCk/LFxuICAgICAgKG51bWJlciB8IHVuZGVmaW5lZCk/LFxuICAgICAgKG51bWJlciB8IHVuZGVmaW5lZCk/LFxuICAgIF1cbiAgKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIGlmIChhcmdzWzBdID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IG1zVGltZSA9IHRvQmlnSW50KHN1cGVyLmdldFRpbWUoKSk7XG4gICAgICB0aGlzLl9uYW5vc2Vjb25kcyA9IG1zVGltZSA9PT0gbnVsbFxuICAgICAgICA/IE5hTlxuICAgICAgICA6IHRoaXMucHJvY2Vzc05zVGltZShtc1RpbWUgKiBOQU5PU0VDT05EU19QRVJfTUlMTElTRUNPTkRfQklHKTtcbiAgICB9IGVsc2UgaWYgKGFyZ3MubGVuZ3RoID09PSAxKSB7XG4gICAgICBjb25zdCB2ID0gYXJnc1swXSE7XG4gICAgICBsZXQgbnNUaW1lOiBiaWdpbnQgfCB1bmRlZmluZWQ7XG5cbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHYpKSB7XG4gICAgICAgIGNvbnN0IHMgPSB0b0JpZ0ludCh2WzBdKTtcbiAgICAgICAgY29uc3QgbnMgPSB0b0JpZ0ludCh2WzFdKTtcblxuICAgICAgICBpZiAocyAhPT0gbnVsbCAmJiBucyAhPT0gbnVsbCkge1xuICAgICAgICAgIG5zVGltZSA9IHMgKiBOQU5PU0VDT05EU19QRVJfU0VDT05EX0JJRyArIG5zO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgICB0eXBlb2YgdiA9PT0gXCJvYmplY3RcIlxuICAgICAgICAmJiB2XG4gICAgICAgICYmIFwic2Vjb25kc1wiIGluIHZcbiAgICAgICAgJiYgXCJuYW5vc2Vjb25kc1wiIGluIHZcbiAgICAgICkge1xuICAgICAgICBjb25zdCBzID0gdG9CaWdJbnQodi5zZWNvbmRzKTtcbiAgICAgICAgY29uc3QgbnMgPSB0b0JpZ0ludCh2Lm5hbm9zZWNvbmRzKTtcblxuICAgICAgICBpZiAocyAhPT0gbnVsbCAmJiBucyAhPT0gbnVsbCkge1xuICAgICAgICAgIG5zVGltZSA9IHMgKiBOQU5PU0VDT05EU19QRVJfU0VDT05EX0JJRyArIG5zO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgICB0eXBlb2YgdiA9PT0gXCJzdHJpbmdcIlxuICAgICAgICB8fCB0eXBlb2YgdiA9PT0gXCJudW1iZXJcIlxuICAgICAgICB8fCB2IGluc3RhbmNlb2YgRGF0ZVxuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IG1zVGltZSA9IHRvQmlnSW50KFxuICAgICAgICAgIHR5cGVvZiB2ID09PSBcInN0cmluZ1wiXG4gICAgICAgICAgICA/IERhdGUucGFyc2UodilcbiAgICAgICAgICAgIDogdHlwZW9mIHYgPT09IFwibnVtYmVyXCJcbiAgICAgICAgICAgID8gdlxuICAgICAgICAgICAgOiB2LmdldFRpbWUoKSxcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAobXNUaW1lICE9PSBudWxsKSB7XG4gICAgICAgICAgbnNUaW1lID0gbXNUaW1lICogTkFOT1NFQ09ORFNfUEVSX01JTExJU0VDT05EX0JJRztcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbnNUaW1lID0gdjtcbiAgICAgIH1cblxuICAgICAgdGhpcy5fbmFub3NlY29uZHMgPSB0aGlzLnByb2Nlc3NOc1RpbWUobnNUaW1lKTtcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgdHlwZW9mIGFyZ3NbMF0gPT09IFwibnVtYmVyXCJcbiAgICAgICYmIHR5cGVvZiBhcmdzWzFdID09PSBcIm51bWJlclwiXG4gICAgICAmJiAoKCkgPT4ge1xuICAgICAgICBmb3IgKGxldCBpID0gOCwgcmVxdWlyZWQgPSBmYWxzZTsgaSA+PSAyOyBpLS0pIHtcbiAgICAgICAgICBpZiAodHlwZW9mIGFyZ3NbaV0gPT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgICAgIHJlcXVpcmVkID0gdHJ1ZTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGFyZ3NbaV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgaWYgKHJlcXVpcmVkKSB7XG4gICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSkoKVxuICAgICkge1xuICAgICAgY29uc3QgcGFydHMgPSBhcmdzLmZpbHRlcihhID0+IGEgIT09IHVuZGVmaW5lZCkgYXMgW2FueSwgYW55XTtcbiAgICAgIGNvbnN0IHRpbWUgPSBEYXRlLlVUQyguLi5wYXJ0cyk7XG4gICAgICBjb25zdCBuc1RpbWVPZk1zID0gdG9CaWdJbnQodGltZSk7XG4gICAgICBjb25zdCBuc1RpbWVPZlVzID0gdG9CaWdJbnQoYXJnc1s3XSA/PyAwKTtcbiAgICAgIGNvbnN0IG5zVGltZU9mTnMgPSB0b0JpZ0ludChhcmdzWzhdID8/IDApO1xuICAgICAgY29uc3QgbnNUaW1lID1cbiAgICAgICAgbnNUaW1lT2ZNcyA9PT0gbnVsbCB8fCBuc1RpbWVPZlVzID09PSBudWxsIHx8IG5zVGltZU9mTnMgPT09IG51bGxcbiAgICAgICAgICA/IG51bGxcbiAgICAgICAgICA6IChuc1RpbWVPZk1zICogTkFOT1NFQ09ORFNfUEVSX01JTExJU0VDT05EX0JJRylcbiAgICAgICAgICAgICsgKG5zVGltZU9mVXMgKiBOQU5PU0VDT05EU19QRVJfTUlDUk9TRUNPTkRfQklHKVxuICAgICAgICAgICAgKyBuc1RpbWVPZk5zO1xuXG4gICAgICB0aGlzLl9uYW5vc2Vjb25kcyA9IHRoaXMucHJvY2Vzc05zVGltZShuc1RpbWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgU3VycmVhbFZhbHVlRXJyb3IoXG4gICAgICAgIFwiRGF0ZSwgQmlnSW50LCBBcnJheSBvciBPYmplY3QgYXJndW1lbnRzXCIsXG4gICAgICAgIFN0cmluZyhhcmdzKSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgZGVmaW5lQXNEYXRldGltZSh0aGlzKTtcbiAgfVxuXG4gIGdldCBzZWNvbmRzKCk6IG51bWJlciB7XG4gICAgbGV0IHMgPSBNYXRoLnRydW5jKHN1cGVyLmdldFRpbWUoKSAvIE1JTExJU0VDT05EU19QRVJfU0VDT05EKTtcblxuICAgIGlmIChzIDw9IDAgJiYgdGhpcy5fbmFub3NlY29uZHMgPiAwKSB7XG4gICAgICBzIC09IDE7XG4gICAgfVxuXG4gICAgcmV0dXJuIHM7XG4gIH1cblxuICBzZXQgc2Vjb25kcyhzOiBudW1iZXIpIHtcbiAgICB0aGlzLnNldENvbXBhY3QoW3MsIHRoaXMubmFub3NlY29uZHNdKTtcbiAgfVxuXG4gIGdldCBuYW5vc2Vjb25kcygpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9uYW5vc2Vjb25kcztcbiAgfVxuXG4gIHNldCBuYW5vc2Vjb25kcyhuczogbnVtYmVyKSB7XG4gICAgdGhpcy5zZXRDb21wYWN0KFt0aGlzLnNlY29uZHMsIG5zXSk7XG4gIH1cblxuICBnZXRDb21wYWN0KCk6IFtzZWNvbmRzOiBudW1iZXIsIG5hbm9zZWNvbmRzOiBudW1iZXJdIHtcbiAgICByZXR1cm4gW3RoaXMuc2Vjb25kcywgdGhpcy5uYW5vc2Vjb25kc107XG4gIH1cblxuICBzZXRDb21wYWN0KGNvbXBhY3Q6IHJlYWRvbmx5IFtzZWNvbmRzOiBudW1iZXIsIG5hbm9zZWNvbmRzOiBudW1iZXJdKTogbnVtYmVyIHtcbiAgICBjb25zdCBzID0gdG9CaWdJbnQoY29tcGFjdFswXSk7XG4gICAgY29uc3QgbnMgPSB0b0JpZ0ludChjb21wYWN0WzFdKTtcbiAgICBjb25zdCBuc1RpbWUgPSBzICE9PSBudWxsICYmIG5zICE9PSBudWxsXG4gICAgICA/IHMgKiBOQU5PU0VDT05EU19QRVJfU0VDT05EX0JJRyArIG5zXG4gICAgICA6IG51bGw7XG4gICAgdGhpcy5fbmFub3NlY29uZHMgPSB0aGlzLnByb2Nlc3NOc1RpbWUobnNUaW1lKTtcblxuICAgIHJldHVybiBzdXBlci5nZXRUaW1lKCk7XG4gIH1cblxuICBnZXRNaWNyb3NlY29uZHMoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gTWF0aC50cnVuYyh0aGlzLm5hbm9zZWNvbmRzIC8gMWUzKSAlIDFlMztcbiAgfVxuXG4gIHNldE1pY3Jvc2Vjb25kcyh1czogbnVtYmVyKTogbnVtYmVyIHtcbiAgICB0aGlzLm5hbm9zZWNvbmRzID1cbiAgICAgIC8vIFx1MzBERVx1MzBBNFx1MzBBRlx1MzBFRFx1NzlEMiAzIFx1Njg0MVx1NTIwNlx1MzA5MiAwIFx1MzA2Qlx1MzA1OVx1MzA4Qlx1MzAwMlxuICAgICAgdGhpcy5uYW5vc2Vjb25kcyAtIHRoaXMuZ2V0TWljcm9zZWNvbmRzKCkgKiAxZTNcbiAgICAgIC8vIFx1NTdDQlx1MzA4MVx1NzZGNFx1MzA1OVx1MzAwMlxuICAgICAgKyB1cyAqIDFlMztcblxuICAgIHJldHVybiB0aGlzLmdldFRpbWUoKTtcbiAgfVxuXG4gIGdldFVUQ01pY3Jvc2Vjb25kcygpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmdldE1pY3Jvc2Vjb25kcygpO1xuICB9XG5cbiAgc2V0VVRDTWljcm9zZWNvbmRzKHVzOiBudW1iZXIpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnNldE1pY3Jvc2Vjb25kcyh1cyk7XG4gIH1cblxuICBnZXROYW5vc2Vjb25kcygpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLm5hbm9zZWNvbmRzICUgMWUzO1xuICB9XG5cbiAgc2V0TmFub3NlY29uZHMobnM6IG51bWJlcik6IG51bWJlciB7XG4gICAgdGhpcy5uYW5vc2Vjb25kcyA9XG4gICAgICAvLyBcdTMwQ0FcdTMwQ0VcdTc5RDIgMyBcdTY4NDFcdTUyMDZcdTMwOTIgMCBcdTMwNkJcdTMwNTlcdTMwOEJcdTMwMDJcbiAgICAgIHRoaXMubmFub3NlY29uZHMgLSB0aGlzLmdldE5hbm9zZWNvbmRzKClcbiAgICAgIC8vIFx1NTdDQlx1MzA4MVx1NzZGNFx1MzA1OVx1MzAwMlxuICAgICAgKyBucztcblxuICAgIHJldHVybiB0aGlzLmdldFRpbWUoKTtcbiAgfVxuXG4gIGdldFVUQ05hbm9zZWNvbmRzKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0TmFub3NlY29uZHMoKTtcbiAgfVxuXG4gIHNldFVUQ05hbm9zZWNvbmRzKG5zOiBudW1iZXIpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnNldE5hbm9zZWNvbmRzKG5zKTtcbiAgfVxuXG4gIG92ZXJyaWRlIHNldFRpbWUodGltZTogbnVtYmVyIHwgYmlnaW50KTogbnVtYmVyIHtcbiAgICBpZiAodHlwZW9mIHRpbWUgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgIGNvbnN0IG1zVGltZSA9IHN1cGVyLnNldFRpbWUodGltZSk7XG4gICAgICBjb25zdCBucyA9IG1zVGltZSAlIDFlMyAqIDFlNjtcbiAgICAgIHRoaXMuX25hbm9zZWNvbmRzID0gbXNUaW1lIDwgMCAmJiBucyA+IDBcbiAgICAgICAgPyBOQU5PU0VDT05EU19QRVJfU0VDT05EIC0gbnNcbiAgICAgICAgOiBucztcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fbmFub3NlY29uZHMgPSB0aGlzLnByb2Nlc3NOc1RpbWUodGltZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHN1cGVyLmdldFRpbWUoKTtcbiAgfVxuXG4gIG92ZXJyaWRlIHNldE1pbGxpc2Vjb25kcyhtczogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBjb25zdCB0aW1lID0gc3VwZXIuc2V0TWlsbGlzZWNvbmRzKG1zKTtcblxuICAgIHJldHVybiB0aGlzLnNldENvbXBhY3QoW1xuICAgICAgdGltZSAvIDFlMyxcbiAgICAgIHRpbWUgJSAxZTMgKiAxZTYgKyB0aGlzLm5hbm9zZWNvbmRzICUgMWU2LFxuICAgIF0pO1xuICB9XG5cbiAgb3ZlcnJpZGUgc2V0VVRDTWlsbGlzZWNvbmRzKG1zOiBudW1iZXIpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnNldE1pbGxpc2Vjb25kcyhtcyk7XG4gIH1cblxuICBvdmVycmlkZSB0b0lTT1N0cmluZygpOiBzdHJpbmcge1xuICAgIHJldHVybiB0b0lTT1N0cmluZyh0aGlzLCB0aGlzLm5hbm9zZWNvbmRzKTtcbiAgfVxuXG4gIHRvRGF0ZSgpOiBEYXRlIHtcbiAgICByZXR1cm4gbmV3IERhdGUodGhpcy5zZWNvbmRzICogMWUzICsgdGhpcy5uYW5vc2Vjb25kcyAvIDFlNik7XG4gIH1cblxuICB0b0NCT1IoKTogW1xuICAgIHRhZzogdHlwZW9mIENCT1JfVEFHX0RBVEVUSU1FLFxuICAgIHZhbHVlOiBbc2Vjb25kczogbnVtYmVyLCBuYW5vc2Vjb25kczogbnVtYmVyXSxcbiAgXSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIENCT1JfVEFHX0RBVEVUSU1FLFxuICAgICAgW3RoaXMuc2Vjb25kcywgdGhpcy5uYW5vc2Vjb25kc10sXG4gICAgXTtcbiAgfVxuXG4gIG92ZXJyaWRlIHRvSlNPTigpOiBzdHJpbmcge1xuICAgIC8vIHN1cGVyLnRvSlNPTigpIFx1MzA2Rlx1NzEyMVx1NTJCOVx1MzA2QVx1NjVFNVx1NEVEOFx1MzA5MiBudWxsIFx1MzA2Qlx1MzA1N1x1MzA2Nlx1MzA1N1x1MzA3RVx1MzA0Nlx1MzA0Q1x1MzAwMVx1MzA1M1x1MzA1M1x1MzA2N1x1MzA2Rlx1MzBBOFx1MzBFOVx1MzBGQ1x1MzA5Mlx1NjI5NVx1MzA1Mlx1MzA4Qlx1MzA4OFx1MzA0Nlx1MzA2Qlx1MzA1OVx1MzA4Qlx1MzAwMlxuICAgIHJldHVybiB0aGlzLnRvSVNPU3RyaW5nKCk7XG4gIH1cblxuICB0b1N1cnFsKCk6IHN0cmluZyB7XG4gICAgY29uc3QgaXNvID0gdGhpcy50b0lTT1N0cmluZygpO1xuXG4gICAgLy8gVE9ETyh0YWkta3VuKTogU3VycmVhbERCIFx1MzA2Rlx1NjJFMVx1NUYzNVx1MzA1NVx1MzA4Q1x1MzA1Rlx1NUU3NFx1MzA5Mlx1NjI3MVx1MzA0OFx1MzA2QVx1MzA0NFx1MzA1Rlx1MzA4MVx1MzAwMVx1MzA1M1x1MzA1M1x1MzA2N1x1MzBBOFx1MzBFOVx1MzBGQ1x1MzA5Mlx1NjI5NVx1MzA1Mlx1MzA4Qlx1NUZDNVx1ODk4MVx1MzA0Q1x1MzA0Mlx1MzA4Qlx1MzAwMlxuICAgIC8vIGlmIChpc29bMF0gPT09IFwiK1wiIHx8IGlzb1swXSA9PT0gXCItXCIpIHtcbiAgICAvLyAgIHRocm93IG5ldyBOdW1iZXJSYW5nZUVycm9yKCk7XG4gICAgLy8gfVxuXG4gICAgcmV0dXJuIFwiZFwiICsgcXVvdGVTdHIoaXNvKTtcbiAgfVxuXG4gIHRvUGxhaW5PYmplY3QoKToge1xuICAgIHNlY29uZHM6IG51bWJlcjtcbiAgICBuYW5vc2Vjb25kczogbnVtYmVyO1xuICB9IHtcbiAgICByZXR1cm4ge1xuICAgICAgc2Vjb25kczogdGhpcy5zZWNvbmRzLFxuICAgICAgbmFub3NlY29uZHM6IHRoaXMubmFub3NlY29uZHMsXG4gICAgfTtcbiAgfVxuXG4gIGNsb25lKCk6IHRoaXMge1xuICAgIGNvbnN0IFRoaXMgPSB0aGlzLmNvbnN0cnVjdG9yIGFzIHR5cGVvZiBEYXRldGltZTtcblxuICAgIHJldHVybiBuZXcgVGhpcyh0aGlzKSBhcyB0aGlzO1xuICB9XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsaUNB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