46883 lines
2.3 MiB
46883 lines
2.3 MiB
/*
|
|
THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
|
|
if you want to view the source, please visit the github repository of this plugin
|
|
*/
|
|
|
|
var __create = Object.create;
|
|
var __defProp = Object.defineProperty;
|
|
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
var __getProtoOf = Object.getPrototypeOf;
|
|
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
var __commonJS = (cb, mod) => function __require() {
|
|
return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
|
|
};
|
|
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 key2 of __getOwnPropNames(from))
|
|
if (!__hasOwnProp.call(to, key2) && key2 !== except)
|
|
__defProp(to, key2, { get: () => from[key2], enumerable: !(desc = __getOwnPropDesc(from, key2)) || desc.enumerable });
|
|
}
|
|
return to;
|
|
};
|
|
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
mod
|
|
));
|
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
var __toBinary = /* @__PURE__ */ (() => {
|
|
var table = new Uint8Array(128);
|
|
for (var i4 = 0; i4 < 64; i4++)
|
|
table[i4 < 26 ? i4 + 65 : i4 < 52 ? i4 + 71 : i4 < 62 ? i4 - 4 : i4 * 4 - 205] = i4;
|
|
return (base64) => {
|
|
var n2 = base64.length, bytes = new Uint8Array((n2 - (base64[n2 - 1] == "=") - (base64[n2 - 2] == "=")) * 3 / 4 | 0);
|
|
for (var i5 = 0, j4 = 0; i5 < n2; ) {
|
|
var c0 = table[base64.charCodeAt(i5++)], c1 = table[base64.charCodeAt(i5++)];
|
|
var c22 = table[base64.charCodeAt(i5++)], c32 = table[base64.charCodeAt(i5++)];
|
|
bytes[j4++] = c0 << 2 | c1 >> 4;
|
|
bytes[j4++] = c1 << 4 | c22 >> 2;
|
|
bytes[j4++] = c22 << 6 | c32;
|
|
}
|
|
return bytes;
|
|
};
|
|
})();
|
|
|
|
// node_modules/tslib/tslib.js
|
|
var require_tslib = __commonJS({
|
|
"node_modules/tslib/tslib.js"(exports, module2) {
|
|
var __extends2;
|
|
var __assign3;
|
|
var __rest3;
|
|
var __decorate2;
|
|
var __param2;
|
|
var __metadata2;
|
|
var __awaiter2;
|
|
var __generator2;
|
|
var __exportStar2;
|
|
var __values2;
|
|
var __read2;
|
|
var __spread2;
|
|
var __spreadArrays2;
|
|
var __spreadArray3;
|
|
var __await2;
|
|
var __asyncGenerator2;
|
|
var __asyncDelegator2;
|
|
var __asyncValues2;
|
|
var __makeTemplateObject2;
|
|
var __importStar2;
|
|
var __importDefault2;
|
|
var __classPrivateFieldGet2;
|
|
var __classPrivateFieldSet2;
|
|
var __classPrivateFieldIn2;
|
|
var __createBinding2;
|
|
(function(factory) {
|
|
var root = typeof global === "object" ? global : typeof self === "object" ? self : typeof this === "object" ? this : {};
|
|
if (typeof define === "function" && define.amd) {
|
|
define("tslib", ["exports"], function(exports2) {
|
|
factory(createExporter(root, createExporter(exports2)));
|
|
});
|
|
} else if (typeof module2 === "object" && typeof module2.exports === "object") {
|
|
factory(createExporter(root, createExporter(module2.exports)));
|
|
} else {
|
|
factory(createExporter(root));
|
|
}
|
|
function createExporter(exports2, previous) {
|
|
if (exports2 !== root) {
|
|
if (typeof Object.create === "function") {
|
|
Object.defineProperty(exports2, "__esModule", { value: true });
|
|
} else {
|
|
exports2.__esModule = true;
|
|
}
|
|
}
|
|
return function(id2, v3) {
|
|
return exports2[id2] = previous ? previous(id2, v3) : v3;
|
|
};
|
|
}
|
|
})(function(exporter) {
|
|
var extendStatics = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function(d5, b4) {
|
|
d5.__proto__ = b4;
|
|
} || function(d5, b4) {
|
|
for (var p3 in b4)
|
|
if (Object.prototype.hasOwnProperty.call(b4, p3))
|
|
d5[p3] = b4[p3];
|
|
};
|
|
__extends2 = function(d5, b4) {
|
|
if (typeof b4 !== "function" && b4 !== null)
|
|
throw new TypeError("Class extends value " + String(b4) + " is not a constructor or null");
|
|
extendStatics(d5, b4);
|
|
function __() {
|
|
this.constructor = d5;
|
|
}
|
|
d5.prototype = b4 === null ? Object.create(b4) : (__.prototype = b4.prototype, new __());
|
|
};
|
|
__assign3 = Object.assign || function(t4) {
|
|
for (var s5, i4 = 1, n2 = arguments.length; i4 < n2; i4++) {
|
|
s5 = arguments[i4];
|
|
for (var p3 in s5)
|
|
if (Object.prototype.hasOwnProperty.call(s5, p3))
|
|
t4[p3] = s5[p3];
|
|
}
|
|
return t4;
|
|
};
|
|
__rest3 = function(s5, e4) {
|
|
var t4 = {};
|
|
for (var p3 in s5)
|
|
if (Object.prototype.hasOwnProperty.call(s5, p3) && e4.indexOf(p3) < 0)
|
|
t4[p3] = s5[p3];
|
|
if (s5 != null && typeof Object.getOwnPropertySymbols === "function")
|
|
for (var i4 = 0, p3 = Object.getOwnPropertySymbols(s5); i4 < p3.length; i4++) {
|
|
if (e4.indexOf(p3[i4]) < 0 && Object.prototype.propertyIsEnumerable.call(s5, p3[i4]))
|
|
t4[p3[i4]] = s5[p3[i4]];
|
|
}
|
|
return t4;
|
|
};
|
|
__decorate2 = function(decorators, target, key2, desc) {
|
|
var c4 = arguments.length, r3 = c4 < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key2) : desc, d5;
|
|
if (typeof Reflect === "object" && typeof Reflect.decorate === "function")
|
|
r3 = Reflect.decorate(decorators, target, key2, desc);
|
|
else
|
|
for (var i4 = decorators.length - 1; i4 >= 0; i4--)
|
|
if (d5 = decorators[i4])
|
|
r3 = (c4 < 3 ? d5(r3) : c4 > 3 ? d5(target, key2, r3) : d5(target, key2)) || r3;
|
|
return c4 > 3 && r3 && Object.defineProperty(target, key2, r3), r3;
|
|
};
|
|
__param2 = function(paramIndex, decorator) {
|
|
return function(target, key2) {
|
|
decorator(target, key2, paramIndex);
|
|
};
|
|
};
|
|
__metadata2 = function(metadataKey, metadataValue) {
|
|
if (typeof Reflect === "object" && typeof Reflect.metadata === "function")
|
|
return Reflect.metadata(metadataKey, metadataValue);
|
|
};
|
|
__awaiter2 = function(thisArg, _arguments, P4, generator) {
|
|
function adopt(value) {
|
|
return value instanceof P4 ? value : new P4(function(resolve) {
|
|
resolve(value);
|
|
});
|
|
}
|
|
return new (P4 || (P4 = Promise))(function(resolve, reject) {
|
|
function fulfilled(value) {
|
|
try {
|
|
step(generator.next(value));
|
|
} catch (e4) {
|
|
reject(e4);
|
|
}
|
|
}
|
|
function rejected(value) {
|
|
try {
|
|
step(generator["throw"](value));
|
|
} catch (e4) {
|
|
reject(e4);
|
|
}
|
|
}
|
|
function step(result) {
|
|
result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected);
|
|
}
|
|
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
});
|
|
};
|
|
__generator2 = function(thisArg, body) {
|
|
var _5 = { label: 0, sent: function() {
|
|
if (t4[0] & 1)
|
|
throw t4[1];
|
|
return t4[1];
|
|
}, trys: [], ops: [] }, f4, y5, t4, g4;
|
|
return g4 = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g4[Symbol.iterator] = function() {
|
|
return this;
|
|
}), g4;
|
|
function verb(n2) {
|
|
return function(v3) {
|
|
return step([n2, v3]);
|
|
};
|
|
}
|
|
function step(op) {
|
|
if (f4)
|
|
throw new TypeError("Generator is already executing.");
|
|
while (g4 && (g4 = 0, op[0] && (_5 = 0)), _5)
|
|
try {
|
|
if (f4 = 1, y5 && (t4 = op[0] & 2 ? y5["return"] : op[0] ? y5["throw"] || ((t4 = y5["return"]) && t4.call(y5), 0) : y5.next) && !(t4 = t4.call(y5, op[1])).done)
|
|
return t4;
|
|
if (y5 = 0, t4)
|
|
op = [op[0] & 2, t4.value];
|
|
switch (op[0]) {
|
|
case 0:
|
|
case 1:
|
|
t4 = op;
|
|
break;
|
|
case 4:
|
|
_5.label++;
|
|
return { value: op[1], done: false };
|
|
case 5:
|
|
_5.label++;
|
|
y5 = op[1];
|
|
op = [0];
|
|
continue;
|
|
case 7:
|
|
op = _5.ops.pop();
|
|
_5.trys.pop();
|
|
continue;
|
|
default:
|
|
if (!(t4 = _5.trys, t4 = t4.length > 0 && t4[t4.length - 1]) && (op[0] === 6 || op[0] === 2)) {
|
|
_5 = 0;
|
|
continue;
|
|
}
|
|
if (op[0] === 3 && (!t4 || op[1] > t4[0] && op[1] < t4[3])) {
|
|
_5.label = op[1];
|
|
break;
|
|
}
|
|
if (op[0] === 6 && _5.label < t4[1]) {
|
|
_5.label = t4[1];
|
|
t4 = op;
|
|
break;
|
|
}
|
|
if (t4 && _5.label < t4[2]) {
|
|
_5.label = t4[2];
|
|
_5.ops.push(op);
|
|
break;
|
|
}
|
|
if (t4[2])
|
|
_5.ops.pop();
|
|
_5.trys.pop();
|
|
continue;
|
|
}
|
|
op = body.call(thisArg, _5);
|
|
} catch (e4) {
|
|
op = [6, e4];
|
|
y5 = 0;
|
|
} finally {
|
|
f4 = t4 = 0;
|
|
}
|
|
if (op[0] & 5)
|
|
throw op[1];
|
|
return { value: op[0] ? op[1] : void 0, done: true };
|
|
}
|
|
};
|
|
__exportStar2 = function(m5, o3) {
|
|
for (var p3 in m5)
|
|
if (p3 !== "default" && !Object.prototype.hasOwnProperty.call(o3, p3))
|
|
__createBinding2(o3, m5, p3);
|
|
};
|
|
__createBinding2 = Object.create ? function(o3, m5, k5, k22) {
|
|
if (k22 === void 0)
|
|
k22 = k5;
|
|
var desc = Object.getOwnPropertyDescriptor(m5, k5);
|
|
if (!desc || ("get" in desc ? !m5.__esModule : desc.writable || desc.configurable)) {
|
|
desc = { enumerable: true, get: function() {
|
|
return m5[k5];
|
|
} };
|
|
}
|
|
Object.defineProperty(o3, k22, desc);
|
|
} : function(o3, m5, k5, k22) {
|
|
if (k22 === void 0)
|
|
k22 = k5;
|
|
o3[k22] = m5[k5];
|
|
};
|
|
__values2 = function(o3) {
|
|
var s5 = typeof Symbol === "function" && Symbol.iterator, m5 = s5 && o3[s5], i4 = 0;
|
|
if (m5)
|
|
return m5.call(o3);
|
|
if (o3 && typeof o3.length === "number")
|
|
return {
|
|
next: function() {
|
|
if (o3 && i4 >= o3.length)
|
|
o3 = void 0;
|
|
return { value: o3 && o3[i4++], done: !o3 };
|
|
}
|
|
};
|
|
throw new TypeError(s5 ? "Object is not iterable." : "Symbol.iterator is not defined.");
|
|
};
|
|
__read2 = function(o3, n2) {
|
|
var m5 = typeof Symbol === "function" && o3[Symbol.iterator];
|
|
if (!m5)
|
|
return o3;
|
|
var i4 = m5.call(o3), r3, ar = [], e4;
|
|
try {
|
|
while ((n2 === void 0 || n2-- > 0) && !(r3 = i4.next()).done)
|
|
ar.push(r3.value);
|
|
} catch (error) {
|
|
e4 = { error };
|
|
} finally {
|
|
try {
|
|
if (r3 && !r3.done && (m5 = i4["return"]))
|
|
m5.call(i4);
|
|
} finally {
|
|
if (e4)
|
|
throw e4.error;
|
|
}
|
|
}
|
|
return ar;
|
|
};
|
|
__spread2 = function() {
|
|
for (var ar = [], i4 = 0; i4 < arguments.length; i4++)
|
|
ar = ar.concat(__read2(arguments[i4]));
|
|
return ar;
|
|
};
|
|
__spreadArrays2 = function() {
|
|
for (var s5 = 0, i4 = 0, il = arguments.length; i4 < il; i4++)
|
|
s5 += arguments[i4].length;
|
|
for (var r3 = Array(s5), k5 = 0, i4 = 0; i4 < il; i4++)
|
|
for (var a5 = arguments[i4], j4 = 0, jl = a5.length; j4 < jl; j4++, k5++)
|
|
r3[k5] = a5[j4];
|
|
return r3;
|
|
};
|
|
__spreadArray3 = function(to, from, pack) {
|
|
if (pack || arguments.length === 2)
|
|
for (var i4 = 0, l3 = from.length, ar; i4 < l3; i4++) {
|
|
if (ar || !(i4 in from)) {
|
|
if (!ar)
|
|
ar = Array.prototype.slice.call(from, 0, i4);
|
|
ar[i4] = from[i4];
|
|
}
|
|
}
|
|
return to.concat(ar || Array.prototype.slice.call(from));
|
|
};
|
|
__await2 = function(v3) {
|
|
return this instanceof __await2 ? (this.v = v3, this) : new __await2(v3);
|
|
};
|
|
__asyncGenerator2 = function(thisArg, _arguments, generator) {
|
|
if (!Symbol.asyncIterator)
|
|
throw new TypeError("Symbol.asyncIterator is not defined.");
|
|
var g4 = generator.apply(thisArg, _arguments || []), i4, q5 = [];
|
|
return i4 = {}, verb("next"), verb("throw"), verb("return"), i4[Symbol.asyncIterator] = function() {
|
|
return this;
|
|
}, i4;
|
|
function verb(n2) {
|
|
if (g4[n2])
|
|
i4[n2] = function(v3) {
|
|
return new Promise(function(a5, b4) {
|
|
q5.push([n2, v3, a5, b4]) > 1 || resume(n2, v3);
|
|
});
|
|
};
|
|
}
|
|
function resume(n2, v3) {
|
|
try {
|
|
step(g4[n2](v3));
|
|
} catch (e4) {
|
|
settle(q5[0][3], e4);
|
|
}
|
|
}
|
|
function step(r3) {
|
|
r3.value instanceof __await2 ? Promise.resolve(r3.value.v).then(fulfill, reject) : settle(q5[0][2], r3);
|
|
}
|
|
function fulfill(value) {
|
|
resume("next", value);
|
|
}
|
|
function reject(value) {
|
|
resume("throw", value);
|
|
}
|
|
function settle(f4, v3) {
|
|
if (f4(v3), q5.shift(), q5.length)
|
|
resume(q5[0][0], q5[0][1]);
|
|
}
|
|
};
|
|
__asyncDelegator2 = function(o3) {
|
|
var i4, p3;
|
|
return i4 = {}, verb("next"), verb("throw", function(e4) {
|
|
throw e4;
|
|
}), verb("return"), i4[Symbol.iterator] = function() {
|
|
return this;
|
|
}, i4;
|
|
function verb(n2, f4) {
|
|
i4[n2] = o3[n2] ? function(v3) {
|
|
return (p3 = !p3) ? { value: __await2(o3[n2](v3)), done: n2 === "return" } : f4 ? f4(v3) : v3;
|
|
} : f4;
|
|
}
|
|
};
|
|
__asyncValues2 = function(o3) {
|
|
if (!Symbol.asyncIterator)
|
|
throw new TypeError("Symbol.asyncIterator is not defined.");
|
|
var m5 = o3[Symbol.asyncIterator], i4;
|
|
return m5 ? m5.call(o3) : (o3 = typeof __values2 === "function" ? __values2(o3) : o3[Symbol.iterator](), i4 = {}, verb("next"), verb("throw"), verb("return"), i4[Symbol.asyncIterator] = function() {
|
|
return this;
|
|
}, i4);
|
|
function verb(n2) {
|
|
i4[n2] = o3[n2] && function(v3) {
|
|
return new Promise(function(resolve, reject) {
|
|
v3 = o3[n2](v3), settle(resolve, reject, v3.done, v3.value);
|
|
});
|
|
};
|
|
}
|
|
function settle(resolve, reject, d5, v3) {
|
|
Promise.resolve(v3).then(function(v4) {
|
|
resolve({ value: v4, done: d5 });
|
|
}, reject);
|
|
}
|
|
};
|
|
__makeTemplateObject2 = function(cooked, raw) {
|
|
if (Object.defineProperty) {
|
|
Object.defineProperty(cooked, "raw", { value: raw });
|
|
} else {
|
|
cooked.raw = raw;
|
|
}
|
|
return cooked;
|
|
};
|
|
var __setModuleDefault = Object.create ? function(o3, v3) {
|
|
Object.defineProperty(o3, "default", { enumerable: true, value: v3 });
|
|
} : function(o3, v3) {
|
|
o3["default"] = v3;
|
|
};
|
|
__importStar2 = function(mod) {
|
|
if (mod && mod.__esModule)
|
|
return mod;
|
|
var result = {};
|
|
if (mod != null) {
|
|
for (var k5 in mod)
|
|
if (k5 !== "default" && Object.prototype.hasOwnProperty.call(mod, k5))
|
|
__createBinding2(result, mod, k5);
|
|
}
|
|
__setModuleDefault(result, mod);
|
|
return result;
|
|
};
|
|
__importDefault2 = function(mod) {
|
|
return mod && mod.__esModule ? mod : { "default": mod };
|
|
};
|
|
__classPrivateFieldGet2 = function(receiver, state, kind, f4) {
|
|
if (kind === "a" && !f4)
|
|
throw new TypeError("Private accessor was defined without a getter");
|
|
if (typeof state === "function" ? receiver !== state || !f4 : !state.has(receiver))
|
|
throw new TypeError("Cannot read private member from an object whose class did not declare it");
|
|
return kind === "m" ? f4 : kind === "a" ? f4.call(receiver) : f4 ? f4.value : state.get(receiver);
|
|
};
|
|
__classPrivateFieldSet2 = function(receiver, state, value, kind, f4) {
|
|
if (kind === "m")
|
|
throw new TypeError("Private method is not writable");
|
|
if (kind === "a" && !f4)
|
|
throw new TypeError("Private accessor was defined without a setter");
|
|
if (typeof state === "function" ? receiver !== state || !f4 : !state.has(receiver))
|
|
throw new TypeError("Cannot write private member to an object whose class did not declare it");
|
|
return kind === "a" ? f4.call(receiver, value) : f4 ? f4.value = value : state.set(receiver, value), value;
|
|
};
|
|
__classPrivateFieldIn2 = function(state, receiver) {
|
|
if (receiver === null || typeof receiver !== "object" && typeof receiver !== "function")
|
|
throw new TypeError("Cannot use 'in' operator on non-object");
|
|
return typeof state === "function" ? receiver === state : state.has(receiver);
|
|
};
|
|
exporter("__extends", __extends2);
|
|
exporter("__assign", __assign3);
|
|
exporter("__rest", __rest3);
|
|
exporter("__decorate", __decorate2);
|
|
exporter("__param", __param2);
|
|
exporter("__metadata", __metadata2);
|
|
exporter("__awaiter", __awaiter2);
|
|
exporter("__generator", __generator2);
|
|
exporter("__exportStar", __exportStar2);
|
|
exporter("__createBinding", __createBinding2);
|
|
exporter("__values", __values2);
|
|
exporter("__read", __read2);
|
|
exporter("__spread", __spread2);
|
|
exporter("__spreadArrays", __spreadArrays2);
|
|
exporter("__spreadArray", __spreadArray3);
|
|
exporter("__await", __await2);
|
|
exporter("__asyncGenerator", __asyncGenerator2);
|
|
exporter("__asyncDelegator", __asyncDelegator2);
|
|
exporter("__asyncValues", __asyncValues2);
|
|
exporter("__makeTemplateObject", __makeTemplateObject2);
|
|
exporter("__importStar", __importStar2);
|
|
exporter("__importDefault", __importDefault2);
|
|
exporter("__classPrivateFieldGet", __classPrivateFieldGet2);
|
|
exporter("__classPrivateFieldSet", __classPrivateFieldSet2);
|
|
exporter("__classPrivateFieldIn", __classPrivateFieldIn2);
|
|
});
|
|
}
|
|
});
|
|
|
|
// node_modules/classnames/index.js
|
|
var require_classnames = __commonJS({
|
|
"node_modules/classnames/index.js"(exports, module2) {
|
|
(function() {
|
|
"use strict";
|
|
var hasOwn = {}.hasOwnProperty;
|
|
var nativeCodeString = "[native code]";
|
|
function classNames8() {
|
|
var classes = [];
|
|
for (var i4 = 0; i4 < arguments.length; i4++) {
|
|
var arg = arguments[i4];
|
|
if (!arg)
|
|
continue;
|
|
var argType = typeof arg;
|
|
if (argType === "string" || argType === "number") {
|
|
classes.push(arg);
|
|
} else if (Array.isArray(arg)) {
|
|
if (arg.length) {
|
|
var inner = classNames8.apply(null, arg);
|
|
if (inner) {
|
|
classes.push(inner);
|
|
}
|
|
}
|
|
} else if (argType === "object") {
|
|
if (arg.toString !== Object.prototype.toString && !arg.toString.toString().includes("[native code]")) {
|
|
classes.push(arg.toString());
|
|
continue;
|
|
}
|
|
for (var key2 in arg) {
|
|
if (hasOwn.call(arg, key2) && arg[key2]) {
|
|
classes.push(key2);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return classes.join(" ");
|
|
}
|
|
if (typeof module2 !== "undefined" && module2.exports) {
|
|
classNames8.default = classNames8;
|
|
module2.exports = classNames8;
|
|
} else if (typeof define === "function" && typeof define.amd === "object" && define.amd) {
|
|
define("classnames", [], function() {
|
|
return classNames8;
|
|
});
|
|
} else {
|
|
window.classNames = classNames8;
|
|
}
|
|
})();
|
|
}
|
|
});
|
|
|
|
// node_modules/lodash/lodash.js
|
|
var require_lodash = __commonJS({
|
|
"node_modules/lodash/lodash.js"(exports, module2) {
|
|
(function() {
|
|
var undefined2;
|
|
var VERSION = "4.17.21";
|
|
var LARGE_ARRAY_SIZE = 200;
|
|
var CORE_ERROR_TEXT = "Unsupported core-js use. Try https://npms.io/search?q=ponyfill.", FUNC_ERROR_TEXT = "Expected a function", INVALID_TEMPL_VAR_ERROR_TEXT = "Invalid `variable` option passed into `_.template`";
|
|
var HASH_UNDEFINED = "__lodash_hash_undefined__";
|
|
var MAX_MEMOIZE_SIZE = 500;
|
|
var PLACEHOLDER = "__lodash_placeholder__";
|
|
var CLONE_DEEP_FLAG = 1, CLONE_FLAT_FLAG = 2, CLONE_SYMBOLS_FLAG = 4;
|
|
var COMPARE_PARTIAL_FLAG = 1, COMPARE_UNORDERED_FLAG = 2;
|
|
var WRAP_BIND_FLAG = 1, WRAP_BIND_KEY_FLAG = 2, WRAP_CURRY_BOUND_FLAG = 4, WRAP_CURRY_FLAG = 8, WRAP_CURRY_RIGHT_FLAG = 16, WRAP_PARTIAL_FLAG = 32, WRAP_PARTIAL_RIGHT_FLAG = 64, WRAP_ARY_FLAG = 128, WRAP_REARG_FLAG = 256, WRAP_FLIP_FLAG = 512;
|
|
var DEFAULT_TRUNC_LENGTH = 30, DEFAULT_TRUNC_OMISSION = "...";
|
|
var HOT_COUNT = 800, HOT_SPAN = 16;
|
|
var LAZY_FILTER_FLAG = 1, LAZY_MAP_FLAG = 2, LAZY_WHILE_FLAG = 3;
|
|
var INFINITY = 1 / 0, MAX_SAFE_INTEGER = 9007199254740991, MAX_INTEGER = 17976931348623157e292, NAN = 0 / 0;
|
|
var MAX_ARRAY_LENGTH = 4294967295, MAX_ARRAY_INDEX = MAX_ARRAY_LENGTH - 1, HALF_MAX_ARRAY_LENGTH = MAX_ARRAY_LENGTH >>> 1;
|
|
var wrapFlags = [
|
|
["ary", WRAP_ARY_FLAG],
|
|
["bind", WRAP_BIND_FLAG],
|
|
["bindKey", WRAP_BIND_KEY_FLAG],
|
|
["curry", WRAP_CURRY_FLAG],
|
|
["curryRight", WRAP_CURRY_RIGHT_FLAG],
|
|
["flip", WRAP_FLIP_FLAG],
|
|
["partial", WRAP_PARTIAL_FLAG],
|
|
["partialRight", WRAP_PARTIAL_RIGHT_FLAG],
|
|
["rearg", WRAP_REARG_FLAG]
|
|
];
|
|
var argsTag = "[object Arguments]", arrayTag = "[object Array]", asyncTag = "[object AsyncFunction]", boolTag = "[object Boolean]", dateTag = "[object Date]", domExcTag = "[object DOMException]", errorTag = "[object Error]", funcTag = "[object Function]", genTag = "[object GeneratorFunction]", mapTag = "[object Map]", numberTag = "[object Number]", nullTag = "[object Null]", objectTag = "[object Object]", promiseTag = "[object Promise]", proxyTag = "[object Proxy]", regexpTag = "[object RegExp]", setTag = "[object Set]", stringTag = "[object String]", symbolTag = "[object Symbol]", undefinedTag = "[object Undefined]", weakMapTag = "[object WeakMap]", weakSetTag = "[object WeakSet]";
|
|
var arrayBufferTag = "[object ArrayBuffer]", dataViewTag = "[object DataView]", float32Tag = "[object Float32Array]", float64Tag = "[object Float64Array]", int8Tag = "[object Int8Array]", int16Tag = "[object Int16Array]", int32Tag = "[object Int32Array]", uint8Tag = "[object Uint8Array]", uint8ClampedTag = "[object Uint8ClampedArray]", uint16Tag = "[object Uint16Array]", uint32Tag = "[object Uint32Array]";
|
|
var reEmptyStringLeading = /\b__p \+= '';/g, reEmptyStringMiddle = /\b(__p \+=) '' \+/g, reEmptyStringTrailing = /(__e\(.*?\)|\b__t\)) \+\n'';/g;
|
|
var reEscapedHtml = /&(?:amp|lt|gt|quot|#39);/g, reUnescapedHtml = /[&<>"']/g, reHasEscapedHtml = RegExp(reEscapedHtml.source), reHasUnescapedHtml = RegExp(reUnescapedHtml.source);
|
|
var reEscape = /<%-([\s\S]+?)%>/g, reEvaluate = /<%([\s\S]+?)%>/g, reInterpolate = /<%=([\s\S]+?)%>/g;
|
|
var reIsDeepProp = /\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/, reIsPlainProp = /^\w*$/, rePropName = /[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g;
|
|
var reRegExpChar = /[\\^$.*+?()[\]{}|]/g, reHasRegExpChar = RegExp(reRegExpChar.source);
|
|
var reTrimStart = /^\s+/;
|
|
var reWhitespace = /\s/;
|
|
var reWrapComment = /\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/, reWrapDetails = /\{\n\/\* \[wrapped with (.+)\] \*/, reSplitDetails = /,? & /;
|
|
var reAsciiWord = /[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g;
|
|
var reForbiddenIdentifierChars = /[()=,{}\[\]\/\s]/;
|
|
var reEscapeChar = /\\(\\)?/g;
|
|
var reEsTemplate = /\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g;
|
|
var reFlags = /\w*$/;
|
|
var reIsBadHex = /^[-+]0x[0-9a-f]+$/i;
|
|
var reIsBinary = /^0b[01]+$/i;
|
|
var reIsHostCtor = /^\[object .+?Constructor\]$/;
|
|
var reIsOctal = /^0o[0-7]+$/i;
|
|
var reIsUint = /^(?:0|[1-9]\d*)$/;
|
|
var reLatin = /[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g;
|
|
var reNoMatch = /($^)/;
|
|
var reUnescapedString = /['\n\r\u2028\u2029\\]/g;
|
|
var rsAstralRange = "\\ud800-\\udfff", rsComboMarksRange = "\\u0300-\\u036f", reComboHalfMarksRange = "\\ufe20-\\ufe2f", rsComboSymbolsRange = "\\u20d0-\\u20ff", rsComboRange = rsComboMarksRange + reComboHalfMarksRange + rsComboSymbolsRange, rsDingbatRange = "\\u2700-\\u27bf", rsLowerRange = "a-z\\xdf-\\xf6\\xf8-\\xff", rsMathOpRange = "\\xac\\xb1\\xd7\\xf7", rsNonCharRange = "\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf", rsPunctuationRange = "\\u2000-\\u206f", rsSpaceRange = " \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000", rsUpperRange = "A-Z\\xc0-\\xd6\\xd8-\\xde", rsVarRange = "\\ufe0e\\ufe0f", rsBreakRange = rsMathOpRange + rsNonCharRange + rsPunctuationRange + rsSpaceRange;
|
|
var rsApos = "['\u2019]", rsAstral = "[" + rsAstralRange + "]", rsBreak = "[" + rsBreakRange + "]", rsCombo = "[" + rsComboRange + "]", rsDigits = "\\d+", rsDingbat = "[" + rsDingbatRange + "]", rsLower = "[" + rsLowerRange + "]", rsMisc = "[^" + rsAstralRange + rsBreakRange + rsDigits + rsDingbatRange + rsLowerRange + rsUpperRange + "]", rsFitz = "\\ud83c[\\udffb-\\udfff]", rsModifier = "(?:" + rsCombo + "|" + rsFitz + ")", rsNonAstral = "[^" + rsAstralRange + "]", rsRegional = "(?:\\ud83c[\\udde6-\\uddff]){2}", rsSurrPair = "[\\ud800-\\udbff][\\udc00-\\udfff]", rsUpper = "[" + rsUpperRange + "]", rsZWJ = "\\u200d";
|
|
var rsMiscLower = "(?:" + rsLower + "|" + rsMisc + ")", rsMiscUpper = "(?:" + rsUpper + "|" + rsMisc + ")", rsOptContrLower = "(?:" + rsApos + "(?:d|ll|m|re|s|t|ve))?", rsOptContrUpper = "(?:" + rsApos + "(?:D|LL|M|RE|S|T|VE))?", reOptMod = rsModifier + "?", rsOptVar = "[" + rsVarRange + "]?", rsOptJoin = "(?:" + rsZWJ + "(?:" + [rsNonAstral, rsRegional, rsSurrPair].join("|") + ")" + rsOptVar + reOptMod + ")*", rsOrdLower = "\\d*(?:1st|2nd|3rd|(?![123])\\dth)(?=\\b|[A-Z_])", rsOrdUpper = "\\d*(?:1ST|2ND|3RD|(?![123])\\dTH)(?=\\b|[a-z_])", rsSeq = rsOptVar + reOptMod + rsOptJoin, rsEmoji = "(?:" + [rsDingbat, rsRegional, rsSurrPair].join("|") + ")" + rsSeq, rsSymbol = "(?:" + [rsNonAstral + rsCombo + "?", rsCombo, rsRegional, rsSurrPair, rsAstral].join("|") + ")";
|
|
var reApos = RegExp(rsApos, "g");
|
|
var reComboMark = RegExp(rsCombo, "g");
|
|
var reUnicode = RegExp(rsFitz + "(?=" + rsFitz + ")|" + rsSymbol + rsSeq, "g");
|
|
var reUnicodeWord = RegExp([
|
|
rsUpper + "?" + rsLower + "+" + rsOptContrLower + "(?=" + [rsBreak, rsUpper, "$"].join("|") + ")",
|
|
rsMiscUpper + "+" + rsOptContrUpper + "(?=" + [rsBreak, rsUpper + rsMiscLower, "$"].join("|") + ")",
|
|
rsUpper + "?" + rsMiscLower + "+" + rsOptContrLower,
|
|
rsUpper + "+" + rsOptContrUpper,
|
|
rsOrdUpper,
|
|
rsOrdLower,
|
|
rsDigits,
|
|
rsEmoji
|
|
].join("|"), "g");
|
|
var reHasUnicode = RegExp("[" + rsZWJ + rsAstralRange + rsComboRange + rsVarRange + "]");
|
|
var reHasUnicodeWord = /[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/;
|
|
var contextProps = [
|
|
"Array",
|
|
"Buffer",
|
|
"DataView",
|
|
"Date",
|
|
"Error",
|
|
"Float32Array",
|
|
"Float64Array",
|
|
"Function",
|
|
"Int8Array",
|
|
"Int16Array",
|
|
"Int32Array",
|
|
"Map",
|
|
"Math",
|
|
"Object",
|
|
"Promise",
|
|
"RegExp",
|
|
"Set",
|
|
"String",
|
|
"Symbol",
|
|
"TypeError",
|
|
"Uint8Array",
|
|
"Uint8ClampedArray",
|
|
"Uint16Array",
|
|
"Uint32Array",
|
|
"WeakMap",
|
|
"_",
|
|
"clearTimeout",
|
|
"isFinite",
|
|
"parseInt",
|
|
"setTimeout"
|
|
];
|
|
var templateCounter = -1;
|
|
var typedArrayTags = {};
|
|
typedArrayTags[float32Tag] = typedArrayTags[float64Tag] = typedArrayTags[int8Tag] = typedArrayTags[int16Tag] = typedArrayTags[int32Tag] = typedArrayTags[uint8Tag] = typedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] = typedArrayTags[uint32Tag] = true;
|
|
typedArrayTags[argsTag] = typedArrayTags[arrayTag] = typedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] = typedArrayTags[dataViewTag] = typedArrayTags[dateTag] = typedArrayTags[errorTag] = typedArrayTags[funcTag] = typedArrayTags[mapTag] = typedArrayTags[numberTag] = typedArrayTags[objectTag] = typedArrayTags[regexpTag] = typedArrayTags[setTag] = typedArrayTags[stringTag] = typedArrayTags[weakMapTag] = false;
|
|
var cloneableTags = {};
|
|
cloneableTags[argsTag] = cloneableTags[arrayTag] = cloneableTags[arrayBufferTag] = cloneableTags[dataViewTag] = cloneableTags[boolTag] = cloneableTags[dateTag] = cloneableTags[float32Tag] = cloneableTags[float64Tag] = cloneableTags[int8Tag] = cloneableTags[int16Tag] = cloneableTags[int32Tag] = cloneableTags[mapTag] = cloneableTags[numberTag] = cloneableTags[objectTag] = cloneableTags[regexpTag] = cloneableTags[setTag] = cloneableTags[stringTag] = cloneableTags[symbolTag] = cloneableTags[uint8Tag] = cloneableTags[uint8ClampedTag] = cloneableTags[uint16Tag] = cloneableTags[uint32Tag] = true;
|
|
cloneableTags[errorTag] = cloneableTags[funcTag] = cloneableTags[weakMapTag] = false;
|
|
var deburredLetters = {
|
|
"\xC0": "A",
|
|
"\xC1": "A",
|
|
"\xC2": "A",
|
|
"\xC3": "A",
|
|
"\xC4": "A",
|
|
"\xC5": "A",
|
|
"\xE0": "a",
|
|
"\xE1": "a",
|
|
"\xE2": "a",
|
|
"\xE3": "a",
|
|
"\xE4": "a",
|
|
"\xE5": "a",
|
|
"\xC7": "C",
|
|
"\xE7": "c",
|
|
"\xD0": "D",
|
|
"\xF0": "d",
|
|
"\xC8": "E",
|
|
"\xC9": "E",
|
|
"\xCA": "E",
|
|
"\xCB": "E",
|
|
"\xE8": "e",
|
|
"\xE9": "e",
|
|
"\xEA": "e",
|
|
"\xEB": "e",
|
|
"\xCC": "I",
|
|
"\xCD": "I",
|
|
"\xCE": "I",
|
|
"\xCF": "I",
|
|
"\xEC": "i",
|
|
"\xED": "i",
|
|
"\xEE": "i",
|
|
"\xEF": "i",
|
|
"\xD1": "N",
|
|
"\xF1": "n",
|
|
"\xD2": "O",
|
|
"\xD3": "O",
|
|
"\xD4": "O",
|
|
"\xD5": "O",
|
|
"\xD6": "O",
|
|
"\xD8": "O",
|
|
"\xF2": "o",
|
|
"\xF3": "o",
|
|
"\xF4": "o",
|
|
"\xF5": "o",
|
|
"\xF6": "o",
|
|
"\xF8": "o",
|
|
"\xD9": "U",
|
|
"\xDA": "U",
|
|
"\xDB": "U",
|
|
"\xDC": "U",
|
|
"\xF9": "u",
|
|
"\xFA": "u",
|
|
"\xFB": "u",
|
|
"\xFC": "u",
|
|
"\xDD": "Y",
|
|
"\xFD": "y",
|
|
"\xFF": "y",
|
|
"\xC6": "Ae",
|
|
"\xE6": "ae",
|
|
"\xDE": "Th",
|
|
"\xFE": "th",
|
|
"\xDF": "ss",
|
|
"\u0100": "A",
|
|
"\u0102": "A",
|
|
"\u0104": "A",
|
|
"\u0101": "a",
|
|
"\u0103": "a",
|
|
"\u0105": "a",
|
|
"\u0106": "C",
|
|
"\u0108": "C",
|
|
"\u010A": "C",
|
|
"\u010C": "C",
|
|
"\u0107": "c",
|
|
"\u0109": "c",
|
|
"\u010B": "c",
|
|
"\u010D": "c",
|
|
"\u010E": "D",
|
|
"\u0110": "D",
|
|
"\u010F": "d",
|
|
"\u0111": "d",
|
|
"\u0112": "E",
|
|
"\u0114": "E",
|
|
"\u0116": "E",
|
|
"\u0118": "E",
|
|
"\u011A": "E",
|
|
"\u0113": "e",
|
|
"\u0115": "e",
|
|
"\u0117": "e",
|
|
"\u0119": "e",
|
|
"\u011B": "e",
|
|
"\u011C": "G",
|
|
"\u011E": "G",
|
|
"\u0120": "G",
|
|
"\u0122": "G",
|
|
"\u011D": "g",
|
|
"\u011F": "g",
|
|
"\u0121": "g",
|
|
"\u0123": "g",
|
|
"\u0124": "H",
|
|
"\u0126": "H",
|
|
"\u0125": "h",
|
|
"\u0127": "h",
|
|
"\u0128": "I",
|
|
"\u012A": "I",
|
|
"\u012C": "I",
|
|
"\u012E": "I",
|
|
"\u0130": "I",
|
|
"\u0129": "i",
|
|
"\u012B": "i",
|
|
"\u012D": "i",
|
|
"\u012F": "i",
|
|
"\u0131": "i",
|
|
"\u0134": "J",
|
|
"\u0135": "j",
|
|
"\u0136": "K",
|
|
"\u0137": "k",
|
|
"\u0138": "k",
|
|
"\u0139": "L",
|
|
"\u013B": "L",
|
|
"\u013D": "L",
|
|
"\u013F": "L",
|
|
"\u0141": "L",
|
|
"\u013A": "l",
|
|
"\u013C": "l",
|
|
"\u013E": "l",
|
|
"\u0140": "l",
|
|
"\u0142": "l",
|
|
"\u0143": "N",
|
|
"\u0145": "N",
|
|
"\u0147": "N",
|
|
"\u014A": "N",
|
|
"\u0144": "n",
|
|
"\u0146": "n",
|
|
"\u0148": "n",
|
|
"\u014B": "n",
|
|
"\u014C": "O",
|
|
"\u014E": "O",
|
|
"\u0150": "O",
|
|
"\u014D": "o",
|
|
"\u014F": "o",
|
|
"\u0151": "o",
|
|
"\u0154": "R",
|
|
"\u0156": "R",
|
|
"\u0158": "R",
|
|
"\u0155": "r",
|
|
"\u0157": "r",
|
|
"\u0159": "r",
|
|
"\u015A": "S",
|
|
"\u015C": "S",
|
|
"\u015E": "S",
|
|
"\u0160": "S",
|
|
"\u015B": "s",
|
|
"\u015D": "s",
|
|
"\u015F": "s",
|
|
"\u0161": "s",
|
|
"\u0162": "T",
|
|
"\u0164": "T",
|
|
"\u0166": "T",
|
|
"\u0163": "t",
|
|
"\u0165": "t",
|
|
"\u0167": "t",
|
|
"\u0168": "U",
|
|
"\u016A": "U",
|
|
"\u016C": "U",
|
|
"\u016E": "U",
|
|
"\u0170": "U",
|
|
"\u0172": "U",
|
|
"\u0169": "u",
|
|
"\u016B": "u",
|
|
"\u016D": "u",
|
|
"\u016F": "u",
|
|
"\u0171": "u",
|
|
"\u0173": "u",
|
|
"\u0174": "W",
|
|
"\u0175": "w",
|
|
"\u0176": "Y",
|
|
"\u0177": "y",
|
|
"\u0178": "Y",
|
|
"\u0179": "Z",
|
|
"\u017B": "Z",
|
|
"\u017D": "Z",
|
|
"\u017A": "z",
|
|
"\u017C": "z",
|
|
"\u017E": "z",
|
|
"\u0132": "IJ",
|
|
"\u0133": "ij",
|
|
"\u0152": "Oe",
|
|
"\u0153": "oe",
|
|
"\u0149": "'n",
|
|
"\u017F": "s"
|
|
};
|
|
var htmlEscapes = {
|
|
"&": "&",
|
|
"<": "<",
|
|
">": ">",
|
|
'"': """,
|
|
"'": "'"
|
|
};
|
|
var htmlUnescapes = {
|
|
"&": "&",
|
|
"<": "<",
|
|
">": ">",
|
|
""": '"',
|
|
"'": "'"
|
|
};
|
|
var stringEscapes = {
|
|
"\\": "\\",
|
|
"'": "'",
|
|
"\n": "n",
|
|
"\r": "r",
|
|
"\u2028": "u2028",
|
|
"\u2029": "u2029"
|
|
};
|
|
var freeParseFloat = parseFloat, freeParseInt = parseInt;
|
|
var freeGlobal = typeof global == "object" && global && global.Object === Object && global;
|
|
var freeSelf = typeof self == "object" && self && self.Object === Object && self;
|
|
var root = freeGlobal || freeSelf || Function("return this")();
|
|
var freeExports = typeof exports == "object" && exports && !exports.nodeType && exports;
|
|
var freeModule = freeExports && typeof module2 == "object" && module2 && !module2.nodeType && module2;
|
|
var moduleExports = freeModule && freeModule.exports === freeExports;
|
|
var freeProcess = moduleExports && freeGlobal.process;
|
|
var nodeUtil = function() {
|
|
try {
|
|
var types = freeModule && freeModule.require && freeModule.require("util").types;
|
|
if (types) {
|
|
return types;
|
|
}
|
|
return freeProcess && freeProcess.binding && freeProcess.binding("util");
|
|
} catch (e4) {
|
|
}
|
|
}();
|
|
var nodeIsArrayBuffer = nodeUtil && nodeUtil.isArrayBuffer, nodeIsDate = nodeUtil && nodeUtil.isDate, nodeIsMap = nodeUtil && nodeUtil.isMap, nodeIsRegExp = nodeUtil && nodeUtil.isRegExp, nodeIsSet = nodeUtil && nodeUtil.isSet, nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray;
|
|
function apply(func, thisArg, args) {
|
|
switch (args.length) {
|
|
case 0:
|
|
return func.call(thisArg);
|
|
case 1:
|
|
return func.call(thisArg, args[0]);
|
|
case 2:
|
|
return func.call(thisArg, args[0], args[1]);
|
|
case 3:
|
|
return func.call(thisArg, args[0], args[1], args[2]);
|
|
}
|
|
return func.apply(thisArg, args);
|
|
}
|
|
function arrayAggregator(array, setter, iteratee, accumulator) {
|
|
var index = -1, length = array == null ? 0 : array.length;
|
|
while (++index < length) {
|
|
var value = array[index];
|
|
setter(accumulator, value, iteratee(value), array);
|
|
}
|
|
return accumulator;
|
|
}
|
|
function arrayEach(array, iteratee) {
|
|
var index = -1, length = array == null ? 0 : array.length;
|
|
while (++index < length) {
|
|
if (iteratee(array[index], index, array) === false) {
|
|
break;
|
|
}
|
|
}
|
|
return array;
|
|
}
|
|
function arrayEachRight(array, iteratee) {
|
|
var length = array == null ? 0 : array.length;
|
|
while (length--) {
|
|
if (iteratee(array[length], length, array) === false) {
|
|
break;
|
|
}
|
|
}
|
|
return array;
|
|
}
|
|
function arrayEvery(array, predicate) {
|
|
var index = -1, length = array == null ? 0 : array.length;
|
|
while (++index < length) {
|
|
if (!predicate(array[index], index, array)) {
|
|
return false;
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
function arrayFilter(array, predicate) {
|
|
var index = -1, length = array == null ? 0 : array.length, resIndex = 0, result = [];
|
|
while (++index < length) {
|
|
var value = array[index];
|
|
if (predicate(value, index, array)) {
|
|
result[resIndex++] = value;
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
function arrayIncludes(array, value) {
|
|
var length = array == null ? 0 : array.length;
|
|
return !!length && baseIndexOf(array, value, 0) > -1;
|
|
}
|
|
function arrayIncludesWith(array, value, comparator) {
|
|
var index = -1, length = array == null ? 0 : array.length;
|
|
while (++index < length) {
|
|
if (comparator(value, array[index])) {
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
function arrayMap(array, iteratee) {
|
|
var index = -1, length = array == null ? 0 : array.length, result = Array(length);
|
|
while (++index < length) {
|
|
result[index] = iteratee(array[index], index, array);
|
|
}
|
|
return result;
|
|
}
|
|
function arrayPush(array, values) {
|
|
var index = -1, length = values.length, offset = array.length;
|
|
while (++index < length) {
|
|
array[offset + index] = values[index];
|
|
}
|
|
return array;
|
|
}
|
|
function arrayReduce(array, iteratee, accumulator, initAccum) {
|
|
var index = -1, length = array == null ? 0 : array.length;
|
|
if (initAccum && length) {
|
|
accumulator = array[++index];
|
|
}
|
|
while (++index < length) {
|
|
accumulator = iteratee(accumulator, array[index], index, array);
|
|
}
|
|
return accumulator;
|
|
}
|
|
function arrayReduceRight(array, iteratee, accumulator, initAccum) {
|
|
var length = array == null ? 0 : array.length;
|
|
if (initAccum && length) {
|
|
accumulator = array[--length];
|
|
}
|
|
while (length--) {
|
|
accumulator = iteratee(accumulator, array[length], length, array);
|
|
}
|
|
return accumulator;
|
|
}
|
|
function arraySome(array, predicate) {
|
|
var index = -1, length = array == null ? 0 : array.length;
|
|
while (++index < length) {
|
|
if (predicate(array[index], index, array)) {
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
var asciiSize = baseProperty("length");
|
|
function asciiToArray(string) {
|
|
return string.split("");
|
|
}
|
|
function asciiWords(string) {
|
|
return string.match(reAsciiWord) || [];
|
|
}
|
|
function baseFindKey(collection, predicate, eachFunc) {
|
|
var result;
|
|
eachFunc(collection, function(value, key2, collection2) {
|
|
if (predicate(value, key2, collection2)) {
|
|
result = key2;
|
|
return false;
|
|
}
|
|
});
|
|
return result;
|
|
}
|
|
function baseFindIndex(array, predicate, fromIndex, fromRight) {
|
|
var length = array.length, index = fromIndex + (fromRight ? 1 : -1);
|
|
while (fromRight ? index-- : ++index < length) {
|
|
if (predicate(array[index], index, array)) {
|
|
return index;
|
|
}
|
|
}
|
|
return -1;
|
|
}
|
|
function baseIndexOf(array, value, fromIndex) {
|
|
return value === value ? strictIndexOf(array, value, fromIndex) : baseFindIndex(array, baseIsNaN, fromIndex);
|
|
}
|
|
function baseIndexOfWith(array, value, fromIndex, comparator) {
|
|
var index = fromIndex - 1, length = array.length;
|
|
while (++index < length) {
|
|
if (comparator(array[index], value)) {
|
|
return index;
|
|
}
|
|
}
|
|
return -1;
|
|
}
|
|
function baseIsNaN(value) {
|
|
return value !== value;
|
|
}
|
|
function baseMean(array, iteratee) {
|
|
var length = array == null ? 0 : array.length;
|
|
return length ? baseSum(array, iteratee) / length : NAN;
|
|
}
|
|
function baseProperty(key2) {
|
|
return function(object) {
|
|
return object == null ? undefined2 : object[key2];
|
|
};
|
|
}
|
|
function basePropertyOf(object) {
|
|
return function(key2) {
|
|
return object == null ? undefined2 : object[key2];
|
|
};
|
|
}
|
|
function baseReduce(collection, iteratee, accumulator, initAccum, eachFunc) {
|
|
eachFunc(collection, function(value, index, collection2) {
|
|
accumulator = initAccum ? (initAccum = false, value) : iteratee(accumulator, value, index, collection2);
|
|
});
|
|
return accumulator;
|
|
}
|
|
function baseSortBy(array, comparer) {
|
|
var length = array.length;
|
|
array.sort(comparer);
|
|
while (length--) {
|
|
array[length] = array[length].value;
|
|
}
|
|
return array;
|
|
}
|
|
function baseSum(array, iteratee) {
|
|
var result, index = -1, length = array.length;
|
|
while (++index < length) {
|
|
var current = iteratee(array[index]);
|
|
if (current !== undefined2) {
|
|
result = result === undefined2 ? current : result + current;
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
function baseTimes(n2, iteratee) {
|
|
var index = -1, result = Array(n2);
|
|
while (++index < n2) {
|
|
result[index] = iteratee(index);
|
|
}
|
|
return result;
|
|
}
|
|
function baseToPairs(object, props2) {
|
|
return arrayMap(props2, function(key2) {
|
|
return [key2, object[key2]];
|
|
});
|
|
}
|
|
function baseTrim(string) {
|
|
return string ? string.slice(0, trimmedEndIndex(string) + 1).replace(reTrimStart, "") : string;
|
|
}
|
|
function baseUnary(func) {
|
|
return function(value) {
|
|
return func(value);
|
|
};
|
|
}
|
|
function baseValues(object, props2) {
|
|
return arrayMap(props2, function(key2) {
|
|
return object[key2];
|
|
});
|
|
}
|
|
function cacheHas(cache, key2) {
|
|
return cache.has(key2);
|
|
}
|
|
function charsStartIndex(strSymbols, chrSymbols) {
|
|
var index = -1, length = strSymbols.length;
|
|
while (++index < length && baseIndexOf(chrSymbols, strSymbols[index], 0) > -1) {
|
|
}
|
|
return index;
|
|
}
|
|
function charsEndIndex(strSymbols, chrSymbols) {
|
|
var index = strSymbols.length;
|
|
while (index-- && baseIndexOf(chrSymbols, strSymbols[index], 0) > -1) {
|
|
}
|
|
return index;
|
|
}
|
|
function countHolders(array, placeholder2) {
|
|
var length = array.length, result = 0;
|
|
while (length--) {
|
|
if (array[length] === placeholder2) {
|
|
++result;
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
var deburrLetter = basePropertyOf(deburredLetters);
|
|
var escapeHtmlChar = basePropertyOf(htmlEscapes);
|
|
function escapeStringChar(chr) {
|
|
return "\\" + stringEscapes[chr];
|
|
}
|
|
function getValue(object, key2) {
|
|
return object == null ? undefined2 : object[key2];
|
|
}
|
|
function hasUnicode(string) {
|
|
return reHasUnicode.test(string);
|
|
}
|
|
function hasUnicodeWord(string) {
|
|
return reHasUnicodeWord.test(string);
|
|
}
|
|
function iteratorToArray(iterator) {
|
|
var data, result = [];
|
|
while (!(data = iterator.next()).done) {
|
|
result.push(data.value);
|
|
}
|
|
return result;
|
|
}
|
|
function mapToArray(map) {
|
|
var index = -1, result = Array(map.size);
|
|
map.forEach(function(value, key2) {
|
|
result[++index] = [key2, value];
|
|
});
|
|
return result;
|
|
}
|
|
function overArg(func, transform) {
|
|
return function(arg) {
|
|
return func(transform(arg));
|
|
};
|
|
}
|
|
function replaceHolders(array, placeholder2) {
|
|
var index = -1, length = array.length, resIndex = 0, result = [];
|
|
while (++index < length) {
|
|
var value = array[index];
|
|
if (value === placeholder2 || value === PLACEHOLDER) {
|
|
array[index] = PLACEHOLDER;
|
|
result[resIndex++] = index;
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
function setToArray(set) {
|
|
var index = -1, result = Array(set.size);
|
|
set.forEach(function(value) {
|
|
result[++index] = value;
|
|
});
|
|
return result;
|
|
}
|
|
function setToPairs(set) {
|
|
var index = -1, result = Array(set.size);
|
|
set.forEach(function(value) {
|
|
result[++index] = [value, value];
|
|
});
|
|
return result;
|
|
}
|
|
function strictIndexOf(array, value, fromIndex) {
|
|
var index = fromIndex - 1, length = array.length;
|
|
while (++index < length) {
|
|
if (array[index] === value) {
|
|
return index;
|
|
}
|
|
}
|
|
return -1;
|
|
}
|
|
function strictLastIndexOf(array, value, fromIndex) {
|
|
var index = fromIndex + 1;
|
|
while (index--) {
|
|
if (array[index] === value) {
|
|
return index;
|
|
}
|
|
}
|
|
return index;
|
|
}
|
|
function stringSize(string) {
|
|
return hasUnicode(string) ? unicodeSize(string) : asciiSize(string);
|
|
}
|
|
function stringToArray(string) {
|
|
return hasUnicode(string) ? unicodeToArray(string) : asciiToArray(string);
|
|
}
|
|
function trimmedEndIndex(string) {
|
|
var index = string.length;
|
|
while (index-- && reWhitespace.test(string.charAt(index))) {
|
|
}
|
|
return index;
|
|
}
|
|
var unescapeHtmlChar = basePropertyOf(htmlUnescapes);
|
|
function unicodeSize(string) {
|
|
var result = reUnicode.lastIndex = 0;
|
|
while (reUnicode.test(string)) {
|
|
++result;
|
|
}
|
|
return result;
|
|
}
|
|
function unicodeToArray(string) {
|
|
return string.match(reUnicode) || [];
|
|
}
|
|
function unicodeWords(string) {
|
|
return string.match(reUnicodeWord) || [];
|
|
}
|
|
var runInContext = function runInContext2(context) {
|
|
context = context == null ? root : _5.defaults(root.Object(), context, _5.pick(root, contextProps));
|
|
var Array2 = context.Array, Date2 = context.Date, Error2 = context.Error, Function2 = context.Function, Math2 = context.Math, Object2 = context.Object, RegExp2 = context.RegExp, String2 = context.String, TypeError2 = context.TypeError;
|
|
var arrayProto = Array2.prototype, funcProto = Function2.prototype, objectProto = Object2.prototype;
|
|
var coreJsData = context["__core-js_shared__"];
|
|
var funcToString = funcProto.toString;
|
|
var hasOwnProperty = objectProto.hasOwnProperty;
|
|
var idCounter = 0;
|
|
var maskSrcKey = function() {
|
|
var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || "");
|
|
return uid ? "Symbol(src)_1." + uid : "";
|
|
}();
|
|
var nativeObjectToString = objectProto.toString;
|
|
var objectCtorString = funcToString.call(Object2);
|
|
var oldDash = root._;
|
|
var reIsNative = RegExp2(
|
|
"^" + funcToString.call(hasOwnProperty).replace(reRegExpChar, "\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, "$1.*?") + "$"
|
|
);
|
|
var Buffer2 = moduleExports ? context.Buffer : undefined2, Symbol2 = context.Symbol, Uint8Array2 = context.Uint8Array, allocUnsafe = Buffer2 ? Buffer2.allocUnsafe : undefined2, getPrototype = overArg(Object2.getPrototypeOf, Object2), objectCreate = Object2.create, propertyIsEnumerable = objectProto.propertyIsEnumerable, splice = arrayProto.splice, spreadableSymbol = Symbol2 ? Symbol2.isConcatSpreadable : undefined2, symIterator = Symbol2 ? Symbol2.iterator : undefined2, symToStringTag = Symbol2 ? Symbol2.toStringTag : undefined2;
|
|
var defineProperty = function() {
|
|
try {
|
|
var func = getNative(Object2, "defineProperty");
|
|
func({}, "", {});
|
|
return func;
|
|
} catch (e4) {
|
|
}
|
|
}();
|
|
var ctxClearTimeout = context.clearTimeout !== root.clearTimeout && context.clearTimeout, ctxNow = Date2 && Date2.now !== root.Date.now && Date2.now, ctxSetTimeout = context.setTimeout !== root.setTimeout && context.setTimeout;
|
|
var nativeCeil = Math2.ceil, nativeFloor = Math2.floor, nativeGetSymbols = Object2.getOwnPropertySymbols, nativeIsBuffer = Buffer2 ? Buffer2.isBuffer : undefined2, nativeIsFinite = context.isFinite, nativeJoin = arrayProto.join, nativeKeys = overArg(Object2.keys, Object2), nativeMax = Math2.max, nativeMin = Math2.min, nativeNow = Date2.now, nativeParseInt = context.parseInt, nativeRandom = Math2.random, nativeReverse = arrayProto.reverse;
|
|
var DataView = getNative(context, "DataView"), Map2 = getNative(context, "Map"), Promise2 = getNative(context, "Promise"), Set2 = getNative(context, "Set"), WeakMap2 = getNative(context, "WeakMap"), nativeCreate = getNative(Object2, "create");
|
|
var metaMap = WeakMap2 && new WeakMap2();
|
|
var realNames = {};
|
|
var dataViewCtorString = toSource(DataView), mapCtorString = toSource(Map2), promiseCtorString = toSource(Promise2), setCtorString = toSource(Set2), weakMapCtorString = toSource(WeakMap2);
|
|
var symbolProto = Symbol2 ? Symbol2.prototype : undefined2, symbolValueOf = symbolProto ? symbolProto.valueOf : undefined2, symbolToString = symbolProto ? symbolProto.toString : undefined2;
|
|
function lodash(value) {
|
|
if (isObjectLike(value) && !isArray2(value) && !(value instanceof LazyWrapper)) {
|
|
if (value instanceof LodashWrapper) {
|
|
return value;
|
|
}
|
|
if (hasOwnProperty.call(value, "__wrapped__")) {
|
|
return wrapperClone(value);
|
|
}
|
|
}
|
|
return new LodashWrapper(value);
|
|
}
|
|
var baseCreate = function() {
|
|
function object() {
|
|
}
|
|
return function(proto) {
|
|
if (!isObject(proto)) {
|
|
return {};
|
|
}
|
|
if (objectCreate) {
|
|
return objectCreate(proto);
|
|
}
|
|
object.prototype = proto;
|
|
var result2 = new object();
|
|
object.prototype = undefined2;
|
|
return result2;
|
|
};
|
|
}();
|
|
function baseLodash() {
|
|
}
|
|
function LodashWrapper(value, chainAll) {
|
|
this.__wrapped__ = value;
|
|
this.__actions__ = [];
|
|
this.__chain__ = !!chainAll;
|
|
this.__index__ = 0;
|
|
this.__values__ = undefined2;
|
|
}
|
|
lodash.templateSettings = {
|
|
"escape": reEscape,
|
|
"evaluate": reEvaluate,
|
|
"interpolate": reInterpolate,
|
|
"variable": "",
|
|
"imports": {
|
|
"_": lodash
|
|
}
|
|
};
|
|
lodash.prototype = baseLodash.prototype;
|
|
lodash.prototype.constructor = lodash;
|
|
LodashWrapper.prototype = baseCreate(baseLodash.prototype);
|
|
LodashWrapper.prototype.constructor = LodashWrapper;
|
|
function LazyWrapper(value) {
|
|
this.__wrapped__ = value;
|
|
this.__actions__ = [];
|
|
this.__dir__ = 1;
|
|
this.__filtered__ = false;
|
|
this.__iteratees__ = [];
|
|
this.__takeCount__ = MAX_ARRAY_LENGTH;
|
|
this.__views__ = [];
|
|
}
|
|
function lazyClone() {
|
|
var result2 = new LazyWrapper(this.__wrapped__);
|
|
result2.__actions__ = copyArray(this.__actions__);
|
|
result2.__dir__ = this.__dir__;
|
|
result2.__filtered__ = this.__filtered__;
|
|
result2.__iteratees__ = copyArray(this.__iteratees__);
|
|
result2.__takeCount__ = this.__takeCount__;
|
|
result2.__views__ = copyArray(this.__views__);
|
|
return result2;
|
|
}
|
|
function lazyReverse() {
|
|
if (this.__filtered__) {
|
|
var result2 = new LazyWrapper(this);
|
|
result2.__dir__ = -1;
|
|
result2.__filtered__ = true;
|
|
} else {
|
|
result2 = this.clone();
|
|
result2.__dir__ *= -1;
|
|
}
|
|
return result2;
|
|
}
|
|
function lazyValue() {
|
|
var array = this.__wrapped__.value(), dir = this.__dir__, isArr = isArray2(array), isRight = dir < 0, arrLength = isArr ? array.length : 0, view = getView(0, arrLength, this.__views__), start = view.start, end = view.end, length = end - start, index = isRight ? end : start - 1, iteratees = this.__iteratees__, iterLength = iteratees.length, resIndex = 0, takeCount = nativeMin(length, this.__takeCount__);
|
|
if (!isArr || !isRight && arrLength == length && takeCount == length) {
|
|
return baseWrapperValue(array, this.__actions__);
|
|
}
|
|
var result2 = [];
|
|
outer:
|
|
while (length-- && resIndex < takeCount) {
|
|
index += dir;
|
|
var iterIndex = -1, value = array[index];
|
|
while (++iterIndex < iterLength) {
|
|
var data = iteratees[iterIndex], iteratee2 = data.iteratee, type = data.type, computed = iteratee2(value);
|
|
if (type == LAZY_MAP_FLAG) {
|
|
value = computed;
|
|
} else if (!computed) {
|
|
if (type == LAZY_FILTER_FLAG) {
|
|
continue outer;
|
|
} else {
|
|
break outer;
|
|
}
|
|
}
|
|
}
|
|
result2[resIndex++] = value;
|
|
}
|
|
return result2;
|
|
}
|
|
LazyWrapper.prototype = baseCreate(baseLodash.prototype);
|
|
LazyWrapper.prototype.constructor = LazyWrapper;
|
|
function Hash(entries) {
|
|
var index = -1, length = entries == null ? 0 : entries.length;
|
|
this.clear();
|
|
while (++index < length) {
|
|
var entry = entries[index];
|
|
this.set(entry[0], entry[1]);
|
|
}
|
|
}
|
|
function hashClear() {
|
|
this.__data__ = nativeCreate ? nativeCreate(null) : {};
|
|
this.size = 0;
|
|
}
|
|
function hashDelete(key2) {
|
|
var result2 = this.has(key2) && delete this.__data__[key2];
|
|
this.size -= result2 ? 1 : 0;
|
|
return result2;
|
|
}
|
|
function hashGet(key2) {
|
|
var data = this.__data__;
|
|
if (nativeCreate) {
|
|
var result2 = data[key2];
|
|
return result2 === HASH_UNDEFINED ? undefined2 : result2;
|
|
}
|
|
return hasOwnProperty.call(data, key2) ? data[key2] : undefined2;
|
|
}
|
|
function hashHas(key2) {
|
|
var data = this.__data__;
|
|
return nativeCreate ? data[key2] !== undefined2 : hasOwnProperty.call(data, key2);
|
|
}
|
|
function hashSet(key2, value) {
|
|
var data = this.__data__;
|
|
this.size += this.has(key2) ? 0 : 1;
|
|
data[key2] = nativeCreate && value === undefined2 ? HASH_UNDEFINED : value;
|
|
return this;
|
|
}
|
|
Hash.prototype.clear = hashClear;
|
|
Hash.prototype["delete"] = hashDelete;
|
|
Hash.prototype.get = hashGet;
|
|
Hash.prototype.has = hashHas;
|
|
Hash.prototype.set = hashSet;
|
|
function ListCache(entries) {
|
|
var index = -1, length = entries == null ? 0 : entries.length;
|
|
this.clear();
|
|
while (++index < length) {
|
|
var entry = entries[index];
|
|
this.set(entry[0], entry[1]);
|
|
}
|
|
}
|
|
function listCacheClear() {
|
|
this.__data__ = [];
|
|
this.size = 0;
|
|
}
|
|
function listCacheDelete(key2) {
|
|
var data = this.__data__, index = assocIndexOf(data, key2);
|
|
if (index < 0) {
|
|
return false;
|
|
}
|
|
var lastIndex = data.length - 1;
|
|
if (index == lastIndex) {
|
|
data.pop();
|
|
} else {
|
|
splice.call(data, index, 1);
|
|
}
|
|
--this.size;
|
|
return true;
|
|
}
|
|
function listCacheGet(key2) {
|
|
var data = this.__data__, index = assocIndexOf(data, key2);
|
|
return index < 0 ? undefined2 : data[index][1];
|
|
}
|
|
function listCacheHas(key2) {
|
|
return assocIndexOf(this.__data__, key2) > -1;
|
|
}
|
|
function listCacheSet(key2, value) {
|
|
var data = this.__data__, index = assocIndexOf(data, key2);
|
|
if (index < 0) {
|
|
++this.size;
|
|
data.push([key2, value]);
|
|
} else {
|
|
data[index][1] = value;
|
|
}
|
|
return this;
|
|
}
|
|
ListCache.prototype.clear = listCacheClear;
|
|
ListCache.prototype["delete"] = listCacheDelete;
|
|
ListCache.prototype.get = listCacheGet;
|
|
ListCache.prototype.has = listCacheHas;
|
|
ListCache.prototype.set = listCacheSet;
|
|
function MapCache2(entries) {
|
|
var index = -1, length = entries == null ? 0 : entries.length;
|
|
this.clear();
|
|
while (++index < length) {
|
|
var entry = entries[index];
|
|
this.set(entry[0], entry[1]);
|
|
}
|
|
}
|
|
function mapCacheClear() {
|
|
this.size = 0;
|
|
this.__data__ = {
|
|
"hash": new Hash(),
|
|
"map": new (Map2 || ListCache)(),
|
|
"string": new Hash()
|
|
};
|
|
}
|
|
function mapCacheDelete(key2) {
|
|
var result2 = getMapData(this, key2)["delete"](key2);
|
|
this.size -= result2 ? 1 : 0;
|
|
return result2;
|
|
}
|
|
function mapCacheGet(key2) {
|
|
return getMapData(this, key2).get(key2);
|
|
}
|
|
function mapCacheHas(key2) {
|
|
return getMapData(this, key2).has(key2);
|
|
}
|
|
function mapCacheSet(key2, value) {
|
|
var data = getMapData(this, key2), size2 = data.size;
|
|
data.set(key2, value);
|
|
this.size += data.size == size2 ? 0 : 1;
|
|
return this;
|
|
}
|
|
MapCache2.prototype.clear = mapCacheClear;
|
|
MapCache2.prototype["delete"] = mapCacheDelete;
|
|
MapCache2.prototype.get = mapCacheGet;
|
|
MapCache2.prototype.has = mapCacheHas;
|
|
MapCache2.prototype.set = mapCacheSet;
|
|
function SetCache(values2) {
|
|
var index = -1, length = values2 == null ? 0 : values2.length;
|
|
this.__data__ = new MapCache2();
|
|
while (++index < length) {
|
|
this.add(values2[index]);
|
|
}
|
|
}
|
|
function setCacheAdd(value) {
|
|
this.__data__.set(value, HASH_UNDEFINED);
|
|
return this;
|
|
}
|
|
function setCacheHas(value) {
|
|
return this.__data__.has(value);
|
|
}
|
|
SetCache.prototype.add = SetCache.prototype.push = setCacheAdd;
|
|
SetCache.prototype.has = setCacheHas;
|
|
function Stack(entries) {
|
|
var data = this.__data__ = new ListCache(entries);
|
|
this.size = data.size;
|
|
}
|
|
function stackClear() {
|
|
this.__data__ = new ListCache();
|
|
this.size = 0;
|
|
}
|
|
function stackDelete(key2) {
|
|
var data = this.__data__, result2 = data["delete"](key2);
|
|
this.size = data.size;
|
|
return result2;
|
|
}
|
|
function stackGet(key2) {
|
|
return this.__data__.get(key2);
|
|
}
|
|
function stackHas(key2) {
|
|
return this.__data__.has(key2);
|
|
}
|
|
function stackSet(key2, value) {
|
|
var data = this.__data__;
|
|
if (data instanceof ListCache) {
|
|
var pairs = data.__data__;
|
|
if (!Map2 || pairs.length < LARGE_ARRAY_SIZE - 1) {
|
|
pairs.push([key2, value]);
|
|
this.size = ++data.size;
|
|
return this;
|
|
}
|
|
data = this.__data__ = new MapCache2(pairs);
|
|
}
|
|
data.set(key2, value);
|
|
this.size = data.size;
|
|
return this;
|
|
}
|
|
Stack.prototype.clear = stackClear;
|
|
Stack.prototype["delete"] = stackDelete;
|
|
Stack.prototype.get = stackGet;
|
|
Stack.prototype.has = stackHas;
|
|
Stack.prototype.set = stackSet;
|
|
function arrayLikeKeys(value, inherited) {
|
|
var isArr = isArray2(value), isArg = !isArr && isArguments(value), isBuff = !isArr && !isArg && isBuffer(value), isType = !isArr && !isArg && !isBuff && isTypedArray(value), skipIndexes = isArr || isArg || isBuff || isType, result2 = skipIndexes ? baseTimes(value.length, String2) : [], length = result2.length;
|
|
for (var key2 in value) {
|
|
if ((inherited || hasOwnProperty.call(value, key2)) && !(skipIndexes && (key2 == "length" || isBuff && (key2 == "offset" || key2 == "parent") || isType && (key2 == "buffer" || key2 == "byteLength" || key2 == "byteOffset") || isIndex(key2, length)))) {
|
|
result2.push(key2);
|
|
}
|
|
}
|
|
return result2;
|
|
}
|
|
function arraySample(array) {
|
|
var length = array.length;
|
|
return length ? array[baseRandom(0, length - 1)] : undefined2;
|
|
}
|
|
function arraySampleSize(array, n2) {
|
|
return shuffleSelf(copyArray(array), baseClamp(n2, 0, array.length));
|
|
}
|
|
function arrayShuffle(array) {
|
|
return shuffleSelf(copyArray(array));
|
|
}
|
|
function assignMergeValue(object, key2, value) {
|
|
if (value !== undefined2 && !eq(object[key2], value) || value === undefined2 && !(key2 in object)) {
|
|
baseAssignValue(object, key2, value);
|
|
}
|
|
}
|
|
function assignValue(object, key2, value) {
|
|
var objValue = object[key2];
|
|
if (!(hasOwnProperty.call(object, key2) && eq(objValue, value)) || value === undefined2 && !(key2 in object)) {
|
|
baseAssignValue(object, key2, value);
|
|
}
|
|
}
|
|
function assocIndexOf(array, key2) {
|
|
var length = array.length;
|
|
while (length--) {
|
|
if (eq(array[length][0], key2)) {
|
|
return length;
|
|
}
|
|
}
|
|
return -1;
|
|
}
|
|
function baseAggregator(collection, setter, iteratee2, accumulator) {
|
|
baseEach(collection, function(value, key2, collection2) {
|
|
setter(accumulator, value, iteratee2(value), collection2);
|
|
});
|
|
return accumulator;
|
|
}
|
|
function baseAssign(object, source) {
|
|
return object && copyObject(source, keys(source), object);
|
|
}
|
|
function baseAssignIn(object, source) {
|
|
return object && copyObject(source, keysIn(source), object);
|
|
}
|
|
function baseAssignValue(object, key2, value) {
|
|
if (key2 == "__proto__" && defineProperty) {
|
|
defineProperty(object, key2, {
|
|
"configurable": true,
|
|
"enumerable": true,
|
|
"value": value,
|
|
"writable": true
|
|
});
|
|
} else {
|
|
object[key2] = value;
|
|
}
|
|
}
|
|
function baseAt(object, paths) {
|
|
var index = -1, length = paths.length, result2 = Array2(length), skip = object == null;
|
|
while (++index < length) {
|
|
result2[index] = skip ? undefined2 : get(object, paths[index]);
|
|
}
|
|
return result2;
|
|
}
|
|
function baseClamp(number, lower, upper) {
|
|
if (number === number) {
|
|
if (upper !== undefined2) {
|
|
number = number <= upper ? number : upper;
|
|
}
|
|
if (lower !== undefined2) {
|
|
number = number >= lower ? number : lower;
|
|
}
|
|
}
|
|
return number;
|
|
}
|
|
function baseClone(value, bitmask, customizer, key2, object, stack) {
|
|
var result2, isDeep = bitmask & CLONE_DEEP_FLAG, isFlat = bitmask & CLONE_FLAT_FLAG, isFull = bitmask & CLONE_SYMBOLS_FLAG;
|
|
if (customizer) {
|
|
result2 = object ? customizer(value, key2, object, stack) : customizer(value);
|
|
}
|
|
if (result2 !== undefined2) {
|
|
return result2;
|
|
}
|
|
if (!isObject(value)) {
|
|
return value;
|
|
}
|
|
var isArr = isArray2(value);
|
|
if (isArr) {
|
|
result2 = initCloneArray(value);
|
|
if (!isDeep) {
|
|
return copyArray(value, result2);
|
|
}
|
|
} else {
|
|
var tag = getTag(value), isFunc = tag == funcTag || tag == genTag;
|
|
if (isBuffer(value)) {
|
|
return cloneBuffer(value, isDeep);
|
|
}
|
|
if (tag == objectTag || tag == argsTag || isFunc && !object) {
|
|
result2 = isFlat || isFunc ? {} : initCloneObject(value);
|
|
if (!isDeep) {
|
|
return isFlat ? copySymbolsIn(value, baseAssignIn(result2, value)) : copySymbols(value, baseAssign(result2, value));
|
|
}
|
|
} else {
|
|
if (!cloneableTags[tag]) {
|
|
return object ? value : {};
|
|
}
|
|
result2 = initCloneByTag(value, tag, isDeep);
|
|
}
|
|
}
|
|
stack || (stack = new Stack());
|
|
var stacked = stack.get(value);
|
|
if (stacked) {
|
|
return stacked;
|
|
}
|
|
stack.set(value, result2);
|
|
if (isSet(value)) {
|
|
value.forEach(function(subValue) {
|
|
result2.add(baseClone(subValue, bitmask, customizer, subValue, value, stack));
|
|
});
|
|
} else if (isMap(value)) {
|
|
value.forEach(function(subValue, key3) {
|
|
result2.set(key3, baseClone(subValue, bitmask, customizer, key3, value, stack));
|
|
});
|
|
}
|
|
var keysFunc = isFull ? isFlat ? getAllKeysIn : getAllKeys : isFlat ? keysIn : keys;
|
|
var props2 = isArr ? undefined2 : keysFunc(value);
|
|
arrayEach(props2 || value, function(subValue, key3) {
|
|
if (props2) {
|
|
key3 = subValue;
|
|
subValue = value[key3];
|
|
}
|
|
assignValue(result2, key3, baseClone(subValue, bitmask, customizer, key3, value, stack));
|
|
});
|
|
return result2;
|
|
}
|
|
function baseConforms(source) {
|
|
var props2 = keys(source);
|
|
return function(object) {
|
|
return baseConformsTo(object, source, props2);
|
|
};
|
|
}
|
|
function baseConformsTo(object, source, props2) {
|
|
var length = props2.length;
|
|
if (object == null) {
|
|
return !length;
|
|
}
|
|
object = Object2(object);
|
|
while (length--) {
|
|
var key2 = props2[length], predicate = source[key2], value = object[key2];
|
|
if (value === undefined2 && !(key2 in object) || !predicate(value)) {
|
|
return false;
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
function baseDelay(func, wait, args) {
|
|
if (typeof func != "function") {
|
|
throw new TypeError2(FUNC_ERROR_TEXT);
|
|
}
|
|
return setTimeout2(function() {
|
|
func.apply(undefined2, args);
|
|
}, wait);
|
|
}
|
|
function baseDifference(array, values2, iteratee2, comparator) {
|
|
var index = -1, includes2 = arrayIncludes, isCommon = true, length = array.length, result2 = [], valuesLength = values2.length;
|
|
if (!length) {
|
|
return result2;
|
|
}
|
|
if (iteratee2) {
|
|
values2 = arrayMap(values2, baseUnary(iteratee2));
|
|
}
|
|
if (comparator) {
|
|
includes2 = arrayIncludesWith;
|
|
isCommon = false;
|
|
} else if (values2.length >= LARGE_ARRAY_SIZE) {
|
|
includes2 = cacheHas;
|
|
isCommon = false;
|
|
values2 = new SetCache(values2);
|
|
}
|
|
outer:
|
|
while (++index < length) {
|
|
var value = array[index], computed = iteratee2 == null ? value : iteratee2(value);
|
|
value = comparator || value !== 0 ? value : 0;
|
|
if (isCommon && computed === computed) {
|
|
var valuesIndex = valuesLength;
|
|
while (valuesIndex--) {
|
|
if (values2[valuesIndex] === computed) {
|
|
continue outer;
|
|
}
|
|
}
|
|
result2.push(value);
|
|
} else if (!includes2(values2, computed, comparator)) {
|
|
result2.push(value);
|
|
}
|
|
}
|
|
return result2;
|
|
}
|
|
var baseEach = createBaseEach(baseForOwn);
|
|
var baseEachRight = createBaseEach(baseForOwnRight, true);
|
|
function baseEvery(collection, predicate) {
|
|
var result2 = true;
|
|
baseEach(collection, function(value, index, collection2) {
|
|
result2 = !!predicate(value, index, collection2);
|
|
return result2;
|
|
});
|
|
return result2;
|
|
}
|
|
function baseExtremum(array, iteratee2, comparator) {
|
|
var index = -1, length = array.length;
|
|
while (++index < length) {
|
|
var value = array[index], current = iteratee2(value);
|
|
if (current != null && (computed === undefined2 ? current === current && !isSymbol(current) : comparator(current, computed))) {
|
|
var computed = current, result2 = value;
|
|
}
|
|
}
|
|
return result2;
|
|
}
|
|
function baseFill(array, value, start, end) {
|
|
var length = array.length;
|
|
start = toInteger2(start);
|
|
if (start < 0) {
|
|
start = -start > length ? 0 : length + start;
|
|
}
|
|
end = end === undefined2 || end > length ? length : toInteger2(end);
|
|
if (end < 0) {
|
|
end += length;
|
|
}
|
|
end = start > end ? 0 : toLength(end);
|
|
while (start < end) {
|
|
array[start++] = value;
|
|
}
|
|
return array;
|
|
}
|
|
function baseFilter(collection, predicate) {
|
|
var result2 = [];
|
|
baseEach(collection, function(value, index, collection2) {
|
|
if (predicate(value, index, collection2)) {
|
|
result2.push(value);
|
|
}
|
|
});
|
|
return result2;
|
|
}
|
|
function baseFlatten(array, depth, predicate, isStrict, result2) {
|
|
var index = -1, length = array.length;
|
|
predicate || (predicate = isFlattenable);
|
|
result2 || (result2 = []);
|
|
while (++index < length) {
|
|
var value = array[index];
|
|
if (depth > 0 && predicate(value)) {
|
|
if (depth > 1) {
|
|
baseFlatten(value, depth - 1, predicate, isStrict, result2);
|
|
} else {
|
|
arrayPush(result2, value);
|
|
}
|
|
} else if (!isStrict) {
|
|
result2[result2.length] = value;
|
|
}
|
|
}
|
|
return result2;
|
|
}
|
|
var baseFor = createBaseFor();
|
|
var baseForRight = createBaseFor(true);
|
|
function baseForOwn(object, iteratee2) {
|
|
return object && baseFor(object, iteratee2, keys);
|
|
}
|
|
function baseForOwnRight(object, iteratee2) {
|
|
return object && baseForRight(object, iteratee2, keys);
|
|
}
|
|
function baseFunctions(object, props2) {
|
|
return arrayFilter(props2, function(key2) {
|
|
return isFunction2(object[key2]);
|
|
});
|
|
}
|
|
function baseGet(object, path) {
|
|
path = castPath(path, object);
|
|
var index = 0, length = path.length;
|
|
while (object != null && index < length) {
|
|
object = object[toKey(path[index++])];
|
|
}
|
|
return index && index == length ? object : undefined2;
|
|
}
|
|
function baseGetAllKeys(object, keysFunc, symbolsFunc) {
|
|
var result2 = keysFunc(object);
|
|
return isArray2(object) ? result2 : arrayPush(result2, symbolsFunc(object));
|
|
}
|
|
function baseGetTag(value) {
|
|
if (value == null) {
|
|
return value === undefined2 ? undefinedTag : nullTag;
|
|
}
|
|
return symToStringTag && symToStringTag in Object2(value) ? getRawTag(value) : objectToString(value);
|
|
}
|
|
function baseGt(value, other) {
|
|
return value > other;
|
|
}
|
|
function baseHas(object, key2) {
|
|
return object != null && hasOwnProperty.call(object, key2);
|
|
}
|
|
function baseHasIn(object, key2) {
|
|
return object != null && key2 in Object2(object);
|
|
}
|
|
function baseInRange(number, start, end) {
|
|
return number >= nativeMin(start, end) && number < nativeMax(start, end);
|
|
}
|
|
function baseIntersection(arrays, iteratee2, comparator) {
|
|
var includes2 = comparator ? arrayIncludesWith : arrayIncludes, length = arrays[0].length, othLength = arrays.length, othIndex = othLength, caches = Array2(othLength), maxLength = Infinity, result2 = [];
|
|
while (othIndex--) {
|
|
var array = arrays[othIndex];
|
|
if (othIndex && iteratee2) {
|
|
array = arrayMap(array, baseUnary(iteratee2));
|
|
}
|
|
maxLength = nativeMin(array.length, maxLength);
|
|
caches[othIndex] = !comparator && (iteratee2 || length >= 120 && array.length >= 120) ? new SetCache(othIndex && array) : undefined2;
|
|
}
|
|
array = arrays[0];
|
|
var index = -1, seen = caches[0];
|
|
outer:
|
|
while (++index < length && result2.length < maxLength) {
|
|
var value = array[index], computed = iteratee2 ? iteratee2(value) : value;
|
|
value = comparator || value !== 0 ? value : 0;
|
|
if (!(seen ? cacheHas(seen, computed) : includes2(result2, computed, comparator))) {
|
|
othIndex = othLength;
|
|
while (--othIndex) {
|
|
var cache = caches[othIndex];
|
|
if (!(cache ? cacheHas(cache, computed) : includes2(arrays[othIndex], computed, comparator))) {
|
|
continue outer;
|
|
}
|
|
}
|
|
if (seen) {
|
|
seen.push(computed);
|
|
}
|
|
result2.push(value);
|
|
}
|
|
}
|
|
return result2;
|
|
}
|
|
function baseInverter(object, setter, iteratee2, accumulator) {
|
|
baseForOwn(object, function(value, key2, object2) {
|
|
setter(accumulator, iteratee2(value), key2, object2);
|
|
});
|
|
return accumulator;
|
|
}
|
|
function baseInvoke(object, path, args) {
|
|
path = castPath(path, object);
|
|
object = parent(object, path);
|
|
var func = object == null ? object : object[toKey(last(path))];
|
|
return func == null ? undefined2 : apply(func, object, args);
|
|
}
|
|
function baseIsArguments(value) {
|
|
return isObjectLike(value) && baseGetTag(value) == argsTag;
|
|
}
|
|
function baseIsArrayBuffer(value) {
|
|
return isObjectLike(value) && baseGetTag(value) == arrayBufferTag;
|
|
}
|
|
function baseIsDate(value) {
|
|
return isObjectLike(value) && baseGetTag(value) == dateTag;
|
|
}
|
|
function baseIsEqual(value, other, bitmask, customizer, stack) {
|
|
if (value === other) {
|
|
return true;
|
|
}
|
|
if (value == null || other == null || !isObjectLike(value) && !isObjectLike(other)) {
|
|
return value !== value && other !== other;
|
|
}
|
|
return baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack);
|
|
}
|
|
function baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) {
|
|
var objIsArr = isArray2(object), othIsArr = isArray2(other), objTag = objIsArr ? arrayTag : getTag(object), othTag = othIsArr ? arrayTag : getTag(other);
|
|
objTag = objTag == argsTag ? objectTag : objTag;
|
|
othTag = othTag == argsTag ? objectTag : othTag;
|
|
var objIsObj = objTag == objectTag, othIsObj = othTag == objectTag, isSameTag = objTag == othTag;
|
|
if (isSameTag && isBuffer(object)) {
|
|
if (!isBuffer(other)) {
|
|
return false;
|
|
}
|
|
objIsArr = true;
|
|
objIsObj = false;
|
|
}
|
|
if (isSameTag && !objIsObj) {
|
|
stack || (stack = new Stack());
|
|
return objIsArr || isTypedArray(object) ? equalArrays(object, other, bitmask, customizer, equalFunc, stack) : equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack);
|
|
}
|
|
if (!(bitmask & COMPARE_PARTIAL_FLAG)) {
|
|
var objIsWrapped = objIsObj && hasOwnProperty.call(object, "__wrapped__"), othIsWrapped = othIsObj && hasOwnProperty.call(other, "__wrapped__");
|
|
if (objIsWrapped || othIsWrapped) {
|
|
var objUnwrapped = objIsWrapped ? object.value() : object, othUnwrapped = othIsWrapped ? other.value() : other;
|
|
stack || (stack = new Stack());
|
|
return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack);
|
|
}
|
|
}
|
|
if (!isSameTag) {
|
|
return false;
|
|
}
|
|
stack || (stack = new Stack());
|
|
return equalObjects(object, other, bitmask, customizer, equalFunc, stack);
|
|
}
|
|
function baseIsMap(value) {
|
|
return isObjectLike(value) && getTag(value) == mapTag;
|
|
}
|
|
function baseIsMatch(object, source, matchData, customizer) {
|
|
var index = matchData.length, length = index, noCustomizer = !customizer;
|
|
if (object == null) {
|
|
return !length;
|
|
}
|
|
object = Object2(object);
|
|
while (index--) {
|
|
var data = matchData[index];
|
|
if (noCustomizer && data[2] ? data[1] !== object[data[0]] : !(data[0] in object)) {
|
|
return false;
|
|
}
|
|
}
|
|
while (++index < length) {
|
|
data = matchData[index];
|
|
var key2 = data[0], objValue = object[key2], srcValue = data[1];
|
|
if (noCustomizer && data[2]) {
|
|
if (objValue === undefined2 && !(key2 in object)) {
|
|
return false;
|
|
}
|
|
} else {
|
|
var stack = new Stack();
|
|
if (customizer) {
|
|
var result2 = customizer(objValue, srcValue, key2, object, source, stack);
|
|
}
|
|
if (!(result2 === undefined2 ? baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG, customizer, stack) : result2)) {
|
|
return false;
|
|
}
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
function baseIsNative(value) {
|
|
if (!isObject(value) || isMasked(value)) {
|
|
return false;
|
|
}
|
|
var pattern = isFunction2(value) ? reIsNative : reIsHostCtor;
|
|
return pattern.test(toSource(value));
|
|
}
|
|
function baseIsRegExp(value) {
|
|
return isObjectLike(value) && baseGetTag(value) == regexpTag;
|
|
}
|
|
function baseIsSet(value) {
|
|
return isObjectLike(value) && getTag(value) == setTag;
|
|
}
|
|
function baseIsTypedArray(value) {
|
|
return isObjectLike(value) && isLength(value.length) && !!typedArrayTags[baseGetTag(value)];
|
|
}
|
|
function baseIteratee(value) {
|
|
if (typeof value == "function") {
|
|
return value;
|
|
}
|
|
if (value == null) {
|
|
return identity;
|
|
}
|
|
if (typeof value == "object") {
|
|
return isArray2(value) ? baseMatchesProperty(value[0], value[1]) : baseMatches(value);
|
|
}
|
|
return property(value);
|
|
}
|
|
function baseKeys(object) {
|
|
if (!isPrototype(object)) {
|
|
return nativeKeys(object);
|
|
}
|
|
var result2 = [];
|
|
for (var key2 in Object2(object)) {
|
|
if (hasOwnProperty.call(object, key2) && key2 != "constructor") {
|
|
result2.push(key2);
|
|
}
|
|
}
|
|
return result2;
|
|
}
|
|
function baseKeysIn(object) {
|
|
if (!isObject(object)) {
|
|
return nativeKeysIn(object);
|
|
}
|
|
var isProto = isPrototype(object), result2 = [];
|
|
for (var key2 in object) {
|
|
if (!(key2 == "constructor" && (isProto || !hasOwnProperty.call(object, key2)))) {
|
|
result2.push(key2);
|
|
}
|
|
}
|
|
return result2;
|
|
}
|
|
function baseLt(value, other) {
|
|
return value < other;
|
|
}
|
|
function baseMap(collection, iteratee2) {
|
|
var index = -1, result2 = isArrayLike(collection) ? Array2(collection.length) : [];
|
|
baseEach(collection, function(value, key2, collection2) {
|
|
result2[++index] = iteratee2(value, key2, collection2);
|
|
});
|
|
return result2;
|
|
}
|
|
function baseMatches(source) {
|
|
var matchData = getMatchData(source);
|
|
if (matchData.length == 1 && matchData[0][2]) {
|
|
return matchesStrictComparable(matchData[0][0], matchData[0][1]);
|
|
}
|
|
return function(object) {
|
|
return object === source || baseIsMatch(object, source, matchData);
|
|
};
|
|
}
|
|
function baseMatchesProperty(path, srcValue) {
|
|
if (isKey(path) && isStrictComparable(srcValue)) {
|
|
return matchesStrictComparable(toKey(path), srcValue);
|
|
}
|
|
return function(object) {
|
|
var objValue = get(object, path);
|
|
return objValue === undefined2 && objValue === srcValue ? hasIn(object, path) : baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG);
|
|
};
|
|
}
|
|
function baseMerge(object, source, srcIndex, customizer, stack) {
|
|
if (object === source) {
|
|
return;
|
|
}
|
|
baseFor(source, function(srcValue, key2) {
|
|
stack || (stack = new Stack());
|
|
if (isObject(srcValue)) {
|
|
baseMergeDeep(object, source, key2, srcIndex, baseMerge, customizer, stack);
|
|
} else {
|
|
var newValue = customizer ? customizer(safeGet(object, key2), srcValue, key2 + "", object, source, stack) : undefined2;
|
|
if (newValue === undefined2) {
|
|
newValue = srcValue;
|
|
}
|
|
assignMergeValue(object, key2, newValue);
|
|
}
|
|
}, keysIn);
|
|
}
|
|
function baseMergeDeep(object, source, key2, srcIndex, mergeFunc, customizer, stack) {
|
|
var objValue = safeGet(object, key2), srcValue = safeGet(source, key2), stacked = stack.get(srcValue);
|
|
if (stacked) {
|
|
assignMergeValue(object, key2, stacked);
|
|
return;
|
|
}
|
|
var newValue = customizer ? customizer(objValue, srcValue, key2 + "", object, source, stack) : undefined2;
|
|
var isCommon = newValue === undefined2;
|
|
if (isCommon) {
|
|
var isArr = isArray2(srcValue), isBuff = !isArr && isBuffer(srcValue), isTyped = !isArr && !isBuff && isTypedArray(srcValue);
|
|
newValue = srcValue;
|
|
if (isArr || isBuff || isTyped) {
|
|
if (isArray2(objValue)) {
|
|
newValue = objValue;
|
|
} else if (isArrayLikeObject(objValue)) {
|
|
newValue = copyArray(objValue);
|
|
} else if (isBuff) {
|
|
isCommon = false;
|
|
newValue = cloneBuffer(srcValue, true);
|
|
} else if (isTyped) {
|
|
isCommon = false;
|
|
newValue = cloneTypedArray(srcValue, true);
|
|
} else {
|
|
newValue = [];
|
|
}
|
|
} else if (isPlainObject(srcValue) || isArguments(srcValue)) {
|
|
newValue = objValue;
|
|
if (isArguments(objValue)) {
|
|
newValue = toPlainObject(objValue);
|
|
} else if (!isObject(objValue) || isFunction2(objValue)) {
|
|
newValue = initCloneObject(srcValue);
|
|
}
|
|
} else {
|
|
isCommon = false;
|
|
}
|
|
}
|
|
if (isCommon) {
|
|
stack.set(srcValue, newValue);
|
|
mergeFunc(newValue, srcValue, srcIndex, customizer, stack);
|
|
stack["delete"](srcValue);
|
|
}
|
|
assignMergeValue(object, key2, newValue);
|
|
}
|
|
function baseNth(array, n2) {
|
|
var length = array.length;
|
|
if (!length) {
|
|
return;
|
|
}
|
|
n2 += n2 < 0 ? length : 0;
|
|
return isIndex(n2, length) ? array[n2] : undefined2;
|
|
}
|
|
function baseOrderBy(collection, iteratees, orders) {
|
|
if (iteratees.length) {
|
|
iteratees = arrayMap(iteratees, function(iteratee2) {
|
|
if (isArray2(iteratee2)) {
|
|
return function(value) {
|
|
return baseGet(value, iteratee2.length === 1 ? iteratee2[0] : iteratee2);
|
|
};
|
|
}
|
|
return iteratee2;
|
|
});
|
|
} else {
|
|
iteratees = [identity];
|
|
}
|
|
var index = -1;
|
|
iteratees = arrayMap(iteratees, baseUnary(getIteratee()));
|
|
var result2 = baseMap(collection, function(value, key2, collection2) {
|
|
var criteria = arrayMap(iteratees, function(iteratee2) {
|
|
return iteratee2(value);
|
|
});
|
|
return { "criteria": criteria, "index": ++index, "value": value };
|
|
});
|
|
return baseSortBy(result2, function(object, other) {
|
|
return compareMultiple(object, other, orders);
|
|
});
|
|
}
|
|
function basePick(object, paths) {
|
|
return basePickBy(object, paths, function(value, path) {
|
|
return hasIn(object, path);
|
|
});
|
|
}
|
|
function basePickBy(object, paths, predicate) {
|
|
var index = -1, length = paths.length, result2 = {};
|
|
while (++index < length) {
|
|
var path = paths[index], value = baseGet(object, path);
|
|
if (predicate(value, path)) {
|
|
baseSet(result2, castPath(path, object), value);
|
|
}
|
|
}
|
|
return result2;
|
|
}
|
|
function basePropertyDeep(path) {
|
|
return function(object) {
|
|
return baseGet(object, path);
|
|
};
|
|
}
|
|
function basePullAll(array, values2, iteratee2, comparator) {
|
|
var indexOf2 = comparator ? baseIndexOfWith : baseIndexOf, index = -1, length = values2.length, seen = array;
|
|
if (array === values2) {
|
|
values2 = copyArray(values2);
|
|
}
|
|
if (iteratee2) {
|
|
seen = arrayMap(array, baseUnary(iteratee2));
|
|
}
|
|
while (++index < length) {
|
|
var fromIndex = 0, value = values2[index], computed = iteratee2 ? iteratee2(value) : value;
|
|
while ((fromIndex = indexOf2(seen, computed, fromIndex, comparator)) > -1) {
|
|
if (seen !== array) {
|
|
splice.call(seen, fromIndex, 1);
|
|
}
|
|
splice.call(array, fromIndex, 1);
|
|
}
|
|
}
|
|
return array;
|
|
}
|
|
function basePullAt(array, indexes) {
|
|
var length = array ? indexes.length : 0, lastIndex = length - 1;
|
|
while (length--) {
|
|
var index = indexes[length];
|
|
if (length == lastIndex || index !== previous) {
|
|
var previous = index;
|
|
if (isIndex(index)) {
|
|
splice.call(array, index, 1);
|
|
} else {
|
|
baseUnset(array, index);
|
|
}
|
|
}
|
|
}
|
|
return array;
|
|
}
|
|
function baseRandom(lower, upper) {
|
|
return lower + nativeFloor(nativeRandom() * (upper - lower + 1));
|
|
}
|
|
function baseRange(start, end, step, fromRight) {
|
|
var index = -1, length = nativeMax(nativeCeil((end - start) / (step || 1)), 0), result2 = Array2(length);
|
|
while (length--) {
|
|
result2[fromRight ? length : ++index] = start;
|
|
start += step;
|
|
}
|
|
return result2;
|
|
}
|
|
function baseRepeat(string, n2) {
|
|
var result2 = "";
|
|
if (!string || n2 < 1 || n2 > MAX_SAFE_INTEGER) {
|
|
return result2;
|
|
}
|
|
do {
|
|
if (n2 % 2) {
|
|
result2 += string;
|
|
}
|
|
n2 = nativeFloor(n2 / 2);
|
|
if (n2) {
|
|
string += string;
|
|
}
|
|
} while (n2);
|
|
return result2;
|
|
}
|
|
function baseRest(func, start) {
|
|
return setToString(overRest(func, start, identity), func + "");
|
|
}
|
|
function baseSample(collection) {
|
|
return arraySample(values(collection));
|
|
}
|
|
function baseSampleSize(collection, n2) {
|
|
var array = values(collection);
|
|
return shuffleSelf(array, baseClamp(n2, 0, array.length));
|
|
}
|
|
function baseSet(object, path, value, customizer) {
|
|
if (!isObject(object)) {
|
|
return object;
|
|
}
|
|
path = castPath(path, object);
|
|
var index = -1, length = path.length, lastIndex = length - 1, nested = object;
|
|
while (nested != null && ++index < length) {
|
|
var key2 = toKey(path[index]), newValue = value;
|
|
if (key2 === "__proto__" || key2 === "constructor" || key2 === "prototype") {
|
|
return object;
|
|
}
|
|
if (index != lastIndex) {
|
|
var objValue = nested[key2];
|
|
newValue = customizer ? customizer(objValue, key2, nested) : undefined2;
|
|
if (newValue === undefined2) {
|
|
newValue = isObject(objValue) ? objValue : isIndex(path[index + 1]) ? [] : {};
|
|
}
|
|
}
|
|
assignValue(nested, key2, newValue);
|
|
nested = nested[key2];
|
|
}
|
|
return object;
|
|
}
|
|
var baseSetData = !metaMap ? identity : function(func, data) {
|
|
metaMap.set(func, data);
|
|
return func;
|
|
};
|
|
var baseSetToString = !defineProperty ? identity : function(func, string) {
|
|
return defineProperty(func, "toString", {
|
|
"configurable": true,
|
|
"enumerable": false,
|
|
"value": constant(string),
|
|
"writable": true
|
|
});
|
|
};
|
|
function baseShuffle(collection) {
|
|
return shuffleSelf(values(collection));
|
|
}
|
|
function baseSlice(array, start, end) {
|
|
var index = -1, length = array.length;
|
|
if (start < 0) {
|
|
start = -start > length ? 0 : length + start;
|
|
}
|
|
end = end > length ? length : end;
|
|
if (end < 0) {
|
|
end += length;
|
|
}
|
|
length = start > end ? 0 : end - start >>> 0;
|
|
start >>>= 0;
|
|
var result2 = Array2(length);
|
|
while (++index < length) {
|
|
result2[index] = array[index + start];
|
|
}
|
|
return result2;
|
|
}
|
|
function baseSome(collection, predicate) {
|
|
var result2;
|
|
baseEach(collection, function(value, index, collection2) {
|
|
result2 = predicate(value, index, collection2);
|
|
return !result2;
|
|
});
|
|
return !!result2;
|
|
}
|
|
function baseSortedIndex(array, value, retHighest) {
|
|
var low = 0, high = array == null ? low : array.length;
|
|
if (typeof value == "number" && value === value && high <= HALF_MAX_ARRAY_LENGTH) {
|
|
while (low < high) {
|
|
var mid = low + high >>> 1, computed = array[mid];
|
|
if (computed !== null && !isSymbol(computed) && (retHighest ? computed <= value : computed < value)) {
|
|
low = mid + 1;
|
|
} else {
|
|
high = mid;
|
|
}
|
|
}
|
|
return high;
|
|
}
|
|
return baseSortedIndexBy(array, value, identity, retHighest);
|
|
}
|
|
function baseSortedIndexBy(array, value, iteratee2, retHighest) {
|
|
var low = 0, high = array == null ? 0 : array.length;
|
|
if (high === 0) {
|
|
return 0;
|
|
}
|
|
value = iteratee2(value);
|
|
var valIsNaN = value !== value, valIsNull = value === null, valIsSymbol = isSymbol(value), valIsUndefined = value === undefined2;
|
|
while (low < high) {
|
|
var mid = nativeFloor((low + high) / 2), computed = iteratee2(array[mid]), othIsDefined = computed !== undefined2, othIsNull = computed === null, othIsReflexive = computed === computed, othIsSymbol = isSymbol(computed);
|
|
if (valIsNaN) {
|
|
var setLow = retHighest || othIsReflexive;
|
|
} else if (valIsUndefined) {
|
|
setLow = othIsReflexive && (retHighest || othIsDefined);
|
|
} else if (valIsNull) {
|
|
setLow = othIsReflexive && othIsDefined && (retHighest || !othIsNull);
|
|
} else if (valIsSymbol) {
|
|
setLow = othIsReflexive && othIsDefined && !othIsNull && (retHighest || !othIsSymbol);
|
|
} else if (othIsNull || othIsSymbol) {
|
|
setLow = false;
|
|
} else {
|
|
setLow = retHighest ? computed <= value : computed < value;
|
|
}
|
|
if (setLow) {
|
|
low = mid + 1;
|
|
} else {
|
|
high = mid;
|
|
}
|
|
}
|
|
return nativeMin(high, MAX_ARRAY_INDEX);
|
|
}
|
|
function baseSortedUniq(array, iteratee2) {
|
|
var index = -1, length = array.length, resIndex = 0, result2 = [];
|
|
while (++index < length) {
|
|
var value = array[index], computed = iteratee2 ? iteratee2(value) : value;
|
|
if (!index || !eq(computed, seen)) {
|
|
var seen = computed;
|
|
result2[resIndex++] = value === 0 ? 0 : value;
|
|
}
|
|
}
|
|
return result2;
|
|
}
|
|
function baseToNumber(value) {
|
|
if (typeof value == "number") {
|
|
return value;
|
|
}
|
|
if (isSymbol(value)) {
|
|
return NAN;
|
|
}
|
|
return +value;
|
|
}
|
|
function baseToString(value) {
|
|
if (typeof value == "string") {
|
|
return value;
|
|
}
|
|
if (isArray2(value)) {
|
|
return arrayMap(value, baseToString) + "";
|
|
}
|
|
if (isSymbol(value)) {
|
|
return symbolToString ? symbolToString.call(value) : "";
|
|
}
|
|
var result2 = value + "";
|
|
return result2 == "0" && 1 / value == -INFINITY ? "-0" : result2;
|
|
}
|
|
function baseUniq(array, iteratee2, comparator) {
|
|
var index = -1, includes2 = arrayIncludes, length = array.length, isCommon = true, result2 = [], seen = result2;
|
|
if (comparator) {
|
|
isCommon = false;
|
|
includes2 = arrayIncludesWith;
|
|
} else if (length >= LARGE_ARRAY_SIZE) {
|
|
var set2 = iteratee2 ? null : createSet(array);
|
|
if (set2) {
|
|
return setToArray(set2);
|
|
}
|
|
isCommon = false;
|
|
includes2 = cacheHas;
|
|
seen = new SetCache();
|
|
} else {
|
|
seen = iteratee2 ? [] : result2;
|
|
}
|
|
outer:
|
|
while (++index < length) {
|
|
var value = array[index], computed = iteratee2 ? iteratee2(value) : value;
|
|
value = comparator || value !== 0 ? value : 0;
|
|
if (isCommon && computed === computed) {
|
|
var seenIndex = seen.length;
|
|
while (seenIndex--) {
|
|
if (seen[seenIndex] === computed) {
|
|
continue outer;
|
|
}
|
|
}
|
|
if (iteratee2) {
|
|
seen.push(computed);
|
|
}
|
|
result2.push(value);
|
|
} else if (!includes2(seen, computed, comparator)) {
|
|
if (seen !== result2) {
|
|
seen.push(computed);
|
|
}
|
|
result2.push(value);
|
|
}
|
|
}
|
|
return result2;
|
|
}
|
|
function baseUnset(object, path) {
|
|
path = castPath(path, object);
|
|
object = parent(object, path);
|
|
return object == null || delete object[toKey(last(path))];
|
|
}
|
|
function baseUpdate(object, path, updater, customizer) {
|
|
return baseSet(object, path, updater(baseGet(object, path)), customizer);
|
|
}
|
|
function baseWhile(array, predicate, isDrop, fromRight) {
|
|
var length = array.length, index = fromRight ? length : -1;
|
|
while ((fromRight ? index-- : ++index < length) && predicate(array[index], index, array)) {
|
|
}
|
|
return isDrop ? baseSlice(array, fromRight ? 0 : index, fromRight ? index + 1 : length) : baseSlice(array, fromRight ? index + 1 : 0, fromRight ? length : index);
|
|
}
|
|
function baseWrapperValue(value, actions) {
|
|
var result2 = value;
|
|
if (result2 instanceof LazyWrapper) {
|
|
result2 = result2.value();
|
|
}
|
|
return arrayReduce(actions, function(result3, action) {
|
|
return action.func.apply(action.thisArg, arrayPush([result3], action.args));
|
|
}, result2);
|
|
}
|
|
function baseXor(arrays, iteratee2, comparator) {
|
|
var length = arrays.length;
|
|
if (length < 2) {
|
|
return length ? baseUniq(arrays[0]) : [];
|
|
}
|
|
var index = -1, result2 = Array2(length);
|
|
while (++index < length) {
|
|
var array = arrays[index], othIndex = -1;
|
|
while (++othIndex < length) {
|
|
if (othIndex != index) {
|
|
result2[index] = baseDifference(result2[index] || array, arrays[othIndex], iteratee2, comparator);
|
|
}
|
|
}
|
|
}
|
|
return baseUniq(baseFlatten(result2, 1), iteratee2, comparator);
|
|
}
|
|
function baseZipObject(props2, values2, assignFunc) {
|
|
var index = -1, length = props2.length, valsLength = values2.length, result2 = {};
|
|
while (++index < length) {
|
|
var value = index < valsLength ? values2[index] : undefined2;
|
|
assignFunc(result2, props2[index], value);
|
|
}
|
|
return result2;
|
|
}
|
|
function castArrayLikeObject(value) {
|
|
return isArrayLikeObject(value) ? value : [];
|
|
}
|
|
function castFunction(value) {
|
|
return typeof value == "function" ? value : identity;
|
|
}
|
|
function castPath(value, object) {
|
|
if (isArray2(value)) {
|
|
return value;
|
|
}
|
|
return isKey(value, object) ? [value] : stringToPath(toString2(value));
|
|
}
|
|
var castRest = baseRest;
|
|
function castSlice(array, start, end) {
|
|
var length = array.length;
|
|
end = end === undefined2 ? length : end;
|
|
return !start && end >= length ? array : baseSlice(array, start, end);
|
|
}
|
|
var clearTimeout2 = ctxClearTimeout || function(id2) {
|
|
return root.clearTimeout(id2);
|
|
};
|
|
function cloneBuffer(buffer, isDeep) {
|
|
if (isDeep) {
|
|
return buffer.slice();
|
|
}
|
|
var length = buffer.length, result2 = allocUnsafe ? allocUnsafe(length) : new buffer.constructor(length);
|
|
buffer.copy(result2);
|
|
return result2;
|
|
}
|
|
function cloneArrayBuffer(arrayBuffer) {
|
|
var result2 = new arrayBuffer.constructor(arrayBuffer.byteLength);
|
|
new Uint8Array2(result2).set(new Uint8Array2(arrayBuffer));
|
|
return result2;
|
|
}
|
|
function cloneDataView(dataView, isDeep) {
|
|
var buffer = isDeep ? cloneArrayBuffer(dataView.buffer) : dataView.buffer;
|
|
return new dataView.constructor(buffer, dataView.byteOffset, dataView.byteLength);
|
|
}
|
|
function cloneRegExp(regexp) {
|
|
var result2 = new regexp.constructor(regexp.source, reFlags.exec(regexp));
|
|
result2.lastIndex = regexp.lastIndex;
|
|
return result2;
|
|
}
|
|
function cloneSymbol(symbol) {
|
|
return symbolValueOf ? Object2(symbolValueOf.call(symbol)) : {};
|
|
}
|
|
function cloneTypedArray(typedArray, isDeep) {
|
|
var buffer = isDeep ? cloneArrayBuffer(typedArray.buffer) : typedArray.buffer;
|
|
return new typedArray.constructor(buffer, typedArray.byteOffset, typedArray.length);
|
|
}
|
|
function compareAscending(value, other) {
|
|
if (value !== other) {
|
|
var valIsDefined = value !== undefined2, valIsNull = value === null, valIsReflexive = value === value, valIsSymbol = isSymbol(value);
|
|
var othIsDefined = other !== undefined2, othIsNull = other === null, othIsReflexive = other === other, othIsSymbol = isSymbol(other);
|
|
if (!othIsNull && !othIsSymbol && !valIsSymbol && value > other || valIsSymbol && othIsDefined && othIsReflexive && !othIsNull && !othIsSymbol || valIsNull && othIsDefined && othIsReflexive || !valIsDefined && othIsReflexive || !valIsReflexive) {
|
|
return 1;
|
|
}
|
|
if (!valIsNull && !valIsSymbol && !othIsSymbol && value < other || othIsSymbol && valIsDefined && valIsReflexive && !valIsNull && !valIsSymbol || othIsNull && valIsDefined && valIsReflexive || !othIsDefined && valIsReflexive || !othIsReflexive) {
|
|
return -1;
|
|
}
|
|
}
|
|
return 0;
|
|
}
|
|
function compareMultiple(object, other, orders) {
|
|
var index = -1, objCriteria = object.criteria, othCriteria = other.criteria, length = objCriteria.length, ordersLength = orders.length;
|
|
while (++index < length) {
|
|
var result2 = compareAscending(objCriteria[index], othCriteria[index]);
|
|
if (result2) {
|
|
if (index >= ordersLength) {
|
|
return result2;
|
|
}
|
|
var order = orders[index];
|
|
return result2 * (order == "desc" ? -1 : 1);
|
|
}
|
|
}
|
|
return object.index - other.index;
|
|
}
|
|
function composeArgs(args, partials, holders, isCurried) {
|
|
var argsIndex = -1, argsLength = args.length, holdersLength = holders.length, leftIndex = -1, leftLength = partials.length, rangeLength = nativeMax(argsLength - holdersLength, 0), result2 = Array2(leftLength + rangeLength), isUncurried = !isCurried;
|
|
while (++leftIndex < leftLength) {
|
|
result2[leftIndex] = partials[leftIndex];
|
|
}
|
|
while (++argsIndex < holdersLength) {
|
|
if (isUncurried || argsIndex < argsLength) {
|
|
result2[holders[argsIndex]] = args[argsIndex];
|
|
}
|
|
}
|
|
while (rangeLength--) {
|
|
result2[leftIndex++] = args[argsIndex++];
|
|
}
|
|
return result2;
|
|
}
|
|
function composeArgsRight(args, partials, holders, isCurried) {
|
|
var argsIndex = -1, argsLength = args.length, holdersIndex = -1, holdersLength = holders.length, rightIndex = -1, rightLength = partials.length, rangeLength = nativeMax(argsLength - holdersLength, 0), result2 = Array2(rangeLength + rightLength), isUncurried = !isCurried;
|
|
while (++argsIndex < rangeLength) {
|
|
result2[argsIndex] = args[argsIndex];
|
|
}
|
|
var offset = argsIndex;
|
|
while (++rightIndex < rightLength) {
|
|
result2[offset + rightIndex] = partials[rightIndex];
|
|
}
|
|
while (++holdersIndex < holdersLength) {
|
|
if (isUncurried || argsIndex < argsLength) {
|
|
result2[offset + holders[holdersIndex]] = args[argsIndex++];
|
|
}
|
|
}
|
|
return result2;
|
|
}
|
|
function copyArray(source, array) {
|
|
var index = -1, length = source.length;
|
|
array || (array = Array2(length));
|
|
while (++index < length) {
|
|
array[index] = source[index];
|
|
}
|
|
return array;
|
|
}
|
|
function copyObject(source, props2, object, customizer) {
|
|
var isNew = !object;
|
|
object || (object = {});
|
|
var index = -1, length = props2.length;
|
|
while (++index < length) {
|
|
var key2 = props2[index];
|
|
var newValue = customizer ? customizer(object[key2], source[key2], key2, object, source) : undefined2;
|
|
if (newValue === undefined2) {
|
|
newValue = source[key2];
|
|
}
|
|
if (isNew) {
|
|
baseAssignValue(object, key2, newValue);
|
|
} else {
|
|
assignValue(object, key2, newValue);
|
|
}
|
|
}
|
|
return object;
|
|
}
|
|
function copySymbols(source, object) {
|
|
return copyObject(source, getSymbols(source), object);
|
|
}
|
|
function copySymbolsIn(source, object) {
|
|
return copyObject(source, getSymbolsIn(source), object);
|
|
}
|
|
function createAggregator(setter, initializer) {
|
|
return function(collection, iteratee2) {
|
|
var func = isArray2(collection) ? arrayAggregator : baseAggregator, accumulator = initializer ? initializer() : {};
|
|
return func(collection, setter, getIteratee(iteratee2, 2), accumulator);
|
|
};
|
|
}
|
|
function createAssigner(assigner) {
|
|
return baseRest(function(object, sources) {
|
|
var index = -1, length = sources.length, customizer = length > 1 ? sources[length - 1] : undefined2, guard = length > 2 ? sources[2] : undefined2;
|
|
customizer = assigner.length > 3 && typeof customizer == "function" ? (length--, customizer) : undefined2;
|
|
if (guard && isIterateeCall(sources[0], sources[1], guard)) {
|
|
customizer = length < 3 ? undefined2 : customizer;
|
|
length = 1;
|
|
}
|
|
object = Object2(object);
|
|
while (++index < length) {
|
|
var source = sources[index];
|
|
if (source) {
|
|
assigner(object, source, index, customizer);
|
|
}
|
|
}
|
|
return object;
|
|
});
|
|
}
|
|
function createBaseEach(eachFunc, fromRight) {
|
|
return function(collection, iteratee2) {
|
|
if (collection == null) {
|
|
return collection;
|
|
}
|
|
if (!isArrayLike(collection)) {
|
|
return eachFunc(collection, iteratee2);
|
|
}
|
|
var length = collection.length, index = fromRight ? length : -1, iterable = Object2(collection);
|
|
while (fromRight ? index-- : ++index < length) {
|
|
if (iteratee2(iterable[index], index, iterable) === false) {
|
|
break;
|
|
}
|
|
}
|
|
return collection;
|
|
};
|
|
}
|
|
function createBaseFor(fromRight) {
|
|
return function(object, iteratee2, keysFunc) {
|
|
var index = -1, iterable = Object2(object), props2 = keysFunc(object), length = props2.length;
|
|
while (length--) {
|
|
var key2 = props2[fromRight ? length : ++index];
|
|
if (iteratee2(iterable[key2], key2, iterable) === false) {
|
|
break;
|
|
}
|
|
}
|
|
return object;
|
|
};
|
|
}
|
|
function createBind(func, bitmask, thisArg) {
|
|
var isBind = bitmask & WRAP_BIND_FLAG, Ctor = createCtor(func);
|
|
function wrapper() {
|
|
var fn2 = this && this !== root && this instanceof wrapper ? Ctor : func;
|
|
return fn2.apply(isBind ? thisArg : this, arguments);
|
|
}
|
|
return wrapper;
|
|
}
|
|
function createCaseFirst(methodName) {
|
|
return function(string) {
|
|
string = toString2(string);
|
|
var strSymbols = hasUnicode(string) ? stringToArray(string) : undefined2;
|
|
var chr = strSymbols ? strSymbols[0] : string.charAt(0);
|
|
var trailing = strSymbols ? castSlice(strSymbols, 1).join("") : string.slice(1);
|
|
return chr[methodName]() + trailing;
|
|
};
|
|
}
|
|
function createCompounder(callback) {
|
|
return function(string) {
|
|
return arrayReduce(words(deburr(string).replace(reApos, "")), callback, "");
|
|
};
|
|
}
|
|
function createCtor(Ctor) {
|
|
return function() {
|
|
var args = arguments;
|
|
switch (args.length) {
|
|
case 0:
|
|
return new Ctor();
|
|
case 1:
|
|
return new Ctor(args[0]);
|
|
case 2:
|
|
return new Ctor(args[0], args[1]);
|
|
case 3:
|
|
return new Ctor(args[0], args[1], args[2]);
|
|
case 4:
|
|
return new Ctor(args[0], args[1], args[2], args[3]);
|
|
case 5:
|
|
return new Ctor(args[0], args[1], args[2], args[3], args[4]);
|
|
case 6:
|
|
return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5]);
|
|
case 7:
|
|
return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5], args[6]);
|
|
}
|
|
var thisBinding = baseCreate(Ctor.prototype), result2 = Ctor.apply(thisBinding, args);
|
|
return isObject(result2) ? result2 : thisBinding;
|
|
};
|
|
}
|
|
function createCurry(func, bitmask, arity) {
|
|
var Ctor = createCtor(func);
|
|
function wrapper() {
|
|
var length = arguments.length, args = Array2(length), index = length, placeholder2 = getHolder(wrapper);
|
|
while (index--) {
|
|
args[index] = arguments[index];
|
|
}
|
|
var holders = length < 3 && args[0] !== placeholder2 && args[length - 1] !== placeholder2 ? [] : replaceHolders(args, placeholder2);
|
|
length -= holders.length;
|
|
if (length < arity) {
|
|
return createRecurry(
|
|
func,
|
|
bitmask,
|
|
createHybrid,
|
|
wrapper.placeholder,
|
|
undefined2,
|
|
args,
|
|
holders,
|
|
undefined2,
|
|
undefined2,
|
|
arity - length
|
|
);
|
|
}
|
|
var fn2 = this && this !== root && this instanceof wrapper ? Ctor : func;
|
|
return apply(fn2, this, args);
|
|
}
|
|
return wrapper;
|
|
}
|
|
function createFind(findIndexFunc) {
|
|
return function(collection, predicate, fromIndex) {
|
|
var iterable = Object2(collection);
|
|
if (!isArrayLike(collection)) {
|
|
var iteratee2 = getIteratee(predicate, 3);
|
|
collection = keys(collection);
|
|
predicate = function(key2) {
|
|
return iteratee2(iterable[key2], key2, iterable);
|
|
};
|
|
}
|
|
var index = findIndexFunc(collection, predicate, fromIndex);
|
|
return index > -1 ? iterable[iteratee2 ? collection[index] : index] : undefined2;
|
|
};
|
|
}
|
|
function createFlow(fromRight) {
|
|
return flatRest(function(funcs) {
|
|
var length = funcs.length, index = length, prereq = LodashWrapper.prototype.thru;
|
|
if (fromRight) {
|
|
funcs.reverse();
|
|
}
|
|
while (index--) {
|
|
var func = funcs[index];
|
|
if (typeof func != "function") {
|
|
throw new TypeError2(FUNC_ERROR_TEXT);
|
|
}
|
|
if (prereq && !wrapper && getFuncName(func) == "wrapper") {
|
|
var wrapper = new LodashWrapper([], true);
|
|
}
|
|
}
|
|
index = wrapper ? index : length;
|
|
while (++index < length) {
|
|
func = funcs[index];
|
|
var funcName = getFuncName(func), data = funcName == "wrapper" ? getData(func) : undefined2;
|
|
if (data && isLaziable(data[0]) && data[1] == (WRAP_ARY_FLAG | WRAP_CURRY_FLAG | WRAP_PARTIAL_FLAG | WRAP_REARG_FLAG) && !data[4].length && data[9] == 1) {
|
|
wrapper = wrapper[getFuncName(data[0])].apply(wrapper, data[3]);
|
|
} else {
|
|
wrapper = func.length == 1 && isLaziable(func) ? wrapper[funcName]() : wrapper.thru(func);
|
|
}
|
|
}
|
|
return function() {
|
|
var args = arguments, value = args[0];
|
|
if (wrapper && args.length == 1 && isArray2(value)) {
|
|
return wrapper.plant(value).value();
|
|
}
|
|
var index2 = 0, result2 = length ? funcs[index2].apply(this, args) : value;
|
|
while (++index2 < length) {
|
|
result2 = funcs[index2].call(this, result2);
|
|
}
|
|
return result2;
|
|
};
|
|
});
|
|
}
|
|
function createHybrid(func, bitmask, thisArg, partials, holders, partialsRight, holdersRight, argPos, ary2, arity) {
|
|
var isAry = bitmask & WRAP_ARY_FLAG, isBind = bitmask & WRAP_BIND_FLAG, isBindKey = bitmask & WRAP_BIND_KEY_FLAG, isCurried = bitmask & (WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG), isFlip = bitmask & WRAP_FLIP_FLAG, Ctor = isBindKey ? undefined2 : createCtor(func);
|
|
function wrapper() {
|
|
var length = arguments.length, args = Array2(length), index = length;
|
|
while (index--) {
|
|
args[index] = arguments[index];
|
|
}
|
|
if (isCurried) {
|
|
var placeholder2 = getHolder(wrapper), holdersCount = countHolders(args, placeholder2);
|
|
}
|
|
if (partials) {
|
|
args = composeArgs(args, partials, holders, isCurried);
|
|
}
|
|
if (partialsRight) {
|
|
args = composeArgsRight(args, partialsRight, holdersRight, isCurried);
|
|
}
|
|
length -= holdersCount;
|
|
if (isCurried && length < arity) {
|
|
var newHolders = replaceHolders(args, placeholder2);
|
|
return createRecurry(
|
|
func,
|
|
bitmask,
|
|
createHybrid,
|
|
wrapper.placeholder,
|
|
thisArg,
|
|
args,
|
|
newHolders,
|
|
argPos,
|
|
ary2,
|
|
arity - length
|
|
);
|
|
}
|
|
var thisBinding = isBind ? thisArg : this, fn2 = isBindKey ? thisBinding[func] : func;
|
|
length = args.length;
|
|
if (argPos) {
|
|
args = reorder(args, argPos);
|
|
} else if (isFlip && length > 1) {
|
|
args.reverse();
|
|
}
|
|
if (isAry && ary2 < length) {
|
|
args.length = ary2;
|
|
}
|
|
if (this && this !== root && this instanceof wrapper) {
|
|
fn2 = Ctor || createCtor(fn2);
|
|
}
|
|
return fn2.apply(thisBinding, args);
|
|
}
|
|
return wrapper;
|
|
}
|
|
function createInverter(setter, toIteratee) {
|
|
return function(object, iteratee2) {
|
|
return baseInverter(object, setter, toIteratee(iteratee2), {});
|
|
};
|
|
}
|
|
function createMathOperation(operator, defaultValue2) {
|
|
return function(value, other) {
|
|
var result2;
|
|
if (value === undefined2 && other === undefined2) {
|
|
return defaultValue2;
|
|
}
|
|
if (value !== undefined2) {
|
|
result2 = value;
|
|
}
|
|
if (other !== undefined2) {
|
|
if (result2 === undefined2) {
|
|
return other;
|
|
}
|
|
if (typeof value == "string" || typeof other == "string") {
|
|
value = baseToString(value);
|
|
other = baseToString(other);
|
|
} else {
|
|
value = baseToNumber(value);
|
|
other = baseToNumber(other);
|
|
}
|
|
result2 = operator(value, other);
|
|
}
|
|
return result2;
|
|
};
|
|
}
|
|
function createOver(arrayFunc) {
|
|
return flatRest(function(iteratees) {
|
|
iteratees = arrayMap(iteratees, baseUnary(getIteratee()));
|
|
return baseRest(function(args) {
|
|
var thisArg = this;
|
|
return arrayFunc(iteratees, function(iteratee2) {
|
|
return apply(iteratee2, thisArg, args);
|
|
});
|
|
});
|
|
});
|
|
}
|
|
function createPadding(length, chars) {
|
|
chars = chars === undefined2 ? " " : baseToString(chars);
|
|
var charsLength = chars.length;
|
|
if (charsLength < 2) {
|
|
return charsLength ? baseRepeat(chars, length) : chars;
|
|
}
|
|
var result2 = baseRepeat(chars, nativeCeil(length / stringSize(chars)));
|
|
return hasUnicode(chars) ? castSlice(stringToArray(result2), 0, length).join("") : result2.slice(0, length);
|
|
}
|
|
function createPartial(func, bitmask, thisArg, partials) {
|
|
var isBind = bitmask & WRAP_BIND_FLAG, Ctor = createCtor(func);
|
|
function wrapper() {
|
|
var argsIndex = -1, argsLength = arguments.length, leftIndex = -1, leftLength = partials.length, args = Array2(leftLength + argsLength), fn2 = this && this !== root && this instanceof wrapper ? Ctor : func;
|
|
while (++leftIndex < leftLength) {
|
|
args[leftIndex] = partials[leftIndex];
|
|
}
|
|
while (argsLength--) {
|
|
args[leftIndex++] = arguments[++argsIndex];
|
|
}
|
|
return apply(fn2, isBind ? thisArg : this, args);
|
|
}
|
|
return wrapper;
|
|
}
|
|
function createRange(fromRight) {
|
|
return function(start, end, step) {
|
|
if (step && typeof step != "number" && isIterateeCall(start, end, step)) {
|
|
end = step = undefined2;
|
|
}
|
|
start = toFinite(start);
|
|
if (end === undefined2) {
|
|
end = start;
|
|
start = 0;
|
|
} else {
|
|
end = toFinite(end);
|
|
}
|
|
step = step === undefined2 ? start < end ? 1 : -1 : toFinite(step);
|
|
return baseRange(start, end, step, fromRight);
|
|
};
|
|
}
|
|
function createRelationalOperation(operator) {
|
|
return function(value, other) {
|
|
if (!(typeof value == "string" && typeof other == "string")) {
|
|
value = toNumber(value);
|
|
other = toNumber(other);
|
|
}
|
|
return operator(value, other);
|
|
};
|
|
}
|
|
function createRecurry(func, bitmask, wrapFunc, placeholder2, thisArg, partials, holders, argPos, ary2, arity) {
|
|
var isCurry = bitmask & WRAP_CURRY_FLAG, newHolders = isCurry ? holders : undefined2, newHoldersRight = isCurry ? undefined2 : holders, newPartials = isCurry ? partials : undefined2, newPartialsRight = isCurry ? undefined2 : partials;
|
|
bitmask |= isCurry ? WRAP_PARTIAL_FLAG : WRAP_PARTIAL_RIGHT_FLAG;
|
|
bitmask &= ~(isCurry ? WRAP_PARTIAL_RIGHT_FLAG : WRAP_PARTIAL_FLAG);
|
|
if (!(bitmask & WRAP_CURRY_BOUND_FLAG)) {
|
|
bitmask &= ~(WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG);
|
|
}
|
|
var newData = [
|
|
func,
|
|
bitmask,
|
|
thisArg,
|
|
newPartials,
|
|
newHolders,
|
|
newPartialsRight,
|
|
newHoldersRight,
|
|
argPos,
|
|
ary2,
|
|
arity
|
|
];
|
|
var result2 = wrapFunc.apply(undefined2, newData);
|
|
if (isLaziable(func)) {
|
|
setData(result2, newData);
|
|
}
|
|
result2.placeholder = placeholder2;
|
|
return setWrapToString(result2, func, bitmask);
|
|
}
|
|
function createRound(methodName) {
|
|
var func = Math2[methodName];
|
|
return function(number, precision) {
|
|
number = toNumber(number);
|
|
precision = precision == null ? 0 : nativeMin(toInteger2(precision), 292);
|
|
if (precision && nativeIsFinite(number)) {
|
|
var pair = (toString2(number) + "e").split("e"), value = func(pair[0] + "e" + (+pair[1] + precision));
|
|
pair = (toString2(value) + "e").split("e");
|
|
return +(pair[0] + "e" + (+pair[1] - precision));
|
|
}
|
|
return func(number);
|
|
};
|
|
}
|
|
var createSet = !(Set2 && 1 / setToArray(new Set2([, -0]))[1] == INFINITY) ? noop2 : function(values2) {
|
|
return new Set2(values2);
|
|
};
|
|
function createToPairs(keysFunc) {
|
|
return function(object) {
|
|
var tag = getTag(object);
|
|
if (tag == mapTag) {
|
|
return mapToArray(object);
|
|
}
|
|
if (tag == setTag) {
|
|
return setToPairs(object);
|
|
}
|
|
return baseToPairs(object, keysFunc(object));
|
|
};
|
|
}
|
|
function createWrap(func, bitmask, thisArg, partials, holders, argPos, ary2, arity) {
|
|
var isBindKey = bitmask & WRAP_BIND_KEY_FLAG;
|
|
if (!isBindKey && typeof func != "function") {
|
|
throw new TypeError2(FUNC_ERROR_TEXT);
|
|
}
|
|
var length = partials ? partials.length : 0;
|
|
if (!length) {
|
|
bitmask &= ~(WRAP_PARTIAL_FLAG | WRAP_PARTIAL_RIGHT_FLAG);
|
|
partials = holders = undefined2;
|
|
}
|
|
ary2 = ary2 === undefined2 ? ary2 : nativeMax(toInteger2(ary2), 0);
|
|
arity = arity === undefined2 ? arity : toInteger2(arity);
|
|
length -= holders ? holders.length : 0;
|
|
if (bitmask & WRAP_PARTIAL_RIGHT_FLAG) {
|
|
var partialsRight = partials, holdersRight = holders;
|
|
partials = holders = undefined2;
|
|
}
|
|
var data = isBindKey ? undefined2 : getData(func);
|
|
var newData = [
|
|
func,
|
|
bitmask,
|
|
thisArg,
|
|
partials,
|
|
holders,
|
|
partialsRight,
|
|
holdersRight,
|
|
argPos,
|
|
ary2,
|
|
arity
|
|
];
|
|
if (data) {
|
|
mergeData(newData, data);
|
|
}
|
|
func = newData[0];
|
|
bitmask = newData[1];
|
|
thisArg = newData[2];
|
|
partials = newData[3];
|
|
holders = newData[4];
|
|
arity = newData[9] = newData[9] === undefined2 ? isBindKey ? 0 : func.length : nativeMax(newData[9] - length, 0);
|
|
if (!arity && bitmask & (WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG)) {
|
|
bitmask &= ~(WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG);
|
|
}
|
|
if (!bitmask || bitmask == WRAP_BIND_FLAG) {
|
|
var result2 = createBind(func, bitmask, thisArg);
|
|
} else if (bitmask == WRAP_CURRY_FLAG || bitmask == WRAP_CURRY_RIGHT_FLAG) {
|
|
result2 = createCurry(func, bitmask, arity);
|
|
} else if ((bitmask == WRAP_PARTIAL_FLAG || bitmask == (WRAP_BIND_FLAG | WRAP_PARTIAL_FLAG)) && !holders.length) {
|
|
result2 = createPartial(func, bitmask, thisArg, partials);
|
|
} else {
|
|
result2 = createHybrid.apply(undefined2, newData);
|
|
}
|
|
var setter = data ? baseSetData : setData;
|
|
return setWrapToString(setter(result2, newData), func, bitmask);
|
|
}
|
|
function customDefaultsAssignIn(objValue, srcValue, key2, object) {
|
|
if (objValue === undefined2 || eq(objValue, objectProto[key2]) && !hasOwnProperty.call(object, key2)) {
|
|
return srcValue;
|
|
}
|
|
return objValue;
|
|
}
|
|
function customDefaultsMerge(objValue, srcValue, key2, object, source, stack) {
|
|
if (isObject(objValue) && isObject(srcValue)) {
|
|
stack.set(srcValue, objValue);
|
|
baseMerge(objValue, srcValue, undefined2, customDefaultsMerge, stack);
|
|
stack["delete"](srcValue);
|
|
}
|
|
return objValue;
|
|
}
|
|
function customOmitClone(value) {
|
|
return isPlainObject(value) ? undefined2 : value;
|
|
}
|
|
function equalArrays(array, other, bitmask, customizer, equalFunc, stack) {
|
|
var isPartial = bitmask & COMPARE_PARTIAL_FLAG, arrLength = array.length, othLength = other.length;
|
|
if (arrLength != othLength && !(isPartial && othLength > arrLength)) {
|
|
return false;
|
|
}
|
|
var arrStacked = stack.get(array);
|
|
var othStacked = stack.get(other);
|
|
if (arrStacked && othStacked) {
|
|
return arrStacked == other && othStacked == array;
|
|
}
|
|
var index = -1, result2 = true, seen = bitmask & COMPARE_UNORDERED_FLAG ? new SetCache() : undefined2;
|
|
stack.set(array, other);
|
|
stack.set(other, array);
|
|
while (++index < arrLength) {
|
|
var arrValue = array[index], othValue = other[index];
|
|
if (customizer) {
|
|
var compared = isPartial ? customizer(othValue, arrValue, index, other, array, stack) : customizer(arrValue, othValue, index, array, other, stack);
|
|
}
|
|
if (compared !== undefined2) {
|
|
if (compared) {
|
|
continue;
|
|
}
|
|
result2 = false;
|
|
break;
|
|
}
|
|
if (seen) {
|
|
if (!arraySome(other, function(othValue2, othIndex) {
|
|
if (!cacheHas(seen, othIndex) && (arrValue === othValue2 || equalFunc(arrValue, othValue2, bitmask, customizer, stack))) {
|
|
return seen.push(othIndex);
|
|
}
|
|
})) {
|
|
result2 = false;
|
|
break;
|
|
}
|
|
} else if (!(arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) {
|
|
result2 = false;
|
|
break;
|
|
}
|
|
}
|
|
stack["delete"](array);
|
|
stack["delete"](other);
|
|
return result2;
|
|
}
|
|
function equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) {
|
|
switch (tag) {
|
|
case dataViewTag:
|
|
if (object.byteLength != other.byteLength || object.byteOffset != other.byteOffset) {
|
|
return false;
|
|
}
|
|
object = object.buffer;
|
|
other = other.buffer;
|
|
case arrayBufferTag:
|
|
if (object.byteLength != other.byteLength || !equalFunc(new Uint8Array2(object), new Uint8Array2(other))) {
|
|
return false;
|
|
}
|
|
return true;
|
|
case boolTag:
|
|
case dateTag:
|
|
case numberTag:
|
|
return eq(+object, +other);
|
|
case errorTag:
|
|
return object.name == other.name && object.message == other.message;
|
|
case regexpTag:
|
|
case stringTag:
|
|
return object == other + "";
|
|
case mapTag:
|
|
var convert = mapToArray;
|
|
case setTag:
|
|
var isPartial = bitmask & COMPARE_PARTIAL_FLAG;
|
|
convert || (convert = setToArray);
|
|
if (object.size != other.size && !isPartial) {
|
|
return false;
|
|
}
|
|
var stacked = stack.get(object);
|
|
if (stacked) {
|
|
return stacked == other;
|
|
}
|
|
bitmask |= COMPARE_UNORDERED_FLAG;
|
|
stack.set(object, other);
|
|
var result2 = equalArrays(convert(object), convert(other), bitmask, customizer, equalFunc, stack);
|
|
stack["delete"](object);
|
|
return result2;
|
|
case symbolTag:
|
|
if (symbolValueOf) {
|
|
return symbolValueOf.call(object) == symbolValueOf.call(other);
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
function equalObjects(object, other, bitmask, customizer, equalFunc, stack) {
|
|
var isPartial = bitmask & COMPARE_PARTIAL_FLAG, objProps = getAllKeys(object), objLength = objProps.length, othProps = getAllKeys(other), othLength = othProps.length;
|
|
if (objLength != othLength && !isPartial) {
|
|
return false;
|
|
}
|
|
var index = objLength;
|
|
while (index--) {
|
|
var key2 = objProps[index];
|
|
if (!(isPartial ? key2 in other : hasOwnProperty.call(other, key2))) {
|
|
return false;
|
|
}
|
|
}
|
|
var objStacked = stack.get(object);
|
|
var othStacked = stack.get(other);
|
|
if (objStacked && othStacked) {
|
|
return objStacked == other && othStacked == object;
|
|
}
|
|
var result2 = true;
|
|
stack.set(object, other);
|
|
stack.set(other, object);
|
|
var skipCtor = isPartial;
|
|
while (++index < objLength) {
|
|
key2 = objProps[index];
|
|
var objValue = object[key2], othValue = other[key2];
|
|
if (customizer) {
|
|
var compared = isPartial ? customizer(othValue, objValue, key2, other, object, stack) : customizer(objValue, othValue, key2, object, other, stack);
|
|
}
|
|
if (!(compared === undefined2 ? objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack) : compared)) {
|
|
result2 = false;
|
|
break;
|
|
}
|
|
skipCtor || (skipCtor = key2 == "constructor");
|
|
}
|
|
if (result2 && !skipCtor) {
|
|
var objCtor = object.constructor, othCtor = other.constructor;
|
|
if (objCtor != othCtor && ("constructor" in object && "constructor" in other) && !(typeof objCtor == "function" && objCtor instanceof objCtor && typeof othCtor == "function" && othCtor instanceof othCtor)) {
|
|
result2 = false;
|
|
}
|
|
}
|
|
stack["delete"](object);
|
|
stack["delete"](other);
|
|
return result2;
|
|
}
|
|
function flatRest(func) {
|
|
return setToString(overRest(func, undefined2, flatten), func + "");
|
|
}
|
|
function getAllKeys(object) {
|
|
return baseGetAllKeys(object, keys, getSymbols);
|
|
}
|
|
function getAllKeysIn(object) {
|
|
return baseGetAllKeys(object, keysIn, getSymbolsIn);
|
|
}
|
|
var getData = !metaMap ? noop2 : function(func) {
|
|
return metaMap.get(func);
|
|
};
|
|
function getFuncName(func) {
|
|
var result2 = func.name + "", array = realNames[result2], length = hasOwnProperty.call(realNames, result2) ? array.length : 0;
|
|
while (length--) {
|
|
var data = array[length], otherFunc = data.func;
|
|
if (otherFunc == null || otherFunc == func) {
|
|
return data.name;
|
|
}
|
|
}
|
|
return result2;
|
|
}
|
|
function getHolder(func) {
|
|
var object = hasOwnProperty.call(lodash, "placeholder") ? lodash : func;
|
|
return object.placeholder;
|
|
}
|
|
function getIteratee() {
|
|
var result2 = lodash.iteratee || iteratee;
|
|
result2 = result2 === iteratee ? baseIteratee : result2;
|
|
return arguments.length ? result2(arguments[0], arguments[1]) : result2;
|
|
}
|
|
function getMapData(map2, key2) {
|
|
var data = map2.__data__;
|
|
return isKeyable(key2) ? data[typeof key2 == "string" ? "string" : "hash"] : data.map;
|
|
}
|
|
function getMatchData(object) {
|
|
var result2 = keys(object), length = result2.length;
|
|
while (length--) {
|
|
var key2 = result2[length], value = object[key2];
|
|
result2[length] = [key2, value, isStrictComparable(value)];
|
|
}
|
|
return result2;
|
|
}
|
|
function getNative(object, key2) {
|
|
var value = getValue(object, key2);
|
|
return baseIsNative(value) ? value : undefined2;
|
|
}
|
|
function getRawTag(value) {
|
|
var isOwn = hasOwnProperty.call(value, symToStringTag), tag = value[symToStringTag];
|
|
try {
|
|
value[symToStringTag] = undefined2;
|
|
var unmasked = true;
|
|
} catch (e4) {
|
|
}
|
|
var result2 = nativeObjectToString.call(value);
|
|
if (unmasked) {
|
|
if (isOwn) {
|
|
value[symToStringTag] = tag;
|
|
} else {
|
|
delete value[symToStringTag];
|
|
}
|
|
}
|
|
return result2;
|
|
}
|
|
var getSymbols = !nativeGetSymbols ? stubArray : function(object) {
|
|
if (object == null) {
|
|
return [];
|
|
}
|
|
object = Object2(object);
|
|
return arrayFilter(nativeGetSymbols(object), function(symbol) {
|
|
return propertyIsEnumerable.call(object, symbol);
|
|
});
|
|
};
|
|
var getSymbolsIn = !nativeGetSymbols ? stubArray : function(object) {
|
|
var result2 = [];
|
|
while (object) {
|
|
arrayPush(result2, getSymbols(object));
|
|
object = getPrototype(object);
|
|
}
|
|
return result2;
|
|
};
|
|
var getTag = baseGetTag;
|
|
if (DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag || Map2 && getTag(new Map2()) != mapTag || Promise2 && getTag(Promise2.resolve()) != promiseTag || Set2 && getTag(new Set2()) != setTag || WeakMap2 && getTag(new WeakMap2()) != weakMapTag) {
|
|
getTag = function(value) {
|
|
var result2 = baseGetTag(value), Ctor = result2 == objectTag ? value.constructor : undefined2, ctorString = Ctor ? toSource(Ctor) : "";
|
|
if (ctorString) {
|
|
switch (ctorString) {
|
|
case dataViewCtorString:
|
|
return dataViewTag;
|
|
case mapCtorString:
|
|
return mapTag;
|
|
case promiseCtorString:
|
|
return promiseTag;
|
|
case setCtorString:
|
|
return setTag;
|
|
case weakMapCtorString:
|
|
return weakMapTag;
|
|
}
|
|
}
|
|
return result2;
|
|
};
|
|
}
|
|
function getView(start, end, transforms) {
|
|
var index = -1, length = transforms.length;
|
|
while (++index < length) {
|
|
var data = transforms[index], size2 = data.size;
|
|
switch (data.type) {
|
|
case "drop":
|
|
start += size2;
|
|
break;
|
|
case "dropRight":
|
|
end -= size2;
|
|
break;
|
|
case "take":
|
|
end = nativeMin(end, start + size2);
|
|
break;
|
|
case "takeRight":
|
|
start = nativeMax(start, end - size2);
|
|
break;
|
|
}
|
|
}
|
|
return { "start": start, "end": end };
|
|
}
|
|
function getWrapDetails(source) {
|
|
var match2 = source.match(reWrapDetails);
|
|
return match2 ? match2[1].split(reSplitDetails) : [];
|
|
}
|
|
function hasPath(object, path, hasFunc) {
|
|
path = castPath(path, object);
|
|
var index = -1, length = path.length, result2 = false;
|
|
while (++index < length) {
|
|
var key2 = toKey(path[index]);
|
|
if (!(result2 = object != null && hasFunc(object, key2))) {
|
|
break;
|
|
}
|
|
object = object[key2];
|
|
}
|
|
if (result2 || ++index != length) {
|
|
return result2;
|
|
}
|
|
length = object == null ? 0 : object.length;
|
|
return !!length && isLength(length) && isIndex(key2, length) && (isArray2(object) || isArguments(object));
|
|
}
|
|
function initCloneArray(array) {
|
|
var length = array.length, result2 = new array.constructor(length);
|
|
if (length && typeof array[0] == "string" && hasOwnProperty.call(array, "index")) {
|
|
result2.index = array.index;
|
|
result2.input = array.input;
|
|
}
|
|
return result2;
|
|
}
|
|
function initCloneObject(object) {
|
|
return typeof object.constructor == "function" && !isPrototype(object) ? baseCreate(getPrototype(object)) : {};
|
|
}
|
|
function initCloneByTag(object, tag, isDeep) {
|
|
var Ctor = object.constructor;
|
|
switch (tag) {
|
|
case arrayBufferTag:
|
|
return cloneArrayBuffer(object);
|
|
case boolTag:
|
|
case dateTag:
|
|
return new Ctor(+object);
|
|
case dataViewTag:
|
|
return cloneDataView(object, isDeep);
|
|
case float32Tag:
|
|
case float64Tag:
|
|
case int8Tag:
|
|
case int16Tag:
|
|
case int32Tag:
|
|
case uint8Tag:
|
|
case uint8ClampedTag:
|
|
case uint16Tag:
|
|
case uint32Tag:
|
|
return cloneTypedArray(object, isDeep);
|
|
case mapTag:
|
|
return new Ctor();
|
|
case numberTag:
|
|
case stringTag:
|
|
return new Ctor(object);
|
|
case regexpTag:
|
|
return cloneRegExp(object);
|
|
case setTag:
|
|
return new Ctor();
|
|
case symbolTag:
|
|
return cloneSymbol(object);
|
|
}
|
|
}
|
|
function insertWrapDetails(source, details) {
|
|
var length = details.length;
|
|
if (!length) {
|
|
return source;
|
|
}
|
|
var lastIndex = length - 1;
|
|
details[lastIndex] = (length > 1 ? "& " : "") + details[lastIndex];
|
|
details = details.join(length > 2 ? ", " : " ");
|
|
return source.replace(reWrapComment, "{\n/* [wrapped with " + details + "] */\n");
|
|
}
|
|
function isFlattenable(value) {
|
|
return isArray2(value) || isArguments(value) || !!(spreadableSymbol && value && value[spreadableSymbol]);
|
|
}
|
|
function isIndex(value, length) {
|
|
var type = typeof value;
|
|
length = length == null ? MAX_SAFE_INTEGER : length;
|
|
return !!length && (type == "number" || type != "symbol" && reIsUint.test(value)) && (value > -1 && value % 1 == 0 && value < length);
|
|
}
|
|
function isIterateeCall(value, index, object) {
|
|
if (!isObject(object)) {
|
|
return false;
|
|
}
|
|
var type = typeof index;
|
|
if (type == "number" ? isArrayLike(object) && isIndex(index, object.length) : type == "string" && index in object) {
|
|
return eq(object[index], value);
|
|
}
|
|
return false;
|
|
}
|
|
function isKey(value, object) {
|
|
if (isArray2(value)) {
|
|
return false;
|
|
}
|
|
var type = typeof value;
|
|
if (type == "number" || type == "symbol" || type == "boolean" || value == null || isSymbol(value)) {
|
|
return true;
|
|
}
|
|
return reIsPlainProp.test(value) || !reIsDeepProp.test(value) || object != null && value in Object2(object);
|
|
}
|
|
function isKeyable(value) {
|
|
var type = typeof value;
|
|
return type == "string" || type == "number" || type == "symbol" || type == "boolean" ? value !== "__proto__" : value === null;
|
|
}
|
|
function isLaziable(func) {
|
|
var funcName = getFuncName(func), other = lodash[funcName];
|
|
if (typeof other != "function" || !(funcName in LazyWrapper.prototype)) {
|
|
return false;
|
|
}
|
|
if (func === other) {
|
|
return true;
|
|
}
|
|
var data = getData(other);
|
|
return !!data && func === data[0];
|
|
}
|
|
function isMasked(func) {
|
|
return !!maskSrcKey && maskSrcKey in func;
|
|
}
|
|
var isMaskable = coreJsData ? isFunction2 : stubFalse;
|
|
function isPrototype(value) {
|
|
var Ctor = value && value.constructor, proto = typeof Ctor == "function" && Ctor.prototype || objectProto;
|
|
return value === proto;
|
|
}
|
|
function isStrictComparable(value) {
|
|
return value === value && !isObject(value);
|
|
}
|
|
function matchesStrictComparable(key2, srcValue) {
|
|
return function(object) {
|
|
if (object == null) {
|
|
return false;
|
|
}
|
|
return object[key2] === srcValue && (srcValue !== undefined2 || key2 in Object2(object));
|
|
};
|
|
}
|
|
function memoizeCapped(func) {
|
|
var result2 = memoize(func, function(key2) {
|
|
if (cache.size === MAX_MEMOIZE_SIZE) {
|
|
cache.clear();
|
|
}
|
|
return key2;
|
|
});
|
|
var cache = result2.cache;
|
|
return result2;
|
|
}
|
|
function mergeData(data, source) {
|
|
var bitmask = data[1], srcBitmask = source[1], newBitmask = bitmask | srcBitmask, isCommon = newBitmask < (WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG | WRAP_ARY_FLAG);
|
|
var isCombo = srcBitmask == WRAP_ARY_FLAG && bitmask == WRAP_CURRY_FLAG || srcBitmask == WRAP_ARY_FLAG && bitmask == WRAP_REARG_FLAG && data[7].length <= source[8] || srcBitmask == (WRAP_ARY_FLAG | WRAP_REARG_FLAG) && source[7].length <= source[8] && bitmask == WRAP_CURRY_FLAG;
|
|
if (!(isCommon || isCombo)) {
|
|
return data;
|
|
}
|
|
if (srcBitmask & WRAP_BIND_FLAG) {
|
|
data[2] = source[2];
|
|
newBitmask |= bitmask & WRAP_BIND_FLAG ? 0 : WRAP_CURRY_BOUND_FLAG;
|
|
}
|
|
var value = source[3];
|
|
if (value) {
|
|
var partials = data[3];
|
|
data[3] = partials ? composeArgs(partials, value, source[4]) : value;
|
|
data[4] = partials ? replaceHolders(data[3], PLACEHOLDER) : source[4];
|
|
}
|
|
value = source[5];
|
|
if (value) {
|
|
partials = data[5];
|
|
data[5] = partials ? composeArgsRight(partials, value, source[6]) : value;
|
|
data[6] = partials ? replaceHolders(data[5], PLACEHOLDER) : source[6];
|
|
}
|
|
value = source[7];
|
|
if (value) {
|
|
data[7] = value;
|
|
}
|
|
if (srcBitmask & WRAP_ARY_FLAG) {
|
|
data[8] = data[8] == null ? source[8] : nativeMin(data[8], source[8]);
|
|
}
|
|
if (data[9] == null) {
|
|
data[9] = source[9];
|
|
}
|
|
data[0] = source[0];
|
|
data[1] = newBitmask;
|
|
return data;
|
|
}
|
|
function nativeKeysIn(object) {
|
|
var result2 = [];
|
|
if (object != null) {
|
|
for (var key2 in Object2(object)) {
|
|
result2.push(key2);
|
|
}
|
|
}
|
|
return result2;
|
|
}
|
|
function objectToString(value) {
|
|
return nativeObjectToString.call(value);
|
|
}
|
|
function overRest(func, start, transform2) {
|
|
start = nativeMax(start === undefined2 ? func.length - 1 : start, 0);
|
|
return function() {
|
|
var args = arguments, index = -1, length = nativeMax(args.length - start, 0), array = Array2(length);
|
|
while (++index < length) {
|
|
array[index] = args[start + index];
|
|
}
|
|
index = -1;
|
|
var otherArgs = Array2(start + 1);
|
|
while (++index < start) {
|
|
otherArgs[index] = args[index];
|
|
}
|
|
otherArgs[start] = transform2(array);
|
|
return apply(func, this, otherArgs);
|
|
};
|
|
}
|
|
function parent(object, path) {
|
|
return path.length < 2 ? object : baseGet(object, baseSlice(path, 0, -1));
|
|
}
|
|
function reorder(array, indexes) {
|
|
var arrLength = array.length, length = nativeMin(indexes.length, arrLength), oldArray = copyArray(array);
|
|
while (length--) {
|
|
var index = indexes[length];
|
|
array[length] = isIndex(index, arrLength) ? oldArray[index] : undefined2;
|
|
}
|
|
return array;
|
|
}
|
|
function safeGet(object, key2) {
|
|
if (key2 === "constructor" && typeof object[key2] === "function") {
|
|
return;
|
|
}
|
|
if (key2 == "__proto__") {
|
|
return;
|
|
}
|
|
return object[key2];
|
|
}
|
|
var setData = shortOut(baseSetData);
|
|
var setTimeout2 = ctxSetTimeout || function(func, wait) {
|
|
return root.setTimeout(func, wait);
|
|
};
|
|
var setToString = shortOut(baseSetToString);
|
|
function setWrapToString(wrapper, reference, bitmask) {
|
|
var source = reference + "";
|
|
return setToString(wrapper, insertWrapDetails(source, updateWrapDetails(getWrapDetails(source), bitmask)));
|
|
}
|
|
function shortOut(func) {
|
|
var count2 = 0, lastCalled = 0;
|
|
return function() {
|
|
var stamp = nativeNow(), remaining = HOT_SPAN - (stamp - lastCalled);
|
|
lastCalled = stamp;
|
|
if (remaining > 0) {
|
|
if (++count2 >= HOT_COUNT) {
|
|
return arguments[0];
|
|
}
|
|
} else {
|
|
count2 = 0;
|
|
}
|
|
return func.apply(undefined2, arguments);
|
|
};
|
|
}
|
|
function shuffleSelf(array, size2) {
|
|
var index = -1, length = array.length, lastIndex = length - 1;
|
|
size2 = size2 === undefined2 ? length : size2;
|
|
while (++index < size2) {
|
|
var rand = baseRandom(index, lastIndex), value = array[rand];
|
|
array[rand] = array[index];
|
|
array[index] = value;
|
|
}
|
|
array.length = size2;
|
|
return array;
|
|
}
|
|
var stringToPath = memoizeCapped(function(string) {
|
|
var result2 = [];
|
|
if (string.charCodeAt(0) === 46) {
|
|
result2.push("");
|
|
}
|
|
string.replace(rePropName, function(match2, number, quote, subString) {
|
|
result2.push(quote ? subString.replace(reEscapeChar, "$1") : number || match2);
|
|
});
|
|
return result2;
|
|
});
|
|
function toKey(value) {
|
|
if (typeof value == "string" || isSymbol(value)) {
|
|
return value;
|
|
}
|
|
var result2 = value + "";
|
|
return result2 == "0" && 1 / value == -INFINITY ? "-0" : result2;
|
|
}
|
|
function toSource(func) {
|
|
if (func != null) {
|
|
try {
|
|
return funcToString.call(func);
|
|
} catch (e4) {
|
|
}
|
|
try {
|
|
return func + "";
|
|
} catch (e4) {
|
|
}
|
|
}
|
|
return "";
|
|
}
|
|
function updateWrapDetails(details, bitmask) {
|
|
arrayEach(wrapFlags, function(pair) {
|
|
var value = "_." + pair[0];
|
|
if (bitmask & pair[1] && !arrayIncludes(details, value)) {
|
|
details.push(value);
|
|
}
|
|
});
|
|
return details.sort();
|
|
}
|
|
function wrapperClone(wrapper) {
|
|
if (wrapper instanceof LazyWrapper) {
|
|
return wrapper.clone();
|
|
}
|
|
var result2 = new LodashWrapper(wrapper.__wrapped__, wrapper.__chain__);
|
|
result2.__actions__ = copyArray(wrapper.__actions__);
|
|
result2.__index__ = wrapper.__index__;
|
|
result2.__values__ = wrapper.__values__;
|
|
return result2;
|
|
}
|
|
function chunk(array, size2, guard) {
|
|
if (guard ? isIterateeCall(array, size2, guard) : size2 === undefined2) {
|
|
size2 = 1;
|
|
} else {
|
|
size2 = nativeMax(toInteger2(size2), 0);
|
|
}
|
|
var length = array == null ? 0 : array.length;
|
|
if (!length || size2 < 1) {
|
|
return [];
|
|
}
|
|
var index = 0, resIndex = 0, result2 = Array2(nativeCeil(length / size2));
|
|
while (index < length) {
|
|
result2[resIndex++] = baseSlice(array, index, index += size2);
|
|
}
|
|
return result2;
|
|
}
|
|
function compact(array) {
|
|
var index = -1, length = array == null ? 0 : array.length, resIndex = 0, result2 = [];
|
|
while (++index < length) {
|
|
var value = array[index];
|
|
if (value) {
|
|
result2[resIndex++] = value;
|
|
}
|
|
}
|
|
return result2;
|
|
}
|
|
function concat() {
|
|
var length = arguments.length;
|
|
if (!length) {
|
|
return [];
|
|
}
|
|
var args = Array2(length - 1), array = arguments[0], index = length;
|
|
while (index--) {
|
|
args[index - 1] = arguments[index];
|
|
}
|
|
return arrayPush(isArray2(array) ? copyArray(array) : [array], baseFlatten(args, 1));
|
|
}
|
|
var difference = baseRest(function(array, values2) {
|
|
return isArrayLikeObject(array) ? baseDifference(array, baseFlatten(values2, 1, isArrayLikeObject, true)) : [];
|
|
});
|
|
var differenceBy = baseRest(function(array, values2) {
|
|
var iteratee2 = last(values2);
|
|
if (isArrayLikeObject(iteratee2)) {
|
|
iteratee2 = undefined2;
|
|
}
|
|
return isArrayLikeObject(array) ? baseDifference(array, baseFlatten(values2, 1, isArrayLikeObject, true), getIteratee(iteratee2, 2)) : [];
|
|
});
|
|
var differenceWith = baseRest(function(array, values2) {
|
|
var comparator = last(values2);
|
|
if (isArrayLikeObject(comparator)) {
|
|
comparator = undefined2;
|
|
}
|
|
return isArrayLikeObject(array) ? baseDifference(array, baseFlatten(values2, 1, isArrayLikeObject, true), undefined2, comparator) : [];
|
|
});
|
|
function drop(array, n2, guard) {
|
|
var length = array == null ? 0 : array.length;
|
|
if (!length) {
|
|
return [];
|
|
}
|
|
n2 = guard || n2 === undefined2 ? 1 : toInteger2(n2);
|
|
return baseSlice(array, n2 < 0 ? 0 : n2, length);
|
|
}
|
|
function dropRight(array, n2, guard) {
|
|
var length = array == null ? 0 : array.length;
|
|
if (!length) {
|
|
return [];
|
|
}
|
|
n2 = guard || n2 === undefined2 ? 1 : toInteger2(n2);
|
|
n2 = length - n2;
|
|
return baseSlice(array, 0, n2 < 0 ? 0 : n2);
|
|
}
|
|
function dropRightWhile(array, predicate) {
|
|
return array && array.length ? baseWhile(array, getIteratee(predicate, 3), true, true) : [];
|
|
}
|
|
function dropWhile(array, predicate) {
|
|
return array && array.length ? baseWhile(array, getIteratee(predicate, 3), true) : [];
|
|
}
|
|
function fill(array, value, start, end) {
|
|
var length = array == null ? 0 : array.length;
|
|
if (!length) {
|
|
return [];
|
|
}
|
|
if (start && typeof start != "number" && isIterateeCall(array, value, start)) {
|
|
start = 0;
|
|
end = length;
|
|
}
|
|
return baseFill(array, value, start, end);
|
|
}
|
|
function findIndex2(array, predicate, fromIndex) {
|
|
var length = array == null ? 0 : array.length;
|
|
if (!length) {
|
|
return -1;
|
|
}
|
|
var index = fromIndex == null ? 0 : toInteger2(fromIndex);
|
|
if (index < 0) {
|
|
index = nativeMax(length + index, 0);
|
|
}
|
|
return baseFindIndex(array, getIteratee(predicate, 3), index);
|
|
}
|
|
function findLastIndex(array, predicate, fromIndex) {
|
|
var length = array == null ? 0 : array.length;
|
|
if (!length) {
|
|
return -1;
|
|
}
|
|
var index = length - 1;
|
|
if (fromIndex !== undefined2) {
|
|
index = toInteger2(fromIndex);
|
|
index = fromIndex < 0 ? nativeMax(length + index, 0) : nativeMin(index, length - 1);
|
|
}
|
|
return baseFindIndex(array, getIteratee(predicate, 3), index, true);
|
|
}
|
|
function flatten(array) {
|
|
var length = array == null ? 0 : array.length;
|
|
return length ? baseFlatten(array, 1) : [];
|
|
}
|
|
function flattenDeep(array) {
|
|
var length = array == null ? 0 : array.length;
|
|
return length ? baseFlatten(array, INFINITY) : [];
|
|
}
|
|
function flattenDepth(array, depth) {
|
|
var length = array == null ? 0 : array.length;
|
|
if (!length) {
|
|
return [];
|
|
}
|
|
depth = depth === undefined2 ? 1 : toInteger2(depth);
|
|
return baseFlatten(array, depth);
|
|
}
|
|
function fromPairs(pairs) {
|
|
var index = -1, length = pairs == null ? 0 : pairs.length, result2 = {};
|
|
while (++index < length) {
|
|
var pair = pairs[index];
|
|
result2[pair[0]] = pair[1];
|
|
}
|
|
return result2;
|
|
}
|
|
function head(array) {
|
|
return array && array.length ? array[0] : undefined2;
|
|
}
|
|
function indexOf(array, value, fromIndex) {
|
|
var length = array == null ? 0 : array.length;
|
|
if (!length) {
|
|
return -1;
|
|
}
|
|
var index = fromIndex == null ? 0 : toInteger2(fromIndex);
|
|
if (index < 0) {
|
|
index = nativeMax(length + index, 0);
|
|
}
|
|
return baseIndexOf(array, value, index);
|
|
}
|
|
function initial(array) {
|
|
var length = array == null ? 0 : array.length;
|
|
return length ? baseSlice(array, 0, -1) : [];
|
|
}
|
|
var intersection = baseRest(function(arrays) {
|
|
var mapped = arrayMap(arrays, castArrayLikeObject);
|
|
return mapped.length && mapped[0] === arrays[0] ? baseIntersection(mapped) : [];
|
|
});
|
|
var intersectionBy = baseRest(function(arrays) {
|
|
var iteratee2 = last(arrays), mapped = arrayMap(arrays, castArrayLikeObject);
|
|
if (iteratee2 === last(mapped)) {
|
|
iteratee2 = undefined2;
|
|
} else {
|
|
mapped.pop();
|
|
}
|
|
return mapped.length && mapped[0] === arrays[0] ? baseIntersection(mapped, getIteratee(iteratee2, 2)) : [];
|
|
});
|
|
var intersectionWith = baseRest(function(arrays) {
|
|
var comparator = last(arrays), mapped = arrayMap(arrays, castArrayLikeObject);
|
|
comparator = typeof comparator == "function" ? comparator : undefined2;
|
|
if (comparator) {
|
|
mapped.pop();
|
|
}
|
|
return mapped.length && mapped[0] === arrays[0] ? baseIntersection(mapped, undefined2, comparator) : [];
|
|
});
|
|
function join(array, separator) {
|
|
return array == null ? "" : nativeJoin.call(array, separator);
|
|
}
|
|
function last(array) {
|
|
var length = array == null ? 0 : array.length;
|
|
return length ? array[length - 1] : undefined2;
|
|
}
|
|
function lastIndexOf(array, value, fromIndex) {
|
|
var length = array == null ? 0 : array.length;
|
|
if (!length) {
|
|
return -1;
|
|
}
|
|
var index = length;
|
|
if (fromIndex !== undefined2) {
|
|
index = toInteger2(fromIndex);
|
|
index = index < 0 ? nativeMax(length + index, 0) : nativeMin(index, length - 1);
|
|
}
|
|
return value === value ? strictLastIndexOf(array, value, index) : baseFindIndex(array, baseIsNaN, index, true);
|
|
}
|
|
function nth(array, n2) {
|
|
return array && array.length ? baseNth(array, toInteger2(n2)) : undefined2;
|
|
}
|
|
var pull = baseRest(pullAll);
|
|
function pullAll(array, values2) {
|
|
return array && array.length && values2 && values2.length ? basePullAll(array, values2) : array;
|
|
}
|
|
function pullAllBy(array, values2, iteratee2) {
|
|
return array && array.length && values2 && values2.length ? basePullAll(array, values2, getIteratee(iteratee2, 2)) : array;
|
|
}
|
|
function pullAllWith(array, values2, comparator) {
|
|
return array && array.length && values2 && values2.length ? basePullAll(array, values2, undefined2, comparator) : array;
|
|
}
|
|
var pullAt = flatRest(function(array, indexes) {
|
|
var length = array == null ? 0 : array.length, result2 = baseAt(array, indexes);
|
|
basePullAt(array, arrayMap(indexes, function(index) {
|
|
return isIndex(index, length) ? +index : index;
|
|
}).sort(compareAscending));
|
|
return result2;
|
|
});
|
|
function remove(array, predicate) {
|
|
var result2 = [];
|
|
if (!(array && array.length)) {
|
|
return result2;
|
|
}
|
|
var index = -1, indexes = [], length = array.length;
|
|
predicate = getIteratee(predicate, 3);
|
|
while (++index < length) {
|
|
var value = array[index];
|
|
if (predicate(value, index, array)) {
|
|
result2.push(value);
|
|
indexes.push(index);
|
|
}
|
|
}
|
|
basePullAt(array, indexes);
|
|
return result2;
|
|
}
|
|
function reverse(array) {
|
|
return array == null ? array : nativeReverse.call(array);
|
|
}
|
|
function slice(array, start, end) {
|
|
var length = array == null ? 0 : array.length;
|
|
if (!length) {
|
|
return [];
|
|
}
|
|
if (end && typeof end != "number" && isIterateeCall(array, start, end)) {
|
|
start = 0;
|
|
end = length;
|
|
} else {
|
|
start = start == null ? 0 : toInteger2(start);
|
|
end = end === undefined2 ? length : toInteger2(end);
|
|
}
|
|
return baseSlice(array, start, end);
|
|
}
|
|
function sortedIndex(array, value) {
|
|
return baseSortedIndex(array, value);
|
|
}
|
|
function sortedIndexBy(array, value, iteratee2) {
|
|
return baseSortedIndexBy(array, value, getIteratee(iteratee2, 2));
|
|
}
|
|
function sortedIndexOf(array, value) {
|
|
var length = array == null ? 0 : array.length;
|
|
if (length) {
|
|
var index = baseSortedIndex(array, value);
|
|
if (index < length && eq(array[index], value)) {
|
|
return index;
|
|
}
|
|
}
|
|
return -1;
|
|
}
|
|
function sortedLastIndex(array, value) {
|
|
return baseSortedIndex(array, value, true);
|
|
}
|
|
function sortedLastIndexBy(array, value, iteratee2) {
|
|
return baseSortedIndexBy(array, value, getIteratee(iteratee2, 2), true);
|
|
}
|
|
function sortedLastIndexOf(array, value) {
|
|
var length = array == null ? 0 : array.length;
|
|
if (length) {
|
|
var index = baseSortedIndex(array, value, true) - 1;
|
|
if (eq(array[index], value)) {
|
|
return index;
|
|
}
|
|
}
|
|
return -1;
|
|
}
|
|
function sortedUniq(array) {
|
|
return array && array.length ? baseSortedUniq(array) : [];
|
|
}
|
|
function sortedUniqBy(array, iteratee2) {
|
|
return array && array.length ? baseSortedUniq(array, getIteratee(iteratee2, 2)) : [];
|
|
}
|
|
function tail(array) {
|
|
var length = array == null ? 0 : array.length;
|
|
return length ? baseSlice(array, 1, length) : [];
|
|
}
|
|
function take(array, n2, guard) {
|
|
if (!(array && array.length)) {
|
|
return [];
|
|
}
|
|
n2 = guard || n2 === undefined2 ? 1 : toInteger2(n2);
|
|
return baseSlice(array, 0, n2 < 0 ? 0 : n2);
|
|
}
|
|
function takeRight(array, n2, guard) {
|
|
var length = array == null ? 0 : array.length;
|
|
if (!length) {
|
|
return [];
|
|
}
|
|
n2 = guard || n2 === undefined2 ? 1 : toInteger2(n2);
|
|
n2 = length - n2;
|
|
return baseSlice(array, n2 < 0 ? 0 : n2, length);
|
|
}
|
|
function takeRightWhile(array, predicate) {
|
|
return array && array.length ? baseWhile(array, getIteratee(predicate, 3), false, true) : [];
|
|
}
|
|
function takeWhile(array, predicate) {
|
|
return array && array.length ? baseWhile(array, getIteratee(predicate, 3)) : [];
|
|
}
|
|
var union = baseRest(function(arrays) {
|
|
return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true));
|
|
});
|
|
var unionBy = baseRest(function(arrays) {
|
|
var iteratee2 = last(arrays);
|
|
if (isArrayLikeObject(iteratee2)) {
|
|
iteratee2 = undefined2;
|
|
}
|
|
return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true), getIteratee(iteratee2, 2));
|
|
});
|
|
var unionWith = baseRest(function(arrays) {
|
|
var comparator = last(arrays);
|
|
comparator = typeof comparator == "function" ? comparator : undefined2;
|
|
return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true), undefined2, comparator);
|
|
});
|
|
function uniq6(array) {
|
|
return array && array.length ? baseUniq(array) : [];
|
|
}
|
|
function uniqBy(array, iteratee2) {
|
|
return array && array.length ? baseUniq(array, getIteratee(iteratee2, 2)) : [];
|
|
}
|
|
function uniqWith(array, comparator) {
|
|
comparator = typeof comparator == "function" ? comparator : undefined2;
|
|
return array && array.length ? baseUniq(array, undefined2, comparator) : [];
|
|
}
|
|
function unzip(array) {
|
|
if (!(array && array.length)) {
|
|
return [];
|
|
}
|
|
var length = 0;
|
|
array = arrayFilter(array, function(group) {
|
|
if (isArrayLikeObject(group)) {
|
|
length = nativeMax(group.length, length);
|
|
return true;
|
|
}
|
|
});
|
|
return baseTimes(length, function(index) {
|
|
return arrayMap(array, baseProperty(index));
|
|
});
|
|
}
|
|
function unzipWith(array, iteratee2) {
|
|
if (!(array && array.length)) {
|
|
return [];
|
|
}
|
|
var result2 = unzip(array);
|
|
if (iteratee2 == null) {
|
|
return result2;
|
|
}
|
|
return arrayMap(result2, function(group) {
|
|
return apply(iteratee2, undefined2, group);
|
|
});
|
|
}
|
|
var without = baseRest(function(array, values2) {
|
|
return isArrayLikeObject(array) ? baseDifference(array, values2) : [];
|
|
});
|
|
var xor = baseRest(function(arrays) {
|
|
return baseXor(arrayFilter(arrays, isArrayLikeObject));
|
|
});
|
|
var xorBy = baseRest(function(arrays) {
|
|
var iteratee2 = last(arrays);
|
|
if (isArrayLikeObject(iteratee2)) {
|
|
iteratee2 = undefined2;
|
|
}
|
|
return baseXor(arrayFilter(arrays, isArrayLikeObject), getIteratee(iteratee2, 2));
|
|
});
|
|
var xorWith = baseRest(function(arrays) {
|
|
var comparator = last(arrays);
|
|
comparator = typeof comparator == "function" ? comparator : undefined2;
|
|
return baseXor(arrayFilter(arrays, isArrayLikeObject), undefined2, comparator);
|
|
});
|
|
var zip = baseRest(unzip);
|
|
function zipObject(props2, values2) {
|
|
return baseZipObject(props2 || [], values2 || [], assignValue);
|
|
}
|
|
function zipObjectDeep(props2, values2) {
|
|
return baseZipObject(props2 || [], values2 || [], baseSet);
|
|
}
|
|
var zipWith = baseRest(function(arrays) {
|
|
var length = arrays.length, iteratee2 = length > 1 ? arrays[length - 1] : undefined2;
|
|
iteratee2 = typeof iteratee2 == "function" ? (arrays.pop(), iteratee2) : undefined2;
|
|
return unzipWith(arrays, iteratee2);
|
|
});
|
|
function chain(value) {
|
|
var result2 = lodash(value);
|
|
result2.__chain__ = true;
|
|
return result2;
|
|
}
|
|
function tap(value, interceptor) {
|
|
interceptor(value);
|
|
return value;
|
|
}
|
|
function thru(value, interceptor) {
|
|
return interceptor(value);
|
|
}
|
|
var wrapperAt = flatRest(function(paths) {
|
|
var length = paths.length, start = length ? paths[0] : 0, value = this.__wrapped__, interceptor = function(object) {
|
|
return baseAt(object, paths);
|
|
};
|
|
if (length > 1 || this.__actions__.length || !(value instanceof LazyWrapper) || !isIndex(start)) {
|
|
return this.thru(interceptor);
|
|
}
|
|
value = value.slice(start, +start + (length ? 1 : 0));
|
|
value.__actions__.push({
|
|
"func": thru,
|
|
"args": [interceptor],
|
|
"thisArg": undefined2
|
|
});
|
|
return new LodashWrapper(value, this.__chain__).thru(function(array) {
|
|
if (length && !array.length) {
|
|
array.push(undefined2);
|
|
}
|
|
return array;
|
|
});
|
|
});
|
|
function wrapperChain() {
|
|
return chain(this);
|
|
}
|
|
function wrapperCommit() {
|
|
return new LodashWrapper(this.value(), this.__chain__);
|
|
}
|
|
function wrapperNext() {
|
|
if (this.__values__ === undefined2) {
|
|
this.__values__ = toArray(this.value());
|
|
}
|
|
var done = this.__index__ >= this.__values__.length, value = done ? undefined2 : this.__values__[this.__index__++];
|
|
return { "done": done, "value": value };
|
|
}
|
|
function wrapperToIterator() {
|
|
return this;
|
|
}
|
|
function wrapperPlant(value) {
|
|
var result2, parent2 = this;
|
|
while (parent2 instanceof baseLodash) {
|
|
var clone2 = wrapperClone(parent2);
|
|
clone2.__index__ = 0;
|
|
clone2.__values__ = undefined2;
|
|
if (result2) {
|
|
previous.__wrapped__ = clone2;
|
|
} else {
|
|
result2 = clone2;
|
|
}
|
|
var previous = clone2;
|
|
parent2 = parent2.__wrapped__;
|
|
}
|
|
previous.__wrapped__ = value;
|
|
return result2;
|
|
}
|
|
function wrapperReverse() {
|
|
var value = this.__wrapped__;
|
|
if (value instanceof LazyWrapper) {
|
|
var wrapped = value;
|
|
if (this.__actions__.length) {
|
|
wrapped = new LazyWrapper(this);
|
|
}
|
|
wrapped = wrapped.reverse();
|
|
wrapped.__actions__.push({
|
|
"func": thru,
|
|
"args": [reverse],
|
|
"thisArg": undefined2
|
|
});
|
|
return new LodashWrapper(wrapped, this.__chain__);
|
|
}
|
|
return this.thru(reverse);
|
|
}
|
|
function wrapperValue() {
|
|
return baseWrapperValue(this.__wrapped__, this.__actions__);
|
|
}
|
|
var countBy = createAggregator(function(result2, value, key2) {
|
|
if (hasOwnProperty.call(result2, key2)) {
|
|
++result2[key2];
|
|
} else {
|
|
baseAssignValue(result2, key2, 1);
|
|
}
|
|
});
|
|
function every(collection, predicate, guard) {
|
|
var func = isArray2(collection) ? arrayEvery : baseEvery;
|
|
if (guard && isIterateeCall(collection, predicate, guard)) {
|
|
predicate = undefined2;
|
|
}
|
|
return func(collection, getIteratee(predicate, 3));
|
|
}
|
|
function filter(collection, predicate) {
|
|
var func = isArray2(collection) ? arrayFilter : baseFilter;
|
|
return func(collection, getIteratee(predicate, 3));
|
|
}
|
|
var find = createFind(findIndex2);
|
|
var findLast = createFind(findLastIndex);
|
|
function flatMap(collection, iteratee2) {
|
|
return baseFlatten(map(collection, iteratee2), 1);
|
|
}
|
|
function flatMapDeep(collection, iteratee2) {
|
|
return baseFlatten(map(collection, iteratee2), INFINITY);
|
|
}
|
|
function flatMapDepth(collection, iteratee2, depth) {
|
|
depth = depth === undefined2 ? 1 : toInteger2(depth);
|
|
return baseFlatten(map(collection, iteratee2), depth);
|
|
}
|
|
function forEach(collection, iteratee2) {
|
|
var func = isArray2(collection) ? arrayEach : baseEach;
|
|
return func(collection, getIteratee(iteratee2, 3));
|
|
}
|
|
function forEachRight(collection, iteratee2) {
|
|
var func = isArray2(collection) ? arrayEachRight : baseEachRight;
|
|
return func(collection, getIteratee(iteratee2, 3));
|
|
}
|
|
var groupBy2 = createAggregator(function(result2, value, key2) {
|
|
if (hasOwnProperty.call(result2, key2)) {
|
|
result2[key2].push(value);
|
|
} else {
|
|
baseAssignValue(result2, key2, [value]);
|
|
}
|
|
});
|
|
function includes(collection, value, fromIndex, guard) {
|
|
collection = isArrayLike(collection) ? collection : values(collection);
|
|
fromIndex = fromIndex && !guard ? toInteger2(fromIndex) : 0;
|
|
var length = collection.length;
|
|
if (fromIndex < 0) {
|
|
fromIndex = nativeMax(length + fromIndex, 0);
|
|
}
|
|
return isString(collection) ? fromIndex <= length && collection.indexOf(value, fromIndex) > -1 : !!length && baseIndexOf(collection, value, fromIndex) > -1;
|
|
}
|
|
var invokeMap = baseRest(function(collection, path, args) {
|
|
var index = -1, isFunc = typeof path == "function", result2 = isArrayLike(collection) ? Array2(collection.length) : [];
|
|
baseEach(collection, function(value) {
|
|
result2[++index] = isFunc ? apply(path, value, args) : baseInvoke(value, path, args);
|
|
});
|
|
return result2;
|
|
});
|
|
var keyBy = createAggregator(function(result2, value, key2) {
|
|
baseAssignValue(result2, key2, value);
|
|
});
|
|
function map(collection, iteratee2) {
|
|
var func = isArray2(collection) ? arrayMap : baseMap;
|
|
return func(collection, getIteratee(iteratee2, 3));
|
|
}
|
|
function orderBy(collection, iteratees, orders, guard) {
|
|
if (collection == null) {
|
|
return [];
|
|
}
|
|
if (!isArray2(iteratees)) {
|
|
iteratees = iteratees == null ? [] : [iteratees];
|
|
}
|
|
orders = guard ? undefined2 : orders;
|
|
if (!isArray2(orders)) {
|
|
orders = orders == null ? [] : [orders];
|
|
}
|
|
return baseOrderBy(collection, iteratees, orders);
|
|
}
|
|
var partition = createAggregator(function(result2, value, key2) {
|
|
result2[key2 ? 0 : 1].push(value);
|
|
}, function() {
|
|
return [[], []];
|
|
});
|
|
function reduce(collection, iteratee2, accumulator) {
|
|
var func = isArray2(collection) ? arrayReduce : baseReduce, initAccum = arguments.length < 3;
|
|
return func(collection, getIteratee(iteratee2, 4), accumulator, initAccum, baseEach);
|
|
}
|
|
function reduceRight(collection, iteratee2, accumulator) {
|
|
var func = isArray2(collection) ? arrayReduceRight : baseReduce, initAccum = arguments.length < 3;
|
|
return func(collection, getIteratee(iteratee2, 4), accumulator, initAccum, baseEachRight);
|
|
}
|
|
function reject(collection, predicate) {
|
|
var func = isArray2(collection) ? arrayFilter : baseFilter;
|
|
return func(collection, negate(getIteratee(predicate, 3)));
|
|
}
|
|
function sample(collection) {
|
|
var func = isArray2(collection) ? arraySample : baseSample;
|
|
return func(collection);
|
|
}
|
|
function sampleSize(collection, n2, guard) {
|
|
if (guard ? isIterateeCall(collection, n2, guard) : n2 === undefined2) {
|
|
n2 = 1;
|
|
} else {
|
|
n2 = toInteger2(n2);
|
|
}
|
|
var func = isArray2(collection) ? arraySampleSize : baseSampleSize;
|
|
return func(collection, n2);
|
|
}
|
|
function shuffle(collection) {
|
|
var func = isArray2(collection) ? arrayShuffle : baseShuffle;
|
|
return func(collection);
|
|
}
|
|
function size(collection) {
|
|
if (collection == null) {
|
|
return 0;
|
|
}
|
|
if (isArrayLike(collection)) {
|
|
return isString(collection) ? stringSize(collection) : collection.length;
|
|
}
|
|
var tag = getTag(collection);
|
|
if (tag == mapTag || tag == setTag) {
|
|
return collection.size;
|
|
}
|
|
return baseKeys(collection).length;
|
|
}
|
|
function some(collection, predicate, guard) {
|
|
var func = isArray2(collection) ? arraySome : baseSome;
|
|
if (guard && isIterateeCall(collection, predicate, guard)) {
|
|
predicate = undefined2;
|
|
}
|
|
return func(collection, getIteratee(predicate, 3));
|
|
}
|
|
var sortBy = baseRest(function(collection, iteratees) {
|
|
if (collection == null) {
|
|
return [];
|
|
}
|
|
var length = iteratees.length;
|
|
if (length > 1 && isIterateeCall(collection, iteratees[0], iteratees[1])) {
|
|
iteratees = [];
|
|
} else if (length > 2 && isIterateeCall(iteratees[0], iteratees[1], iteratees[2])) {
|
|
iteratees = [iteratees[0]];
|
|
}
|
|
return baseOrderBy(collection, baseFlatten(iteratees, 1), []);
|
|
});
|
|
var now = ctxNow || function() {
|
|
return root.Date.now();
|
|
};
|
|
function after(n2, func) {
|
|
if (typeof func != "function") {
|
|
throw new TypeError2(FUNC_ERROR_TEXT);
|
|
}
|
|
n2 = toInteger2(n2);
|
|
return function() {
|
|
if (--n2 < 1) {
|
|
return func.apply(this, arguments);
|
|
}
|
|
};
|
|
}
|
|
function ary(func, n2, guard) {
|
|
n2 = guard ? undefined2 : n2;
|
|
n2 = func && n2 == null ? func.length : n2;
|
|
return createWrap(func, WRAP_ARY_FLAG, undefined2, undefined2, undefined2, undefined2, n2);
|
|
}
|
|
function before(n2, func) {
|
|
var result2;
|
|
if (typeof func != "function") {
|
|
throw new TypeError2(FUNC_ERROR_TEXT);
|
|
}
|
|
n2 = toInteger2(n2);
|
|
return function() {
|
|
if (--n2 > 0) {
|
|
result2 = func.apply(this, arguments);
|
|
}
|
|
if (n2 <= 1) {
|
|
func = undefined2;
|
|
}
|
|
return result2;
|
|
};
|
|
}
|
|
var bind = baseRest(function(func, thisArg, partials) {
|
|
var bitmask = WRAP_BIND_FLAG;
|
|
if (partials.length) {
|
|
var holders = replaceHolders(partials, getHolder(bind));
|
|
bitmask |= WRAP_PARTIAL_FLAG;
|
|
}
|
|
return createWrap(func, bitmask, thisArg, partials, holders);
|
|
});
|
|
var bindKey = baseRest(function(object, key2, partials) {
|
|
var bitmask = WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG;
|
|
if (partials.length) {
|
|
var holders = replaceHolders(partials, getHolder(bindKey));
|
|
bitmask |= WRAP_PARTIAL_FLAG;
|
|
}
|
|
return createWrap(key2, bitmask, object, partials, holders);
|
|
});
|
|
function curry(func, arity, guard) {
|
|
arity = guard ? undefined2 : arity;
|
|
var result2 = createWrap(func, WRAP_CURRY_FLAG, undefined2, undefined2, undefined2, undefined2, undefined2, arity);
|
|
result2.placeholder = curry.placeholder;
|
|
return result2;
|
|
}
|
|
function curryRight(func, arity, guard) {
|
|
arity = guard ? undefined2 : arity;
|
|
var result2 = createWrap(func, WRAP_CURRY_RIGHT_FLAG, undefined2, undefined2, undefined2, undefined2, undefined2, arity);
|
|
result2.placeholder = curryRight.placeholder;
|
|
return result2;
|
|
}
|
|
function debounce4(func, wait, options) {
|
|
var lastArgs, lastThis, maxWait, result2, timerId, lastCallTime, lastInvokeTime = 0, leading = false, maxing = false, trailing = true;
|
|
if (typeof func != "function") {
|
|
throw new TypeError2(FUNC_ERROR_TEXT);
|
|
}
|
|
wait = toNumber(wait) || 0;
|
|
if (isObject(options)) {
|
|
leading = !!options.leading;
|
|
maxing = "maxWait" in options;
|
|
maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait;
|
|
trailing = "trailing" in options ? !!options.trailing : trailing;
|
|
}
|
|
function invokeFunc(time) {
|
|
var args = lastArgs, thisArg = lastThis;
|
|
lastArgs = lastThis = undefined2;
|
|
lastInvokeTime = time;
|
|
result2 = func.apply(thisArg, args);
|
|
return result2;
|
|
}
|
|
function leadingEdge(time) {
|
|
lastInvokeTime = time;
|
|
timerId = setTimeout2(timerExpired, wait);
|
|
return leading ? invokeFunc(time) : result2;
|
|
}
|
|
function remainingWait(time) {
|
|
var timeSinceLastCall = time - lastCallTime, timeSinceLastInvoke = time - lastInvokeTime, timeWaiting = wait - timeSinceLastCall;
|
|
return maxing ? nativeMin(timeWaiting, maxWait - timeSinceLastInvoke) : timeWaiting;
|
|
}
|
|
function shouldInvoke(time) {
|
|
var timeSinceLastCall = time - lastCallTime, timeSinceLastInvoke = time - lastInvokeTime;
|
|
return lastCallTime === undefined2 || timeSinceLastCall >= wait || timeSinceLastCall < 0 || maxing && timeSinceLastInvoke >= maxWait;
|
|
}
|
|
function timerExpired() {
|
|
var time = now();
|
|
if (shouldInvoke(time)) {
|
|
return trailingEdge(time);
|
|
}
|
|
timerId = setTimeout2(timerExpired, remainingWait(time));
|
|
}
|
|
function trailingEdge(time) {
|
|
timerId = undefined2;
|
|
if (trailing && lastArgs) {
|
|
return invokeFunc(time);
|
|
}
|
|
lastArgs = lastThis = undefined2;
|
|
return result2;
|
|
}
|
|
function cancel() {
|
|
if (timerId !== undefined2) {
|
|
clearTimeout2(timerId);
|
|
}
|
|
lastInvokeTime = 0;
|
|
lastArgs = lastCallTime = lastThis = timerId = undefined2;
|
|
}
|
|
function flush() {
|
|
return timerId === undefined2 ? result2 : trailingEdge(now());
|
|
}
|
|
function debounced() {
|
|
var time = now(), isInvoking = shouldInvoke(time);
|
|
lastArgs = arguments;
|
|
lastThis = this;
|
|
lastCallTime = time;
|
|
if (isInvoking) {
|
|
if (timerId === undefined2) {
|
|
return leadingEdge(lastCallTime);
|
|
}
|
|
if (maxing) {
|
|
clearTimeout2(timerId);
|
|
timerId = setTimeout2(timerExpired, wait);
|
|
return invokeFunc(lastCallTime);
|
|
}
|
|
}
|
|
if (timerId === undefined2) {
|
|
timerId = setTimeout2(timerExpired, wait);
|
|
}
|
|
return result2;
|
|
}
|
|
debounced.cancel = cancel;
|
|
debounced.flush = flush;
|
|
return debounced;
|
|
}
|
|
var defer = baseRest(function(func, args) {
|
|
return baseDelay(func, 1, args);
|
|
});
|
|
var delay = baseRest(function(func, wait, args) {
|
|
return baseDelay(func, toNumber(wait) || 0, args);
|
|
});
|
|
function flip(func) {
|
|
return createWrap(func, WRAP_FLIP_FLAG);
|
|
}
|
|
function memoize(func, resolver) {
|
|
if (typeof func != "function" || resolver != null && typeof resolver != "function") {
|
|
throw new TypeError2(FUNC_ERROR_TEXT);
|
|
}
|
|
var memoized = function() {
|
|
var args = arguments, key2 = resolver ? resolver.apply(this, args) : args[0], cache = memoized.cache;
|
|
if (cache.has(key2)) {
|
|
return cache.get(key2);
|
|
}
|
|
var result2 = func.apply(this, args);
|
|
memoized.cache = cache.set(key2, result2) || cache;
|
|
return result2;
|
|
};
|
|
memoized.cache = new (memoize.Cache || MapCache2)();
|
|
return memoized;
|
|
}
|
|
memoize.Cache = MapCache2;
|
|
function negate(predicate) {
|
|
if (typeof predicate != "function") {
|
|
throw new TypeError2(FUNC_ERROR_TEXT);
|
|
}
|
|
return function() {
|
|
var args = arguments;
|
|
switch (args.length) {
|
|
case 0:
|
|
return !predicate.call(this);
|
|
case 1:
|
|
return !predicate.call(this, args[0]);
|
|
case 2:
|
|
return !predicate.call(this, args[0], args[1]);
|
|
case 3:
|
|
return !predicate.call(this, args[0], args[1], args[2]);
|
|
}
|
|
return !predicate.apply(this, args);
|
|
};
|
|
}
|
|
function once(func) {
|
|
return before(2, func);
|
|
}
|
|
var overArgs = castRest(function(func, transforms) {
|
|
transforms = transforms.length == 1 && isArray2(transforms[0]) ? arrayMap(transforms[0], baseUnary(getIteratee())) : arrayMap(baseFlatten(transforms, 1), baseUnary(getIteratee()));
|
|
var funcsLength = transforms.length;
|
|
return baseRest(function(args) {
|
|
var index = -1, length = nativeMin(args.length, funcsLength);
|
|
while (++index < length) {
|
|
args[index] = transforms[index].call(this, args[index]);
|
|
}
|
|
return apply(func, this, args);
|
|
});
|
|
});
|
|
var partial = baseRest(function(func, partials) {
|
|
var holders = replaceHolders(partials, getHolder(partial));
|
|
return createWrap(func, WRAP_PARTIAL_FLAG, undefined2, partials, holders);
|
|
});
|
|
var partialRight = baseRest(function(func, partials) {
|
|
var holders = replaceHolders(partials, getHolder(partialRight));
|
|
return createWrap(func, WRAP_PARTIAL_RIGHT_FLAG, undefined2, partials, holders);
|
|
});
|
|
var rearg = flatRest(function(func, indexes) {
|
|
return createWrap(func, WRAP_REARG_FLAG, undefined2, undefined2, undefined2, indexes);
|
|
});
|
|
function rest(func, start) {
|
|
if (typeof func != "function") {
|
|
throw new TypeError2(FUNC_ERROR_TEXT);
|
|
}
|
|
start = start === undefined2 ? start : toInteger2(start);
|
|
return baseRest(func, start);
|
|
}
|
|
function spread(func, start) {
|
|
if (typeof func != "function") {
|
|
throw new TypeError2(FUNC_ERROR_TEXT);
|
|
}
|
|
start = start == null ? 0 : nativeMax(toInteger2(start), 0);
|
|
return baseRest(function(args) {
|
|
var array = args[start], otherArgs = castSlice(args, 0, start);
|
|
if (array) {
|
|
arrayPush(otherArgs, array);
|
|
}
|
|
return apply(func, this, otherArgs);
|
|
});
|
|
}
|
|
function throttle(func, wait, options) {
|
|
var leading = true, trailing = true;
|
|
if (typeof func != "function") {
|
|
throw new TypeError2(FUNC_ERROR_TEXT);
|
|
}
|
|
if (isObject(options)) {
|
|
leading = "leading" in options ? !!options.leading : leading;
|
|
trailing = "trailing" in options ? !!options.trailing : trailing;
|
|
}
|
|
return debounce4(func, wait, {
|
|
"leading": leading,
|
|
"maxWait": wait,
|
|
"trailing": trailing
|
|
});
|
|
}
|
|
function unary(func) {
|
|
return ary(func, 1);
|
|
}
|
|
function wrap(value, wrapper) {
|
|
return partial(castFunction(wrapper), value);
|
|
}
|
|
function castArray() {
|
|
if (!arguments.length) {
|
|
return [];
|
|
}
|
|
var value = arguments[0];
|
|
return isArray2(value) ? value : [value];
|
|
}
|
|
function clone(value) {
|
|
return baseClone(value, CLONE_SYMBOLS_FLAG);
|
|
}
|
|
function cloneWith(value, customizer) {
|
|
customizer = typeof customizer == "function" ? customizer : undefined2;
|
|
return baseClone(value, CLONE_SYMBOLS_FLAG, customizer);
|
|
}
|
|
function cloneDeep(value) {
|
|
return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG);
|
|
}
|
|
function cloneDeepWith(value, customizer) {
|
|
customizer = typeof customizer == "function" ? customizer : undefined2;
|
|
return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG, customizer);
|
|
}
|
|
function conformsTo(object, source) {
|
|
return source == null || baseConformsTo(object, source, keys(source));
|
|
}
|
|
function eq(value, other) {
|
|
return value === other || value !== value && other !== other;
|
|
}
|
|
var gt = createRelationalOperation(baseGt);
|
|
var gte = createRelationalOperation(function(value, other) {
|
|
return value >= other;
|
|
});
|
|
var isArguments = baseIsArguments(function() {
|
|
return arguments;
|
|
}()) ? baseIsArguments : function(value) {
|
|
return isObjectLike(value) && hasOwnProperty.call(value, "callee") && !propertyIsEnumerable.call(value, "callee");
|
|
};
|
|
var isArray2 = Array2.isArray;
|
|
var isArrayBuffer = nodeIsArrayBuffer ? baseUnary(nodeIsArrayBuffer) : baseIsArrayBuffer;
|
|
function isArrayLike(value) {
|
|
return value != null && isLength(value.length) && !isFunction2(value);
|
|
}
|
|
function isArrayLikeObject(value) {
|
|
return isObjectLike(value) && isArrayLike(value);
|
|
}
|
|
function isBoolean(value) {
|
|
return value === true || value === false || isObjectLike(value) && baseGetTag(value) == boolTag;
|
|
}
|
|
var isBuffer = nativeIsBuffer || stubFalse;
|
|
var isDate2 = nodeIsDate ? baseUnary(nodeIsDate) : baseIsDate;
|
|
function isElement(value) {
|
|
return isObjectLike(value) && value.nodeType === 1 && !isPlainObject(value);
|
|
}
|
|
function isEmpty(value) {
|
|
if (value == null) {
|
|
return true;
|
|
}
|
|
if (isArrayLike(value) && (isArray2(value) || typeof value == "string" || typeof value.splice == "function" || isBuffer(value) || isTypedArray(value) || isArguments(value))) {
|
|
return !value.length;
|
|
}
|
|
var tag = getTag(value);
|
|
if (tag == mapTag || tag == setTag) {
|
|
return !value.size;
|
|
}
|
|
if (isPrototype(value)) {
|
|
return !baseKeys(value).length;
|
|
}
|
|
for (var key2 in value) {
|
|
if (hasOwnProperty.call(value, key2)) {
|
|
return false;
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
function isEqual(value, other) {
|
|
return baseIsEqual(value, other);
|
|
}
|
|
function isEqualWith(value, other, customizer) {
|
|
customizer = typeof customizer == "function" ? customizer : undefined2;
|
|
var result2 = customizer ? customizer(value, other) : undefined2;
|
|
return result2 === undefined2 ? baseIsEqual(value, other, undefined2, customizer) : !!result2;
|
|
}
|
|
function isError2(value) {
|
|
if (!isObjectLike(value)) {
|
|
return false;
|
|
}
|
|
var tag = baseGetTag(value);
|
|
return tag == errorTag || tag == domExcTag || typeof value.message == "string" && typeof value.name == "string" && !isPlainObject(value);
|
|
}
|
|
function isFinite(value) {
|
|
return typeof value == "number" && nativeIsFinite(value);
|
|
}
|
|
function isFunction2(value) {
|
|
if (!isObject(value)) {
|
|
return false;
|
|
}
|
|
var tag = baseGetTag(value);
|
|
return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;
|
|
}
|
|
function isInteger(value) {
|
|
return typeof value == "number" && value == toInteger2(value);
|
|
}
|
|
function isLength(value) {
|
|
return typeof value == "number" && value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;
|
|
}
|
|
function isObject(value) {
|
|
var type = typeof value;
|
|
return value != null && (type == "object" || type == "function");
|
|
}
|
|
function isObjectLike(value) {
|
|
return value != null && typeof value == "object";
|
|
}
|
|
var isMap = nodeIsMap ? baseUnary(nodeIsMap) : baseIsMap;
|
|
function isMatch2(object, source) {
|
|
return object === source || baseIsMatch(object, source, getMatchData(source));
|
|
}
|
|
function isMatchWith(object, source, customizer) {
|
|
customizer = typeof customizer == "function" ? customizer : undefined2;
|
|
return baseIsMatch(object, source, getMatchData(source), customizer);
|
|
}
|
|
function isNaN2(value) {
|
|
return isNumber(value) && value != +value;
|
|
}
|
|
function isNative(value) {
|
|
if (isMaskable(value)) {
|
|
throw new Error2(CORE_ERROR_TEXT);
|
|
}
|
|
return baseIsNative(value);
|
|
}
|
|
function isNull(value) {
|
|
return value === null;
|
|
}
|
|
function isNil(value) {
|
|
return value == null;
|
|
}
|
|
function isNumber(value) {
|
|
return typeof value == "number" || isObjectLike(value) && baseGetTag(value) == numberTag;
|
|
}
|
|
function isPlainObject(value) {
|
|
if (!isObjectLike(value) || baseGetTag(value) != objectTag) {
|
|
return false;
|
|
}
|
|
var proto = getPrototype(value);
|
|
if (proto === null) {
|
|
return true;
|
|
}
|
|
var Ctor = hasOwnProperty.call(proto, "constructor") && proto.constructor;
|
|
return typeof Ctor == "function" && Ctor instanceof Ctor && funcToString.call(Ctor) == objectCtorString;
|
|
}
|
|
var isRegExp = nodeIsRegExp ? baseUnary(nodeIsRegExp) : baseIsRegExp;
|
|
function isSafeInteger(value) {
|
|
return isInteger(value) && value >= -MAX_SAFE_INTEGER && value <= MAX_SAFE_INTEGER;
|
|
}
|
|
var isSet = nodeIsSet ? baseUnary(nodeIsSet) : baseIsSet;
|
|
function isString(value) {
|
|
return typeof value == "string" || !isArray2(value) && isObjectLike(value) && baseGetTag(value) == stringTag;
|
|
}
|
|
function isSymbol(value) {
|
|
return typeof value == "symbol" || isObjectLike(value) && baseGetTag(value) == symbolTag;
|
|
}
|
|
var isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;
|
|
function isUndefined(value) {
|
|
return value === undefined2;
|
|
}
|
|
function isWeakMap(value) {
|
|
return isObjectLike(value) && getTag(value) == weakMapTag;
|
|
}
|
|
function isWeakSet(value) {
|
|
return isObjectLike(value) && baseGetTag(value) == weakSetTag;
|
|
}
|
|
var lt = createRelationalOperation(baseLt);
|
|
var lte = createRelationalOperation(function(value, other) {
|
|
return value <= other;
|
|
});
|
|
function toArray(value) {
|
|
if (!value) {
|
|
return [];
|
|
}
|
|
if (isArrayLike(value)) {
|
|
return isString(value) ? stringToArray(value) : copyArray(value);
|
|
}
|
|
if (symIterator && value[symIterator]) {
|
|
return iteratorToArray(value[symIterator]());
|
|
}
|
|
var tag = getTag(value), func = tag == mapTag ? mapToArray : tag == setTag ? setToArray : values;
|
|
return func(value);
|
|
}
|
|
function toFinite(value) {
|
|
if (!value) {
|
|
return value === 0 ? value : 0;
|
|
}
|
|
value = toNumber(value);
|
|
if (value === INFINITY || value === -INFINITY) {
|
|
var sign = value < 0 ? -1 : 1;
|
|
return sign * MAX_INTEGER;
|
|
}
|
|
return value === value ? value : 0;
|
|
}
|
|
function toInteger2(value) {
|
|
var result2 = toFinite(value), remainder = result2 % 1;
|
|
return result2 === result2 ? remainder ? result2 - remainder : result2 : 0;
|
|
}
|
|
function toLength(value) {
|
|
return value ? baseClamp(toInteger2(value), 0, MAX_ARRAY_LENGTH) : 0;
|
|
}
|
|
function toNumber(value) {
|
|
if (typeof value == "number") {
|
|
return value;
|
|
}
|
|
if (isSymbol(value)) {
|
|
return NAN;
|
|
}
|
|
if (isObject(value)) {
|
|
var other = typeof value.valueOf == "function" ? value.valueOf() : value;
|
|
value = isObject(other) ? other + "" : other;
|
|
}
|
|
if (typeof value != "string") {
|
|
return value === 0 ? value : +value;
|
|
}
|
|
value = baseTrim(value);
|
|
var isBinary = reIsBinary.test(value);
|
|
return isBinary || reIsOctal.test(value) ? freeParseInt(value.slice(2), isBinary ? 2 : 8) : reIsBadHex.test(value) ? NAN : +value;
|
|
}
|
|
function toPlainObject(value) {
|
|
return copyObject(value, keysIn(value));
|
|
}
|
|
function toSafeInteger(value) {
|
|
return value ? baseClamp(toInteger2(value), -MAX_SAFE_INTEGER, MAX_SAFE_INTEGER) : value === 0 ? value : 0;
|
|
}
|
|
function toString2(value) {
|
|
return value == null ? "" : baseToString(value);
|
|
}
|
|
var assign2 = createAssigner(function(object, source) {
|
|
if (isPrototype(source) || isArrayLike(source)) {
|
|
copyObject(source, keys(source), object);
|
|
return;
|
|
}
|
|
for (var key2 in source) {
|
|
if (hasOwnProperty.call(source, key2)) {
|
|
assignValue(object, key2, source[key2]);
|
|
}
|
|
}
|
|
});
|
|
var assignIn = createAssigner(function(object, source) {
|
|
copyObject(source, keysIn(source), object);
|
|
});
|
|
var assignInWith = createAssigner(function(object, source, srcIndex, customizer) {
|
|
copyObject(source, keysIn(source), object, customizer);
|
|
});
|
|
var assignWith = createAssigner(function(object, source, srcIndex, customizer) {
|
|
copyObject(source, keys(source), object, customizer);
|
|
});
|
|
var at = flatRest(baseAt);
|
|
function create(prototype, properties2) {
|
|
var result2 = baseCreate(prototype);
|
|
return properties2 == null ? result2 : baseAssign(result2, properties2);
|
|
}
|
|
var defaults = baseRest(function(object, sources) {
|
|
object = Object2(object);
|
|
var index = -1;
|
|
var length = sources.length;
|
|
var guard = length > 2 ? sources[2] : undefined2;
|
|
if (guard && isIterateeCall(sources[0], sources[1], guard)) {
|
|
length = 1;
|
|
}
|
|
while (++index < length) {
|
|
var source = sources[index];
|
|
var props2 = keysIn(source);
|
|
var propsIndex = -1;
|
|
var propsLength = props2.length;
|
|
while (++propsIndex < propsLength) {
|
|
var key2 = props2[propsIndex];
|
|
var value = object[key2];
|
|
if (value === undefined2 || eq(value, objectProto[key2]) && !hasOwnProperty.call(object, key2)) {
|
|
object[key2] = source[key2];
|
|
}
|
|
}
|
|
}
|
|
return object;
|
|
});
|
|
var defaultsDeep = baseRest(function(args) {
|
|
args.push(undefined2, customDefaultsMerge);
|
|
return apply(mergeWith, undefined2, args);
|
|
});
|
|
function findKey2(object, predicate) {
|
|
return baseFindKey(object, getIteratee(predicate, 3), baseForOwn);
|
|
}
|
|
function findLastKey(object, predicate) {
|
|
return baseFindKey(object, getIteratee(predicate, 3), baseForOwnRight);
|
|
}
|
|
function forIn(object, iteratee2) {
|
|
return object == null ? object : baseFor(object, getIteratee(iteratee2, 3), keysIn);
|
|
}
|
|
function forInRight(object, iteratee2) {
|
|
return object == null ? object : baseForRight(object, getIteratee(iteratee2, 3), keysIn);
|
|
}
|
|
function forOwn(object, iteratee2) {
|
|
return object && baseForOwn(object, getIteratee(iteratee2, 3));
|
|
}
|
|
function forOwnRight(object, iteratee2) {
|
|
return object && baseForOwnRight(object, getIteratee(iteratee2, 3));
|
|
}
|
|
function functions(object) {
|
|
return object == null ? [] : baseFunctions(object, keys(object));
|
|
}
|
|
function functionsIn(object) {
|
|
return object == null ? [] : baseFunctions(object, keysIn(object));
|
|
}
|
|
function get(object, path, defaultValue2) {
|
|
var result2 = object == null ? undefined2 : baseGet(object, path);
|
|
return result2 === undefined2 ? defaultValue2 : result2;
|
|
}
|
|
function has(object, path) {
|
|
return object != null && hasPath(object, path, baseHas);
|
|
}
|
|
function hasIn(object, path) {
|
|
return object != null && hasPath(object, path, baseHasIn);
|
|
}
|
|
var invert = createInverter(function(result2, value, key2) {
|
|
if (value != null && typeof value.toString != "function") {
|
|
value = nativeObjectToString.call(value);
|
|
}
|
|
result2[value] = key2;
|
|
}, constant(identity));
|
|
var invertBy = createInverter(function(result2, value, key2) {
|
|
if (value != null && typeof value.toString != "function") {
|
|
value = nativeObjectToString.call(value);
|
|
}
|
|
if (hasOwnProperty.call(result2, value)) {
|
|
result2[value].push(key2);
|
|
} else {
|
|
result2[value] = [key2];
|
|
}
|
|
}, getIteratee);
|
|
var invoke = baseRest(baseInvoke);
|
|
function keys(object) {
|
|
return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);
|
|
}
|
|
function keysIn(object) {
|
|
return isArrayLike(object) ? arrayLikeKeys(object, true) : baseKeysIn(object);
|
|
}
|
|
function mapKeys(object, iteratee2) {
|
|
var result2 = {};
|
|
iteratee2 = getIteratee(iteratee2, 3);
|
|
baseForOwn(object, function(value, key2, object2) {
|
|
baseAssignValue(result2, iteratee2(value, key2, object2), value);
|
|
});
|
|
return result2;
|
|
}
|
|
function mapValues(object, iteratee2) {
|
|
var result2 = {};
|
|
iteratee2 = getIteratee(iteratee2, 3);
|
|
baseForOwn(object, function(value, key2, object2) {
|
|
baseAssignValue(result2, key2, iteratee2(value, key2, object2));
|
|
});
|
|
return result2;
|
|
}
|
|
var merge = createAssigner(function(object, source, srcIndex) {
|
|
baseMerge(object, source, srcIndex);
|
|
});
|
|
var mergeWith = createAssigner(function(object, source, srcIndex, customizer) {
|
|
baseMerge(object, source, srcIndex, customizer);
|
|
});
|
|
var omit = flatRest(function(object, paths) {
|
|
var result2 = {};
|
|
if (object == null) {
|
|
return result2;
|
|
}
|
|
var isDeep = false;
|
|
paths = arrayMap(paths, function(path) {
|
|
path = castPath(path, object);
|
|
isDeep || (isDeep = path.length > 1);
|
|
return path;
|
|
});
|
|
copyObject(object, getAllKeysIn(object), result2);
|
|
if (isDeep) {
|
|
result2 = baseClone(result2, CLONE_DEEP_FLAG | CLONE_FLAT_FLAG | CLONE_SYMBOLS_FLAG, customOmitClone);
|
|
}
|
|
var length = paths.length;
|
|
while (length--) {
|
|
baseUnset(result2, paths[length]);
|
|
}
|
|
return result2;
|
|
});
|
|
function omitBy(object, predicate) {
|
|
return pickBy(object, negate(getIteratee(predicate)));
|
|
}
|
|
var pick = flatRest(function(object, paths) {
|
|
return object == null ? {} : basePick(object, paths);
|
|
});
|
|
function pickBy(object, predicate) {
|
|
if (object == null) {
|
|
return {};
|
|
}
|
|
var props2 = arrayMap(getAllKeysIn(object), function(prop) {
|
|
return [prop];
|
|
});
|
|
predicate = getIteratee(predicate);
|
|
return basePickBy(object, props2, function(value, path) {
|
|
return predicate(value, path[0]);
|
|
});
|
|
}
|
|
function result(object, path, defaultValue2) {
|
|
path = castPath(path, object);
|
|
var index = -1, length = path.length;
|
|
if (!length) {
|
|
length = 1;
|
|
object = undefined2;
|
|
}
|
|
while (++index < length) {
|
|
var value = object == null ? undefined2 : object[toKey(path[index])];
|
|
if (value === undefined2) {
|
|
index = length;
|
|
value = defaultValue2;
|
|
}
|
|
object = isFunction2(value) ? value.call(object) : value;
|
|
}
|
|
return object;
|
|
}
|
|
function set(object, path, value) {
|
|
return object == null ? object : baseSet(object, path, value);
|
|
}
|
|
function setWith(object, path, value, customizer) {
|
|
customizer = typeof customizer == "function" ? customizer : undefined2;
|
|
return object == null ? object : baseSet(object, path, value, customizer);
|
|
}
|
|
var toPairs = createToPairs(keys);
|
|
var toPairsIn = createToPairs(keysIn);
|
|
function transform(object, iteratee2, accumulator) {
|
|
var isArr = isArray2(object), isArrLike = isArr || isBuffer(object) || isTypedArray(object);
|
|
iteratee2 = getIteratee(iteratee2, 4);
|
|
if (accumulator == null) {
|
|
var Ctor = object && object.constructor;
|
|
if (isArrLike) {
|
|
accumulator = isArr ? new Ctor() : [];
|
|
} else if (isObject(object)) {
|
|
accumulator = isFunction2(Ctor) ? baseCreate(getPrototype(object)) : {};
|
|
} else {
|
|
accumulator = {};
|
|
}
|
|
}
|
|
(isArrLike ? arrayEach : baseForOwn)(object, function(value, index, object2) {
|
|
return iteratee2(accumulator, value, index, object2);
|
|
});
|
|
return accumulator;
|
|
}
|
|
function unset(object, path) {
|
|
return object == null ? true : baseUnset(object, path);
|
|
}
|
|
function update(object, path, updater) {
|
|
return object == null ? object : baseUpdate(object, path, castFunction(updater));
|
|
}
|
|
function updateWith(object, path, updater, customizer) {
|
|
customizer = typeof customizer == "function" ? customizer : undefined2;
|
|
return object == null ? object : baseUpdate(object, path, castFunction(updater), customizer);
|
|
}
|
|
function values(object) {
|
|
return object == null ? [] : baseValues(object, keys(object));
|
|
}
|
|
function valuesIn(object) {
|
|
return object == null ? [] : baseValues(object, keysIn(object));
|
|
}
|
|
function clamp(number, lower, upper) {
|
|
if (upper === undefined2) {
|
|
upper = lower;
|
|
lower = undefined2;
|
|
}
|
|
if (upper !== undefined2) {
|
|
upper = toNumber(upper);
|
|
upper = upper === upper ? upper : 0;
|
|
}
|
|
if (lower !== undefined2) {
|
|
lower = toNumber(lower);
|
|
lower = lower === lower ? lower : 0;
|
|
}
|
|
return baseClamp(toNumber(number), lower, upper);
|
|
}
|
|
function inRange(number, start, end) {
|
|
start = toFinite(start);
|
|
if (end === undefined2) {
|
|
end = start;
|
|
start = 0;
|
|
} else {
|
|
end = toFinite(end);
|
|
}
|
|
number = toNumber(number);
|
|
return baseInRange(number, start, end);
|
|
}
|
|
function random(lower, upper, floating) {
|
|
if (floating && typeof floating != "boolean" && isIterateeCall(lower, upper, floating)) {
|
|
upper = floating = undefined2;
|
|
}
|
|
if (floating === undefined2) {
|
|
if (typeof upper == "boolean") {
|
|
floating = upper;
|
|
upper = undefined2;
|
|
} else if (typeof lower == "boolean") {
|
|
floating = lower;
|
|
lower = undefined2;
|
|
}
|
|
}
|
|
if (lower === undefined2 && upper === undefined2) {
|
|
lower = 0;
|
|
upper = 1;
|
|
} else {
|
|
lower = toFinite(lower);
|
|
if (upper === undefined2) {
|
|
upper = lower;
|
|
lower = 0;
|
|
} else {
|
|
upper = toFinite(upper);
|
|
}
|
|
}
|
|
if (lower > upper) {
|
|
var temp = lower;
|
|
lower = upper;
|
|
upper = temp;
|
|
}
|
|
if (floating || lower % 1 || upper % 1) {
|
|
var rand = nativeRandom();
|
|
return nativeMin(lower + rand * (upper - lower + freeParseFloat("1e-" + ((rand + "").length - 1))), upper);
|
|
}
|
|
return baseRandom(lower, upper);
|
|
}
|
|
var camelCase = createCompounder(function(result2, word, index) {
|
|
word = word.toLowerCase();
|
|
return result2 + (index ? capitalize(word) : word);
|
|
});
|
|
function capitalize(string) {
|
|
return upperFirst(toString2(string).toLowerCase());
|
|
}
|
|
function deburr(string) {
|
|
string = toString2(string);
|
|
return string && string.replace(reLatin, deburrLetter).replace(reComboMark, "");
|
|
}
|
|
function endsWith(string, target, position) {
|
|
string = toString2(string);
|
|
target = baseToString(target);
|
|
var length = string.length;
|
|
position = position === undefined2 ? length : baseClamp(toInteger2(position), 0, length);
|
|
var end = position;
|
|
position -= target.length;
|
|
return position >= 0 && string.slice(position, end) == target;
|
|
}
|
|
function escape(string) {
|
|
string = toString2(string);
|
|
return string && reHasUnescapedHtml.test(string) ? string.replace(reUnescapedHtml, escapeHtmlChar) : string;
|
|
}
|
|
function escapeRegExp(string) {
|
|
string = toString2(string);
|
|
return string && reHasRegExpChar.test(string) ? string.replace(reRegExpChar, "\\$&") : string;
|
|
}
|
|
var kebabCase = createCompounder(function(result2, word, index) {
|
|
return result2 + (index ? "-" : "") + word.toLowerCase();
|
|
});
|
|
var lowerCase = createCompounder(function(result2, word, index) {
|
|
return result2 + (index ? " " : "") + word.toLowerCase();
|
|
});
|
|
var lowerFirst = createCaseFirst("toLowerCase");
|
|
function pad(string, length, chars) {
|
|
string = toString2(string);
|
|
length = toInteger2(length);
|
|
var strLength = length ? stringSize(string) : 0;
|
|
if (!length || strLength >= length) {
|
|
return string;
|
|
}
|
|
var mid = (length - strLength) / 2;
|
|
return createPadding(nativeFloor(mid), chars) + string + createPadding(nativeCeil(mid), chars);
|
|
}
|
|
function padEnd(string, length, chars) {
|
|
string = toString2(string);
|
|
length = toInteger2(length);
|
|
var strLength = length ? stringSize(string) : 0;
|
|
return length && strLength < length ? string + createPadding(length - strLength, chars) : string;
|
|
}
|
|
function padStart(string, length, chars) {
|
|
string = toString2(string);
|
|
length = toInteger2(length);
|
|
var strLength = length ? stringSize(string) : 0;
|
|
return length && strLength < length ? createPadding(length - strLength, chars) + string : string;
|
|
}
|
|
function parseInt2(string, radix, guard) {
|
|
if (guard || radix == null) {
|
|
radix = 0;
|
|
} else if (radix) {
|
|
radix = +radix;
|
|
}
|
|
return nativeParseInt(toString2(string).replace(reTrimStart, ""), radix || 0);
|
|
}
|
|
function repeat(string, n2, guard) {
|
|
if (guard ? isIterateeCall(string, n2, guard) : n2 === undefined2) {
|
|
n2 = 1;
|
|
} else {
|
|
n2 = toInteger2(n2);
|
|
}
|
|
return baseRepeat(toString2(string), n2);
|
|
}
|
|
function replace() {
|
|
var args = arguments, string = toString2(args[0]);
|
|
return args.length < 3 ? string : string.replace(args[1], args[2]);
|
|
}
|
|
var snakeCase = createCompounder(function(result2, word, index) {
|
|
return result2 + (index ? "_" : "") + word.toLowerCase();
|
|
});
|
|
function split(string, separator, limit) {
|
|
if (limit && typeof limit != "number" && isIterateeCall(string, separator, limit)) {
|
|
separator = limit = undefined2;
|
|
}
|
|
limit = limit === undefined2 ? MAX_ARRAY_LENGTH : limit >>> 0;
|
|
if (!limit) {
|
|
return [];
|
|
}
|
|
string = toString2(string);
|
|
if (string && (typeof separator == "string" || separator != null && !isRegExp(separator))) {
|
|
separator = baseToString(separator);
|
|
if (!separator && hasUnicode(string)) {
|
|
return castSlice(stringToArray(string), 0, limit);
|
|
}
|
|
}
|
|
return string.split(separator, limit);
|
|
}
|
|
var startCase = createCompounder(function(result2, word, index) {
|
|
return result2 + (index ? " " : "") + upperFirst(word);
|
|
});
|
|
function startsWith(string, target, position) {
|
|
string = toString2(string);
|
|
position = position == null ? 0 : baseClamp(toInteger2(position), 0, string.length);
|
|
target = baseToString(target);
|
|
return string.slice(position, position + target.length) == target;
|
|
}
|
|
function template(string, options, guard) {
|
|
var settings = lodash.templateSettings;
|
|
if (guard && isIterateeCall(string, options, guard)) {
|
|
options = undefined2;
|
|
}
|
|
string = toString2(string);
|
|
options = assignInWith({}, options, settings, customDefaultsAssignIn);
|
|
var imports = assignInWith({}, options.imports, settings.imports, customDefaultsAssignIn), importsKeys = keys(imports), importsValues = baseValues(imports, importsKeys);
|
|
var isEscaping, isEvaluating, index = 0, interpolate = options.interpolate || reNoMatch, source = "__p += '";
|
|
var reDelimiters = RegExp2(
|
|
(options.escape || reNoMatch).source + "|" + interpolate.source + "|" + (interpolate === reInterpolate ? reEsTemplate : reNoMatch).source + "|" + (options.evaluate || reNoMatch).source + "|$",
|
|
"g"
|
|
);
|
|
var sourceURL = "//# sourceURL=" + (hasOwnProperty.call(options, "sourceURL") ? (options.sourceURL + "").replace(/\s/g, " ") : "lodash.templateSources[" + ++templateCounter + "]") + "\n";
|
|
string.replace(reDelimiters, function(match2, escapeValue, interpolateValue, esTemplateValue, evaluateValue, offset) {
|
|
interpolateValue || (interpolateValue = esTemplateValue);
|
|
source += string.slice(index, offset).replace(reUnescapedString, escapeStringChar);
|
|
if (escapeValue) {
|
|
isEscaping = true;
|
|
source += "' +\n__e(" + escapeValue + ") +\n'";
|
|
}
|
|
if (evaluateValue) {
|
|
isEvaluating = true;
|
|
source += "';\n" + evaluateValue + ";\n__p += '";
|
|
}
|
|
if (interpolateValue) {
|
|
source += "' +\n((__t = (" + interpolateValue + ")) == null ? '' : __t) +\n'";
|
|
}
|
|
index = offset + match2.length;
|
|
return match2;
|
|
});
|
|
source += "';\n";
|
|
var variable = hasOwnProperty.call(options, "variable") && options.variable;
|
|
if (!variable) {
|
|
source = "with (obj) {\n" + source + "\n}\n";
|
|
} else if (reForbiddenIdentifierChars.test(variable)) {
|
|
throw new Error2(INVALID_TEMPL_VAR_ERROR_TEXT);
|
|
}
|
|
source = (isEvaluating ? source.replace(reEmptyStringLeading, "") : source).replace(reEmptyStringMiddle, "$1").replace(reEmptyStringTrailing, "$1;");
|
|
source = "function(" + (variable || "obj") + ") {\n" + (variable ? "" : "obj || (obj = {});\n") + "var __t, __p = ''" + (isEscaping ? ", __e = _.escape" : "") + (isEvaluating ? ", __j = Array.prototype.join;\nfunction print() { __p += __j.call(arguments, '') }\n" : ";\n") + source + "return __p\n}";
|
|
var result2 = attempt(function() {
|
|
return Function2(importsKeys, sourceURL + "return " + source).apply(undefined2, importsValues);
|
|
});
|
|
result2.source = source;
|
|
if (isError2(result2)) {
|
|
throw result2;
|
|
}
|
|
return result2;
|
|
}
|
|
function toLower(value) {
|
|
return toString2(value).toLowerCase();
|
|
}
|
|
function toUpper(value) {
|
|
return toString2(value).toUpperCase();
|
|
}
|
|
function trim(string, chars, guard) {
|
|
string = toString2(string);
|
|
if (string && (guard || chars === undefined2)) {
|
|
return baseTrim(string);
|
|
}
|
|
if (!string || !(chars = baseToString(chars))) {
|
|
return string;
|
|
}
|
|
var strSymbols = stringToArray(string), chrSymbols = stringToArray(chars), start = charsStartIndex(strSymbols, chrSymbols), end = charsEndIndex(strSymbols, chrSymbols) + 1;
|
|
return castSlice(strSymbols, start, end).join("");
|
|
}
|
|
function trimEnd(string, chars, guard) {
|
|
string = toString2(string);
|
|
if (string && (guard || chars === undefined2)) {
|
|
return string.slice(0, trimmedEndIndex(string) + 1);
|
|
}
|
|
if (!string || !(chars = baseToString(chars))) {
|
|
return string;
|
|
}
|
|
var strSymbols = stringToArray(string), end = charsEndIndex(strSymbols, stringToArray(chars)) + 1;
|
|
return castSlice(strSymbols, 0, end).join("");
|
|
}
|
|
function trimStart(string, chars, guard) {
|
|
string = toString2(string);
|
|
if (string && (guard || chars === undefined2)) {
|
|
return string.replace(reTrimStart, "");
|
|
}
|
|
if (!string || !(chars = baseToString(chars))) {
|
|
return string;
|
|
}
|
|
var strSymbols = stringToArray(string), start = charsStartIndex(strSymbols, stringToArray(chars));
|
|
return castSlice(strSymbols, start).join("");
|
|
}
|
|
function truncate(string, options) {
|
|
var length = DEFAULT_TRUNC_LENGTH, omission = DEFAULT_TRUNC_OMISSION;
|
|
if (isObject(options)) {
|
|
var separator = "separator" in options ? options.separator : separator;
|
|
length = "length" in options ? toInteger2(options.length) : length;
|
|
omission = "omission" in options ? baseToString(options.omission) : omission;
|
|
}
|
|
string = toString2(string);
|
|
var strLength = string.length;
|
|
if (hasUnicode(string)) {
|
|
var strSymbols = stringToArray(string);
|
|
strLength = strSymbols.length;
|
|
}
|
|
if (length >= strLength) {
|
|
return string;
|
|
}
|
|
var end = length - stringSize(omission);
|
|
if (end < 1) {
|
|
return omission;
|
|
}
|
|
var result2 = strSymbols ? castSlice(strSymbols, 0, end).join("") : string.slice(0, end);
|
|
if (separator === undefined2) {
|
|
return result2 + omission;
|
|
}
|
|
if (strSymbols) {
|
|
end += result2.length - end;
|
|
}
|
|
if (isRegExp(separator)) {
|
|
if (string.slice(end).search(separator)) {
|
|
var match2, substring = result2;
|
|
if (!separator.global) {
|
|
separator = RegExp2(separator.source, toString2(reFlags.exec(separator)) + "g");
|
|
}
|
|
separator.lastIndex = 0;
|
|
while (match2 = separator.exec(substring)) {
|
|
var newEnd = match2.index;
|
|
}
|
|
result2 = result2.slice(0, newEnd === undefined2 ? end : newEnd);
|
|
}
|
|
} else if (string.indexOf(baseToString(separator), end) != end) {
|
|
var index = result2.lastIndexOf(separator);
|
|
if (index > -1) {
|
|
result2 = result2.slice(0, index);
|
|
}
|
|
}
|
|
return result2 + omission;
|
|
}
|
|
function unescape(string) {
|
|
string = toString2(string);
|
|
return string && reHasEscapedHtml.test(string) ? string.replace(reEscapedHtml, unescapeHtmlChar) : string;
|
|
}
|
|
var upperCase = createCompounder(function(result2, word, index) {
|
|
return result2 + (index ? " " : "") + word.toUpperCase();
|
|
});
|
|
var upperFirst = createCaseFirst("toUpperCase");
|
|
function words(string, pattern, guard) {
|
|
string = toString2(string);
|
|
pattern = guard ? undefined2 : pattern;
|
|
if (pattern === undefined2) {
|
|
return hasUnicodeWord(string) ? unicodeWords(string) : asciiWords(string);
|
|
}
|
|
return string.match(pattern) || [];
|
|
}
|
|
var attempt = baseRest(function(func, args) {
|
|
try {
|
|
return apply(func, undefined2, args);
|
|
} catch (e4) {
|
|
return isError2(e4) ? e4 : new Error2(e4);
|
|
}
|
|
});
|
|
var bindAll = flatRest(function(object, methodNames) {
|
|
arrayEach(methodNames, function(key2) {
|
|
key2 = toKey(key2);
|
|
baseAssignValue(object, key2, bind(object[key2], object));
|
|
});
|
|
return object;
|
|
});
|
|
function cond(pairs) {
|
|
var length = pairs == null ? 0 : pairs.length, toIteratee = getIteratee();
|
|
pairs = !length ? [] : arrayMap(pairs, function(pair) {
|
|
if (typeof pair[1] != "function") {
|
|
throw new TypeError2(FUNC_ERROR_TEXT);
|
|
}
|
|
return [toIteratee(pair[0]), pair[1]];
|
|
});
|
|
return baseRest(function(args) {
|
|
var index = -1;
|
|
while (++index < length) {
|
|
var pair = pairs[index];
|
|
if (apply(pair[0], this, args)) {
|
|
return apply(pair[1], this, args);
|
|
}
|
|
}
|
|
});
|
|
}
|
|
function conforms(source) {
|
|
return baseConforms(baseClone(source, CLONE_DEEP_FLAG));
|
|
}
|
|
function constant(value) {
|
|
return function() {
|
|
return value;
|
|
};
|
|
}
|
|
function defaultTo(value, defaultValue2) {
|
|
return value == null || value !== value ? defaultValue2 : value;
|
|
}
|
|
var flow = createFlow();
|
|
var flowRight = createFlow(true);
|
|
function identity(value) {
|
|
return value;
|
|
}
|
|
function iteratee(func) {
|
|
return baseIteratee(typeof func == "function" ? func : baseClone(func, CLONE_DEEP_FLAG));
|
|
}
|
|
function matches(source) {
|
|
return baseMatches(baseClone(source, CLONE_DEEP_FLAG));
|
|
}
|
|
function matchesProperty(path, srcValue) {
|
|
return baseMatchesProperty(path, baseClone(srcValue, CLONE_DEEP_FLAG));
|
|
}
|
|
var method = baseRest(function(path, args) {
|
|
return function(object) {
|
|
return baseInvoke(object, path, args);
|
|
};
|
|
});
|
|
var methodOf = baseRest(function(object, args) {
|
|
return function(path) {
|
|
return baseInvoke(object, path, args);
|
|
};
|
|
});
|
|
function mixin(object, source, options) {
|
|
var props2 = keys(source), methodNames = baseFunctions(source, props2);
|
|
if (options == null && !(isObject(source) && (methodNames.length || !props2.length))) {
|
|
options = source;
|
|
source = object;
|
|
object = this;
|
|
methodNames = baseFunctions(source, keys(source));
|
|
}
|
|
var chain2 = !(isObject(options) && "chain" in options) || !!options.chain, isFunc = isFunction2(object);
|
|
arrayEach(methodNames, function(methodName) {
|
|
var func = source[methodName];
|
|
object[methodName] = func;
|
|
if (isFunc) {
|
|
object.prototype[methodName] = function() {
|
|
var chainAll = this.__chain__;
|
|
if (chain2 || chainAll) {
|
|
var result2 = object(this.__wrapped__), actions = result2.__actions__ = copyArray(this.__actions__);
|
|
actions.push({ "func": func, "args": arguments, "thisArg": object });
|
|
result2.__chain__ = chainAll;
|
|
return result2;
|
|
}
|
|
return func.apply(object, arrayPush([this.value()], arguments));
|
|
};
|
|
}
|
|
});
|
|
return object;
|
|
}
|
|
function noConflict() {
|
|
if (root._ === this) {
|
|
root._ = oldDash;
|
|
}
|
|
return this;
|
|
}
|
|
function noop2() {
|
|
}
|
|
function nthArg(n2) {
|
|
n2 = toInteger2(n2);
|
|
return baseRest(function(args) {
|
|
return baseNth(args, n2);
|
|
});
|
|
}
|
|
var over = createOver(arrayMap);
|
|
var overEvery = createOver(arrayEvery);
|
|
var overSome = createOver(arraySome);
|
|
function property(path) {
|
|
return isKey(path) ? baseProperty(toKey(path)) : basePropertyDeep(path);
|
|
}
|
|
function propertyOf(object) {
|
|
return function(path) {
|
|
return object == null ? undefined2 : baseGet(object, path);
|
|
};
|
|
}
|
|
var range = createRange();
|
|
var rangeRight = createRange(true);
|
|
function stubArray() {
|
|
return [];
|
|
}
|
|
function stubFalse() {
|
|
return false;
|
|
}
|
|
function stubObject() {
|
|
return {};
|
|
}
|
|
function stubString() {
|
|
return "";
|
|
}
|
|
function stubTrue() {
|
|
return true;
|
|
}
|
|
function times(n2, iteratee2) {
|
|
n2 = toInteger2(n2);
|
|
if (n2 < 1 || n2 > MAX_SAFE_INTEGER) {
|
|
return [];
|
|
}
|
|
var index = MAX_ARRAY_LENGTH, length = nativeMin(n2, MAX_ARRAY_LENGTH);
|
|
iteratee2 = getIteratee(iteratee2);
|
|
n2 -= MAX_ARRAY_LENGTH;
|
|
var result2 = baseTimes(length, iteratee2);
|
|
while (++index < n2) {
|
|
iteratee2(index);
|
|
}
|
|
return result2;
|
|
}
|
|
function toPath(value) {
|
|
if (isArray2(value)) {
|
|
return arrayMap(value, toKey);
|
|
}
|
|
return isSymbol(value) ? [value] : copyArray(stringToPath(toString2(value)));
|
|
}
|
|
function uniqueId(prefix) {
|
|
var id2 = ++idCounter;
|
|
return toString2(prefix) + id2;
|
|
}
|
|
var add2 = createMathOperation(function(augend, addend) {
|
|
return augend + addend;
|
|
}, 0);
|
|
var ceil = createRound("ceil");
|
|
var divide = createMathOperation(function(dividend, divisor) {
|
|
return dividend / divisor;
|
|
}, 1);
|
|
var floor = createRound("floor");
|
|
function max3(array) {
|
|
return array && array.length ? baseExtremum(array, identity, baseGt) : undefined2;
|
|
}
|
|
function maxBy(array, iteratee2) {
|
|
return array && array.length ? baseExtremum(array, getIteratee(iteratee2, 2), baseGt) : undefined2;
|
|
}
|
|
function mean2(array) {
|
|
return baseMean(array, identity);
|
|
}
|
|
function meanBy(array, iteratee2) {
|
|
return baseMean(array, getIteratee(iteratee2, 2));
|
|
}
|
|
function min3(array) {
|
|
return array && array.length ? baseExtremum(array, identity, baseLt) : undefined2;
|
|
}
|
|
function minBy(array, iteratee2) {
|
|
return array && array.length ? baseExtremum(array, getIteratee(iteratee2, 2), baseLt) : undefined2;
|
|
}
|
|
var multiply = createMathOperation(function(multiplier, multiplicand) {
|
|
return multiplier * multiplicand;
|
|
}, 1);
|
|
var round = createRound("round");
|
|
var subtract2 = createMathOperation(function(minuend, subtrahend) {
|
|
return minuend - subtrahend;
|
|
}, 0);
|
|
function sum2(array) {
|
|
return array && array.length ? baseSum(array, identity) : 0;
|
|
}
|
|
function sumBy(array, iteratee2) {
|
|
return array && array.length ? baseSum(array, getIteratee(iteratee2, 2)) : 0;
|
|
}
|
|
lodash.after = after;
|
|
lodash.ary = ary;
|
|
lodash.assign = assign2;
|
|
lodash.assignIn = assignIn;
|
|
lodash.assignInWith = assignInWith;
|
|
lodash.assignWith = assignWith;
|
|
lodash.at = at;
|
|
lodash.before = before;
|
|
lodash.bind = bind;
|
|
lodash.bindAll = bindAll;
|
|
lodash.bindKey = bindKey;
|
|
lodash.castArray = castArray;
|
|
lodash.chain = chain;
|
|
lodash.chunk = chunk;
|
|
lodash.compact = compact;
|
|
lodash.concat = concat;
|
|
lodash.cond = cond;
|
|
lodash.conforms = conforms;
|
|
lodash.constant = constant;
|
|
lodash.countBy = countBy;
|
|
lodash.create = create;
|
|
lodash.curry = curry;
|
|
lodash.curryRight = curryRight;
|
|
lodash.debounce = debounce4;
|
|
lodash.defaults = defaults;
|
|
lodash.defaultsDeep = defaultsDeep;
|
|
lodash.defer = defer;
|
|
lodash.delay = delay;
|
|
lodash.difference = difference;
|
|
lodash.differenceBy = differenceBy;
|
|
lodash.differenceWith = differenceWith;
|
|
lodash.drop = drop;
|
|
lodash.dropRight = dropRight;
|
|
lodash.dropRightWhile = dropRightWhile;
|
|
lodash.dropWhile = dropWhile;
|
|
lodash.fill = fill;
|
|
lodash.filter = filter;
|
|
lodash.flatMap = flatMap;
|
|
lodash.flatMapDeep = flatMapDeep;
|
|
lodash.flatMapDepth = flatMapDepth;
|
|
lodash.flatten = flatten;
|
|
lodash.flattenDeep = flattenDeep;
|
|
lodash.flattenDepth = flattenDepth;
|
|
lodash.flip = flip;
|
|
lodash.flow = flow;
|
|
lodash.flowRight = flowRight;
|
|
lodash.fromPairs = fromPairs;
|
|
lodash.functions = functions;
|
|
lodash.functionsIn = functionsIn;
|
|
lodash.groupBy = groupBy2;
|
|
lodash.initial = initial;
|
|
lodash.intersection = intersection;
|
|
lodash.intersectionBy = intersectionBy;
|
|
lodash.intersectionWith = intersectionWith;
|
|
lodash.invert = invert;
|
|
lodash.invertBy = invertBy;
|
|
lodash.invokeMap = invokeMap;
|
|
lodash.iteratee = iteratee;
|
|
lodash.keyBy = keyBy;
|
|
lodash.keys = keys;
|
|
lodash.keysIn = keysIn;
|
|
lodash.map = map;
|
|
lodash.mapKeys = mapKeys;
|
|
lodash.mapValues = mapValues;
|
|
lodash.matches = matches;
|
|
lodash.matchesProperty = matchesProperty;
|
|
lodash.memoize = memoize;
|
|
lodash.merge = merge;
|
|
lodash.mergeWith = mergeWith;
|
|
lodash.method = method;
|
|
lodash.methodOf = methodOf;
|
|
lodash.mixin = mixin;
|
|
lodash.negate = negate;
|
|
lodash.nthArg = nthArg;
|
|
lodash.omit = omit;
|
|
lodash.omitBy = omitBy;
|
|
lodash.once = once;
|
|
lodash.orderBy = orderBy;
|
|
lodash.over = over;
|
|
lodash.overArgs = overArgs;
|
|
lodash.overEvery = overEvery;
|
|
lodash.overSome = overSome;
|
|
lodash.partial = partial;
|
|
lodash.partialRight = partialRight;
|
|
lodash.partition = partition;
|
|
lodash.pick = pick;
|
|
lodash.pickBy = pickBy;
|
|
lodash.property = property;
|
|
lodash.propertyOf = propertyOf;
|
|
lodash.pull = pull;
|
|
lodash.pullAll = pullAll;
|
|
lodash.pullAllBy = pullAllBy;
|
|
lodash.pullAllWith = pullAllWith;
|
|
lodash.pullAt = pullAt;
|
|
lodash.range = range;
|
|
lodash.rangeRight = rangeRight;
|
|
lodash.rearg = rearg;
|
|
lodash.reject = reject;
|
|
lodash.remove = remove;
|
|
lodash.rest = rest;
|
|
lodash.reverse = reverse;
|
|
lodash.sampleSize = sampleSize;
|
|
lodash.set = set;
|
|
lodash.setWith = setWith;
|
|
lodash.shuffle = shuffle;
|
|
lodash.slice = slice;
|
|
lodash.sortBy = sortBy;
|
|
lodash.sortedUniq = sortedUniq;
|
|
lodash.sortedUniqBy = sortedUniqBy;
|
|
lodash.split = split;
|
|
lodash.spread = spread;
|
|
lodash.tail = tail;
|
|
lodash.take = take;
|
|
lodash.takeRight = takeRight;
|
|
lodash.takeRightWhile = takeRightWhile;
|
|
lodash.takeWhile = takeWhile;
|
|
lodash.tap = tap;
|
|
lodash.throttle = throttle;
|
|
lodash.thru = thru;
|
|
lodash.toArray = toArray;
|
|
lodash.toPairs = toPairs;
|
|
lodash.toPairsIn = toPairsIn;
|
|
lodash.toPath = toPath;
|
|
lodash.toPlainObject = toPlainObject;
|
|
lodash.transform = transform;
|
|
lodash.unary = unary;
|
|
lodash.union = union;
|
|
lodash.unionBy = unionBy;
|
|
lodash.unionWith = unionWith;
|
|
lodash.uniq = uniq6;
|
|
lodash.uniqBy = uniqBy;
|
|
lodash.uniqWith = uniqWith;
|
|
lodash.unset = unset;
|
|
lodash.unzip = unzip;
|
|
lodash.unzipWith = unzipWith;
|
|
lodash.update = update;
|
|
lodash.updateWith = updateWith;
|
|
lodash.values = values;
|
|
lodash.valuesIn = valuesIn;
|
|
lodash.without = without;
|
|
lodash.words = words;
|
|
lodash.wrap = wrap;
|
|
lodash.xor = xor;
|
|
lodash.xorBy = xorBy;
|
|
lodash.xorWith = xorWith;
|
|
lodash.zip = zip;
|
|
lodash.zipObject = zipObject;
|
|
lodash.zipObjectDeep = zipObjectDeep;
|
|
lodash.zipWith = zipWith;
|
|
lodash.entries = toPairs;
|
|
lodash.entriesIn = toPairsIn;
|
|
lodash.extend = assignIn;
|
|
lodash.extendWith = assignInWith;
|
|
mixin(lodash, lodash);
|
|
lodash.add = add2;
|
|
lodash.attempt = attempt;
|
|
lodash.camelCase = camelCase;
|
|
lodash.capitalize = capitalize;
|
|
lodash.ceil = ceil;
|
|
lodash.clamp = clamp;
|
|
lodash.clone = clone;
|
|
lodash.cloneDeep = cloneDeep;
|
|
lodash.cloneDeepWith = cloneDeepWith;
|
|
lodash.cloneWith = cloneWith;
|
|
lodash.conformsTo = conformsTo;
|
|
lodash.deburr = deburr;
|
|
lodash.defaultTo = defaultTo;
|
|
lodash.divide = divide;
|
|
lodash.endsWith = endsWith;
|
|
lodash.eq = eq;
|
|
lodash.escape = escape;
|
|
lodash.escapeRegExp = escapeRegExp;
|
|
lodash.every = every;
|
|
lodash.find = find;
|
|
lodash.findIndex = findIndex2;
|
|
lodash.findKey = findKey2;
|
|
lodash.findLast = findLast;
|
|
lodash.findLastIndex = findLastIndex;
|
|
lodash.findLastKey = findLastKey;
|
|
lodash.floor = floor;
|
|
lodash.forEach = forEach;
|
|
lodash.forEachRight = forEachRight;
|
|
lodash.forIn = forIn;
|
|
lodash.forInRight = forInRight;
|
|
lodash.forOwn = forOwn;
|
|
lodash.forOwnRight = forOwnRight;
|
|
lodash.get = get;
|
|
lodash.gt = gt;
|
|
lodash.gte = gte;
|
|
lodash.has = has;
|
|
lodash.hasIn = hasIn;
|
|
lodash.head = head;
|
|
lodash.identity = identity;
|
|
lodash.includes = includes;
|
|
lodash.indexOf = indexOf;
|
|
lodash.inRange = inRange;
|
|
lodash.invoke = invoke;
|
|
lodash.isArguments = isArguments;
|
|
lodash.isArray = isArray2;
|
|
lodash.isArrayBuffer = isArrayBuffer;
|
|
lodash.isArrayLike = isArrayLike;
|
|
lodash.isArrayLikeObject = isArrayLikeObject;
|
|
lodash.isBoolean = isBoolean;
|
|
lodash.isBuffer = isBuffer;
|
|
lodash.isDate = isDate2;
|
|
lodash.isElement = isElement;
|
|
lodash.isEmpty = isEmpty;
|
|
lodash.isEqual = isEqual;
|
|
lodash.isEqualWith = isEqualWith;
|
|
lodash.isError = isError2;
|
|
lodash.isFinite = isFinite;
|
|
lodash.isFunction = isFunction2;
|
|
lodash.isInteger = isInteger;
|
|
lodash.isLength = isLength;
|
|
lodash.isMap = isMap;
|
|
lodash.isMatch = isMatch2;
|
|
lodash.isMatchWith = isMatchWith;
|
|
lodash.isNaN = isNaN2;
|
|
lodash.isNative = isNative;
|
|
lodash.isNil = isNil;
|
|
lodash.isNull = isNull;
|
|
lodash.isNumber = isNumber;
|
|
lodash.isObject = isObject;
|
|
lodash.isObjectLike = isObjectLike;
|
|
lodash.isPlainObject = isPlainObject;
|
|
lodash.isRegExp = isRegExp;
|
|
lodash.isSafeInteger = isSafeInteger;
|
|
lodash.isSet = isSet;
|
|
lodash.isString = isString;
|
|
lodash.isSymbol = isSymbol;
|
|
lodash.isTypedArray = isTypedArray;
|
|
lodash.isUndefined = isUndefined;
|
|
lodash.isWeakMap = isWeakMap;
|
|
lodash.isWeakSet = isWeakSet;
|
|
lodash.join = join;
|
|
lodash.kebabCase = kebabCase;
|
|
lodash.last = last;
|
|
lodash.lastIndexOf = lastIndexOf;
|
|
lodash.lowerCase = lowerCase;
|
|
lodash.lowerFirst = lowerFirst;
|
|
lodash.lt = lt;
|
|
lodash.lte = lte;
|
|
lodash.max = max3;
|
|
lodash.maxBy = maxBy;
|
|
lodash.mean = mean2;
|
|
lodash.meanBy = meanBy;
|
|
lodash.min = min3;
|
|
lodash.minBy = minBy;
|
|
lodash.stubArray = stubArray;
|
|
lodash.stubFalse = stubFalse;
|
|
lodash.stubObject = stubObject;
|
|
lodash.stubString = stubString;
|
|
lodash.stubTrue = stubTrue;
|
|
lodash.multiply = multiply;
|
|
lodash.nth = nth;
|
|
lodash.noConflict = noConflict;
|
|
lodash.noop = noop2;
|
|
lodash.now = now;
|
|
lodash.pad = pad;
|
|
lodash.padEnd = padEnd;
|
|
lodash.padStart = padStart;
|
|
lodash.parseInt = parseInt2;
|
|
lodash.random = random;
|
|
lodash.reduce = reduce;
|
|
lodash.reduceRight = reduceRight;
|
|
lodash.repeat = repeat;
|
|
lodash.replace = replace;
|
|
lodash.result = result;
|
|
lodash.round = round;
|
|
lodash.runInContext = runInContext2;
|
|
lodash.sample = sample;
|
|
lodash.size = size;
|
|
lodash.snakeCase = snakeCase;
|
|
lodash.some = some;
|
|
lodash.sortedIndex = sortedIndex;
|
|
lodash.sortedIndexBy = sortedIndexBy;
|
|
lodash.sortedIndexOf = sortedIndexOf;
|
|
lodash.sortedLastIndex = sortedLastIndex;
|
|
lodash.sortedLastIndexBy = sortedLastIndexBy;
|
|
lodash.sortedLastIndexOf = sortedLastIndexOf;
|
|
lodash.startCase = startCase;
|
|
lodash.startsWith = startsWith;
|
|
lodash.subtract = subtract2;
|
|
lodash.sum = sum2;
|
|
lodash.sumBy = sumBy;
|
|
lodash.template = template;
|
|
lodash.times = times;
|
|
lodash.toFinite = toFinite;
|
|
lodash.toInteger = toInteger2;
|
|
lodash.toLength = toLength;
|
|
lodash.toLower = toLower;
|
|
lodash.toNumber = toNumber;
|
|
lodash.toSafeInteger = toSafeInteger;
|
|
lodash.toString = toString2;
|
|
lodash.toUpper = toUpper;
|
|
lodash.trim = trim;
|
|
lodash.trimEnd = trimEnd;
|
|
lodash.trimStart = trimStart;
|
|
lodash.truncate = truncate;
|
|
lodash.unescape = unescape;
|
|
lodash.uniqueId = uniqueId;
|
|
lodash.upperCase = upperCase;
|
|
lodash.upperFirst = upperFirst;
|
|
lodash.each = forEach;
|
|
lodash.eachRight = forEachRight;
|
|
lodash.first = head;
|
|
mixin(lodash, function() {
|
|
var source = {};
|
|
baseForOwn(lodash, function(func, methodName) {
|
|
if (!hasOwnProperty.call(lodash.prototype, methodName)) {
|
|
source[methodName] = func;
|
|
}
|
|
});
|
|
return source;
|
|
}(), { "chain": false });
|
|
lodash.VERSION = VERSION;
|
|
arrayEach(["bind", "bindKey", "curry", "curryRight", "partial", "partialRight"], function(methodName) {
|
|
lodash[methodName].placeholder = lodash;
|
|
});
|
|
arrayEach(["drop", "take"], function(methodName, index) {
|
|
LazyWrapper.prototype[methodName] = function(n2) {
|
|
n2 = n2 === undefined2 ? 1 : nativeMax(toInteger2(n2), 0);
|
|
var result2 = this.__filtered__ && !index ? new LazyWrapper(this) : this.clone();
|
|
if (result2.__filtered__) {
|
|
result2.__takeCount__ = nativeMin(n2, result2.__takeCount__);
|
|
} else {
|
|
result2.__views__.push({
|
|
"size": nativeMin(n2, MAX_ARRAY_LENGTH),
|
|
"type": methodName + (result2.__dir__ < 0 ? "Right" : "")
|
|
});
|
|
}
|
|
return result2;
|
|
};
|
|
LazyWrapper.prototype[methodName + "Right"] = function(n2) {
|
|
return this.reverse()[methodName](n2).reverse();
|
|
};
|
|
});
|
|
arrayEach(["filter", "map", "takeWhile"], function(methodName, index) {
|
|
var type = index + 1, isFilter = type == LAZY_FILTER_FLAG || type == LAZY_WHILE_FLAG;
|
|
LazyWrapper.prototype[methodName] = function(iteratee2) {
|
|
var result2 = this.clone();
|
|
result2.__iteratees__.push({
|
|
"iteratee": getIteratee(iteratee2, 3),
|
|
"type": type
|
|
});
|
|
result2.__filtered__ = result2.__filtered__ || isFilter;
|
|
return result2;
|
|
};
|
|
});
|
|
arrayEach(["head", "last"], function(methodName, index) {
|
|
var takeName = "take" + (index ? "Right" : "");
|
|
LazyWrapper.prototype[methodName] = function() {
|
|
return this[takeName](1).value()[0];
|
|
};
|
|
});
|
|
arrayEach(["initial", "tail"], function(methodName, index) {
|
|
var dropName = "drop" + (index ? "" : "Right");
|
|
LazyWrapper.prototype[methodName] = function() {
|
|
return this.__filtered__ ? new LazyWrapper(this) : this[dropName](1);
|
|
};
|
|
});
|
|
LazyWrapper.prototype.compact = function() {
|
|
return this.filter(identity);
|
|
};
|
|
LazyWrapper.prototype.find = function(predicate) {
|
|
return this.filter(predicate).head();
|
|
};
|
|
LazyWrapper.prototype.findLast = function(predicate) {
|
|
return this.reverse().find(predicate);
|
|
};
|
|
LazyWrapper.prototype.invokeMap = baseRest(function(path, args) {
|
|
if (typeof path == "function") {
|
|
return new LazyWrapper(this);
|
|
}
|
|
return this.map(function(value) {
|
|
return baseInvoke(value, path, args);
|
|
});
|
|
});
|
|
LazyWrapper.prototype.reject = function(predicate) {
|
|
return this.filter(negate(getIteratee(predicate)));
|
|
};
|
|
LazyWrapper.prototype.slice = function(start, end) {
|
|
start = toInteger2(start);
|
|
var result2 = this;
|
|
if (result2.__filtered__ && (start > 0 || end < 0)) {
|
|
return new LazyWrapper(result2);
|
|
}
|
|
if (start < 0) {
|
|
result2 = result2.takeRight(-start);
|
|
} else if (start) {
|
|
result2 = result2.drop(start);
|
|
}
|
|
if (end !== undefined2) {
|
|
end = toInteger2(end);
|
|
result2 = end < 0 ? result2.dropRight(-end) : result2.take(end - start);
|
|
}
|
|
return result2;
|
|
};
|
|
LazyWrapper.prototype.takeRightWhile = function(predicate) {
|
|
return this.reverse().takeWhile(predicate).reverse();
|
|
};
|
|
LazyWrapper.prototype.toArray = function() {
|
|
return this.take(MAX_ARRAY_LENGTH);
|
|
};
|
|
baseForOwn(LazyWrapper.prototype, function(func, methodName) {
|
|
var checkIteratee = /^(?:filter|find|map|reject)|While$/.test(methodName), isTaker = /^(?:head|last)$/.test(methodName), lodashFunc = lodash[isTaker ? "take" + (methodName == "last" ? "Right" : "") : methodName], retUnwrapped = isTaker || /^find/.test(methodName);
|
|
if (!lodashFunc) {
|
|
return;
|
|
}
|
|
lodash.prototype[methodName] = function() {
|
|
var value = this.__wrapped__, args = isTaker ? [1] : arguments, isLazy = value instanceof LazyWrapper, iteratee2 = args[0], useLazy = isLazy || isArray2(value);
|
|
var interceptor = function(value2) {
|
|
var result3 = lodashFunc.apply(lodash, arrayPush([value2], args));
|
|
return isTaker && chainAll ? result3[0] : result3;
|
|
};
|
|
if (useLazy && checkIteratee && typeof iteratee2 == "function" && iteratee2.length != 1) {
|
|
isLazy = useLazy = false;
|
|
}
|
|
var chainAll = this.__chain__, isHybrid = !!this.__actions__.length, isUnwrapped = retUnwrapped && !chainAll, onlyLazy = isLazy && !isHybrid;
|
|
if (!retUnwrapped && useLazy) {
|
|
value = onlyLazy ? value : new LazyWrapper(this);
|
|
var result2 = func.apply(value, args);
|
|
result2.__actions__.push({ "func": thru, "args": [interceptor], "thisArg": undefined2 });
|
|
return new LodashWrapper(result2, chainAll);
|
|
}
|
|
if (isUnwrapped && onlyLazy) {
|
|
return func.apply(this, args);
|
|
}
|
|
result2 = this.thru(interceptor);
|
|
return isUnwrapped ? isTaker ? result2.value()[0] : result2.value() : result2;
|
|
};
|
|
});
|
|
arrayEach(["pop", "push", "shift", "sort", "splice", "unshift"], function(methodName) {
|
|
var func = arrayProto[methodName], chainName = /^(?:push|sort|unshift)$/.test(methodName) ? "tap" : "thru", retUnwrapped = /^(?:pop|shift)$/.test(methodName);
|
|
lodash.prototype[methodName] = function() {
|
|
var args = arguments;
|
|
if (retUnwrapped && !this.__chain__) {
|
|
var value = this.value();
|
|
return func.apply(isArray2(value) ? value : [], args);
|
|
}
|
|
return this[chainName](function(value2) {
|
|
return func.apply(isArray2(value2) ? value2 : [], args);
|
|
});
|
|
};
|
|
});
|
|
baseForOwn(LazyWrapper.prototype, function(func, methodName) {
|
|
var lodashFunc = lodash[methodName];
|
|
if (lodashFunc) {
|
|
var key2 = lodashFunc.name + "";
|
|
if (!hasOwnProperty.call(realNames, key2)) {
|
|
realNames[key2] = [];
|
|
}
|
|
realNames[key2].push({ "name": methodName, "func": lodashFunc });
|
|
}
|
|
});
|
|
realNames[createHybrid(undefined2, WRAP_BIND_KEY_FLAG).name] = [{
|
|
"name": "wrapper",
|
|
"func": undefined2
|
|
}];
|
|
LazyWrapper.prototype.clone = lazyClone;
|
|
LazyWrapper.prototype.reverse = lazyReverse;
|
|
LazyWrapper.prototype.value = lazyValue;
|
|
lodash.prototype.at = wrapperAt;
|
|
lodash.prototype.chain = wrapperChain;
|
|
lodash.prototype.commit = wrapperCommit;
|
|
lodash.prototype.next = wrapperNext;
|
|
lodash.prototype.plant = wrapperPlant;
|
|
lodash.prototype.reverse = wrapperReverse;
|
|
lodash.prototype.toJSON = lodash.prototype.valueOf = lodash.prototype.value = wrapperValue;
|
|
lodash.prototype.first = lodash.prototype.head;
|
|
if (symIterator) {
|
|
lodash.prototype[symIterator] = wrapperToIterator;
|
|
}
|
|
return lodash;
|
|
};
|
|
var _5 = runInContext();
|
|
if (typeof define == "function" && typeof define.amd == "object" && define.amd) {
|
|
root._ = _5;
|
|
define(function() {
|
|
return _5;
|
|
});
|
|
} else if (freeModule) {
|
|
(freeModule.exports = _5)._ = _5;
|
|
freeExports._ = _5;
|
|
} else {
|
|
root._ = _5;
|
|
}
|
|
}).call(exports);
|
|
}
|
|
});
|
|
|
|
// node_modules/sql.js/dist/sql-wasm.js
|
|
var require_sql_wasm = __commonJS({
|
|
"node_modules/sql.js/dist/sql-wasm.js"(exports, module2) {
|
|
var initSqlJsPromise = void 0;
|
|
var initSqlJs2 = function(moduleConfig) {
|
|
if (initSqlJsPromise) {
|
|
return initSqlJsPromise;
|
|
}
|
|
initSqlJsPromise = new Promise(function(resolveModule, reject) {
|
|
var Module = typeof moduleConfig !== "undefined" ? moduleConfig : {};
|
|
var originalOnAbortFunction = Module["onAbort"];
|
|
Module["onAbort"] = function(errorThatCausedAbort) {
|
|
reject(new Error(errorThatCausedAbort));
|
|
if (originalOnAbortFunction) {
|
|
originalOnAbortFunction(errorThatCausedAbort);
|
|
}
|
|
};
|
|
Module["postRun"] = Module["postRun"] || [];
|
|
Module["postRun"].push(function() {
|
|
resolveModule(Module);
|
|
});
|
|
module2 = void 0;
|
|
var e4;
|
|
e4 || (e4 = typeof Module !== "undefined" ? Module : {});
|
|
null;
|
|
e4.onRuntimeInitialized = function() {
|
|
function a5(g4, m5) {
|
|
switch (typeof m5) {
|
|
case "boolean":
|
|
gc(g4, m5 ? 1 : 0);
|
|
break;
|
|
case "number":
|
|
hc(g4, m5);
|
|
break;
|
|
case "string":
|
|
ic(g4, m5, -1, -1);
|
|
break;
|
|
case "object":
|
|
if (null === m5)
|
|
kb(g4);
|
|
else if (null != m5.length) {
|
|
var n2 = aa(m5);
|
|
jc(g4, n2, m5.length, -1);
|
|
ba(n2);
|
|
} else
|
|
xa(g4, "Wrong API use : tried to return a value of an unknown type (" + m5 + ").", -1);
|
|
break;
|
|
default:
|
|
kb(g4);
|
|
}
|
|
}
|
|
function b4(g4, m5) {
|
|
for (var n2 = [], p3 = 0; p3 < g4; p3 += 1) {
|
|
var v3 = l3(m5 + 4 * p3, "i32"), y5 = kc(v3);
|
|
if (1 === y5 || 2 === y5)
|
|
v3 = lc(v3);
|
|
else if (3 === y5)
|
|
v3 = mc(v3);
|
|
else if (4 === y5) {
|
|
y5 = v3;
|
|
v3 = nc(y5);
|
|
y5 = oc(y5);
|
|
for (var L4 = new Uint8Array(v3), G3 = 0; G3 < v3; G3 += 1)
|
|
L4[G3] = r3[y5 + G3];
|
|
v3 = L4;
|
|
} else
|
|
v3 = null;
|
|
n2.push(v3);
|
|
}
|
|
return n2;
|
|
}
|
|
function c4(g4, m5) {
|
|
this.La = g4;
|
|
this.db = m5;
|
|
this.Ja = 1;
|
|
this.fb = [];
|
|
}
|
|
function d5(g4, m5) {
|
|
this.db = m5;
|
|
m5 = ca(g4) + 1;
|
|
this.Ya = da(m5);
|
|
if (null === this.Ya)
|
|
throw Error("Unable to allocate memory for the SQL string");
|
|
t4(g4, u4, this.Ya, m5);
|
|
this.eb = this.Ya;
|
|
this.Ua = this.ib = null;
|
|
}
|
|
function f4(g4) {
|
|
this.filename = "dbfile_" + (4294967295 * Math.random() >>> 0);
|
|
if (null != g4) {
|
|
var m5 = this.filename, n2 = "/", p3 = m5;
|
|
n2 && (n2 = "string" == typeof n2 ? n2 : ea(n2), p3 = m5 ? z5(n2 + "/" + m5) : n2);
|
|
m5 = fa(
|
|
true,
|
|
true
|
|
);
|
|
p3 = ha(p3, (void 0 !== m5 ? m5 : 438) & 4095 | 32768, 0);
|
|
if (g4) {
|
|
if ("string" == typeof g4) {
|
|
n2 = Array(g4.length);
|
|
for (var v3 = 0, y5 = g4.length; v3 < y5; ++v3)
|
|
n2[v3] = g4.charCodeAt(v3);
|
|
g4 = n2;
|
|
}
|
|
ia(p3, m5 | 146);
|
|
n2 = ja(p3, 577);
|
|
ka(n2, g4, 0, g4.length, 0);
|
|
la(n2);
|
|
ia(p3, m5);
|
|
}
|
|
}
|
|
this.handleError(q5(this.filename, h5));
|
|
this.db = l3(h5, "i32");
|
|
pc(this.db);
|
|
this.Za = {};
|
|
this.Na = {};
|
|
}
|
|
var h5 = B5(4), k5 = e4.cwrap, q5 = k5("sqlite3_open", "number", ["string", "number"]), x5 = k5("sqlite3_close_v2", "number", ["number"]), w5 = k5("sqlite3_exec", "number", ["number", "string", "number", "number", "number"]), A4 = k5(
|
|
"sqlite3_changes",
|
|
"number",
|
|
["number"]
|
|
), S4 = k5("sqlite3_prepare_v2", "number", ["number", "string", "number", "number", "number"]), nb = k5("sqlite3_sql", "string", ["number"]), qc = k5("sqlite3_normalized_sql", "string", ["number"]), ob = k5("sqlite3_prepare_v2", "number", ["number", "number", "number", "number", "number"]), rc = k5("sqlite3_bind_text", "number", ["number", "number", "number", "number", "number"]), pb = k5("sqlite3_bind_blob", "number", ["number", "number", "number", "number", "number"]), sc = k5("sqlite3_bind_double", "number", ["number", "number", "number"]), tc = k5("sqlite3_bind_int", "number", ["number", "number", "number"]), uc = k5("sqlite3_bind_parameter_index", "number", ["number", "string"]), vc = k5("sqlite3_step", "number", ["number"]), wc = k5("sqlite3_errmsg", "string", ["number"]), xc = k5("sqlite3_column_count", "number", ["number"]), yc = k5("sqlite3_data_count", "number", ["number"]), zc = k5("sqlite3_column_double", "number", ["number", "number"]), qb = k5("sqlite3_column_text", "string", ["number", "number"]), Ac = k5("sqlite3_column_blob", "number", ["number", "number"]), Bc = k5(
|
|
"sqlite3_column_bytes",
|
|
"number",
|
|
["number", "number"]
|
|
), Cc = k5("sqlite3_column_type", "number", ["number", "number"]), Dc = k5("sqlite3_column_name", "string", ["number", "number"]), Ec = k5("sqlite3_reset", "number", ["number"]), Fc = k5("sqlite3_clear_bindings", "number", ["number"]), Gc = k5("sqlite3_finalize", "number", ["number"]), rb = k5("sqlite3_create_function_v2", "number", "number string number number number number number number number".split(" ")), kc = k5("sqlite3_value_type", "number", ["number"]), nc = k5("sqlite3_value_bytes", "number", ["number"]), mc = k5(
|
|
"sqlite3_value_text",
|
|
"string",
|
|
["number"]
|
|
), oc = k5("sqlite3_value_blob", "number", ["number"]), lc = k5("sqlite3_value_double", "number", ["number"]), hc = k5("sqlite3_result_double", "", ["number", "number"]), kb = k5("sqlite3_result_null", "", ["number"]), ic = k5("sqlite3_result_text", "", ["number", "string", "number", "number"]), jc = k5("sqlite3_result_blob", "", ["number", "number", "number", "number"]), gc = k5("sqlite3_result_int", "", ["number", "number"]), xa = k5("sqlite3_result_error", "", ["number", "string", "number"]), sb = k5(
|
|
"sqlite3_aggregate_context",
|
|
"number",
|
|
["number", "number"]
|
|
), pc = k5("RegisterExtensionFunctions", "number", ["number"]);
|
|
c4.prototype.bind = function(g4) {
|
|
if (!this.La)
|
|
throw "Statement closed";
|
|
this.reset();
|
|
return Array.isArray(g4) ? this.xb(g4) : null != g4 && "object" === typeof g4 ? this.yb(g4) : true;
|
|
};
|
|
c4.prototype.step = function() {
|
|
if (!this.La)
|
|
throw "Statement closed";
|
|
this.Ja = 1;
|
|
var g4 = vc(this.La);
|
|
switch (g4) {
|
|
case 100:
|
|
return true;
|
|
case 101:
|
|
return false;
|
|
default:
|
|
throw this.db.handleError(g4);
|
|
}
|
|
};
|
|
c4.prototype.sb = function(g4) {
|
|
null == g4 && (g4 = this.Ja, this.Ja += 1);
|
|
return zc(this.La, g4);
|
|
};
|
|
c4.prototype.Cb = function(g4) {
|
|
null == g4 && (g4 = this.Ja, this.Ja += 1);
|
|
g4 = qb(this.La, g4);
|
|
if ("function" !== typeof BigInt)
|
|
throw Error("BigInt is not supported");
|
|
return BigInt(g4);
|
|
};
|
|
c4.prototype.Db = function(g4) {
|
|
null == g4 && (g4 = this.Ja, this.Ja += 1);
|
|
return qb(this.La, g4);
|
|
};
|
|
c4.prototype.getBlob = function(g4) {
|
|
null == g4 && (g4 = this.Ja, this.Ja += 1);
|
|
var m5 = Bc(this.La, g4);
|
|
g4 = Ac(this.La, g4);
|
|
for (var n2 = new Uint8Array(m5), p3 = 0; p3 < m5; p3 += 1)
|
|
n2[p3] = r3[g4 + p3];
|
|
return n2;
|
|
};
|
|
c4.prototype.get = function(g4, m5) {
|
|
m5 = m5 || {};
|
|
null != g4 && this.bind(g4) && this.step();
|
|
g4 = [];
|
|
for (var n2 = yc(this.La), p3 = 0; p3 < n2; p3 += 1)
|
|
switch (Cc(this.La, p3)) {
|
|
case 1:
|
|
var v3 = m5.useBigInt ? this.Cb(p3) : this.sb(p3);
|
|
g4.push(v3);
|
|
break;
|
|
case 2:
|
|
g4.push(this.sb(p3));
|
|
break;
|
|
case 3:
|
|
g4.push(this.Db(p3));
|
|
break;
|
|
case 4:
|
|
g4.push(this.getBlob(p3));
|
|
break;
|
|
default:
|
|
g4.push(null);
|
|
}
|
|
return g4;
|
|
};
|
|
c4.prototype.getColumnNames = function() {
|
|
for (var g4 = [], m5 = xc(this.La), n2 = 0; n2 < m5; n2 += 1)
|
|
g4.push(Dc(this.La, n2));
|
|
return g4;
|
|
};
|
|
c4.prototype.getAsObject = function(g4, m5) {
|
|
g4 = this.get(g4, m5);
|
|
m5 = this.getColumnNames();
|
|
for (var n2 = {}, p3 = 0; p3 < m5.length; p3 += 1)
|
|
n2[m5[p3]] = g4[p3];
|
|
return n2;
|
|
};
|
|
c4.prototype.getSQL = function() {
|
|
return nb(this.La);
|
|
};
|
|
c4.prototype.getNormalizedSQL = function() {
|
|
return qc(this.La);
|
|
};
|
|
c4.prototype.run = function(g4) {
|
|
null != g4 && this.bind(g4);
|
|
this.step();
|
|
return this.reset();
|
|
};
|
|
c4.prototype.nb = function(g4, m5) {
|
|
null == m5 && (m5 = this.Ja, this.Ja += 1);
|
|
g4 = ma(g4);
|
|
var n2 = aa(g4);
|
|
this.fb.push(n2);
|
|
this.db.handleError(rc(this.La, m5, n2, g4.length - 1, 0));
|
|
};
|
|
c4.prototype.wb = function(g4, m5) {
|
|
null == m5 && (m5 = this.Ja, this.Ja += 1);
|
|
var n2 = aa(g4);
|
|
this.fb.push(n2);
|
|
this.db.handleError(pb(this.La, m5, n2, g4.length, 0));
|
|
};
|
|
c4.prototype.mb = function(g4, m5) {
|
|
null == m5 && (m5 = this.Ja, this.Ja += 1);
|
|
this.db.handleError((g4 === (g4 | 0) ? tc : sc)(this.La, m5, g4));
|
|
};
|
|
c4.prototype.zb = function(g4) {
|
|
null == g4 && (g4 = this.Ja, this.Ja += 1);
|
|
pb(this.La, g4, 0, 0, 0);
|
|
};
|
|
c4.prototype.ob = function(g4, m5) {
|
|
null == m5 && (m5 = this.Ja, this.Ja += 1);
|
|
switch (typeof g4) {
|
|
case "string":
|
|
this.nb(g4, m5);
|
|
return;
|
|
case "number":
|
|
this.mb(g4, m5);
|
|
return;
|
|
case "bigint":
|
|
this.nb(g4.toString(), m5);
|
|
return;
|
|
case "boolean":
|
|
this.mb(g4 + 0, m5);
|
|
return;
|
|
case "object":
|
|
if (null === g4) {
|
|
this.zb(m5);
|
|
return;
|
|
}
|
|
if (null != g4.length) {
|
|
this.wb(g4, m5);
|
|
return;
|
|
}
|
|
}
|
|
throw "Wrong API use : tried to bind a value of an unknown type (" + g4 + ").";
|
|
};
|
|
c4.prototype.yb = function(g4) {
|
|
var m5 = this;
|
|
Object.keys(g4).forEach(function(n2) {
|
|
var p3 = uc(m5.La, n2);
|
|
0 !== p3 && m5.ob(g4[n2], p3);
|
|
});
|
|
return true;
|
|
};
|
|
c4.prototype.xb = function(g4) {
|
|
for (var m5 = 0; m5 < g4.length; m5 += 1)
|
|
this.ob(g4[m5], m5 + 1);
|
|
return true;
|
|
};
|
|
c4.prototype.reset = function() {
|
|
this.freemem();
|
|
return 0 === Fc(this.La) && 0 === Ec(this.La);
|
|
};
|
|
c4.prototype.freemem = function() {
|
|
for (var g4; void 0 !== (g4 = this.fb.pop()); )
|
|
ba(g4);
|
|
};
|
|
c4.prototype.free = function() {
|
|
this.freemem();
|
|
var g4 = 0 === Gc(this.La);
|
|
delete this.db.Za[this.La];
|
|
this.La = 0;
|
|
return g4;
|
|
};
|
|
d5.prototype.next = function() {
|
|
if (null === this.Ya)
|
|
return { done: true };
|
|
null !== this.Ua && (this.Ua.free(), this.Ua = null);
|
|
if (!this.db.db)
|
|
throw this.gb(), Error("Database closed");
|
|
var g4 = oa(), m5 = B5(4);
|
|
pa(h5);
|
|
pa(m5);
|
|
try {
|
|
this.db.handleError(ob(this.db.db, this.eb, -1, h5, m5));
|
|
this.eb = l3(m5, "i32");
|
|
var n2 = l3(h5, "i32");
|
|
if (0 === n2)
|
|
return this.gb(), { done: true };
|
|
this.Ua = new c4(n2, this.db);
|
|
this.db.Za[n2] = this.Ua;
|
|
return { value: this.Ua, done: false };
|
|
} catch (p3) {
|
|
throw this.ib = C3(this.eb), this.gb(), p3;
|
|
} finally {
|
|
qa(g4);
|
|
}
|
|
};
|
|
d5.prototype.gb = function() {
|
|
ba(this.Ya);
|
|
this.Ya = null;
|
|
};
|
|
d5.prototype.getRemainingSQL = function() {
|
|
return null !== this.ib ? this.ib : C3(this.eb);
|
|
};
|
|
"function" === typeof Symbol && "symbol" === typeof Symbol.iterator && (d5.prototype[Symbol.iterator] = function() {
|
|
return this;
|
|
});
|
|
f4.prototype.run = function(g4, m5) {
|
|
if (!this.db)
|
|
throw "Database closed";
|
|
if (m5) {
|
|
g4 = this.prepare(g4, m5);
|
|
try {
|
|
g4.step();
|
|
} finally {
|
|
g4.free();
|
|
}
|
|
} else
|
|
this.handleError(w5(this.db, g4, 0, 0, h5));
|
|
return this;
|
|
};
|
|
f4.prototype.exec = function(g4, m5, n2) {
|
|
if (!this.db)
|
|
throw "Database closed";
|
|
var p3 = oa(), v3 = null;
|
|
try {
|
|
var y5 = ca(g4) + 1, L4 = B5(y5);
|
|
t4(g4, r3, L4, y5);
|
|
var G3 = L4;
|
|
var H5 = B5(4);
|
|
for (g4 = []; 0 !== l3(G3, "i8"); ) {
|
|
pa(h5);
|
|
pa(H5);
|
|
this.handleError(ob(this.db, G3, -1, h5, H5));
|
|
var I4 = l3(h5, "i32");
|
|
G3 = l3(H5, "i32");
|
|
if (0 !== I4) {
|
|
y5 = null;
|
|
v3 = new c4(I4, this);
|
|
for (null != m5 && v3.bind(m5); v3.step(); )
|
|
null === y5 && (y5 = { columns: v3.getColumnNames(), values: [] }, g4.push(y5)), y5.values.push(v3.get(null, n2));
|
|
v3.free();
|
|
}
|
|
}
|
|
return g4;
|
|
} catch (na) {
|
|
throw v3 && v3.free(), na;
|
|
} finally {
|
|
qa(p3);
|
|
}
|
|
};
|
|
f4.prototype.each = function(g4, m5, n2, p3, v3) {
|
|
"function" === typeof m5 && (p3 = n2, n2 = m5, m5 = void 0);
|
|
g4 = this.prepare(g4, m5);
|
|
try {
|
|
for (; g4.step(); )
|
|
n2(g4.getAsObject(null, v3));
|
|
} finally {
|
|
g4.free();
|
|
}
|
|
if ("function" === typeof p3)
|
|
return p3();
|
|
};
|
|
f4.prototype.prepare = function(g4, m5) {
|
|
pa(h5);
|
|
this.handleError(S4(this.db, g4, -1, h5, 0));
|
|
g4 = l3(h5, "i32");
|
|
if (0 === g4)
|
|
throw "Nothing to prepare";
|
|
var n2 = new c4(g4, this);
|
|
null != m5 && n2.bind(m5);
|
|
return this.Za[g4] = n2;
|
|
};
|
|
f4.prototype.iterateStatements = function(g4) {
|
|
return new d5(g4, this);
|
|
};
|
|
f4.prototype["export"] = function() {
|
|
Object.values(this.Za).forEach(function(m5) {
|
|
m5.free();
|
|
});
|
|
Object.values(this.Na).forEach(ra);
|
|
this.Na = {};
|
|
this.handleError(x5(this.db));
|
|
var g4 = sa(this.filename);
|
|
this.handleError(q5(this.filename, h5));
|
|
this.db = l3(h5, "i32");
|
|
return g4;
|
|
};
|
|
f4.prototype.close = function() {
|
|
null !== this.db && (Object.values(this.Za).forEach(function(g4) {
|
|
g4.free();
|
|
}), Object.values(this.Na).forEach(ra), this.Na = {}, this.handleError(x5(this.db)), ta("/" + this.filename), this.db = null);
|
|
};
|
|
f4.prototype.handleError = function(g4) {
|
|
if (0 === g4)
|
|
return null;
|
|
g4 = wc(this.db);
|
|
throw Error(g4);
|
|
};
|
|
f4.prototype.getRowsModified = function() {
|
|
return A4(this.db);
|
|
};
|
|
f4.prototype.create_function = function(g4, m5) {
|
|
Object.prototype.hasOwnProperty.call(this.Na, g4) && (ra(this.Na[g4]), delete this.Na[g4]);
|
|
var n2 = ua(function(p3, v3, y5) {
|
|
v3 = b4(v3, y5);
|
|
try {
|
|
var L4 = m5.apply(null, v3);
|
|
} catch (G3) {
|
|
xa(p3, G3, -1);
|
|
return;
|
|
}
|
|
a5(p3, L4);
|
|
}, "viii");
|
|
this.Na[g4] = n2;
|
|
this.handleError(rb(this.db, g4, m5.length, 1, 0, n2, 0, 0, 0));
|
|
return this;
|
|
};
|
|
f4.prototype.create_aggregate = function(g4, m5) {
|
|
var n2 = m5.init || function() {
|
|
return null;
|
|
}, p3 = m5.finalize || function(H5) {
|
|
return H5;
|
|
}, v3 = m5.step;
|
|
if (!v3)
|
|
throw "An aggregate function must have a step function in " + g4;
|
|
var y5 = {};
|
|
Object.hasOwnProperty.call(this.Na, g4) && (ra(this.Na[g4]), delete this.Na[g4]);
|
|
m5 = g4 + "__finalize";
|
|
Object.hasOwnProperty.call(this.Na, m5) && (ra(this.Na[m5]), delete this.Na[m5]);
|
|
var L4 = ua(function(H5, I4, na) {
|
|
var Z2 = sb(H5, 1);
|
|
Object.hasOwnProperty.call(y5, Z2) || (y5[Z2] = n2());
|
|
I4 = b4(I4, na);
|
|
I4 = [y5[Z2]].concat(I4);
|
|
try {
|
|
y5[Z2] = v3.apply(null, I4);
|
|
} catch (Ic) {
|
|
delete y5[Z2], xa(H5, Ic, -1);
|
|
}
|
|
}, "viii"), G3 = ua(function(H5) {
|
|
var I4 = sb(H5, 1);
|
|
try {
|
|
var na = p3(y5[I4]);
|
|
} catch (Z2) {
|
|
delete y5[I4];
|
|
xa(H5, Z2, -1);
|
|
return;
|
|
}
|
|
a5(H5, na);
|
|
delete y5[I4];
|
|
}, "vi");
|
|
this.Na[g4] = L4;
|
|
this.Na[m5] = G3;
|
|
this.handleError(rb(this.db, g4, v3.length - 1, 1, 0, 0, L4, G3, 0));
|
|
return this;
|
|
};
|
|
e4.Database = f4;
|
|
};
|
|
var va = Object.assign({}, e4), wa = "./this.program", ya = "object" == typeof window, za = "function" == typeof importScripts, Aa = "object" == typeof process && "object" == typeof process.versions && "string" == typeof process.versions.node, D3 = "", Ba, Ca, Da, fs, Ea, Fa;
|
|
if (Aa)
|
|
D3 = za ? require("path").dirname(D3) + "/" : __dirname + "/", Fa = () => {
|
|
Ea || (fs = require("fs"), Ea = require("path"));
|
|
}, Ba = function(a5, b4) {
|
|
Fa();
|
|
a5 = Ea.normalize(a5);
|
|
return fs.readFileSync(a5, b4 ? void 0 : "utf8");
|
|
}, Da = (a5) => {
|
|
a5 = Ba(a5, true);
|
|
a5.buffer || (a5 = new Uint8Array(a5));
|
|
return a5;
|
|
}, Ca = (a5, b4, c4) => {
|
|
Fa();
|
|
a5 = Ea.normalize(a5);
|
|
fs.readFile(a5, function(d5, f4) {
|
|
d5 ? c4(d5) : b4(f4.buffer);
|
|
});
|
|
}, 1 < process.argv.length && (wa = process.argv[1].replace(/\\/g, "/")), process.argv.slice(2), "undefined" != typeof module2 && (module2.exports = e4), e4.inspect = function() {
|
|
return "[Emscripten Module object]";
|
|
};
|
|
else if (ya || za)
|
|
za ? D3 = self.location.href : "undefined" != typeof document && document.currentScript && (D3 = document.currentScript.src), D3 = 0 !== D3.indexOf("blob:") ? D3.substr(0, D3.replace(/[?#].*/, "").lastIndexOf("/") + 1) : "", Ba = (a5) => {
|
|
var b4 = new XMLHttpRequest();
|
|
b4.open("GET", a5, false);
|
|
b4.send(null);
|
|
return b4.responseText;
|
|
}, za && (Da = (a5) => {
|
|
var b4 = new XMLHttpRequest();
|
|
b4.open("GET", a5, false);
|
|
b4.responseType = "arraybuffer";
|
|
b4.send(null);
|
|
return new Uint8Array(b4.response);
|
|
}), Ca = (a5, b4, c4) => {
|
|
var d5 = new XMLHttpRequest();
|
|
d5.open("GET", a5, true);
|
|
d5.responseType = "arraybuffer";
|
|
d5.onload = () => {
|
|
200 == d5.status || 0 == d5.status && d5.response ? b4(d5.response) : c4();
|
|
};
|
|
d5.onerror = c4;
|
|
d5.send(null);
|
|
};
|
|
var Ga = e4.print || console.log.bind(console), Ha = e4.printErr || console.warn.bind(console);
|
|
Object.assign(e4, va);
|
|
va = null;
|
|
e4.thisProgram && (wa = e4.thisProgram);
|
|
var Ia;
|
|
e4.wasmBinary && (Ia = e4.wasmBinary);
|
|
var noExitRuntime = e4.noExitRuntime || true;
|
|
"object" != typeof WebAssembly && E3("no native wasm support detected");
|
|
var Ja, Ka = false, La = "undefined" != typeof TextDecoder ? new TextDecoder("utf8") : void 0;
|
|
function Ma(a5, b4, c4) {
|
|
var d5 = b4 + c4;
|
|
for (c4 = b4; a5[c4] && !(c4 >= d5); )
|
|
++c4;
|
|
if (16 < c4 - b4 && a5.buffer && La)
|
|
return La.decode(a5.subarray(b4, c4));
|
|
for (d5 = ""; b4 < c4; ) {
|
|
var f4 = a5[b4++];
|
|
if (f4 & 128) {
|
|
var h5 = a5[b4++] & 63;
|
|
if (192 == (f4 & 224))
|
|
d5 += String.fromCharCode((f4 & 31) << 6 | h5);
|
|
else {
|
|
var k5 = a5[b4++] & 63;
|
|
f4 = 224 == (f4 & 240) ? (f4 & 15) << 12 | h5 << 6 | k5 : (f4 & 7) << 18 | h5 << 12 | k5 << 6 | a5[b4++] & 63;
|
|
65536 > f4 ? d5 += String.fromCharCode(f4) : (f4 -= 65536, d5 += String.fromCharCode(55296 | f4 >> 10, 56320 | f4 & 1023));
|
|
}
|
|
} else
|
|
d5 += String.fromCharCode(f4);
|
|
}
|
|
return d5;
|
|
}
|
|
function C3(a5, b4) {
|
|
return a5 ? Ma(u4, a5, b4) : "";
|
|
}
|
|
function t4(a5, b4, c4, d5) {
|
|
if (!(0 < d5))
|
|
return 0;
|
|
var f4 = c4;
|
|
d5 = c4 + d5 - 1;
|
|
for (var h5 = 0; h5 < a5.length; ++h5) {
|
|
var k5 = a5.charCodeAt(h5);
|
|
if (55296 <= k5 && 57343 >= k5) {
|
|
var q5 = a5.charCodeAt(++h5);
|
|
k5 = 65536 + ((k5 & 1023) << 10) | q5 & 1023;
|
|
}
|
|
if (127 >= k5) {
|
|
if (c4 >= d5)
|
|
break;
|
|
b4[c4++] = k5;
|
|
} else {
|
|
if (2047 >= k5) {
|
|
if (c4 + 1 >= d5)
|
|
break;
|
|
b4[c4++] = 192 | k5 >> 6;
|
|
} else {
|
|
if (65535 >= k5) {
|
|
if (c4 + 2 >= d5)
|
|
break;
|
|
b4[c4++] = 224 | k5 >> 12;
|
|
} else {
|
|
if (c4 + 3 >= d5)
|
|
break;
|
|
b4[c4++] = 240 | k5 >> 18;
|
|
b4[c4++] = 128 | k5 >> 12 & 63;
|
|
}
|
|
b4[c4++] = 128 | k5 >> 6 & 63;
|
|
}
|
|
b4[c4++] = 128 | k5 & 63;
|
|
}
|
|
}
|
|
b4[c4] = 0;
|
|
return c4 - f4;
|
|
}
|
|
function ca(a5) {
|
|
for (var b4 = 0, c4 = 0; c4 < a5.length; ++c4) {
|
|
var d5 = a5.charCodeAt(c4);
|
|
127 >= d5 ? b4++ : 2047 >= d5 ? b4 += 2 : 55296 <= d5 && 57343 >= d5 ? (b4 += 4, ++c4) : b4 += 3;
|
|
}
|
|
return b4;
|
|
}
|
|
var Na, r3, u4, Oa, F3, J2, Pa, Qa;
|
|
function Ra() {
|
|
var a5 = Ja.buffer;
|
|
Na = a5;
|
|
e4.HEAP8 = r3 = new Int8Array(a5);
|
|
e4.HEAP16 = Oa = new Int16Array(a5);
|
|
e4.HEAP32 = F3 = new Int32Array(a5);
|
|
e4.HEAPU8 = u4 = new Uint8Array(a5);
|
|
e4.HEAPU16 = new Uint16Array(a5);
|
|
e4.HEAPU32 = J2 = new Uint32Array(a5);
|
|
e4.HEAPF32 = Pa = new Float32Array(a5);
|
|
e4.HEAPF64 = Qa = new Float64Array(a5);
|
|
}
|
|
var K3, Sa = [], Ta = [], Ua = [];
|
|
function Va() {
|
|
var a5 = e4.preRun.shift();
|
|
Sa.unshift(a5);
|
|
}
|
|
var Wa = 0, Xa = null, Ya = null;
|
|
function E3(a5) {
|
|
if (e4.onAbort)
|
|
e4.onAbort(a5);
|
|
a5 = "Aborted(" + a5 + ")";
|
|
Ha(a5);
|
|
Ka = true;
|
|
throw new WebAssembly.RuntimeError(a5 + ". Build with -sASSERTIONS for more info.");
|
|
}
|
|
function Za() {
|
|
return M5.startsWith("data:application/octet-stream;base64,");
|
|
}
|
|
var M5;
|
|
M5 = "sql-wasm.wasm";
|
|
if (!Za()) {
|
|
var $a = M5;
|
|
M5 = e4.locateFile ? e4.locateFile($a, D3) : D3 + $a;
|
|
}
|
|
function ab() {
|
|
var a5 = M5;
|
|
try {
|
|
if (a5 == M5 && Ia)
|
|
return new Uint8Array(Ia);
|
|
if (Da)
|
|
return Da(a5);
|
|
throw "both async and sync fetching of the wasm failed";
|
|
} catch (b4) {
|
|
E3(b4);
|
|
}
|
|
}
|
|
function bb() {
|
|
if (!Ia && (ya || za)) {
|
|
if ("function" == typeof fetch && !M5.startsWith("file://"))
|
|
return fetch(M5, { credentials: "same-origin" }).then(function(a5) {
|
|
if (!a5.ok)
|
|
throw "failed to load wasm binary file at '" + M5 + "'";
|
|
return a5.arrayBuffer();
|
|
}).catch(function() {
|
|
return ab();
|
|
});
|
|
if (Ca)
|
|
return new Promise(function(a5, b4) {
|
|
Ca(M5, function(c4) {
|
|
a5(new Uint8Array(c4));
|
|
}, b4);
|
|
});
|
|
}
|
|
return Promise.resolve().then(function() {
|
|
return ab();
|
|
});
|
|
}
|
|
var N3, O4;
|
|
function cb(a5) {
|
|
for (; 0 < a5.length; )
|
|
a5.shift()(e4);
|
|
}
|
|
function l3(a5, b4 = "i8") {
|
|
b4.endsWith("*") && (b4 = "*");
|
|
switch (b4) {
|
|
case "i1":
|
|
return r3[a5 >> 0];
|
|
case "i8":
|
|
return r3[a5 >> 0];
|
|
case "i16":
|
|
return Oa[a5 >> 1];
|
|
case "i32":
|
|
return F3[a5 >> 2];
|
|
case "i64":
|
|
return F3[a5 >> 2];
|
|
case "float":
|
|
return Pa[a5 >> 2];
|
|
case "double":
|
|
return Qa[a5 >> 3];
|
|
case "*":
|
|
return J2[a5 >> 2];
|
|
default:
|
|
E3("invalid type for getValue: " + b4);
|
|
}
|
|
return null;
|
|
}
|
|
function pa(a5) {
|
|
var b4 = "i32";
|
|
b4.endsWith("*") && (b4 = "*");
|
|
switch (b4) {
|
|
case "i1":
|
|
r3[a5 >> 0] = 0;
|
|
break;
|
|
case "i8":
|
|
r3[a5 >> 0] = 0;
|
|
break;
|
|
case "i16":
|
|
Oa[a5 >> 1] = 0;
|
|
break;
|
|
case "i32":
|
|
F3[a5 >> 2] = 0;
|
|
break;
|
|
case "i64":
|
|
O4 = [0, (N3 = 0, 1 <= +Math.abs(N3) ? 0 < N3 ? (Math.min(+Math.floor(N3 / 4294967296), 4294967295) | 0) >>> 0 : ~~+Math.ceil((N3 - +(~~N3 >>> 0)) / 4294967296) >>> 0 : 0)];
|
|
F3[a5 >> 2] = O4[0];
|
|
F3[a5 + 4 >> 2] = O4[1];
|
|
break;
|
|
case "float":
|
|
Pa[a5 >> 2] = 0;
|
|
break;
|
|
case "double":
|
|
Qa[a5 >> 3] = 0;
|
|
break;
|
|
case "*":
|
|
J2[a5 >> 2] = 0;
|
|
break;
|
|
default:
|
|
E3("invalid type for setValue: " + b4);
|
|
}
|
|
}
|
|
var db = (a5, b4) => {
|
|
for (var c4 = 0, d5 = a5.length - 1; 0 <= d5; d5--) {
|
|
var f4 = a5[d5];
|
|
"." === f4 ? a5.splice(d5, 1) : ".." === f4 ? (a5.splice(d5, 1), c4++) : c4 && (a5.splice(d5, 1), c4--);
|
|
}
|
|
if (b4)
|
|
for (; c4; c4--)
|
|
a5.unshift("..");
|
|
return a5;
|
|
}, z5 = (a5) => {
|
|
var b4 = "/" === a5.charAt(0), c4 = "/" === a5.substr(-1);
|
|
(a5 = db(a5.split("/").filter((d5) => !!d5), !b4).join("/")) || b4 || (a5 = ".");
|
|
a5 && c4 && (a5 += "/");
|
|
return (b4 ? "/" : "") + a5;
|
|
}, eb = (a5) => {
|
|
var b4 = /^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/.exec(a5).slice(1);
|
|
a5 = b4[0];
|
|
b4 = b4[1];
|
|
if (!a5 && !b4)
|
|
return ".";
|
|
b4 && (b4 = b4.substr(0, b4.length - 1));
|
|
return a5 + b4;
|
|
}, fb = (a5) => {
|
|
if ("/" === a5)
|
|
return "/";
|
|
a5 = z5(a5);
|
|
a5 = a5.replace(/\/$/, "");
|
|
var b4 = a5.lastIndexOf("/");
|
|
return -1 === b4 ? a5 : a5.substr(b4 + 1);
|
|
};
|
|
function gb() {
|
|
if ("object" == typeof crypto && "function" == typeof crypto.getRandomValues) {
|
|
var a5 = new Uint8Array(1);
|
|
return () => {
|
|
crypto.getRandomValues(a5);
|
|
return a5[0];
|
|
};
|
|
}
|
|
if (Aa)
|
|
try {
|
|
var b4 = require("crypto");
|
|
return () => b4.randomBytes(1)[0];
|
|
} catch (c4) {
|
|
}
|
|
return () => E3("randomDevice");
|
|
}
|
|
function hb() {
|
|
for (var a5 = "", b4 = false, c4 = arguments.length - 1; -1 <= c4 && !b4; c4--) {
|
|
b4 = 0 <= c4 ? arguments[c4] : "/";
|
|
if ("string" != typeof b4)
|
|
throw new TypeError("Arguments to path.resolve must be strings");
|
|
if (!b4)
|
|
return "";
|
|
a5 = b4 + "/" + a5;
|
|
b4 = "/" === b4.charAt(0);
|
|
}
|
|
a5 = db(a5.split("/").filter((d5) => !!d5), !b4).join("/");
|
|
return (b4 ? "/" : "") + a5 || ".";
|
|
}
|
|
function ma(a5, b4) {
|
|
var c4 = Array(ca(a5) + 1);
|
|
a5 = t4(a5, c4, 0, c4.length);
|
|
b4 && (c4.length = a5);
|
|
return c4;
|
|
}
|
|
var ib = [];
|
|
function jb(a5, b4) {
|
|
ib[a5] = { input: [], output: [], Xa: b4 };
|
|
lb(a5, mb);
|
|
}
|
|
var mb = { open: function(a5) {
|
|
var b4 = ib[a5.node.rdev];
|
|
if (!b4)
|
|
throw new P4(43);
|
|
a5.tty = b4;
|
|
a5.seekable = false;
|
|
}, close: function(a5) {
|
|
a5.tty.Xa.fsync(a5.tty);
|
|
}, fsync: function(a5) {
|
|
a5.tty.Xa.fsync(a5.tty);
|
|
}, read: function(a5, b4, c4, d5) {
|
|
if (!a5.tty || !a5.tty.Xa.tb)
|
|
throw new P4(60);
|
|
for (var f4 = 0, h5 = 0; h5 < d5; h5++) {
|
|
try {
|
|
var k5 = a5.tty.Xa.tb(a5.tty);
|
|
} catch (q5) {
|
|
throw new P4(29);
|
|
}
|
|
if (void 0 === k5 && 0 === f4)
|
|
throw new P4(6);
|
|
if (null === k5 || void 0 === k5)
|
|
break;
|
|
f4++;
|
|
b4[c4 + h5] = k5;
|
|
}
|
|
f4 && (a5.node.timestamp = Date.now());
|
|
return f4;
|
|
}, write: function(a5, b4, c4, d5) {
|
|
if (!a5.tty || !a5.tty.Xa.jb)
|
|
throw new P4(60);
|
|
try {
|
|
for (var f4 = 0; f4 < d5; f4++)
|
|
a5.tty.Xa.jb(a5.tty, b4[c4 + f4]);
|
|
} catch (h5) {
|
|
throw new P4(29);
|
|
}
|
|
d5 && (a5.node.timestamp = Date.now());
|
|
return f4;
|
|
} }, tb = { tb: function(a5) {
|
|
if (!a5.input.length) {
|
|
var b4 = null;
|
|
if (Aa) {
|
|
var c4 = Buffer.alloc(256), d5 = 0;
|
|
try {
|
|
d5 = fs.readSync(process.stdin.fd, c4, 0, 256, -1);
|
|
} catch (f4) {
|
|
if (f4.toString().includes("EOF"))
|
|
d5 = 0;
|
|
else
|
|
throw f4;
|
|
}
|
|
0 < d5 ? b4 = c4.slice(0, d5).toString("utf-8") : b4 = null;
|
|
} else
|
|
"undefined" != typeof window && "function" == typeof window.prompt ? (b4 = window.prompt("Input: "), null !== b4 && (b4 += "\n")) : "function" == typeof readline && (b4 = readline(), null !== b4 && (b4 += "\n"));
|
|
if (!b4)
|
|
return null;
|
|
a5.input = ma(b4, true);
|
|
}
|
|
return a5.input.shift();
|
|
}, jb: function(a5, b4) {
|
|
null === b4 || 10 === b4 ? (Ga(Ma(a5.output, 0)), a5.output = []) : 0 != b4 && a5.output.push(b4);
|
|
}, fsync: function(a5) {
|
|
a5.output && 0 < a5.output.length && (Ga(Ma(a5.output, 0)), a5.output = []);
|
|
} }, ub = { jb: function(a5, b4) {
|
|
null === b4 || 10 === b4 ? (Ha(Ma(a5.output, 0)), a5.output = []) : 0 != b4 && a5.output.push(b4);
|
|
}, fsync: function(a5) {
|
|
a5.output && 0 < a5.output.length && (Ha(Ma(a5.output, 0)), a5.output = []);
|
|
} }, Q3 = { Qa: null, Ra: function() {
|
|
return Q3.createNode(
|
|
null,
|
|
"/",
|
|
16895,
|
|
0
|
|
);
|
|
}, createNode: function(a5, b4, c4, d5) {
|
|
if (24576 === (c4 & 61440) || 4096 === (c4 & 61440))
|
|
throw new P4(63);
|
|
Q3.Qa || (Q3.Qa = { dir: { node: { Pa: Q3.Ga.Pa, Oa: Q3.Ga.Oa, lookup: Q3.Ga.lookup, ab: Q3.Ga.ab, rename: Q3.Ga.rename, unlink: Q3.Ga.unlink, rmdir: Q3.Ga.rmdir, readdir: Q3.Ga.readdir, symlink: Q3.Ga.symlink }, stream: { Ta: Q3.Ha.Ta } }, file: { node: { Pa: Q3.Ga.Pa, Oa: Q3.Ga.Oa }, stream: { Ta: Q3.Ha.Ta, read: Q3.Ha.read, write: Q3.Ha.write, lb: Q3.Ha.lb, bb: Q3.Ha.bb, cb: Q3.Ha.cb } }, link: { node: { Pa: Q3.Ga.Pa, Oa: Q3.Ga.Oa, readlink: Q3.Ga.readlink }, stream: {} }, pb: {
|
|
node: { Pa: Q3.Ga.Pa, Oa: Q3.Ga.Oa },
|
|
stream: vb
|
|
} });
|
|
c4 = wb(a5, b4, c4, d5);
|
|
16384 === (c4.mode & 61440) ? (c4.Ga = Q3.Qa.dir.node, c4.Ha = Q3.Qa.dir.stream, c4.Ia = {}) : 32768 === (c4.mode & 61440) ? (c4.Ga = Q3.Qa.file.node, c4.Ha = Q3.Qa.file.stream, c4.Ma = 0, c4.Ia = null) : 40960 === (c4.mode & 61440) ? (c4.Ga = Q3.Qa.link.node, c4.Ha = Q3.Qa.link.stream) : 8192 === (c4.mode & 61440) && (c4.Ga = Q3.Qa.pb.node, c4.Ha = Q3.Qa.pb.stream);
|
|
c4.timestamp = Date.now();
|
|
a5 && (a5.Ia[b4] = c4, a5.timestamp = c4.timestamp);
|
|
return c4;
|
|
}, Jb: function(a5) {
|
|
return a5.Ia ? a5.Ia.subarray ? a5.Ia.subarray(0, a5.Ma) : new Uint8Array(a5.Ia) : new Uint8Array(0);
|
|
}, qb: function(a5, b4) {
|
|
var c4 = a5.Ia ? a5.Ia.length : 0;
|
|
c4 >= b4 || (b4 = Math.max(b4, c4 * (1048576 > c4 ? 2 : 1.125) >>> 0), 0 != c4 && (b4 = Math.max(b4, 256)), c4 = a5.Ia, a5.Ia = new Uint8Array(b4), 0 < a5.Ma && a5.Ia.set(c4.subarray(0, a5.Ma), 0));
|
|
}, Gb: function(a5, b4) {
|
|
if (a5.Ma != b4)
|
|
if (0 == b4)
|
|
a5.Ia = null, a5.Ma = 0;
|
|
else {
|
|
var c4 = a5.Ia;
|
|
a5.Ia = new Uint8Array(b4);
|
|
c4 && a5.Ia.set(c4.subarray(0, Math.min(b4, a5.Ma)));
|
|
a5.Ma = b4;
|
|
}
|
|
}, Ga: { Pa: function(a5) {
|
|
var b4 = {};
|
|
b4.dev = 8192 === (a5.mode & 61440) ? a5.id : 1;
|
|
b4.ino = a5.id;
|
|
b4.mode = a5.mode;
|
|
b4.nlink = 1;
|
|
b4.uid = 0;
|
|
b4.gid = 0;
|
|
b4.rdev = a5.rdev;
|
|
16384 === (a5.mode & 61440) ? b4.size = 4096 : 32768 === (a5.mode & 61440) ? b4.size = a5.Ma : 40960 === (a5.mode & 61440) ? b4.size = a5.link.length : b4.size = 0;
|
|
b4.atime = new Date(a5.timestamp);
|
|
b4.mtime = new Date(a5.timestamp);
|
|
b4.ctime = new Date(a5.timestamp);
|
|
b4.Ab = 4096;
|
|
b4.blocks = Math.ceil(b4.size / b4.Ab);
|
|
return b4;
|
|
}, Oa: function(a5, b4) {
|
|
void 0 !== b4.mode && (a5.mode = b4.mode);
|
|
void 0 !== b4.timestamp && (a5.timestamp = b4.timestamp);
|
|
void 0 !== b4.size && Q3.Gb(a5, b4.size);
|
|
}, lookup: function() {
|
|
throw xb[44];
|
|
}, ab: function(a5, b4, c4, d5) {
|
|
return Q3.createNode(a5, b4, c4, d5);
|
|
}, rename: function(a5, b4, c4) {
|
|
if (16384 === (a5.mode & 61440)) {
|
|
try {
|
|
var d5 = yb(b4, c4);
|
|
} catch (h5) {
|
|
}
|
|
if (d5)
|
|
for (var f4 in d5.Ia)
|
|
throw new P4(55);
|
|
}
|
|
delete a5.parent.Ia[a5.name];
|
|
a5.parent.timestamp = Date.now();
|
|
a5.name = c4;
|
|
b4.Ia[c4] = a5;
|
|
b4.timestamp = a5.parent.timestamp;
|
|
a5.parent = b4;
|
|
}, unlink: function(a5, b4) {
|
|
delete a5.Ia[b4];
|
|
a5.timestamp = Date.now();
|
|
}, rmdir: function(a5, b4) {
|
|
var c4 = yb(a5, b4), d5;
|
|
for (d5 in c4.Ia)
|
|
throw new P4(55);
|
|
delete a5.Ia[b4];
|
|
a5.timestamp = Date.now();
|
|
}, readdir: function(a5) {
|
|
var b4 = [".", ".."], c4;
|
|
for (c4 in a5.Ia)
|
|
a5.Ia.hasOwnProperty(c4) && b4.push(c4);
|
|
return b4;
|
|
}, symlink: function(a5, b4, c4) {
|
|
a5 = Q3.createNode(a5, b4, 41471, 0);
|
|
a5.link = c4;
|
|
return a5;
|
|
}, readlink: function(a5) {
|
|
if (40960 !== (a5.mode & 61440))
|
|
throw new P4(28);
|
|
return a5.link;
|
|
} }, Ha: { read: function(a5, b4, c4, d5, f4) {
|
|
var h5 = a5.node.Ia;
|
|
if (f4 >= a5.node.Ma)
|
|
return 0;
|
|
a5 = Math.min(a5.node.Ma - f4, d5);
|
|
if (8 < a5 && h5.subarray)
|
|
b4.set(h5.subarray(f4, f4 + a5), c4);
|
|
else
|
|
for (d5 = 0; d5 < a5; d5++)
|
|
b4[c4 + d5] = h5[f4 + d5];
|
|
return a5;
|
|
}, write: function(a5, b4, c4, d5, f4, h5) {
|
|
b4.buffer === r3.buffer && (h5 = false);
|
|
if (!d5)
|
|
return 0;
|
|
a5 = a5.node;
|
|
a5.timestamp = Date.now();
|
|
if (b4.subarray && (!a5.Ia || a5.Ia.subarray)) {
|
|
if (h5)
|
|
return a5.Ia = b4.subarray(c4, c4 + d5), a5.Ma = d5;
|
|
if (0 === a5.Ma && 0 === f4)
|
|
return a5.Ia = b4.slice(c4, c4 + d5), a5.Ma = d5;
|
|
if (f4 + d5 <= a5.Ma)
|
|
return a5.Ia.set(b4.subarray(c4, c4 + d5), f4), d5;
|
|
}
|
|
Q3.qb(a5, f4 + d5);
|
|
if (a5.Ia.subarray && b4.subarray)
|
|
a5.Ia.set(b4.subarray(c4, c4 + d5), f4);
|
|
else
|
|
for (h5 = 0; h5 < d5; h5++)
|
|
a5.Ia[f4 + h5] = b4[c4 + h5];
|
|
a5.Ma = Math.max(a5.Ma, f4 + d5);
|
|
return d5;
|
|
}, Ta: function(a5, b4, c4) {
|
|
1 === c4 ? b4 += a5.position : 2 === c4 && 32768 === (a5.node.mode & 61440) && (b4 += a5.node.Ma);
|
|
if (0 > b4)
|
|
throw new P4(28);
|
|
return b4;
|
|
}, lb: function(a5, b4, c4) {
|
|
Q3.qb(a5.node, b4 + c4);
|
|
a5.node.Ma = Math.max(a5.node.Ma, b4 + c4);
|
|
}, bb: function(a5, b4, c4, d5, f4) {
|
|
if (32768 !== (a5.node.mode & 61440))
|
|
throw new P4(43);
|
|
a5 = a5.node.Ia;
|
|
if (f4 & 2 || a5.buffer !== Na) {
|
|
if (0 < c4 || c4 + b4 < a5.length)
|
|
a5.subarray ? a5 = a5.subarray(c4, c4 + b4) : a5 = Array.prototype.slice.call(
|
|
a5,
|
|
c4,
|
|
c4 + b4
|
|
);
|
|
c4 = true;
|
|
b4 = 65536 * Math.ceil(b4 / 65536);
|
|
(f4 = zb(65536, b4)) ? (u4.fill(0, f4, f4 + b4), b4 = f4) : b4 = 0;
|
|
if (!b4)
|
|
throw new P4(48);
|
|
r3.set(a5, b4);
|
|
} else
|
|
c4 = false, b4 = a5.byteOffset;
|
|
return { Fb: b4, vb: c4 };
|
|
}, cb: function(a5, b4, c4, d5, f4) {
|
|
if (32768 !== (a5.node.mode & 61440))
|
|
throw new P4(43);
|
|
if (f4 & 2)
|
|
return 0;
|
|
Q3.Ha.write(a5, b4, 0, d5, c4, false);
|
|
return 0;
|
|
} } }, Ab = null, Bb = {}, R3 = [], Cb = 1, T6 = null, Db = true, P4 = null, xb = {}, U2 = (a5, b4 = {}) => {
|
|
a5 = hb("/", a5);
|
|
if (!a5)
|
|
return { path: "", node: null };
|
|
b4 = Object.assign({ rb: true, kb: 0 }, b4);
|
|
if (8 < b4.kb)
|
|
throw new P4(32);
|
|
a5 = db(a5.split("/").filter((k5) => !!k5), false);
|
|
for (var c4 = Ab, d5 = "/", f4 = 0; f4 < a5.length; f4++) {
|
|
var h5 = f4 === a5.length - 1;
|
|
if (h5 && b4.parent)
|
|
break;
|
|
c4 = yb(c4, a5[f4]);
|
|
d5 = z5(d5 + "/" + a5[f4]);
|
|
c4.Va && (!h5 || h5 && b4.rb) && (c4 = c4.Va.root);
|
|
if (!h5 || b4.Sa) {
|
|
for (h5 = 0; 40960 === (c4.mode & 61440); )
|
|
if (c4 = Eb(d5), d5 = hb(eb(d5), c4), c4 = U2(d5, { kb: b4.kb + 1 }).node, 40 < h5++)
|
|
throw new P4(32);
|
|
}
|
|
}
|
|
return { path: d5, node: c4 };
|
|
}, ea = (a5) => {
|
|
for (var b4; ; ) {
|
|
if (a5 === a5.parent)
|
|
return a5 = a5.Ra.ub, b4 ? "/" !== a5[a5.length - 1] ? a5 + "/" + b4 : a5 + b4 : a5;
|
|
b4 = b4 ? a5.name + "/" + b4 : a5.name;
|
|
a5 = a5.parent;
|
|
}
|
|
}, Fb = (a5, b4) => {
|
|
for (var c4 = 0, d5 = 0; d5 < b4.length; d5++)
|
|
c4 = (c4 << 5) - c4 + b4.charCodeAt(d5) | 0;
|
|
return (a5 + c4 >>> 0) % T6.length;
|
|
}, Gb = (a5) => {
|
|
var b4 = Fb(a5.parent.id, a5.name);
|
|
if (T6[b4] === a5)
|
|
T6[b4] = a5.Wa;
|
|
else
|
|
for (b4 = T6[b4]; b4; ) {
|
|
if (b4.Wa === a5) {
|
|
b4.Wa = a5.Wa;
|
|
break;
|
|
}
|
|
b4 = b4.Wa;
|
|
}
|
|
}, yb = (a5, b4) => {
|
|
var c4;
|
|
if (c4 = (c4 = Hb(a5, "x")) ? c4 : a5.Ga.lookup ? 0 : 2)
|
|
throw new P4(c4, a5);
|
|
for (c4 = T6[Fb(a5.id, b4)]; c4; c4 = c4.Wa) {
|
|
var d5 = c4.name;
|
|
if (c4.parent.id === a5.id && d5 === b4)
|
|
return c4;
|
|
}
|
|
return a5.Ga.lookup(a5, b4);
|
|
}, wb = (a5, b4, c4, d5) => {
|
|
a5 = new Ib(a5, b4, c4, d5);
|
|
b4 = Fb(a5.parent.id, a5.name);
|
|
a5.Wa = T6[b4];
|
|
return T6[b4] = a5;
|
|
}, Jb = { r: 0, "r+": 2, w: 577, "w+": 578, a: 1089, "a+": 1090 }, Kb = (a5) => {
|
|
var b4 = ["r", "w", "rw"][a5 & 3];
|
|
a5 & 512 && (b4 += "w");
|
|
return b4;
|
|
}, Hb = (a5, b4) => {
|
|
if (Db)
|
|
return 0;
|
|
if (!b4.includes("r") || a5.mode & 292) {
|
|
if (b4.includes("w") && !(a5.mode & 146) || b4.includes("x") && !(a5.mode & 73))
|
|
return 2;
|
|
} else
|
|
return 2;
|
|
return 0;
|
|
}, Lb = (a5, b4) => {
|
|
try {
|
|
return yb(a5, b4), 20;
|
|
} catch (c4) {
|
|
}
|
|
return Hb(a5, "wx");
|
|
}, Mb = (a5, b4, c4) => {
|
|
try {
|
|
var d5 = yb(a5, b4);
|
|
} catch (f4) {
|
|
return f4.Ka;
|
|
}
|
|
if (a5 = Hb(a5, "wx"))
|
|
return a5;
|
|
if (c4) {
|
|
if (16384 !== (d5.mode & 61440))
|
|
return 54;
|
|
if (d5 === d5.parent || "/" === ea(d5))
|
|
return 10;
|
|
} else if (16384 === (d5.mode & 61440))
|
|
return 31;
|
|
return 0;
|
|
}, Nb = (a5 = 0) => {
|
|
for (; 4096 >= a5; a5++)
|
|
if (!R3[a5])
|
|
return a5;
|
|
throw new P4(33);
|
|
}, Pb = (a5, b4) => {
|
|
Ob || (Ob = function() {
|
|
this.$a = {};
|
|
}, Ob.prototype = {}, Object.defineProperties(Ob.prototype, { object: { get: function() {
|
|
return this.node;
|
|
}, set: function(c4) {
|
|
this.node = c4;
|
|
} }, flags: { get: function() {
|
|
return this.$a.flags;
|
|
}, set: function(c4) {
|
|
this.$a.flags = c4;
|
|
} }, position: { get: function() {
|
|
return this.$a.position;
|
|
}, set: function(c4) {
|
|
this.$a.position = c4;
|
|
} } }));
|
|
a5 = Object.assign(new Ob(), a5);
|
|
b4 = Nb(b4);
|
|
a5.fd = b4;
|
|
return R3[b4] = a5;
|
|
}, vb = { open: (a5) => {
|
|
a5.Ha = Bb[a5.node.rdev].Ha;
|
|
a5.Ha.open && a5.Ha.open(a5);
|
|
}, Ta: () => {
|
|
throw new P4(70);
|
|
} }, lb = (a5, b4) => {
|
|
Bb[a5] = { Ha: b4 };
|
|
}, Qb = (a5, b4) => {
|
|
var c4 = "/" === b4, d5 = !b4;
|
|
if (c4 && Ab)
|
|
throw new P4(10);
|
|
if (!c4 && !d5) {
|
|
var f4 = U2(b4, { rb: false });
|
|
b4 = f4.path;
|
|
f4 = f4.node;
|
|
if (f4.Va)
|
|
throw new P4(10);
|
|
if (16384 !== (f4.mode & 61440))
|
|
throw new P4(54);
|
|
}
|
|
b4 = { type: a5, Kb: {}, ub: b4, Eb: [] };
|
|
a5 = a5.Ra(b4);
|
|
a5.Ra = b4;
|
|
b4.root = a5;
|
|
c4 ? Ab = a5 : f4 && (f4.Va = b4, f4.Ra && f4.Ra.Eb.push(b4));
|
|
}, ha = (a5, b4, c4) => {
|
|
var d5 = U2(a5, { parent: true }).node;
|
|
a5 = fb(a5);
|
|
if (!a5 || "." === a5 || ".." === a5)
|
|
throw new P4(28);
|
|
var f4 = Lb(d5, a5);
|
|
if (f4)
|
|
throw new P4(f4);
|
|
if (!d5.Ga.ab)
|
|
throw new P4(63);
|
|
return d5.Ga.ab(d5, a5, b4, c4);
|
|
}, V3 = (a5, b4) => ha(a5, (void 0 !== b4 ? b4 : 511) & 1023 | 16384, 0), Rb = (a5, b4, c4) => {
|
|
"undefined" == typeof c4 && (c4 = b4, b4 = 438);
|
|
ha(a5, b4 | 8192, c4);
|
|
}, Sb = (a5, b4) => {
|
|
if (!hb(a5))
|
|
throw new P4(44);
|
|
var c4 = U2(b4, { parent: true }).node;
|
|
if (!c4)
|
|
throw new P4(44);
|
|
b4 = fb(b4);
|
|
var d5 = Lb(c4, b4);
|
|
if (d5)
|
|
throw new P4(d5);
|
|
if (!c4.Ga.symlink)
|
|
throw new P4(63);
|
|
c4.Ga.symlink(c4, b4, a5);
|
|
}, Tb = (a5) => {
|
|
var b4 = U2(a5, { parent: true }).node;
|
|
a5 = fb(a5);
|
|
var c4 = yb(b4, a5), d5 = Mb(b4, a5, true);
|
|
if (d5)
|
|
throw new P4(d5);
|
|
if (!b4.Ga.rmdir)
|
|
throw new P4(63);
|
|
if (c4.Va)
|
|
throw new P4(10);
|
|
b4.Ga.rmdir(b4, a5);
|
|
Gb(c4);
|
|
}, ta = (a5) => {
|
|
var b4 = U2(a5, { parent: true }).node;
|
|
if (!b4)
|
|
throw new P4(44);
|
|
a5 = fb(a5);
|
|
var c4 = yb(b4, a5), d5 = Mb(b4, a5, false);
|
|
if (d5)
|
|
throw new P4(d5);
|
|
if (!b4.Ga.unlink)
|
|
throw new P4(63);
|
|
if (c4.Va)
|
|
throw new P4(10);
|
|
b4.Ga.unlink(b4, a5);
|
|
Gb(c4);
|
|
}, Eb = (a5) => {
|
|
a5 = U2(a5).node;
|
|
if (!a5)
|
|
throw new P4(44);
|
|
if (!a5.Ga.readlink)
|
|
throw new P4(28);
|
|
return hb(ea(a5.parent), a5.Ga.readlink(a5));
|
|
}, Ub = (a5, b4) => {
|
|
a5 = U2(a5, { Sa: !b4 }).node;
|
|
if (!a5)
|
|
throw new P4(44);
|
|
if (!a5.Ga.Pa)
|
|
throw new P4(63);
|
|
return a5.Ga.Pa(a5);
|
|
}, Vb = (a5) => Ub(a5, true), ia = (a5, b4) => {
|
|
a5 = "string" == typeof a5 ? U2(a5, { Sa: true }).node : a5;
|
|
if (!a5.Ga.Oa)
|
|
throw new P4(63);
|
|
a5.Ga.Oa(a5, { mode: b4 & 4095 | a5.mode & -4096, timestamp: Date.now() });
|
|
}, Wb = (a5, b4) => {
|
|
if (0 > b4)
|
|
throw new P4(28);
|
|
a5 = "string" == typeof a5 ? U2(a5, { Sa: true }).node : a5;
|
|
if (!a5.Ga.Oa)
|
|
throw new P4(63);
|
|
if (16384 === (a5.mode & 61440))
|
|
throw new P4(31);
|
|
if (32768 !== (a5.mode & 61440))
|
|
throw new P4(28);
|
|
var c4 = Hb(a5, "w");
|
|
if (c4)
|
|
throw new P4(c4);
|
|
a5.Ga.Oa(a5, { size: b4, timestamp: Date.now() });
|
|
}, ja = (a5, b4, c4) => {
|
|
if ("" === a5)
|
|
throw new P4(44);
|
|
if ("string" == typeof b4) {
|
|
var d5 = Jb[b4];
|
|
if ("undefined" == typeof d5)
|
|
throw Error("Unknown file open mode: " + b4);
|
|
b4 = d5;
|
|
}
|
|
c4 = b4 & 64 ? ("undefined" == typeof c4 ? 438 : c4) & 4095 | 32768 : 0;
|
|
if ("object" == typeof a5)
|
|
var f4 = a5;
|
|
else {
|
|
a5 = z5(a5);
|
|
try {
|
|
f4 = U2(a5, { Sa: !(b4 & 131072) }).node;
|
|
} catch (h5) {
|
|
}
|
|
}
|
|
d5 = false;
|
|
if (b4 & 64)
|
|
if (f4) {
|
|
if (b4 & 128)
|
|
throw new P4(20);
|
|
} else
|
|
f4 = ha(a5, c4, 0), d5 = true;
|
|
if (!f4)
|
|
throw new P4(44);
|
|
8192 === (f4.mode & 61440) && (b4 &= -513);
|
|
if (b4 & 65536 && 16384 !== (f4.mode & 61440))
|
|
throw new P4(54);
|
|
if (!d5 && (c4 = f4 ? 40960 === (f4.mode & 61440) ? 32 : 16384 === (f4.mode & 61440) && ("r" !== Kb(b4) || b4 & 512) ? 31 : Hb(f4, Kb(b4)) : 44))
|
|
throw new P4(c4);
|
|
b4 & 512 && !d5 && Wb(f4, 0);
|
|
b4 &= -131713;
|
|
f4 = Pb({ node: f4, path: ea(f4), flags: b4, seekable: true, position: 0, Ha: f4.Ha, Ib: [], error: false });
|
|
f4.Ha.open && f4.Ha.open(f4);
|
|
!e4.logReadFiles || b4 & 1 || (Xb || (Xb = {}), a5 in Xb || (Xb[a5] = 1));
|
|
return f4;
|
|
}, la = (a5) => {
|
|
if (null === a5.fd)
|
|
throw new P4(8);
|
|
a5.hb && (a5.hb = null);
|
|
try {
|
|
a5.Ha.close && a5.Ha.close(a5);
|
|
} catch (b4) {
|
|
throw b4;
|
|
} finally {
|
|
R3[a5.fd] = null;
|
|
}
|
|
a5.fd = null;
|
|
}, Yb = (a5, b4, c4) => {
|
|
if (null === a5.fd)
|
|
throw new P4(8);
|
|
if (!a5.seekable || !a5.Ha.Ta)
|
|
throw new P4(70);
|
|
if (0 != c4 && 1 != c4 && 2 != c4)
|
|
throw new P4(28);
|
|
a5.position = a5.Ha.Ta(a5, b4, c4);
|
|
a5.Ib = [];
|
|
}, Zb = (a5, b4, c4, d5, f4) => {
|
|
if (0 > d5 || 0 > f4)
|
|
throw new P4(28);
|
|
if (null === a5.fd)
|
|
throw new P4(8);
|
|
if (1 === (a5.flags & 2097155))
|
|
throw new P4(8);
|
|
if (16384 === (a5.node.mode & 61440))
|
|
throw new P4(31);
|
|
if (!a5.Ha.read)
|
|
throw new P4(28);
|
|
var h5 = "undefined" != typeof f4;
|
|
if (!h5)
|
|
f4 = a5.position;
|
|
else if (!a5.seekable)
|
|
throw new P4(70);
|
|
b4 = a5.Ha.read(a5, b4, c4, d5, f4);
|
|
h5 || (a5.position += b4);
|
|
return b4;
|
|
}, ka = (a5, b4, c4, d5, f4) => {
|
|
if (0 > d5 || 0 > f4)
|
|
throw new P4(28);
|
|
if (null === a5.fd)
|
|
throw new P4(8);
|
|
if (0 === (a5.flags & 2097155))
|
|
throw new P4(8);
|
|
if (16384 === (a5.node.mode & 61440))
|
|
throw new P4(31);
|
|
if (!a5.Ha.write)
|
|
throw new P4(28);
|
|
a5.seekable && a5.flags & 1024 && Yb(a5, 0, 2);
|
|
var h5 = "undefined" != typeof f4;
|
|
if (!h5)
|
|
f4 = a5.position;
|
|
else if (!a5.seekable)
|
|
throw new P4(70);
|
|
b4 = a5.Ha.write(a5, b4, c4, d5, f4, void 0);
|
|
h5 || (a5.position += b4);
|
|
return b4;
|
|
}, sa = (a5) => {
|
|
var b4 = "binary";
|
|
if ("utf8" !== b4 && "binary" !== b4)
|
|
throw Error('Invalid encoding type "' + b4 + '"');
|
|
var c4;
|
|
var d5 = ja(a5, d5 || 0);
|
|
a5 = Ub(a5).size;
|
|
var f4 = new Uint8Array(a5);
|
|
Zb(d5, f4, 0, a5, 0);
|
|
"utf8" === b4 ? c4 = Ma(f4, 0) : "binary" === b4 && (c4 = f4);
|
|
la(d5);
|
|
return c4;
|
|
}, $b = () => {
|
|
P4 || (P4 = function(a5, b4) {
|
|
this.node = b4;
|
|
this.Hb = function(c4) {
|
|
this.Ka = c4;
|
|
};
|
|
this.Hb(a5);
|
|
this.message = "FS error";
|
|
}, P4.prototype = Error(), P4.prototype.constructor = P4, [44].forEach((a5) => {
|
|
xb[a5] = new P4(a5);
|
|
xb[a5].stack = "<generic error, no stack>";
|
|
}));
|
|
}, ac, fa = (a5, b4) => {
|
|
var c4 = 0;
|
|
a5 && (c4 |= 365);
|
|
b4 && (c4 |= 146);
|
|
return c4;
|
|
}, cc = (a5, b4, c4) => {
|
|
a5 = z5("/dev/" + a5);
|
|
var d5 = fa(!!b4, !!c4);
|
|
bc || (bc = 64);
|
|
var f4 = bc++ << 8 | 0;
|
|
lb(f4, { open: (h5) => {
|
|
h5.seekable = false;
|
|
}, close: () => {
|
|
c4 && c4.buffer && c4.buffer.length && c4(10);
|
|
}, read: (h5, k5, q5, x5) => {
|
|
for (var w5 = 0, A4 = 0; A4 < x5; A4++) {
|
|
try {
|
|
var S4 = b4();
|
|
} catch (nb) {
|
|
throw new P4(29);
|
|
}
|
|
if (void 0 === S4 && 0 === w5)
|
|
throw new P4(6);
|
|
if (null === S4 || void 0 === S4)
|
|
break;
|
|
w5++;
|
|
k5[q5 + A4] = S4;
|
|
}
|
|
w5 && (h5.node.timestamp = Date.now());
|
|
return w5;
|
|
}, write: (h5, k5, q5, x5) => {
|
|
for (var w5 = 0; w5 < x5; w5++)
|
|
try {
|
|
c4(k5[q5 + w5]);
|
|
} catch (A4) {
|
|
throw new P4(29);
|
|
}
|
|
x5 && (h5.node.timestamp = Date.now());
|
|
return w5;
|
|
} });
|
|
Rb(a5, d5, f4);
|
|
}, bc, W2 = {}, Ob, Xb;
|
|
function dc(a5, b4, c4) {
|
|
if ("/" === b4.charAt(0))
|
|
return b4;
|
|
a5 = -100 === a5 ? "/" : X3(a5).path;
|
|
if (0 == b4.length) {
|
|
if (!c4)
|
|
throw new P4(44);
|
|
return a5;
|
|
}
|
|
return z5(a5 + "/" + b4);
|
|
}
|
|
function ec(a5, b4, c4) {
|
|
try {
|
|
var d5 = a5(b4);
|
|
} catch (f4) {
|
|
if (f4 && f4.node && z5(b4) !== z5(ea(f4.node)))
|
|
return -54;
|
|
throw f4;
|
|
}
|
|
F3[c4 >> 2] = d5.dev;
|
|
F3[c4 + 8 >> 2] = d5.ino;
|
|
F3[c4 + 12 >> 2] = d5.mode;
|
|
J2[c4 + 16 >> 2] = d5.nlink;
|
|
F3[c4 + 20 >> 2] = d5.uid;
|
|
F3[c4 + 24 >> 2] = d5.gid;
|
|
F3[c4 + 28 >> 2] = d5.rdev;
|
|
O4 = [d5.size >>> 0, (N3 = d5.size, 1 <= +Math.abs(N3) ? 0 < N3 ? (Math.min(+Math.floor(N3 / 4294967296), 4294967295) | 0) >>> 0 : ~~+Math.ceil((N3 - +(~~N3 >>> 0)) / 4294967296) >>> 0 : 0)];
|
|
F3[c4 + 40 >> 2] = O4[0];
|
|
F3[c4 + 44 >> 2] = O4[1];
|
|
F3[c4 + 48 >> 2] = 4096;
|
|
F3[c4 + 52 >> 2] = d5.blocks;
|
|
O4 = [Math.floor(d5.atime.getTime() / 1e3) >>> 0, (N3 = Math.floor(d5.atime.getTime() / 1e3), 1 <= +Math.abs(N3) ? 0 < N3 ? (Math.min(+Math.floor(N3 / 4294967296), 4294967295) | 0) >>> 0 : ~~+Math.ceil((N3 - +(~~N3 >>> 0)) / 4294967296) >>> 0 : 0)];
|
|
F3[c4 + 56 >> 2] = O4[0];
|
|
F3[c4 + 60 >> 2] = O4[1];
|
|
J2[c4 + 64 >> 2] = 0;
|
|
O4 = [Math.floor(d5.mtime.getTime() / 1e3) >>> 0, (N3 = Math.floor(d5.mtime.getTime() / 1e3), 1 <= +Math.abs(N3) ? 0 < N3 ? (Math.min(+Math.floor(N3 / 4294967296), 4294967295) | 0) >>> 0 : ~~+Math.ceil((N3 - +(~~N3 >>> 0)) / 4294967296) >>> 0 : 0)];
|
|
F3[c4 + 72 >> 2] = O4[0];
|
|
F3[c4 + 76 >> 2] = O4[1];
|
|
J2[c4 + 80 >> 2] = 0;
|
|
O4 = [Math.floor(d5.ctime.getTime() / 1e3) >>> 0, (N3 = Math.floor(d5.ctime.getTime() / 1e3), 1 <= +Math.abs(N3) ? 0 < N3 ? (Math.min(+Math.floor(N3 / 4294967296), 4294967295) | 0) >>> 0 : ~~+Math.ceil((N3 - +(~~N3 >>> 0)) / 4294967296) >>> 0 : 0)];
|
|
F3[c4 + 88 >> 2] = O4[0];
|
|
F3[c4 + 92 >> 2] = O4[1];
|
|
J2[c4 + 96 >> 2] = 0;
|
|
O4 = [d5.ino >>> 0, (N3 = d5.ino, 1 <= +Math.abs(N3) ? 0 < N3 ? (Math.min(+Math.floor(N3 / 4294967296), 4294967295) | 0) >>> 0 : ~~+Math.ceil((N3 - +(~~N3 >>> 0)) / 4294967296) >>> 0 : 0)];
|
|
F3[c4 + 104 >> 2] = O4[0];
|
|
F3[c4 + 108 >> 2] = O4[1];
|
|
return 0;
|
|
}
|
|
var fc = void 0;
|
|
function Hc() {
|
|
fc += 4;
|
|
return F3[fc - 4 >> 2];
|
|
}
|
|
function X3(a5) {
|
|
a5 = R3[a5];
|
|
if (!a5)
|
|
throw new P4(8);
|
|
return a5;
|
|
}
|
|
function Jc(a5) {
|
|
return J2[a5 >> 2] + 4294967296 * F3[a5 + 4 >> 2];
|
|
}
|
|
function Kc(a5) {
|
|
var b4 = ca(a5) + 1, c4 = da(b4);
|
|
c4 && t4(a5, r3, c4, b4);
|
|
return c4;
|
|
}
|
|
function Lc(a5, b4, c4) {
|
|
function d5(x5) {
|
|
return (x5 = x5.toTimeString().match(/\(([A-Za-z ]+)\)$/)) ? x5[1] : "GMT";
|
|
}
|
|
var f4 = new Date().getFullYear(), h5 = new Date(f4, 0, 1), k5 = new Date(f4, 6, 1);
|
|
f4 = h5.getTimezoneOffset();
|
|
var q5 = k5.getTimezoneOffset();
|
|
F3[a5 >> 2] = 60 * Math.max(f4, q5);
|
|
F3[b4 >> 2] = Number(f4 != q5);
|
|
a5 = d5(h5);
|
|
b4 = d5(k5);
|
|
a5 = Kc(a5);
|
|
b4 = Kc(b4);
|
|
q5 < f4 ? (J2[c4 >> 2] = a5, J2[c4 + 4 >> 2] = b4) : (J2[c4 >> 2] = b4, J2[c4 + 4 >> 2] = a5);
|
|
}
|
|
function Mc(a5, b4, c4) {
|
|
Mc.Bb || (Mc.Bb = true, Lc(a5, b4, c4));
|
|
}
|
|
var Nc;
|
|
Nc = Aa ? () => {
|
|
var a5 = process.hrtime();
|
|
return 1e3 * a5[0] + a5[1] / 1e6;
|
|
} : () => performance.now();
|
|
var Oc = {};
|
|
function Pc() {
|
|
if (!Qc) {
|
|
var a5 = { USER: "web_user", LOGNAME: "web_user", PATH: "/", PWD: "/", HOME: "/home/web_user", LANG: ("object" == typeof navigator && navigator.languages && navigator.languages[0] || "C").replace("-", "_") + ".UTF-8", _: wa || "./this.program" }, b4;
|
|
for (b4 in Oc)
|
|
void 0 === Oc[b4] ? delete a5[b4] : a5[b4] = Oc[b4];
|
|
var c4 = [];
|
|
for (b4 in a5)
|
|
c4.push(b4 + "=" + a5[b4]);
|
|
Qc = c4;
|
|
}
|
|
return Qc;
|
|
}
|
|
var Qc, Y3 = void 0, Rc = [];
|
|
function ua(a5, b4) {
|
|
if (!Y3) {
|
|
Y3 = /* @__PURE__ */ new WeakMap();
|
|
var c4 = K3.length;
|
|
if (Y3)
|
|
for (var d5 = 0; d5 < 0 + c4; d5++) {
|
|
var f4 = K3.get(d5);
|
|
f4 && Y3.set(f4, d5);
|
|
}
|
|
}
|
|
if (Y3.has(a5))
|
|
return Y3.get(a5);
|
|
if (Rc.length)
|
|
c4 = Rc.pop();
|
|
else {
|
|
try {
|
|
K3.grow(1);
|
|
} catch (q5) {
|
|
if (!(q5 instanceof RangeError))
|
|
throw q5;
|
|
throw "Unable to grow wasm table. Set ALLOW_TABLE_GROWTH.";
|
|
}
|
|
c4 = K3.length - 1;
|
|
}
|
|
try {
|
|
K3.set(c4, a5);
|
|
} catch (q5) {
|
|
if (!(q5 instanceof TypeError))
|
|
throw q5;
|
|
if ("function" == typeof WebAssembly.Function) {
|
|
d5 = WebAssembly.Function;
|
|
f4 = { i: "i32", j: "i64", f: "f32", d: "f64", p: "i32" };
|
|
for (var h5 = { parameters: [], results: "v" == b4[0] ? [] : [f4[b4[0]]] }, k5 = 1; k5 < b4.length; ++k5)
|
|
h5.parameters.push(f4[b4[k5]]);
|
|
b4 = new d5(h5, a5);
|
|
} else {
|
|
d5 = [1, 96];
|
|
f4 = b4.slice(0, 1);
|
|
b4 = b4.slice(1);
|
|
h5 = { i: 127, p: 127, j: 126, f: 125, d: 124 };
|
|
k5 = b4.length;
|
|
128 > k5 ? d5.push(k5) : d5.push(k5 % 128 | 128, k5 >> 7);
|
|
for (k5 = 0; k5 < b4.length; ++k5)
|
|
d5.push(h5[b4[k5]]);
|
|
"v" == f4 ? d5.push(0) : d5.push(1, h5[f4]);
|
|
b4 = [0, 97, 115, 109, 1, 0, 0, 0, 1];
|
|
f4 = d5.length;
|
|
128 > f4 ? b4.push(f4) : b4.push(f4 % 128 | 128, f4 >> 7);
|
|
b4.push.apply(b4, d5);
|
|
b4.push(2, 7, 1, 1, 101, 1, 102, 0, 0, 7, 5, 1, 1, 102, 0, 0);
|
|
b4 = new WebAssembly.Module(new Uint8Array(b4));
|
|
b4 = new WebAssembly.Instance(b4, { e: { f: a5 } }).exports.f;
|
|
}
|
|
K3.set(
|
|
c4,
|
|
b4
|
|
);
|
|
}
|
|
Y3.set(a5, c4);
|
|
return c4;
|
|
}
|
|
function ra(a5) {
|
|
Y3.delete(K3.get(a5));
|
|
Rc.push(a5);
|
|
}
|
|
var Sc = 0, Tc = 1;
|
|
function aa(a5) {
|
|
var b4 = Sc == Tc ? B5(a5.length) : da(a5.length);
|
|
a5.subarray || a5.slice || (a5 = new Uint8Array(a5));
|
|
u4.set(a5, b4);
|
|
return b4;
|
|
}
|
|
function Uc(a5, b4, c4, d5) {
|
|
var f4 = { string: (w5) => {
|
|
var A4 = 0;
|
|
if (null !== w5 && void 0 !== w5 && 0 !== w5) {
|
|
var S4 = (w5.length << 2) + 1;
|
|
A4 = B5(S4);
|
|
t4(w5, u4, A4, S4);
|
|
}
|
|
return A4;
|
|
}, array: (w5) => {
|
|
var A4 = B5(w5.length);
|
|
r3.set(w5, A4);
|
|
return A4;
|
|
} };
|
|
a5 = e4["_" + a5];
|
|
var h5 = [], k5 = 0;
|
|
if (d5)
|
|
for (var q5 = 0; q5 < d5.length; q5++) {
|
|
var x5 = f4[c4[q5]];
|
|
x5 ? (0 === k5 && (k5 = oa()), h5[q5] = x5(d5[q5])) : h5[q5] = d5[q5];
|
|
}
|
|
c4 = a5.apply(null, h5);
|
|
return c4 = function(w5) {
|
|
0 !== k5 && qa(k5);
|
|
return "string" === b4 ? C3(w5) : "boolean" === b4 ? !!w5 : w5;
|
|
}(c4);
|
|
}
|
|
function Ib(a5, b4, c4, d5) {
|
|
a5 || (a5 = this);
|
|
this.parent = a5;
|
|
this.Ra = a5.Ra;
|
|
this.Va = null;
|
|
this.id = Cb++;
|
|
this.name = b4;
|
|
this.mode = c4;
|
|
this.Ga = {};
|
|
this.Ha = {};
|
|
this.rdev = d5;
|
|
}
|
|
Object.defineProperties(Ib.prototype, { read: { get: function() {
|
|
return 365 === (this.mode & 365);
|
|
}, set: function(a5) {
|
|
a5 ? this.mode |= 365 : this.mode &= -366;
|
|
} }, write: { get: function() {
|
|
return 146 === (this.mode & 146);
|
|
}, set: function(a5) {
|
|
a5 ? this.mode |= 146 : this.mode &= -147;
|
|
} } });
|
|
$b();
|
|
T6 = Array(4096);
|
|
Qb(Q3, "/");
|
|
V3("/tmp");
|
|
V3("/home");
|
|
V3("/home/web_user");
|
|
(() => {
|
|
V3("/dev");
|
|
lb(259, { read: () => 0, write: (b4, c4, d5, f4) => f4 });
|
|
Rb("/dev/null", 259);
|
|
jb(1280, tb);
|
|
jb(1536, ub);
|
|
Rb("/dev/tty", 1280);
|
|
Rb("/dev/tty1", 1536);
|
|
var a5 = gb();
|
|
cc("random", a5);
|
|
cc("urandom", a5);
|
|
V3("/dev/shm");
|
|
V3("/dev/shm/tmp");
|
|
})();
|
|
(() => {
|
|
V3("/proc");
|
|
var a5 = V3("/proc/self");
|
|
V3("/proc/self/fd");
|
|
Qb({ Ra: () => {
|
|
var b4 = wb(a5, "fd", 16895, 73);
|
|
b4.Ga = { lookup: (c4, d5) => {
|
|
var f4 = R3[+d5];
|
|
if (!f4)
|
|
throw new P4(8);
|
|
c4 = { parent: null, Ra: { ub: "fake" }, Ga: { readlink: () => f4.path } };
|
|
return c4.parent = c4;
|
|
} };
|
|
return b4;
|
|
} }, "/proc/self/fd");
|
|
})();
|
|
var Wc = { a: function(a5, b4, c4, d5) {
|
|
E3("Assertion failed: " + C3(a5) + ", at: " + [b4 ? C3(b4) : "unknown filename", c4, d5 ? C3(d5) : "unknown function"]);
|
|
}, h: function(a5, b4) {
|
|
try {
|
|
return a5 = C3(a5), ia(a5, b4), 0;
|
|
} catch (c4) {
|
|
if ("undefined" == typeof W2 || !(c4 instanceof P4))
|
|
throw c4;
|
|
return -c4.Ka;
|
|
}
|
|
}, H: function(a5, b4, c4) {
|
|
try {
|
|
b4 = C3(b4);
|
|
b4 = dc(a5, b4);
|
|
if (c4 & -8)
|
|
return -28;
|
|
var d5 = U2(b4, { Sa: true }).node;
|
|
if (!d5)
|
|
return -44;
|
|
a5 = "";
|
|
c4 & 4 && (a5 += "r");
|
|
c4 & 2 && (a5 += "w");
|
|
c4 & 1 && (a5 += "x");
|
|
return a5 && Hb(d5, a5) ? -2 : 0;
|
|
} catch (f4) {
|
|
if ("undefined" == typeof W2 || !(f4 instanceof P4))
|
|
throw f4;
|
|
return -f4.Ka;
|
|
}
|
|
}, i: function(a5, b4) {
|
|
try {
|
|
var c4 = R3[a5];
|
|
if (!c4)
|
|
throw new P4(8);
|
|
ia(c4.node, b4);
|
|
return 0;
|
|
} catch (d5) {
|
|
if ("undefined" == typeof W2 || !(d5 instanceof P4))
|
|
throw d5;
|
|
return -d5.Ka;
|
|
}
|
|
}, g: function(a5) {
|
|
try {
|
|
var b4 = R3[a5];
|
|
if (!b4)
|
|
throw new P4(8);
|
|
var c4 = b4.node;
|
|
var d5 = "string" == typeof c4 ? U2(c4, { Sa: true }).node : c4;
|
|
if (!d5.Ga.Oa)
|
|
throw new P4(63);
|
|
d5.Ga.Oa(d5, { timestamp: Date.now() });
|
|
return 0;
|
|
} catch (f4) {
|
|
if ("undefined" == typeof W2 || !(f4 instanceof P4))
|
|
throw f4;
|
|
return -f4.Ka;
|
|
}
|
|
}, b: function(a5, b4, c4) {
|
|
fc = c4;
|
|
try {
|
|
var d5 = X3(a5);
|
|
switch (b4) {
|
|
case 0:
|
|
var f4 = Hc();
|
|
return 0 > f4 ? -28 : Pb(d5, f4).fd;
|
|
case 1:
|
|
case 2:
|
|
return 0;
|
|
case 3:
|
|
return d5.flags;
|
|
case 4:
|
|
return f4 = Hc(), d5.flags |= f4, 0;
|
|
case 5:
|
|
return f4 = Hc(), Oa[f4 + 0 >> 1] = 2, 0;
|
|
case 6:
|
|
case 7:
|
|
return 0;
|
|
case 16:
|
|
case 8:
|
|
return -28;
|
|
case 9:
|
|
return F3[Vc() >> 2] = 28, -1;
|
|
default:
|
|
return -28;
|
|
}
|
|
} catch (h5) {
|
|
if ("undefined" == typeof W2 || !(h5 instanceof P4))
|
|
throw h5;
|
|
return -h5.Ka;
|
|
}
|
|
}, G: function(a5, b4) {
|
|
try {
|
|
var c4 = X3(a5);
|
|
return ec(Ub, c4.path, b4);
|
|
} catch (d5) {
|
|
if ("undefined" == typeof W2 || !(d5 instanceof P4))
|
|
throw d5;
|
|
return -d5.Ka;
|
|
}
|
|
}, l: function(a5, b4, c4) {
|
|
try {
|
|
b4 = c4 + 2097152 >>> 0 < 4194305 - !!b4 ? (b4 >>> 0) + 4294967296 * c4 : NaN;
|
|
if (isNaN(b4))
|
|
return -61;
|
|
var d5 = R3[a5];
|
|
if (!d5)
|
|
throw new P4(8);
|
|
if (0 === (d5.flags & 2097155))
|
|
throw new P4(28);
|
|
Wb(d5.node, b4);
|
|
return 0;
|
|
} catch (f4) {
|
|
if ("undefined" == typeof W2 || !(f4 instanceof P4))
|
|
throw f4;
|
|
return -f4.Ka;
|
|
}
|
|
}, B: function(a5, b4) {
|
|
try {
|
|
if (0 === b4)
|
|
return -28;
|
|
var c4 = ca("/") + 1;
|
|
if (b4 < c4)
|
|
return -68;
|
|
t4("/", u4, a5, b4);
|
|
return c4;
|
|
} catch (d5) {
|
|
if ("undefined" == typeof W2 || !(d5 instanceof P4))
|
|
throw d5;
|
|
return -d5.Ka;
|
|
}
|
|
}, E: function(a5, b4) {
|
|
try {
|
|
return a5 = C3(a5), ec(Vb, a5, b4);
|
|
} catch (c4) {
|
|
if ("undefined" == typeof W2 || !(c4 instanceof P4))
|
|
throw c4;
|
|
return -c4.Ka;
|
|
}
|
|
}, y: function(a5, b4, c4) {
|
|
try {
|
|
return b4 = C3(b4), b4 = dc(a5, b4), b4 = z5(b4), "/" === b4[b4.length - 1] && (b4 = b4.substr(0, b4.length - 1)), V3(b4, c4), 0;
|
|
} catch (d5) {
|
|
if ("undefined" == typeof W2 || !(d5 instanceof P4))
|
|
throw d5;
|
|
return -d5.Ka;
|
|
}
|
|
}, D: function(a5, b4, c4, d5) {
|
|
try {
|
|
b4 = C3(b4);
|
|
var f4 = d5 & 256;
|
|
b4 = dc(a5, b4, d5 & 4096);
|
|
return ec(f4 ? Vb : Ub, b4, c4);
|
|
} catch (h5) {
|
|
if ("undefined" == typeof W2 || !(h5 instanceof P4))
|
|
throw h5;
|
|
return -h5.Ka;
|
|
}
|
|
}, v: function(a5, b4, c4, d5) {
|
|
fc = d5;
|
|
try {
|
|
b4 = C3(b4);
|
|
b4 = dc(a5, b4);
|
|
var f4 = d5 ? Hc() : 0;
|
|
return ja(b4, c4, f4).fd;
|
|
} catch (h5) {
|
|
if ("undefined" == typeof W2 || !(h5 instanceof P4))
|
|
throw h5;
|
|
return -h5.Ka;
|
|
}
|
|
}, t: function(a5, b4, c4, d5) {
|
|
try {
|
|
b4 = C3(b4);
|
|
b4 = dc(a5, b4);
|
|
if (0 >= d5)
|
|
return -28;
|
|
var f4 = Eb(b4), h5 = Math.min(
|
|
d5,
|
|
ca(f4)
|
|
), k5 = r3[c4 + h5];
|
|
t4(f4, u4, c4, d5 + 1);
|
|
r3[c4 + h5] = k5;
|
|
return h5;
|
|
} catch (q5) {
|
|
if ("undefined" == typeof W2 || !(q5 instanceof P4))
|
|
throw q5;
|
|
return -q5.Ka;
|
|
}
|
|
}, s: function(a5) {
|
|
try {
|
|
return a5 = C3(a5), Tb(a5), 0;
|
|
} catch (b4) {
|
|
if ("undefined" == typeof W2 || !(b4 instanceof P4))
|
|
throw b4;
|
|
return -b4.Ka;
|
|
}
|
|
}, F: function(a5, b4) {
|
|
try {
|
|
return a5 = C3(a5), ec(Ub, a5, b4);
|
|
} catch (c4) {
|
|
if ("undefined" == typeof W2 || !(c4 instanceof P4))
|
|
throw c4;
|
|
return -c4.Ka;
|
|
}
|
|
}, p: function(a5, b4, c4) {
|
|
try {
|
|
return b4 = C3(b4), b4 = dc(a5, b4), 0 === c4 ? ta(b4) : 512 === c4 ? Tb(b4) : E3("Invalid flags passed to unlinkat"), 0;
|
|
} catch (d5) {
|
|
if ("undefined" == typeof W2 || !(d5 instanceof P4))
|
|
throw d5;
|
|
return -d5.Ka;
|
|
}
|
|
}, o: function(a5, b4, c4) {
|
|
try {
|
|
b4 = C3(b4);
|
|
b4 = dc(a5, b4, true);
|
|
if (c4) {
|
|
var d5 = Jc(c4), f4 = F3[c4 + 8 >> 2];
|
|
h5 = 1e3 * d5 + f4 / 1e6;
|
|
c4 += 16;
|
|
d5 = Jc(c4);
|
|
f4 = F3[c4 + 8 >> 2];
|
|
k5 = 1e3 * d5 + f4 / 1e6;
|
|
} else
|
|
var h5 = Date.now(), k5 = h5;
|
|
a5 = h5;
|
|
var q5 = U2(b4, { Sa: true }).node;
|
|
q5.Ga.Oa(q5, { timestamp: Math.max(a5, k5) });
|
|
return 0;
|
|
} catch (x5) {
|
|
if ("undefined" == typeof W2 || !(x5 instanceof P4))
|
|
throw x5;
|
|
return -x5.Ka;
|
|
}
|
|
}, e: function() {
|
|
return Date.now();
|
|
}, j: function(a5, b4) {
|
|
a5 = new Date(1e3 * Jc(a5));
|
|
F3[b4 >> 2] = a5.getSeconds();
|
|
F3[b4 + 4 >> 2] = a5.getMinutes();
|
|
F3[b4 + 8 >> 2] = a5.getHours();
|
|
F3[b4 + 12 >> 2] = a5.getDate();
|
|
F3[b4 + 16 >> 2] = a5.getMonth();
|
|
F3[b4 + 20 >> 2] = a5.getFullYear() - 1900;
|
|
F3[b4 + 24 >> 2] = a5.getDay();
|
|
var c4 = new Date(a5.getFullYear(), 0, 1);
|
|
F3[b4 + 28 >> 2] = (a5.getTime() - c4.getTime()) / 864e5 | 0;
|
|
F3[b4 + 36 >> 2] = -(60 * a5.getTimezoneOffset());
|
|
var d5 = new Date(a5.getFullYear(), 6, 1).getTimezoneOffset();
|
|
c4 = c4.getTimezoneOffset();
|
|
F3[b4 + 32 >> 2] = (d5 != c4 && a5.getTimezoneOffset() == Math.min(c4, d5)) | 0;
|
|
}, w: function(a5, b4, c4, d5, f4, h5) {
|
|
try {
|
|
var k5 = X3(d5);
|
|
if (0 !== (b4 & 2) && 0 === (c4 & 2) && 2 !== (k5.flags & 2097155))
|
|
throw new P4(2);
|
|
if (1 === (k5.flags & 2097155))
|
|
throw new P4(2);
|
|
if (!k5.Ha.bb)
|
|
throw new P4(43);
|
|
var q5 = k5.Ha.bb(k5, a5, f4, b4, c4);
|
|
var x5 = q5.Fb;
|
|
F3[h5 >> 2] = q5.vb;
|
|
return x5;
|
|
} catch (w5) {
|
|
if ("undefined" == typeof W2 || !(w5 instanceof P4))
|
|
throw w5;
|
|
return -w5.Ka;
|
|
}
|
|
}, x: function(a5, b4, c4, d5, f4, h5) {
|
|
try {
|
|
var k5 = X3(f4);
|
|
if (c4 & 2) {
|
|
var q5 = u4.slice(a5, a5 + b4);
|
|
k5 && k5.Ha.cb && k5.Ha.cb(k5, q5, h5, b4, d5);
|
|
}
|
|
} catch (x5) {
|
|
if ("undefined" == typeof W2 || !(x5 instanceof P4))
|
|
throw x5;
|
|
return -x5.Ka;
|
|
}
|
|
}, n: Mc, q: function() {
|
|
return 2147483648;
|
|
}, d: Nc, c: function(a5) {
|
|
var b4 = u4.length;
|
|
a5 >>>= 0;
|
|
if (2147483648 < a5)
|
|
return false;
|
|
for (var c4 = 1; 4 >= c4; c4 *= 2) {
|
|
var d5 = b4 * (1 + 0.2 / c4);
|
|
d5 = Math.min(d5, a5 + 100663296);
|
|
var f4 = Math;
|
|
d5 = Math.max(
|
|
a5,
|
|
d5
|
|
);
|
|
f4 = f4.min.call(f4, 2147483648, d5 + (65536 - d5 % 65536) % 65536);
|
|
a: {
|
|
try {
|
|
Ja.grow(f4 - Na.byteLength + 65535 >>> 16);
|
|
Ra();
|
|
var h5 = 1;
|
|
break a;
|
|
} catch (k5) {
|
|
}
|
|
h5 = void 0;
|
|
}
|
|
if (h5)
|
|
return true;
|
|
}
|
|
return false;
|
|
}, z: function(a5, b4) {
|
|
var c4 = 0;
|
|
Pc().forEach(function(d5, f4) {
|
|
var h5 = b4 + c4;
|
|
f4 = J2[a5 + 4 * f4 >> 2] = h5;
|
|
for (h5 = 0; h5 < d5.length; ++h5)
|
|
r3[f4++ >> 0] = d5.charCodeAt(h5);
|
|
r3[f4 >> 0] = 0;
|
|
c4 += d5.length + 1;
|
|
});
|
|
return 0;
|
|
}, A: function(a5, b4) {
|
|
var c4 = Pc();
|
|
J2[a5 >> 2] = c4.length;
|
|
var d5 = 0;
|
|
c4.forEach(function(f4) {
|
|
d5 += f4.length + 1;
|
|
});
|
|
J2[b4 >> 2] = d5;
|
|
return 0;
|
|
}, f: function(a5) {
|
|
try {
|
|
var b4 = X3(a5);
|
|
la(b4);
|
|
return 0;
|
|
} catch (c4) {
|
|
if ("undefined" == typeof W2 || !(c4 instanceof P4))
|
|
throw c4;
|
|
return c4.Ka;
|
|
}
|
|
}, m: function(a5, b4) {
|
|
try {
|
|
var c4 = X3(a5);
|
|
r3[b4 >> 0] = c4.tty ? 2 : 16384 === (c4.mode & 61440) ? 3 : 40960 === (c4.mode & 61440) ? 7 : 4;
|
|
return 0;
|
|
} catch (d5) {
|
|
if ("undefined" == typeof W2 || !(d5 instanceof P4))
|
|
throw d5;
|
|
return d5.Ka;
|
|
}
|
|
}, u: function(a5, b4, c4, d5) {
|
|
try {
|
|
a: {
|
|
var f4 = X3(a5);
|
|
a5 = b4;
|
|
for (var h5 = b4 = 0; h5 < c4; h5++) {
|
|
var k5 = J2[a5 >> 2], q5 = J2[a5 + 4 >> 2];
|
|
a5 += 8;
|
|
var x5 = Zb(f4, r3, k5, q5);
|
|
if (0 > x5) {
|
|
var w5 = -1;
|
|
break a;
|
|
}
|
|
b4 += x5;
|
|
if (x5 < q5)
|
|
break;
|
|
}
|
|
w5 = b4;
|
|
}
|
|
J2[d5 >> 2] = w5;
|
|
return 0;
|
|
} catch (A4) {
|
|
if ("undefined" == typeof W2 || !(A4 instanceof P4))
|
|
throw A4;
|
|
return A4.Ka;
|
|
}
|
|
}, k: function(a5, b4, c4, d5, f4) {
|
|
try {
|
|
b4 = c4 + 2097152 >>> 0 < 4194305 - !!b4 ? (b4 >>> 0) + 4294967296 * c4 : NaN;
|
|
if (isNaN(b4))
|
|
return 61;
|
|
var h5 = X3(a5);
|
|
Yb(h5, b4, d5);
|
|
O4 = [h5.position >>> 0, (N3 = h5.position, 1 <= +Math.abs(N3) ? 0 < N3 ? (Math.min(+Math.floor(N3 / 4294967296), 4294967295) | 0) >>> 0 : ~~+Math.ceil((N3 - +(~~N3 >>> 0)) / 4294967296) >>> 0 : 0)];
|
|
F3[f4 >> 2] = O4[0];
|
|
F3[f4 + 4 >> 2] = O4[1];
|
|
h5.hb && 0 === b4 && 0 === d5 && (h5.hb = null);
|
|
return 0;
|
|
} catch (k5) {
|
|
if ("undefined" == typeof W2 || !(k5 instanceof P4))
|
|
throw k5;
|
|
return k5.Ka;
|
|
}
|
|
}, C: function(a5) {
|
|
try {
|
|
var b4 = X3(a5);
|
|
return b4.Ha && b4.Ha.fsync ? b4.Ha.fsync(b4) : 0;
|
|
} catch (c4) {
|
|
if ("undefined" == typeof W2 || !(c4 instanceof P4))
|
|
throw c4;
|
|
return c4.Ka;
|
|
}
|
|
}, r: function(a5, b4, c4, d5) {
|
|
try {
|
|
a: {
|
|
var f4 = X3(a5);
|
|
a5 = b4;
|
|
for (var h5 = b4 = 0; h5 < c4; h5++) {
|
|
var k5 = J2[a5 >> 2], q5 = J2[a5 + 4 >> 2];
|
|
a5 += 8;
|
|
var x5 = ka(f4, r3, k5, q5);
|
|
if (0 > x5) {
|
|
var w5 = -1;
|
|
break a;
|
|
}
|
|
b4 += x5;
|
|
}
|
|
w5 = b4;
|
|
}
|
|
J2[d5 >> 2] = w5;
|
|
return 0;
|
|
} catch (A4) {
|
|
if ("undefined" == typeof W2 || !(A4 instanceof P4))
|
|
throw A4;
|
|
return A4.Ka;
|
|
}
|
|
} };
|
|
(function() {
|
|
function a5(f4) {
|
|
e4.asm = f4.exports;
|
|
Ja = e4.asm.I;
|
|
Ra();
|
|
K3 = e4.asm.Aa;
|
|
Ta.unshift(e4.asm.J);
|
|
Wa--;
|
|
e4.monitorRunDependencies && e4.monitorRunDependencies(Wa);
|
|
0 == Wa && (null !== Xa && (clearInterval(Xa), Xa = null), Ya && (f4 = Ya, Ya = null, f4()));
|
|
}
|
|
function b4(f4) {
|
|
a5(f4.instance);
|
|
}
|
|
function c4(f4) {
|
|
return bb().then(function(h5) {
|
|
return WebAssembly.instantiate(h5, d5);
|
|
}).then(function(h5) {
|
|
return h5;
|
|
}).then(f4, function(h5) {
|
|
Ha("failed to asynchronously prepare wasm: " + h5);
|
|
E3(h5);
|
|
});
|
|
}
|
|
var d5 = { a: Wc };
|
|
Wa++;
|
|
e4.monitorRunDependencies && e4.monitorRunDependencies(Wa);
|
|
if (e4.instantiateWasm)
|
|
try {
|
|
return e4.instantiateWasm(d5, a5);
|
|
} catch (f4) {
|
|
return Ha("Module.instantiateWasm callback failed with error: " + f4), false;
|
|
}
|
|
(function() {
|
|
return Ia || "function" != typeof WebAssembly.instantiateStreaming || Za() || M5.startsWith("file://") || Aa || "function" != typeof fetch ? c4(b4) : fetch(M5, { credentials: "same-origin" }).then(function(f4) {
|
|
return WebAssembly.instantiateStreaming(f4, d5).then(b4, function(h5) {
|
|
Ha("wasm streaming compile failed: " + h5);
|
|
Ha("falling back to ArrayBuffer instantiation");
|
|
return c4(b4);
|
|
});
|
|
});
|
|
})();
|
|
return {};
|
|
})();
|
|
e4.___wasm_call_ctors = function() {
|
|
return (e4.___wasm_call_ctors = e4.asm.J).apply(null, arguments);
|
|
};
|
|
e4._sqlite3_free = function() {
|
|
return (e4._sqlite3_free = e4.asm.K).apply(null, arguments);
|
|
};
|
|
e4._sqlite3_value_double = function() {
|
|
return (e4._sqlite3_value_double = e4.asm.L).apply(null, arguments);
|
|
};
|
|
e4._sqlite3_value_text = function() {
|
|
return (e4._sqlite3_value_text = e4.asm.M).apply(null, arguments);
|
|
};
|
|
var Vc = e4.___errno_location = function() {
|
|
return (Vc = e4.___errno_location = e4.asm.N).apply(null, arguments);
|
|
};
|
|
e4._sqlite3_prepare_v2 = function() {
|
|
return (e4._sqlite3_prepare_v2 = e4.asm.O).apply(null, arguments);
|
|
};
|
|
e4._sqlite3_step = function() {
|
|
return (e4._sqlite3_step = e4.asm.P).apply(null, arguments);
|
|
};
|
|
e4._sqlite3_finalize = function() {
|
|
return (e4._sqlite3_finalize = e4.asm.Q).apply(null, arguments);
|
|
};
|
|
e4._sqlite3_reset = function() {
|
|
return (e4._sqlite3_reset = e4.asm.R).apply(null, arguments);
|
|
};
|
|
e4._sqlite3_value_int = function() {
|
|
return (e4._sqlite3_value_int = e4.asm.S).apply(null, arguments);
|
|
};
|
|
e4._sqlite3_clear_bindings = function() {
|
|
return (e4._sqlite3_clear_bindings = e4.asm.T).apply(null, arguments);
|
|
};
|
|
e4._sqlite3_value_blob = function() {
|
|
return (e4._sqlite3_value_blob = e4.asm.U).apply(null, arguments);
|
|
};
|
|
e4._sqlite3_value_bytes = function() {
|
|
return (e4._sqlite3_value_bytes = e4.asm.V).apply(null, arguments);
|
|
};
|
|
e4._sqlite3_value_type = function() {
|
|
return (e4._sqlite3_value_type = e4.asm.W).apply(null, arguments);
|
|
};
|
|
e4._sqlite3_result_blob = function() {
|
|
return (e4._sqlite3_result_blob = e4.asm.X).apply(null, arguments);
|
|
};
|
|
e4._sqlite3_result_double = function() {
|
|
return (e4._sqlite3_result_double = e4.asm.Y).apply(null, arguments);
|
|
};
|
|
e4._sqlite3_result_error = function() {
|
|
return (e4._sqlite3_result_error = e4.asm.Z).apply(null, arguments);
|
|
};
|
|
e4._sqlite3_result_int = function() {
|
|
return (e4._sqlite3_result_int = e4.asm._).apply(null, arguments);
|
|
};
|
|
e4._sqlite3_result_int64 = function() {
|
|
return (e4._sqlite3_result_int64 = e4.asm.$).apply(null, arguments);
|
|
};
|
|
e4._sqlite3_result_null = function() {
|
|
return (e4._sqlite3_result_null = e4.asm.aa).apply(null, arguments);
|
|
};
|
|
e4._sqlite3_result_text = function() {
|
|
return (e4._sqlite3_result_text = e4.asm.ba).apply(null, arguments);
|
|
};
|
|
e4._sqlite3_sql = function() {
|
|
return (e4._sqlite3_sql = e4.asm.ca).apply(null, arguments);
|
|
};
|
|
e4._sqlite3_aggregate_context = function() {
|
|
return (e4._sqlite3_aggregate_context = e4.asm.da).apply(null, arguments);
|
|
};
|
|
e4._sqlite3_column_count = function() {
|
|
return (e4._sqlite3_column_count = e4.asm.ea).apply(null, arguments);
|
|
};
|
|
e4._sqlite3_data_count = function() {
|
|
return (e4._sqlite3_data_count = e4.asm.fa).apply(null, arguments);
|
|
};
|
|
e4._sqlite3_column_blob = function() {
|
|
return (e4._sqlite3_column_blob = e4.asm.ga).apply(null, arguments);
|
|
};
|
|
e4._sqlite3_column_bytes = function() {
|
|
return (e4._sqlite3_column_bytes = e4.asm.ha).apply(null, arguments);
|
|
};
|
|
e4._sqlite3_column_double = function() {
|
|
return (e4._sqlite3_column_double = e4.asm.ia).apply(null, arguments);
|
|
};
|
|
e4._sqlite3_column_text = function() {
|
|
return (e4._sqlite3_column_text = e4.asm.ja).apply(null, arguments);
|
|
};
|
|
e4._sqlite3_column_type = function() {
|
|
return (e4._sqlite3_column_type = e4.asm.ka).apply(null, arguments);
|
|
};
|
|
e4._sqlite3_column_name = function() {
|
|
return (e4._sqlite3_column_name = e4.asm.la).apply(null, arguments);
|
|
};
|
|
e4._sqlite3_bind_blob = function() {
|
|
return (e4._sqlite3_bind_blob = e4.asm.ma).apply(null, arguments);
|
|
};
|
|
e4._sqlite3_bind_double = function() {
|
|
return (e4._sqlite3_bind_double = e4.asm.na).apply(null, arguments);
|
|
};
|
|
e4._sqlite3_bind_int = function() {
|
|
return (e4._sqlite3_bind_int = e4.asm.oa).apply(null, arguments);
|
|
};
|
|
e4._sqlite3_bind_text = function() {
|
|
return (e4._sqlite3_bind_text = e4.asm.pa).apply(null, arguments);
|
|
};
|
|
e4._sqlite3_bind_parameter_index = function() {
|
|
return (e4._sqlite3_bind_parameter_index = e4.asm.qa).apply(null, arguments);
|
|
};
|
|
e4._sqlite3_normalized_sql = function() {
|
|
return (e4._sqlite3_normalized_sql = e4.asm.ra).apply(null, arguments);
|
|
};
|
|
e4._sqlite3_errmsg = function() {
|
|
return (e4._sqlite3_errmsg = e4.asm.sa).apply(null, arguments);
|
|
};
|
|
e4._sqlite3_exec = function() {
|
|
return (e4._sqlite3_exec = e4.asm.ta).apply(null, arguments);
|
|
};
|
|
e4._sqlite3_changes = function() {
|
|
return (e4._sqlite3_changes = e4.asm.ua).apply(null, arguments);
|
|
};
|
|
e4._sqlite3_close_v2 = function() {
|
|
return (e4._sqlite3_close_v2 = e4.asm.va).apply(null, arguments);
|
|
};
|
|
e4._sqlite3_create_function_v2 = function() {
|
|
return (e4._sqlite3_create_function_v2 = e4.asm.wa).apply(null, arguments);
|
|
};
|
|
e4._sqlite3_open = function() {
|
|
return (e4._sqlite3_open = e4.asm.xa).apply(null, arguments);
|
|
};
|
|
var da = e4._malloc = function() {
|
|
return (da = e4._malloc = e4.asm.ya).apply(null, arguments);
|
|
}, ba = e4._free = function() {
|
|
return (ba = e4._free = e4.asm.za).apply(null, arguments);
|
|
};
|
|
e4._RegisterExtensionFunctions = function() {
|
|
return (e4._RegisterExtensionFunctions = e4.asm.Ba).apply(null, arguments);
|
|
};
|
|
var zb = e4._emscripten_builtin_memalign = function() {
|
|
return (zb = e4._emscripten_builtin_memalign = e4.asm.Ca).apply(null, arguments);
|
|
}, oa = e4.stackSave = function() {
|
|
return (oa = e4.stackSave = e4.asm.Da).apply(null, arguments);
|
|
}, qa = e4.stackRestore = function() {
|
|
return (qa = e4.stackRestore = e4.asm.Ea).apply(null, arguments);
|
|
}, B5 = e4.stackAlloc = function() {
|
|
return (B5 = e4.stackAlloc = e4.asm.Fa).apply(null, arguments);
|
|
};
|
|
e4.UTF8ToString = C3;
|
|
e4.stackAlloc = B5;
|
|
e4.stackSave = oa;
|
|
e4.stackRestore = qa;
|
|
e4.cwrap = function(a5, b4, c4, d5) {
|
|
c4 = c4 || [];
|
|
var f4 = c4.every((h5) => "number" === h5 || "boolean" === h5);
|
|
return "string" !== b4 && f4 && !d5 ? e4["_" + a5] : function() {
|
|
return Uc(a5, b4, c4, arguments);
|
|
};
|
|
};
|
|
var Xc;
|
|
Ya = function Yc() {
|
|
Xc || Zc();
|
|
Xc || (Ya = Yc);
|
|
};
|
|
function Zc() {
|
|
function a5() {
|
|
if (!Xc && (Xc = true, e4.calledRun = true, !Ka)) {
|
|
e4.noFSInit || ac || (ac = true, $b(), e4.stdin = e4.stdin, e4.stdout = e4.stdout, e4.stderr = e4.stderr, e4.stdin ? cc("stdin", e4.stdin) : Sb("/dev/tty", "/dev/stdin"), e4.stdout ? cc("stdout", null, e4.stdout) : Sb("/dev/tty", "/dev/stdout"), e4.stderr ? cc("stderr", null, e4.stderr) : Sb("/dev/tty1", "/dev/stderr"), ja("/dev/stdin", 0), ja("/dev/stdout", 1), ja("/dev/stderr", 1));
|
|
Db = false;
|
|
cb(Ta);
|
|
if (e4.onRuntimeInitialized)
|
|
e4.onRuntimeInitialized();
|
|
if (e4.postRun)
|
|
for ("function" == typeof e4.postRun && (e4.postRun = [e4.postRun]); e4.postRun.length; ) {
|
|
var b4 = e4.postRun.shift();
|
|
Ua.unshift(b4);
|
|
}
|
|
cb(Ua);
|
|
}
|
|
}
|
|
if (!(0 < Wa)) {
|
|
if (e4.preRun)
|
|
for ("function" == typeof e4.preRun && (e4.preRun = [e4.preRun]); e4.preRun.length; )
|
|
Va();
|
|
cb(Sa);
|
|
0 < Wa || (e4.setStatus ? (e4.setStatus("Running..."), setTimeout(function() {
|
|
setTimeout(function() {
|
|
e4.setStatus("");
|
|
}, 1);
|
|
a5();
|
|
}, 1)) : a5());
|
|
}
|
|
}
|
|
if (e4.preInit)
|
|
for ("function" == typeof e4.preInit && (e4.preInit = [e4.preInit]); 0 < e4.preInit.length; )
|
|
e4.preInit.pop()();
|
|
Zc();
|
|
return Module;
|
|
});
|
|
return initSqlJsPromise;
|
|
};
|
|
if (typeof exports === "object" && typeof module2 === "object") {
|
|
module2.exports = initSqlJs2;
|
|
module2.exports.default = initSqlJs2;
|
|
} else if (typeof define === "function" && define["amd"]) {
|
|
define([], function() {
|
|
return initSqlJs2;
|
|
});
|
|
} else if (typeof exports === "object") {
|
|
exports["Module"] = initSqlJs2;
|
|
}
|
|
}
|
|
});
|
|
|
|
// node_modules/obsidian-dataview/lib/index.js
|
|
var require_lib = __commonJS({
|
|
"node_modules/obsidian-dataview/lib/index.js"(exports) {
|
|
"use strict";
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
require("obsidian");
|
|
var getAPI2 = (app2) => {
|
|
var _a2;
|
|
if (app2)
|
|
return (_a2 = app2.plugins.plugins.dataview) === null || _a2 === void 0 ? void 0 : _a2.api;
|
|
else
|
|
return window["DataviewAPI"];
|
|
};
|
|
var isPluginEnabled = (app2) => app2.plugins.enabledPlugins.has("dataview");
|
|
exports.getAPI = getAPI2;
|
|
exports.isPluginEnabled = isPluginEnabled;
|
|
}
|
|
});
|
|
|
|
// src/main.ts
|
|
var main_exports = {};
|
|
__export(main_exports, {
|
|
default: () => MakeMDPlugin
|
|
});
|
|
module.exports = __toCommonJS(main_exports);
|
|
|
|
// src/cm-extensions/flowEditor/atomic.ts
|
|
var import_state6 = require("@codemirror/state");
|
|
|
|
// src/types/types.ts
|
|
var eventTypes = {
|
|
selectedFileChange: "mkmd-selected-file-change",
|
|
activeFileChange: "mkmd-active-file-change",
|
|
refreshView: "mkmd-refresh-view",
|
|
revealFile: "mkmd-reveal-file",
|
|
tagsChange: "mkmd-tags-change",
|
|
vaultChange: "mkmd-vault-change",
|
|
mdbChange: "mkmd-mdb-change",
|
|
spacesChange: "mkmd-spaces-change",
|
|
updateSections: "mkmd-update-sections",
|
|
settingsChanged: "mkmd-settings-changed",
|
|
spawnPortal: "mkmd-portal-spawn",
|
|
loadPortal: "mkmd-portal-load",
|
|
openFilePortal: "mkmd-portal-file",
|
|
focusPortal: "mkmd-portal-focus"
|
|
};
|
|
|
|
// src/dispatch/flowDispatch.ts
|
|
var createFlowEditorInElement = (id2, el, type, file, ref, from, to) => {
|
|
let evt = new CustomEvent(eventTypes.spawnPortal, {
|
|
detail: { id: id2, el, file, from, to, ref, type }
|
|
});
|
|
activeWindow.dispatchEvent(evt);
|
|
};
|
|
var loadFlowEditorByDOM = (el, view, id2) => {
|
|
let evt = new CustomEvent(eventTypes.loadPortal, {
|
|
detail: { id: id2, el, view }
|
|
});
|
|
activeWindow.dispatchEvent(evt);
|
|
};
|
|
var focusFlowEditor = (id2, top) => {
|
|
let evt = new CustomEvent(eventTypes.focusPortal, {
|
|
detail: { id: id2, parent: false, top }
|
|
});
|
|
activeWindow.dispatchEvent(evt);
|
|
};
|
|
var focusFlowEditorParent = (id2, top) => {
|
|
let evt = new CustomEvent(eventTypes.focusPortal, {
|
|
detail: { id: id2, parent: true, top }
|
|
});
|
|
activeWindow.dispatchEvent(evt);
|
|
};
|
|
var openFileFlowEditor = (file, source) => {
|
|
let evt = new CustomEvent(eventTypes.openFilePortal, {
|
|
detail: { file, source }
|
|
});
|
|
activeWindow.dispatchEvent(evt);
|
|
};
|
|
|
|
// src/cm-extensions/markSans/callout.tsx
|
|
var import_language = require("@codemirror/language");
|
|
var import_state = require("@codemirror/state");
|
|
var import_view = require("@codemirror/view");
|
|
|
|
// src/utils/uuid.js
|
|
function genId() {
|
|
return ([1e7] + -1e3 + -4e3 + -8e3 + -1e11).replace(
|
|
/[018]/g,
|
|
(c4) => (c4 ^ crypto.getRandomValues(new Uint8Array(1))[0] & 15 >> c4 / 4).toString(16)
|
|
);
|
|
}
|
|
|
|
// src/cm-extensions/markSans/callout.tsx
|
|
var portalTypeAnnotation = import_state.Annotation.define();
|
|
var flowIDAnnotation = import_state.Annotation.define();
|
|
var flowIDStateField = import_state.StateField.define({
|
|
create: () => void 0,
|
|
update(value, tr) {
|
|
if (tr.annotation(flowIDAnnotation))
|
|
return tr.annotation(flowIDAnnotation);
|
|
return value;
|
|
}
|
|
});
|
|
var flowTypeStateField = import_state.StateField.define({
|
|
create: () => "none",
|
|
update(value, tr) {
|
|
if (tr.annotation(portalTypeAnnotation))
|
|
return tr.annotation(portalTypeAnnotation);
|
|
return value;
|
|
}
|
|
});
|
|
var calloutField = import_state.StateField.define({
|
|
create() {
|
|
return import_view.Decoration.none;
|
|
},
|
|
update(value, tr) {
|
|
if (tr.state.field(flowTypeStateField) != "doc") {
|
|
return value;
|
|
}
|
|
let builder = new import_state.RangeSetBuilder();
|
|
let nodes2 = [];
|
|
(0, import_language.syntaxTree)(tr.state).iterate({
|
|
enter: ({ name, from, to }) => {
|
|
nodes2.push({ name, from, to });
|
|
}
|
|
});
|
|
const nextQuote = (ns, to) => {
|
|
const nq = ns.find(
|
|
(f4) => f4.from == to + 1 && f4.name.contains("HyperMD-quote")
|
|
);
|
|
if (nq) {
|
|
return nextQuote(ns, nq.to);
|
|
}
|
|
return to;
|
|
};
|
|
const previous = value.iter();
|
|
const previousSpecs = [];
|
|
while (previous.value !== null) {
|
|
previousSpecs.push(previous.value.spec.widget.info);
|
|
previous.next();
|
|
}
|
|
let index = 0;
|
|
nodes2.map(({ name, from, to }) => {
|
|
if (name.contains("HyperMD-callout")) {
|
|
const existingCallout = previousSpecs[index];
|
|
const endQuote = nextQuote(nodes2, to);
|
|
const lineStart = tr.state.doc.lineAt(from).number;
|
|
const lineEnd = tr.state.doc.lineAt(endQuote).number;
|
|
if (existingCallout) {
|
|
builder.add(
|
|
from,
|
|
endQuote + 1,
|
|
calloutBlock(
|
|
{ from: lineStart, to: lineEnd },
|
|
tr.state.sliceDoc(from, endQuote),
|
|
existingCallout.id
|
|
)
|
|
);
|
|
} else {
|
|
builder.add(
|
|
from,
|
|
endQuote + 1,
|
|
calloutBlock(
|
|
{ from: lineStart, to: lineEnd },
|
|
tr.state.sliceDoc(from, endQuote),
|
|
genId()
|
|
)
|
|
);
|
|
}
|
|
index++;
|
|
}
|
|
});
|
|
const dec = builder.finish();
|
|
return dec;
|
|
},
|
|
provide: (f4) => import_view.EditorView.decorations.from(f4)
|
|
});
|
|
var CalloutWidget = class extends import_view.WidgetType {
|
|
constructor(info) {
|
|
super();
|
|
this.info = info;
|
|
}
|
|
eq(other) {
|
|
return other.info.id === this.info.id;
|
|
}
|
|
toDOM() {
|
|
const parseTextToCallout = (text2) => {
|
|
if (!this.info.text) {
|
|
return { icon: "", title: "" };
|
|
}
|
|
const stringArray = text2.split("\n");
|
|
const titleRegex = RegExp(/.*\[!(\w*)\]\s(.*)/);
|
|
const title = titleRegex.exec(stringArray[0]);
|
|
if (!title || title.length < 3) {
|
|
return { icon: "", title: "" };
|
|
}
|
|
return {
|
|
icon: title[1],
|
|
title: title[2]
|
|
};
|
|
};
|
|
const callOutData = parseTextToCallout(this.info.text);
|
|
const div = document.createElement("div");
|
|
div.toggleClass("callout", true);
|
|
const divTitle = div.createDiv("div");
|
|
divTitle.toggleClass("callout-title", true);
|
|
const div2 = div.createDiv("div");
|
|
div2.toggleClass("callout-content", true);
|
|
div2.setAttribute("id", "mk-callout-" + this.info.id);
|
|
return div;
|
|
}
|
|
};
|
|
var calloutBlock = (range, text2, id2) => import_view.Decoration.widget({
|
|
widget: new CalloutWidget({ range, text: text2, id: id2 }),
|
|
block: true
|
|
});
|
|
|
|
// src/cm-extensions/flowEditor/flowEditor.tsx
|
|
var import_state5 = require("@codemirror/state");
|
|
var import_view4 = require("@codemirror/view");
|
|
|
|
// src/cm-extensions/tooltip.ts
|
|
var import_view2 = require("@codemirror/view");
|
|
var import_state2 = require("@codemirror/state");
|
|
var ios = typeof navigator != "undefined" && !/Edge\/(\d+)/.exec(navigator.userAgent) && /Apple Computer/.test(navigator.vendor) && (/Mobile\/\w+/.test(navigator.userAgent) || navigator.maxTouchPoints > 2);
|
|
var Outside = "-10000px";
|
|
var TooltipViewManager = class {
|
|
constructor(view, facet, createTooltipView) {
|
|
this.facet = facet;
|
|
this.createTooltipView = createTooltipView;
|
|
this.input = view.state.facet(facet);
|
|
this.tooltips = this.input.filter((t4) => t4);
|
|
this.tooltipViews = this.tooltips.map(createTooltipView);
|
|
}
|
|
update(update) {
|
|
let input = update.state.facet(this.facet);
|
|
let tooltips2 = input.filter((x5) => x5);
|
|
if (input === this.input) {
|
|
for (let t4 of this.tooltipViews)
|
|
if (t4.update)
|
|
t4.update(update);
|
|
return false;
|
|
}
|
|
let tooltipViews = [];
|
|
for (let i4 = 0; i4 < tooltips2.length; i4++) {
|
|
let tip = tooltips2[i4], known = -1;
|
|
if (!tip)
|
|
continue;
|
|
for (let i5 = 0; i5 < this.tooltips.length; i5++) {
|
|
let other = this.tooltips[i5];
|
|
if (other && other.create == tip.create)
|
|
known = i5;
|
|
}
|
|
if (known < 0) {
|
|
tooltipViews[i4] = this.createTooltipView(tip);
|
|
} else {
|
|
let tooltipView = tooltipViews[i4] = this.tooltipViews[known];
|
|
if (tooltipView.update)
|
|
tooltipView.update(update);
|
|
}
|
|
}
|
|
for (let t4 of this.tooltipViews)
|
|
if (tooltipViews.indexOf(t4) < 0)
|
|
t4.dom.remove();
|
|
this.input = input;
|
|
this.tooltips = tooltips2;
|
|
this.tooltipViews = tooltipViews;
|
|
return true;
|
|
}
|
|
};
|
|
function tooltips(config = {}) {
|
|
return tooltipConfig.of(config);
|
|
}
|
|
function windowSpace() {
|
|
return { top: 0, left: 0, bottom: innerHeight, right: innerWidth };
|
|
}
|
|
var tooltipConfig = import_state2.Facet.define({
|
|
combine: (values) => {
|
|
var _a2, _b2, _c2;
|
|
return {
|
|
position: ios ? "absolute" : ((_a2 = values.find((conf) => conf.position)) == null ? void 0 : _a2.position) || "fixed",
|
|
parent: ((_b2 = values.find((conf) => conf.parent)) == null ? void 0 : _b2.parent) || null,
|
|
tooltipSpace: ((_c2 = values.find((conf) => conf.tooltipSpace)) == null ? void 0 : _c2.tooltipSpace) || windowSpace
|
|
};
|
|
}
|
|
});
|
|
var tooltipPlugin = import_view2.ViewPlugin.fromClass(
|
|
class {
|
|
constructor(view) {
|
|
this.view = view;
|
|
this.inView = true;
|
|
this.lastTransaction = 0;
|
|
this.measureTimeout = -1;
|
|
var _a2;
|
|
let config = view.state.facet(tooltipConfig);
|
|
this.position = config.position;
|
|
this.parent = config.parent;
|
|
this.classes = view.themeClasses;
|
|
this.createContainer();
|
|
this.measureReq = {
|
|
read: this.readMeasure.bind(this),
|
|
write: this.writeMeasure.bind(this),
|
|
key: this
|
|
};
|
|
this.manager = new TooltipViewManager(
|
|
view,
|
|
showTooltip,
|
|
(t4) => this.createTooltip(t4)
|
|
);
|
|
this.intersectionObserver = typeof IntersectionObserver == "function" ? new IntersectionObserver(
|
|
(entries) => {
|
|
if (Date.now() > this.lastTransaction - 50 && entries.length > 0 && entries[entries.length - 1].intersectionRatio < 1)
|
|
this.measureSoon();
|
|
},
|
|
{ threshold: [1] }
|
|
) : null;
|
|
this.observeIntersection();
|
|
(_a2 = view.dom.ownerDocument.defaultView) == null ? void 0 : _a2.addEventListener(
|
|
"resize",
|
|
this.measureSoon = this.measureSoon.bind(this)
|
|
);
|
|
this.maybeMeasure();
|
|
}
|
|
createContainer() {
|
|
if (this.parent) {
|
|
this.container = document.createElement("div");
|
|
this.container.style.position = "relative";
|
|
this.container.className = this.view.themeClasses;
|
|
this.parent.appendChild(this.container);
|
|
} else {
|
|
this.container = this.view.dom;
|
|
}
|
|
}
|
|
observeIntersection() {
|
|
if (this.intersectionObserver) {
|
|
this.intersectionObserver.disconnect();
|
|
for (let tooltip of this.manager.tooltipViews)
|
|
this.intersectionObserver.observe(tooltip.dom);
|
|
}
|
|
}
|
|
measureSoon() {
|
|
if (this.measureTimeout < 0)
|
|
this.measureTimeout = setTimeout(() => {
|
|
this.measureTimeout = -1;
|
|
this.maybeMeasure();
|
|
}, 50);
|
|
}
|
|
update(update) {
|
|
if (update.transactions.length)
|
|
this.lastTransaction = Date.now();
|
|
let updated = this.manager.update(update);
|
|
if (updated)
|
|
this.observeIntersection();
|
|
let shouldMeasure = updated || update.geometryChanged;
|
|
let newConfig = update.state.facet(tooltipConfig);
|
|
if (newConfig.position != this.position) {
|
|
this.position = newConfig.position;
|
|
for (let t4 of this.manager.tooltipViews)
|
|
t4.dom.style.position = this.position;
|
|
shouldMeasure = true;
|
|
}
|
|
if (newConfig.parent != this.parent) {
|
|
if (this.parent)
|
|
this.container.remove();
|
|
this.parent = newConfig.parent;
|
|
this.createContainer();
|
|
for (let t4 of this.manager.tooltipViews)
|
|
this.container.appendChild(t4.dom);
|
|
shouldMeasure = true;
|
|
} else if (this.parent && this.view.themeClasses != this.classes) {
|
|
this.classes = this.container.className = this.view.themeClasses;
|
|
}
|
|
if (shouldMeasure)
|
|
this.maybeMeasure();
|
|
}
|
|
createTooltip(tooltip) {
|
|
let tooltipView = tooltip.create(this.view);
|
|
tooltipView.dom.classList.add("cm-tooltip");
|
|
if (tooltip.arrow && !tooltipView.dom.querySelector(".cm-tooltip > .cm-tooltip-arrow")) {
|
|
let arrow = document.createElement("div");
|
|
arrow.className = "cm-tooltip-arrow";
|
|
tooltipView.dom.appendChild(arrow);
|
|
}
|
|
tooltipView.dom.style.position = this.position;
|
|
tooltipView.dom.style.top = Outside;
|
|
this.container.appendChild(tooltipView.dom);
|
|
if (tooltipView.mount)
|
|
tooltipView.mount(this.view);
|
|
return tooltipView;
|
|
}
|
|
destroy() {
|
|
var _a2, _b2;
|
|
(_a2 = this.view.dom.ownerDocument.defaultView) == null ? void 0 : _a2.removeEventListener(
|
|
"resize",
|
|
this.measureSoon
|
|
);
|
|
for (let { dom } of this.manager.tooltipViews)
|
|
dom.remove();
|
|
(_b2 = this.intersectionObserver) == null ? void 0 : _b2.disconnect();
|
|
clearTimeout(this.measureTimeout);
|
|
}
|
|
readMeasure() {
|
|
let editor = this.view.dom.getBoundingClientRect();
|
|
return {
|
|
editor,
|
|
parent: this.parent ? this.container.getBoundingClientRect() : editor,
|
|
pos: this.manager.tooltips.map((t4, i4) => {
|
|
let tv = this.manager.tooltipViews[i4];
|
|
return tv.getCoords ? tv.getCoords(t4.pos) : this.view.coordsAtPos(t4.pos);
|
|
}),
|
|
size: this.manager.tooltipViews.map(
|
|
({ dom }) => dom.getBoundingClientRect()
|
|
),
|
|
space: this.view.state.facet(tooltipConfig).tooltipSpace(this.view)
|
|
};
|
|
}
|
|
writeMeasure(measured) {
|
|
let { editor, space } = measured;
|
|
let others = [];
|
|
for (let i4 = 0; i4 < this.manager.tooltips.length; i4++) {
|
|
let tooltip = this.manager.tooltips[i4], tView = this.manager.tooltipViews[i4], { dom } = tView;
|
|
let pos = measured.pos[i4], size = measured.size[i4];
|
|
if (!pos || pos.bottom <= Math.max(editor.top, space.top) || pos.top >= Math.min(editor.bottom, space.bottom) || pos.right < Math.max(editor.left, space.left) - 0.1 || pos.left > Math.min(editor.right, space.right) + 0.1) {
|
|
dom.style.top = Outside;
|
|
continue;
|
|
}
|
|
let arrow = tooltip.arrow ? tView.dom.querySelector(".cm-tooltip-arrow") : null;
|
|
let arrowHeight = arrow ? 7 /* Size */ : 0;
|
|
let width = size.right - size.left, height = size.bottom - size.top;
|
|
let offset = tView.offset || noOffset, ltr = this.view.textDirection == import_view2.Direction.LTR;
|
|
let left = size.width > space.right - space.left ? ltr ? space.left : space.right - size.width : ltr ? Math.min(
|
|
pos.left - (arrow ? 14 /* Offset */ : 0) + offset.x,
|
|
space.right - width
|
|
) : Math.max(
|
|
space.left,
|
|
pos.left - width + (arrow ? 14 /* Offset */ : 0) - offset.x
|
|
);
|
|
let above = !!tooltip.above;
|
|
if (!tooltip.strictSide && (above ? pos.top - (size.bottom - size.top) - offset.y < space.top : pos.bottom + (size.bottom - size.top) + offset.y > space.bottom) && above == space.bottom - pos.bottom > pos.top - space.top)
|
|
above = !above;
|
|
let top = above ? pos.top - height - arrowHeight - offset.y : pos.bottom + arrowHeight + offset.y;
|
|
let right = left + width;
|
|
if (tView.overlap !== true) {
|
|
for (let r3 of others)
|
|
if (r3.left < right && r3.right > left && r3.top < top + height && r3.bottom > top)
|
|
top = above ? r3.top - height - 2 - arrowHeight : r3.bottom + arrowHeight + 2;
|
|
}
|
|
if (this.position == "absolute") {
|
|
dom.style.top = top - measured.parent.top + "px";
|
|
dom.style.left = left - measured.parent.left + "px";
|
|
} else {
|
|
dom.style.top = top + "px";
|
|
dom.style.left = left + "px";
|
|
}
|
|
if (arrow)
|
|
arrow.style.left = `${pos.left + (ltr ? offset.x : -offset.x) - (left + 14 /* Offset */ - 7 /* Size */)}px`;
|
|
if (tView.overlap !== true)
|
|
others.push({ left, top, right, bottom: top + height });
|
|
dom.classList.toggle("cm-tooltip-above", above);
|
|
dom.classList.toggle("cm-tooltip-below", !above);
|
|
if (tView.positioned)
|
|
tView.positioned();
|
|
}
|
|
}
|
|
maybeMeasure() {
|
|
if (this.manager.tooltips.length) {
|
|
if (this.view.inView)
|
|
this.view.requestMeasure(this.measureReq);
|
|
if (this.inView != this.view.inView) {
|
|
this.inView = this.view.inView;
|
|
if (!this.inView)
|
|
for (let tv of this.manager.tooltipViews)
|
|
tv.dom.style.top = Outside;
|
|
}
|
|
}
|
|
}
|
|
},
|
|
{
|
|
eventHandlers: {
|
|
scroll() {
|
|
this.maybeMeasure();
|
|
}
|
|
}
|
|
}
|
|
);
|
|
var baseTheme = import_view2.EditorView.baseTheme({
|
|
".cm-tooltip": {
|
|
zIndex: 100
|
|
},
|
|
"&light .cm-tooltip": {
|
|
border: "1px solid #bbb",
|
|
backgroundColor: "#f5f5f5"
|
|
},
|
|
"&light .cm-tooltip-section:not(:first-child)": {
|
|
borderTop: "1px solid #bbb"
|
|
},
|
|
"&dark .cm-tooltip": {
|
|
backgroundColor: "#333338",
|
|
color: "white"
|
|
},
|
|
".cm-tooltip-arrow": {
|
|
height: `${7 /* Size */}px`,
|
|
width: `${7 /* Size */ * 2}px`,
|
|
position: "absolute",
|
|
zIndex: -1,
|
|
overflow: "hidden",
|
|
"&:before, &:after": {
|
|
content: "''",
|
|
position: "absolute",
|
|
width: 0,
|
|
height: 0,
|
|
borderLeft: `${7 /* Size */}px solid transparent`,
|
|
borderRight: `${7 /* Size */}px solid transparent`
|
|
},
|
|
".cm-tooltip-above &": {
|
|
bottom: `-${7 /* Size */}px`,
|
|
"&:before": {
|
|
borderTop: `${7 /* Size */}px solid #bbb`
|
|
},
|
|
"&:after": {
|
|
borderTop: `${7 /* Size */}px solid #f5f5f5`,
|
|
bottom: "1px"
|
|
}
|
|
},
|
|
".cm-tooltip-below &": {
|
|
top: `-${7 /* Size */}px`,
|
|
"&:before": {
|
|
borderBottom: `${7 /* Size */}px solid #bbb`
|
|
},
|
|
"&:after": {
|
|
borderBottom: `${7 /* Size */}px solid #f5f5f5`,
|
|
top: "1px"
|
|
}
|
|
}
|
|
},
|
|
"&dark .cm-tooltip .cm-tooltip-arrow": {
|
|
"&:before": {
|
|
borderTopColor: "#333338",
|
|
borderBottomColor: "#333338"
|
|
},
|
|
"&:after": {
|
|
borderTopColor: "transparent",
|
|
borderBottomColor: "transparent"
|
|
}
|
|
}
|
|
});
|
|
var noOffset = { x: 0, y: 0 };
|
|
var showTooltip = import_state2.Facet.define({
|
|
enables: [tooltipPlugin, baseTheme]
|
|
});
|
|
var showHoverTooltip = import_state2.Facet.define();
|
|
var HoverTooltipHost = class {
|
|
constructor(view) {
|
|
this.view = view;
|
|
this.mounted = false;
|
|
this.dom = document.createElement("div");
|
|
this.dom.classList.add("cm-tooltip-hover");
|
|
this.manager = new TooltipViewManager(
|
|
view,
|
|
showHoverTooltip,
|
|
(t4) => this.createHostedView(t4)
|
|
);
|
|
}
|
|
static create(view) {
|
|
return new HoverTooltipHost(view);
|
|
}
|
|
createHostedView(tooltip) {
|
|
let hostedView = tooltip.create(this.view);
|
|
hostedView.dom.classList.add("cm-tooltip-section");
|
|
this.dom.appendChild(hostedView.dom);
|
|
if (this.mounted && hostedView.mount)
|
|
hostedView.mount(this.view);
|
|
return hostedView;
|
|
}
|
|
mount(view) {
|
|
for (let hostedView of this.manager.tooltipViews) {
|
|
if (hostedView.mount)
|
|
hostedView.mount(view);
|
|
}
|
|
this.mounted = true;
|
|
}
|
|
positioned() {
|
|
for (let hostedView of this.manager.tooltipViews) {
|
|
if (hostedView.positioned)
|
|
hostedView.positioned();
|
|
}
|
|
}
|
|
update(update) {
|
|
this.manager.update(update);
|
|
}
|
|
};
|
|
var showHoverTooltipHost = showTooltip.compute(
|
|
[showHoverTooltip],
|
|
(state) => {
|
|
let tooltips2 = state.facet(showHoverTooltip).filter((t4) => t4);
|
|
if (tooltips2.length === 0)
|
|
return null;
|
|
return {
|
|
pos: Math.min(...tooltips2.map((t4) => t4.pos)),
|
|
end: Math.max(
|
|
...tooltips2.filter((t4) => t4.end != null).map((t4) => t4.end)
|
|
),
|
|
create: HoverTooltipHost.create,
|
|
above: tooltips2[0].above,
|
|
arrow: tooltips2.some((t4) => t4.arrow)
|
|
};
|
|
}
|
|
);
|
|
var HoverPlugin = class {
|
|
constructor(view, source, field, setHover, hoverTime) {
|
|
this.view = view;
|
|
this.source = source;
|
|
this.field = field;
|
|
this.setHover = setHover;
|
|
this.hoverTime = hoverTime;
|
|
this.hoverTimeout = -1;
|
|
this.restartTimeout = -1;
|
|
this.pending = null;
|
|
this.lastMove = { x: 0, y: 0, target: view.dom, time: 0 };
|
|
this.checkHover = this.checkHover.bind(this);
|
|
view.dom.addEventListener(
|
|
"mouseleave",
|
|
this.mouseleave = this.mouseleave.bind(this)
|
|
);
|
|
view.dom.addEventListener(
|
|
"mousemove",
|
|
this.mousemove = this.mousemove.bind(this)
|
|
);
|
|
}
|
|
update() {
|
|
if (this.pending) {
|
|
this.pending = null;
|
|
clearTimeout(this.restartTimeout);
|
|
this.restartTimeout = setTimeout(() => this.startHover(), 20);
|
|
}
|
|
}
|
|
get active() {
|
|
return this.view.state.field(this.field);
|
|
}
|
|
checkHover() {
|
|
this.hoverTimeout = -1;
|
|
if (this.active)
|
|
return;
|
|
let hovered = Date.now() - this.lastMove.time;
|
|
if (hovered < this.hoverTime)
|
|
this.hoverTimeout = setTimeout(this.checkHover, this.hoverTime - hovered);
|
|
else
|
|
this.startHover();
|
|
}
|
|
startHover() {
|
|
clearTimeout(this.restartTimeout);
|
|
let { lastMove } = this;
|
|
let pos = this.view.contentDOM.contains(lastMove.target) ? this.view.posAtCoords(lastMove) : null;
|
|
if (pos == null)
|
|
return;
|
|
let posCoords = this.view.coordsAtPos(pos);
|
|
if (posCoords == null || lastMove.y < posCoords.top || lastMove.y > posCoords.bottom || lastMove.x < posCoords.left - this.view.defaultCharacterWidth || lastMove.x > posCoords.right + this.view.defaultCharacterWidth)
|
|
return;
|
|
let bidi = this.view.bidiSpans(this.view.state.doc.lineAt(pos)).find((s5) => s5.from <= pos && s5.to >= pos);
|
|
let rtl = bidi && bidi.dir == import_view2.Direction.RTL ? -1 : 1;
|
|
let open = this.source(
|
|
this.view,
|
|
pos,
|
|
lastMove.x < posCoords.left ? -rtl : rtl
|
|
);
|
|
if (open == null ? void 0 : open.then) {
|
|
let pending = this.pending = { pos };
|
|
open.then(
|
|
(result) => {
|
|
if (this.pending == pending) {
|
|
this.pending = null;
|
|
if (result)
|
|
this.view.dispatch({ effects: this.setHover.of(result) });
|
|
}
|
|
},
|
|
(e4) => (0, import_view2.logException)(this.view.state, e4, "hover tooltip")
|
|
);
|
|
} else if (open) {
|
|
this.view.dispatch({ effects: this.setHover.of(open) });
|
|
}
|
|
}
|
|
mousemove(event) {
|
|
var _a2;
|
|
this.lastMove = {
|
|
x: event.clientX,
|
|
y: event.clientY,
|
|
target: event.target,
|
|
time: Date.now()
|
|
};
|
|
if (this.hoverTimeout < 0)
|
|
this.hoverTimeout = setTimeout(this.checkHover, this.hoverTime);
|
|
let tooltip = this.active;
|
|
if (tooltip && !isInTooltip(this.lastMove.target) || this.pending) {
|
|
let { pos } = tooltip || this.pending, end = (_a2 = tooltip == null ? void 0 : tooltip.end) != null ? _a2 : pos;
|
|
if (pos == end ? this.view.posAtCoords(this.lastMove) != pos : !isOverRange(
|
|
this.view,
|
|
pos,
|
|
end,
|
|
event.clientX,
|
|
event.clientY,
|
|
6 /* MaxDist */
|
|
)) {
|
|
this.view.dispatch({ effects: this.setHover.of(null) });
|
|
this.pending = null;
|
|
}
|
|
}
|
|
}
|
|
mouseleave(e4) {
|
|
clearTimeout(this.hoverTimeout);
|
|
this.hoverTimeout = -1;
|
|
if (this.active && !isInTooltip(e4.relatedTarget))
|
|
this.view.dispatch({ effects: this.setHover.of(null) });
|
|
}
|
|
destroy() {
|
|
clearTimeout(this.hoverTimeout);
|
|
this.view.dom.removeEventListener("mouseleave", this.mouseleave);
|
|
this.view.dom.removeEventListener("mousemove", this.mousemove);
|
|
}
|
|
};
|
|
function isInTooltip(elt) {
|
|
for (let cur = elt; cur; cur = cur.parentNode)
|
|
if (cur.nodeType == 1 && cur.classList.contains("cm-tooltip"))
|
|
return true;
|
|
return false;
|
|
}
|
|
function isOverRange(view, from, to, x5, y5, margin) {
|
|
let range = document.createRange();
|
|
let fromDOM = view.domAtPos(from), toDOM = view.domAtPos(to);
|
|
range.setEnd(toDOM.node, toDOM.offset);
|
|
range.setStart(fromDOM.node, fromDOM.offset);
|
|
let rects = range.getClientRects();
|
|
range.detach();
|
|
for (let i4 = 0; i4 < rects.length; i4++) {
|
|
let rect = rects[i4];
|
|
let dist = Math.max(
|
|
rect.top - y5,
|
|
y5 - rect.bottom,
|
|
rect.left - x5,
|
|
x5 - rect.right
|
|
);
|
|
if (dist <= margin)
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
function hoverTooltip(source, options = {}) {
|
|
let setHover = import_state2.StateEffect.define();
|
|
let hoverState = import_state2.StateField.define({
|
|
create() {
|
|
return null;
|
|
},
|
|
update(value, tr) {
|
|
if (value && options.hideOnChange && (tr.docChanged || tr.selection))
|
|
return null;
|
|
for (let effect of tr.effects) {
|
|
if (effect.is(setHover)) {
|
|
return effect.value;
|
|
}
|
|
if (effect.is(closeHoverTooltipEffect))
|
|
return null;
|
|
}
|
|
if (value && tr.docChanged) {
|
|
let newPos = tr.changes.mapPos(value.pos, -1, import_state2.MapMode.TrackDel);
|
|
if (newPos == null)
|
|
return null;
|
|
let copy = Object.assign(/* @__PURE__ */ Object.create(null), value);
|
|
copy.pos = newPos;
|
|
if (value.end != null)
|
|
copy.end = tr.changes.mapPos(value.end);
|
|
return copy;
|
|
}
|
|
return value;
|
|
},
|
|
provide: (f4) => showHoverTooltip.from(f4)
|
|
});
|
|
return [
|
|
hoverState,
|
|
import_view2.ViewPlugin.define(
|
|
(view) => new HoverPlugin(
|
|
view,
|
|
source,
|
|
hoverState,
|
|
setHover,
|
|
options.hoverTime || 300 /* Time */
|
|
)
|
|
),
|
|
showHoverTooltipHost
|
|
];
|
|
}
|
|
var closeHoverTooltipEffect = import_state2.StateEffect.define();
|
|
var closeHoverTooltips = closeHoverTooltipEffect.of(null);
|
|
|
|
// node_modules/preact/dist/preact.module.js
|
|
var n;
|
|
var l;
|
|
var u;
|
|
var i;
|
|
var t;
|
|
var o;
|
|
var r;
|
|
var f = {};
|
|
var e = [];
|
|
var c = /acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord|itera/i;
|
|
function s(n2, l3) {
|
|
for (var u4 in l3)
|
|
n2[u4] = l3[u4];
|
|
return n2;
|
|
}
|
|
function a(n2) {
|
|
var l3 = n2.parentNode;
|
|
l3 && l3.removeChild(n2);
|
|
}
|
|
function h(l3, u4, i4) {
|
|
var t4, o3, r3, f4 = {};
|
|
for (r3 in u4)
|
|
"key" == r3 ? t4 = u4[r3] : "ref" == r3 ? o3 = u4[r3] : f4[r3] = u4[r3];
|
|
if (arguments.length > 2 && (f4.children = arguments.length > 3 ? n.call(arguments, 2) : i4), "function" == typeof l3 && null != l3.defaultProps)
|
|
for (r3 in l3.defaultProps)
|
|
void 0 === f4[r3] && (f4[r3] = l3.defaultProps[r3]);
|
|
return v(l3, f4, t4, o3, null);
|
|
}
|
|
function v(n2, i4, t4, o3, r3) {
|
|
var f4 = { type: n2, props: i4, key: t4, ref: o3, __k: null, __: null, __b: 0, __e: null, __d: void 0, __c: null, __h: null, constructor: void 0, __v: null == r3 ? ++u : r3 };
|
|
return null == r3 && null != l.vnode && l.vnode(f4), f4;
|
|
}
|
|
function y() {
|
|
return { current: null };
|
|
}
|
|
function p(n2) {
|
|
return n2.children;
|
|
}
|
|
function d(n2, l3) {
|
|
this.props = n2, this.context = l3;
|
|
}
|
|
function _(n2, l3) {
|
|
if (null == l3)
|
|
return n2.__ ? _(n2.__, n2.__.__k.indexOf(n2) + 1) : null;
|
|
for (var u4; l3 < n2.__k.length; l3++)
|
|
if (null != (u4 = n2.__k[l3]) && null != u4.__e)
|
|
return u4.__e;
|
|
return "function" == typeof n2.type ? _(n2) : null;
|
|
}
|
|
function k(n2) {
|
|
var l3, u4;
|
|
if (null != (n2 = n2.__) && null != n2.__c) {
|
|
for (n2.__e = n2.__c.base = null, l3 = 0; l3 < n2.__k.length; l3++)
|
|
if (null != (u4 = n2.__k[l3]) && null != u4.__e) {
|
|
n2.__e = n2.__c.base = u4.__e;
|
|
break;
|
|
}
|
|
return k(n2);
|
|
}
|
|
}
|
|
function b(n2) {
|
|
(!n2.__d && (n2.__d = true) && t.push(n2) && !g.__r++ || o !== l.debounceRendering) && ((o = l.debounceRendering) || setTimeout)(g);
|
|
}
|
|
function g() {
|
|
for (var n2; g.__r = t.length; )
|
|
n2 = t.sort(function(n3, l3) {
|
|
return n3.__v.__b - l3.__v.__b;
|
|
}), t = [], n2.some(function(n3) {
|
|
var l3, u4, i4, t4, o3, r3;
|
|
n3.__d && (o3 = (t4 = (l3 = n3).__v).__e, (r3 = l3.__P) && (u4 = [], (i4 = s({}, t4)).__v = t4.__v + 1, j(r3, t4, i4, l3.__n, void 0 !== r3.ownerSVGElement, null != t4.__h ? [o3] : null, u4, null == o3 ? _(t4) : o3, t4.__h), z(u4, t4), t4.__e != o3 && k(t4)));
|
|
});
|
|
}
|
|
function w(n2, l3, u4, i4, t4, o3, r3, c4, s5, a5) {
|
|
var h5, y5, d5, k5, b4, g4, w5, x5 = i4 && i4.__k || e, C3 = x5.length;
|
|
for (u4.__k = [], h5 = 0; h5 < l3.length; h5++)
|
|
if (null != (k5 = u4.__k[h5] = null == (k5 = l3[h5]) || "boolean" == typeof k5 ? null : "string" == typeof k5 || "number" == typeof k5 || "bigint" == typeof k5 ? v(null, k5, null, null, k5) : Array.isArray(k5) ? v(p, { children: k5 }, null, null, null) : k5.__b > 0 ? v(k5.type, k5.props, k5.key, k5.ref ? k5.ref : null, k5.__v) : k5)) {
|
|
if (k5.__ = u4, k5.__b = u4.__b + 1, null === (d5 = x5[h5]) || d5 && k5.key == d5.key && k5.type === d5.type)
|
|
x5[h5] = void 0;
|
|
else
|
|
for (y5 = 0; y5 < C3; y5++) {
|
|
if ((d5 = x5[y5]) && k5.key == d5.key && k5.type === d5.type) {
|
|
x5[y5] = void 0;
|
|
break;
|
|
}
|
|
d5 = null;
|
|
}
|
|
j(n2, k5, d5 = d5 || f, t4, o3, r3, c4, s5, a5), b4 = k5.__e, (y5 = k5.ref) && d5.ref != y5 && (w5 || (w5 = []), d5.ref && w5.push(d5.ref, null, k5), w5.push(y5, k5.__c || b4, k5)), null != b4 ? (null == g4 && (g4 = b4), "function" == typeof k5.type && k5.__k === d5.__k ? k5.__d = s5 = m(k5, s5, n2) : s5 = A(n2, k5, d5, x5, b4, s5), "function" == typeof u4.type && (u4.__d = s5)) : s5 && d5.__e == s5 && s5.parentNode != n2 && (s5 = _(d5));
|
|
}
|
|
for (u4.__e = g4, h5 = C3; h5--; )
|
|
null != x5[h5] && N(x5[h5], x5[h5]);
|
|
if (w5)
|
|
for (h5 = 0; h5 < w5.length; h5++)
|
|
M(w5[h5], w5[++h5], w5[++h5]);
|
|
}
|
|
function m(n2, l3, u4) {
|
|
for (var i4, t4 = n2.__k, o3 = 0; t4 && o3 < t4.length; o3++)
|
|
(i4 = t4[o3]) && (i4.__ = n2, l3 = "function" == typeof i4.type ? m(i4, l3, u4) : A(u4, i4, i4, t4, i4.__e, l3));
|
|
return l3;
|
|
}
|
|
function x(n2, l3) {
|
|
return l3 = l3 || [], null == n2 || "boolean" == typeof n2 || (Array.isArray(n2) ? n2.some(function(n3) {
|
|
x(n3, l3);
|
|
}) : l3.push(n2)), l3;
|
|
}
|
|
function A(n2, l3, u4, i4, t4, o3) {
|
|
var r3, f4, e4;
|
|
if (void 0 !== l3.__d)
|
|
r3 = l3.__d, l3.__d = void 0;
|
|
else if (null == u4 || t4 != o3 || null == t4.parentNode)
|
|
n:
|
|
if (null == o3 || o3.parentNode !== n2)
|
|
n2.appendChild(t4), r3 = null;
|
|
else {
|
|
for (f4 = o3, e4 = 0; (f4 = f4.nextSibling) && e4 < i4.length; e4 += 1)
|
|
if (f4 == t4)
|
|
break n;
|
|
n2.insertBefore(t4, o3), r3 = o3;
|
|
}
|
|
return void 0 !== r3 ? r3 : t4.nextSibling;
|
|
}
|
|
function C(n2, l3, u4, i4, t4) {
|
|
var o3;
|
|
for (o3 in u4)
|
|
"children" === o3 || "key" === o3 || o3 in l3 || H(n2, o3, null, u4[o3], i4);
|
|
for (o3 in l3)
|
|
t4 && "function" != typeof l3[o3] || "children" === o3 || "key" === o3 || "value" === o3 || "checked" === o3 || u4[o3] === l3[o3] || H(n2, o3, l3[o3], u4[o3], i4);
|
|
}
|
|
function $(n2, l3, u4) {
|
|
"-" === l3[0] ? n2.setProperty(l3, u4) : n2[l3] = null == u4 ? "" : "number" != typeof u4 || c.test(l3) ? u4 : u4 + "px";
|
|
}
|
|
function H(n2, l3, u4, i4, t4) {
|
|
var o3;
|
|
n:
|
|
if ("style" === l3)
|
|
if ("string" == typeof u4)
|
|
n2.style.cssText = u4;
|
|
else {
|
|
if ("string" == typeof i4 && (n2.style.cssText = i4 = ""), i4)
|
|
for (l3 in i4)
|
|
u4 && l3 in u4 || $(n2.style, l3, "");
|
|
if (u4)
|
|
for (l3 in u4)
|
|
i4 && u4[l3] === i4[l3] || $(n2.style, l3, u4[l3]);
|
|
}
|
|
else if ("o" === l3[0] && "n" === l3[1])
|
|
o3 = l3 !== (l3 = l3.replace(/Capture$/, "")), l3 = l3.toLowerCase() in n2 ? l3.toLowerCase().slice(2) : l3.slice(2), n2.l || (n2.l = {}), n2.l[l3 + o3] = u4, u4 ? i4 || n2.addEventListener(l3, o3 ? T : I, o3) : n2.removeEventListener(l3, o3 ? T : I, o3);
|
|
else if ("dangerouslySetInnerHTML" !== l3) {
|
|
if (t4)
|
|
l3 = l3.replace(/xlink(H|:h)/, "h").replace(/sName$/, "s");
|
|
else if ("href" !== l3 && "list" !== l3 && "form" !== l3 && "tabIndex" !== l3 && "download" !== l3 && l3 in n2)
|
|
try {
|
|
n2[l3] = null == u4 ? "" : u4;
|
|
break n;
|
|
} catch (n3) {
|
|
}
|
|
"function" == typeof u4 || (null == u4 || false === u4 && -1 == l3.indexOf("-") ? n2.removeAttribute(l3) : n2.setAttribute(l3, u4));
|
|
}
|
|
}
|
|
function I(n2) {
|
|
this.l[n2.type + false](l.event ? l.event(n2) : n2);
|
|
}
|
|
function T(n2) {
|
|
this.l[n2.type + true](l.event ? l.event(n2) : n2);
|
|
}
|
|
function j(n2, u4, i4, t4, o3, r3, f4, e4, c4) {
|
|
var a5, h5, v3, y5, _5, k5, b4, g4, m5, x5, A4, C3, $3, H5, I4, T6 = u4.type;
|
|
if (void 0 !== u4.constructor)
|
|
return null;
|
|
null != i4.__h && (c4 = i4.__h, e4 = u4.__e = i4.__e, u4.__h = null, r3 = [e4]), (a5 = l.__b) && a5(u4);
|
|
try {
|
|
n:
|
|
if ("function" == typeof T6) {
|
|
if (g4 = u4.props, m5 = (a5 = T6.contextType) && t4[a5.__c], x5 = a5 ? m5 ? m5.props.value : a5.__ : t4, i4.__c ? b4 = (h5 = u4.__c = i4.__c).__ = h5.__E : ("prototype" in T6 && T6.prototype.render ? u4.__c = h5 = new T6(g4, x5) : (u4.__c = h5 = new d(g4, x5), h5.constructor = T6, h5.render = O), m5 && m5.sub(h5), h5.props = g4, h5.state || (h5.state = {}), h5.context = x5, h5.__n = t4, v3 = h5.__d = true, h5.__h = [], h5._sb = []), null == h5.__s && (h5.__s = h5.state), null != T6.getDerivedStateFromProps && (h5.__s == h5.state && (h5.__s = s({}, h5.__s)), s(h5.__s, T6.getDerivedStateFromProps(g4, h5.__s))), y5 = h5.props, _5 = h5.state, v3)
|
|
null == T6.getDerivedStateFromProps && null != h5.componentWillMount && h5.componentWillMount(), null != h5.componentDidMount && h5.__h.push(h5.componentDidMount);
|
|
else {
|
|
if (null == T6.getDerivedStateFromProps && g4 !== y5 && null != h5.componentWillReceiveProps && h5.componentWillReceiveProps(g4, x5), !h5.__e && null != h5.shouldComponentUpdate && false === h5.shouldComponentUpdate(g4, h5.__s, x5) || u4.__v === i4.__v) {
|
|
for (h5.props = g4, h5.state = h5.__s, u4.__v !== i4.__v && (h5.__d = false), h5.__v = u4, u4.__e = i4.__e, u4.__k = i4.__k, u4.__k.forEach(function(n3) {
|
|
n3 && (n3.__ = u4);
|
|
}), A4 = 0; A4 < h5._sb.length; A4++)
|
|
h5.__h.push(h5._sb[A4]);
|
|
h5._sb = [], h5.__h.length && f4.push(h5);
|
|
break n;
|
|
}
|
|
null != h5.componentWillUpdate && h5.componentWillUpdate(g4, h5.__s, x5), null != h5.componentDidUpdate && h5.__h.push(function() {
|
|
h5.componentDidUpdate(y5, _5, k5);
|
|
});
|
|
}
|
|
if (h5.context = x5, h5.props = g4, h5.__v = u4, h5.__P = n2, C3 = l.__r, $3 = 0, "prototype" in T6 && T6.prototype.render) {
|
|
for (h5.state = h5.__s, h5.__d = false, C3 && C3(u4), a5 = h5.render(h5.props, h5.state, h5.context), H5 = 0; H5 < h5._sb.length; H5++)
|
|
h5.__h.push(h5._sb[H5]);
|
|
h5._sb = [];
|
|
} else
|
|
do {
|
|
h5.__d = false, C3 && C3(u4), a5 = h5.render(h5.props, h5.state, h5.context), h5.state = h5.__s;
|
|
} while (h5.__d && ++$3 < 25);
|
|
h5.state = h5.__s, null != h5.getChildContext && (t4 = s(s({}, t4), h5.getChildContext())), v3 || null == h5.getSnapshotBeforeUpdate || (k5 = h5.getSnapshotBeforeUpdate(y5, _5)), I4 = null != a5 && a5.type === p && null == a5.key ? a5.props.children : a5, w(n2, Array.isArray(I4) ? I4 : [I4], u4, i4, t4, o3, r3, f4, e4, c4), h5.base = u4.__e, u4.__h = null, h5.__h.length && f4.push(h5), b4 && (h5.__E = h5.__ = null), h5.__e = false;
|
|
} else
|
|
null == r3 && u4.__v === i4.__v ? (u4.__k = i4.__k, u4.__e = i4.__e) : u4.__e = L(i4.__e, u4, i4, t4, o3, r3, f4, c4);
|
|
(a5 = l.diffed) && a5(u4);
|
|
} catch (n3) {
|
|
u4.__v = null, (c4 || null != r3) && (u4.__e = e4, u4.__h = !!c4, r3[r3.indexOf(e4)] = null), l.__e(n3, u4, i4);
|
|
}
|
|
}
|
|
function z(n2, u4) {
|
|
l.__c && l.__c(u4, n2), n2.some(function(u5) {
|
|
try {
|
|
n2 = u5.__h, u5.__h = [], n2.some(function(n3) {
|
|
n3.call(u5);
|
|
});
|
|
} catch (n3) {
|
|
l.__e(n3, u5.__v);
|
|
}
|
|
});
|
|
}
|
|
function L(l3, u4, i4, t4, o3, r3, e4, c4) {
|
|
var s5, h5, v3, y5 = i4.props, p3 = u4.props, d5 = u4.type, k5 = 0;
|
|
if ("svg" === d5 && (o3 = true), null != r3) {
|
|
for (; k5 < r3.length; k5++)
|
|
if ((s5 = r3[k5]) && "setAttribute" in s5 == !!d5 && (d5 ? s5.localName === d5 : 3 === s5.nodeType)) {
|
|
l3 = s5, r3[k5] = null;
|
|
break;
|
|
}
|
|
}
|
|
if (null == l3) {
|
|
if (null === d5)
|
|
return document.createTextNode(p3);
|
|
l3 = o3 ? document.createElementNS("http://www.w3.org/2000/svg", d5) : document.createElement(d5, p3.is && p3), r3 = null, c4 = false;
|
|
}
|
|
if (null === d5)
|
|
y5 === p3 || c4 && l3.data === p3 || (l3.data = p3);
|
|
else {
|
|
if (r3 = r3 && n.call(l3.childNodes), h5 = (y5 = i4.props || f).dangerouslySetInnerHTML, v3 = p3.dangerouslySetInnerHTML, !c4) {
|
|
if (null != r3)
|
|
for (y5 = {}, k5 = 0; k5 < l3.attributes.length; k5++)
|
|
y5[l3.attributes[k5].name] = l3.attributes[k5].value;
|
|
(v3 || h5) && (v3 && (h5 && v3.__html == h5.__html || v3.__html === l3.innerHTML) || (l3.innerHTML = v3 && v3.__html || ""));
|
|
}
|
|
if (C(l3, p3, y5, o3, c4), v3)
|
|
u4.__k = [];
|
|
else if (k5 = u4.props.children, w(l3, Array.isArray(k5) ? k5 : [k5], u4, i4, t4, o3 && "foreignObject" !== d5, r3, e4, r3 ? r3[0] : i4.__k && _(i4, 0), c4), null != r3)
|
|
for (k5 = r3.length; k5--; )
|
|
null != r3[k5] && a(r3[k5]);
|
|
c4 || ("value" in p3 && void 0 !== (k5 = p3.value) && (k5 !== l3.value || "progress" === d5 && !k5 || "option" === d5 && k5 !== y5.value) && H(l3, "value", k5, y5.value, false), "checked" in p3 && void 0 !== (k5 = p3.checked) && k5 !== l3.checked && H(l3, "checked", k5, y5.checked, false));
|
|
}
|
|
return l3;
|
|
}
|
|
function M(n2, u4, i4) {
|
|
try {
|
|
"function" == typeof n2 ? n2(u4) : n2.current = u4;
|
|
} catch (n3) {
|
|
l.__e(n3, i4);
|
|
}
|
|
}
|
|
function N(n2, u4, i4) {
|
|
var t4, o3;
|
|
if (l.unmount && l.unmount(n2), (t4 = n2.ref) && (t4.current && t4.current !== n2.__e || M(t4, null, u4)), null != (t4 = n2.__c)) {
|
|
if (t4.componentWillUnmount)
|
|
try {
|
|
t4.componentWillUnmount();
|
|
} catch (n3) {
|
|
l.__e(n3, u4);
|
|
}
|
|
t4.base = t4.__P = null, n2.__c = void 0;
|
|
}
|
|
if (t4 = n2.__k)
|
|
for (o3 = 0; o3 < t4.length; o3++)
|
|
t4[o3] && N(t4[o3], u4, i4 || "function" != typeof n2.type);
|
|
i4 || null == n2.__e || a(n2.__e), n2.__ = n2.__e = n2.__d = void 0;
|
|
}
|
|
function O(n2, l3, u4) {
|
|
return this.constructor(n2, u4);
|
|
}
|
|
function P(u4, i4, t4) {
|
|
var o3, r3, e4;
|
|
l.__ && l.__(u4, i4), r3 = (o3 = "function" == typeof t4) ? null : t4 && t4.__k || i4.__k, e4 = [], j(i4, u4 = (!o3 && t4 || i4).__k = h(p, null, [u4]), r3 || f, f, void 0 !== i4.ownerSVGElement, !o3 && t4 ? [t4] : r3 ? null : i4.firstChild ? n.call(i4.childNodes) : null, e4, !o3 && t4 ? t4 : r3 ? r3.__e : i4.firstChild, o3), z(e4, u4);
|
|
}
|
|
function S(n2, l3) {
|
|
P(n2, l3, S);
|
|
}
|
|
function q(l3, u4, i4) {
|
|
var t4, o3, r3, f4 = s({}, l3.props);
|
|
for (r3 in u4)
|
|
"key" == r3 ? t4 = u4[r3] : "ref" == r3 ? o3 = u4[r3] : f4[r3] = u4[r3];
|
|
return arguments.length > 2 && (f4.children = arguments.length > 3 ? n.call(arguments, 2) : i4), v(l3.type, f4, t4 || l3.key, o3 || l3.ref, null);
|
|
}
|
|
function B(n2, l3) {
|
|
var u4 = { __c: l3 = "__cC" + r++, __: n2, Consumer: function(n3, l4) {
|
|
return n3.children(l4);
|
|
}, Provider: function(n3) {
|
|
var u5, i4;
|
|
return this.getChildContext || (u5 = [], (i4 = {})[l3] = this, this.getChildContext = function() {
|
|
return i4;
|
|
}, this.shouldComponentUpdate = function(n4) {
|
|
this.props.value !== n4.value && u5.some(b);
|
|
}, this.sub = function(n4) {
|
|
u5.push(n4);
|
|
var l4 = n4.componentWillUnmount;
|
|
n4.componentWillUnmount = function() {
|
|
u5.splice(u5.indexOf(n4), 1), l4 && l4.call(n4);
|
|
};
|
|
}), n3.children;
|
|
} };
|
|
return u4.Provider.__ = u4.Consumer.contextType = u4;
|
|
}
|
|
n = e.slice, l = { __e: function(n2, l3, u4, i4) {
|
|
for (var t4, o3, r3; l3 = l3.__; )
|
|
if ((t4 = l3.__c) && !t4.__)
|
|
try {
|
|
if ((o3 = t4.constructor) && null != o3.getDerivedStateFromError && (t4.setState(o3.getDerivedStateFromError(n2)), r3 = t4.__d), null != t4.componentDidCatch && (t4.componentDidCatch(n2, i4 || {}), r3 = t4.__d), r3)
|
|
return t4.__E = t4;
|
|
} catch (l4) {
|
|
n2 = l4;
|
|
}
|
|
throw n2;
|
|
} }, u = 0, i = function(n2) {
|
|
return null != n2 && void 0 === n2.constructor;
|
|
}, d.prototype.setState = function(n2, l3) {
|
|
var u4;
|
|
u4 = null != this.__s && this.__s !== this.state ? this.__s : this.__s = s({}, this.state), "function" == typeof n2 && (n2 = n2(s({}, u4), this.props)), n2 && s(u4, n2), null != n2 && this.__v && (l3 && this._sb.push(l3), b(this));
|
|
}, d.prototype.forceUpdate = function(n2) {
|
|
this.__v && (this.__e = true, n2 && this.__h.push(n2), b(this));
|
|
}, d.prototype.render = p, t = [], g.__r = 0, r = 0;
|
|
|
|
// node_modules/preact/hooks/dist/hooks.module.js
|
|
var t2;
|
|
var r2;
|
|
var u2;
|
|
var i2;
|
|
var o2 = 0;
|
|
var f2 = [];
|
|
var c2 = [];
|
|
var e2 = l.__b;
|
|
var a2 = l.__r;
|
|
var v2 = l.diffed;
|
|
var l2 = l.__c;
|
|
var m2 = l.unmount;
|
|
function d2(t4, u4) {
|
|
l.__h && l.__h(r2, t4, o2 || u4), o2 = 0;
|
|
var i4 = r2.__H || (r2.__H = { __: [], __h: [] });
|
|
return t4 >= i4.__.length && i4.__.push({ __V: c2 }), i4.__[t4];
|
|
}
|
|
function p2(n2) {
|
|
return o2 = 1, y2(B2, n2);
|
|
}
|
|
function y2(n2, u4, i4) {
|
|
var o3 = d2(t2++, 2);
|
|
if (o3.t = n2, !o3.__c && (o3.__ = [i4 ? i4(u4) : B2(void 0, u4), function(n3) {
|
|
var t4 = o3.__N ? o3.__N[0] : o3.__[0], r3 = o3.t(t4, n3);
|
|
t4 !== r3 && (o3.__N = [r3, o3.__[1]], o3.__c.setState({}));
|
|
}], o3.__c = r2, !r2.u)) {
|
|
r2.u = true;
|
|
var f4 = r2.shouldComponentUpdate;
|
|
r2.shouldComponentUpdate = function(n3, t4, r3) {
|
|
if (!o3.__c.__H)
|
|
return true;
|
|
var u5 = o3.__c.__H.__.filter(function(n4) {
|
|
return n4.__c;
|
|
});
|
|
if (u5.every(function(n4) {
|
|
return !n4.__N;
|
|
}))
|
|
return !f4 || f4.call(this, n3, t4, r3);
|
|
var i5 = false;
|
|
return u5.forEach(function(n4) {
|
|
if (n4.__N) {
|
|
var t5 = n4.__[0];
|
|
n4.__ = n4.__N, n4.__N = void 0, t5 !== n4.__[0] && (i5 = true);
|
|
}
|
|
}), !(!i5 && o3.__c.props === n3) && (!f4 || f4.call(this, n3, t4, r3));
|
|
};
|
|
}
|
|
return o3.__N || o3.__;
|
|
}
|
|
function h2(u4, i4) {
|
|
var o3 = d2(t2++, 3);
|
|
!l.__s && z2(o3.__H, i4) && (o3.__ = u4, o3.i = i4, r2.__H.__h.push(o3));
|
|
}
|
|
function s2(u4, i4) {
|
|
var o3 = d2(t2++, 4);
|
|
!l.__s && z2(o3.__H, i4) && (o3.__ = u4, o3.i = i4, r2.__h.push(o3));
|
|
}
|
|
function _2(n2) {
|
|
return o2 = 5, F(function() {
|
|
return { current: n2 };
|
|
}, []);
|
|
}
|
|
function A2(n2, t4, r3) {
|
|
o2 = 6, s2(function() {
|
|
return "function" == typeof n2 ? (n2(t4()), function() {
|
|
return n2(null);
|
|
}) : n2 ? (n2.current = t4(), function() {
|
|
return n2.current = null;
|
|
}) : void 0;
|
|
}, null == r3 ? r3 : r3.concat(n2));
|
|
}
|
|
function F(n2, r3) {
|
|
var u4 = d2(t2++, 7);
|
|
return z2(u4.__H, r3) ? (u4.__V = n2(), u4.i = r3, u4.__h = n2, u4.__V) : u4.__;
|
|
}
|
|
function T2(n2, t4) {
|
|
return o2 = 8, F(function() {
|
|
return n2;
|
|
}, t4);
|
|
}
|
|
function q2(n2) {
|
|
var u4 = r2.context[n2.__c], i4 = d2(t2++, 9);
|
|
return i4.c = n2, u4 ? (null == i4.__ && (i4.__ = true, u4.sub(r2)), u4.props.value) : n2.__;
|
|
}
|
|
function x2(t4, r3) {
|
|
l.useDebugValue && l.useDebugValue(r3 ? r3(t4) : t4);
|
|
}
|
|
function P2(n2) {
|
|
var u4 = d2(t2++, 10), i4 = p2();
|
|
return u4.__ = n2, r2.componentDidCatch || (r2.componentDidCatch = function(n3, t4) {
|
|
u4.__ && u4.__(n3, t4), i4[1](n3);
|
|
}), [i4[0], function() {
|
|
i4[1](void 0);
|
|
}];
|
|
}
|
|
function V() {
|
|
var n2 = d2(t2++, 11);
|
|
if (!n2.__) {
|
|
for (var u4 = r2.__v; null !== u4 && !u4.__m && null !== u4.__; )
|
|
u4 = u4.__;
|
|
var i4 = u4.__m || (u4.__m = [0, 0]);
|
|
n2.__ = "P" + i4[0] + "-" + i4[1]++;
|
|
}
|
|
return n2.__;
|
|
}
|
|
function b2() {
|
|
for (var t4; t4 = f2.shift(); )
|
|
if (t4.__P && t4.__H)
|
|
try {
|
|
t4.__H.__h.forEach(k2), t4.__H.__h.forEach(w2), t4.__H.__h = [];
|
|
} catch (r3) {
|
|
t4.__H.__h = [], l.__e(r3, t4.__v);
|
|
}
|
|
}
|
|
l.__b = function(n2) {
|
|
r2 = null, e2 && e2(n2);
|
|
}, l.__r = function(n2) {
|
|
a2 && a2(n2), t2 = 0;
|
|
var i4 = (r2 = n2.__c).__H;
|
|
i4 && (u2 === r2 ? (i4.__h = [], r2.__h = [], i4.__.forEach(function(n3) {
|
|
n3.__N && (n3.__ = n3.__N), n3.__V = c2, n3.__N = n3.i = void 0;
|
|
})) : (i4.__h.forEach(k2), i4.__h.forEach(w2), i4.__h = [])), u2 = r2;
|
|
}, l.diffed = function(t4) {
|
|
v2 && v2(t4);
|
|
var o3 = t4.__c;
|
|
o3 && o3.__H && (o3.__H.__h.length && (1 !== f2.push(o3) && i2 === l.requestAnimationFrame || ((i2 = l.requestAnimationFrame) || j2)(b2)), o3.__H.__.forEach(function(n2) {
|
|
n2.i && (n2.__H = n2.i), n2.__V !== c2 && (n2.__ = n2.__V), n2.i = void 0, n2.__V = c2;
|
|
})), u2 = r2 = null;
|
|
}, l.__c = function(t4, r3) {
|
|
r3.some(function(t5) {
|
|
try {
|
|
t5.__h.forEach(k2), t5.__h = t5.__h.filter(function(n2) {
|
|
return !n2.__ || w2(n2);
|
|
});
|
|
} catch (u4) {
|
|
r3.some(function(n2) {
|
|
n2.__h && (n2.__h = []);
|
|
}), r3 = [], l.__e(u4, t5.__v);
|
|
}
|
|
}), l2 && l2(t4, r3);
|
|
}, l.unmount = function(t4) {
|
|
m2 && m2(t4);
|
|
var r3, u4 = t4.__c;
|
|
u4 && u4.__H && (u4.__H.__.forEach(function(n2) {
|
|
try {
|
|
k2(n2);
|
|
} catch (n3) {
|
|
r3 = n3;
|
|
}
|
|
}), u4.__H = void 0, r3 && l.__e(r3, u4.__v));
|
|
};
|
|
var g2 = "function" == typeof requestAnimationFrame;
|
|
function j2(n2) {
|
|
var t4, r3 = function() {
|
|
clearTimeout(u4), g2 && cancelAnimationFrame(t4), setTimeout(n2);
|
|
}, u4 = setTimeout(r3, 100);
|
|
g2 && (t4 = requestAnimationFrame(r3));
|
|
}
|
|
function k2(n2) {
|
|
var t4 = r2, u4 = n2.__c;
|
|
"function" == typeof u4 && (n2.__c = void 0, u4()), r2 = t4;
|
|
}
|
|
function w2(n2) {
|
|
var t4 = r2;
|
|
n2.__c = n2.__(), r2 = t4;
|
|
}
|
|
function z2(n2, t4) {
|
|
return !n2 || n2.length !== t4.length || t4.some(function(t5, r3) {
|
|
return t5 !== n2[r3];
|
|
});
|
|
}
|
|
function B2(n2, t4) {
|
|
return "function" == typeof t4 ? t4(n2) : t4;
|
|
}
|
|
|
|
// node_modules/preact/compat/dist/compat.module.js
|
|
function g3(n2, t4) {
|
|
for (var e4 in t4)
|
|
n2[e4] = t4[e4];
|
|
return n2;
|
|
}
|
|
function C2(n2, t4) {
|
|
for (var e4 in n2)
|
|
if ("__source" !== e4 && !(e4 in t4))
|
|
return true;
|
|
for (var r3 in t4)
|
|
if ("__source" !== r3 && n2[r3] !== t4[r3])
|
|
return true;
|
|
return false;
|
|
}
|
|
function E(n2, t4) {
|
|
return n2 === t4 && (0 !== n2 || 1 / n2 == 1 / t4) || n2 != n2 && t4 != t4;
|
|
}
|
|
function w3(n2) {
|
|
this.props = n2;
|
|
}
|
|
function R(n2, e4) {
|
|
function r3(n3) {
|
|
var t4 = this.props.ref, r4 = t4 == n3.ref;
|
|
return !r4 && t4 && (t4.call ? t4(null) : t4.current = null), e4 ? !e4(this.props, n3) || !r4 : C2(this.props, n3);
|
|
}
|
|
function u4(e5) {
|
|
return this.shouldComponentUpdate = r3, h(n2, e5);
|
|
}
|
|
return u4.displayName = "Memo(" + (n2.displayName || n2.name) + ")", u4.prototype.isReactComponent = true, u4.__f = true, u4;
|
|
}
|
|
(w3.prototype = new d()).isPureReactComponent = true, w3.prototype.shouldComponentUpdate = function(n2, t4) {
|
|
return C2(this.props, n2) || C2(this.state, t4);
|
|
};
|
|
var x3 = l.__b;
|
|
l.__b = function(n2) {
|
|
n2.type && n2.type.__f && n2.ref && (n2.props.ref = n2.ref, n2.ref = null), x3 && x3(n2);
|
|
};
|
|
var N2 = "undefined" != typeof Symbol && Symbol.for && Symbol.for("react.forward_ref") || 3911;
|
|
function k3(n2) {
|
|
function t4(t5) {
|
|
var e4 = g3({}, t5);
|
|
return delete e4.ref, n2(e4, t5.ref || null);
|
|
}
|
|
return t4.$$typeof = N2, t4.render = t4, t4.prototype.isReactComponent = t4.__f = true, t4.displayName = "ForwardRef(" + (n2.displayName || n2.name) + ")", t4;
|
|
}
|
|
var A3 = function(n2, t4) {
|
|
return null == n2 ? null : x(x(n2).map(t4));
|
|
};
|
|
var O2 = { map: A3, forEach: A3, count: function(n2) {
|
|
return n2 ? x(n2).length : 0;
|
|
}, only: function(n2) {
|
|
var t4 = x(n2);
|
|
if (1 !== t4.length)
|
|
throw "Children.only";
|
|
return t4[0];
|
|
}, toArray: x };
|
|
var T3 = l.__e;
|
|
l.__e = function(n2, t4, e4, r3) {
|
|
if (n2.then) {
|
|
for (var u4, o3 = t4; o3 = o3.__; )
|
|
if ((u4 = o3.__c) && u4.__c)
|
|
return null == t4.__e && (t4.__e = e4.__e, t4.__k = e4.__k), u4.__c(n2, t4);
|
|
}
|
|
T3(n2, t4, e4, r3);
|
|
};
|
|
var I2 = l.unmount;
|
|
function L2(n2, t4, e4) {
|
|
return n2 && (n2.__c && n2.__c.__H && (n2.__c.__H.__.forEach(function(n3) {
|
|
"function" == typeof n3.__c && n3.__c();
|
|
}), n2.__c.__H = null), null != (n2 = g3({}, n2)).__c && (n2.__c.__P === e4 && (n2.__c.__P = t4), n2.__c = null), n2.__k = n2.__k && n2.__k.map(function(n3) {
|
|
return L2(n3, t4, e4);
|
|
})), n2;
|
|
}
|
|
function U(n2, t4, e4) {
|
|
return n2 && (n2.__v = null, n2.__k = n2.__k && n2.__k.map(function(n3) {
|
|
return U(n3, t4, e4);
|
|
}), n2.__c && n2.__c.__P === t4 && (n2.__e && e4.insertBefore(n2.__e, n2.__d), n2.__c.__e = true, n2.__c.__P = e4)), n2;
|
|
}
|
|
function D() {
|
|
this.__u = 0, this.t = null, this.__b = null;
|
|
}
|
|
function F2(n2) {
|
|
var t4 = n2.__.__c;
|
|
return t4 && t4.__a && t4.__a(n2);
|
|
}
|
|
function M2(n2) {
|
|
var e4, r3, u4;
|
|
function o3(o4) {
|
|
if (e4 || (e4 = n2()).then(function(n3) {
|
|
r3 = n3.default || n3;
|
|
}, function(n3) {
|
|
u4 = n3;
|
|
}), u4)
|
|
throw u4;
|
|
if (!r3)
|
|
throw e4;
|
|
return h(r3, o4);
|
|
}
|
|
return o3.displayName = "Lazy", o3.__f = true, o3;
|
|
}
|
|
function V2() {
|
|
this.u = null, this.o = null;
|
|
}
|
|
l.unmount = function(n2) {
|
|
var t4 = n2.__c;
|
|
t4 && t4.__R && t4.__R(), t4 && true === n2.__h && (n2.type = null), I2 && I2(n2);
|
|
}, (D.prototype = new d()).__c = function(n2, t4) {
|
|
var e4 = t4.__c, r3 = this;
|
|
null == r3.t && (r3.t = []), r3.t.push(e4);
|
|
var u4 = F2(r3.__v), o3 = false, i4 = function() {
|
|
o3 || (o3 = true, e4.__R = null, u4 ? u4(l3) : l3());
|
|
};
|
|
e4.__R = i4;
|
|
var l3 = function() {
|
|
if (!--r3.__u) {
|
|
if (r3.state.__a) {
|
|
var n3 = r3.state.__a;
|
|
r3.__v.__k[0] = U(n3, n3.__c.__P, n3.__c.__O);
|
|
}
|
|
var t5;
|
|
for (r3.setState({ __a: r3.__b = null }); t5 = r3.t.pop(); )
|
|
t5.forceUpdate();
|
|
}
|
|
}, c4 = true === t4.__h;
|
|
r3.__u++ || c4 || r3.setState({ __a: r3.__b = r3.__v.__k[0] }), n2.then(i4, i4);
|
|
}, D.prototype.componentWillUnmount = function() {
|
|
this.t = [];
|
|
}, D.prototype.render = function(n2, e4) {
|
|
if (this.__b) {
|
|
if (this.__v.__k) {
|
|
var r3 = document.createElement("div"), o3 = this.__v.__k[0].__c;
|
|
this.__v.__k[0] = L2(this.__b, r3, o3.__O = o3.__P);
|
|
}
|
|
this.__b = null;
|
|
}
|
|
var i4 = e4.__a && h(p, null, n2.fallback);
|
|
return i4 && (i4.__h = null), [h(p, null, e4.__a ? null : n2.children), i4];
|
|
};
|
|
var W = function(n2, t4, e4) {
|
|
if (++e4[1] === e4[0] && n2.o.delete(t4), n2.props.revealOrder && ("t" !== n2.props.revealOrder[0] || !n2.o.size))
|
|
for (e4 = n2.u; e4; ) {
|
|
for (; e4.length > 3; )
|
|
e4.pop()();
|
|
if (e4[1] < e4[0])
|
|
break;
|
|
n2.u = e4 = e4[2];
|
|
}
|
|
};
|
|
function P3(n2) {
|
|
return this.getChildContext = function() {
|
|
return n2.context;
|
|
}, n2.children;
|
|
}
|
|
function $2(n2) {
|
|
var e4 = this, r3 = n2.i;
|
|
e4.componentWillUnmount = function() {
|
|
P(null, e4.l), e4.l = null, e4.i = null;
|
|
}, e4.i && e4.i !== r3 && e4.componentWillUnmount(), n2.__v ? (e4.l || (e4.i = r3, e4.l = { nodeType: 1, parentNode: r3, childNodes: [], appendChild: function(n3) {
|
|
this.childNodes.push(n3), e4.i.appendChild(n3);
|
|
}, insertBefore: function(n3, t4) {
|
|
this.childNodes.push(n3), e4.i.appendChild(n3);
|
|
}, removeChild: function(n3) {
|
|
this.childNodes.splice(this.childNodes.indexOf(n3) >>> 1, 1), e4.i.removeChild(n3);
|
|
} }), P(h(P3, { context: e4.context }, n2.__v), e4.l)) : e4.l && e4.componentWillUnmount();
|
|
}
|
|
function j3(n2, e4) {
|
|
var r3 = h($2, { __v: n2, i: e4 });
|
|
return r3.containerInfo = e4, r3;
|
|
}
|
|
(V2.prototype = new d()).__a = function(n2) {
|
|
var t4 = this, e4 = F2(t4.__v), r3 = t4.o.get(n2);
|
|
return r3[0]++, function(u4) {
|
|
var o3 = function() {
|
|
t4.props.revealOrder ? (r3.push(u4), W(t4, n2, r3)) : u4();
|
|
};
|
|
e4 ? e4(o3) : o3();
|
|
};
|
|
}, V2.prototype.render = function(n2) {
|
|
this.u = null, this.o = /* @__PURE__ */ new Map();
|
|
var t4 = x(n2.children);
|
|
n2.revealOrder && "b" === n2.revealOrder[0] && t4.reverse();
|
|
for (var e4 = t4.length; e4--; )
|
|
this.o.set(t4[e4], this.u = [1, 0, this.u]);
|
|
return n2.children;
|
|
}, V2.prototype.componentDidUpdate = V2.prototype.componentDidMount = function() {
|
|
var n2 = this;
|
|
this.o.forEach(function(t4, e4) {
|
|
W(n2, e4, t4);
|
|
});
|
|
};
|
|
var z3 = "undefined" != typeof Symbol && Symbol.for && Symbol.for("react.element") || 60103;
|
|
var B3 = /^(?:accent|alignment|arabic|baseline|cap|clip(?!PathU)|color|dominant|fill|flood|font|glyph(?!R)|horiz|image|letter|lighting|marker(?!H|W|U)|overline|paint|pointer|shape|stop|strikethrough|stroke|text(?!L)|transform|underline|unicode|units|v|vector|vert|word|writing|x(?!C))[A-Z]/;
|
|
var H2 = "undefined" != typeof document;
|
|
var Z = function(n2) {
|
|
return ("undefined" != typeof Symbol && "symbol" == typeof Symbol() ? /fil|che|rad/i : /fil|che|ra/i).test(n2);
|
|
};
|
|
function Y(n2, t4, e4) {
|
|
return null == t4.__k && (t4.textContent = ""), P(n2, t4), "function" == typeof e4 && e4(), n2 ? n2.__c : null;
|
|
}
|
|
function q3(n2, t4, e4) {
|
|
return S(n2, t4), "function" == typeof e4 && e4(), n2 ? n2.__c : null;
|
|
}
|
|
d.prototype.isReactComponent = {}, ["componentWillMount", "componentWillReceiveProps", "componentWillUpdate"].forEach(function(t4) {
|
|
Object.defineProperty(d.prototype, t4, { configurable: true, get: function() {
|
|
return this["UNSAFE_" + t4];
|
|
}, set: function(n2) {
|
|
Object.defineProperty(this, t4, { configurable: true, writable: true, value: n2 });
|
|
} });
|
|
});
|
|
var G = l.event;
|
|
function J() {
|
|
}
|
|
function K() {
|
|
return this.cancelBubble;
|
|
}
|
|
function Q() {
|
|
return this.defaultPrevented;
|
|
}
|
|
l.event = function(n2) {
|
|
return G && (n2 = G(n2)), n2.persist = J, n2.isPropagationStopped = K, n2.isDefaultPrevented = Q, n2.nativeEvent = n2;
|
|
};
|
|
var X;
|
|
var nn = { configurable: true, get: function() {
|
|
return this.class;
|
|
} };
|
|
var tn = l.vnode;
|
|
l.vnode = function(n2) {
|
|
var t4 = n2.type, e4 = n2.props, u4 = e4;
|
|
if ("string" == typeof t4) {
|
|
var o3 = -1 === t4.indexOf("-");
|
|
for (var i4 in u4 = {}, e4) {
|
|
var l3 = e4[i4];
|
|
H2 && "children" === i4 && "noscript" === t4 || "value" === i4 && "defaultValue" in e4 && null == l3 || ("defaultValue" === i4 && "value" in e4 && null == e4.value ? i4 = "value" : "download" === i4 && true === l3 ? l3 = "" : /ondoubleclick/i.test(i4) ? i4 = "ondblclick" : /^onchange(textarea|input)/i.test(i4 + t4) && !Z(e4.type) ? i4 = "oninput" : /^onfocus$/i.test(i4) ? i4 = "onfocusin" : /^onblur$/i.test(i4) ? i4 = "onfocusout" : /^on(Ani|Tra|Tou|BeforeInp|Compo)/.test(i4) ? i4 = i4.toLowerCase() : o3 && B3.test(i4) ? i4 = i4.replace(/[A-Z0-9]/g, "-$&").toLowerCase() : null === l3 && (l3 = void 0), /^oninput$/i.test(i4) && (i4 = i4.toLowerCase(), u4[i4] && (i4 = "oninputCapture")), u4[i4] = l3);
|
|
}
|
|
"select" == t4 && u4.multiple && Array.isArray(u4.value) && (u4.value = x(e4.children).forEach(function(n3) {
|
|
n3.props.selected = -1 != u4.value.indexOf(n3.props.value);
|
|
})), "select" == t4 && null != u4.defaultValue && (u4.value = x(e4.children).forEach(function(n3) {
|
|
n3.props.selected = u4.multiple ? -1 != u4.defaultValue.indexOf(n3.props.value) : u4.defaultValue == n3.props.value;
|
|
})), n2.props = u4, e4.class != e4.className && (nn.enumerable = "className" in e4, null != e4.className && (u4.class = e4.className), Object.defineProperty(u4, "className", nn));
|
|
}
|
|
n2.$$typeof = z3, tn && tn(n2);
|
|
};
|
|
var en = l.__r;
|
|
l.__r = function(n2) {
|
|
en && en(n2), X = n2.__c;
|
|
};
|
|
var rn = { ReactCurrentDispatcher: { current: { readContext: function(n2) {
|
|
return X.__n[n2.__c].props.value;
|
|
} } } };
|
|
function on(n2) {
|
|
return h.bind(null, n2);
|
|
}
|
|
function ln(n2) {
|
|
return !!n2 && n2.$$typeof === z3;
|
|
}
|
|
function cn(n2) {
|
|
return ln(n2) ? q.apply(null, arguments) : n2;
|
|
}
|
|
function fn(n2) {
|
|
return !!n2.__k && (P(null, n2), true);
|
|
}
|
|
function an(n2) {
|
|
return n2 && (n2.base || 1 === n2.nodeType && n2) || null;
|
|
}
|
|
var sn = function(n2, t4) {
|
|
return n2(t4);
|
|
};
|
|
var hn = function(n2, t4) {
|
|
return n2(t4);
|
|
};
|
|
var vn = p;
|
|
function dn(n2) {
|
|
n2();
|
|
}
|
|
function pn(n2) {
|
|
return n2;
|
|
}
|
|
function mn() {
|
|
return [false, dn];
|
|
}
|
|
var yn = s2;
|
|
function _n(n2, t4) {
|
|
var e4 = t4(), r3 = p2({ h: { __: e4, v: t4 } }), u4 = r3[0].h, o3 = r3[1];
|
|
return s2(function() {
|
|
u4.__ = e4, u4.v = t4, E(u4.__, t4()) || o3({ h: u4 });
|
|
}, [n2, e4, t4]), h2(function() {
|
|
return E(u4.__, u4.v()) || o3({ h: u4 }), n2(function() {
|
|
E(u4.__, u4.v()) || o3({ h: u4 });
|
|
});
|
|
}, [n2]), e4;
|
|
}
|
|
var bn = { useState: p2, useId: V, useReducer: y2, useEffect: h2, useLayoutEffect: s2, useInsertionEffect: yn, useTransition: mn, useDeferredValue: pn, useSyncExternalStore: _n, startTransition: dn, useRef: _2, useImperativeHandle: A2, useMemo: F, useCallback: T2, useContext: q2, useDebugValue: x2, version: "17.0.2", Children: O2, render: Y, hydrate: q3, unmountComponentAtNode: fn, createPortal: j3, createElement: h, createContext: B, createFactory: on, cloneElement: cn, createRef: y, Fragment: p, isValidElement: ln, findDOMNode: an, Component: d, PureComponent: w3, memo: R, forwardRef: k3, flushSync: hn, unstable_batchedUpdates: sn, StrictMode: vn, Suspense: D, SuspenseList: V2, lazy: M2, __SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED: rn };
|
|
|
|
// node_modules/preact/compat/client.mjs
|
|
function createRoot(container) {
|
|
return {
|
|
render(children) {
|
|
Y(children, container);
|
|
},
|
|
unmount() {
|
|
fn(container);
|
|
}
|
|
};
|
|
}
|
|
|
|
// src/utils/codemirror.ts
|
|
var import_language2 = require("@codemirror/language");
|
|
var getActiveCM = () => {
|
|
let rcm;
|
|
app.workspace.iterateLeaves((leaf) => {
|
|
var _a2;
|
|
const cm = (_a2 = leaf.view.editor) == null ? void 0 : _a2.cm;
|
|
if (cm == null ? void 0 : cm.hasFocus) {
|
|
rcm = cm;
|
|
return true;
|
|
}
|
|
}, app.workspace["rootSplit"]);
|
|
return rcm;
|
|
};
|
|
var getActiveMarkdownView = () => {
|
|
let rv;
|
|
app.workspace.iterateLeaves((leaf) => {
|
|
var _a2;
|
|
const cm = (_a2 = leaf.view.editor) == null ? void 0 : _a2.cm;
|
|
if (cm == null ? void 0 : cm.hasFocus) {
|
|
rv = leaf.view;
|
|
return true;
|
|
}
|
|
}, app.workspace["rootSplit"]);
|
|
return rv;
|
|
};
|
|
function iterateTreeAtPos(pos, state, iterateFns) {
|
|
(0, import_language2.syntaxTree)(state).iterate({ ...iterateFns, from: pos, to: pos });
|
|
}
|
|
function iterateTreeInSelection(selection, state, iterateFns) {
|
|
(0, import_language2.syntaxTree)(state).iterate({
|
|
...iterateFns,
|
|
from: selection.from,
|
|
to: selection.to
|
|
});
|
|
}
|
|
|
|
// src/i18n.ts
|
|
var T4 = class {
|
|
constructor() {
|
|
this.all = {
|
|
en: {
|
|
commands: {
|
|
h1: "Heading 1",
|
|
h2: "Heading 2",
|
|
h3: "Heading 3",
|
|
list: "Bullet List",
|
|
"ordered-list": "Numbered List",
|
|
todo: "To-do List",
|
|
quote: "Quote",
|
|
divider: "Divider",
|
|
note: "Link to Note",
|
|
link: "Web Link",
|
|
callout: "Callout",
|
|
table: "Table",
|
|
codeblock: "Code Block",
|
|
emoji: "Emoji",
|
|
image: "Image",
|
|
flow: "Flow Note",
|
|
tag: "Tag",
|
|
makeMenu: "Make Menu",
|
|
selectStyle: "Style",
|
|
toggleKeyboard: "Toggle Keyboard"
|
|
},
|
|
styles: {
|
|
bold: "Bold",
|
|
italics: "Italics",
|
|
strikethrough: "Strikethrough",
|
|
code: "Code",
|
|
link: "Web Link",
|
|
blocklink: "Link to Note",
|
|
textColor: "Text Color",
|
|
highlight: "Highlight"
|
|
},
|
|
commandsSuggest: {
|
|
noResult: "No result"
|
|
},
|
|
commandPalette: {
|
|
enable: "Enable",
|
|
disabled: "Disable",
|
|
openFlow: "Open Flow Editors in Selection",
|
|
closeFlow: "Close Flow Editors in Selection",
|
|
toggleBold: "Toggle Bold",
|
|
toggleItalics: "Toggle Italics",
|
|
openSpaces: "Open Spaces",
|
|
blink: "Blink",
|
|
openFileContext: "Open Context Explorer"
|
|
},
|
|
menu: {
|
|
openFilePane: "Open in a new pane",
|
|
rename: "Rename",
|
|
moveFile: "Move file to...",
|
|
duplicate: "Make a copy",
|
|
edit: "Edit",
|
|
delete: "Delete",
|
|
getHelp: "Make.md Community",
|
|
openVault: "Open Another Vault",
|
|
obSettings: "Obsidian Settings",
|
|
commandPalette: "Command Palette",
|
|
backToSpace: "Back to Spaces",
|
|
newSpace: "New Space",
|
|
collapseAllSections: "Collapse All Spaces",
|
|
expandAllSections: "Expand All Spaces",
|
|
collapseAllFolders: "Collapse All Folders",
|
|
expandAllFolders: "Expand All Folders",
|
|
spaceTitle: "Add/Remove in Space",
|
|
none: "None",
|
|
tableView: "Table View",
|
|
cardView: "Card View",
|
|
listView: "List View",
|
|
flowView: "Flow View",
|
|
groupBy: "Group By",
|
|
sortBy: "Sort By",
|
|
newFilter: "New Filter",
|
|
clearFilters: "Clear Filters",
|
|
unhideFields: "Unhide All Properties",
|
|
importDataview: "Import All Dataview Properties",
|
|
saveAllProperties: "Save All Properties to Files",
|
|
mergeProperties: "Merge Properties",
|
|
openTag: "Open Tag",
|
|
removeTag: "Remove Tag",
|
|
deleteProperty: "Delete Property",
|
|
hideProperty: "Hide Property",
|
|
unhideProperty: "Unhide Property",
|
|
saveProperty: "Save Property",
|
|
sortAscending: "Sort Ascending",
|
|
sortDescending: "Sort Descending",
|
|
deleteRow: "Delete Item",
|
|
collapseAll: "Collapse All",
|
|
customSort: "Custom Sort",
|
|
fileNameSortAlphaAsc: "File Name (A to Z)",
|
|
fileNameSortAlphaDesc: "File Name (Z to A)",
|
|
createdTimeSortAsc: "Created Time (new to old)",
|
|
createdTimeSortDesc: "Created Time (old to new)",
|
|
spaces: "Spaces",
|
|
tags: "Tags",
|
|
manageHiddenFiles: "Manage Hidden Files",
|
|
unpinSpace: "Unpin Space",
|
|
pinSpace: "Pin Space",
|
|
deleteSpace: "Delete Space",
|
|
changeColor: "Change Color",
|
|
deleteFiles: "Delete Files",
|
|
createFolderSpace: "Create Folder Space",
|
|
folder: "Folder"
|
|
},
|
|
buttons: {
|
|
moreOptions: "More Options",
|
|
newNote: "New Note",
|
|
changeIcon: "Change Sticker",
|
|
removeIcon: "Remove Sticker",
|
|
rename: "Change Name",
|
|
createFolder: "New Folder",
|
|
createNote: "New Note",
|
|
createSection: "New Space",
|
|
cancel: "Cancel",
|
|
search: "Search",
|
|
delete: "Delete",
|
|
toggleFlow: "Toggle Flow",
|
|
openFlow: "Open Flow",
|
|
hideFlow: "Hide Flow",
|
|
openLink: "Open Link",
|
|
addTag: "Add Tag",
|
|
tag: "Tag",
|
|
syncFields: "Sync Properties",
|
|
cutTable: "Cut Table",
|
|
deleteTable: "Delete Table",
|
|
blink: "Blink",
|
|
addFile: "Add File",
|
|
merge: "Merge",
|
|
saveView: "Save View",
|
|
saveTable: "Save Table",
|
|
renameView: "Rename View",
|
|
renameTable: "Rename Table",
|
|
currentFolder: "Current Folder",
|
|
sync: "Sync"
|
|
},
|
|
filterTypes: {
|
|
contains: "contains",
|
|
notContains: "does not contain",
|
|
is: "is",
|
|
isNot: "is not",
|
|
before: "before",
|
|
after: "after",
|
|
anyOf: "is any of",
|
|
noneOf: "is none of",
|
|
checked: "is checked",
|
|
unchecked: "is unchecked"
|
|
},
|
|
sortTypes: {
|
|
alphaAsc: "A to Z",
|
|
alphaDesc: "Z to A",
|
|
earliest: "Earliest",
|
|
latest: "Latest",
|
|
checkAsc: "Checked \u2192 Unchecked",
|
|
checkDesc: "Unchecked \u2192 Checked",
|
|
itemsAsc: "Least Items",
|
|
itemsDesc: "Most Items"
|
|
},
|
|
properties: {
|
|
defaultField: "Name",
|
|
text: {
|
|
label: "Text"
|
|
},
|
|
number: {
|
|
label: "Number"
|
|
},
|
|
preview: {
|
|
label: "Preview"
|
|
},
|
|
boolean: {
|
|
label: "Yes/No"
|
|
},
|
|
date: {
|
|
label: "Date"
|
|
},
|
|
option: {
|
|
label: "Option"
|
|
},
|
|
file: {
|
|
label: "File"
|
|
},
|
|
link: {
|
|
label: "Link"
|
|
},
|
|
tag: {
|
|
label: "Tag"
|
|
},
|
|
context: {
|
|
label: "Context"
|
|
},
|
|
image: {
|
|
label: "Image"
|
|
},
|
|
fileProperty: {
|
|
label: "Look Up",
|
|
createdTime: "Created",
|
|
modifiedTime: "Last Edited",
|
|
extension: "Extension",
|
|
size: "Size",
|
|
preview: "Note Preview",
|
|
parentFolder: "Folder"
|
|
}
|
|
},
|
|
labels: {
|
|
createFolder: "New Folder Name",
|
|
rename: "Rename Note",
|
|
renameSection: "Rename Space",
|
|
createSection: "New Space",
|
|
createNote: "New Note Name",
|
|
select: "Select",
|
|
collapse: "Collapse",
|
|
expand: "Expand",
|
|
findStickers: "Find Sticker",
|
|
mergeProperties: "Merge Properties",
|
|
placeholder: "Type '/' for commands",
|
|
noFile: "is not created yet. Click to create.",
|
|
blinkPlaceholder: "Quickly Search a File, Folder, Tag... Press Tab to Edit",
|
|
searchPlaceholder: "Type to search...",
|
|
contextItemSelectPlaceholder: "Find Item",
|
|
linkItemSelectPlaceholder: "Find or Create Note",
|
|
optionItemSelectPlaceholder: "Select Option",
|
|
viewItemSelectPlaceholder: "Select View",
|
|
tagItemSelectPlaceholder: "Find Tag",
|
|
propertyItemSelectPlaceholder: "Select Property",
|
|
sortItemSelectPlaceholder: "Select Sort",
|
|
filterItemSelectPlaceholder: "Select Filter",
|
|
syncFrontmatterProperty: "Sync Frontmatter Property",
|
|
newProperty: "New Property",
|
|
propertyType: "Type",
|
|
propertyContext: "Context",
|
|
propertyFileProp: "Property",
|
|
multiple: "Multiple",
|
|
filesCount: "{$1} Files",
|
|
hiddenFiles: "Hidden Files",
|
|
addExtension: "Add Extension",
|
|
saveView: "Save View",
|
|
saveTable: "Save Table",
|
|
renameView: "Rename View",
|
|
renameTable: "Rename Table",
|
|
syncMetadata: "Sync Metadata",
|
|
syncProperties: "Sync Properties",
|
|
selectContext: "Select Context",
|
|
metadata: "Metadata",
|
|
backlinks: "Backlinks",
|
|
context: "Context"
|
|
},
|
|
descriptions: {
|
|
syncMetadata: "Select which fields from your notes to start syncing with the context.",
|
|
syncProperties: "Contexts defines and syncs the same fields across your notes depending on their folder or tag.",
|
|
selectContext: "Select which folder or tag context you want to sync the fields."
|
|
},
|
|
flowView: {
|
|
emptyDoc: "Empty Document",
|
|
itemsCount: " Items",
|
|
emptyFolder: "This Folder is Empty"
|
|
},
|
|
notice: {
|
|
duplicateFile: "Folder already contains note with same name",
|
|
addedToSection: "Added to Space",
|
|
fileExists: "File Already Exists",
|
|
folderExists: "Folder Already Exists",
|
|
noPropertyName: "Property Name is Required",
|
|
duplicatePropertyName: "Duplicate Property Name",
|
|
newSpaceName: "Enter a name for your space",
|
|
duplicateSpaceName: "Space name already exists"
|
|
},
|
|
settings: {
|
|
sectionSidebar: "Spaces",
|
|
sectionEditor: "Maker Mode",
|
|
sectionFlow: "Flow Editor",
|
|
sectionAdvanced: "Advanced",
|
|
sectionAppearance: "Appearance",
|
|
sectionContext: "Context",
|
|
folderNoteLocation: {
|
|
name: "Folder Note Location Inside Folder",
|
|
desc: "Turn on to have folder notes inside the folder, turn off to have it outside"
|
|
},
|
|
internalLinkFlowEditor: {
|
|
name: "Open Flow Editor on Internal Link Click",
|
|
desc: "Turn on to toggle Flow Editor directly by clicking on internal links, otherwise a tooltip will be shown"
|
|
},
|
|
syncContextToFrontmatter: {
|
|
name: "Sync Context Fields to Frontmatter",
|
|
desc: "Turn on to automatically save all context fields to frontmatter fields, not just existing frontmatter fields."
|
|
},
|
|
openFileContext: {
|
|
name: "Auto Open Context Explorer",
|
|
desc: "Automatically open context explorer panel in the right panel"
|
|
},
|
|
folderNote: {
|
|
name: "Enable Folder Note",
|
|
desc: "Access the folder note in the folder page and hide the folder note from spaces"
|
|
},
|
|
activeFile: {
|
|
name: "Reveal Active File",
|
|
desc: "Automatically reveal the active file in Spaces"
|
|
},
|
|
compactMode: {
|
|
name: "Compact Mode",
|
|
desc: "Display the Spaces menu in a more compact format"
|
|
},
|
|
spaces: {
|
|
name: "Spaces",
|
|
desc: `Spaces gives you control over how you organize your files`
|
|
},
|
|
spacesStickers: {
|
|
name: "Stickers",
|
|
desc: `Use Emojis to make it easier to find your notes`
|
|
},
|
|
spacesFileExplorerDual: {
|
|
name: "Use Spaces Alongside File Explorer",
|
|
desc: "This will allow plugins that uses the File Explorer to work while using Spaces"
|
|
},
|
|
spacesDeleteOption: {
|
|
name: "Delete File Option",
|
|
desc: "Select how you want files to be deleted"
|
|
},
|
|
spacesDeleteOptions: {
|
|
permanant: "Delete Permanently",
|
|
trash: "Move to Obsidian Trash",
|
|
"system-trash": "Move to System Trash"
|
|
},
|
|
hideRibbon: {
|
|
name: "App Ribbon",
|
|
desc: `Show/hide the left menu aka. ribbon`
|
|
},
|
|
sidebarTabs: {
|
|
name: "Sidebar Tabs",
|
|
desc: `Show/hide other sidebar tabs`
|
|
},
|
|
spacesPerformance: {
|
|
name: "Spaces Performance Mode",
|
|
desc: `Turn on performance mode for Spaces, may affect scrolling appearance. Requires Restart`
|
|
},
|
|
inlineStyler: {
|
|
name: "Inline Styler",
|
|
desc: `Select text to add styling, recommended for Flow Editor`
|
|
},
|
|
inlineStylerColor: {
|
|
name: "Text and Highlight Colors \u{1F9EA}",
|
|
desc: `Select text color and highlight color, (this may change in the future because of the limitations with HTML and Obsidian)`
|
|
},
|
|
makeChar: {
|
|
name: "Make Menu Trigger",
|
|
desc: "Character to open the Make Menu"
|
|
},
|
|
mobileMakeBar: {
|
|
name: "Make Bar (Mobile)",
|
|
desc: "Replaces the mobile toolbar"
|
|
},
|
|
editorMarkSans: {
|
|
name: "Mark Sans \u{1F9EA}",
|
|
desc: `Use the editor without Markdown.`
|
|
},
|
|
editorMakerMode: {
|
|
name: "Maker Mode",
|
|
desc: `Turn on Maker Mode for a more intuitive editor experience`
|
|
},
|
|
editorMakePlacholder: {
|
|
name: "Make Menu Hint Text",
|
|
desc: `Show a hint text on how to open the Make Menu Shortcut`
|
|
},
|
|
editorMakeMenu: {
|
|
name: "Make Menu Shortcut",
|
|
desc: `Open the Make menu to quickly add content`
|
|
},
|
|
editorFlowReplace: {
|
|
name: "Flow Editor",
|
|
desc: `Open your internal links or toggle your embeds in the flow editor.`
|
|
},
|
|
editorFlowStyle: {
|
|
name: "Flow Editor Style",
|
|
desc: "Select a theme for your flow editors",
|
|
seamless: "Seamless",
|
|
classic: "Classic",
|
|
minimal: "Minimal"
|
|
}
|
|
}
|
|
}
|
|
};
|
|
this.lang = localStorage.getItem("language");
|
|
}
|
|
get texts() {
|
|
return this.all["en"];
|
|
}
|
|
};
|
|
var i18n_default = new T4().texts;
|
|
|
|
// src/utils/icons.ts
|
|
var uiIconSet = {
|
|
"mk-ui-close": `<svg xmlns="http://www.w3.org/2000/svg" width='24px' height='24px' fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor">
|
|
<path stroke-linecap="round" stroke-linejoin="round" d="M6 18L18 6M6 6l12 12" />
|
|
</svg>`,
|
|
"mk-ui-flow-hover": `<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
<path fill-rule="evenodd" clip-rule="evenodd" d="M10.7941 11.6917C11.4281 11.809 12.0857 11.7486 12.6856 11.5163C13.2858 11.2838 13.8068 10.8873 14.1773 10.3692C14.5483 9.85038 14.75 9.23465 14.75 8.6C14.75 7.96535 14.5483 7.34962 14.1773 6.83081C13.8068 6.31273 13.2858 5.91619 12.6856 5.68372C12.0857 5.45136 11.4281 5.39096 10.7941 5.50834C10.1599 5.62575 9.57072 5.91716 9.10335 6.35289C9.09233 6.36317 9.08162 6.37378 9.07124 6.3847L5.85862 9.76393C5.60897 9.99123 5.28818 10.1509 4.93287 10.2167C4.5702 10.2839 4.19486 10.2487 3.85619 10.1175C3.51778 9.98646 3.23669 9.76777 3.04283 9.49668C2.84949 9.22631 2.75 8.91434 2.75 8.6C2.75 8.28566 2.84949 7.97369 3.04283 7.70332C3.23669 7.43223 3.51778 7.21354 3.85619 7.08246C4.19486 6.95128 4.5702 6.91614 4.93287 6.98328C5.29024 7.04944 5.61268 7.21063 5.86295 7.44003L6.559 8.14747L7.62823 7.09545L6.91982 6.37545C6.91226 6.36777 6.90453 6.36025 6.89665 6.35289C6.42928 5.91716 5.8401 5.62575 5.20593 5.50834C4.57189 5.39096 3.91432 5.45136 3.31441 5.68372C2.71423 5.91619 2.19318 6.31273 1.8227 6.83081C1.4517 7.34962 1.25 7.96535 1.25 8.6C1.25 9.23465 1.4517 9.85038 1.8227 10.3692C2.19318 10.8873 2.71423 11.2838 3.31441 11.5163C3.91432 11.7486 4.57189 11.809 5.20593 11.6917C5.8401 11.5742 6.42928 11.2828 6.89665 10.8471C6.90767 10.8368 6.91838 10.8262 6.92876 10.8153L10.1414 7.43607C10.391 7.20877 10.7118 7.04906 11.0671 6.98328C11.4298 6.91614 11.8051 6.95128 12.1438 7.08246C12.4822 7.21354 12.7633 7.43223 12.9572 7.70332C13.1505 7.97369 13.25 8.28566 13.25 8.6C13.25 8.91434 13.1505 9.22631 12.9572 9.49668C12.7633 9.76777 12.4822 9.98646 12.1438 10.1175C11.8051 10.2487 11.4298 10.2839 11.0671 10.2167C10.7098 10.1506 10.3873 9.98938 10.1371 9.75998L9.441 9.05253L8.37177 10.1045L9.08018 10.8245C9.08774 10.8322 9.09547 10.8398 9.10335 10.8471C9.57072 11.2828 10.1599 11.5742 10.7941 11.6917Z" fill="currentColor"/>
|
|
</svg>`,
|
|
"mk-ui-folder": `<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor">
|
|
<path stroke-linecap="round" stroke-linejoin="round" d="M2.25 12.75V12A2.25 2.25 0 014.5 9.75h15A2.25 2.25 0 0121.75 12v.75m-8.69-6.44l-2.12-2.12a1.5 1.5 0 00-1.061-.44H4.5A2.25 2.25 0 002.25 6v12a2.25 2.25 0 002.25 2.25h15A2.25 2.25 0 0021.75 18V9a2.25 2.25 0 00-2.25-2.25h-5.379a1.5 1.5 0 01-1.06-.44z" />
|
|
</svg>`,
|
|
"mk-ui-open-link": `<svg width="16" height="16" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor">
|
|
<path stroke-linecap="round" stroke-linejoin="round" d="M13.19 8.688a4.5 4.5 0 011.242 7.244l-4.5 4.5a4.5 4.5 0 01-6.364-6.364l1.757-1.757m13.35-.622l1.757-1.757a4.5 4.5 0 00-6.364-6.364l-4.5 4.5a4.5 4.5 0 001.242 7.244" />
|
|
</svg>`,
|
|
"mk-ui-file": `<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor">
|
|
<path stroke-linecap="round" stroke-linejoin="round" d="M19.5 14.25v-2.625a3.375 3.375 0 00-3.375-3.375h-1.5A1.125 1.125 0 0113.5 7.125v-1.5a3.375 3.375 0 00-3.375-3.375H8.25m2.25 0H5.625c-.621 0-1.125.504-1.125 1.125v17.25c0 .621.504 1.125 1.125 1.125h12.75c.621 0 1.125-.504 1.125-1.125V11.25a9 9 0 00-9-9z" />
|
|
</svg>`,
|
|
"mk-ui-expand": `<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor">
|
|
<path stroke-linecap="round" stroke-linejoin="round" d="M8.25 15L12 18.75 15.75 15m-7.5-6L12 5.25 15.75 9" />
|
|
</svg>`,
|
|
"mk-ui-new-folder": `<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" ><path d="M4 20h16a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.93a2 2 0 0 1-1.66-.9l-.82-1.2A2 2 0 0 0 7.93 3H4a2 2 0 0 0-2 2v13c0 1.1.9 2 2 2Z"></path><line x1="12" y1="10" x2="12" y2="16"></line><line x1="9" y1="13" x2="15" y2="13"></line></svg>`,
|
|
"mk-ui-new-note": `<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" ><path d="M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7"></path><path d="M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z"></path></svg>`,
|
|
"mk-ui-collapse": `<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor">
|
|
<path stroke-linecap="round" stroke-linejoin="round" d="M8.25 4.5l7.5 7.5-7.5 7.5" />
|
|
</svg>`,
|
|
"mk-ui-options": `<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor">
|
|
<path stroke-linecap="round" stroke-linejoin="round" d="M6.75 12a.75.75 0 11-1.5 0 .75.75 0 011.5 0zM12.75 12a.75.75 0 11-1.5 0 .75.75 0 011.5 0zM18.75 12a.75.75 0 11-1.5 0 .75.75 0 011.5 0z" />
|
|
</svg>`,
|
|
"mk-ui-plus": `<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor">
|
|
<path stroke-linecap="round" stroke-linejoin="round" d="M12 4.5v15m7.5-7.5h-15" />
|
|
</svg>`,
|
|
"mk-ui-collapse-sm": `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor" className="w-5 h-5">
|
|
<path d="M6.3 2.841A1.5 1.5 0 004 4.11V15.89a1.5 1.5 0 002.3 1.269l9.344-5.89a1.5 1.5 0 000-2.538L6.3 2.84z" />
|
|
</svg>`,
|
|
"mk-ui-search": `<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor">
|
|
<path stroke-linecap="round" stroke-linejoin="round" d="M21 21l-5.197-5.197m0 0A7.5 7.5 0 105.196 5.196a7.5 7.5 0 0010.607 10.607z" />
|
|
</svg>
|
|
`,
|
|
"mk-ui-view-options": `<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor">
|
|
<path stroke-linecap="round" stroke-linejoin="round" d="M10.5 6h9.75M10.5 6a1.5 1.5 0 11-3 0m3 0a1.5 1.5 0 10-3 0M3.75 6H7.5m3 12h9.75m-9.75 0a1.5 1.5 0 01-3 0m3 0a1.5 1.5 0 00-3 0m-3.75 0H7.5m9-6h3.75m-3.75 0a1.5 1.5 0 01-3 0m3 0a1.5 1.5 0 00-3 0m-9.75 0h9.75" />
|
|
</svg>
|
|
`,
|
|
"mk-ui-clear": `<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor">
|
|
<path stroke-linecap="round" stroke-linejoin="round" d="M9.75 9.75l4.5 4.5m0-4.5l-4.5 4.5M21 12a9 9 0 11-18 0 9 9 0 0118 0z" />
|
|
</svg>
|
|
`,
|
|
"mk-ui-new-file": `<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor">
|
|
<path stroke-linecap="round" stroke-linejoin="round" d="M19.5 14.25v-2.625a3.375 3.375 0 00-3.375-3.375h-1.5A1.125 1.125 0 0113.5 7.125v-1.5a3.375 3.375 0 00-3.375-3.375H8.25m3.75 9v6m3-3H9m1.5-12H5.625c-.621 0-1.125.504-1.125 1.125v17.25c0 .621.504 1.125 1.125 1.125h12.75c.621 0 1.125-.504 1.125-1.125V11.25a9 9 0 00-9-9z" />
|
|
</svg>
|
|
`,
|
|
"mk-ui-blink": `<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="none" viewBox="0 0 24 24">
|
|
<path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M12 1v2.75m7.778.472-1.944 1.944M23 12h-2.75m-.472 7.778-1.944-1.944M12 20.25V23m-5.834-5.166-1.944 1.944M3.75 12H1m5.166-5.834L4.222 4.222"/>
|
|
<circle cx="12" cy="12" r="2.25" stroke="currentColor" stroke-width="1.5"/>
|
|
<circle cx="12" cy="12" r="5.25" stroke="currentColor" stroke-width="1.5"/>
|
|
</svg>
|
|
`,
|
|
"mk-ui-spaces": `<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor">
|
|
<path stroke-linecap="round" stroke-linejoin="round" d="M3.75 6A2.25 2.25 0 016 3.75h2.25A2.25 2.25 0 0110.5 6v2.25a2.25 2.25 0 01-2.25 2.25H6a2.25 2.25 0 01-2.25-2.25V6zM3.75 15.75A2.25 2.25 0 016 13.5h2.25a2.25 2.25 0 012.25 2.25V18a2.25 2.25 0 01-2.25 2.25H6A2.25 2.25 0 013.75 18v-2.25zM13.5 6a2.25 2.25 0 012.25-2.25H18A2.25 2.25 0 0120.25 6v2.25A2.25 2.25 0 0118 10.5h-2.25a2.25 2.25 0 01-2.25-2.25V6zM13.5 15.75a2.25 2.25 0 012.25-2.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-2.25A2.25 2.25 0 0113.5 18v-2.25z" />
|
|
</svg>`,
|
|
"mk-ui-tags": `<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor">
|
|
<path stroke-linecap="round" stroke-linejoin="round" d="M5.25 8.25h15m-16.5 7.5h15m-1.8-13.5l-3.9 19.5m-2.1-19.5l-3.9 19.5" />
|
|
</svg>`,
|
|
"mk-ui-handle": `<svg xmlns="http://www.w3.org/2000/svg" fill="currentColor" viewBox="0 0 24 24">
|
|
<circle cx="9" cy="7" r="1"/>
|
|
<circle cx="9" cy="12" r="1"/>
|
|
<circle cx="9" cy="17" r="1"/>
|
|
<circle cx="14" cy="7" r="1"/>
|
|
<circle cx="14" cy="12" r="1"/>
|
|
<circle cx="14" cy="17" r="1"/>
|
|
</svg>
|
|
`,
|
|
"mk-ui-new-space": `<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor">
|
|
<path stroke-linecap="round" stroke-linejoin="round" d="M13.5 16.875h3.375m0 0h3.375m-3.375 0V13.5m0 3.375v3.375M6 10.5h2.25a2.25 2.25 0 002.25-2.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v2.25A2.25 2.25 0 006 10.5zm0 9.75h2.25A2.25 2.25 0 0010.5 18v-2.25a2.25 2.25 0 00-2.25-2.25H6a2.25 2.25 0 00-2.25 2.25V18A2.25 2.25 0 006 20.25zm9.75-9.75H18a2.25 2.25 0 002.25-2.25V6A2.25 2.25 0 0018 3.75h-2.25A2.25 2.25 0 0013.5 6v2.25a2.25 2.25 0 002.25 2.25z" />
|
|
</svg>
|
|
`,
|
|
"mk-ui-file-solid": `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">
|
|
<path d="M5.625 1.5c-1.036 0-1.875.84-1.875 1.875v17.25c0 1.035.84 1.875 1.875 1.875h12.75c1.035 0 1.875-.84 1.875-1.875V12.75A3.75 3.75 0 0016.5 9h-1.875a1.875 1.875 0 01-1.875-1.875V5.25A3.75 3.75 0 009 1.5H5.625z" />
|
|
<path d="M12.971 1.816A5.23 5.23 0 0114.25 5.25v1.875c0 .207.168.375.375.375H16.5a5.23 5.23 0 013.434 1.279 9.768 9.768 0 00-6.963-6.963z" />
|
|
</svg>
|
|
`,
|
|
"mk-ui-folder-solid": `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor">
|
|
<path d="M19.5 21a3 3 0 003-3v-4.5a3 3 0 00-3-3h-15a3 3 0 00-3 3V18a3 3 0 003 3h15zM1.5 10.146V6a3 3 0 013-3h5.379a2.25 2.25 0 011.59.659l2.122 2.121c.14.141.331.22.53.22H19.5a3 3 0 013 3v1.146A4.483 4.483 0 0019.5 9h-15a4.483 4.483 0 00-3 1.146z" />
|
|
</svg>
|
|
`,
|
|
"mk-ui-sync": `<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor">
|
|
<path stroke-linecap="round" stroke-linejoin="round" d="M16.023 9.348h4.992v-.001M2.985 19.644v-4.992m0 0h4.992m-4.993 0l3.181 3.183a8.25 8.25 0 0013.803-3.7M4.031 9.865a8.25 8.25 0 0113.803-3.7l3.181 3.182m0-4.991v4.99" />
|
|
</svg>
|
|
`,
|
|
"mk-ui-stack": `<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor">
|
|
<path stroke-linecap="round" stroke-linejoin="round" d="M6.429 9.75L2.25 12l4.179 2.25m0-4.5l5.571 3 5.571-3m-11.142 0L2.25 7.5 12 2.25l9.75 5.25-4.179 2.25m0 0L21.75 12l-4.179 2.25m0 0l4.179 2.25L12 21.75 2.25 16.5l4.179-2.25m11.142 0l-5.571 3-5.571-3" />
|
|
</svg>
|
|
`,
|
|
"mk-ui-cut": `<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor">
|
|
<path stroke-linecap="round" stroke-linejoin="round" d="M7.848 8.25l1.536.887M7.848 8.25a3 3 0 11-5.196-3 3 3 0 015.196 3zm1.536.887a2.165 2.165 0 011.083 1.839c.005.351.054.695.14 1.024M9.384 9.137l2.077 1.199M7.848 15.75l1.536-.887m-1.536.887a3 3 0 11-5.196 3 3 3 0 015.196-3zm1.536-.887a2.165 2.165 0 001.083-1.838c.005-.352.054-.695.14-1.025m-1.223 2.863l2.077-1.199m0-3.328a4.323 4.323 0 012.068-1.379l5.325-1.628a4.5 4.5 0 012.48-.044l.803.215-7.794 4.5m-2.882-1.664A4.331 4.331 0 0010.607 12m3.736 0l7.794 4.5-.802.215a4.5 4.5 0 01-2.48-.043l-5.326-1.629a4.324 4.324 0 01-2.068-1.379M14.343 12l-2.882 1.664" />
|
|
</svg>
|
|
`
|
|
};
|
|
var makeIconSet = {
|
|
"mk-make-todo": `<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
<rect x="1.5" y="1.5" width="13" height="13" rx="1.5" stroke="currentColor"/>
|
|
<path d="M4.5 8L7 10.5L11.5 6" stroke="currentColor"/>
|
|
</svg>
|
|
`,
|
|
"mk-make-list": `<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
<line x1="5.5" y1="4.5" x2="14.5" y2="4.5" stroke="currentColor" stroke-linecap="round"/>
|
|
<line x1="5.5" y1="8.5" x2="14.5" y2="8.5" stroke="currentColor" stroke-linecap="round"/>
|
|
<line x1="5.5" y1="12.5" x2="14.5" y2="12.5" stroke="currentColor" stroke-linecap="round"/>
|
|
<circle cx="1.75" cy="4.5" r="0.75" fill="currentColor"/>
|
|
<circle cx="1.75" cy="8.5" r="0.75" fill="currentColor"/>
|
|
<circle cx="1.75" cy="12.5" r="0.75" fill="currentColor"/>
|
|
</svg>
|
|
`,
|
|
"mk-make-ordered": `<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
<path d="M1.50142 3.09091V6H0.886364V3.67472H0.869318L0.203125 4.09233V3.54688L0.923295 3.09091H1.50142Z" fill="currentColor"/>
|
|
<path d="M0.235807 10V9.55682L1.27132 8.59801C1.35939 8.51278 1.43325 8.43608 1.49291 8.3679C1.55351 8.29972 1.59944 8.23295 1.63069 8.16761C1.66194 8.10133 1.67757 8.02983 1.67757 7.95312C1.67757 7.8679 1.65816 7.79451 1.61933 7.73295C1.5805 7.67045 1.52747 7.62263 1.46024 7.58949C1.393 7.5554 1.31677 7.53835 1.23155 7.53835C1.14253 7.53835 1.06488 7.55634 0.998591 7.59233C0.932303 7.62831 0.881166 7.67992 0.845182 7.74716C0.809197 7.81439 0.791204 7.89441 0.791204 7.98722H0.207397C0.207397 7.79687 0.250485 7.63163 0.336659 7.49148C0.422833 7.35133 0.543572 7.2429 0.698875 7.16619C0.854178 7.08949 1.03316 7.05114 1.23581 7.05114C1.44414 7.05114 1.62548 7.08807 1.77984 7.16193C1.93514 7.23485 2.05588 7.33617 2.14206 7.46591C2.22823 7.59564 2.27132 7.74432 2.27132 7.91193C2.27132 8.02178 2.24954 8.13021 2.20598 8.23722C2.16336 8.34422 2.08713 8.46307 1.97728 8.59375C1.86744 8.72348 1.71261 8.87926 1.5128 9.06108L1.08808 9.47727V9.49716H2.30967V10H0.235807Z" fill="currentColor"/>
|
|
<path d="M1.31109 14.0398C1.09897 14.0398 0.910049 14.0033 0.744329 13.9304C0.579557 13.8565 0.449348 13.7552 0.353704 13.6264C0.259007 13.4967 0.210238 13.3471 0.207397 13.1776H0.826716C0.830504 13.2486 0.853704 13.3111 0.896318 13.3651C0.939879 13.4181 0.997644 13.4593 1.06961 13.4886C1.14158 13.518 1.22255 13.5327 1.31251 13.5327C1.40626 13.5327 1.48912 13.5161 1.56109 13.483C1.63306 13.4498 1.68941 13.4039 1.73012 13.3452C1.77084 13.2865 1.7912 13.2187 1.7912 13.142C1.7912 13.0644 1.76942 12.9957 1.72586 12.9361C1.68325 12.8755 1.6217 12.8281 1.5412 12.794C1.46166 12.7599 1.36696 12.7429 1.25711 12.7429H0.985807V12.2912H1.25711C1.34992 12.2912 1.43183 12.2751 1.50285 12.2429C1.57482 12.2107 1.63069 12.1662 1.67047 12.1094C1.71024 12.0516 1.73012 11.9844 1.73012 11.9077C1.73012 11.8348 1.71261 11.7708 1.67757 11.7159C1.64348 11.66 1.59518 11.6165 1.53268 11.5852C1.47113 11.554 1.39916 11.5384 1.31677 11.5384C1.23344 11.5384 1.15721 11.5535 1.08808 11.5838C1.01895 11.6132 0.963553 11.6553 0.921886 11.7102C0.880219 11.7652 0.857966 11.8295 0.855125 11.9034H0.265636C0.268477 11.7358 0.316299 11.5881 0.409102 11.4602C0.501905 11.3324 0.626905 11.2325 0.784102 11.1605C0.942246 11.0876 1.12075 11.0511 1.31961 11.0511C1.52037 11.0511 1.69603 11.0876 1.8466 11.1605C1.99717 11.2334 2.11412 11.3319 2.19745 11.456C2.28173 11.5791 2.3234 11.7173 2.32245 11.8707C2.3234 12.0336 2.27274 12.1695 2.17047 12.2784C2.06914 12.3873 1.93704 12.4564 1.77416 12.4858V12.5085C1.98817 12.536 2.15105 12.6103 2.2628 12.7315C2.37548 12.8518 2.43136 13.0024 2.43041 13.1832C2.43136 13.349 2.38353 13.4962 2.28694 13.625C2.1913 13.7538 2.0592 13.8551 1.89064 13.929C1.72208 14.0028 1.52889 14.0398 1.31109 14.0398Z" fill="currentColor"/>
|
|
<line x1="5.5" y1="4.5" x2="14.5" y2="4.5" stroke="currentColor" stroke-linecap="round"/>
|
|
<line x1="5.5" y1="8.5" x2="14.5" y2="8.5" stroke="currentColor" stroke-linecap="round"/>
|
|
<line x1="5.5" y1="12.5" x2="14.5" y2="12.5" stroke="currentColor" stroke-linecap="round"/>
|
|
</svg>
|
|
`,
|
|
"mk-make-h1": `<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
<path d="M2.26278 12H0.285507L3.29829 3.27273H5.67613L8.68466 12H6.70738L4.5213 5.26705H4.45312L2.26278 12ZM2.1392 8.5696H6.80966V10.0099H2.1392V8.5696Z" fill="currentColor"/>
|
|
<path d="M11.5675 12.1236C11.1499 12.1236 10.7777 12.0511 10.451 11.9062C10.1243 11.7585 9.86576 11.5412 9.67542 11.2543C9.48792 10.9645 9.39417 10.6037 9.39417 10.1719C9.39417 9.80824 9.46093 9.50284 9.59446 9.25568C9.72798 9.00852 9.9098 8.80966 10.1399 8.65909C10.37 8.50852 10.6314 8.39489 10.924 8.31818C11.2195 8.24148 11.5291 8.1875 11.853 8.15625C12.2337 8.11648 12.5405 8.07955 12.7734 8.04545C13.0064 8.00852 13.1754 7.95455 13.2805 7.88352C13.3856 7.8125 13.4382 7.70739 13.4382 7.56818V7.54261C13.4382 7.27273 13.353 7.06392 13.1825 6.91619C13.0149 6.76847 12.7763 6.6946 12.4666 6.6946C12.1399 6.6946 11.88 6.76705 11.6868 6.91193C11.4936 7.05398 11.3658 7.23295 11.3033 7.44886L9.62429 7.3125C9.70951 6.91477 9.87713 6.57102 10.1271 6.28125C10.3771 5.98864 10.6996 5.7642 11.0945 5.60795C11.4922 5.44886 11.9524 5.36932 12.4751 5.36932C12.8388 5.36932 13.1868 5.41193 13.5192 5.49716C13.8544 5.58239 14.1513 5.71449 14.4098 5.89347C14.6712 6.07244 14.8771 6.30256 15.0277 6.58381C15.1783 6.86222 15.2535 7.19602 15.2535 7.58523V12H13.532V11.0923H13.4808C13.3757 11.2969 13.2351 11.4773 13.0589 11.6335C12.8828 11.7869 12.6712 11.9077 12.424 11.9957C12.1768 12.081 11.8913 12.1236 11.5675 12.1236ZM12.0874 10.8707C12.3544 10.8707 12.5902 10.8182 12.7947 10.7131C12.9993 10.6051 13.1598 10.4602 13.2763 10.2784C13.3928 10.0966 13.451 9.89062 13.451 9.66051V8.96591C13.3942 9.00284 13.316 9.03693 13.2166 9.06818C13.12 9.09659 13.0106 9.12358 12.8885 9.14915C12.7663 9.17188 12.6442 9.19318 12.522 9.21307C12.3999 9.23011 12.2891 9.24574 12.1896 9.25994C11.9766 9.29119 11.7905 9.34091 11.6314 9.40909C11.4723 9.47727 11.3487 9.5696 11.2606 9.68608C11.1726 9.79972 11.1285 9.94176 11.1285 10.1122C11.1285 10.3594 11.218 10.5483 11.397 10.679C11.5788 10.8068 11.8089 10.8707 12.0874 10.8707Z" fill="currentColor"/>
|
|
</svg>
|
|
`,
|
|
"mk-make-h2": `<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
<path d="M2.88566 12H1.23793L3.74858 4.72727H5.73012L8.23722 12H6.58949L4.76776 6.3892H4.71094L2.88566 12ZM2.78267 9.14133H6.67472V10.3416H2.78267V9.14133Z" fill="currentColor"/>
|
|
<path d="M10.6396 12.103C10.2916 12.103 9.98142 12.0426 9.70917 11.9219C9.43691 11.7988 9.22148 11.6177 9.06286 11.3786C8.90661 11.1371 8.82848 10.8364 8.82848 10.4766C8.82848 10.1735 8.88412 9.91903 8.99539 9.71307C9.10666 9.5071 9.25817 9.34138 9.44993 9.21591C9.64169 9.09043 9.8595 8.99574 10.1033 8.93182C10.3496 8.8679 10.6076 8.82292 10.8775 8.79687C11.1947 8.76373 11.4504 8.73295 11.6445 8.70455C11.8387 8.67377 11.9795 8.62879 12.0671 8.5696C12.1547 8.51042 12.1985 8.42282 12.1985 8.30682V8.28551C12.1985 8.06061 12.1275 7.8866 11.9854 7.76349C11.8458 7.64039 11.6469 7.57883 11.3889 7.57883C11.1166 7.57883 10.9 7.6392 10.739 7.75994C10.578 7.87831 10.4715 8.02746 10.4194 8.20739L9.02025 8.09375C9.09127 7.76231 9.23095 7.47585 9.43928 7.23437C9.64761 6.99053 9.91632 6.8035 10.2454 6.67329C10.5768 6.54072 10.9603 6.47443 11.396 6.47443C11.699 6.47443 11.989 6.50994 12.266 6.58097C12.5453 6.65199 12.7927 6.76207 13.0082 6.91122C13.226 7.06037 13.3976 7.25213 13.5231 7.48651C13.6486 7.71851 13.7113 7.99668 13.7113 8.32102V12H12.2766V11.2436H12.234C12.1464 11.4141 12.0292 11.5644 11.8825 11.6946C11.7357 11.8224 11.5593 11.9231 11.3533 11.9964C11.1474 12.0675 10.9095 12.103 10.6396 12.103ZM11.0728 11.0589C11.2953 11.0589 11.4918 11.0152 11.6623 10.9276C11.8327 10.8376 11.9665 10.7169 12.0636 10.5653C12.1606 10.4138 12.2092 10.2422 12.2092 10.0504V9.47159C12.1618 9.50237 12.0967 9.53078 12.0139 9.55682C11.9334 9.58049 11.8422 9.60298 11.7404 9.62429C11.6386 9.64323 11.5368 9.66098 11.435 9.67756C11.3332 9.69176 11.2409 9.70478 11.158 9.71662C10.9805 9.74266 10.8254 9.78409 10.6928 9.84091C10.5603 9.89773 10.4573 9.97467 10.3839 10.0717C10.3105 10.1664 10.2738 10.2848 10.2738 10.4268C10.2738 10.6328 10.3484 10.7902 10.4975 10.8991C10.649 11.0057 10.8408 11.0589 11.0728 11.0589Z" fill="currentColor"/>
|
|
</svg>
|
|
`,
|
|
"mk-make-h3": `<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
<path d="M3.17897 12H2.25568L4.92613 4.72727H5.83522L8.50568 12H7.58238L5.40909 5.87784H5.35227L3.17897 12ZM3.51988 9.15909H7.24147V9.94034H3.51988V9.15909Z" fill="currentColor"/>
|
|
<path d="M11.13 12.1278C10.7843 12.1278 10.4706 12.0627 10.1889 11.9325C9.90719 11.8 9.68347 11.6094 9.51775 11.3608C9.35203 11.1098 9.26917 10.8068 9.26917 10.4517C9.26917 10.1392 9.33072 9.88589 9.45383 9.69176C9.57694 9.49526 9.74147 9.34138 9.94744 9.23011C10.1534 9.11884 10.3807 9.03598 10.6293 8.98153C10.8802 8.92472 11.1323 8.87973 11.3856 8.84659C11.7171 8.80398 11.9858 8.77202 12.1918 8.75071C12.4001 8.72704 12.5516 8.68797 12.6463 8.63352C12.7434 8.57907 12.7919 8.48437 12.7919 8.34943V8.32102C12.7919 7.97064 12.696 7.69839 12.5043 7.50426C12.3149 7.31013 12.0272 7.21307 11.6413 7.21307C11.2412 7.21307 10.9276 7.30066 10.7003 7.47585C10.473 7.65104 10.3132 7.83807 10.2209 8.03693L9.42542 7.75284C9.56747 7.4214 9.75686 7.16335 9.9936 6.97869C10.2327 6.79167 10.4931 6.66146 10.7749 6.58807C11.0589 6.51231 11.3383 6.47443 11.6129 6.47443C11.7881 6.47443 11.9893 6.49574 12.2166 6.53835C12.4463 6.5786 12.6676 6.66264 12.8807 6.79048C13.0961 6.91832 13.2749 7.11127 13.4169 7.36932C13.5589 7.62737 13.63 7.97301 13.63 8.40625V12H12.7919V11.2614H12.7493C12.6925 11.3797 12.5978 11.5064 12.4652 11.6413C12.3326 11.7763 12.1562 11.8911 11.9361 11.9858C11.7159 12.0805 11.4472 12.1278 11.13 12.1278ZM11.2578 11.375C11.5892 11.375 11.8686 11.3099 12.0959 11.1797C12.3255 11.0495 12.4983 10.8814 12.6143 10.6754C12.7327 10.4695 12.7919 10.2528 12.7919 10.0256V9.25852C12.7564 9.30114 12.6783 9.3402 12.5575 9.37571C12.4392 9.40885 12.3018 9.43845 12.1456 9.46449C11.9917 9.48816 11.8414 9.50947 11.6946 9.52841C11.5502 9.54498 11.433 9.55918 11.343 9.57102C11.1252 9.59943 10.9216 9.6456 10.7322 9.70952C10.5452 9.77107 10.3937 9.86458 10.2777 9.99006C10.1641 10.1132 10.1072 10.2812 10.1072 10.4943C10.1072 10.7855 10.215 11.0057 10.4304 11.1548C10.6482 11.3016 10.924 11.375 11.2578 11.375Z" fill="currentColor"/>
|
|
</svg>
|
|
`,
|
|
"mk-make-quote": `<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
<line x1="1.75" y1="2.75" x2="1.75" y2="12.25" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"/>
|
|
<line opacity="0.3" x1="5.5" y1="4.5" x2="13.5" y2="4.5" stroke="currentColor" stroke-linecap="round"/>
|
|
<line opacity="0.3" x1="5.5" y1="7.5" x2="11.5" y2="7.5" stroke="currentColor" stroke-linecap="round"/>
|
|
<line opacity="0.3" x1="5.5" y1="10.5" x2="9.5" y2="10.5" stroke="currentColor" stroke-linecap="round"/>
|
|
</svg>
|
|
`,
|
|
"mk-make-hr": `<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
<line x1="0.75" y1="8.25" x2="15.25" y2="8.25" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"/>
|
|
</svg>
|
|
`,
|
|
"mk-make-link": `<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
<path d="M9.25144 6.74857C8.75136 6.24864 8.07321 5.9678 7.3661 5.9678C6.659 5.9678 5.98084 6.24864 5.48077 6.74857L2.8141 9.41523C2.55941 9.66122 2.35626 9.95548 2.2165 10.2808C2.07674 10.6062 2.00318 10.9561 2.0001 11.3102C1.99702 11.6642 2.06449 12.0154 2.19858 12.3431C2.33266 12.6708 2.53067 12.9686 2.78105 13.219C3.03143 13.4693 3.32917 13.6673 3.65689 13.8014C3.98461 13.9355 4.33576 14.003 4.68984 13.9999C5.04392 13.9968 5.39384 13.9233 5.71918 13.7835C6.04452 13.6437 6.33878 13.4406 6.58477 13.1859L7.31944 12.4519M6.8141 9.1859C7.31418 9.68582 7.99233 9.96666 8.69944 9.96666C9.40654 9.96666 10.0847 9.68582 10.5848 9.1859L13.2514 6.51923C13.7372 6.01629 14.006 5.34269 13.9999 4.6435C13.9938 3.9443 13.7134 3.27547 13.219 2.78105C12.7245 2.28663 12.0557 2.00618 11.3565 2.0001C10.6573 1.99403 9.98371 2.26281 9.48077 2.74856L8.74743 3.4819" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
|
|
</svg>
|
|
`,
|
|
"mk-make-image": `<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
<rect x="1.5" y="2.5" width="13" height="10" rx="1.5" stroke="currentColor"/>
|
|
<path d="M4.2 9.06667C4.6 8.53333 5.4 8.53333 5.8 9.06667L8 12H2L4.2 9.06667Z" fill="currentColor"/>
|
|
<path d="M9.16795 7.24808C9.56377 6.65434 10.4362 6.65434 10.8321 7.24808L14 12H6L9.16795 7.24808Z" fill="currentColor"/>
|
|
<circle cx="4.5" cy="5.5" r="1.5" fill="currentColor"/>
|
|
</svg>
|
|
`,
|
|
"mk-make-codeblock": `<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
<path d="M1 9.01852V7.98148L5 5V6.41204L2.04819 8.48148L2.0753 8.39815V8.59722L2.04819 8.51852L5 10.5833V12L1 9.01852Z" fill="currentColor"/>
|
|
<path d="M15 9.01852V7.98148L11 5V6.41204L13.9518 8.48148L13.9247 8.39815V8.59722L13.9518 8.51852L11 10.5833V12L15 9.01852Z" fill="currentColor"/>
|
|
<path d="M10 3L7.1521 14H6L8.8479 3H10Z" fill="currentColor"/>
|
|
</svg>
|
|
`,
|
|
"mk-make-callout": `<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
<rect x="3.5" y="6.5" width="9" height="3" stroke="currentColor"/>
|
|
<line x1="4.5" y1="3.5" x2="11.5" y2="3.5" stroke="#B2B2B2" stroke-linecap="round"/>
|
|
<line x1="4.5" y1="12.5" x2="11.5" y2="12.5" stroke="#B2B2B2" stroke-linecap="round"/>
|
|
</svg>`,
|
|
"mk-make-note": `<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
<path d="M7.5 11C6.11929 11 5 9.88071 5 8.5C5 7.11929 6.11929 6 7.5 6" stroke="currentColor" stroke-width="1.5"/>
|
|
<path d="M9 6C10.3807 6 11.5 7.11929 11.5 8.5C11.5 9.88071 10.3807 11 9 11" stroke="currentColor" stroke-width="1.5"/>
|
|
<line x1="1" y1="8.25" x2="5" y2="8.25" stroke="currentColor" stroke-width="1.5"/>
|
|
<line x1="11" y1="8.25" x2="15" y2="8.25" stroke="currentColor" stroke-width="1.5"/>
|
|
</svg>
|
|
`,
|
|
"mk-make-flow": `<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
<path fill-rule="evenodd" clip-rule="evenodd" d="M10.7941 11.6917C11.4281 11.809 12.0857 11.7486 12.6856 11.5163C13.2858 11.2838 13.8068 10.8873 14.1773 10.3692C14.5483 9.85038 14.75 9.23465 14.75 8.6C14.75 7.96535 14.5483 7.34962 14.1773 6.83081C13.8068 6.31273 13.2858 5.91619 12.6856 5.68372C12.0857 5.45136 11.4281 5.39096 10.7941 5.50834C10.1599 5.62575 9.57072 5.91716 9.10335 6.35289C9.09233 6.36317 9.08162 6.37378 9.07124 6.3847L5.85862 9.76393C5.60897 9.99123 5.28818 10.1509 4.93287 10.2167C4.5702 10.2839 4.19486 10.2487 3.85619 10.1175C3.51778 9.98646 3.23669 9.76777 3.04283 9.49668C2.84949 9.22631 2.75 8.91434 2.75 8.6C2.75 8.28566 2.84949 7.97369 3.04283 7.70332C3.23669 7.43223 3.51778 7.21354 3.85619 7.08246C4.19486 6.95128 4.5702 6.91614 4.93287 6.98328C5.29024 7.04944 5.61268 7.21063 5.86295 7.44003L6.559 8.14747L7.62823 7.09545L6.91982 6.37545C6.91226 6.36777 6.90453 6.36025 6.89665 6.35289C6.42928 5.91716 5.8401 5.62575 5.20593 5.50834C4.57189 5.39096 3.91432 5.45136 3.31441 5.68372C2.71423 5.91619 2.19318 6.31273 1.8227 6.83081C1.4517 7.34962 1.25 7.96535 1.25 8.6C1.25 9.23465 1.4517 9.85038 1.8227 10.3692C2.19318 10.8873 2.71423 11.2838 3.31441 11.5163C3.91432 11.7486 4.57189 11.809 5.20593 11.6917C5.8401 11.5742 6.42928 11.2828 6.89665 10.8471C6.90767 10.8368 6.91838 10.8262 6.92876 10.8153L10.1414 7.43607C10.391 7.20877 10.7118 7.04906 11.0671 6.98328C11.4298 6.91614 11.8051 6.95128 12.1438 7.08246C12.4822 7.21354 12.7633 7.43223 12.9572 7.70332C13.1505 7.97369 13.25 8.28566 13.25 8.6C13.25 8.91434 13.1505 9.22631 12.9572 9.49668C12.7633 9.76777 12.4822 9.98646 12.1438 10.1175C11.8051 10.2487 11.4298 10.2839 11.0671 10.2167C10.7098 10.1506 10.3873 9.98938 10.1371 9.75998L9.441 9.05253L8.37177 10.1045L9.08018 10.8245C9.08774 10.8322 9.09547 10.8398 9.10335 10.8471C9.57072 11.2828 10.1599 11.5742 10.7941 11.6917Z" fill="currentColor"/>
|
|
</svg>
|
|
`,
|
|
"mk-make-tag": `<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
<path d="M7.81747 13L9.48792 2.81818H10.6811L9.01065 13H7.81747ZM3.2088 10.2756L3.40269 9.08239H11.1186L10.9247 10.2756H3.2088ZM4.23792 13L5.90838 2.81818H7.10156L5.4311 13H4.23792ZM3.80042 6.7358L3.99431 5.54261H11.7102L11.5163 6.7358H3.80042Z" fill="currentColor"/>
|
|
</svg>
|
|
`,
|
|
"mk-make-table": `<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
<path fill-rule="evenodd" clip-rule="evenodd" d="M12 3H4C3.44772 3 3 3.44772 3 4V12C3 12.5523 3.44772 13 4 13H12C12.5523 13 13 12.5523 13 12V4C13 3.44772 12.5523 3 12 3ZM4 2C2.89543 2 2 2.89543 2 4V12C2 13.1046 2.89543 14 4 14H12C13.1046 14 14 13.1046 14 12V4C14 2.89543 13.1046 2 12 2H4Z" fill="currentColor"/>
|
|
<path fill-rule="evenodd" clip-rule="evenodd" d="M14 6H2V5H14V6Z" fill="currentColor"/>
|
|
<path fill-rule="evenodd" clip-rule="evenodd" d="M7 2L7 13L6 13L6 2L7 2Z" fill="currentColor"/>
|
|
</svg>
|
|
`
|
|
};
|
|
var mkLogo = `<svg xmlns="http://www.w3.org/2000/svg" width="100" height="100" fill="currentColor" viewBox="0 0 100 100">
|
|
<path d="m51.39 53.148 36.687-38.355v73.284H11.923V14.793L48.61 53.148 50 54.6l1.39-1.453Z"/>
|
|
</svg>
|
|
`;
|
|
var markIconSet = {
|
|
"mk-mark-strong": `<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
<path d="M7 17.6364V6H11.8523C12.7235 6 13.4527 6.12311 14.0398 6.36932C14.6307 6.61553 15.0739 6.96023 15.3693 7.40341C15.6686 7.84659 15.8182 8.35985 15.8182 8.94318C15.8182 9.38636 15.7254 9.7822 15.5398 10.1307C15.3542 10.4754 15.0985 10.7614 14.7727 10.9886C14.447 11.2159 14.0701 11.375 13.642 11.4659V11.5795C14.1117 11.6023 14.5455 11.7292 14.9432 11.9602C15.3447 12.1913 15.6667 12.5133 15.9091 12.9261C16.1515 13.3352 16.2727 13.8201 16.2727 14.3807C16.2727 15.0057 16.1136 15.5644 15.7955 16.0568C15.4773 16.5455 15.017 16.9318 14.4148 17.2159C13.8125 17.4962 13.0814 17.6364 12.2216 17.6364H7ZM9.8125 15.3693H11.5511C12.161 15.3693 12.6098 15.2538 12.8977 15.0227C13.1894 14.7917 13.3352 14.4697 13.3352 14.0568C13.3352 13.7576 13.2652 13.5 13.125 13.2841C12.9848 13.0644 12.786 12.8958 12.5284 12.7784C12.2708 12.6572 11.9621 12.5966 11.6023 12.5966H9.8125V15.3693ZM9.8125 10.7841H11.3693C11.6761 10.7841 11.9489 10.733 12.1875 10.6307C12.4261 10.5284 12.6117 10.3807 12.7443 10.1875C12.8807 9.99432 12.9489 9.76136 12.9489 9.48864C12.9489 9.09848 12.8106 8.79167 12.5341 8.56818C12.2576 8.3447 11.8845 8.23295 11.4148 8.23295H9.8125V10.7841Z" fill="currentColor"/>
|
|
</svg>
|
|
`,
|
|
"mk-mark-em": `<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
<path d="M9.76 15.888L11.424 7.52C11.4773 7.28533 11.392 7.13067 11.168 7.056C10.9547 6.98133 10.6667 6.944 10.304 6.944H10.08L10.288 6H15.184L14.976 6.944H14.752C14.4107 6.944 14.112 6.976 13.856 7.04C13.6107 7.104 13.4667 7.248 13.424 7.472L11.76 15.84C11.7173 16.0747 11.8027 16.2293 12.016 16.304C12.2293 16.3787 12.5173 16.416 12.88 16.416H13.104L12.896 17.36H8L8.208 16.416H8.432C8.77333 16.416 9.06667 16.384 9.312 16.32C9.568 16.2453 9.71733 16.1013 9.76 15.888Z" fill="currentColor"/>
|
|
</svg>`,
|
|
"mk-mark-strikethrough": `<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
<path d="M14.625 9.21591C14.5644 8.67803 14.3144 8.26136 13.875 7.96591C13.4356 7.66667 12.8826 7.51705 12.2159 7.51705C11.7386 7.51705 11.3258 7.5928 10.9773 7.74432C10.6288 7.89205 10.358 8.09659 10.1648 8.35795C9.97538 8.61553 9.88068 8.90909 9.88068 9.23864C9.88068 9.51515 9.94508 9.75379 10.0739 9.95455C10.2064 10.1553 10.3788 10.3239 10.5909 10.4602C10.8068 10.5928 11.0379 10.7045 11.2841 10.7955C11.5303 10.8826 11.767 10.9545 11.9943 11.0114L13.1307 11.3068C13.5019 11.3977 13.8826 11.5208 14.2727 11.6761C14.6629 11.8314 15.0246 12.036 15.358 12.2898C15.6913 12.5436 15.9602 12.858 16.1648 13.233C16.3731 13.608 16.4773 14.0568 16.4773 14.5795C16.4773 15.2386 16.3068 15.8239 15.9659 16.3352C15.6288 16.8466 15.1383 17.25 14.4943 17.5455C13.8542 17.8409 13.0795 17.9886 12.1705 17.9886C11.2992 17.9886 10.5455 17.8504 9.90909 17.5739C9.27273 17.2973 8.77462 16.9053 8.41477 16.3977C8.05492 15.8864 7.85606 15.2803 7.81818 14.5795H9.57955C9.61364 15 9.75 15.3504 9.98864 15.6307C10.2311 15.9072 10.5398 16.1136 10.9148 16.25C11.2936 16.3826 11.7083 16.4489 12.1591 16.4489C12.6553 16.4489 13.0966 16.3712 13.483 16.2159C13.8731 16.0568 14.1799 15.8371 14.4034 15.5568C14.6269 15.2727 14.7386 14.9413 14.7386 14.5625C14.7386 14.2178 14.6402 13.9356 14.4432 13.7159C14.25 13.4962 13.9867 13.3144 13.6534 13.1705C13.3239 13.0265 12.9508 12.8996 12.5341 12.7898L11.1591 12.4148C10.2273 12.161 9.48864 11.7879 8.94318 11.2955C8.40152 10.803 8.13068 10.1515 8.13068 9.34091C8.13068 8.67045 8.3125 8.08523 8.67614 7.58523C9.03977 7.08523 9.5322 6.69697 10.1534 6.42045C10.7746 6.14015 11.4754 6 12.2557 6C13.0436 6 13.7386 6.13826 14.3409 6.41477C14.947 6.69129 15.4242 7.07197 15.7727 7.55682C16.1212 8.03788 16.303 8.59091 16.3182 9.21591H14.625Z" fill="currentColor"/>
|
|
<path d="M7 12.5568H17.2955V13.6477H7V12.5568Z" fill="currentColor"/>
|
|
</svg>
|
|
`,
|
|
"mk-mark-code": `<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
<path d="M3 13.1667V11.8333L8 8V9.81548L4.31024 12.4762L4.34413 12.369V12.625L4.31024 12.5238L8 15.1786V17L3 13.1667Z" fill="currentColor"/>
|
|
<path d="M21 13.1667V11.8333L16 8V9.81548L19.6898 12.4762L19.6559 12.369V12.625L19.6898 12.5238L16 15.1786V17L21 13.1667Z" fill="currentColor"/>
|
|
<path d="M14.5739 5.81818L10.8239 19.75H9.30682L13.0568 5.81818H14.5739Z" fill="currentColor"/>
|
|
</svg>
|
|
`,
|
|
"mk-mark-link": `<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
<path d="M13.2514 10.7486C12.7514 10.2486 12.0732 9.9678 11.3661 9.9678C10.659 9.9678 9.98084 10.2486 9.48077 10.7486L6.8141 13.4152C6.55941 13.6612 6.35626 13.9555 6.2165 14.2808C6.07674 14.6062 6.00318 14.9561 6.0001 15.3102C5.99702 15.6642 6.06449 16.0154 6.19858 16.3431C6.33266 16.6708 6.53067 16.9686 6.78105 17.219C7.03143 17.4693 7.32917 17.6673 7.65689 17.8014C7.98461 17.9355 8.33576 18.003 8.68984 17.9999C9.04392 17.9968 9.39384 17.9233 9.71918 17.7835C10.0445 17.6437 10.3388 17.4406 10.5848 17.1859L11.3194 16.4519M10.8141 13.1859C11.3142 13.6858 11.9923 13.9667 12.6994 13.9667C13.4065 13.9667 14.0847 13.6858 14.5848 13.1859L17.2514 10.5192C17.7372 10.0163 18.006 9.34269 17.9999 8.6435C17.9938 7.9443 17.7134 7.27547 17.219 6.78105C16.7245 6.28663 16.0557 6.00618 15.3565 6.0001C14.6573 5.99403 13.9837 6.26281 13.4808 6.74856L12.7474 7.4819" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
|
|
</svg>`,
|
|
"mk-mark-blocklink": `<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
<path d="M11.5 15C10.1193 15 9 13.8807 9 12.5C9 11.1193 10.1193 10 11.5 10" stroke="currentColor" stroke-width="1.5"/>
|
|
<path d="M13 10C14.3807 10 15.5 11.1193 15.5 12.5C15.5 13.8807 14.3807 15 13 15" stroke="currentColor" stroke-width="1.5"/>
|
|
<line x1="4" y1="12.25" x2="9" y2="12.25" stroke="currentColor" stroke-width="1.5"/>
|
|
<line x1="15" y1="12.25" x2="20" y2="12.25" stroke="currentColor" stroke-width="1.5"/>
|
|
</svg>`,
|
|
"mk-mark-highlight": `<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
<g opacity="0.2">
|
|
<path fill-rule="evenodd" clip-rule="evenodd" d="M18 21H6V19H18V20Z" fill="currentColor"/>
|
|
</g>
|
|
<path fill-rule="evenodd" clip-rule="evenodd" d="M9.43302 10.7498L9.2698 13.9711L11.3368 15.3582L14.256 13.9863L9.43302 10.7498ZM13.7828 5.58248L9.43305 10.7498L14.256 13.9863L17.3893 8.00268C17.626 7.5506 17.4844 6.99279 17.0606 6.70843L15.1051 5.39611C14.6813 5.11175 14.1114 5.19208 13.7828 5.58248Z" fill="currentColor"/>
|
|
<path d="M7.65151 16.3826L9.0386 14.3156L11.1056 15.7027L10.412 16.7362L7.65151 16.3826Z" fill="currentColor"/>
|
|
</svg>`,
|
|
"mk-make-attach": `<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="currentColor" viewBox="0 0 24 24">
|
|
<path fill-rule="evenodd" d="M17 8H7a1 1 0 0 0-1 1v7a1 1 0 0 0 1 1h10a1 1 0 0 0 1-1V9a1 1 0 0 0-1-1ZM7 7a2 2 0 0 0-2 2v7a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V9a2 2 0 0 0-2-2H7Z" clip-rule="evenodd"/>
|
|
<path d="M8.2 14.067a1 1 0 0 1 1.6 0L12 17H6l2.2-2.933Z"/>
|
|
<path d="M13.168 12.248a1 1 0 0 1 1.664 0L18 17h-8l3.168-4.752Z"/>
|
|
<circle cx="8.5" cy="10.5" r="1.5"/>
|
|
</svg>`,
|
|
"mk-make-keyboard": `<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="currentColor" viewBox="0 0 24 24">
|
|
<path fill-rule="evenodd" d="M8.5 10a.5.5 0 0 1 .5-.5h.001a.5.5 0 0 1 0 1H9a.5.5 0 0 1-.5-.5Zm2 0a.5.5 0 0 1 .5-.5h.001a.5.5 0 0 1 0 1H11a.5.5 0 0 1-.5-.5Zm2 0a.5.5 0 0 1 .5-.5h.001a.5.5 0 0 1 0 1H13a.5.5 0 0 1-.5-.5Zm2 0a.5.5 0 0 1 .5-.5h.001a.5.5 0 0 1 0 1H15a.5.5 0 0 1-.5-.5Zm-5 2a.5.5 0 0 1 .5-.5h.001a.5.5 0 0 1 0 1H10a.5.5 0 0 1-.5-.5Zm2 0a.5.5 0 0 1 .5-.5h.001a.5.5 0 0 1 0 1H12a.5.5 0 0 1-.5-.5Zm2 0a.5.5 0 0 1 .5-.5h.001a.5.5 0 0 1 0 1H14a.5.5 0 0 1-.5-.5Zm.035 1.5H9.5a.5.5 0 0 0 0 1h3.626c.091-.355.23-.69.41-1Z" clip-rule="evenodd"/>
|
|
<path d="M17 13.5v3m-1.5-1L17 17l1.5-1.5"/>
|
|
<path fill-rule="evenodd" d="M7.5 9a.5.5 0 0 1 .5-.5h8a.5.5 0 0 1 .5.5v2.53a4.045 4.045 0 0 1 1 0V9A1.5 1.5 0 0 0 16 7.5H8A1.5 1.5 0 0 0 6.5 9v6A1.5 1.5 0 0 0 8 16.5h5.126a4.01 4.01 0 0 1-.126-1H8a.5.5 0 0 1-.5-.5V9Z" clip-rule="evenodd"/>
|
|
</svg>`,
|
|
"mk-make-slash": `<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="currentColor" viewBox="0 0 24 24">
|
|
<path d="M9.574 4.818 5.824 18.75H4.307l3.75-13.932h1.517Z" opacity=".3"/>
|
|
<path fill-rule="evenodd" d="M10 12.5a.5.5 0 0 1 .5-.5h8a.5.5 0 0 1 0 1h-8a.5.5 0 0 1-.5-.5Z" clip-rule="evenodd"/>
|
|
<path fill-rule="evenodd" d="M14.5 8a.5.5 0 0 1 .5.5v8a.5.5 0 0 1-1 0v-8a.5.5 0 0 1 .5-.5Z" clip-rule="evenodd"/>
|
|
</svg>`,
|
|
"mk-make-style": `<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="currentColor" viewBox="0 0 24 24">
|
|
<path d="M7.648 15.273H6L8.51 8h1.982L13 15.273h-1.647L9.53 9.662h-.057l-1.825 5.61Zm-.103-2.859h3.892v1.2H7.545v-1.2Zm8.315 2.989c-.345 0-.659-.065-.94-.195a1.615 1.615 0 0 1-.671-.572c-.166-.25-.249-.554-.249-.909 0-.312.062-.566.185-.76a1.3 1.3 0 0 1 .493-.461c.206-.112.433-.194.682-.249.251-.057.503-.102.756-.135.332-.043.6-.074.807-.096.208-.023.36-.063.454-.117.097-.054.146-.15.146-.284v-.028c0-.35-.096-.623-.288-.817-.19-.194-.477-.291-.863-.291-.4 0-.714.087-.94.262a1.553 1.553 0 0 0-.48.562l-.796-.285a1.91 1.91 0 0 1 .568-.774c.24-.187.5-.317.782-.39a3.23 3.23 0 0 1 .838-.114c.175 0 .376.021.603.064.23.04.451.124.665.252.215.128.394.32.536.579.142.258.213.604.213 1.037v3.594h-.838v-.74h-.043a1.473 1.473 0 0 1-.284.38 1.64 1.64 0 0 1-.53.345c-.22.095-.488.142-.805.142Zm.129-.752c.331 0 .61-.066.838-.196a1.33 1.33 0 0 0 .696-1.154v-.767c-.036.043-.114.082-.235.117a3.98 3.98 0 0 1-.412.09 19.433 19.433 0 0 1-.802.106 3.203 3.203 0 0 0-.61.138 1.053 1.053 0 0 0-.456.28c-.113.124-.17.292-.17.505 0 .291.108.511.323.66.218.147.494.22.828.22Z"/>
|
|
</svg>`,
|
|
"mk-mark-color": `<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
<path d="M8.47727 17H7L11.2727 5H12.7273L17 17H15.5227L12.0455 6.89844H11.9545L8.47727 17ZM9.02273 12.3125H14.9773V13.6016H9.02273V12.3125Z" fill="currentColor"/>
|
|
<path opacity="0.2" fill-rule="evenodd" clip-rule="evenodd" d="M18 21H6V19H18V20Z" fill="currentColor"/>
|
|
</svg>`
|
|
};
|
|
|
|
// src/components/FlowEditor/FlowEditorHover.tsx
|
|
var FlowEditorHover = (props2) => {
|
|
return props2.type == "file" ? /* @__PURE__ */ bn.createElement(bn.Fragment, null, props2.toggle && /* @__PURE__ */ bn.createElement("div", {
|
|
"aria-label": i18n_default.buttons.toggleFlow,
|
|
onClick: props2.toggleFlow,
|
|
className: props2.toggleState ? "mk-toggle-on" : "",
|
|
dangerouslySetInnerHTML: { __html: uiIconSet["mk-ui-flow-hover"] }
|
|
}), /* @__PURE__ */ bn.createElement("div", {
|
|
"aria-label": i18n_default.buttons.openLink,
|
|
onClick: props2.openLink,
|
|
dangerouslySetInnerHTML: { __html: uiIconSet["mk-ui-open-link"] }
|
|
})) : /* @__PURE__ */ bn.createElement(bn.Fragment, null, /* @__PURE__ */ bn.createElement("div", {
|
|
"aria-label": i18n_default.buttons.cutTable,
|
|
onClick: props2.cutTable,
|
|
className: "mk-icon-xsmall",
|
|
dangerouslySetInnerHTML: { __html: uiIconSet["mk-ui-cut"] }
|
|
}), /* @__PURE__ */ bn.createElement("div", {
|
|
"aria-label": i18n_default.buttons.deleteTable,
|
|
onClick: props2.deleteTable,
|
|
className: "mk-icon-xsmall",
|
|
dangerouslySetInnerHTML: { __html: uiIconSet["mk-ui-close"] }
|
|
}));
|
|
};
|
|
|
|
// src/utils/tree.ts
|
|
var import_obsidian29 = require("obsidian");
|
|
|
|
// src/components/ContextView/ContextView.tsx
|
|
var import_obsidian27 = require("obsidian");
|
|
|
|
// src/utils/contexts/contexts.ts
|
|
var import_obsidian = require("obsidian");
|
|
|
|
// src/utils/contexts/predicate/filter.ts
|
|
var stringEqual = (value, filterValue) => {
|
|
return value == filterValue;
|
|
};
|
|
var stringCompare = (value, filterValue) => {
|
|
return (value != null ? value : "").toLowerCase().includes((filterValue != null ? filterValue : "").toLowerCase());
|
|
};
|
|
var greaterThan = (value, filterValue) => {
|
|
return parseFloat(value) > parseFloat(filterValue);
|
|
};
|
|
var lessThan = (value, filterValue) => {
|
|
return parseInt(value) > parseInt(filterValue);
|
|
};
|
|
var listIncludes = (value, filterValue) => {
|
|
const valueList = value ? splitString(value) : [];
|
|
const strings = filterValue ? splitString(filterValue) : [];
|
|
return strings.some((f4) => valueList.some((g4) => g4 == f4));
|
|
};
|
|
var filterFnTypes = {
|
|
include: {
|
|
type: ["text", "file", "link", "link-multi", "tag", "tag-multi", "fileprop"],
|
|
fn: stringCompare,
|
|
label: i18n_default.filterTypes.contains,
|
|
valueType: "text"
|
|
},
|
|
notInclude: {
|
|
type: ["text", "file", "link", "link-multi", "tag", "tag-multi", "fileprop"],
|
|
fn: (v3, f4) => !stringCompare(v3, f4),
|
|
label: i18n_default.filterTypes.notContains,
|
|
valueType: "text"
|
|
},
|
|
is: {
|
|
type: ["text", "file", "link", "context", "tag"],
|
|
fn: stringEqual,
|
|
label: i18n_default.filterTypes.is,
|
|
valueType: "text"
|
|
},
|
|
isNot: {
|
|
type: ["text", "file", "link", "context", "tag"],
|
|
fn: (v3, f4) => !stringEqual(v3, f4),
|
|
label: i18n_default.filterTypes.isNot,
|
|
valueType: "text"
|
|
},
|
|
equal: {
|
|
type: ["number"],
|
|
fn: stringEqual,
|
|
label: "=",
|
|
valueType: "number"
|
|
},
|
|
isGreatThan: {
|
|
type: ["number"],
|
|
fn: greaterThan,
|
|
label: ">",
|
|
valueType: "number"
|
|
},
|
|
isLessThan: {
|
|
type: ["number"],
|
|
fn: lessThan,
|
|
label: "<",
|
|
valueType: "number"
|
|
},
|
|
isLessThanOrEqual: {
|
|
type: ["number"],
|
|
fn: (v3, f4) => !greaterThan(v3, f4),
|
|
label: "\u2264",
|
|
valueType: "number"
|
|
},
|
|
isGreatThanOrEqual: {
|
|
type: ["number"],
|
|
fn: (v3, f4) => !lessThan(v3, f4),
|
|
label: "\u2265",
|
|
valueType: "number"
|
|
},
|
|
dateBefore: {
|
|
type: ["date"],
|
|
fn: lessThan,
|
|
label: i18n_default.filterTypes.before,
|
|
valueType: "date"
|
|
},
|
|
dateAfter: {
|
|
type: ["date"],
|
|
fn: greaterThan,
|
|
label: i18n_default.filterTypes.after,
|
|
valueType: "date"
|
|
},
|
|
isAnyInList: {
|
|
type: ["option", "context", "option-multi", "context-multi"],
|
|
fn: listIncludes,
|
|
label: i18n_default.filterTypes.anyOf,
|
|
valueType: "list"
|
|
},
|
|
isNoneInList: {
|
|
type: ["option", "context", "option-multi", "context-multi"],
|
|
fn: (v3, f4) => !listIncludes(v3, f4),
|
|
label: i18n_default.filterTypes.noneOf,
|
|
valueType: "list"
|
|
},
|
|
isTrue: {
|
|
type: ["boolean"],
|
|
fn: (v3, f4) => v3 == "true",
|
|
label: i18n_default.filterTypes.checked,
|
|
valueType: "boolean"
|
|
},
|
|
isFalse: {
|
|
type: ["boolean"],
|
|
fn: (v3, f4) => v3 != "true",
|
|
label: i18n_default.filterTypes.unchecked,
|
|
valueType: "boolean"
|
|
}
|
|
};
|
|
var filterReturnForCol = (col, filter, row) => {
|
|
if (!col)
|
|
return true;
|
|
const filterType = filterFnTypes[filter.type];
|
|
let result = true;
|
|
if (filterType) {
|
|
result = filterType.fn(row[filter.field], filter.value);
|
|
}
|
|
return result;
|
|
};
|
|
|
|
// src/utils/contexts/predicate/sort.ts
|
|
var simpleSort = (a5, b4) => {
|
|
if (a5 < b4)
|
|
return -1;
|
|
if (a5 > b4)
|
|
return 1;
|
|
return 0;
|
|
};
|
|
var stringSort = (value, filterValue) => simpleSort(value, filterValue);
|
|
var numSort = (value, filterValue) => simpleSort(parseFloat(value), parseFloat(filterValue));
|
|
var boolSort = (value, filterValue) => simpleSort(value == "true" ? 1 : 0, filterValue == "true" ? 1 : 0);
|
|
var countSort = (value, filterValue) => simpleSort(splitString(value).length, splitString(filterValue).length);
|
|
var normalizedSortForType = (type, desc) => {
|
|
return Object.keys(sortFnTypes).find(
|
|
(f4) => sortFnTypes[f4].type.some((g4) => g4 == type) && sortFnTypes[f4].desc == desc
|
|
);
|
|
};
|
|
var sortFnTypes = {
|
|
alphabetical: {
|
|
type: ["text", "file", "link", "context"],
|
|
fn: stringSort,
|
|
label: i18n_default.sortTypes.alphaAsc,
|
|
desc: false
|
|
},
|
|
reverseAlphabetical: {
|
|
type: ["text", "file", "link", "context"],
|
|
fn: (v3, f4) => stringSort(v3, f4) * -1,
|
|
label: i18n_default.sortTypes.alphaDesc,
|
|
desc: true
|
|
},
|
|
earliest: {
|
|
type: ["date"],
|
|
fn: stringSort,
|
|
label: i18n_default.sortTypes.earliest,
|
|
desc: false
|
|
},
|
|
latest: {
|
|
type: ["date"],
|
|
fn: (v3, f4) => stringSort(v3, f4) * -1,
|
|
label: i18n_default.sortTypes.latest,
|
|
desc: true
|
|
},
|
|
boolean: {
|
|
type: ["boolean"],
|
|
fn: boolSort,
|
|
label: i18n_default.sortTypes.checkAsc,
|
|
desc: false
|
|
},
|
|
booleanReverse: {
|
|
type: ["boolean"],
|
|
fn: (v3, f4) => boolSort(v3, f4) * -1,
|
|
label: i18n_default.sortTypes.checkDesc,
|
|
desc: true
|
|
},
|
|
number: {
|
|
type: ["number"],
|
|
fn: numSort,
|
|
label: "1 \u2192 9",
|
|
desc: false
|
|
},
|
|
reverseNumber: {
|
|
type: ["number"],
|
|
fn: (v3, f4) => numSort(v3, f4) * -1,
|
|
label: "9 \u2192 1",
|
|
desc: true
|
|
},
|
|
count: {
|
|
type: ["option-multi", "context-multi", "link-multi"],
|
|
fn: countSort,
|
|
label: i18n_default.sortTypes.itemsDesc,
|
|
desc: true
|
|
},
|
|
reverseCount: {
|
|
type: ["option-multi", "context-multi", "link-multi"],
|
|
fn: (v3, f4) => countSort(v3, f4) * -1,
|
|
label: i18n_default.sortTypes.itemsAsc,
|
|
desc: false
|
|
}
|
|
};
|
|
var sortReturnForCol = (col, sort, row, row2) => {
|
|
if (!col)
|
|
return 0;
|
|
const sortType = sortFnTypes[sort.type];
|
|
if (sortType) {
|
|
return sortType.fn(row[sort.field], row2[sort.field]);
|
|
}
|
|
return 0;
|
|
};
|
|
|
|
// src/utils/contexts/predicate/predicate.tsx
|
|
var defaultPredicateFnForType = (type, types) => {
|
|
const fnType = Object.keys(types).find(
|
|
(f4) => types[f4].type.find((g4) => g4 == type)
|
|
);
|
|
return fnType;
|
|
};
|
|
var predicateFnsForType = (type, types) => {
|
|
const fnTypes = Object.keys(types).filter(
|
|
(f4) => types[f4].type.find((g4) => g4 == type)
|
|
);
|
|
return fnTypes;
|
|
};
|
|
var cleanPredicateType = (type, definedTypes) => {
|
|
return type.filter((f4) => Object.keys(definedTypes).find((g4) => g4 == f4.type));
|
|
};
|
|
var validatePredicate = (prevPredicate) => {
|
|
if (!prevPredicate) {
|
|
return defaultPredicate;
|
|
}
|
|
return {
|
|
...defaultPredicate,
|
|
filters: Array.isArray(prevPredicate.filters) ? cleanPredicateType(prevPredicate.filters, filterFnTypes) : [],
|
|
sort: Array.isArray(prevPredicate.sort) ? cleanPredicateType(prevPredicate.sort, sortFnTypes) : [],
|
|
groupBy: Array.isArray(prevPredicate.groupBy) ? prevPredicate.groupBy : [],
|
|
colsOrder: Array.isArray(prevPredicate.colsOrder) ? prevPredicate.colsOrder : [],
|
|
colsHidden: Array.isArray(prevPredicate.colsHidden) ? prevPredicate.colsHidden : [],
|
|
colsSize: prevPredicate.colsSize
|
|
};
|
|
};
|
|
var defaultPredicate = {
|
|
filters: [],
|
|
sort: [],
|
|
groupBy: [],
|
|
colsOrder: [],
|
|
colsHidden: [],
|
|
colsSize: {}
|
|
};
|
|
var splitString = (str) => {
|
|
var _a2;
|
|
return (_a2 = str == null ? void 0 : str.match(/(\\.|[^,])+/g)) != null ? _a2 : [];
|
|
};
|
|
var splitPropString = (str) => {
|
|
var _a2;
|
|
return (_a2 = str == null ? void 0 : str.match(/(\\.|[^.])+/g)) != null ? _a2 : [];
|
|
};
|
|
|
|
// src/utils/contexts/contexts.ts
|
|
var tagFromString = (tag) => {
|
|
if (!tag)
|
|
return null;
|
|
let string = tag;
|
|
if (string.charAt(0) != "#")
|
|
string = "#" + string;
|
|
return string.replace(/\//g, "+");
|
|
};
|
|
var stringToTag = (string) => {
|
|
return string.replace(/\+/g, "/");
|
|
};
|
|
var stringFromTag = (string) => {
|
|
if (string.charAt(0) == "#") {
|
|
return string.substring(1, string.length);
|
|
}
|
|
return string;
|
|
};
|
|
var loadTags = (plugin) => {
|
|
var _a2;
|
|
const folder = plugin.settings.tagContextFolder == "" ? app.vault.getRoot() : getAbstractFileAtPath(
|
|
app,
|
|
getFolderPathFromString(plugin.settings.tagContextFolder)
|
|
);
|
|
return uniq([
|
|
...Object.keys(app.metadataCache.getTags()),
|
|
...(_a2 = folder == null ? void 0 : folder.children.filter(
|
|
(f4) => f4 instanceof import_obsidian.TFile && f4.extension == "mdb" && f4.name.charAt(0) == "#"
|
|
).map((f4) => stringToTag(fileNameToString(f4.name)))) != null ? _a2 : []
|
|
]);
|
|
};
|
|
var tagContextFromTag = (plugin, tag) => {
|
|
return getFolderPathFromString(plugin.settings.tagContextFolder) + "/" + tagFromString(tag) + ".mdb";
|
|
};
|
|
var folderContextFromFolder = (plugin, folder) => {
|
|
return (folder == "/" ? "" : folder + "/") + plugin.settings.folderContextFile + ".mdb";
|
|
};
|
|
var linkContextRow = (row, fields, tagContexts) => {
|
|
return {
|
|
...row,
|
|
...fields.filter((f4) => f4.type == "fileprop").reduce(
|
|
(p3, c4) => {
|
|
const refCol = splitPropString(c4.value);
|
|
const col = refCol.length == 1 ? fields.find((f4) => f4.name == "File") : fields.find((f4) => f4.name == refCol[0]);
|
|
const prop = refCol.length == 1 ? refCol[0] : refCol[1];
|
|
if (!col || !prop) {
|
|
return p3;
|
|
}
|
|
if (col.type == "file" || col.type == "link") {
|
|
return {
|
|
...p3,
|
|
[c4.name]: appendFilesMetaData(prop, row[col.name])
|
|
};
|
|
}
|
|
if (col.type.includes("context")) {
|
|
const context = col.value;
|
|
if (tagContexts[context]) {
|
|
return {
|
|
...p3,
|
|
[c4.name]: linkContextProp(prop, row[col.name], tagContexts[context])
|
|
};
|
|
}
|
|
}
|
|
return p3;
|
|
},
|
|
{}
|
|
)
|
|
};
|
|
};
|
|
var linkContextProp = (propType, rows, contextTable) => {
|
|
const contextRows = contextTable.rows.filter((f4) => splitString(rows).contains(f4.File));
|
|
return uniq(contextRows.map((f4) => f4[propType]).filter((f4) => f4)).join(",");
|
|
};
|
|
|
|
// src/utils/flow/flowEditor.ts
|
|
var import_state4 = require("@codemirror/state");
|
|
|
|
// src/cm-extensions/flowEditor/selectiveEditor.ts
|
|
var import_state3 = require("@codemirror/state");
|
|
var import_view3 = require("@codemirror/view");
|
|
|
|
// node_modules/tslib/modules/index.js
|
|
var import_tslib = __toESM(require_tslib(), 1);
|
|
var {
|
|
__extends,
|
|
__assign,
|
|
__rest,
|
|
__decorate,
|
|
__param,
|
|
__metadata,
|
|
__awaiter,
|
|
__generator,
|
|
__exportStar,
|
|
__createBinding,
|
|
__values,
|
|
__read,
|
|
__spread,
|
|
__spreadArrays,
|
|
__spreadArray,
|
|
__await,
|
|
__asyncGenerator,
|
|
__asyncDelegator,
|
|
__asyncValues,
|
|
__makeTemplateObject,
|
|
__importStar,
|
|
__importDefault,
|
|
__classPrivateFieldGet,
|
|
__classPrivateFieldSet,
|
|
__classPrivateFieldIn
|
|
} = import_tslib.default;
|
|
|
|
// src/cm-extensions/flowEditor/selectiveEditor.ts
|
|
var editableRange = import_state3.Annotation.define();
|
|
var hiddenLine = import_view3.Decoration.replace({ inclusive: true });
|
|
var hideLine = import_state3.StateField.define({
|
|
create() {
|
|
return import_view3.Decoration.none;
|
|
},
|
|
update(value, tr) {
|
|
var _a2;
|
|
let builder = new import_state3.RangeSetBuilder();
|
|
if (((_a2 = tr.state.field(selectiveLinesFacet)) == null ? void 0 : _a2[0]) != void 0) {
|
|
builder.add(
|
|
tr.state.doc.line(1).from,
|
|
tr.state.doc.line(tr.state.field(selectiveLinesFacet)[0]).from,
|
|
hiddenLine
|
|
);
|
|
builder.add(
|
|
tr.state.doc.line(
|
|
Math.min(tr.newDoc.lines, tr.state.field(selectiveLinesFacet)[1])
|
|
).to,
|
|
tr.state.doc.line(tr.newDoc.lines).to,
|
|
hiddenLine
|
|
);
|
|
}
|
|
const dec = builder.finish();
|
|
return dec;
|
|
},
|
|
provide: (f4) => import_view3.EditorView.decorations.from(f4)
|
|
});
|
|
var selectiveLinesFacet = import_state3.StateField.define({
|
|
create: () => [void 0, void 0],
|
|
update(value, tr) {
|
|
if (tr.annotation(editableRange)) {
|
|
if (tr.annotation(editableRange)[0]) {
|
|
return [
|
|
tr.annotation(editableRange)[0],
|
|
Math.min(tr.state.doc.lines, tr.annotation(editableRange)[1])
|
|
];
|
|
}
|
|
return tr.annotation(editableRange);
|
|
}
|
|
return value;
|
|
}
|
|
});
|
|
var lineRangeToPosRange = (state, range) => {
|
|
return {
|
|
from: state.doc.line(range[0]).from,
|
|
to: state.doc.line(Math.min(state.doc.lines, range[1])).to
|
|
};
|
|
};
|
|
var smartDelete = import_state3.EditorState.transactionFilter.of(
|
|
(tr) => {
|
|
var _a2;
|
|
if (tr.isUserEvent("delete") && !tr.isUserEvent("delete.smart")) {
|
|
const initialSelections = tr.startState.selection.ranges.map((range) => ({
|
|
from: range.from,
|
|
to: range.to
|
|
}));
|
|
if (initialSelections.length > 0 && ((_a2 = tr.startState.field(selectiveLinesFacet)) == null ? void 0 : _a2[0])) {
|
|
const posRange = lineRangeToPosRange(
|
|
tr.startState,
|
|
tr.startState.field(selectiveLinesFacet)
|
|
);
|
|
const minFrom = Math.max(posRange.from, initialSelections[0].from);
|
|
const minTo = Math.min(posRange.to, initialSelections[0].to);
|
|
tr.startState.update({
|
|
changes: {
|
|
from: Math.min(minFrom, minTo),
|
|
to: Math.max(minFrom, minTo)
|
|
},
|
|
annotations: import_state3.Transaction.userEvent.of(
|
|
`${tr.annotation(import_state3.Transaction.userEvent)}.smart`
|
|
)
|
|
});
|
|
}
|
|
}
|
|
return tr;
|
|
}
|
|
);
|
|
var preventModifyTargetRanges = import_state3.EditorState.transactionFilter.of(
|
|
(tr) => {
|
|
let newTrans = [];
|
|
try {
|
|
const selectiveLines = tr.startState.field(selectiveLinesFacet);
|
|
if (tr.isUserEvent("input") || tr.isUserEvent("delete") || tr.isUserEvent("move")) {
|
|
if (selectiveLines == null ? void 0 : selectiveLines[0]) {
|
|
const posRange = lineRangeToPosRange(
|
|
tr.startState,
|
|
tr.startState.field(selectiveLinesFacet)
|
|
);
|
|
if (tr.changes.touchesRange(0, posRange.from - 1) || !tr.changes.touchesRange(posRange.from, posRange.to)) {
|
|
return [];
|
|
}
|
|
}
|
|
}
|
|
if (tr.state.doc.lines != tr.startState.doc.lines) {
|
|
const numberNewLines = tr.state.doc.lines - tr.startState.doc.lines;
|
|
if (selectiveLines == null ? void 0 : selectiveLines[0]) {
|
|
const posRange = lineRangeToPosRange(
|
|
tr.startState,
|
|
tr.startState.field(selectiveLinesFacet)
|
|
);
|
|
if (tr.changes.touchesRange(0, posRange.from - 1)) {
|
|
newTrans.push({
|
|
annotations: [
|
|
editableRange.of([
|
|
selectiveLines[0] + numberNewLines,
|
|
selectiveLines[1] + numberNewLines
|
|
])
|
|
]
|
|
});
|
|
} else if (tr.changes.touchesRange(posRange.from - 1, posRange.to)) {
|
|
newTrans.push({
|
|
annotations: [
|
|
editableRange.of([
|
|
selectiveLines[0],
|
|
selectiveLines[1] + numberNewLines
|
|
])
|
|
]
|
|
});
|
|
}
|
|
}
|
|
}
|
|
} catch (e4) {
|
|
return [];
|
|
}
|
|
return [tr, ...newTrans];
|
|
}
|
|
);
|
|
var readOnlyRangesExtension = [smartDelete, preventModifyTargetRanges];
|
|
var editBlockExtensions = () => [
|
|
readOnlyRangesExtension,
|
|
hideLine,
|
|
selectiveLinesFacet
|
|
];
|
|
|
|
// src/components/ContextView/InlineContextView.tsx
|
|
var import_obsidian19 = require("obsidian");
|
|
|
|
// node_modules/@dnd-kit/utilities/dist/utilities.esm.js
|
|
function useCombinedRefs(...refs) {
|
|
return F(
|
|
() => (node) => {
|
|
refs.forEach((ref) => ref(node));
|
|
},
|
|
refs
|
|
);
|
|
}
|
|
var canUseDOM = typeof window !== "undefined" && typeof window.document !== "undefined" && typeof window.document.createElement !== "undefined";
|
|
function isWindow(element) {
|
|
const elementString = Object.prototype.toString.call(element);
|
|
return elementString === "[object Window]" || elementString === "[object global]";
|
|
}
|
|
function isNode(node) {
|
|
return "nodeType" in node;
|
|
}
|
|
function getWindow(target) {
|
|
var _target$ownerDocument, _target$ownerDocument2;
|
|
if (!target) {
|
|
return window;
|
|
}
|
|
if (isWindow(target)) {
|
|
return target;
|
|
}
|
|
if (!isNode(target)) {
|
|
return window;
|
|
}
|
|
return (_target$ownerDocument = (_target$ownerDocument2 = target.ownerDocument) == null ? void 0 : _target$ownerDocument2.defaultView) != null ? _target$ownerDocument : window;
|
|
}
|
|
function isDocument(node) {
|
|
const {
|
|
Document
|
|
} = getWindow(node);
|
|
return node instanceof Document;
|
|
}
|
|
function isHTMLElement(node) {
|
|
if (isWindow(node)) {
|
|
return false;
|
|
}
|
|
return node instanceof getWindow(node).HTMLElement;
|
|
}
|
|
function isSVGElement(node) {
|
|
return node instanceof getWindow(node).SVGElement;
|
|
}
|
|
function getOwnerDocument(target) {
|
|
if (!target) {
|
|
return document;
|
|
}
|
|
if (isWindow(target)) {
|
|
return target.document;
|
|
}
|
|
if (!isNode(target)) {
|
|
return document;
|
|
}
|
|
if (isDocument(target)) {
|
|
return target;
|
|
}
|
|
if (isHTMLElement(target)) {
|
|
return target.ownerDocument;
|
|
}
|
|
return document;
|
|
}
|
|
var useIsomorphicLayoutEffect = canUseDOM ? s2 : h2;
|
|
function useEvent(handler) {
|
|
const handlerRef = _2(handler);
|
|
useIsomorphicLayoutEffect(() => {
|
|
handlerRef.current = handler;
|
|
});
|
|
return T2(function(...args) {
|
|
return handlerRef.current == null ? void 0 : handlerRef.current(...args);
|
|
}, []);
|
|
}
|
|
function useInterval() {
|
|
const intervalRef = _2(null);
|
|
const set = T2((listener, duration) => {
|
|
intervalRef.current = setInterval(listener, duration);
|
|
}, []);
|
|
const clear = T2(() => {
|
|
if (intervalRef.current !== null) {
|
|
clearInterval(intervalRef.current);
|
|
intervalRef.current = null;
|
|
}
|
|
}, []);
|
|
return [set, clear];
|
|
}
|
|
function useLatestValue(value, dependencies = [value]) {
|
|
const valueRef = _2(value);
|
|
useIsomorphicLayoutEffect(() => {
|
|
if (valueRef.current !== value) {
|
|
valueRef.current = value;
|
|
}
|
|
}, dependencies);
|
|
return valueRef;
|
|
}
|
|
function useLazyMemo(callback, dependencies) {
|
|
const valueRef = _2();
|
|
return F(
|
|
() => {
|
|
const newValue = callback(valueRef.current);
|
|
valueRef.current = newValue;
|
|
return newValue;
|
|
},
|
|
[...dependencies]
|
|
);
|
|
}
|
|
function useNodeRef(onChange) {
|
|
const onChangeHandler = useEvent(onChange);
|
|
const node = _2(null);
|
|
const setNodeRef = T2(
|
|
(element) => {
|
|
if (element !== node.current) {
|
|
onChangeHandler == null ? void 0 : onChangeHandler(element, node.current);
|
|
}
|
|
node.current = element;
|
|
},
|
|
[]
|
|
);
|
|
return [node, setNodeRef];
|
|
}
|
|
function usePrevious(value) {
|
|
const ref = _2();
|
|
h2(() => {
|
|
ref.current = value;
|
|
}, [value]);
|
|
return ref.current;
|
|
}
|
|
var ids = {};
|
|
function useUniqueId(prefix, value) {
|
|
return F(() => {
|
|
if (value) {
|
|
return value;
|
|
}
|
|
const id2 = ids[prefix] == null ? 0 : ids[prefix] + 1;
|
|
ids[prefix] = id2;
|
|
return `${prefix}-${id2}`;
|
|
}, [prefix, value]);
|
|
}
|
|
function createAdjustmentFn(modifier) {
|
|
return (object, ...adjustments) => {
|
|
return adjustments.reduce((accumulator, adjustment) => {
|
|
const entries = Object.entries(adjustment);
|
|
for (const [key2, valueAdjustment] of entries) {
|
|
const value = accumulator[key2];
|
|
if (value != null) {
|
|
accumulator[key2] = value + modifier * valueAdjustment;
|
|
}
|
|
}
|
|
return accumulator;
|
|
}, {
|
|
...object
|
|
});
|
|
};
|
|
}
|
|
var add = /* @__PURE__ */ createAdjustmentFn(1);
|
|
var subtract = /* @__PURE__ */ createAdjustmentFn(-1);
|
|
function hasViewportRelativeCoordinates(event) {
|
|
return "clientX" in event && "clientY" in event;
|
|
}
|
|
function isKeyboardEvent(event) {
|
|
if (!event) {
|
|
return false;
|
|
}
|
|
const {
|
|
KeyboardEvent
|
|
} = getWindow(event.target);
|
|
return KeyboardEvent && event instanceof KeyboardEvent;
|
|
}
|
|
function isTouchEvent(event) {
|
|
if (!event) {
|
|
return false;
|
|
}
|
|
const {
|
|
TouchEvent
|
|
} = getWindow(event.target);
|
|
return TouchEvent && event instanceof TouchEvent;
|
|
}
|
|
function getEventCoordinates(event) {
|
|
if (isTouchEvent(event)) {
|
|
if (event.touches && event.touches.length) {
|
|
const {
|
|
clientX: x5,
|
|
clientY: y5
|
|
} = event.touches[0];
|
|
return {
|
|
x: x5,
|
|
y: y5
|
|
};
|
|
} else if (event.changedTouches && event.changedTouches.length) {
|
|
const {
|
|
clientX: x5,
|
|
clientY: y5
|
|
} = event.changedTouches[0];
|
|
return {
|
|
x: x5,
|
|
y: y5
|
|
};
|
|
}
|
|
}
|
|
if (hasViewportRelativeCoordinates(event)) {
|
|
return {
|
|
x: event.clientX,
|
|
y: event.clientY
|
|
};
|
|
}
|
|
return null;
|
|
}
|
|
var CSS = /* @__PURE__ */ Object.freeze({
|
|
Translate: {
|
|
toString(transform) {
|
|
if (!transform) {
|
|
return;
|
|
}
|
|
const {
|
|
x: x5,
|
|
y: y5
|
|
} = transform;
|
|
return `translate3d(${x5 ? Math.round(x5) : 0}px, ${y5 ? Math.round(y5) : 0}px, 0)`;
|
|
}
|
|
},
|
|
Scale: {
|
|
toString(transform) {
|
|
if (!transform) {
|
|
return;
|
|
}
|
|
const {
|
|
scaleX,
|
|
scaleY
|
|
} = transform;
|
|
return `scaleX(${scaleX}) scaleY(${scaleY})`;
|
|
}
|
|
},
|
|
Transform: {
|
|
toString(transform) {
|
|
if (!transform) {
|
|
return;
|
|
}
|
|
return [CSS.Translate.toString(transform), CSS.Scale.toString(transform)].join(" ");
|
|
}
|
|
},
|
|
Transition: {
|
|
toString({
|
|
property,
|
|
duration,
|
|
easing
|
|
}) {
|
|
return `${property} ${duration}ms ${easing}`;
|
|
}
|
|
}
|
|
});
|
|
var SELECTOR = "a,frame,iframe,input:not([type=hidden]):not(:disabled),select:not(:disabled),textarea:not(:disabled),button:not(:disabled),*[tabindex]";
|
|
function findFirstFocusableNode(element) {
|
|
if (element.matches(SELECTOR)) {
|
|
return element;
|
|
}
|
|
return element.querySelector(SELECTOR);
|
|
}
|
|
|
|
// node_modules/@dnd-kit/accessibility/dist/accessibility.esm.js
|
|
var hiddenStyles = {
|
|
display: "none"
|
|
};
|
|
function HiddenText(_ref) {
|
|
let {
|
|
id: id2,
|
|
value
|
|
} = _ref;
|
|
return bn.createElement("div", {
|
|
id: id2,
|
|
style: hiddenStyles
|
|
}, value);
|
|
}
|
|
var visuallyHidden = {
|
|
position: "fixed",
|
|
width: 1,
|
|
height: 1,
|
|
margin: -1,
|
|
border: 0,
|
|
padding: 0,
|
|
overflow: "hidden",
|
|
clip: "rect(0 0 0 0)",
|
|
clipPath: "inset(100%)",
|
|
whiteSpace: "nowrap"
|
|
};
|
|
function LiveRegion(_ref) {
|
|
let {
|
|
id: id2,
|
|
announcement
|
|
} = _ref;
|
|
return bn.createElement("div", {
|
|
id: id2,
|
|
style: visuallyHidden,
|
|
role: "status",
|
|
"aria-live": "assertive",
|
|
"aria-atomic": true
|
|
}, announcement);
|
|
}
|
|
function useAnnouncement() {
|
|
const [announcement, setAnnouncement] = p2("");
|
|
const announce = T2((value) => {
|
|
if (value != null) {
|
|
setAnnouncement(value);
|
|
}
|
|
}, []);
|
|
return {
|
|
announce,
|
|
announcement
|
|
};
|
|
}
|
|
|
|
// node_modules/@dnd-kit/core/dist/core.esm.js
|
|
var DndMonitorContext = /* @__PURE__ */ B(null);
|
|
function useDndMonitor(listener) {
|
|
const registerListener = q2(DndMonitorContext);
|
|
h2(() => {
|
|
if (!registerListener) {
|
|
throw new Error("useDndMonitor must be used within a children of <DndContext>");
|
|
}
|
|
const unsubscribe = registerListener(listener);
|
|
return unsubscribe;
|
|
}, [listener, registerListener]);
|
|
}
|
|
function useDndMonitorProvider() {
|
|
const [listeners] = p2(() => /* @__PURE__ */ new Set());
|
|
const registerListener = T2((listener) => {
|
|
listeners.add(listener);
|
|
return () => listeners.delete(listener);
|
|
}, [listeners]);
|
|
const dispatch = T2((_ref) => {
|
|
let {
|
|
type,
|
|
event
|
|
} = _ref;
|
|
listeners.forEach((listener) => {
|
|
var _listener$type;
|
|
return (_listener$type = listener[type]) == null ? void 0 : _listener$type.call(listener, event);
|
|
});
|
|
}, [listeners]);
|
|
return [dispatch, registerListener];
|
|
}
|
|
var defaultScreenReaderInstructions = {
|
|
draggable: "\n To pick up a draggable item, press the space bar.\n While dragging, use the arrow keys to move the item.\n Press space again to drop the item in its new position, or press escape to cancel.\n "
|
|
};
|
|
var defaultAnnouncements = {
|
|
onDragStart(_ref) {
|
|
let {
|
|
active
|
|
} = _ref;
|
|
return "Picked up draggable item " + active.id + ".";
|
|
},
|
|
onDragOver(_ref2) {
|
|
let {
|
|
active,
|
|
over
|
|
} = _ref2;
|
|
if (over) {
|
|
return "Draggable item " + active.id + " was moved over droppable area " + over.id + ".";
|
|
}
|
|
return "Draggable item " + active.id + " is no longer over a droppable area.";
|
|
},
|
|
onDragEnd(_ref3) {
|
|
let {
|
|
active,
|
|
over
|
|
} = _ref3;
|
|
if (over) {
|
|
return "Draggable item " + active.id + " was dropped over droppable area " + over.id;
|
|
}
|
|
return "Draggable item " + active.id + " was dropped.";
|
|
},
|
|
onDragCancel(_ref4) {
|
|
let {
|
|
active
|
|
} = _ref4;
|
|
return "Dragging was cancelled. Draggable item " + active.id + " was dropped.";
|
|
}
|
|
};
|
|
function Accessibility(_ref) {
|
|
let {
|
|
announcements = defaultAnnouncements,
|
|
container,
|
|
hiddenTextDescribedById,
|
|
screenReaderInstructions = defaultScreenReaderInstructions
|
|
} = _ref;
|
|
const {
|
|
announce,
|
|
announcement
|
|
} = useAnnouncement();
|
|
const liveRegionId = useUniqueId("DndLiveRegion");
|
|
const [mounted, setMounted] = p2(false);
|
|
h2(() => {
|
|
setMounted(true);
|
|
}, []);
|
|
useDndMonitor(F(() => ({
|
|
onDragStart(_ref2) {
|
|
let {
|
|
active
|
|
} = _ref2;
|
|
announce(announcements.onDragStart({
|
|
active
|
|
}));
|
|
},
|
|
onDragMove(_ref3) {
|
|
let {
|
|
active,
|
|
over
|
|
} = _ref3;
|
|
if (announcements.onDragMove) {
|
|
announce(announcements.onDragMove({
|
|
active,
|
|
over
|
|
}));
|
|
}
|
|
},
|
|
onDragOver(_ref4) {
|
|
let {
|
|
active,
|
|
over
|
|
} = _ref4;
|
|
announce(announcements.onDragOver({
|
|
active,
|
|
over
|
|
}));
|
|
},
|
|
onDragEnd(_ref5) {
|
|
let {
|
|
active,
|
|
over
|
|
} = _ref5;
|
|
announce(announcements.onDragEnd({
|
|
active,
|
|
over
|
|
}));
|
|
},
|
|
onDragCancel(_ref6) {
|
|
let {
|
|
active,
|
|
over
|
|
} = _ref6;
|
|
announce(announcements.onDragCancel({
|
|
active,
|
|
over
|
|
}));
|
|
}
|
|
}), [announce, announcements]));
|
|
if (!mounted) {
|
|
return null;
|
|
}
|
|
const markup = bn.createElement(bn.Fragment, null, bn.createElement(HiddenText, {
|
|
id: hiddenTextDescribedById,
|
|
value: screenReaderInstructions.draggable
|
|
}), bn.createElement(LiveRegion, {
|
|
id: liveRegionId,
|
|
announcement
|
|
}));
|
|
return container ? j3(markup, container) : markup;
|
|
}
|
|
var Action;
|
|
(function(Action2) {
|
|
Action2["DragStart"] = "dragStart";
|
|
Action2["DragMove"] = "dragMove";
|
|
Action2["DragEnd"] = "dragEnd";
|
|
Action2["DragCancel"] = "dragCancel";
|
|
Action2["DragOver"] = "dragOver";
|
|
Action2["RegisterDroppable"] = "registerDroppable";
|
|
Action2["SetDroppableDisabled"] = "setDroppableDisabled";
|
|
Action2["UnregisterDroppable"] = "unregisterDroppable";
|
|
})(Action || (Action = {}));
|
|
function noop() {
|
|
}
|
|
function useSensor(sensor, options) {
|
|
return F(
|
|
() => ({
|
|
sensor,
|
|
options: options != null ? options : {}
|
|
}),
|
|
[sensor, options]
|
|
);
|
|
}
|
|
function useSensors() {
|
|
for (var _len = arguments.length, sensors = new Array(_len), _key = 0; _key < _len; _key++) {
|
|
sensors[_key] = arguments[_key];
|
|
}
|
|
return F(
|
|
() => [...sensors].filter((sensor) => sensor != null),
|
|
[...sensors]
|
|
);
|
|
}
|
|
var defaultCoordinates = /* @__PURE__ */ Object.freeze({
|
|
x: 0,
|
|
y: 0
|
|
});
|
|
function distanceBetween(p1, p22) {
|
|
return Math.sqrt(Math.pow(p1.x - p22.x, 2) + Math.pow(p1.y - p22.y, 2));
|
|
}
|
|
function getRelativeTransformOrigin(event, rect) {
|
|
const eventCoordinates = getEventCoordinates(event);
|
|
if (!eventCoordinates) {
|
|
return "0 0";
|
|
}
|
|
const transformOrigin = {
|
|
x: (eventCoordinates.x - rect.left) / rect.width * 100,
|
|
y: (eventCoordinates.y - rect.top) / rect.height * 100
|
|
};
|
|
return transformOrigin.x + "% " + transformOrigin.y + "%";
|
|
}
|
|
function sortCollisionsAsc(_ref, _ref2) {
|
|
let {
|
|
data: {
|
|
value: a5
|
|
}
|
|
} = _ref;
|
|
let {
|
|
data: {
|
|
value: b4
|
|
}
|
|
} = _ref2;
|
|
return a5 - b4;
|
|
}
|
|
function sortCollisionsDesc(_ref3, _ref4) {
|
|
let {
|
|
data: {
|
|
value: a5
|
|
}
|
|
} = _ref3;
|
|
let {
|
|
data: {
|
|
value: b4
|
|
}
|
|
} = _ref4;
|
|
return b4 - a5;
|
|
}
|
|
function cornersOfRectangle(_ref5) {
|
|
let {
|
|
left,
|
|
top,
|
|
height,
|
|
width
|
|
} = _ref5;
|
|
return [{
|
|
x: left,
|
|
y: top
|
|
}, {
|
|
x: left + width,
|
|
y: top
|
|
}, {
|
|
x: left,
|
|
y: top + height
|
|
}, {
|
|
x: left + width,
|
|
y: top + height
|
|
}];
|
|
}
|
|
function getFirstCollision(collisions, property) {
|
|
if (!collisions || collisions.length === 0) {
|
|
return null;
|
|
}
|
|
const [firstCollision] = collisions;
|
|
return property ? firstCollision[property] : firstCollision;
|
|
}
|
|
function centerOfRectangle(rect, left, top) {
|
|
if (left === void 0) {
|
|
left = rect.left;
|
|
}
|
|
if (top === void 0) {
|
|
top = rect.top;
|
|
}
|
|
return {
|
|
x: left + rect.width * 0.5,
|
|
y: top + rect.height * 0.5
|
|
};
|
|
}
|
|
var closestCenter = (_ref) => {
|
|
let {
|
|
collisionRect,
|
|
droppableRects,
|
|
droppableContainers
|
|
} = _ref;
|
|
const centerRect = centerOfRectangle(collisionRect, collisionRect.left, collisionRect.top);
|
|
const collisions = [];
|
|
for (const droppableContainer of droppableContainers) {
|
|
const {
|
|
id: id2
|
|
} = droppableContainer;
|
|
const rect = droppableRects.get(id2);
|
|
if (rect) {
|
|
const distBetween = distanceBetween(centerOfRectangle(rect), centerRect);
|
|
collisions.push({
|
|
id: id2,
|
|
data: {
|
|
droppableContainer,
|
|
value: distBetween
|
|
}
|
|
});
|
|
}
|
|
}
|
|
return collisions.sort(sortCollisionsAsc);
|
|
};
|
|
var closestCorners = (_ref) => {
|
|
let {
|
|
collisionRect,
|
|
droppableRects,
|
|
droppableContainers
|
|
} = _ref;
|
|
const corners = cornersOfRectangle(collisionRect);
|
|
const collisions = [];
|
|
for (const droppableContainer of droppableContainers) {
|
|
const {
|
|
id: id2
|
|
} = droppableContainer;
|
|
const rect = droppableRects.get(id2);
|
|
if (rect) {
|
|
const rectCorners = cornersOfRectangle(rect);
|
|
const distances = corners.reduce((accumulator, corner, index) => {
|
|
return accumulator + distanceBetween(rectCorners[index], corner);
|
|
}, 0);
|
|
const effectiveDistance = Number((distances / 4).toFixed(4));
|
|
collisions.push({
|
|
id: id2,
|
|
data: {
|
|
droppableContainer,
|
|
value: effectiveDistance
|
|
}
|
|
});
|
|
}
|
|
}
|
|
return collisions.sort(sortCollisionsAsc);
|
|
};
|
|
function getIntersectionRatio(entry, target) {
|
|
const top = Math.max(target.top, entry.top);
|
|
const left = Math.max(target.left, entry.left);
|
|
const right = Math.min(target.left + target.width, entry.left + entry.width);
|
|
const bottom = Math.min(target.top + target.height, entry.top + entry.height);
|
|
const width = right - left;
|
|
const height = bottom - top;
|
|
if (left < right && top < bottom) {
|
|
const targetArea = target.width * target.height;
|
|
const entryArea = entry.width * entry.height;
|
|
const intersectionArea = width * height;
|
|
const intersectionRatio = intersectionArea / (targetArea + entryArea - intersectionArea);
|
|
return Number(intersectionRatio.toFixed(4));
|
|
}
|
|
return 0;
|
|
}
|
|
var rectIntersection = (_ref) => {
|
|
let {
|
|
collisionRect,
|
|
droppableRects,
|
|
droppableContainers
|
|
} = _ref;
|
|
const collisions = [];
|
|
for (const droppableContainer of droppableContainers) {
|
|
const {
|
|
id: id2
|
|
} = droppableContainer;
|
|
const rect = droppableRects.get(id2);
|
|
if (rect) {
|
|
const intersectionRatio = getIntersectionRatio(rect, collisionRect);
|
|
if (intersectionRatio > 0) {
|
|
collisions.push({
|
|
id: id2,
|
|
data: {
|
|
droppableContainer,
|
|
value: intersectionRatio
|
|
}
|
|
});
|
|
}
|
|
}
|
|
}
|
|
return collisions.sort(sortCollisionsDesc);
|
|
};
|
|
function adjustScale(transform, rect1, rect2) {
|
|
return {
|
|
...transform,
|
|
scaleX: rect1 && rect2 ? rect1.width / rect2.width : 1,
|
|
scaleY: rect1 && rect2 ? rect1.height / rect2.height : 1
|
|
};
|
|
}
|
|
function getRectDelta(rect1, rect2) {
|
|
return rect1 && rect2 ? {
|
|
x: rect1.left - rect2.left,
|
|
y: rect1.top - rect2.top
|
|
} : defaultCoordinates;
|
|
}
|
|
function createRectAdjustmentFn(modifier) {
|
|
return function adjustClientRect(rect) {
|
|
for (var _len = arguments.length, adjustments = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
|
|
adjustments[_key - 1] = arguments[_key];
|
|
}
|
|
return adjustments.reduce((acc, adjustment) => ({
|
|
...acc,
|
|
top: acc.top + modifier * adjustment.y,
|
|
bottom: acc.bottom + modifier * adjustment.y,
|
|
left: acc.left + modifier * adjustment.x,
|
|
right: acc.right + modifier * adjustment.x
|
|
}), {
|
|
...rect
|
|
});
|
|
};
|
|
}
|
|
var getAdjustedRect = /* @__PURE__ */ createRectAdjustmentFn(1);
|
|
function parseTransform(transform) {
|
|
if (transform.startsWith("matrix3d(")) {
|
|
const transformArray = transform.slice(9, -1).split(/, /);
|
|
return {
|
|
x: +transformArray[12],
|
|
y: +transformArray[13],
|
|
scaleX: +transformArray[0],
|
|
scaleY: +transformArray[5]
|
|
};
|
|
} else if (transform.startsWith("matrix(")) {
|
|
const transformArray = transform.slice(7, -1).split(/, /);
|
|
return {
|
|
x: +transformArray[4],
|
|
y: +transformArray[5],
|
|
scaleX: +transformArray[0],
|
|
scaleY: +transformArray[3]
|
|
};
|
|
}
|
|
return null;
|
|
}
|
|
function inverseTransform(rect, transform, transformOrigin) {
|
|
const parsedTransform = parseTransform(transform);
|
|
if (!parsedTransform) {
|
|
return rect;
|
|
}
|
|
const {
|
|
scaleX,
|
|
scaleY,
|
|
x: translateX,
|
|
y: translateY
|
|
} = parsedTransform;
|
|
const x5 = rect.left - translateX - (1 - scaleX) * parseFloat(transformOrigin);
|
|
const y5 = rect.top - translateY - (1 - scaleY) * parseFloat(transformOrigin.slice(transformOrigin.indexOf(" ") + 1));
|
|
const w5 = scaleX ? rect.width / scaleX : rect.width;
|
|
const h5 = scaleY ? rect.height / scaleY : rect.height;
|
|
return {
|
|
width: w5,
|
|
height: h5,
|
|
top: y5,
|
|
right: x5 + w5,
|
|
bottom: y5 + h5,
|
|
left: x5
|
|
};
|
|
}
|
|
var defaultOptions = {
|
|
ignoreTransform: false
|
|
};
|
|
function getClientRect(element, options) {
|
|
if (options === void 0) {
|
|
options = defaultOptions;
|
|
}
|
|
let rect = element.getBoundingClientRect();
|
|
if (options.ignoreTransform) {
|
|
const {
|
|
getComputedStyle
|
|
} = getWindow(element);
|
|
const {
|
|
transform,
|
|
transformOrigin
|
|
} = getComputedStyle(element);
|
|
if (transform) {
|
|
rect = inverseTransform(rect, transform, transformOrigin);
|
|
}
|
|
}
|
|
const {
|
|
top,
|
|
left,
|
|
width,
|
|
height,
|
|
bottom,
|
|
right
|
|
} = rect;
|
|
return {
|
|
top,
|
|
left,
|
|
width,
|
|
height,
|
|
bottom,
|
|
right
|
|
};
|
|
}
|
|
function getTransformAgnosticClientRect(element) {
|
|
return getClientRect(element, {
|
|
ignoreTransform: true
|
|
});
|
|
}
|
|
function getWindowClientRect(element) {
|
|
const width = element.innerWidth;
|
|
const height = element.innerHeight;
|
|
return {
|
|
top: 0,
|
|
left: 0,
|
|
right: width,
|
|
bottom: height,
|
|
width,
|
|
height
|
|
};
|
|
}
|
|
function isFixed(node, computedStyle) {
|
|
if (computedStyle === void 0) {
|
|
computedStyle = getWindow(node).getComputedStyle(node);
|
|
}
|
|
return computedStyle.position === "fixed";
|
|
}
|
|
function isScrollable(element, computedStyle) {
|
|
if (computedStyle === void 0) {
|
|
computedStyle = getWindow(element).getComputedStyle(element);
|
|
}
|
|
const overflowRegex = /(auto|scroll|overlay)/;
|
|
const properties2 = ["overflow", "overflowX", "overflowY"];
|
|
return properties2.some((property) => {
|
|
const value = computedStyle[property];
|
|
return typeof value === "string" ? overflowRegex.test(value) : false;
|
|
});
|
|
}
|
|
function getScrollableAncestors(element, limit) {
|
|
const scrollParents = [];
|
|
function findScrollableAncestors(node) {
|
|
if (limit != null && scrollParents.length >= limit) {
|
|
return scrollParents;
|
|
}
|
|
if (!node) {
|
|
return scrollParents;
|
|
}
|
|
if (isDocument(node) && node.scrollingElement != null && !scrollParents.includes(node.scrollingElement)) {
|
|
scrollParents.push(node.scrollingElement);
|
|
return scrollParents;
|
|
}
|
|
if (!isHTMLElement(node) || isSVGElement(node)) {
|
|
return scrollParents;
|
|
}
|
|
if (scrollParents.includes(node)) {
|
|
return scrollParents;
|
|
}
|
|
const {
|
|
getComputedStyle
|
|
} = getWindow(node);
|
|
const computedStyle = getComputedStyle(node);
|
|
if (node !== element) {
|
|
if (isScrollable(node, computedStyle)) {
|
|
scrollParents.push(node);
|
|
}
|
|
}
|
|
if (isFixed(node, computedStyle)) {
|
|
return scrollParents;
|
|
}
|
|
return findScrollableAncestors(node.parentNode);
|
|
}
|
|
if (!element) {
|
|
return scrollParents;
|
|
}
|
|
return findScrollableAncestors(element);
|
|
}
|
|
function getFirstScrollableAncestor(node) {
|
|
const [firstScrollableAncestor] = getScrollableAncestors(node, 1);
|
|
return firstScrollableAncestor != null ? firstScrollableAncestor : null;
|
|
}
|
|
function getScrollableElement(element) {
|
|
if (!canUseDOM || !element) {
|
|
return null;
|
|
}
|
|
if (isWindow(element)) {
|
|
return element;
|
|
}
|
|
if (!isNode(element)) {
|
|
return null;
|
|
}
|
|
if (isDocument(element) || element === getOwnerDocument(element).scrollingElement) {
|
|
return window;
|
|
}
|
|
if (isHTMLElement(element)) {
|
|
return element;
|
|
}
|
|
return null;
|
|
}
|
|
function getScrollXCoordinate(element) {
|
|
if (isWindow(element)) {
|
|
return element.scrollX;
|
|
}
|
|
return element.scrollLeft;
|
|
}
|
|
function getScrollYCoordinate(element) {
|
|
if (isWindow(element)) {
|
|
return element.scrollY;
|
|
}
|
|
return element.scrollTop;
|
|
}
|
|
function getScrollCoordinates(element) {
|
|
return {
|
|
x: getScrollXCoordinate(element),
|
|
y: getScrollYCoordinate(element)
|
|
};
|
|
}
|
|
var Direction2;
|
|
(function(Direction3) {
|
|
Direction3[Direction3["Forward"] = 1] = "Forward";
|
|
Direction3[Direction3["Backward"] = -1] = "Backward";
|
|
})(Direction2 || (Direction2 = {}));
|
|
function isDocumentScrollingElement(element) {
|
|
if (!canUseDOM || !element) {
|
|
return false;
|
|
}
|
|
return element === document.scrollingElement;
|
|
}
|
|
function getScrollPosition(scrollingContainer) {
|
|
const minScroll = {
|
|
x: 0,
|
|
y: 0
|
|
};
|
|
const dimensions = isDocumentScrollingElement(scrollingContainer) ? {
|
|
height: window.innerHeight,
|
|
width: window.innerWidth
|
|
} : {
|
|
height: scrollingContainer.clientHeight,
|
|
width: scrollingContainer.clientWidth
|
|
};
|
|
const maxScroll = {
|
|
x: scrollingContainer.scrollWidth - dimensions.width,
|
|
y: scrollingContainer.scrollHeight - dimensions.height
|
|
};
|
|
const isTop = scrollingContainer.scrollTop <= minScroll.y;
|
|
const isLeft = scrollingContainer.scrollLeft <= minScroll.x;
|
|
const isBottom = scrollingContainer.scrollTop >= maxScroll.y;
|
|
const isRight = scrollingContainer.scrollLeft >= maxScroll.x;
|
|
return {
|
|
isTop,
|
|
isLeft,
|
|
isBottom,
|
|
isRight,
|
|
maxScroll,
|
|
minScroll
|
|
};
|
|
}
|
|
var defaultThreshold = {
|
|
x: 0.2,
|
|
y: 0.2
|
|
};
|
|
function getScrollDirectionAndSpeed(scrollContainer, scrollContainerRect, _ref, acceleration, thresholdPercentage) {
|
|
let {
|
|
top,
|
|
left,
|
|
right,
|
|
bottom
|
|
} = _ref;
|
|
if (acceleration === void 0) {
|
|
acceleration = 10;
|
|
}
|
|
if (thresholdPercentage === void 0) {
|
|
thresholdPercentage = defaultThreshold;
|
|
}
|
|
const {
|
|
isTop,
|
|
isBottom,
|
|
isLeft,
|
|
isRight
|
|
} = getScrollPosition(scrollContainer);
|
|
const direction = {
|
|
x: 0,
|
|
y: 0
|
|
};
|
|
const speed = {
|
|
x: 0,
|
|
y: 0
|
|
};
|
|
const threshold = {
|
|
height: scrollContainerRect.height * thresholdPercentage.y,
|
|
width: scrollContainerRect.width * thresholdPercentage.x
|
|
};
|
|
if (!isTop && top <= scrollContainerRect.top + threshold.height) {
|
|
direction.y = Direction2.Backward;
|
|
speed.y = acceleration * Math.abs((scrollContainerRect.top + threshold.height - top) / threshold.height);
|
|
} else if (!isBottom && bottom >= scrollContainerRect.bottom - threshold.height) {
|
|
direction.y = Direction2.Forward;
|
|
speed.y = acceleration * Math.abs((scrollContainerRect.bottom - threshold.height - bottom) / threshold.height);
|
|
}
|
|
if (!isRight && right >= scrollContainerRect.right - threshold.width) {
|
|
direction.x = Direction2.Forward;
|
|
speed.x = acceleration * Math.abs((scrollContainerRect.right - threshold.width - right) / threshold.width);
|
|
} else if (!isLeft && left <= scrollContainerRect.left + threshold.width) {
|
|
direction.x = Direction2.Backward;
|
|
speed.x = acceleration * Math.abs((scrollContainerRect.left + threshold.width - left) / threshold.width);
|
|
}
|
|
return {
|
|
direction,
|
|
speed
|
|
};
|
|
}
|
|
function getScrollElementRect(element) {
|
|
if (element === document.scrollingElement) {
|
|
const {
|
|
innerWidth: innerWidth2,
|
|
innerHeight: innerHeight2
|
|
} = window;
|
|
return {
|
|
top: 0,
|
|
left: 0,
|
|
right: innerWidth2,
|
|
bottom: innerHeight2,
|
|
width: innerWidth2,
|
|
height: innerHeight2
|
|
};
|
|
}
|
|
const {
|
|
top,
|
|
left,
|
|
right,
|
|
bottom
|
|
} = element.getBoundingClientRect();
|
|
return {
|
|
top,
|
|
left,
|
|
right,
|
|
bottom,
|
|
width: element.clientWidth,
|
|
height: element.clientHeight
|
|
};
|
|
}
|
|
function getScrollOffsets(scrollableAncestors) {
|
|
return scrollableAncestors.reduce((acc, node) => {
|
|
return add(acc, getScrollCoordinates(node));
|
|
}, defaultCoordinates);
|
|
}
|
|
function getScrollXOffset(scrollableAncestors) {
|
|
return scrollableAncestors.reduce((acc, node) => {
|
|
return acc + getScrollXCoordinate(node);
|
|
}, 0);
|
|
}
|
|
function getScrollYOffset(scrollableAncestors) {
|
|
return scrollableAncestors.reduce((acc, node) => {
|
|
return acc + getScrollYCoordinate(node);
|
|
}, 0);
|
|
}
|
|
function scrollIntoViewIfNeeded(element, measure) {
|
|
if (measure === void 0) {
|
|
measure = getClientRect;
|
|
}
|
|
if (!element) {
|
|
return;
|
|
}
|
|
const {
|
|
top,
|
|
left,
|
|
bottom,
|
|
right
|
|
} = measure(element);
|
|
const firstScrollableAncestor = getFirstScrollableAncestor(element);
|
|
if (!firstScrollableAncestor) {
|
|
return;
|
|
}
|
|
if (bottom <= 0 || right <= 0 || top >= window.innerHeight || left >= window.innerWidth) {
|
|
element.scrollIntoView({
|
|
block: "center",
|
|
inline: "center"
|
|
});
|
|
}
|
|
}
|
|
var properties = [["x", ["left", "right"], getScrollXOffset], ["y", ["top", "bottom"], getScrollYOffset]];
|
|
var Rect = class {
|
|
constructor(rect, element) {
|
|
this.rect = void 0;
|
|
this.width = void 0;
|
|
this.height = void 0;
|
|
this.top = void 0;
|
|
this.bottom = void 0;
|
|
this.right = void 0;
|
|
this.left = void 0;
|
|
const scrollableAncestors = getScrollableAncestors(element);
|
|
const scrollOffsets = getScrollOffsets(scrollableAncestors);
|
|
this.rect = {
|
|
...rect
|
|
};
|
|
this.width = rect.width;
|
|
this.height = rect.height;
|
|
for (const [axis, keys, getScrollOffset] of properties) {
|
|
for (const key2 of keys) {
|
|
Object.defineProperty(this, key2, {
|
|
get: () => {
|
|
const currentOffsets = getScrollOffset(scrollableAncestors);
|
|
const scrollOffsetsDeltla = scrollOffsets[axis] - currentOffsets;
|
|
return this.rect[key2] + scrollOffsetsDeltla;
|
|
},
|
|
enumerable: true
|
|
});
|
|
}
|
|
}
|
|
Object.defineProperty(this, "rect", {
|
|
enumerable: false
|
|
});
|
|
}
|
|
};
|
|
var Listeners = class {
|
|
constructor(target) {
|
|
this.target = void 0;
|
|
this.listeners = [];
|
|
this.removeAll = () => {
|
|
this.listeners.forEach((listener) => {
|
|
var _this$target;
|
|
return (_this$target = this.target) == null ? void 0 : _this$target.removeEventListener(...listener);
|
|
});
|
|
};
|
|
this.target = target;
|
|
}
|
|
add(eventName, handler, options) {
|
|
var _this$target2;
|
|
(_this$target2 = this.target) == null ? void 0 : _this$target2.addEventListener(eventName, handler, options);
|
|
this.listeners.push([eventName, handler, options]);
|
|
}
|
|
};
|
|
function getEventListenerTarget(target) {
|
|
const {
|
|
EventTarget
|
|
} = getWindow(target);
|
|
return target instanceof EventTarget ? target : getOwnerDocument(target);
|
|
}
|
|
function hasExceededDistance(delta, measurement) {
|
|
const dx = Math.abs(delta.x);
|
|
const dy = Math.abs(delta.y);
|
|
if (typeof measurement === "number") {
|
|
return Math.sqrt(dx ** 2 + dy ** 2) > measurement;
|
|
}
|
|
if ("x" in measurement && "y" in measurement) {
|
|
return dx > measurement.x && dy > measurement.y;
|
|
}
|
|
if ("x" in measurement) {
|
|
return dx > measurement.x;
|
|
}
|
|
if ("y" in measurement) {
|
|
return dy > measurement.y;
|
|
}
|
|
return false;
|
|
}
|
|
var EventName;
|
|
(function(EventName2) {
|
|
EventName2["Click"] = "click";
|
|
EventName2["DragStart"] = "dragstart";
|
|
EventName2["Keydown"] = "keydown";
|
|
EventName2["ContextMenu"] = "contextmenu";
|
|
EventName2["Resize"] = "resize";
|
|
EventName2["SelectionChange"] = "selectionchange";
|
|
EventName2["VisibilityChange"] = "visibilitychange";
|
|
})(EventName || (EventName = {}));
|
|
function preventDefault(event) {
|
|
event.preventDefault();
|
|
}
|
|
function stopPropagation(event) {
|
|
event.stopPropagation();
|
|
}
|
|
var KeyboardCode;
|
|
(function(KeyboardCode2) {
|
|
KeyboardCode2["Space"] = "Space";
|
|
KeyboardCode2["Down"] = "ArrowDown";
|
|
KeyboardCode2["Right"] = "ArrowRight";
|
|
KeyboardCode2["Left"] = "ArrowLeft";
|
|
KeyboardCode2["Up"] = "ArrowUp";
|
|
KeyboardCode2["Esc"] = "Escape";
|
|
KeyboardCode2["Enter"] = "Enter";
|
|
})(KeyboardCode || (KeyboardCode = {}));
|
|
var defaultKeyboardCodes = {
|
|
start: [KeyboardCode.Space, KeyboardCode.Enter],
|
|
cancel: [KeyboardCode.Esc],
|
|
end: [KeyboardCode.Space, KeyboardCode.Enter]
|
|
};
|
|
var defaultKeyboardCoordinateGetter = (event, _ref) => {
|
|
let {
|
|
currentCoordinates
|
|
} = _ref;
|
|
switch (event.code) {
|
|
case KeyboardCode.Right:
|
|
return {
|
|
...currentCoordinates,
|
|
x: currentCoordinates.x + 25
|
|
};
|
|
case KeyboardCode.Left:
|
|
return {
|
|
...currentCoordinates,
|
|
x: currentCoordinates.x - 25
|
|
};
|
|
case KeyboardCode.Down:
|
|
return {
|
|
...currentCoordinates,
|
|
y: currentCoordinates.y + 25
|
|
};
|
|
case KeyboardCode.Up:
|
|
return {
|
|
...currentCoordinates,
|
|
y: currentCoordinates.y - 25
|
|
};
|
|
}
|
|
return void 0;
|
|
};
|
|
var KeyboardSensor = class {
|
|
constructor(props2) {
|
|
this.props = void 0;
|
|
this.autoScrollEnabled = false;
|
|
this.referenceCoordinates = void 0;
|
|
this.listeners = void 0;
|
|
this.windowListeners = void 0;
|
|
this.props = props2;
|
|
const {
|
|
event: {
|
|
target
|
|
}
|
|
} = props2;
|
|
this.props = props2;
|
|
this.listeners = new Listeners(getOwnerDocument(target));
|
|
this.windowListeners = new Listeners(getWindow(target));
|
|
this.handleKeyDown = this.handleKeyDown.bind(this);
|
|
this.handleCancel = this.handleCancel.bind(this);
|
|
this.attach();
|
|
}
|
|
attach() {
|
|
this.handleStart();
|
|
this.windowListeners.add(EventName.Resize, this.handleCancel);
|
|
this.windowListeners.add(EventName.VisibilityChange, this.handleCancel);
|
|
setTimeout(() => this.listeners.add(EventName.Keydown, this.handleKeyDown));
|
|
}
|
|
handleStart() {
|
|
const {
|
|
activeNode,
|
|
onStart
|
|
} = this.props;
|
|
const node = activeNode.node.current;
|
|
if (node) {
|
|
scrollIntoViewIfNeeded(node);
|
|
}
|
|
onStart(defaultCoordinates);
|
|
}
|
|
handleKeyDown(event) {
|
|
if (isKeyboardEvent(event)) {
|
|
const {
|
|
active,
|
|
context,
|
|
options
|
|
} = this.props;
|
|
const {
|
|
keyboardCodes = defaultKeyboardCodes,
|
|
coordinateGetter = defaultKeyboardCoordinateGetter,
|
|
scrollBehavior = "smooth"
|
|
} = options;
|
|
const {
|
|
code
|
|
} = event;
|
|
if (keyboardCodes.end.includes(code)) {
|
|
this.handleEnd(event);
|
|
return;
|
|
}
|
|
if (keyboardCodes.cancel.includes(code)) {
|
|
this.handleCancel(event);
|
|
return;
|
|
}
|
|
const {
|
|
collisionRect
|
|
} = context.current;
|
|
const currentCoordinates = collisionRect ? {
|
|
x: collisionRect.left,
|
|
y: collisionRect.top
|
|
} : defaultCoordinates;
|
|
if (!this.referenceCoordinates) {
|
|
this.referenceCoordinates = currentCoordinates;
|
|
}
|
|
const newCoordinates = coordinateGetter(event, {
|
|
active,
|
|
context: context.current,
|
|
currentCoordinates
|
|
});
|
|
if (newCoordinates) {
|
|
const coordinatesDelta = subtract(newCoordinates, currentCoordinates);
|
|
const scrollDelta = {
|
|
x: 0,
|
|
y: 0
|
|
};
|
|
const {
|
|
scrollableAncestors
|
|
} = context.current;
|
|
for (const scrollContainer of scrollableAncestors) {
|
|
const direction = event.code;
|
|
const {
|
|
isTop,
|
|
isRight,
|
|
isLeft,
|
|
isBottom,
|
|
maxScroll,
|
|
minScroll
|
|
} = getScrollPosition(scrollContainer);
|
|
const scrollElementRect = getScrollElementRect(scrollContainer);
|
|
const clampedCoordinates = {
|
|
x: Math.min(direction === KeyboardCode.Right ? scrollElementRect.right - scrollElementRect.width / 2 : scrollElementRect.right, Math.max(direction === KeyboardCode.Right ? scrollElementRect.left : scrollElementRect.left + scrollElementRect.width / 2, newCoordinates.x)),
|
|
y: Math.min(direction === KeyboardCode.Down ? scrollElementRect.bottom - scrollElementRect.height / 2 : scrollElementRect.bottom, Math.max(direction === KeyboardCode.Down ? scrollElementRect.top : scrollElementRect.top + scrollElementRect.height / 2, newCoordinates.y))
|
|
};
|
|
const canScrollX = direction === KeyboardCode.Right && !isRight || direction === KeyboardCode.Left && !isLeft;
|
|
const canScrollY = direction === KeyboardCode.Down && !isBottom || direction === KeyboardCode.Up && !isTop;
|
|
if (canScrollX && clampedCoordinates.x !== newCoordinates.x) {
|
|
const newScrollCoordinates = scrollContainer.scrollLeft + coordinatesDelta.x;
|
|
const canScrollToNewCoordinates = direction === KeyboardCode.Right && newScrollCoordinates <= maxScroll.x || direction === KeyboardCode.Left && newScrollCoordinates >= minScroll.x;
|
|
if (canScrollToNewCoordinates && !coordinatesDelta.y) {
|
|
scrollContainer.scrollTo({
|
|
left: newScrollCoordinates,
|
|
behavior: scrollBehavior
|
|
});
|
|
return;
|
|
}
|
|
if (canScrollToNewCoordinates) {
|
|
scrollDelta.x = scrollContainer.scrollLeft - newScrollCoordinates;
|
|
} else {
|
|
scrollDelta.x = direction === KeyboardCode.Right ? scrollContainer.scrollLeft - maxScroll.x : scrollContainer.scrollLeft - minScroll.x;
|
|
}
|
|
if (scrollDelta.x) {
|
|
scrollContainer.scrollBy({
|
|
left: -scrollDelta.x,
|
|
behavior: scrollBehavior
|
|
});
|
|
}
|
|
break;
|
|
} else if (canScrollY && clampedCoordinates.y !== newCoordinates.y) {
|
|
const newScrollCoordinates = scrollContainer.scrollTop + coordinatesDelta.y;
|
|
const canScrollToNewCoordinates = direction === KeyboardCode.Down && newScrollCoordinates <= maxScroll.y || direction === KeyboardCode.Up && newScrollCoordinates >= minScroll.y;
|
|
if (canScrollToNewCoordinates && !coordinatesDelta.x) {
|
|
scrollContainer.scrollTo({
|
|
top: newScrollCoordinates,
|
|
behavior: scrollBehavior
|
|
});
|
|
return;
|
|
}
|
|
if (canScrollToNewCoordinates) {
|
|
scrollDelta.y = scrollContainer.scrollTop - newScrollCoordinates;
|
|
} else {
|
|
scrollDelta.y = direction === KeyboardCode.Down ? scrollContainer.scrollTop - maxScroll.y : scrollContainer.scrollTop - minScroll.y;
|
|
}
|
|
if (scrollDelta.y) {
|
|
scrollContainer.scrollBy({
|
|
top: -scrollDelta.y,
|
|
behavior: scrollBehavior
|
|
});
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
this.handleMove(event, add(subtract(newCoordinates, this.referenceCoordinates), scrollDelta));
|
|
}
|
|
}
|
|
}
|
|
handleMove(event, coordinates) {
|
|
const {
|
|
onMove
|
|
} = this.props;
|
|
event.preventDefault();
|
|
onMove(coordinates);
|
|
}
|
|
handleEnd(event) {
|
|
const {
|
|
onEnd
|
|
} = this.props;
|
|
event.preventDefault();
|
|
this.detach();
|
|
onEnd();
|
|
}
|
|
handleCancel(event) {
|
|
const {
|
|
onCancel
|
|
} = this.props;
|
|
event.preventDefault();
|
|
this.detach();
|
|
onCancel();
|
|
}
|
|
detach() {
|
|
this.listeners.removeAll();
|
|
this.windowListeners.removeAll();
|
|
}
|
|
};
|
|
KeyboardSensor.activators = [{
|
|
eventName: "onKeyDown",
|
|
handler: (event, _ref, _ref2) => {
|
|
let {
|
|
keyboardCodes = defaultKeyboardCodes,
|
|
onActivation
|
|
} = _ref;
|
|
let {
|
|
active
|
|
} = _ref2;
|
|
const {
|
|
code
|
|
} = event.nativeEvent;
|
|
if (keyboardCodes.start.includes(code)) {
|
|
const activator = active.activatorNode.current;
|
|
if (activator && event.target !== activator) {
|
|
return false;
|
|
}
|
|
event.preventDefault();
|
|
onActivation == null ? void 0 : onActivation({
|
|
event: event.nativeEvent
|
|
});
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
}];
|
|
function isDistanceConstraint(constraint) {
|
|
return Boolean(constraint && "distance" in constraint);
|
|
}
|
|
function isDelayConstraint(constraint) {
|
|
return Boolean(constraint && "delay" in constraint);
|
|
}
|
|
var AbstractPointerSensor = class {
|
|
constructor(props2, events2, listenerTarget) {
|
|
var _getEventCoordinates;
|
|
if (listenerTarget === void 0) {
|
|
listenerTarget = getEventListenerTarget(props2.event.target);
|
|
}
|
|
this.props = void 0;
|
|
this.events = void 0;
|
|
this.autoScrollEnabled = true;
|
|
this.document = void 0;
|
|
this.activated = false;
|
|
this.initialCoordinates = void 0;
|
|
this.timeoutId = null;
|
|
this.listeners = void 0;
|
|
this.documentListeners = void 0;
|
|
this.windowListeners = void 0;
|
|
this.props = props2;
|
|
this.events = events2;
|
|
const {
|
|
event
|
|
} = props2;
|
|
const {
|
|
target
|
|
} = event;
|
|
this.props = props2;
|
|
this.events = events2;
|
|
this.document = getOwnerDocument(target);
|
|
this.documentListeners = new Listeners(this.document);
|
|
this.listeners = new Listeners(listenerTarget);
|
|
this.windowListeners = new Listeners(getWindow(target));
|
|
this.initialCoordinates = (_getEventCoordinates = getEventCoordinates(event)) != null ? _getEventCoordinates : defaultCoordinates;
|
|
this.handleStart = this.handleStart.bind(this);
|
|
this.handleMove = this.handleMove.bind(this);
|
|
this.handleEnd = this.handleEnd.bind(this);
|
|
this.handleCancel = this.handleCancel.bind(this);
|
|
this.handleKeydown = this.handleKeydown.bind(this);
|
|
this.removeTextSelection = this.removeTextSelection.bind(this);
|
|
this.attach();
|
|
}
|
|
attach() {
|
|
const {
|
|
events: events2,
|
|
props: {
|
|
options: {
|
|
activationConstraint
|
|
}
|
|
}
|
|
} = this;
|
|
this.listeners.add(events2.move.name, this.handleMove, {
|
|
passive: false
|
|
});
|
|
this.listeners.add(events2.end.name, this.handleEnd);
|
|
this.windowListeners.add(EventName.Resize, this.handleCancel);
|
|
this.windowListeners.add(EventName.DragStart, preventDefault);
|
|
this.windowListeners.add(EventName.VisibilityChange, this.handleCancel);
|
|
this.windowListeners.add(EventName.ContextMenu, preventDefault);
|
|
this.documentListeners.add(EventName.Keydown, this.handleKeydown);
|
|
if (activationConstraint) {
|
|
if (isDistanceConstraint(activationConstraint)) {
|
|
return;
|
|
}
|
|
if (isDelayConstraint(activationConstraint)) {
|
|
this.timeoutId = setTimeout(this.handleStart, activationConstraint.delay);
|
|
return;
|
|
}
|
|
}
|
|
this.handleStart();
|
|
}
|
|
detach() {
|
|
this.listeners.removeAll();
|
|
this.windowListeners.removeAll();
|
|
setTimeout(this.documentListeners.removeAll, 50);
|
|
if (this.timeoutId !== null) {
|
|
clearTimeout(this.timeoutId);
|
|
this.timeoutId = null;
|
|
}
|
|
}
|
|
handleStart() {
|
|
const {
|
|
initialCoordinates
|
|
} = this;
|
|
const {
|
|
onStart
|
|
} = this.props;
|
|
if (initialCoordinates) {
|
|
this.activated = true;
|
|
this.documentListeners.add(EventName.Click, stopPropagation, {
|
|
capture: true
|
|
});
|
|
this.removeTextSelection();
|
|
this.documentListeners.add(EventName.SelectionChange, this.removeTextSelection);
|
|
onStart(initialCoordinates);
|
|
}
|
|
}
|
|
handleMove(event) {
|
|
var _getEventCoordinates2;
|
|
const {
|
|
activated,
|
|
initialCoordinates,
|
|
props: props2
|
|
} = this;
|
|
const {
|
|
onMove,
|
|
options: {
|
|
activationConstraint
|
|
}
|
|
} = props2;
|
|
if (!initialCoordinates) {
|
|
return;
|
|
}
|
|
const coordinates = (_getEventCoordinates2 = getEventCoordinates(event)) != null ? _getEventCoordinates2 : defaultCoordinates;
|
|
const delta = subtract(initialCoordinates, coordinates);
|
|
if (!activated && activationConstraint) {
|
|
if (isDelayConstraint(activationConstraint)) {
|
|
if (hasExceededDistance(delta, activationConstraint.tolerance)) {
|
|
return this.handleCancel();
|
|
}
|
|
return;
|
|
}
|
|
if (isDistanceConstraint(activationConstraint)) {
|
|
if (activationConstraint.tolerance != null && hasExceededDistance(delta, activationConstraint.tolerance)) {
|
|
return this.handleCancel();
|
|
}
|
|
if (hasExceededDistance(delta, activationConstraint.distance)) {
|
|
return this.handleStart();
|
|
}
|
|
return;
|
|
}
|
|
}
|
|
if (event.cancelable) {
|
|
event.preventDefault();
|
|
}
|
|
onMove(coordinates);
|
|
}
|
|
handleEnd() {
|
|
const {
|
|
onEnd
|
|
} = this.props;
|
|
this.detach();
|
|
onEnd();
|
|
}
|
|
handleCancel() {
|
|
const {
|
|
onCancel
|
|
} = this.props;
|
|
this.detach();
|
|
onCancel();
|
|
}
|
|
handleKeydown(event) {
|
|
if (event.code === KeyboardCode.Esc) {
|
|
this.handleCancel();
|
|
}
|
|
}
|
|
removeTextSelection() {
|
|
var _this$document$getSel;
|
|
(_this$document$getSel = this.document.getSelection()) == null ? void 0 : _this$document$getSel.removeAllRanges();
|
|
}
|
|
};
|
|
var events = {
|
|
move: {
|
|
name: "pointermove"
|
|
},
|
|
end: {
|
|
name: "pointerup"
|
|
}
|
|
};
|
|
var PointerSensor = class extends AbstractPointerSensor {
|
|
constructor(props2) {
|
|
const {
|
|
event
|
|
} = props2;
|
|
const listenerTarget = getOwnerDocument(event.target);
|
|
super(props2, events, listenerTarget);
|
|
}
|
|
};
|
|
PointerSensor.activators = [{
|
|
eventName: "onPointerDown",
|
|
handler: (_ref, _ref2) => {
|
|
let {
|
|
nativeEvent: event
|
|
} = _ref;
|
|
let {
|
|
onActivation
|
|
} = _ref2;
|
|
if (!event.isPrimary || event.button !== 0) {
|
|
return false;
|
|
}
|
|
onActivation == null ? void 0 : onActivation({
|
|
event
|
|
});
|
|
return true;
|
|
}
|
|
}];
|
|
var events$1 = {
|
|
move: {
|
|
name: "mousemove"
|
|
},
|
|
end: {
|
|
name: "mouseup"
|
|
}
|
|
};
|
|
var MouseButton;
|
|
(function(MouseButton2) {
|
|
MouseButton2[MouseButton2["RightClick"] = 2] = "RightClick";
|
|
})(MouseButton || (MouseButton = {}));
|
|
var MouseSensor = class extends AbstractPointerSensor {
|
|
constructor(props2) {
|
|
super(props2, events$1, getOwnerDocument(props2.event.target));
|
|
}
|
|
};
|
|
MouseSensor.activators = [{
|
|
eventName: "onMouseDown",
|
|
handler: (_ref, _ref2) => {
|
|
let {
|
|
nativeEvent: event
|
|
} = _ref;
|
|
let {
|
|
onActivation
|
|
} = _ref2;
|
|
if (event.button === MouseButton.RightClick) {
|
|
return false;
|
|
}
|
|
onActivation == null ? void 0 : onActivation({
|
|
event
|
|
});
|
|
return true;
|
|
}
|
|
}];
|
|
var events$2 = {
|
|
move: {
|
|
name: "touchmove"
|
|
},
|
|
end: {
|
|
name: "touchend"
|
|
}
|
|
};
|
|
var TouchSensor = class extends AbstractPointerSensor {
|
|
constructor(props2) {
|
|
super(props2, events$2);
|
|
}
|
|
static setup() {
|
|
window.addEventListener(events$2.move.name, noop2, {
|
|
capture: false,
|
|
passive: false
|
|
});
|
|
return function teardown() {
|
|
window.removeEventListener(events$2.move.name, noop2);
|
|
};
|
|
function noop2() {
|
|
}
|
|
}
|
|
};
|
|
TouchSensor.activators = [{
|
|
eventName: "onTouchStart",
|
|
handler: (_ref, _ref2) => {
|
|
let {
|
|
nativeEvent: event
|
|
} = _ref;
|
|
let {
|
|
onActivation
|
|
} = _ref2;
|
|
const {
|
|
touches
|
|
} = event;
|
|
if (touches.length > 1) {
|
|
return false;
|
|
}
|
|
onActivation == null ? void 0 : onActivation({
|
|
event
|
|
});
|
|
return true;
|
|
}
|
|
}];
|
|
var AutoScrollActivator;
|
|
(function(AutoScrollActivator2) {
|
|
AutoScrollActivator2[AutoScrollActivator2["Pointer"] = 0] = "Pointer";
|
|
AutoScrollActivator2[AutoScrollActivator2["DraggableRect"] = 1] = "DraggableRect";
|
|
})(AutoScrollActivator || (AutoScrollActivator = {}));
|
|
var TraversalOrder;
|
|
(function(TraversalOrder2) {
|
|
TraversalOrder2[TraversalOrder2["TreeOrder"] = 0] = "TreeOrder";
|
|
TraversalOrder2[TraversalOrder2["ReversedTreeOrder"] = 1] = "ReversedTreeOrder";
|
|
})(TraversalOrder || (TraversalOrder = {}));
|
|
function useAutoScroller(_ref) {
|
|
let {
|
|
acceleration,
|
|
activator = AutoScrollActivator.Pointer,
|
|
canScroll,
|
|
draggingRect,
|
|
enabled,
|
|
interval = 5,
|
|
order = TraversalOrder.TreeOrder,
|
|
pointerCoordinates,
|
|
scrollableAncestors,
|
|
scrollableAncestorRects,
|
|
delta,
|
|
threshold
|
|
} = _ref;
|
|
const scrollIntent = useScrollIntent({
|
|
delta,
|
|
disabled: !enabled
|
|
});
|
|
const [setAutoScrollInterval, clearAutoScrollInterval] = useInterval();
|
|
const scrollSpeed = _2({
|
|
x: 0,
|
|
y: 0
|
|
});
|
|
const scrollDirection = _2({
|
|
x: 0,
|
|
y: 0
|
|
});
|
|
const rect = F(() => {
|
|
switch (activator) {
|
|
case AutoScrollActivator.Pointer:
|
|
return pointerCoordinates ? {
|
|
top: pointerCoordinates.y,
|
|
bottom: pointerCoordinates.y,
|
|
left: pointerCoordinates.x,
|
|
right: pointerCoordinates.x
|
|
} : null;
|
|
case AutoScrollActivator.DraggableRect:
|
|
return draggingRect;
|
|
}
|
|
}, [activator, draggingRect, pointerCoordinates]);
|
|
const scrollContainerRef = _2(null);
|
|
const autoScroll = T2(() => {
|
|
const scrollContainer = scrollContainerRef.current;
|
|
if (!scrollContainer) {
|
|
return;
|
|
}
|
|
const scrollLeft = scrollSpeed.current.x * scrollDirection.current.x;
|
|
const scrollTop = scrollSpeed.current.y * scrollDirection.current.y;
|
|
scrollContainer.scrollBy(scrollLeft, scrollTop);
|
|
}, []);
|
|
const sortedScrollableAncestors = F(() => order === TraversalOrder.TreeOrder ? [...scrollableAncestors].reverse() : scrollableAncestors, [order, scrollableAncestors]);
|
|
h2(
|
|
() => {
|
|
if (!enabled || !scrollableAncestors.length || !rect) {
|
|
clearAutoScrollInterval();
|
|
return;
|
|
}
|
|
for (const scrollContainer of sortedScrollableAncestors) {
|
|
if ((canScroll == null ? void 0 : canScroll(scrollContainer)) === false) {
|
|
continue;
|
|
}
|
|
const index = scrollableAncestors.indexOf(scrollContainer);
|
|
const scrollContainerRect = scrollableAncestorRects[index];
|
|
if (!scrollContainerRect) {
|
|
continue;
|
|
}
|
|
const {
|
|
direction,
|
|
speed
|
|
} = getScrollDirectionAndSpeed(scrollContainer, scrollContainerRect, rect, acceleration, threshold);
|
|
for (const axis of ["x", "y"]) {
|
|
if (!scrollIntent[axis][direction[axis]]) {
|
|
speed[axis] = 0;
|
|
direction[axis] = 0;
|
|
}
|
|
}
|
|
if (speed.x > 0 || speed.y > 0) {
|
|
clearAutoScrollInterval();
|
|
scrollContainerRef.current = scrollContainer;
|
|
setAutoScrollInterval(autoScroll, interval);
|
|
scrollSpeed.current = speed;
|
|
scrollDirection.current = direction;
|
|
return;
|
|
}
|
|
}
|
|
scrollSpeed.current = {
|
|
x: 0,
|
|
y: 0
|
|
};
|
|
scrollDirection.current = {
|
|
x: 0,
|
|
y: 0
|
|
};
|
|
clearAutoScrollInterval();
|
|
},
|
|
[
|
|
acceleration,
|
|
autoScroll,
|
|
canScroll,
|
|
clearAutoScrollInterval,
|
|
enabled,
|
|
interval,
|
|
JSON.stringify(rect),
|
|
JSON.stringify(scrollIntent),
|
|
setAutoScrollInterval,
|
|
scrollableAncestors,
|
|
sortedScrollableAncestors,
|
|
scrollableAncestorRects,
|
|
JSON.stringify(threshold)
|
|
]
|
|
);
|
|
}
|
|
var defaultScrollIntent = {
|
|
x: {
|
|
[Direction2.Backward]: false,
|
|
[Direction2.Forward]: false
|
|
},
|
|
y: {
|
|
[Direction2.Backward]: false,
|
|
[Direction2.Forward]: false
|
|
}
|
|
};
|
|
function useScrollIntent(_ref2) {
|
|
let {
|
|
delta,
|
|
disabled
|
|
} = _ref2;
|
|
const previousDelta = usePrevious(delta);
|
|
return useLazyMemo((previousIntent) => {
|
|
if (disabled || !previousDelta || !previousIntent) {
|
|
return defaultScrollIntent;
|
|
}
|
|
const direction = {
|
|
x: Math.sign(delta.x - previousDelta.x),
|
|
y: Math.sign(delta.y - previousDelta.y)
|
|
};
|
|
return {
|
|
x: {
|
|
[Direction2.Backward]: previousIntent.x[Direction2.Backward] || direction.x === -1,
|
|
[Direction2.Forward]: previousIntent.x[Direction2.Forward] || direction.x === 1
|
|
},
|
|
y: {
|
|
[Direction2.Backward]: previousIntent.y[Direction2.Backward] || direction.y === -1,
|
|
[Direction2.Forward]: previousIntent.y[Direction2.Forward] || direction.y === 1
|
|
}
|
|
};
|
|
}, [disabled, delta, previousDelta]);
|
|
}
|
|
function useCachedNode(draggableNodes, id2) {
|
|
const draggableNode = id2 !== null ? draggableNodes.get(id2) : void 0;
|
|
const node = draggableNode ? draggableNode.node.current : null;
|
|
return useLazyMemo((cachedNode) => {
|
|
var _ref;
|
|
if (id2 === null) {
|
|
return null;
|
|
}
|
|
return (_ref = node != null ? node : cachedNode) != null ? _ref : null;
|
|
}, [node, id2]);
|
|
}
|
|
function useCombineActivators(sensors, getSyntheticHandler) {
|
|
return F(() => sensors.reduce((accumulator, sensor) => {
|
|
const {
|
|
sensor: Sensor
|
|
} = sensor;
|
|
const sensorActivators = Sensor.activators.map((activator) => ({
|
|
eventName: activator.eventName,
|
|
handler: getSyntheticHandler(activator.handler, sensor)
|
|
}));
|
|
return [...accumulator, ...sensorActivators];
|
|
}, []), [sensors, getSyntheticHandler]);
|
|
}
|
|
var MeasuringStrategy;
|
|
(function(MeasuringStrategy2) {
|
|
MeasuringStrategy2[MeasuringStrategy2["Always"] = 0] = "Always";
|
|
MeasuringStrategy2[MeasuringStrategy2["BeforeDragging"] = 1] = "BeforeDragging";
|
|
MeasuringStrategy2[MeasuringStrategy2["WhileDragging"] = 2] = "WhileDragging";
|
|
})(MeasuringStrategy || (MeasuringStrategy = {}));
|
|
var MeasuringFrequency;
|
|
(function(MeasuringFrequency2) {
|
|
MeasuringFrequency2["Optimized"] = "optimized";
|
|
})(MeasuringFrequency || (MeasuringFrequency = {}));
|
|
var defaultValue = /* @__PURE__ */ new Map();
|
|
function useDroppableMeasuring(containers, _ref) {
|
|
let {
|
|
dragging,
|
|
dependencies,
|
|
config
|
|
} = _ref;
|
|
const [containerIdsScheduledForMeasurement, setContainerIdsScheduledForMeasurement] = p2(null);
|
|
const measuringScheduled = containerIdsScheduledForMeasurement != null;
|
|
const {
|
|
frequency,
|
|
measure,
|
|
strategy
|
|
} = config;
|
|
const containersRef = _2(containers);
|
|
const disabled = isDisabled();
|
|
const disabledRef = useLatestValue(disabled);
|
|
const measureDroppableContainers = T2(function(ids2) {
|
|
if (ids2 === void 0) {
|
|
ids2 = [];
|
|
}
|
|
if (disabledRef.current) {
|
|
return;
|
|
}
|
|
setContainerIdsScheduledForMeasurement((value) => value ? value.concat(ids2) : ids2);
|
|
}, [disabledRef]);
|
|
const timeoutId = _2(null);
|
|
const droppableRects = useLazyMemo((previousValue) => {
|
|
if (disabled && !dragging) {
|
|
return defaultValue;
|
|
}
|
|
const ids2 = containerIdsScheduledForMeasurement;
|
|
if (!previousValue || previousValue === defaultValue || containersRef.current !== containers || ids2 != null) {
|
|
const map = /* @__PURE__ */ new Map();
|
|
for (let container of containers) {
|
|
if (!container) {
|
|
continue;
|
|
}
|
|
if (ids2 && ids2.length > 0 && !ids2.includes(container.id) && container.rect.current) {
|
|
map.set(container.id, container.rect.current);
|
|
continue;
|
|
}
|
|
const node = container.node.current;
|
|
const rect = node ? new Rect(measure(node), node) : null;
|
|
container.rect.current = rect;
|
|
if (rect) {
|
|
map.set(container.id, rect);
|
|
}
|
|
}
|
|
return map;
|
|
}
|
|
return previousValue;
|
|
}, [containers, containerIdsScheduledForMeasurement, dragging, disabled, measure]);
|
|
h2(() => {
|
|
containersRef.current = containers;
|
|
}, [containers]);
|
|
h2(
|
|
() => {
|
|
if (disabled) {
|
|
return;
|
|
}
|
|
requestAnimationFrame(() => measureDroppableContainers());
|
|
},
|
|
[dragging, disabled]
|
|
);
|
|
h2(() => {
|
|
if (measuringScheduled) {
|
|
setContainerIdsScheduledForMeasurement(null);
|
|
}
|
|
}, [measuringScheduled]);
|
|
h2(
|
|
() => {
|
|
if (disabled || typeof frequency !== "number" || timeoutId.current !== null) {
|
|
return;
|
|
}
|
|
timeoutId.current = setTimeout(() => {
|
|
measureDroppableContainers();
|
|
timeoutId.current = null;
|
|
}, frequency);
|
|
},
|
|
[frequency, disabled, measureDroppableContainers, ...dependencies]
|
|
);
|
|
return {
|
|
droppableRects,
|
|
measureDroppableContainers,
|
|
measuringScheduled
|
|
};
|
|
function isDisabled() {
|
|
switch (strategy) {
|
|
case MeasuringStrategy.Always:
|
|
return false;
|
|
case MeasuringStrategy.BeforeDragging:
|
|
return dragging;
|
|
default:
|
|
return !dragging;
|
|
}
|
|
}
|
|
}
|
|
function useInitialValue(value, computeFn) {
|
|
return useLazyMemo((previousValue) => {
|
|
if (!value) {
|
|
return null;
|
|
}
|
|
if (previousValue) {
|
|
return previousValue;
|
|
}
|
|
return typeof computeFn === "function" ? computeFn(value) : value;
|
|
}, [computeFn, value]);
|
|
}
|
|
function useInitialRect(node, measure) {
|
|
return useInitialValue(node, measure);
|
|
}
|
|
function useMutationObserver(_ref) {
|
|
let {
|
|
callback,
|
|
disabled
|
|
} = _ref;
|
|
const handleMutations = useEvent(callback);
|
|
const mutationObserver = F(() => {
|
|
if (disabled || typeof window === "undefined" || typeof window.MutationObserver === "undefined") {
|
|
return void 0;
|
|
}
|
|
const {
|
|
MutationObserver
|
|
} = window;
|
|
return new MutationObserver(handleMutations);
|
|
}, [handleMutations, disabled]);
|
|
h2(() => {
|
|
return () => mutationObserver == null ? void 0 : mutationObserver.disconnect();
|
|
}, [mutationObserver]);
|
|
return mutationObserver;
|
|
}
|
|
function useResizeObserver(_ref) {
|
|
let {
|
|
callback,
|
|
disabled
|
|
} = _ref;
|
|
const handleResize = useEvent(callback);
|
|
const resizeObserver = F(
|
|
() => {
|
|
if (disabled || typeof window === "undefined" || typeof window.ResizeObserver === "undefined") {
|
|
return void 0;
|
|
}
|
|
const {
|
|
ResizeObserver
|
|
} = window;
|
|
return new ResizeObserver(handleResize);
|
|
},
|
|
[disabled]
|
|
);
|
|
h2(() => {
|
|
return () => resizeObserver == null ? void 0 : resizeObserver.disconnect();
|
|
}, [resizeObserver]);
|
|
return resizeObserver;
|
|
}
|
|
function defaultMeasure(element) {
|
|
return new Rect(getClientRect(element), element);
|
|
}
|
|
function useRect(element, measure, fallbackRect) {
|
|
if (measure === void 0) {
|
|
measure = defaultMeasure;
|
|
}
|
|
const [rect, measureRect] = y2(reducer2, null);
|
|
const mutationObserver = useMutationObserver({
|
|
callback(records) {
|
|
if (!element) {
|
|
return;
|
|
}
|
|
for (const record of records) {
|
|
const {
|
|
type,
|
|
target
|
|
} = record;
|
|
if (type === "childList" && target instanceof HTMLElement && target.contains(element)) {
|
|
measureRect();
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
});
|
|
const resizeObserver = useResizeObserver({
|
|
callback: measureRect
|
|
});
|
|
useIsomorphicLayoutEffect(() => {
|
|
measureRect();
|
|
if (element) {
|
|
resizeObserver == null ? void 0 : resizeObserver.observe(element);
|
|
mutationObserver == null ? void 0 : mutationObserver.observe(document.body, {
|
|
childList: true,
|
|
subtree: true
|
|
});
|
|
} else {
|
|
resizeObserver == null ? void 0 : resizeObserver.disconnect();
|
|
mutationObserver == null ? void 0 : mutationObserver.disconnect();
|
|
}
|
|
}, [element]);
|
|
return rect;
|
|
function reducer2(currentRect) {
|
|
if (!element) {
|
|
return null;
|
|
}
|
|
if (element.isConnected === false) {
|
|
var _ref;
|
|
return (_ref = currentRect != null ? currentRect : fallbackRect) != null ? _ref : null;
|
|
}
|
|
const newRect = measure(element);
|
|
if (JSON.stringify(currentRect) === JSON.stringify(newRect)) {
|
|
return currentRect;
|
|
}
|
|
return newRect;
|
|
}
|
|
}
|
|
function useRectDelta(rect) {
|
|
const initialRect = useInitialValue(rect);
|
|
return getRectDelta(rect, initialRect);
|
|
}
|
|
var defaultValue$1 = [];
|
|
function useScrollableAncestors(node) {
|
|
const previousNode = _2(node);
|
|
const ancestors = useLazyMemo((previousValue) => {
|
|
if (!node) {
|
|
return defaultValue$1;
|
|
}
|
|
if (previousValue && previousValue !== defaultValue$1 && node && previousNode.current && node.parentNode === previousNode.current.parentNode) {
|
|
return previousValue;
|
|
}
|
|
return getScrollableAncestors(node);
|
|
}, [node]);
|
|
h2(() => {
|
|
previousNode.current = node;
|
|
}, [node]);
|
|
return ancestors;
|
|
}
|
|
function useScrollOffsets(elements) {
|
|
const [scrollCoordinates, setScrollCoordinates] = p2(null);
|
|
const prevElements = _2(elements);
|
|
const handleScroll = T2((event) => {
|
|
const scrollingElement = getScrollableElement(event.target);
|
|
if (!scrollingElement) {
|
|
return;
|
|
}
|
|
setScrollCoordinates((scrollCoordinates2) => {
|
|
if (!scrollCoordinates2) {
|
|
return null;
|
|
}
|
|
scrollCoordinates2.set(scrollingElement, getScrollCoordinates(scrollingElement));
|
|
return new Map(scrollCoordinates2);
|
|
});
|
|
}, []);
|
|
h2(() => {
|
|
const previousElements = prevElements.current;
|
|
if (elements !== previousElements) {
|
|
cleanup(previousElements);
|
|
const entries = elements.map((element) => {
|
|
const scrollableElement = getScrollableElement(element);
|
|
if (scrollableElement) {
|
|
scrollableElement.addEventListener("scroll", handleScroll, {
|
|
passive: true
|
|
});
|
|
return [scrollableElement, getScrollCoordinates(scrollableElement)];
|
|
}
|
|
return null;
|
|
}).filter((entry) => entry != null);
|
|
setScrollCoordinates(entries.length ? new Map(entries) : null);
|
|
prevElements.current = elements;
|
|
}
|
|
return () => {
|
|
cleanup(elements);
|
|
cleanup(previousElements);
|
|
};
|
|
function cleanup(elements2) {
|
|
elements2.forEach((element) => {
|
|
const scrollableElement = getScrollableElement(element);
|
|
scrollableElement == null ? void 0 : scrollableElement.removeEventListener("scroll", handleScroll);
|
|
});
|
|
}
|
|
}, [handleScroll, elements]);
|
|
return F(() => {
|
|
if (elements.length) {
|
|
return scrollCoordinates ? Array.from(scrollCoordinates.values()).reduce((acc, coordinates) => add(acc, coordinates), defaultCoordinates) : getScrollOffsets(elements);
|
|
}
|
|
return defaultCoordinates;
|
|
}, [elements, scrollCoordinates]);
|
|
}
|
|
function useScrollOffsetsDelta(scrollOffsets, dependencies) {
|
|
if (dependencies === void 0) {
|
|
dependencies = [];
|
|
}
|
|
const initialScrollOffsets = _2(null);
|
|
h2(
|
|
() => {
|
|
initialScrollOffsets.current = null;
|
|
},
|
|
dependencies
|
|
);
|
|
h2(() => {
|
|
const hasScrollOffsets = scrollOffsets !== defaultCoordinates;
|
|
if (hasScrollOffsets && !initialScrollOffsets.current) {
|
|
initialScrollOffsets.current = scrollOffsets;
|
|
}
|
|
if (!hasScrollOffsets && initialScrollOffsets.current) {
|
|
initialScrollOffsets.current = null;
|
|
}
|
|
}, [scrollOffsets]);
|
|
return initialScrollOffsets.current ? subtract(scrollOffsets, initialScrollOffsets.current) : defaultCoordinates;
|
|
}
|
|
function useSensorSetup(sensors) {
|
|
h2(
|
|
() => {
|
|
if (!canUseDOM) {
|
|
return;
|
|
}
|
|
const teardownFns = sensors.map((_ref) => {
|
|
let {
|
|
sensor
|
|
} = _ref;
|
|
return sensor.setup == null ? void 0 : sensor.setup();
|
|
});
|
|
return () => {
|
|
for (const teardown of teardownFns) {
|
|
teardown == null ? void 0 : teardown();
|
|
}
|
|
};
|
|
},
|
|
sensors.map((_ref2) => {
|
|
let {
|
|
sensor
|
|
} = _ref2;
|
|
return sensor;
|
|
})
|
|
);
|
|
}
|
|
function useSyntheticListeners(listeners, id2) {
|
|
return F(() => {
|
|
return listeners.reduce((acc, _ref) => {
|
|
let {
|
|
eventName,
|
|
handler
|
|
} = _ref;
|
|
acc[eventName] = (event) => {
|
|
handler(event, id2);
|
|
};
|
|
return acc;
|
|
}, {});
|
|
}, [listeners, id2]);
|
|
}
|
|
function useWindowRect(element) {
|
|
return F(() => element ? getWindowClientRect(element) : null, [element]);
|
|
}
|
|
var defaultValue$2 = [];
|
|
function useRects(elements, measure) {
|
|
if (measure === void 0) {
|
|
measure = getClientRect;
|
|
}
|
|
const [firstElement] = elements;
|
|
const windowRect = useWindowRect(firstElement ? getWindow(firstElement) : null);
|
|
const [rects, measureRects] = y2(reducer2, defaultValue$2);
|
|
const resizeObserver = useResizeObserver({
|
|
callback: measureRects
|
|
});
|
|
if (elements.length > 0 && rects === defaultValue$2) {
|
|
measureRects();
|
|
}
|
|
useIsomorphicLayoutEffect(() => {
|
|
if (elements.length) {
|
|
elements.forEach((element) => resizeObserver == null ? void 0 : resizeObserver.observe(element));
|
|
} else {
|
|
resizeObserver == null ? void 0 : resizeObserver.disconnect();
|
|
measureRects();
|
|
}
|
|
}, [elements]);
|
|
return rects;
|
|
function reducer2() {
|
|
if (!elements.length) {
|
|
return defaultValue$2;
|
|
}
|
|
return elements.map((element) => isDocumentScrollingElement(element) ? windowRect : new Rect(measure(element), element));
|
|
}
|
|
}
|
|
function getMeasurableNode(node) {
|
|
if (!node) {
|
|
return null;
|
|
}
|
|
if (node.children.length > 1) {
|
|
return node;
|
|
}
|
|
const firstChild = node.children[0];
|
|
return isHTMLElement(firstChild) ? firstChild : node;
|
|
}
|
|
function useDragOverlayMeasuring(_ref) {
|
|
let {
|
|
measure
|
|
} = _ref;
|
|
const [rect, setRect] = p2(null);
|
|
const handleResize = T2((entries) => {
|
|
for (const {
|
|
target
|
|
} of entries) {
|
|
if (isHTMLElement(target)) {
|
|
setRect((rect2) => {
|
|
const newRect = measure(target);
|
|
return rect2 ? {
|
|
...rect2,
|
|
width: newRect.width,
|
|
height: newRect.height
|
|
} : newRect;
|
|
});
|
|
break;
|
|
}
|
|
}
|
|
}, [measure]);
|
|
const resizeObserver = useResizeObserver({
|
|
callback: handleResize
|
|
});
|
|
const handleNodeChange = T2((element) => {
|
|
const node = getMeasurableNode(element);
|
|
resizeObserver == null ? void 0 : resizeObserver.disconnect();
|
|
if (node) {
|
|
resizeObserver == null ? void 0 : resizeObserver.observe(node);
|
|
}
|
|
setRect(node ? measure(node) : null);
|
|
}, [measure, resizeObserver]);
|
|
const [nodeRef, setRef] = useNodeRef(handleNodeChange);
|
|
return F(() => ({
|
|
nodeRef,
|
|
rect,
|
|
setRef
|
|
}), [rect, nodeRef, setRef]);
|
|
}
|
|
var defaultSensors = [{
|
|
sensor: PointerSensor,
|
|
options: {}
|
|
}, {
|
|
sensor: KeyboardSensor,
|
|
options: {}
|
|
}];
|
|
var defaultData = {
|
|
current: {}
|
|
};
|
|
var defaultMeasuringConfiguration = {
|
|
draggable: {
|
|
measure: getTransformAgnosticClientRect
|
|
},
|
|
droppable: {
|
|
measure: getTransformAgnosticClientRect,
|
|
strategy: MeasuringStrategy.WhileDragging,
|
|
frequency: MeasuringFrequency.Optimized
|
|
},
|
|
dragOverlay: {
|
|
measure: getClientRect
|
|
}
|
|
};
|
|
var DroppableContainersMap = class extends Map {
|
|
get(id2) {
|
|
var _super$get;
|
|
return id2 != null ? (_super$get = super.get(id2)) != null ? _super$get : void 0 : void 0;
|
|
}
|
|
toArray() {
|
|
return Array.from(this.values());
|
|
}
|
|
getEnabled() {
|
|
return this.toArray().filter((_ref) => {
|
|
let {
|
|
disabled
|
|
} = _ref;
|
|
return !disabled;
|
|
});
|
|
}
|
|
getNodeFor(id2) {
|
|
var _this$get$node$curren, _this$get;
|
|
return (_this$get$node$curren = (_this$get = this.get(id2)) == null ? void 0 : _this$get.node.current) != null ? _this$get$node$curren : void 0;
|
|
}
|
|
};
|
|
var defaultPublicContext = {
|
|
activatorEvent: null,
|
|
active: null,
|
|
activeNode: null,
|
|
activeNodeRect: null,
|
|
collisions: null,
|
|
containerNodeRect: null,
|
|
draggableNodes: /* @__PURE__ */ new Map(),
|
|
droppableRects: /* @__PURE__ */ new Map(),
|
|
droppableContainers: /* @__PURE__ */ new DroppableContainersMap(),
|
|
over: null,
|
|
dragOverlay: {
|
|
nodeRef: {
|
|
current: null
|
|
},
|
|
rect: null,
|
|
setRef: noop
|
|
},
|
|
scrollableAncestors: [],
|
|
scrollableAncestorRects: [],
|
|
measuringConfiguration: defaultMeasuringConfiguration,
|
|
measureDroppableContainers: noop,
|
|
windowRect: null,
|
|
measuringScheduled: false
|
|
};
|
|
var defaultInternalContext = {
|
|
activatorEvent: null,
|
|
activators: [],
|
|
active: null,
|
|
activeNodeRect: null,
|
|
ariaDescribedById: {
|
|
draggable: ""
|
|
},
|
|
dispatch: noop,
|
|
draggableNodes: /* @__PURE__ */ new Map(),
|
|
over: null,
|
|
measureDroppableContainers: noop
|
|
};
|
|
var InternalContext = /* @__PURE__ */ B(defaultInternalContext);
|
|
var PublicContext = /* @__PURE__ */ B(defaultPublicContext);
|
|
function getInitialState() {
|
|
return {
|
|
draggable: {
|
|
active: null,
|
|
initialCoordinates: {
|
|
x: 0,
|
|
y: 0
|
|
},
|
|
nodes: /* @__PURE__ */ new Map(),
|
|
translate: {
|
|
x: 0,
|
|
y: 0
|
|
}
|
|
},
|
|
droppable: {
|
|
containers: new DroppableContainersMap()
|
|
}
|
|
};
|
|
}
|
|
function reducer(state, action) {
|
|
switch (action.type) {
|
|
case Action.DragStart:
|
|
return {
|
|
...state,
|
|
draggable: {
|
|
...state.draggable,
|
|
initialCoordinates: action.initialCoordinates,
|
|
active: action.active
|
|
}
|
|
};
|
|
case Action.DragMove:
|
|
if (!state.draggable.active) {
|
|
return state;
|
|
}
|
|
return {
|
|
...state,
|
|
draggable: {
|
|
...state.draggable,
|
|
translate: {
|
|
x: action.coordinates.x - state.draggable.initialCoordinates.x,
|
|
y: action.coordinates.y - state.draggable.initialCoordinates.y
|
|
}
|
|
}
|
|
};
|
|
case Action.DragEnd:
|
|
case Action.DragCancel:
|
|
return {
|
|
...state,
|
|
draggable: {
|
|
...state.draggable,
|
|
active: null,
|
|
initialCoordinates: {
|
|
x: 0,
|
|
y: 0
|
|
},
|
|
translate: {
|
|
x: 0,
|
|
y: 0
|
|
}
|
|
}
|
|
};
|
|
case Action.RegisterDroppable: {
|
|
const {
|
|
element
|
|
} = action;
|
|
const {
|
|
id: id2
|
|
} = element;
|
|
const containers = new DroppableContainersMap(state.droppable.containers);
|
|
containers.set(id2, element);
|
|
return {
|
|
...state,
|
|
droppable: {
|
|
...state.droppable,
|
|
containers
|
|
}
|
|
};
|
|
}
|
|
case Action.SetDroppableDisabled: {
|
|
const {
|
|
id: id2,
|
|
key: key2,
|
|
disabled
|
|
} = action;
|
|
const element = state.droppable.containers.get(id2);
|
|
if (!element || key2 !== element.key) {
|
|
return state;
|
|
}
|
|
const containers = new DroppableContainersMap(state.droppable.containers);
|
|
containers.set(id2, {
|
|
...element,
|
|
disabled
|
|
});
|
|
return {
|
|
...state,
|
|
droppable: {
|
|
...state.droppable,
|
|
containers
|
|
}
|
|
};
|
|
}
|
|
case Action.UnregisterDroppable: {
|
|
const {
|
|
id: id2,
|
|
key: key2
|
|
} = action;
|
|
const element = state.droppable.containers.get(id2);
|
|
if (!element || key2 !== element.key) {
|
|
return state;
|
|
}
|
|
const containers = new DroppableContainersMap(state.droppable.containers);
|
|
containers.delete(id2);
|
|
return {
|
|
...state,
|
|
droppable: {
|
|
...state.droppable,
|
|
containers
|
|
}
|
|
};
|
|
}
|
|
default: {
|
|
return state;
|
|
}
|
|
}
|
|
}
|
|
function RestoreFocus(_ref) {
|
|
let {
|
|
disabled
|
|
} = _ref;
|
|
const {
|
|
active,
|
|
activatorEvent,
|
|
draggableNodes
|
|
} = q2(InternalContext);
|
|
const previousActivatorEvent = usePrevious(activatorEvent);
|
|
const previousActiveId = usePrevious(active == null ? void 0 : active.id);
|
|
h2(() => {
|
|
if (disabled) {
|
|
return;
|
|
}
|
|
if (!activatorEvent && previousActivatorEvent && previousActiveId != null) {
|
|
if (!isKeyboardEvent(previousActivatorEvent)) {
|
|
return;
|
|
}
|
|
if (document.activeElement === previousActivatorEvent.target) {
|
|
return;
|
|
}
|
|
const draggableNode = draggableNodes.get(previousActiveId);
|
|
if (!draggableNode) {
|
|
return;
|
|
}
|
|
const {
|
|
activatorNode,
|
|
node
|
|
} = draggableNode;
|
|
if (!activatorNode.current && !node.current) {
|
|
return;
|
|
}
|
|
requestAnimationFrame(() => {
|
|
for (const element of [activatorNode.current, node.current]) {
|
|
if (!element) {
|
|
continue;
|
|
}
|
|
const focusableNode = findFirstFocusableNode(element);
|
|
if (focusableNode) {
|
|
focusableNode.focus();
|
|
break;
|
|
}
|
|
}
|
|
});
|
|
}
|
|
}, [activatorEvent, disabled, draggableNodes, previousActiveId, previousActivatorEvent]);
|
|
return null;
|
|
}
|
|
function applyModifiers(modifiers, _ref) {
|
|
let {
|
|
transform,
|
|
...args
|
|
} = _ref;
|
|
return modifiers != null && modifiers.length ? modifiers.reduce((accumulator, modifier) => {
|
|
return modifier({
|
|
transform: accumulator,
|
|
...args
|
|
});
|
|
}, transform) : transform;
|
|
}
|
|
function useMeasuringConfiguration(config) {
|
|
return F(
|
|
() => ({
|
|
draggable: {
|
|
...defaultMeasuringConfiguration.draggable,
|
|
...config == null ? void 0 : config.draggable
|
|
},
|
|
droppable: {
|
|
...defaultMeasuringConfiguration.droppable,
|
|
...config == null ? void 0 : config.droppable
|
|
},
|
|
dragOverlay: {
|
|
...defaultMeasuringConfiguration.dragOverlay,
|
|
...config == null ? void 0 : config.dragOverlay
|
|
}
|
|
}),
|
|
[config == null ? void 0 : config.draggable, config == null ? void 0 : config.droppable, config == null ? void 0 : config.dragOverlay]
|
|
);
|
|
}
|
|
function useLayoutShiftScrollCompensation(_ref) {
|
|
let {
|
|
activeNode,
|
|
measure,
|
|
initialRect,
|
|
config = true
|
|
} = _ref;
|
|
const initialized = _2(false);
|
|
const {
|
|
x: x5,
|
|
y: y5
|
|
} = typeof config === "boolean" ? {
|
|
x: config,
|
|
y: config
|
|
} : config;
|
|
useIsomorphicLayoutEffect(() => {
|
|
const disabled = !x5 && !y5;
|
|
if (disabled || !activeNode) {
|
|
initialized.current = false;
|
|
return;
|
|
}
|
|
if (initialized.current || !initialRect) {
|
|
return;
|
|
}
|
|
const node = activeNode == null ? void 0 : activeNode.node.current;
|
|
if (!node || node.isConnected === false) {
|
|
return;
|
|
}
|
|
const rect = measure(node);
|
|
const rectDelta = getRectDelta(rect, initialRect);
|
|
if (!x5) {
|
|
rectDelta.x = 0;
|
|
}
|
|
if (!y5) {
|
|
rectDelta.y = 0;
|
|
}
|
|
initialized.current = true;
|
|
if (Math.abs(rectDelta.x) > 0 || Math.abs(rectDelta.y) > 0) {
|
|
const firstScrollableAncestor = getFirstScrollableAncestor(node);
|
|
if (firstScrollableAncestor) {
|
|
firstScrollableAncestor.scrollBy({
|
|
top: rectDelta.y,
|
|
left: rectDelta.x
|
|
});
|
|
}
|
|
}
|
|
}, [activeNode, x5, y5, initialRect, measure]);
|
|
}
|
|
var ActiveDraggableContext = /* @__PURE__ */ B({
|
|
...defaultCoordinates,
|
|
scaleX: 1,
|
|
scaleY: 1
|
|
});
|
|
var Status;
|
|
(function(Status2) {
|
|
Status2[Status2["Uninitialized"] = 0] = "Uninitialized";
|
|
Status2[Status2["Initializing"] = 1] = "Initializing";
|
|
Status2[Status2["Initialized"] = 2] = "Initialized";
|
|
})(Status || (Status = {}));
|
|
var DndContext = /* @__PURE__ */ R(function DndContext2(_ref) {
|
|
var _sensorContext$curren, _dragOverlay$nodeRef$, _dragOverlay$rect, _over$rect;
|
|
let {
|
|
id: id2,
|
|
accessibility,
|
|
autoScroll = true,
|
|
children,
|
|
sensors = defaultSensors,
|
|
collisionDetection = rectIntersection,
|
|
measuring,
|
|
modifiers,
|
|
...props2
|
|
} = _ref;
|
|
const store = y2(reducer, void 0, getInitialState);
|
|
const [state, dispatch] = store;
|
|
const [dispatchMonitorEvent, registerMonitorListener] = useDndMonitorProvider();
|
|
const [status, setStatus] = p2(Status.Uninitialized);
|
|
const isInitialized = status === Status.Initialized;
|
|
const {
|
|
draggable: {
|
|
active: activeId,
|
|
nodes: draggableNodes,
|
|
translate
|
|
},
|
|
droppable: {
|
|
containers: droppableContainers
|
|
}
|
|
} = state;
|
|
const node = activeId ? draggableNodes.get(activeId) : null;
|
|
const activeRects = _2({
|
|
initial: null,
|
|
translated: null
|
|
});
|
|
const active = F(() => {
|
|
var _node$data;
|
|
return activeId != null ? {
|
|
id: activeId,
|
|
data: (_node$data = node == null ? void 0 : node.data) != null ? _node$data : defaultData,
|
|
rect: activeRects
|
|
} : null;
|
|
}, [activeId, node]);
|
|
const activeRef = _2(null);
|
|
const [activeSensor, setActiveSensor] = p2(null);
|
|
const [activatorEvent, setActivatorEvent] = p2(null);
|
|
const latestProps = useLatestValue(props2, Object.values(props2));
|
|
const draggableDescribedById = useUniqueId("DndDescribedBy", id2);
|
|
const enabledDroppableContainers = F(() => droppableContainers.getEnabled(), [droppableContainers]);
|
|
const measuringConfiguration = useMeasuringConfiguration(measuring);
|
|
const {
|
|
droppableRects,
|
|
measureDroppableContainers,
|
|
measuringScheduled
|
|
} = useDroppableMeasuring(enabledDroppableContainers, {
|
|
dragging: isInitialized,
|
|
dependencies: [translate.x, translate.y],
|
|
config: measuringConfiguration.droppable
|
|
});
|
|
const activeNode = useCachedNode(draggableNodes, activeId);
|
|
const activationCoordinates = F(() => activatorEvent ? getEventCoordinates(activatorEvent) : null, [activatorEvent]);
|
|
const autoScrollOptions = getAutoScrollerOptions();
|
|
const initialActiveNodeRect = useInitialRect(activeNode, measuringConfiguration.draggable.measure);
|
|
useLayoutShiftScrollCompensation({
|
|
activeNode: activeId ? draggableNodes.get(activeId) : null,
|
|
config: autoScrollOptions.layoutShiftCompensation,
|
|
initialRect: initialActiveNodeRect,
|
|
measure: measuringConfiguration.draggable.measure
|
|
});
|
|
const activeNodeRect = useRect(activeNode, measuringConfiguration.draggable.measure, initialActiveNodeRect);
|
|
const containerNodeRect = useRect(activeNode ? activeNode.parentElement : null);
|
|
const sensorContext = _2({
|
|
activatorEvent: null,
|
|
active: null,
|
|
activeNode,
|
|
collisionRect: null,
|
|
collisions: null,
|
|
droppableRects,
|
|
draggableNodes,
|
|
draggingNode: null,
|
|
draggingNodeRect: null,
|
|
droppableContainers,
|
|
over: null,
|
|
scrollableAncestors: [],
|
|
scrollAdjustedTranslate: null
|
|
});
|
|
const overNode = droppableContainers.getNodeFor((_sensorContext$curren = sensorContext.current.over) == null ? void 0 : _sensorContext$curren.id);
|
|
const dragOverlay = useDragOverlayMeasuring({
|
|
measure: measuringConfiguration.dragOverlay.measure
|
|
});
|
|
const draggingNode = (_dragOverlay$nodeRef$ = dragOverlay.nodeRef.current) != null ? _dragOverlay$nodeRef$ : activeNode;
|
|
const draggingNodeRect = isInitialized ? (_dragOverlay$rect = dragOverlay.rect) != null ? _dragOverlay$rect : activeNodeRect : null;
|
|
const usesDragOverlay = Boolean(dragOverlay.nodeRef.current && dragOverlay.rect);
|
|
const nodeRectDelta = useRectDelta(usesDragOverlay ? null : activeNodeRect);
|
|
const windowRect = useWindowRect(draggingNode ? getWindow(draggingNode) : null);
|
|
const scrollableAncestors = useScrollableAncestors(isInitialized ? overNode != null ? overNode : activeNode : null);
|
|
const scrollableAncestorRects = useRects(scrollableAncestors);
|
|
const modifiedTranslate = applyModifiers(modifiers, {
|
|
transform: {
|
|
x: translate.x - nodeRectDelta.x,
|
|
y: translate.y - nodeRectDelta.y,
|
|
scaleX: 1,
|
|
scaleY: 1
|
|
},
|
|
activatorEvent,
|
|
active,
|
|
activeNodeRect,
|
|
containerNodeRect,
|
|
draggingNodeRect,
|
|
over: sensorContext.current.over,
|
|
overlayNodeRect: dragOverlay.rect,
|
|
scrollableAncestors,
|
|
scrollableAncestorRects,
|
|
windowRect
|
|
});
|
|
const pointerCoordinates = activationCoordinates ? add(activationCoordinates, translate) : null;
|
|
const scrollOffsets = useScrollOffsets(scrollableAncestors);
|
|
const scrollAdjustment = useScrollOffsetsDelta(scrollOffsets);
|
|
const activeNodeScrollDelta = useScrollOffsetsDelta(scrollOffsets, [activeNodeRect]);
|
|
const scrollAdjustedTranslate = add(modifiedTranslate, scrollAdjustment);
|
|
const collisionRect = draggingNodeRect ? getAdjustedRect(draggingNodeRect, modifiedTranslate) : null;
|
|
const collisions = active && collisionRect ? collisionDetection({
|
|
active,
|
|
collisionRect,
|
|
droppableRects,
|
|
droppableContainers: enabledDroppableContainers,
|
|
pointerCoordinates
|
|
}) : null;
|
|
const overId = getFirstCollision(collisions, "id");
|
|
const [over, setOver] = p2(null);
|
|
const appliedTranslate = usesDragOverlay ? modifiedTranslate : add(modifiedTranslate, activeNodeScrollDelta);
|
|
const transform = adjustScale(appliedTranslate, (_over$rect = over == null ? void 0 : over.rect) != null ? _over$rect : null, activeNodeRect);
|
|
const instantiateSensor = T2(
|
|
(event, _ref2) => {
|
|
let {
|
|
sensor: Sensor,
|
|
options
|
|
} = _ref2;
|
|
if (activeRef.current == null) {
|
|
return;
|
|
}
|
|
const activeNode2 = draggableNodes.get(activeRef.current);
|
|
if (!activeNode2) {
|
|
return;
|
|
}
|
|
const activatorEvent2 = event.nativeEvent;
|
|
const sensorInstance = new Sensor({
|
|
active: activeRef.current,
|
|
activeNode: activeNode2,
|
|
event: activatorEvent2,
|
|
options,
|
|
context: sensorContext,
|
|
onStart(initialCoordinates) {
|
|
const id3 = activeRef.current;
|
|
if (id3 == null) {
|
|
return;
|
|
}
|
|
const draggableNode = draggableNodes.get(id3);
|
|
if (!draggableNode) {
|
|
return;
|
|
}
|
|
const {
|
|
onDragStart
|
|
} = latestProps.current;
|
|
const event2 = {
|
|
active: {
|
|
id: id3,
|
|
data: draggableNode.data,
|
|
rect: activeRects
|
|
}
|
|
};
|
|
sn(() => {
|
|
onDragStart == null ? void 0 : onDragStart(event2);
|
|
setStatus(Status.Initializing);
|
|
dispatch({
|
|
type: Action.DragStart,
|
|
initialCoordinates,
|
|
active: id3
|
|
});
|
|
dispatchMonitorEvent({
|
|
type: "onDragStart",
|
|
event: event2
|
|
});
|
|
});
|
|
},
|
|
onMove(coordinates) {
|
|
dispatch({
|
|
type: Action.DragMove,
|
|
coordinates
|
|
});
|
|
},
|
|
onEnd: createHandler(Action.DragEnd),
|
|
onCancel: createHandler(Action.DragCancel)
|
|
});
|
|
sn(() => {
|
|
setActiveSensor(sensorInstance);
|
|
setActivatorEvent(event.nativeEvent);
|
|
});
|
|
function createHandler(type) {
|
|
return async function handler() {
|
|
const {
|
|
active: active2,
|
|
collisions: collisions2,
|
|
over: over2,
|
|
scrollAdjustedTranslate: scrollAdjustedTranslate2
|
|
} = sensorContext.current;
|
|
let event2 = null;
|
|
if (active2 && scrollAdjustedTranslate2) {
|
|
const {
|
|
cancelDrop
|
|
} = latestProps.current;
|
|
event2 = {
|
|
activatorEvent: activatorEvent2,
|
|
active: active2,
|
|
collisions: collisions2,
|
|
delta: scrollAdjustedTranslate2,
|
|
over: over2
|
|
};
|
|
if (type === Action.DragEnd && typeof cancelDrop === "function") {
|
|
const shouldCancel = await Promise.resolve(cancelDrop(event2));
|
|
if (shouldCancel) {
|
|
type = Action.DragCancel;
|
|
}
|
|
}
|
|
}
|
|
activeRef.current = null;
|
|
sn(() => {
|
|
dispatch({
|
|
type
|
|
});
|
|
setStatus(Status.Uninitialized);
|
|
setOver(null);
|
|
setActiveSensor(null);
|
|
setActivatorEvent(null);
|
|
const eventName = type === Action.DragEnd ? "onDragEnd" : "onDragCancel";
|
|
if (event2) {
|
|
const handler2 = latestProps.current[eventName];
|
|
handler2 == null ? void 0 : handler2(event2);
|
|
dispatchMonitorEvent({
|
|
type: eventName,
|
|
event: event2
|
|
});
|
|
}
|
|
});
|
|
};
|
|
}
|
|
},
|
|
[draggableNodes]
|
|
);
|
|
const bindActivatorToSensorInstantiator = T2((handler, sensor) => {
|
|
return (event, active2) => {
|
|
const nativeEvent = event.nativeEvent;
|
|
const activeDraggableNode = draggableNodes.get(active2);
|
|
if (activeRef.current !== null || !activeDraggableNode || nativeEvent.dndKit || nativeEvent.defaultPrevented) {
|
|
return;
|
|
}
|
|
const activationContext = {
|
|
active: activeDraggableNode
|
|
};
|
|
const shouldActivate = handler(event, sensor.options, activationContext);
|
|
if (shouldActivate === true) {
|
|
nativeEvent.dndKit = {
|
|
capturedBy: sensor.sensor
|
|
};
|
|
activeRef.current = active2;
|
|
instantiateSensor(event, sensor);
|
|
}
|
|
};
|
|
}, [draggableNodes, instantiateSensor]);
|
|
const activators = useCombineActivators(sensors, bindActivatorToSensorInstantiator);
|
|
useSensorSetup(sensors);
|
|
useIsomorphicLayoutEffect(() => {
|
|
if (activeNodeRect && status === Status.Initializing) {
|
|
setStatus(Status.Initialized);
|
|
}
|
|
}, [activeNodeRect, status]);
|
|
h2(
|
|
() => {
|
|
const {
|
|
onDragMove
|
|
} = latestProps.current;
|
|
const {
|
|
active: active2,
|
|
activatorEvent: activatorEvent2,
|
|
collisions: collisions2,
|
|
over: over2
|
|
} = sensorContext.current;
|
|
if (!active2 || !activatorEvent2) {
|
|
return;
|
|
}
|
|
const event = {
|
|
active: active2,
|
|
activatorEvent: activatorEvent2,
|
|
collisions: collisions2,
|
|
delta: {
|
|
x: scrollAdjustedTranslate.x,
|
|
y: scrollAdjustedTranslate.y
|
|
},
|
|
over: over2
|
|
};
|
|
sn(() => {
|
|
onDragMove == null ? void 0 : onDragMove(event);
|
|
dispatchMonitorEvent({
|
|
type: "onDragMove",
|
|
event
|
|
});
|
|
});
|
|
},
|
|
[scrollAdjustedTranslate.x, scrollAdjustedTranslate.y]
|
|
);
|
|
h2(
|
|
() => {
|
|
const {
|
|
active: active2,
|
|
activatorEvent: activatorEvent2,
|
|
collisions: collisions2,
|
|
droppableContainers: droppableContainers2,
|
|
scrollAdjustedTranslate: scrollAdjustedTranslate2
|
|
} = sensorContext.current;
|
|
if (!active2 || activeRef.current == null || !activatorEvent2 || !scrollAdjustedTranslate2) {
|
|
return;
|
|
}
|
|
const {
|
|
onDragOver
|
|
} = latestProps.current;
|
|
const overContainer = droppableContainers2.get(overId);
|
|
const over2 = overContainer && overContainer.rect.current ? {
|
|
id: overContainer.id,
|
|
rect: overContainer.rect.current,
|
|
data: overContainer.data,
|
|
disabled: overContainer.disabled
|
|
} : null;
|
|
const event = {
|
|
active: active2,
|
|
activatorEvent: activatorEvent2,
|
|
collisions: collisions2,
|
|
delta: {
|
|
x: scrollAdjustedTranslate2.x,
|
|
y: scrollAdjustedTranslate2.y
|
|
},
|
|
over: over2
|
|
};
|
|
sn(() => {
|
|
setOver(over2);
|
|
onDragOver == null ? void 0 : onDragOver(event);
|
|
dispatchMonitorEvent({
|
|
type: "onDragOver",
|
|
event
|
|
});
|
|
});
|
|
},
|
|
[overId]
|
|
);
|
|
useIsomorphicLayoutEffect(() => {
|
|
sensorContext.current = {
|
|
activatorEvent,
|
|
active,
|
|
activeNode,
|
|
collisionRect,
|
|
collisions,
|
|
droppableRects,
|
|
draggableNodes,
|
|
draggingNode,
|
|
draggingNodeRect,
|
|
droppableContainers,
|
|
over,
|
|
scrollableAncestors,
|
|
scrollAdjustedTranslate
|
|
};
|
|
activeRects.current = {
|
|
initial: draggingNodeRect,
|
|
translated: collisionRect
|
|
};
|
|
}, [active, activeNode, collisions, collisionRect, draggableNodes, draggingNode, draggingNodeRect, droppableRects, droppableContainers, over, scrollableAncestors, scrollAdjustedTranslate]);
|
|
useAutoScroller({
|
|
...autoScrollOptions,
|
|
delta: translate,
|
|
draggingRect: collisionRect,
|
|
pointerCoordinates,
|
|
scrollableAncestors,
|
|
scrollableAncestorRects
|
|
});
|
|
const publicContext = F(() => {
|
|
const context = {
|
|
active,
|
|
activeNode,
|
|
activeNodeRect,
|
|
activatorEvent,
|
|
collisions,
|
|
containerNodeRect,
|
|
dragOverlay,
|
|
draggableNodes,
|
|
droppableContainers,
|
|
droppableRects,
|
|
over,
|
|
measureDroppableContainers,
|
|
scrollableAncestors,
|
|
scrollableAncestorRects,
|
|
measuringConfiguration,
|
|
measuringScheduled,
|
|
windowRect
|
|
};
|
|
return context;
|
|
}, [active, activeNode, activeNodeRect, activatorEvent, collisions, containerNodeRect, dragOverlay, draggableNodes, droppableContainers, droppableRects, over, measureDroppableContainers, scrollableAncestors, scrollableAncestorRects, measuringConfiguration, measuringScheduled, windowRect]);
|
|
const internalContext = F(() => {
|
|
const context = {
|
|
activatorEvent,
|
|
activators,
|
|
active,
|
|
activeNodeRect,
|
|
ariaDescribedById: {
|
|
draggable: draggableDescribedById
|
|
},
|
|
dispatch,
|
|
draggableNodes,
|
|
over,
|
|
measureDroppableContainers
|
|
};
|
|
return context;
|
|
}, [activatorEvent, activators, active, activeNodeRect, dispatch, draggableDescribedById, draggableNodes, over, measureDroppableContainers]);
|
|
return bn.createElement(DndMonitorContext.Provider, {
|
|
value: registerMonitorListener
|
|
}, bn.createElement(InternalContext.Provider, {
|
|
value: internalContext
|
|
}, bn.createElement(PublicContext.Provider, {
|
|
value: publicContext
|
|
}, bn.createElement(ActiveDraggableContext.Provider, {
|
|
value: transform
|
|
}, children)), bn.createElement(RestoreFocus, {
|
|
disabled: (accessibility == null ? void 0 : accessibility.restoreFocus) === false
|
|
})), bn.createElement(Accessibility, {
|
|
...accessibility,
|
|
hiddenTextDescribedById: draggableDescribedById
|
|
}));
|
|
function getAutoScrollerOptions() {
|
|
const activeSensorDisablesAutoscroll = (activeSensor == null ? void 0 : activeSensor.autoScrollEnabled) === false;
|
|
const autoScrollGloballyDisabled = typeof autoScroll === "object" ? autoScroll.enabled === false : autoScroll === false;
|
|
const enabled = isInitialized && !activeSensorDisablesAutoscroll && !autoScrollGloballyDisabled;
|
|
if (typeof autoScroll === "object") {
|
|
return {
|
|
...autoScroll,
|
|
enabled
|
|
};
|
|
}
|
|
return {
|
|
enabled
|
|
};
|
|
}
|
|
});
|
|
var NullContext = /* @__PURE__ */ B(null);
|
|
var defaultRole = "button";
|
|
var ID_PREFIX = "Droppable";
|
|
function useDraggable(_ref) {
|
|
let {
|
|
id: id2,
|
|
data,
|
|
disabled = false,
|
|
attributes
|
|
} = _ref;
|
|
const key2 = useUniqueId(ID_PREFIX);
|
|
const {
|
|
activators,
|
|
activatorEvent,
|
|
active,
|
|
activeNodeRect,
|
|
ariaDescribedById,
|
|
draggableNodes,
|
|
over
|
|
} = q2(InternalContext);
|
|
const {
|
|
role = defaultRole,
|
|
roleDescription = "draggable",
|
|
tabIndex = 0
|
|
} = attributes != null ? attributes : {};
|
|
const isDragging = (active == null ? void 0 : active.id) === id2;
|
|
const transform = q2(isDragging ? ActiveDraggableContext : NullContext);
|
|
const [node, setNodeRef] = useNodeRef();
|
|
const [activatorNode, setActivatorNodeRef] = useNodeRef();
|
|
const listeners = useSyntheticListeners(activators, id2);
|
|
const dataRef = useLatestValue(data);
|
|
useIsomorphicLayoutEffect(
|
|
() => {
|
|
draggableNodes.set(id2, {
|
|
id: id2,
|
|
key: key2,
|
|
node,
|
|
activatorNode,
|
|
data: dataRef
|
|
});
|
|
return () => {
|
|
const node2 = draggableNodes.get(id2);
|
|
if (node2 && node2.key === key2) {
|
|
draggableNodes.delete(id2);
|
|
}
|
|
};
|
|
},
|
|
[draggableNodes, id2]
|
|
);
|
|
const memoizedAttributes = F(() => ({
|
|
role,
|
|
tabIndex,
|
|
"aria-disabled": disabled,
|
|
"aria-pressed": isDragging && role === defaultRole ? true : void 0,
|
|
"aria-roledescription": roleDescription,
|
|
"aria-describedby": ariaDescribedById.draggable
|
|
}), [disabled, role, tabIndex, isDragging, roleDescription, ariaDescribedById.draggable]);
|
|
return {
|
|
active,
|
|
activatorEvent,
|
|
activeNodeRect,
|
|
attributes: memoizedAttributes,
|
|
isDragging,
|
|
listeners: disabled ? void 0 : listeners,
|
|
node,
|
|
over,
|
|
setNodeRef,
|
|
setActivatorNodeRef,
|
|
transform
|
|
};
|
|
}
|
|
function useDndContext() {
|
|
return q2(PublicContext);
|
|
}
|
|
var ID_PREFIX$1 = "Droppable";
|
|
var defaultResizeObserverConfig = {
|
|
timeout: 25
|
|
};
|
|
function useDroppable(_ref) {
|
|
let {
|
|
data,
|
|
disabled = false,
|
|
id: id2,
|
|
resizeObserverConfig
|
|
} = _ref;
|
|
const key2 = useUniqueId(ID_PREFIX$1);
|
|
const {
|
|
active,
|
|
dispatch,
|
|
over,
|
|
measureDroppableContainers
|
|
} = q2(InternalContext);
|
|
const previous = _2({
|
|
disabled
|
|
});
|
|
const resizeObserverConnected = _2(false);
|
|
const rect = _2(null);
|
|
const callbackId = _2(null);
|
|
const {
|
|
disabled: resizeObserverDisabled,
|
|
updateMeasurementsFor,
|
|
timeout: resizeObserverTimeout
|
|
} = {
|
|
...defaultResizeObserverConfig,
|
|
...resizeObserverConfig
|
|
};
|
|
const ids2 = useLatestValue(updateMeasurementsFor != null ? updateMeasurementsFor : id2);
|
|
const handleResize = T2(
|
|
() => {
|
|
if (!resizeObserverConnected.current) {
|
|
resizeObserverConnected.current = true;
|
|
return;
|
|
}
|
|
if (callbackId.current != null) {
|
|
clearTimeout(callbackId.current);
|
|
}
|
|
callbackId.current = setTimeout(() => {
|
|
measureDroppableContainers(Array.isArray(ids2.current) ? ids2.current : [ids2.current]);
|
|
callbackId.current = null;
|
|
}, resizeObserverTimeout);
|
|
},
|
|
[resizeObserverTimeout]
|
|
);
|
|
const resizeObserver = useResizeObserver({
|
|
callback: handleResize,
|
|
disabled: resizeObserverDisabled || !active
|
|
});
|
|
const handleNodeChange = T2((newElement, previousElement) => {
|
|
if (!resizeObserver) {
|
|
return;
|
|
}
|
|
if (previousElement) {
|
|
resizeObserver.unobserve(previousElement);
|
|
resizeObserverConnected.current = false;
|
|
}
|
|
if (newElement) {
|
|
resizeObserver.observe(newElement);
|
|
}
|
|
}, [resizeObserver]);
|
|
const [nodeRef, setNodeRef] = useNodeRef(handleNodeChange);
|
|
const dataRef = useLatestValue(data);
|
|
h2(() => {
|
|
if (!resizeObserver || !nodeRef.current) {
|
|
return;
|
|
}
|
|
resizeObserver.disconnect();
|
|
resizeObserverConnected.current = false;
|
|
resizeObserver.observe(nodeRef.current);
|
|
}, [nodeRef, resizeObserver]);
|
|
useIsomorphicLayoutEffect(
|
|
() => {
|
|
dispatch({
|
|
type: Action.RegisterDroppable,
|
|
element: {
|
|
id: id2,
|
|
key: key2,
|
|
disabled,
|
|
node: nodeRef,
|
|
rect,
|
|
data: dataRef
|
|
}
|
|
});
|
|
return () => dispatch({
|
|
type: Action.UnregisterDroppable,
|
|
key: key2,
|
|
id: id2
|
|
});
|
|
},
|
|
[id2]
|
|
);
|
|
h2(() => {
|
|
if (disabled !== previous.current.disabled) {
|
|
dispatch({
|
|
type: Action.SetDroppableDisabled,
|
|
id: id2,
|
|
key: key2,
|
|
disabled
|
|
});
|
|
previous.current.disabled = disabled;
|
|
}
|
|
}, [id2, key2, disabled, dispatch]);
|
|
return {
|
|
active,
|
|
rect,
|
|
isOver: (over == null ? void 0 : over.id) === id2,
|
|
node: nodeRef,
|
|
over,
|
|
setNodeRef
|
|
};
|
|
}
|
|
function AnimationManager(_ref) {
|
|
let {
|
|
animation,
|
|
children
|
|
} = _ref;
|
|
const [clonedChildren, setClonedChildren] = p2(null);
|
|
const [element, setElement] = p2(null);
|
|
const previousChildren = usePrevious(children);
|
|
if (!children && !clonedChildren && previousChildren) {
|
|
setClonedChildren(previousChildren);
|
|
}
|
|
useIsomorphicLayoutEffect(() => {
|
|
if (!element) {
|
|
return;
|
|
}
|
|
const key2 = clonedChildren == null ? void 0 : clonedChildren.key;
|
|
const id2 = clonedChildren == null ? void 0 : clonedChildren.props.id;
|
|
if (key2 == null || id2 == null) {
|
|
setClonedChildren(null);
|
|
return;
|
|
}
|
|
Promise.resolve(animation(id2, element)).then(() => {
|
|
setClonedChildren(null);
|
|
});
|
|
}, [animation, clonedChildren, element]);
|
|
return bn.createElement(bn.Fragment, null, children, clonedChildren ? cn(clonedChildren, {
|
|
ref: setElement
|
|
}) : null);
|
|
}
|
|
var defaultTransform = {
|
|
x: 0,
|
|
y: 0,
|
|
scaleX: 1,
|
|
scaleY: 1
|
|
};
|
|
function NullifiedContextProvider(_ref) {
|
|
let {
|
|
children
|
|
} = _ref;
|
|
return bn.createElement(InternalContext.Provider, {
|
|
value: defaultInternalContext
|
|
}, bn.createElement(ActiveDraggableContext.Provider, {
|
|
value: defaultTransform
|
|
}, children));
|
|
}
|
|
var baseStyles = {
|
|
position: "fixed",
|
|
touchAction: "none"
|
|
};
|
|
var defaultTransition = (activatorEvent) => {
|
|
const isKeyboardActivator = isKeyboardEvent(activatorEvent);
|
|
return isKeyboardActivator ? "transform 250ms ease" : void 0;
|
|
};
|
|
var PositionedOverlay = /* @__PURE__ */ k3((_ref, ref) => {
|
|
let {
|
|
as,
|
|
activatorEvent,
|
|
adjustScale: adjustScale2,
|
|
children,
|
|
className,
|
|
rect,
|
|
style,
|
|
transform,
|
|
transition = defaultTransition
|
|
} = _ref;
|
|
if (!rect) {
|
|
return null;
|
|
}
|
|
const scaleAdjustedTransform = adjustScale2 ? transform : {
|
|
...transform,
|
|
scaleX: 1,
|
|
scaleY: 1
|
|
};
|
|
const styles = {
|
|
...baseStyles,
|
|
width: rect.width,
|
|
height: rect.height,
|
|
top: rect.top,
|
|
left: rect.left,
|
|
transform: CSS.Transform.toString(scaleAdjustedTransform),
|
|
transformOrigin: adjustScale2 && activatorEvent ? getRelativeTransformOrigin(activatorEvent, rect) : void 0,
|
|
transition: typeof transition === "function" ? transition(activatorEvent) : transition,
|
|
...style
|
|
};
|
|
return bn.createElement(as, {
|
|
className,
|
|
style: styles,
|
|
ref
|
|
}, children);
|
|
});
|
|
var defaultDropAnimationSideEffects = (options) => (_ref) => {
|
|
let {
|
|
active,
|
|
dragOverlay
|
|
} = _ref;
|
|
const originalStyles = {};
|
|
const {
|
|
styles,
|
|
className
|
|
} = options;
|
|
if (styles != null && styles.active) {
|
|
for (const [key2, value] of Object.entries(styles.active)) {
|
|
if (value === void 0) {
|
|
continue;
|
|
}
|
|
originalStyles[key2] = active.node.style.getPropertyValue(key2);
|
|
active.node.style.setProperty(key2, value);
|
|
}
|
|
}
|
|
if (styles != null && styles.dragOverlay) {
|
|
for (const [key2, value] of Object.entries(styles.dragOverlay)) {
|
|
if (value === void 0) {
|
|
continue;
|
|
}
|
|
dragOverlay.node.style.setProperty(key2, value);
|
|
}
|
|
}
|
|
if (className != null && className.active) {
|
|
active.node.classList.add(className.active);
|
|
}
|
|
if (className != null && className.dragOverlay) {
|
|
dragOverlay.node.classList.add(className.dragOverlay);
|
|
}
|
|
return function cleanup() {
|
|
for (const [key2, value] of Object.entries(originalStyles)) {
|
|
active.node.style.setProperty(key2, value);
|
|
}
|
|
if (className != null && className.active) {
|
|
active.node.classList.remove(className.active);
|
|
}
|
|
};
|
|
};
|
|
var defaultKeyframeResolver = (_ref2) => {
|
|
let {
|
|
transform: {
|
|
initial,
|
|
final
|
|
}
|
|
} = _ref2;
|
|
return [{
|
|
transform: CSS.Transform.toString(initial)
|
|
}, {
|
|
transform: CSS.Transform.toString(final)
|
|
}];
|
|
};
|
|
var defaultDropAnimationConfiguration = {
|
|
duration: 250,
|
|
easing: "ease",
|
|
keyframes: defaultKeyframeResolver,
|
|
sideEffects: /* @__PURE__ */ defaultDropAnimationSideEffects({
|
|
styles: {
|
|
active: {
|
|
opacity: "0"
|
|
}
|
|
}
|
|
})
|
|
};
|
|
function useDropAnimation(_ref3) {
|
|
let {
|
|
config,
|
|
draggableNodes,
|
|
droppableContainers,
|
|
measuringConfiguration
|
|
} = _ref3;
|
|
return useEvent((id2, node) => {
|
|
if (config === null) {
|
|
return;
|
|
}
|
|
const activeDraggable = draggableNodes.get(id2);
|
|
if (!activeDraggable) {
|
|
return;
|
|
}
|
|
const activeNode = activeDraggable.node.current;
|
|
if (!activeNode) {
|
|
return;
|
|
}
|
|
const measurableNode = getMeasurableNode(node);
|
|
if (!measurableNode) {
|
|
return;
|
|
}
|
|
const {
|
|
transform
|
|
} = getWindow(node).getComputedStyle(node);
|
|
const parsedTransform = parseTransform(transform);
|
|
if (!parsedTransform) {
|
|
return;
|
|
}
|
|
const animation = typeof config === "function" ? config : createDefaultDropAnimation(config);
|
|
scrollIntoViewIfNeeded(activeNode, measuringConfiguration.draggable.measure);
|
|
return animation({
|
|
active: {
|
|
id: id2,
|
|
data: activeDraggable.data,
|
|
node: activeNode,
|
|
rect: measuringConfiguration.draggable.measure(activeNode)
|
|
},
|
|
draggableNodes,
|
|
dragOverlay: {
|
|
node,
|
|
rect: measuringConfiguration.dragOverlay.measure(measurableNode)
|
|
},
|
|
droppableContainers,
|
|
measuringConfiguration,
|
|
transform: parsedTransform
|
|
});
|
|
});
|
|
}
|
|
function createDefaultDropAnimation(options) {
|
|
const {
|
|
duration,
|
|
easing,
|
|
sideEffects,
|
|
keyframes
|
|
} = {
|
|
...defaultDropAnimationConfiguration,
|
|
...options
|
|
};
|
|
return (_ref4) => {
|
|
let {
|
|
active,
|
|
dragOverlay,
|
|
transform,
|
|
...rest
|
|
} = _ref4;
|
|
if (!duration) {
|
|
return;
|
|
}
|
|
const delta = {
|
|
x: dragOverlay.rect.left - active.rect.left,
|
|
y: dragOverlay.rect.top - active.rect.top
|
|
};
|
|
const scale = {
|
|
scaleX: transform.scaleX !== 1 ? active.rect.width * transform.scaleX / dragOverlay.rect.width : 1,
|
|
scaleY: transform.scaleY !== 1 ? active.rect.height * transform.scaleY / dragOverlay.rect.height : 1
|
|
};
|
|
const finalTransform = {
|
|
x: transform.x - delta.x,
|
|
y: transform.y - delta.y,
|
|
...scale
|
|
};
|
|
const animationKeyframes = keyframes({
|
|
...rest,
|
|
active,
|
|
dragOverlay,
|
|
transform: {
|
|
initial: transform,
|
|
final: finalTransform
|
|
}
|
|
});
|
|
const [firstKeyframe] = animationKeyframes;
|
|
const lastKeyframe = animationKeyframes[animationKeyframes.length - 1];
|
|
if (JSON.stringify(firstKeyframe) === JSON.stringify(lastKeyframe)) {
|
|
return;
|
|
}
|
|
const cleanup = sideEffects == null ? void 0 : sideEffects({
|
|
active,
|
|
dragOverlay,
|
|
...rest
|
|
});
|
|
const animation = dragOverlay.node.animate(animationKeyframes, {
|
|
duration,
|
|
easing,
|
|
fill: "forwards"
|
|
});
|
|
return new Promise((resolve) => {
|
|
animation.onfinish = () => {
|
|
cleanup == null ? void 0 : cleanup();
|
|
resolve();
|
|
};
|
|
});
|
|
};
|
|
}
|
|
var key = 0;
|
|
function useKey(id2) {
|
|
return F(() => {
|
|
if (id2 == null) {
|
|
return;
|
|
}
|
|
key++;
|
|
return key;
|
|
}, [id2]);
|
|
}
|
|
var DragOverlay = /* @__PURE__ */ bn.memo((_ref) => {
|
|
let {
|
|
adjustScale: adjustScale2 = false,
|
|
children,
|
|
dropAnimation: dropAnimationConfig,
|
|
style,
|
|
transition,
|
|
modifiers,
|
|
wrapperElement = "div",
|
|
className,
|
|
zIndex = 999
|
|
} = _ref;
|
|
const {
|
|
activatorEvent,
|
|
active,
|
|
activeNodeRect,
|
|
containerNodeRect,
|
|
draggableNodes,
|
|
droppableContainers,
|
|
dragOverlay,
|
|
over,
|
|
measuringConfiguration,
|
|
scrollableAncestors,
|
|
scrollableAncestorRects,
|
|
windowRect
|
|
} = useDndContext();
|
|
const transform = q2(ActiveDraggableContext);
|
|
const key2 = useKey(active == null ? void 0 : active.id);
|
|
const modifiedTransform = applyModifiers(modifiers, {
|
|
activatorEvent,
|
|
active,
|
|
activeNodeRect,
|
|
containerNodeRect,
|
|
draggingNodeRect: dragOverlay.rect,
|
|
over,
|
|
overlayNodeRect: dragOverlay.rect,
|
|
scrollableAncestors,
|
|
scrollableAncestorRects,
|
|
transform,
|
|
windowRect
|
|
});
|
|
const initialRect = useInitialValue(activeNodeRect);
|
|
const dropAnimation = useDropAnimation({
|
|
config: dropAnimationConfig,
|
|
draggableNodes,
|
|
droppableContainers,
|
|
measuringConfiguration
|
|
});
|
|
const ref = initialRect ? dragOverlay.setRef : void 0;
|
|
return bn.createElement(NullifiedContextProvider, null, bn.createElement(AnimationManager, {
|
|
animation: dropAnimation
|
|
}, active && key2 ? bn.createElement(PositionedOverlay, {
|
|
key: key2,
|
|
id: active.id,
|
|
ref,
|
|
as: wrapperElement,
|
|
activatorEvent,
|
|
adjustScale: adjustScale2,
|
|
className,
|
|
transition,
|
|
rect: initialRect,
|
|
style: {
|
|
zIndex,
|
|
...style
|
|
},
|
|
transform: modifiedTransform
|
|
}, children) : null));
|
|
});
|
|
|
|
// node_modules/@dnd-kit/sortable/dist/sortable.esm.js
|
|
function arrayMove(array, from, to) {
|
|
const newArray = array.slice();
|
|
newArray.splice(to < 0 ? newArray.length + to : to, 0, newArray.splice(from, 1)[0]);
|
|
return newArray;
|
|
}
|
|
function getSortedRects(items, rects) {
|
|
return items.reduce((accumulator, id2, index) => {
|
|
const rect = rects.get(id2);
|
|
if (rect) {
|
|
accumulator[index] = rect;
|
|
}
|
|
return accumulator;
|
|
}, Array(items.length));
|
|
}
|
|
function isValidIndex(index) {
|
|
return index !== null && index >= 0;
|
|
}
|
|
function itemsEqual(a5, b4) {
|
|
if (a5 === b4) {
|
|
return true;
|
|
}
|
|
if (a5.length !== b4.length) {
|
|
return false;
|
|
}
|
|
for (let i4 = 0; i4 < a5.length; i4++) {
|
|
if (a5[i4] !== b4[i4]) {
|
|
return false;
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
function normalizeDisabled(disabled) {
|
|
if (typeof disabled === "boolean") {
|
|
return {
|
|
draggable: disabled,
|
|
droppable: disabled
|
|
};
|
|
}
|
|
return disabled;
|
|
}
|
|
var defaultScale = {
|
|
scaleX: 1,
|
|
scaleY: 1
|
|
};
|
|
var horizontalListSortingStrategy = (_ref) => {
|
|
var _rects$activeIndex;
|
|
let {
|
|
rects,
|
|
activeNodeRect: fallbackActiveRect,
|
|
activeIndex,
|
|
overIndex,
|
|
index
|
|
} = _ref;
|
|
const activeNodeRect = (_rects$activeIndex = rects[activeIndex]) != null ? _rects$activeIndex : fallbackActiveRect;
|
|
if (!activeNodeRect) {
|
|
return null;
|
|
}
|
|
const itemGap = getItemGap(rects, index, activeIndex);
|
|
if (index === activeIndex) {
|
|
const newIndexRect = rects[overIndex];
|
|
if (!newIndexRect) {
|
|
return null;
|
|
}
|
|
return {
|
|
x: activeIndex < overIndex ? newIndexRect.left + newIndexRect.width - (activeNodeRect.left + activeNodeRect.width) : newIndexRect.left - activeNodeRect.left,
|
|
y: 0,
|
|
...defaultScale
|
|
};
|
|
}
|
|
if (index > activeIndex && index <= overIndex) {
|
|
return {
|
|
x: -activeNodeRect.width - itemGap,
|
|
y: 0,
|
|
...defaultScale
|
|
};
|
|
}
|
|
if (index < activeIndex && index >= overIndex) {
|
|
return {
|
|
x: activeNodeRect.width + itemGap,
|
|
y: 0,
|
|
...defaultScale
|
|
};
|
|
}
|
|
return {
|
|
x: 0,
|
|
y: 0,
|
|
...defaultScale
|
|
};
|
|
};
|
|
function getItemGap(rects, index, activeIndex) {
|
|
const currentRect = rects[index];
|
|
const previousRect = rects[index - 1];
|
|
const nextRect = rects[index + 1];
|
|
if (!currentRect || !previousRect && !nextRect) {
|
|
return 0;
|
|
}
|
|
if (activeIndex < index) {
|
|
return previousRect ? currentRect.left - (previousRect.left + previousRect.width) : nextRect.left - (currentRect.left + currentRect.width);
|
|
}
|
|
return nextRect ? nextRect.left - (currentRect.left + currentRect.width) : currentRect.left - (previousRect.left + previousRect.width);
|
|
}
|
|
var rectSortingStrategy = (_ref) => {
|
|
let {
|
|
rects,
|
|
activeIndex,
|
|
overIndex,
|
|
index
|
|
} = _ref;
|
|
const newRects = arrayMove(rects, overIndex, activeIndex);
|
|
const oldRect = rects[index];
|
|
const newRect = newRects[index];
|
|
if (!newRect || !oldRect) {
|
|
return null;
|
|
}
|
|
return {
|
|
x: newRect.left - oldRect.left,
|
|
y: newRect.top - oldRect.top,
|
|
scaleX: newRect.width / oldRect.width,
|
|
scaleY: newRect.height / oldRect.height
|
|
};
|
|
};
|
|
var defaultScale$1 = {
|
|
scaleX: 1,
|
|
scaleY: 1
|
|
};
|
|
var verticalListSortingStrategy = (_ref) => {
|
|
var _rects$activeIndex;
|
|
let {
|
|
activeIndex,
|
|
activeNodeRect: fallbackActiveRect,
|
|
index,
|
|
rects,
|
|
overIndex
|
|
} = _ref;
|
|
const activeNodeRect = (_rects$activeIndex = rects[activeIndex]) != null ? _rects$activeIndex : fallbackActiveRect;
|
|
if (!activeNodeRect) {
|
|
return null;
|
|
}
|
|
if (index === activeIndex) {
|
|
const overIndexRect = rects[overIndex];
|
|
if (!overIndexRect) {
|
|
return null;
|
|
}
|
|
return {
|
|
x: 0,
|
|
y: activeIndex < overIndex ? overIndexRect.top + overIndexRect.height - (activeNodeRect.top + activeNodeRect.height) : overIndexRect.top - activeNodeRect.top,
|
|
...defaultScale$1
|
|
};
|
|
}
|
|
const itemGap = getItemGap$1(rects, index, activeIndex);
|
|
if (index > activeIndex && index <= overIndex) {
|
|
return {
|
|
x: 0,
|
|
y: -activeNodeRect.height - itemGap,
|
|
...defaultScale$1
|
|
};
|
|
}
|
|
if (index < activeIndex && index >= overIndex) {
|
|
return {
|
|
x: 0,
|
|
y: activeNodeRect.height + itemGap,
|
|
...defaultScale$1
|
|
};
|
|
}
|
|
return {
|
|
x: 0,
|
|
y: 0,
|
|
...defaultScale$1
|
|
};
|
|
};
|
|
function getItemGap$1(clientRects, index, activeIndex) {
|
|
const currentRect = clientRects[index];
|
|
const previousRect = clientRects[index - 1];
|
|
const nextRect = clientRects[index + 1];
|
|
if (!currentRect) {
|
|
return 0;
|
|
}
|
|
if (activeIndex < index) {
|
|
return previousRect ? currentRect.top - (previousRect.top + previousRect.height) : nextRect ? nextRect.top - (currentRect.top + currentRect.height) : 0;
|
|
}
|
|
return nextRect ? nextRect.top - (currentRect.top + currentRect.height) : previousRect ? currentRect.top - (previousRect.top + previousRect.height) : 0;
|
|
}
|
|
var ID_PREFIX2 = "Sortable";
|
|
var Context = /* @__PURE__ */ bn.createContext({
|
|
activeIndex: -1,
|
|
containerId: ID_PREFIX2,
|
|
disableTransforms: false,
|
|
items: [],
|
|
overIndex: -1,
|
|
useDragOverlay: false,
|
|
sortedRects: [],
|
|
strategy: rectSortingStrategy,
|
|
disabled: {
|
|
draggable: false,
|
|
droppable: false
|
|
}
|
|
});
|
|
function SortableContext(_ref) {
|
|
let {
|
|
children,
|
|
id: id2,
|
|
items: userDefinedItems,
|
|
strategy = rectSortingStrategy,
|
|
disabled: disabledProp = false
|
|
} = _ref;
|
|
const {
|
|
active,
|
|
dragOverlay,
|
|
droppableRects,
|
|
over,
|
|
measureDroppableContainers,
|
|
measuringScheduled
|
|
} = useDndContext();
|
|
const containerId = useUniqueId(ID_PREFIX2, id2);
|
|
const useDragOverlay = Boolean(dragOverlay.rect !== null);
|
|
const items = F(() => userDefinedItems.map((item) => typeof item === "object" && "id" in item ? item.id : item), [userDefinedItems]);
|
|
const isDragging = active != null;
|
|
const activeIndex = active ? items.indexOf(active.id) : -1;
|
|
const overIndex = over ? items.indexOf(over.id) : -1;
|
|
const previousItemsRef = _2(items);
|
|
const itemsHaveChanged = !itemsEqual(items, previousItemsRef.current);
|
|
const disableTransforms = overIndex !== -1 && activeIndex === -1 || itemsHaveChanged;
|
|
const disabled = normalizeDisabled(disabledProp);
|
|
useIsomorphicLayoutEffect(() => {
|
|
if (itemsHaveChanged && isDragging && !measuringScheduled) {
|
|
measureDroppableContainers(items);
|
|
}
|
|
}, [itemsHaveChanged, items, isDragging, measureDroppableContainers, measuringScheduled]);
|
|
h2(() => {
|
|
previousItemsRef.current = items;
|
|
}, [items]);
|
|
const contextValue = F(
|
|
() => ({
|
|
activeIndex,
|
|
containerId,
|
|
disabled,
|
|
disableTransforms,
|
|
items,
|
|
overIndex,
|
|
useDragOverlay,
|
|
sortedRects: getSortedRects(items, droppableRects),
|
|
strategy
|
|
}),
|
|
[activeIndex, containerId, disabled.draggable, disabled.droppable, disableTransforms, items, overIndex, droppableRects, useDragOverlay, strategy]
|
|
);
|
|
return bn.createElement(Context.Provider, {
|
|
value: contextValue
|
|
}, children);
|
|
}
|
|
var defaultNewIndexGetter = (_ref) => {
|
|
let {
|
|
id: id2,
|
|
items,
|
|
activeIndex,
|
|
overIndex
|
|
} = _ref;
|
|
return arrayMove(items, activeIndex, overIndex).indexOf(id2);
|
|
};
|
|
var defaultAnimateLayoutChanges = (_ref2) => {
|
|
let {
|
|
containerId,
|
|
isSorting,
|
|
wasDragging,
|
|
index,
|
|
items,
|
|
newIndex,
|
|
previousItems,
|
|
previousContainerId,
|
|
transition
|
|
} = _ref2;
|
|
if (!transition || !wasDragging) {
|
|
return false;
|
|
}
|
|
if (previousItems !== items && index === newIndex) {
|
|
return false;
|
|
}
|
|
if (isSorting) {
|
|
return true;
|
|
}
|
|
return newIndex !== index && containerId === previousContainerId;
|
|
};
|
|
var defaultTransition2 = {
|
|
duration: 200,
|
|
easing: "ease"
|
|
};
|
|
var transitionProperty = "transform";
|
|
var disabledTransition = /* @__PURE__ */ CSS.Transition.toString({
|
|
property: transitionProperty,
|
|
duration: 0,
|
|
easing: "linear"
|
|
});
|
|
var defaultAttributes = {
|
|
roleDescription: "sortable"
|
|
};
|
|
function useDerivedTransform(_ref) {
|
|
let {
|
|
disabled,
|
|
index,
|
|
node,
|
|
rect
|
|
} = _ref;
|
|
const [derivedTransform, setDerivedtransform] = p2(null);
|
|
const previousIndex = _2(index);
|
|
useIsomorphicLayoutEffect(() => {
|
|
if (!disabled && index !== previousIndex.current && node.current) {
|
|
const initial = rect.current;
|
|
if (initial) {
|
|
const current = getClientRect(node.current, {
|
|
ignoreTransform: true
|
|
});
|
|
const delta = {
|
|
x: initial.left - current.left,
|
|
y: initial.top - current.top,
|
|
scaleX: initial.width / current.width,
|
|
scaleY: initial.height / current.height
|
|
};
|
|
if (delta.x || delta.y) {
|
|
setDerivedtransform(delta);
|
|
}
|
|
}
|
|
}
|
|
if (index !== previousIndex.current) {
|
|
previousIndex.current = index;
|
|
}
|
|
}, [disabled, index, node, rect]);
|
|
h2(() => {
|
|
if (derivedTransform) {
|
|
requestAnimationFrame(() => {
|
|
setDerivedtransform(null);
|
|
});
|
|
}
|
|
}, [derivedTransform]);
|
|
return derivedTransform;
|
|
}
|
|
function useSortable(_ref) {
|
|
let {
|
|
animateLayoutChanges: animateLayoutChanges3 = defaultAnimateLayoutChanges,
|
|
attributes: userDefinedAttributes,
|
|
disabled: localDisabled,
|
|
data: customData,
|
|
getNewIndex = defaultNewIndexGetter,
|
|
id: id2,
|
|
strategy: localStrategy,
|
|
resizeObserverConfig,
|
|
transition = defaultTransition2
|
|
} = _ref;
|
|
const {
|
|
items,
|
|
containerId,
|
|
activeIndex,
|
|
disabled: globalDisabled,
|
|
disableTransforms,
|
|
sortedRects,
|
|
overIndex,
|
|
useDragOverlay,
|
|
strategy: globalStrategy
|
|
} = q2(Context);
|
|
const disabled = normalizeLocalDisabled(localDisabled, globalDisabled);
|
|
const index = items.indexOf(id2);
|
|
const data = F(() => ({
|
|
sortable: {
|
|
containerId,
|
|
index,
|
|
items
|
|
},
|
|
...customData
|
|
}), [containerId, customData, index, items]);
|
|
const itemsAfterCurrentSortable = F(() => items.slice(items.indexOf(id2)), [items, id2]);
|
|
const {
|
|
rect,
|
|
node,
|
|
isOver,
|
|
setNodeRef: setDroppableNodeRef
|
|
} = useDroppable({
|
|
id: id2,
|
|
data,
|
|
disabled: disabled.droppable,
|
|
resizeObserverConfig: {
|
|
updateMeasurementsFor: itemsAfterCurrentSortable,
|
|
...resizeObserverConfig
|
|
}
|
|
});
|
|
const {
|
|
active,
|
|
activatorEvent,
|
|
activeNodeRect,
|
|
attributes,
|
|
setNodeRef: setDraggableNodeRef,
|
|
listeners,
|
|
isDragging,
|
|
over,
|
|
setActivatorNodeRef,
|
|
transform
|
|
} = useDraggable({
|
|
id: id2,
|
|
data,
|
|
attributes: {
|
|
...defaultAttributes,
|
|
...userDefinedAttributes
|
|
},
|
|
disabled: disabled.draggable
|
|
});
|
|
const setNodeRef = useCombinedRefs(setDroppableNodeRef, setDraggableNodeRef);
|
|
const isSorting = Boolean(active);
|
|
const displaceItem = isSorting && !disableTransforms && isValidIndex(activeIndex) && isValidIndex(overIndex);
|
|
const shouldDisplaceDragSource = !useDragOverlay && isDragging;
|
|
const dragSourceDisplacement = shouldDisplaceDragSource && displaceItem ? transform : null;
|
|
const strategy = localStrategy != null ? localStrategy : globalStrategy;
|
|
const finalTransform = displaceItem ? dragSourceDisplacement != null ? dragSourceDisplacement : strategy({
|
|
rects: sortedRects,
|
|
activeNodeRect,
|
|
activeIndex,
|
|
overIndex,
|
|
index
|
|
}) : null;
|
|
const newIndex = isValidIndex(activeIndex) && isValidIndex(overIndex) ? getNewIndex({
|
|
id: id2,
|
|
items,
|
|
activeIndex,
|
|
overIndex
|
|
}) : index;
|
|
const activeId = active == null ? void 0 : active.id;
|
|
const previous = _2({
|
|
activeId,
|
|
items,
|
|
newIndex,
|
|
containerId
|
|
});
|
|
const itemsHaveChanged = items !== previous.current.items;
|
|
const shouldAnimateLayoutChanges = animateLayoutChanges3({
|
|
active,
|
|
containerId,
|
|
isDragging,
|
|
isSorting,
|
|
id: id2,
|
|
index,
|
|
items,
|
|
newIndex: previous.current.newIndex,
|
|
previousItems: previous.current.items,
|
|
previousContainerId: previous.current.containerId,
|
|
transition,
|
|
wasDragging: previous.current.activeId != null
|
|
});
|
|
const derivedTransform = useDerivedTransform({
|
|
disabled: !shouldAnimateLayoutChanges,
|
|
index,
|
|
node,
|
|
rect
|
|
});
|
|
h2(() => {
|
|
if (isSorting && previous.current.newIndex !== newIndex) {
|
|
previous.current.newIndex = newIndex;
|
|
}
|
|
if (containerId !== previous.current.containerId) {
|
|
previous.current.containerId = containerId;
|
|
}
|
|
if (items !== previous.current.items) {
|
|
previous.current.items = items;
|
|
}
|
|
}, [isSorting, newIndex, containerId, items]);
|
|
h2(() => {
|
|
if (activeId === previous.current.activeId) {
|
|
return;
|
|
}
|
|
if (activeId && !previous.current.activeId) {
|
|
previous.current.activeId = activeId;
|
|
return;
|
|
}
|
|
const timeoutId = setTimeout(() => {
|
|
previous.current.activeId = activeId;
|
|
}, 50);
|
|
return () => clearTimeout(timeoutId);
|
|
}, [activeId]);
|
|
return {
|
|
active,
|
|
activeIndex,
|
|
attributes,
|
|
data,
|
|
rect,
|
|
index,
|
|
newIndex,
|
|
items,
|
|
isOver,
|
|
isSorting,
|
|
isDragging,
|
|
listeners,
|
|
node,
|
|
overIndex,
|
|
over,
|
|
setNodeRef,
|
|
setActivatorNodeRef,
|
|
setDroppableNodeRef,
|
|
setDraggableNodeRef,
|
|
transform: derivedTransform != null ? derivedTransform : finalTransform,
|
|
transition: getTransition()
|
|
};
|
|
function getTransition() {
|
|
if (derivedTransform || itemsHaveChanged && previous.current.newIndex === index) {
|
|
return disabledTransition;
|
|
}
|
|
if (shouldDisplaceDragSource && !isKeyboardEvent(activatorEvent) || !transition) {
|
|
return void 0;
|
|
}
|
|
if (isSorting || shouldAnimateLayoutChanges) {
|
|
return CSS.Transition.toString({
|
|
...transition,
|
|
property: transitionProperty
|
|
});
|
|
}
|
|
return void 0;
|
|
}
|
|
}
|
|
function normalizeLocalDisabled(localDisabled, globalDisabled) {
|
|
var _localDisabled$dragga, _localDisabled$droppa;
|
|
if (typeof localDisabled === "boolean") {
|
|
return {
|
|
draggable: localDisabled,
|
|
droppable: false
|
|
};
|
|
}
|
|
return {
|
|
draggable: (_localDisabled$dragga = localDisabled == null ? void 0 : localDisabled.draggable) != null ? _localDisabled$dragga : globalDisabled.draggable,
|
|
droppable: (_localDisabled$droppa = localDisabled == null ? void 0 : localDisabled.droppable) != null ? _localDisabled$droppa : globalDisabled.droppable
|
|
};
|
|
}
|
|
function hasSortableData(entry) {
|
|
if (!entry) {
|
|
return false;
|
|
}
|
|
const data = entry.data.current;
|
|
if (data && "sortable" in data && typeof data.sortable === "object" && "containerId" in data.sortable && "items" in data.sortable && "index" in data.sortable) {
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
var directions = [KeyboardCode.Down, KeyboardCode.Right, KeyboardCode.Up, KeyboardCode.Left];
|
|
var sortableKeyboardCoordinates = (event, _ref) => {
|
|
let {
|
|
context: {
|
|
active,
|
|
collisionRect,
|
|
droppableRects,
|
|
droppableContainers,
|
|
over,
|
|
scrollableAncestors
|
|
}
|
|
} = _ref;
|
|
if (directions.includes(event.code)) {
|
|
event.preventDefault();
|
|
if (!active || !collisionRect) {
|
|
return;
|
|
}
|
|
const filteredContainers = [];
|
|
droppableContainers.getEnabled().forEach((entry) => {
|
|
if (!entry || entry != null && entry.disabled) {
|
|
return;
|
|
}
|
|
const rect = droppableRects.get(entry.id);
|
|
if (!rect) {
|
|
return;
|
|
}
|
|
switch (event.code) {
|
|
case KeyboardCode.Down:
|
|
if (collisionRect.top < rect.top) {
|
|
filteredContainers.push(entry);
|
|
}
|
|
break;
|
|
case KeyboardCode.Up:
|
|
if (collisionRect.top > rect.top) {
|
|
filteredContainers.push(entry);
|
|
}
|
|
break;
|
|
case KeyboardCode.Left:
|
|
if (collisionRect.left > rect.left) {
|
|
filteredContainers.push(entry);
|
|
}
|
|
break;
|
|
case KeyboardCode.Right:
|
|
if (collisionRect.left < rect.left) {
|
|
filteredContainers.push(entry);
|
|
}
|
|
break;
|
|
}
|
|
});
|
|
const collisions = closestCorners({
|
|
active,
|
|
collisionRect,
|
|
droppableRects,
|
|
droppableContainers: filteredContainers,
|
|
pointerCoordinates: null
|
|
});
|
|
let closestId = getFirstCollision(collisions, "id");
|
|
if (closestId === (over == null ? void 0 : over.id) && collisions.length > 1) {
|
|
closestId = collisions[1].id;
|
|
}
|
|
if (closestId != null) {
|
|
const activeDroppable = droppableContainers.get(active.id);
|
|
const newDroppable = droppableContainers.get(closestId);
|
|
const newRect = newDroppable ? droppableRects.get(newDroppable.id) : null;
|
|
const newNode = newDroppable == null ? void 0 : newDroppable.node.current;
|
|
if (newNode && newRect && activeDroppable && newDroppable) {
|
|
const newScrollAncestors = getScrollableAncestors(newNode);
|
|
const hasDifferentScrollAncestors = newScrollAncestors.some((element, index) => scrollableAncestors[index] !== element);
|
|
const hasSameContainer = isSameContainer(activeDroppable, newDroppable);
|
|
const isAfterActive = isAfter(activeDroppable, newDroppable);
|
|
const offset = hasDifferentScrollAncestors || !hasSameContainer ? {
|
|
x: 0,
|
|
y: 0
|
|
} : {
|
|
x: isAfterActive ? collisionRect.width - newRect.width : 0,
|
|
y: isAfterActive ? collisionRect.height - newRect.height : 0
|
|
};
|
|
const rectCoordinates = {
|
|
x: newRect.left,
|
|
y: newRect.top
|
|
};
|
|
const newCoordinates = offset.x && offset.y ? rectCoordinates : subtract(rectCoordinates, offset);
|
|
return newCoordinates;
|
|
}
|
|
}
|
|
}
|
|
return void 0;
|
|
};
|
|
function isSameContainer(a5, b4) {
|
|
if (!hasSortableData(a5) || !hasSortableData(b4)) {
|
|
return false;
|
|
}
|
|
return a5.data.current.sortable.containerId === b4.data.current.sortable.containerId;
|
|
}
|
|
function isAfter(a5, b4) {
|
|
if (!hasSortableData(a5) || !hasSortableData(b4)) {
|
|
return false;
|
|
}
|
|
if (!isSameContainer(a5, b4)) {
|
|
return false;
|
|
}
|
|
return a5.data.current.sortable.index < b4.data.current.sortable.index;
|
|
}
|
|
|
|
// src/components/ContextView/CardsView/CardsView.tsx
|
|
var import_classnames3 = __toESM(require_classnames());
|
|
|
|
// src/utils/ui/selection.ts
|
|
var selectNextIndex = (currIndex, array) => {
|
|
if (!currIndex && array.length > 0)
|
|
return array[0];
|
|
const pos = array.indexOf(currIndex);
|
|
if (pos < array.length - 1)
|
|
return array[pos + 1];
|
|
return currIndex;
|
|
};
|
|
var selectPrevIndex = (currIndex, array) => {
|
|
const pos = array.indexOf(currIndex);
|
|
if (pos > 0)
|
|
return array[pos - 1];
|
|
return array[0];
|
|
};
|
|
var selectRange = (currSel, newSel, array) => {
|
|
const lastIndex = array.findIndex((f4) => f4 == currSel);
|
|
const newIndex = array.findIndex((f4) => f4 == newSel);
|
|
if (lastIndex < newIndex) {
|
|
return array.filter((f4, i4) => i4 > lastIndex && i4 <= newIndex);
|
|
}
|
|
return array.filter((f4, i4) => i4 < lastIndex && i4 >= newIndex);
|
|
};
|
|
|
|
// src/components/ui/menus/selectMenu/concerns/matchers.js
|
|
function escapeForRegExp(string) {
|
|
return string.replace(/[-\\^$*+?.()|[\]{}]/g, "\\$&");
|
|
}
|
|
function matchAny(string) {
|
|
return new RegExp(escapeForRegExp(string), "gi");
|
|
}
|
|
function matchExact(string) {
|
|
return new RegExp(`^${escapeForRegExp(string)}$`, "i");
|
|
}
|
|
|
|
// src/components/ContextView/MDBContext.tsx
|
|
var import_obsidian6 = require("obsidian");
|
|
|
|
// src/schemas/mdb.ts
|
|
var fieldTypes = [
|
|
{
|
|
type: "unknown",
|
|
label: "",
|
|
restricted: true
|
|
},
|
|
{
|
|
type: "preview",
|
|
label: i18n_default.properties.preview.label,
|
|
restricted: true
|
|
},
|
|
{
|
|
type: "text",
|
|
label: i18n_default.properties.text.label
|
|
},
|
|
{
|
|
type: "number",
|
|
label: i18n_default.properties.number.label
|
|
},
|
|
{
|
|
type: "boolean",
|
|
label: i18n_default.properties.boolean.label
|
|
},
|
|
{
|
|
type: "date",
|
|
label: i18n_default.properties.date.label
|
|
},
|
|
{
|
|
type: "option",
|
|
label: i18n_default.properties.option.label,
|
|
multi: true,
|
|
multiType: "option-multi"
|
|
},
|
|
{
|
|
type: "file",
|
|
label: i18n_default.properties.file.label,
|
|
restricted: true
|
|
},
|
|
{
|
|
type: "fileprop",
|
|
label: i18n_default.properties.fileProperty.label
|
|
},
|
|
{
|
|
type: "link",
|
|
label: i18n_default.properties.link.label
|
|
},
|
|
{
|
|
type: "context",
|
|
label: i18n_default.properties.context.label
|
|
},
|
|
{
|
|
type: "tag",
|
|
label: i18n_default.properties.tag.label
|
|
},
|
|
{
|
|
type: "image",
|
|
label: i18n_default.properties.image.label,
|
|
multi: true,
|
|
multiType: "image-multi"
|
|
}
|
|
];
|
|
var defaultFileDBSchema = {
|
|
id: "files",
|
|
name: "Files",
|
|
type: "db",
|
|
primary: "true"
|
|
};
|
|
var defaultFileListSchema = {
|
|
id: "filesView",
|
|
name: "Files",
|
|
type: "list",
|
|
def: "files"
|
|
};
|
|
var defaultFileTableSchema = {
|
|
id: "filesView",
|
|
name: "Files",
|
|
type: "table",
|
|
def: "files"
|
|
};
|
|
var defaultFolderSchema = {
|
|
uniques: ["id"],
|
|
cols: ["id", "name", "type", "def", "predicate", "primary"],
|
|
rows: [defaultFileDBSchema, defaultFileListSchema]
|
|
};
|
|
var defaultTagSchema = {
|
|
uniques: ["id"],
|
|
cols: ["id", "name", "type", "def", "predicate", "primary"],
|
|
rows: [defaultFileDBSchema, defaultFileTableSchema]
|
|
};
|
|
var fieldSchema = {
|
|
uniques: ["name,schemaId"],
|
|
cols: [
|
|
"name",
|
|
"schemaId",
|
|
"type",
|
|
"value",
|
|
"attrs",
|
|
"hidden",
|
|
"unique",
|
|
"primary"
|
|
]
|
|
};
|
|
var defaultFolderFields = {
|
|
...fieldSchema,
|
|
rows: [
|
|
{
|
|
name: "_id",
|
|
schemaId: "files",
|
|
type: "id",
|
|
unique: "true",
|
|
hidden: "true"
|
|
},
|
|
{
|
|
name: "_source",
|
|
schemaId: "files",
|
|
type: "source",
|
|
hidden: "true"
|
|
},
|
|
{
|
|
name: i18n_default.properties.preview.label,
|
|
schemaId: "files",
|
|
type: "preview"
|
|
},
|
|
{
|
|
name: "File",
|
|
schemaId: "files",
|
|
type: "file",
|
|
primary: "true"
|
|
},
|
|
{
|
|
name: i18n_default.properties.fileProperty.createdTime,
|
|
schemaId: "files",
|
|
type: "fileprop",
|
|
value: "ctime"
|
|
}
|
|
]
|
|
};
|
|
var defaultTableFields = [
|
|
{
|
|
name: i18n_default.properties.defaultField,
|
|
schemaId: "",
|
|
type: "text"
|
|
}
|
|
];
|
|
var defaultTagFields = {
|
|
...fieldSchema,
|
|
rows: [
|
|
{
|
|
name: "_id",
|
|
schemaId: "files",
|
|
type: "id",
|
|
unique: "true",
|
|
hidden: "true"
|
|
},
|
|
{
|
|
name: "_source",
|
|
schemaId: "files",
|
|
type: "source",
|
|
hidden: "true"
|
|
},
|
|
{
|
|
name: "_sourceId",
|
|
schemaId: "files",
|
|
type: "sourceid",
|
|
hidden: "true"
|
|
},
|
|
{
|
|
name: "File",
|
|
schemaId: "files",
|
|
type: "file",
|
|
primary: "true"
|
|
}
|
|
]
|
|
};
|
|
var defaultFolderMDBTable = {
|
|
schema: defaultFileDBSchema,
|
|
cols: defaultFolderFields.rows,
|
|
rows: []
|
|
};
|
|
var defaultTagMDBTable = {
|
|
schema: defaultFileDBSchema,
|
|
cols: defaultTagFields.rows,
|
|
rows: []
|
|
};
|
|
var fieldsToTable = (fields, schemas) => {
|
|
return fields.filter((s5) => schemas.find((g4) => g4.id == s5.schemaId && g4.type == "db")).reduce((p3, c4) => {
|
|
return {
|
|
...p3,
|
|
...p3[c4.schemaId] ? {
|
|
[c4.schemaId]: {
|
|
uniques: c4.unique == "true" ? [...p3[c4.schemaId].uniques, c4.name] : p3[c4.schemaId].uniques,
|
|
cols: [...p3[c4.schemaId].cols, c4.name],
|
|
rows: []
|
|
}
|
|
} : {
|
|
[c4.schemaId]: {
|
|
uniques: c4.unique == "true" ? [c4.name] : [],
|
|
cols: [c4.name],
|
|
rows: []
|
|
}
|
|
}
|
|
};
|
|
}, {});
|
|
};
|
|
var defaultFolderTables = {
|
|
m_schema: defaultFolderSchema,
|
|
m_fields: defaultFolderFields,
|
|
...fieldsToTable(
|
|
defaultFolderFields.rows,
|
|
defaultFolderSchema.rows
|
|
)
|
|
};
|
|
var defaultTagTables = {
|
|
m_schema: defaultTagSchema,
|
|
m_fields: defaultTagFields,
|
|
...fieldsToTable(
|
|
defaultTagFields.rows,
|
|
defaultTagSchema.rows
|
|
)
|
|
};
|
|
|
|
// node_modules/date-fns/esm/_lib/toInteger/index.js
|
|
function toInteger(dirtyNumber) {
|
|
if (dirtyNumber === null || dirtyNumber === true || dirtyNumber === false) {
|
|
return NaN;
|
|
}
|
|
var number = Number(dirtyNumber);
|
|
if (isNaN(number)) {
|
|
return number;
|
|
}
|
|
return number < 0 ? Math.ceil(number) : Math.floor(number);
|
|
}
|
|
|
|
// node_modules/date-fns/esm/_lib/requiredArgs/index.js
|
|
function requiredArgs(required, args) {
|
|
if (args.length < required) {
|
|
throw new TypeError(required + " argument" + (required > 1 ? "s" : "") + " required, but only " + args.length + " present");
|
|
}
|
|
}
|
|
|
|
// node_modules/date-fns/esm/toDate/index.js
|
|
function _typeof(obj) {
|
|
"@babel/helpers - typeof";
|
|
if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") {
|
|
_typeof = function _typeof5(obj2) {
|
|
return typeof obj2;
|
|
};
|
|
} else {
|
|
_typeof = function _typeof5(obj2) {
|
|
return obj2 && typeof Symbol === "function" && obj2.constructor === Symbol && obj2 !== Symbol.prototype ? "symbol" : typeof obj2;
|
|
};
|
|
}
|
|
return _typeof(obj);
|
|
}
|
|
function toDate(argument) {
|
|
requiredArgs(1, arguments);
|
|
var argStr = Object.prototype.toString.call(argument);
|
|
if (argument instanceof Date || _typeof(argument) === "object" && argStr === "[object Date]") {
|
|
return new Date(argument.getTime());
|
|
} else if (typeof argument === "number" || argStr === "[object Number]") {
|
|
return new Date(argument);
|
|
} else {
|
|
if ((typeof argument === "string" || argStr === "[object String]") && typeof console !== "undefined") {
|
|
console.warn("Starting with v2.0.0-beta.1 date-fns doesn't accept strings as date arguments. Please use `parseISO` to parse strings. See: https://github.com/date-fns/date-fns/blob/master/docs/upgradeGuide.md#string-arguments");
|
|
console.warn(new Error().stack);
|
|
}
|
|
return new Date(NaN);
|
|
}
|
|
}
|
|
|
|
// node_modules/date-fns/esm/addDays/index.js
|
|
function addDays(dirtyDate, dirtyAmount) {
|
|
requiredArgs(2, arguments);
|
|
var date = toDate(dirtyDate);
|
|
var amount = toInteger(dirtyAmount);
|
|
if (isNaN(amount)) {
|
|
return new Date(NaN);
|
|
}
|
|
if (!amount) {
|
|
return date;
|
|
}
|
|
date.setDate(date.getDate() + amount);
|
|
return date;
|
|
}
|
|
|
|
// node_modules/date-fns/esm/addMonths/index.js
|
|
function addMonths(dirtyDate, dirtyAmount) {
|
|
requiredArgs(2, arguments);
|
|
var date = toDate(dirtyDate);
|
|
var amount = toInteger(dirtyAmount);
|
|
if (isNaN(amount)) {
|
|
return new Date(NaN);
|
|
}
|
|
if (!amount) {
|
|
return date;
|
|
}
|
|
var dayOfMonth = date.getDate();
|
|
var endOfDesiredMonth = new Date(date.getTime());
|
|
endOfDesiredMonth.setMonth(date.getMonth() + amount + 1, 0);
|
|
var daysInMonth = endOfDesiredMonth.getDate();
|
|
if (dayOfMonth >= daysInMonth) {
|
|
return endOfDesiredMonth;
|
|
} else {
|
|
date.setFullYear(endOfDesiredMonth.getFullYear(), endOfDesiredMonth.getMonth(), dayOfMonth);
|
|
return date;
|
|
}
|
|
}
|
|
|
|
// node_modules/date-fns/esm/addMilliseconds/index.js
|
|
function addMilliseconds(dirtyDate, dirtyAmount) {
|
|
requiredArgs(2, arguments);
|
|
var timestamp = toDate(dirtyDate).getTime();
|
|
var amount = toInteger(dirtyAmount);
|
|
return new Date(timestamp + amount);
|
|
}
|
|
|
|
// node_modules/date-fns/esm/_lib/defaultOptions/index.js
|
|
var defaultOptions2 = {};
|
|
function getDefaultOptions() {
|
|
return defaultOptions2;
|
|
}
|
|
|
|
// node_modules/date-fns/esm/startOfWeek/index.js
|
|
function startOfWeek(dirtyDate, options) {
|
|
var _ref, _ref2, _ref3, _options$weekStartsOn, _options$locale, _options$locale$optio, _defaultOptions$local, _defaultOptions$local2;
|
|
requiredArgs(1, arguments);
|
|
var defaultOptions3 = getDefaultOptions();
|
|
var weekStartsOn = toInteger((_ref = (_ref2 = (_ref3 = (_options$weekStartsOn = options === null || options === void 0 ? void 0 : options.weekStartsOn) !== null && _options$weekStartsOn !== void 0 ? _options$weekStartsOn : options === null || options === void 0 ? void 0 : (_options$locale = options.locale) === null || _options$locale === void 0 ? void 0 : (_options$locale$optio = _options$locale.options) === null || _options$locale$optio === void 0 ? void 0 : _options$locale$optio.weekStartsOn) !== null && _ref3 !== void 0 ? _ref3 : defaultOptions3.weekStartsOn) !== null && _ref2 !== void 0 ? _ref2 : (_defaultOptions$local = defaultOptions3.locale) === null || _defaultOptions$local === void 0 ? void 0 : (_defaultOptions$local2 = _defaultOptions$local.options) === null || _defaultOptions$local2 === void 0 ? void 0 : _defaultOptions$local2.weekStartsOn) !== null && _ref !== void 0 ? _ref : 0);
|
|
if (!(weekStartsOn >= 0 && weekStartsOn <= 6)) {
|
|
throw new RangeError("weekStartsOn must be between 0 and 6 inclusively");
|
|
}
|
|
var date = toDate(dirtyDate);
|
|
var day = date.getDay();
|
|
var diff = (day < weekStartsOn ? 7 : 0) + day - weekStartsOn;
|
|
date.setDate(date.getDate() - diff);
|
|
date.setHours(0, 0, 0, 0);
|
|
return date;
|
|
}
|
|
|
|
// node_modules/date-fns/esm/startOfISOWeek/index.js
|
|
function startOfISOWeek(dirtyDate) {
|
|
requiredArgs(1, arguments);
|
|
return startOfWeek(dirtyDate, {
|
|
weekStartsOn: 1
|
|
});
|
|
}
|
|
|
|
// node_modules/date-fns/esm/getISOWeekYear/index.js
|
|
function getISOWeekYear(dirtyDate) {
|
|
requiredArgs(1, arguments);
|
|
var date = toDate(dirtyDate);
|
|
var year = date.getFullYear();
|
|
var fourthOfJanuaryOfNextYear = new Date(0);
|
|
fourthOfJanuaryOfNextYear.setFullYear(year + 1, 0, 4);
|
|
fourthOfJanuaryOfNextYear.setHours(0, 0, 0, 0);
|
|
var startOfNextYear = startOfISOWeek(fourthOfJanuaryOfNextYear);
|
|
var fourthOfJanuaryOfThisYear = new Date(0);
|
|
fourthOfJanuaryOfThisYear.setFullYear(year, 0, 4);
|
|
fourthOfJanuaryOfThisYear.setHours(0, 0, 0, 0);
|
|
var startOfThisYear = startOfISOWeek(fourthOfJanuaryOfThisYear);
|
|
if (date.getTime() >= startOfNextYear.getTime()) {
|
|
return year + 1;
|
|
} else if (date.getTime() >= startOfThisYear.getTime()) {
|
|
return year;
|
|
} else {
|
|
return year - 1;
|
|
}
|
|
}
|
|
|
|
// node_modules/date-fns/esm/startOfISOWeekYear/index.js
|
|
function startOfISOWeekYear(dirtyDate) {
|
|
requiredArgs(1, arguments);
|
|
var year = getISOWeekYear(dirtyDate);
|
|
var fourthOfJanuary = new Date(0);
|
|
fourthOfJanuary.setFullYear(year, 0, 4);
|
|
fourthOfJanuary.setHours(0, 0, 0, 0);
|
|
var date = startOfISOWeek(fourthOfJanuary);
|
|
return date;
|
|
}
|
|
|
|
// node_modules/date-fns/esm/_lib/getTimezoneOffsetInMilliseconds/index.js
|
|
function getTimezoneOffsetInMilliseconds(date) {
|
|
var utcDate = new Date(Date.UTC(date.getFullYear(), date.getMonth(), date.getDate(), date.getHours(), date.getMinutes(), date.getSeconds(), date.getMilliseconds()));
|
|
utcDate.setUTCFullYear(date.getFullYear());
|
|
return date.getTime() - utcDate.getTime();
|
|
}
|
|
|
|
// node_modules/date-fns/esm/startOfDay/index.js
|
|
function startOfDay(dirtyDate) {
|
|
requiredArgs(1, arguments);
|
|
var date = toDate(dirtyDate);
|
|
date.setHours(0, 0, 0, 0);
|
|
return date;
|
|
}
|
|
|
|
// node_modules/date-fns/esm/differenceInCalendarDays/index.js
|
|
var MILLISECONDS_IN_DAY = 864e5;
|
|
function differenceInCalendarDays(dirtyDateLeft, dirtyDateRight) {
|
|
requiredArgs(2, arguments);
|
|
var startOfDayLeft = startOfDay(dirtyDateLeft);
|
|
var startOfDayRight = startOfDay(dirtyDateRight);
|
|
var timestampLeft = startOfDayLeft.getTime() - getTimezoneOffsetInMilliseconds(startOfDayLeft);
|
|
var timestampRight = startOfDayRight.getTime() - getTimezoneOffsetInMilliseconds(startOfDayRight);
|
|
return Math.round((timestampLeft - timestampRight) / MILLISECONDS_IN_DAY);
|
|
}
|
|
|
|
// node_modules/date-fns/esm/addWeeks/index.js
|
|
function addWeeks(dirtyDate, dirtyAmount) {
|
|
requiredArgs(2, arguments);
|
|
var amount = toInteger(dirtyAmount);
|
|
var days = amount * 7;
|
|
return addDays(dirtyDate, days);
|
|
}
|
|
|
|
// node_modules/date-fns/esm/addYears/index.js
|
|
function addYears(dirtyDate, dirtyAmount) {
|
|
requiredArgs(2, arguments);
|
|
var amount = toInteger(dirtyAmount);
|
|
return addMonths(dirtyDate, amount * 12);
|
|
}
|
|
|
|
// node_modules/date-fns/esm/max/index.js
|
|
function _typeof2(obj) {
|
|
"@babel/helpers - typeof";
|
|
if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") {
|
|
_typeof2 = function _typeof5(obj2) {
|
|
return typeof obj2;
|
|
};
|
|
} else {
|
|
_typeof2 = function _typeof5(obj2) {
|
|
return obj2 && typeof Symbol === "function" && obj2.constructor === Symbol && obj2 !== Symbol.prototype ? "symbol" : typeof obj2;
|
|
};
|
|
}
|
|
return _typeof2(obj);
|
|
}
|
|
function max(dirtyDatesArray) {
|
|
requiredArgs(1, arguments);
|
|
var datesArray;
|
|
if (dirtyDatesArray && typeof dirtyDatesArray.forEach === "function") {
|
|
datesArray = dirtyDatesArray;
|
|
} else if (_typeof2(dirtyDatesArray) === "object" && dirtyDatesArray !== null) {
|
|
datesArray = Array.prototype.slice.call(dirtyDatesArray);
|
|
} else {
|
|
return new Date(NaN);
|
|
}
|
|
var result;
|
|
datesArray.forEach(function(dirtyDate) {
|
|
var currentDate = toDate(dirtyDate);
|
|
if (result === void 0 || result < currentDate || isNaN(Number(currentDate))) {
|
|
result = currentDate;
|
|
}
|
|
});
|
|
return result || new Date(NaN);
|
|
}
|
|
|
|
// node_modules/date-fns/esm/min/index.js
|
|
function _typeof3(obj) {
|
|
"@babel/helpers - typeof";
|
|
if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") {
|
|
_typeof3 = function _typeof5(obj2) {
|
|
return typeof obj2;
|
|
};
|
|
} else {
|
|
_typeof3 = function _typeof5(obj2) {
|
|
return obj2 && typeof Symbol === "function" && obj2.constructor === Symbol && obj2 !== Symbol.prototype ? "symbol" : typeof obj2;
|
|
};
|
|
}
|
|
return _typeof3(obj);
|
|
}
|
|
function min(dirtyDatesArray) {
|
|
requiredArgs(1, arguments);
|
|
var datesArray;
|
|
if (dirtyDatesArray && typeof dirtyDatesArray.forEach === "function") {
|
|
datesArray = dirtyDatesArray;
|
|
} else if (_typeof3(dirtyDatesArray) === "object" && dirtyDatesArray !== null) {
|
|
datesArray = Array.prototype.slice.call(dirtyDatesArray);
|
|
} else {
|
|
return new Date(NaN);
|
|
}
|
|
var result;
|
|
datesArray.forEach(function(dirtyDate) {
|
|
var currentDate = toDate(dirtyDate);
|
|
if (result === void 0 || result > currentDate || isNaN(currentDate.getDate())) {
|
|
result = currentDate;
|
|
}
|
|
});
|
|
return result || new Date(NaN);
|
|
}
|
|
|
|
// node_modules/date-fns/esm/compareAsc/index.js
|
|
function compareAsc(dirtyDateLeft, dirtyDateRight) {
|
|
requiredArgs(2, arguments);
|
|
var dateLeft = toDate(dirtyDateLeft);
|
|
var dateRight = toDate(dirtyDateRight);
|
|
var diff = dateLeft.getTime() - dateRight.getTime();
|
|
if (diff < 0) {
|
|
return -1;
|
|
} else if (diff > 0) {
|
|
return 1;
|
|
} else {
|
|
return diff;
|
|
}
|
|
}
|
|
|
|
// node_modules/date-fns/esm/isSameDay/index.js
|
|
function isSameDay(dirtyDateLeft, dirtyDateRight) {
|
|
requiredArgs(2, arguments);
|
|
var dateLeftStartOfDay = startOfDay(dirtyDateLeft);
|
|
var dateRightStartOfDay = startOfDay(dirtyDateRight);
|
|
return dateLeftStartOfDay.getTime() === dateRightStartOfDay.getTime();
|
|
}
|
|
|
|
// node_modules/date-fns/esm/isDate/index.js
|
|
function _typeof4(obj) {
|
|
"@babel/helpers - typeof";
|
|
if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") {
|
|
_typeof4 = function _typeof5(obj2) {
|
|
return typeof obj2;
|
|
};
|
|
} else {
|
|
_typeof4 = function _typeof5(obj2) {
|
|
return obj2 && typeof Symbol === "function" && obj2.constructor === Symbol && obj2 !== Symbol.prototype ? "symbol" : typeof obj2;
|
|
};
|
|
}
|
|
return _typeof4(obj);
|
|
}
|
|
function isDate(value) {
|
|
requiredArgs(1, arguments);
|
|
return value instanceof Date || _typeof4(value) === "object" && Object.prototype.toString.call(value) === "[object Date]";
|
|
}
|
|
|
|
// node_modules/date-fns/esm/isValid/index.js
|
|
function isValid(dirtyDate) {
|
|
requiredArgs(1, arguments);
|
|
if (!isDate(dirtyDate) && typeof dirtyDate !== "number") {
|
|
return false;
|
|
}
|
|
var date = toDate(dirtyDate);
|
|
return !isNaN(Number(date));
|
|
}
|
|
|
|
// node_modules/date-fns/esm/differenceInCalendarMonths/index.js
|
|
function differenceInCalendarMonths(dirtyDateLeft, dirtyDateRight) {
|
|
requiredArgs(2, arguments);
|
|
var dateLeft = toDate(dirtyDateLeft);
|
|
var dateRight = toDate(dirtyDateRight);
|
|
var yearDiff = dateLeft.getFullYear() - dateRight.getFullYear();
|
|
var monthDiff = dateLeft.getMonth() - dateRight.getMonth();
|
|
return yearDiff * 12 + monthDiff;
|
|
}
|
|
|
|
// node_modules/date-fns/esm/differenceInCalendarWeeks/index.js
|
|
var MILLISECONDS_IN_WEEK = 6048e5;
|
|
function differenceInCalendarWeeks(dirtyDateLeft, dirtyDateRight, options) {
|
|
requiredArgs(2, arguments);
|
|
var startOfWeekLeft = startOfWeek(dirtyDateLeft, options);
|
|
var startOfWeekRight = startOfWeek(dirtyDateRight, options);
|
|
var timestampLeft = startOfWeekLeft.getTime() - getTimezoneOffsetInMilliseconds(startOfWeekLeft);
|
|
var timestampRight = startOfWeekRight.getTime() - getTimezoneOffsetInMilliseconds(startOfWeekRight);
|
|
return Math.round((timestampLeft - timestampRight) / MILLISECONDS_IN_WEEK);
|
|
}
|
|
|
|
// node_modules/date-fns/esm/differenceInMilliseconds/index.js
|
|
function differenceInMilliseconds(dateLeft, dateRight) {
|
|
requiredArgs(2, arguments);
|
|
return toDate(dateLeft).getTime() - toDate(dateRight).getTime();
|
|
}
|
|
|
|
// node_modules/date-fns/esm/_lib/roundingMethods/index.js
|
|
var roundingMap = {
|
|
ceil: Math.ceil,
|
|
round: Math.round,
|
|
floor: Math.floor,
|
|
trunc: function trunc(value) {
|
|
return value < 0 ? Math.ceil(value) : Math.floor(value);
|
|
}
|
|
};
|
|
var defaultRoundingMethod = "trunc";
|
|
function getRoundingMethod(method) {
|
|
return method ? roundingMap[method] : roundingMap[defaultRoundingMethod];
|
|
}
|
|
|
|
// node_modules/date-fns/esm/endOfDay/index.js
|
|
function endOfDay(dirtyDate) {
|
|
requiredArgs(1, arguments);
|
|
var date = toDate(dirtyDate);
|
|
date.setHours(23, 59, 59, 999);
|
|
return date;
|
|
}
|
|
|
|
// node_modules/date-fns/esm/endOfMonth/index.js
|
|
function endOfMonth(dirtyDate) {
|
|
requiredArgs(1, arguments);
|
|
var date = toDate(dirtyDate);
|
|
var month = date.getMonth();
|
|
date.setFullYear(date.getFullYear(), month + 1, 0);
|
|
date.setHours(23, 59, 59, 999);
|
|
return date;
|
|
}
|
|
|
|
// node_modules/date-fns/esm/isLastDayOfMonth/index.js
|
|
function isLastDayOfMonth(dirtyDate) {
|
|
requiredArgs(1, arguments);
|
|
var date = toDate(dirtyDate);
|
|
return endOfDay(date).getTime() === endOfMonth(date).getTime();
|
|
}
|
|
|
|
// node_modules/date-fns/esm/differenceInMonths/index.js
|
|
function differenceInMonths(dirtyDateLeft, dirtyDateRight) {
|
|
requiredArgs(2, arguments);
|
|
var dateLeft = toDate(dirtyDateLeft);
|
|
var dateRight = toDate(dirtyDateRight);
|
|
var sign = compareAsc(dateLeft, dateRight);
|
|
var difference = Math.abs(differenceInCalendarMonths(dateLeft, dateRight));
|
|
var result;
|
|
if (difference < 1) {
|
|
result = 0;
|
|
} else {
|
|
if (dateLeft.getMonth() === 1 && dateLeft.getDate() > 27) {
|
|
dateLeft.setDate(30);
|
|
}
|
|
dateLeft.setMonth(dateLeft.getMonth() - sign * difference);
|
|
var isLastMonthNotFull = compareAsc(dateLeft, dateRight) === -sign;
|
|
if (isLastDayOfMonth(toDate(dirtyDateLeft)) && difference === 1 && compareAsc(dirtyDateLeft, dateRight) === 1) {
|
|
isLastMonthNotFull = false;
|
|
}
|
|
result = sign * (difference - Number(isLastMonthNotFull));
|
|
}
|
|
return result === 0 ? 0 : result;
|
|
}
|
|
|
|
// node_modules/date-fns/esm/differenceInSeconds/index.js
|
|
function differenceInSeconds(dateLeft, dateRight, options) {
|
|
requiredArgs(2, arguments);
|
|
var diff = differenceInMilliseconds(dateLeft, dateRight) / 1e3;
|
|
return getRoundingMethod(options === null || options === void 0 ? void 0 : options.roundingMethod)(diff);
|
|
}
|
|
|
|
// node_modules/date-fns/esm/startOfMonth/index.js
|
|
function startOfMonth(dirtyDate) {
|
|
requiredArgs(1, arguments);
|
|
var date = toDate(dirtyDate);
|
|
date.setDate(1);
|
|
date.setHours(0, 0, 0, 0);
|
|
return date;
|
|
}
|
|
|
|
// node_modules/date-fns/esm/startOfYear/index.js
|
|
function startOfYear(dirtyDate) {
|
|
requiredArgs(1, arguments);
|
|
var cleanDate = toDate(dirtyDate);
|
|
var date = new Date(0);
|
|
date.setFullYear(cleanDate.getFullYear(), 0, 1);
|
|
date.setHours(0, 0, 0, 0);
|
|
return date;
|
|
}
|
|
|
|
// node_modules/date-fns/esm/endOfWeek/index.js
|
|
function endOfWeek(dirtyDate, options) {
|
|
var _ref, _ref2, _ref3, _options$weekStartsOn, _options$locale, _options$locale$optio, _defaultOptions$local, _defaultOptions$local2;
|
|
requiredArgs(1, arguments);
|
|
var defaultOptions3 = getDefaultOptions();
|
|
var weekStartsOn = toInteger((_ref = (_ref2 = (_ref3 = (_options$weekStartsOn = options === null || options === void 0 ? void 0 : options.weekStartsOn) !== null && _options$weekStartsOn !== void 0 ? _options$weekStartsOn : options === null || options === void 0 ? void 0 : (_options$locale = options.locale) === null || _options$locale === void 0 ? void 0 : (_options$locale$optio = _options$locale.options) === null || _options$locale$optio === void 0 ? void 0 : _options$locale$optio.weekStartsOn) !== null && _ref3 !== void 0 ? _ref3 : defaultOptions3.weekStartsOn) !== null && _ref2 !== void 0 ? _ref2 : (_defaultOptions$local = defaultOptions3.locale) === null || _defaultOptions$local === void 0 ? void 0 : (_defaultOptions$local2 = _defaultOptions$local.options) === null || _defaultOptions$local2 === void 0 ? void 0 : _defaultOptions$local2.weekStartsOn) !== null && _ref !== void 0 ? _ref : 0);
|
|
if (!(weekStartsOn >= 0 && weekStartsOn <= 6)) {
|
|
throw new RangeError("weekStartsOn must be between 0 and 6 inclusively");
|
|
}
|
|
var date = toDate(dirtyDate);
|
|
var day = date.getDay();
|
|
var diff = (day < weekStartsOn ? -7 : 0) + 6 - (day - weekStartsOn);
|
|
date.setDate(date.getDate() + diff);
|
|
date.setHours(23, 59, 59, 999);
|
|
return date;
|
|
}
|
|
|
|
// node_modules/date-fns/esm/endOfISOWeek/index.js
|
|
function endOfISOWeek(dirtyDate) {
|
|
requiredArgs(1, arguments);
|
|
return endOfWeek(dirtyDate, {
|
|
weekStartsOn: 1
|
|
});
|
|
}
|
|
|
|
// node_modules/date-fns/esm/subMilliseconds/index.js
|
|
function subMilliseconds(dirtyDate, dirtyAmount) {
|
|
requiredArgs(2, arguments);
|
|
var amount = toInteger(dirtyAmount);
|
|
return addMilliseconds(dirtyDate, -amount);
|
|
}
|
|
|
|
// node_modules/date-fns/esm/_lib/getUTCDayOfYear/index.js
|
|
var MILLISECONDS_IN_DAY2 = 864e5;
|
|
function getUTCDayOfYear(dirtyDate) {
|
|
requiredArgs(1, arguments);
|
|
var date = toDate(dirtyDate);
|
|
var timestamp = date.getTime();
|
|
date.setUTCMonth(0, 1);
|
|
date.setUTCHours(0, 0, 0, 0);
|
|
var startOfYearTimestamp = date.getTime();
|
|
var difference = timestamp - startOfYearTimestamp;
|
|
return Math.floor(difference / MILLISECONDS_IN_DAY2) + 1;
|
|
}
|
|
|
|
// node_modules/date-fns/esm/_lib/startOfUTCISOWeek/index.js
|
|
function startOfUTCISOWeek(dirtyDate) {
|
|
requiredArgs(1, arguments);
|
|
var weekStartsOn = 1;
|
|
var date = toDate(dirtyDate);
|
|
var day = date.getUTCDay();
|
|
var diff = (day < weekStartsOn ? 7 : 0) + day - weekStartsOn;
|
|
date.setUTCDate(date.getUTCDate() - diff);
|
|
date.setUTCHours(0, 0, 0, 0);
|
|
return date;
|
|
}
|
|
|
|
// node_modules/date-fns/esm/_lib/getUTCISOWeekYear/index.js
|
|
function getUTCISOWeekYear(dirtyDate) {
|
|
requiredArgs(1, arguments);
|
|
var date = toDate(dirtyDate);
|
|
var year = date.getUTCFullYear();
|
|
var fourthOfJanuaryOfNextYear = new Date(0);
|
|
fourthOfJanuaryOfNextYear.setUTCFullYear(year + 1, 0, 4);
|
|
fourthOfJanuaryOfNextYear.setUTCHours(0, 0, 0, 0);
|
|
var startOfNextYear = startOfUTCISOWeek(fourthOfJanuaryOfNextYear);
|
|
var fourthOfJanuaryOfThisYear = new Date(0);
|
|
fourthOfJanuaryOfThisYear.setUTCFullYear(year, 0, 4);
|
|
fourthOfJanuaryOfThisYear.setUTCHours(0, 0, 0, 0);
|
|
var startOfThisYear = startOfUTCISOWeek(fourthOfJanuaryOfThisYear);
|
|
if (date.getTime() >= startOfNextYear.getTime()) {
|
|
return year + 1;
|
|
} else if (date.getTime() >= startOfThisYear.getTime()) {
|
|
return year;
|
|
} else {
|
|
return year - 1;
|
|
}
|
|
}
|
|
|
|
// node_modules/date-fns/esm/_lib/startOfUTCISOWeekYear/index.js
|
|
function startOfUTCISOWeekYear(dirtyDate) {
|
|
requiredArgs(1, arguments);
|
|
var year = getUTCISOWeekYear(dirtyDate);
|
|
var fourthOfJanuary = new Date(0);
|
|
fourthOfJanuary.setUTCFullYear(year, 0, 4);
|
|
fourthOfJanuary.setUTCHours(0, 0, 0, 0);
|
|
var date = startOfUTCISOWeek(fourthOfJanuary);
|
|
return date;
|
|
}
|
|
|
|
// node_modules/date-fns/esm/_lib/getUTCISOWeek/index.js
|
|
var MILLISECONDS_IN_WEEK2 = 6048e5;
|
|
function getUTCISOWeek(dirtyDate) {
|
|
requiredArgs(1, arguments);
|
|
var date = toDate(dirtyDate);
|
|
var diff = startOfUTCISOWeek(date).getTime() - startOfUTCISOWeekYear(date).getTime();
|
|
return Math.round(diff / MILLISECONDS_IN_WEEK2) + 1;
|
|
}
|
|
|
|
// node_modules/date-fns/esm/_lib/startOfUTCWeek/index.js
|
|
function startOfUTCWeek(dirtyDate, options) {
|
|
var _ref, _ref2, _ref3, _options$weekStartsOn, _options$locale, _options$locale$optio, _defaultOptions$local, _defaultOptions$local2;
|
|
requiredArgs(1, arguments);
|
|
var defaultOptions3 = getDefaultOptions();
|
|
var weekStartsOn = toInteger((_ref = (_ref2 = (_ref3 = (_options$weekStartsOn = options === null || options === void 0 ? void 0 : options.weekStartsOn) !== null && _options$weekStartsOn !== void 0 ? _options$weekStartsOn : options === null || options === void 0 ? void 0 : (_options$locale = options.locale) === null || _options$locale === void 0 ? void 0 : (_options$locale$optio = _options$locale.options) === null || _options$locale$optio === void 0 ? void 0 : _options$locale$optio.weekStartsOn) !== null && _ref3 !== void 0 ? _ref3 : defaultOptions3.weekStartsOn) !== null && _ref2 !== void 0 ? _ref2 : (_defaultOptions$local = defaultOptions3.locale) === null || _defaultOptions$local === void 0 ? void 0 : (_defaultOptions$local2 = _defaultOptions$local.options) === null || _defaultOptions$local2 === void 0 ? void 0 : _defaultOptions$local2.weekStartsOn) !== null && _ref !== void 0 ? _ref : 0);
|
|
if (!(weekStartsOn >= 0 && weekStartsOn <= 6)) {
|
|
throw new RangeError("weekStartsOn must be between 0 and 6 inclusively");
|
|
}
|
|
var date = toDate(dirtyDate);
|
|
var day = date.getUTCDay();
|
|
var diff = (day < weekStartsOn ? 7 : 0) + day - weekStartsOn;
|
|
date.setUTCDate(date.getUTCDate() - diff);
|
|
date.setUTCHours(0, 0, 0, 0);
|
|
return date;
|
|
}
|
|
|
|
// node_modules/date-fns/esm/_lib/getUTCWeekYear/index.js
|
|
function getUTCWeekYear(dirtyDate, options) {
|
|
var _ref, _ref2, _ref3, _options$firstWeekCon, _options$locale, _options$locale$optio, _defaultOptions$local, _defaultOptions$local2;
|
|
requiredArgs(1, arguments);
|
|
var date = toDate(dirtyDate);
|
|
var year = date.getUTCFullYear();
|
|
var defaultOptions3 = getDefaultOptions();
|
|
var firstWeekContainsDate = toInteger((_ref = (_ref2 = (_ref3 = (_options$firstWeekCon = options === null || options === void 0 ? void 0 : options.firstWeekContainsDate) !== null && _options$firstWeekCon !== void 0 ? _options$firstWeekCon : options === null || options === void 0 ? void 0 : (_options$locale = options.locale) === null || _options$locale === void 0 ? void 0 : (_options$locale$optio = _options$locale.options) === null || _options$locale$optio === void 0 ? void 0 : _options$locale$optio.firstWeekContainsDate) !== null && _ref3 !== void 0 ? _ref3 : defaultOptions3.firstWeekContainsDate) !== null && _ref2 !== void 0 ? _ref2 : (_defaultOptions$local = defaultOptions3.locale) === null || _defaultOptions$local === void 0 ? void 0 : (_defaultOptions$local2 = _defaultOptions$local.options) === null || _defaultOptions$local2 === void 0 ? void 0 : _defaultOptions$local2.firstWeekContainsDate) !== null && _ref !== void 0 ? _ref : 1);
|
|
if (!(firstWeekContainsDate >= 1 && firstWeekContainsDate <= 7)) {
|
|
throw new RangeError("firstWeekContainsDate must be between 1 and 7 inclusively");
|
|
}
|
|
var firstWeekOfNextYear = new Date(0);
|
|
firstWeekOfNextYear.setUTCFullYear(year + 1, 0, firstWeekContainsDate);
|
|
firstWeekOfNextYear.setUTCHours(0, 0, 0, 0);
|
|
var startOfNextYear = startOfUTCWeek(firstWeekOfNextYear, options);
|
|
var firstWeekOfThisYear = new Date(0);
|
|
firstWeekOfThisYear.setUTCFullYear(year, 0, firstWeekContainsDate);
|
|
firstWeekOfThisYear.setUTCHours(0, 0, 0, 0);
|
|
var startOfThisYear = startOfUTCWeek(firstWeekOfThisYear, options);
|
|
if (date.getTime() >= startOfNextYear.getTime()) {
|
|
return year + 1;
|
|
} else if (date.getTime() >= startOfThisYear.getTime()) {
|
|
return year;
|
|
} else {
|
|
return year - 1;
|
|
}
|
|
}
|
|
|
|
// node_modules/date-fns/esm/_lib/startOfUTCWeekYear/index.js
|
|
function startOfUTCWeekYear(dirtyDate, options) {
|
|
var _ref, _ref2, _ref3, _options$firstWeekCon, _options$locale, _options$locale$optio, _defaultOptions$local, _defaultOptions$local2;
|
|
requiredArgs(1, arguments);
|
|
var defaultOptions3 = getDefaultOptions();
|
|
var firstWeekContainsDate = toInteger((_ref = (_ref2 = (_ref3 = (_options$firstWeekCon = options === null || options === void 0 ? void 0 : options.firstWeekContainsDate) !== null && _options$firstWeekCon !== void 0 ? _options$firstWeekCon : options === null || options === void 0 ? void 0 : (_options$locale = options.locale) === null || _options$locale === void 0 ? void 0 : (_options$locale$optio = _options$locale.options) === null || _options$locale$optio === void 0 ? void 0 : _options$locale$optio.firstWeekContainsDate) !== null && _ref3 !== void 0 ? _ref3 : defaultOptions3.firstWeekContainsDate) !== null && _ref2 !== void 0 ? _ref2 : (_defaultOptions$local = defaultOptions3.locale) === null || _defaultOptions$local === void 0 ? void 0 : (_defaultOptions$local2 = _defaultOptions$local.options) === null || _defaultOptions$local2 === void 0 ? void 0 : _defaultOptions$local2.firstWeekContainsDate) !== null && _ref !== void 0 ? _ref : 1);
|
|
var year = getUTCWeekYear(dirtyDate, options);
|
|
var firstWeek = new Date(0);
|
|
firstWeek.setUTCFullYear(year, 0, firstWeekContainsDate);
|
|
firstWeek.setUTCHours(0, 0, 0, 0);
|
|
var date = startOfUTCWeek(firstWeek, options);
|
|
return date;
|
|
}
|
|
|
|
// node_modules/date-fns/esm/_lib/getUTCWeek/index.js
|
|
var MILLISECONDS_IN_WEEK3 = 6048e5;
|
|
function getUTCWeek(dirtyDate, options) {
|
|
requiredArgs(1, arguments);
|
|
var date = toDate(dirtyDate);
|
|
var diff = startOfUTCWeek(date, options).getTime() - startOfUTCWeekYear(date, options).getTime();
|
|
return Math.round(diff / MILLISECONDS_IN_WEEK3) + 1;
|
|
}
|
|
|
|
// node_modules/date-fns/esm/_lib/addLeadingZeros/index.js
|
|
function addLeadingZeros(number, targetLength) {
|
|
var sign = number < 0 ? "-" : "";
|
|
var output = Math.abs(number).toString();
|
|
while (output.length < targetLength) {
|
|
output = "0" + output;
|
|
}
|
|
return sign + output;
|
|
}
|
|
|
|
// node_modules/date-fns/esm/_lib/format/lightFormatters/index.js
|
|
var formatters = {
|
|
y: function y3(date, token) {
|
|
var signedYear = date.getUTCFullYear();
|
|
var year = signedYear > 0 ? signedYear : 1 - signedYear;
|
|
return addLeadingZeros(token === "yy" ? year % 100 : year, token.length);
|
|
},
|
|
M: function M3(date, token) {
|
|
var month = date.getUTCMonth();
|
|
return token === "M" ? String(month + 1) : addLeadingZeros(month + 1, 2);
|
|
},
|
|
d: function d3(date, token) {
|
|
return addLeadingZeros(date.getUTCDate(), token.length);
|
|
},
|
|
a: function a3(date, token) {
|
|
var dayPeriodEnumValue = date.getUTCHours() / 12 >= 1 ? "pm" : "am";
|
|
switch (token) {
|
|
case "a":
|
|
case "aa":
|
|
return dayPeriodEnumValue.toUpperCase();
|
|
case "aaa":
|
|
return dayPeriodEnumValue;
|
|
case "aaaaa":
|
|
return dayPeriodEnumValue[0];
|
|
case "aaaa":
|
|
default:
|
|
return dayPeriodEnumValue === "am" ? "a.m." : "p.m.";
|
|
}
|
|
},
|
|
h: function h3(date, token) {
|
|
return addLeadingZeros(date.getUTCHours() % 12 || 12, token.length);
|
|
},
|
|
H: function H3(date, token) {
|
|
return addLeadingZeros(date.getUTCHours(), token.length);
|
|
},
|
|
m: function m3(date, token) {
|
|
return addLeadingZeros(date.getUTCMinutes(), token.length);
|
|
},
|
|
s: function s3(date, token) {
|
|
return addLeadingZeros(date.getUTCSeconds(), token.length);
|
|
},
|
|
S: function S2(date, token) {
|
|
var numberOfDigits = token.length;
|
|
var milliseconds = date.getUTCMilliseconds();
|
|
var fractionalSeconds = Math.floor(milliseconds * Math.pow(10, numberOfDigits - 3));
|
|
return addLeadingZeros(fractionalSeconds, token.length);
|
|
}
|
|
};
|
|
var lightFormatters_default = formatters;
|
|
|
|
// node_modules/date-fns/esm/_lib/format/formatters/index.js
|
|
var dayPeriodEnum = {
|
|
am: "am",
|
|
pm: "pm",
|
|
midnight: "midnight",
|
|
noon: "noon",
|
|
morning: "morning",
|
|
afternoon: "afternoon",
|
|
evening: "evening",
|
|
night: "night"
|
|
};
|
|
var formatters2 = {
|
|
G: function G2(date, token, localize2) {
|
|
var era = date.getUTCFullYear() > 0 ? 1 : 0;
|
|
switch (token) {
|
|
case "G":
|
|
case "GG":
|
|
case "GGG":
|
|
return localize2.era(era, {
|
|
width: "abbreviated"
|
|
});
|
|
case "GGGGG":
|
|
return localize2.era(era, {
|
|
width: "narrow"
|
|
});
|
|
case "GGGG":
|
|
default:
|
|
return localize2.era(era, {
|
|
width: "wide"
|
|
});
|
|
}
|
|
},
|
|
y: function y4(date, token, localize2) {
|
|
if (token === "yo") {
|
|
var signedYear = date.getUTCFullYear();
|
|
var year = signedYear > 0 ? signedYear : 1 - signedYear;
|
|
return localize2.ordinalNumber(year, {
|
|
unit: "year"
|
|
});
|
|
}
|
|
return lightFormatters_default.y(date, token);
|
|
},
|
|
Y: function Y2(date, token, localize2, options) {
|
|
var signedWeekYear = getUTCWeekYear(date, options);
|
|
var weekYear = signedWeekYear > 0 ? signedWeekYear : 1 - signedWeekYear;
|
|
if (token === "YY") {
|
|
var twoDigitYear = weekYear % 100;
|
|
return addLeadingZeros(twoDigitYear, 2);
|
|
}
|
|
if (token === "Yo") {
|
|
return localize2.ordinalNumber(weekYear, {
|
|
unit: "year"
|
|
});
|
|
}
|
|
return addLeadingZeros(weekYear, token.length);
|
|
},
|
|
R: function R2(date, token) {
|
|
var isoWeekYear = getUTCISOWeekYear(date);
|
|
return addLeadingZeros(isoWeekYear, token.length);
|
|
},
|
|
u: function u3(date, token) {
|
|
var year = date.getUTCFullYear();
|
|
return addLeadingZeros(year, token.length);
|
|
},
|
|
Q: function Q2(date, token, localize2) {
|
|
var quarter = Math.ceil((date.getUTCMonth() + 1) / 3);
|
|
switch (token) {
|
|
case "Q":
|
|
return String(quarter);
|
|
case "QQ":
|
|
return addLeadingZeros(quarter, 2);
|
|
case "Qo":
|
|
return localize2.ordinalNumber(quarter, {
|
|
unit: "quarter"
|
|
});
|
|
case "QQQ":
|
|
return localize2.quarter(quarter, {
|
|
width: "abbreviated",
|
|
context: "formatting"
|
|
});
|
|
case "QQQQQ":
|
|
return localize2.quarter(quarter, {
|
|
width: "narrow",
|
|
context: "formatting"
|
|
});
|
|
case "QQQQ":
|
|
default:
|
|
return localize2.quarter(quarter, {
|
|
width: "wide",
|
|
context: "formatting"
|
|
});
|
|
}
|
|
},
|
|
q: function q4(date, token, localize2) {
|
|
var quarter = Math.ceil((date.getUTCMonth() + 1) / 3);
|
|
switch (token) {
|
|
case "q":
|
|
return String(quarter);
|
|
case "qq":
|
|
return addLeadingZeros(quarter, 2);
|
|
case "qo":
|
|
return localize2.ordinalNumber(quarter, {
|
|
unit: "quarter"
|
|
});
|
|
case "qqq":
|
|
return localize2.quarter(quarter, {
|
|
width: "abbreviated",
|
|
context: "standalone"
|
|
});
|
|
case "qqqqq":
|
|
return localize2.quarter(quarter, {
|
|
width: "narrow",
|
|
context: "standalone"
|
|
});
|
|
case "qqqq":
|
|
default:
|
|
return localize2.quarter(quarter, {
|
|
width: "wide",
|
|
context: "standalone"
|
|
});
|
|
}
|
|
},
|
|
M: function M4(date, token, localize2) {
|
|
var month = date.getUTCMonth();
|
|
switch (token) {
|
|
case "M":
|
|
case "MM":
|
|
return lightFormatters_default.M(date, token);
|
|
case "Mo":
|
|
return localize2.ordinalNumber(month + 1, {
|
|
unit: "month"
|
|
});
|
|
case "MMM":
|
|
return localize2.month(month, {
|
|
width: "abbreviated",
|
|
context: "formatting"
|
|
});
|
|
case "MMMMM":
|
|
return localize2.month(month, {
|
|
width: "narrow",
|
|
context: "formatting"
|
|
});
|
|
case "MMMM":
|
|
default:
|
|
return localize2.month(month, {
|
|
width: "wide",
|
|
context: "formatting"
|
|
});
|
|
}
|
|
},
|
|
L: function L3(date, token, localize2) {
|
|
var month = date.getUTCMonth();
|
|
switch (token) {
|
|
case "L":
|
|
return String(month + 1);
|
|
case "LL":
|
|
return addLeadingZeros(month + 1, 2);
|
|
case "Lo":
|
|
return localize2.ordinalNumber(month + 1, {
|
|
unit: "month"
|
|
});
|
|
case "LLL":
|
|
return localize2.month(month, {
|
|
width: "abbreviated",
|
|
context: "standalone"
|
|
});
|
|
case "LLLLL":
|
|
return localize2.month(month, {
|
|
width: "narrow",
|
|
context: "standalone"
|
|
});
|
|
case "LLLL":
|
|
default:
|
|
return localize2.month(month, {
|
|
width: "wide",
|
|
context: "standalone"
|
|
});
|
|
}
|
|
},
|
|
w: function w4(date, token, localize2, options) {
|
|
var week = getUTCWeek(date, options);
|
|
if (token === "wo") {
|
|
return localize2.ordinalNumber(week, {
|
|
unit: "week"
|
|
});
|
|
}
|
|
return addLeadingZeros(week, token.length);
|
|
},
|
|
I: function I3(date, token, localize2) {
|
|
var isoWeek = getUTCISOWeek(date);
|
|
if (token === "Io") {
|
|
return localize2.ordinalNumber(isoWeek, {
|
|
unit: "week"
|
|
});
|
|
}
|
|
return addLeadingZeros(isoWeek, token.length);
|
|
},
|
|
d: function d4(date, token, localize2) {
|
|
if (token === "do") {
|
|
return localize2.ordinalNumber(date.getUTCDate(), {
|
|
unit: "date"
|
|
});
|
|
}
|
|
return lightFormatters_default.d(date, token);
|
|
},
|
|
D: function D2(date, token, localize2) {
|
|
var dayOfYear = getUTCDayOfYear(date);
|
|
if (token === "Do") {
|
|
return localize2.ordinalNumber(dayOfYear, {
|
|
unit: "dayOfYear"
|
|
});
|
|
}
|
|
return addLeadingZeros(dayOfYear, token.length);
|
|
},
|
|
E: function E2(date, token, localize2) {
|
|
var dayOfWeek = date.getUTCDay();
|
|
switch (token) {
|
|
case "E":
|
|
case "EE":
|
|
case "EEE":
|
|
return localize2.day(dayOfWeek, {
|
|
width: "abbreviated",
|
|
context: "formatting"
|
|
});
|
|
case "EEEEE":
|
|
return localize2.day(dayOfWeek, {
|
|
width: "narrow",
|
|
context: "formatting"
|
|
});
|
|
case "EEEEEE":
|
|
return localize2.day(dayOfWeek, {
|
|
width: "short",
|
|
context: "formatting"
|
|
});
|
|
case "EEEE":
|
|
default:
|
|
return localize2.day(dayOfWeek, {
|
|
width: "wide",
|
|
context: "formatting"
|
|
});
|
|
}
|
|
},
|
|
e: function e3(date, token, localize2, options) {
|
|
var dayOfWeek = date.getUTCDay();
|
|
var localDayOfWeek = (dayOfWeek - options.weekStartsOn + 8) % 7 || 7;
|
|
switch (token) {
|
|
case "e":
|
|
return String(localDayOfWeek);
|
|
case "ee":
|
|
return addLeadingZeros(localDayOfWeek, 2);
|
|
case "eo":
|
|
return localize2.ordinalNumber(localDayOfWeek, {
|
|
unit: "day"
|
|
});
|
|
case "eee":
|
|
return localize2.day(dayOfWeek, {
|
|
width: "abbreviated",
|
|
context: "formatting"
|
|
});
|
|
case "eeeee":
|
|
return localize2.day(dayOfWeek, {
|
|
width: "narrow",
|
|
context: "formatting"
|
|
});
|
|
case "eeeeee":
|
|
return localize2.day(dayOfWeek, {
|
|
width: "short",
|
|
context: "formatting"
|
|
});
|
|
case "eeee":
|
|
default:
|
|
return localize2.day(dayOfWeek, {
|
|
width: "wide",
|
|
context: "formatting"
|
|
});
|
|
}
|
|
},
|
|
c: function c3(date, token, localize2, options) {
|
|
var dayOfWeek = date.getUTCDay();
|
|
var localDayOfWeek = (dayOfWeek - options.weekStartsOn + 8) % 7 || 7;
|
|
switch (token) {
|
|
case "c":
|
|
return String(localDayOfWeek);
|
|
case "cc":
|
|
return addLeadingZeros(localDayOfWeek, token.length);
|
|
case "co":
|
|
return localize2.ordinalNumber(localDayOfWeek, {
|
|
unit: "day"
|
|
});
|
|
case "ccc":
|
|
return localize2.day(dayOfWeek, {
|
|
width: "abbreviated",
|
|
context: "standalone"
|
|
});
|
|
case "ccccc":
|
|
return localize2.day(dayOfWeek, {
|
|
width: "narrow",
|
|
context: "standalone"
|
|
});
|
|
case "cccccc":
|
|
return localize2.day(dayOfWeek, {
|
|
width: "short",
|
|
context: "standalone"
|
|
});
|
|
case "cccc":
|
|
default:
|
|
return localize2.day(dayOfWeek, {
|
|
width: "wide",
|
|
context: "standalone"
|
|
});
|
|
}
|
|
},
|
|
i: function i3(date, token, localize2) {
|
|
var dayOfWeek = date.getUTCDay();
|
|
var isoDayOfWeek = dayOfWeek === 0 ? 7 : dayOfWeek;
|
|
switch (token) {
|
|
case "i":
|
|
return String(isoDayOfWeek);
|
|
case "ii":
|
|
return addLeadingZeros(isoDayOfWeek, token.length);
|
|
case "io":
|
|
return localize2.ordinalNumber(isoDayOfWeek, {
|
|
unit: "day"
|
|
});
|
|
case "iii":
|
|
return localize2.day(dayOfWeek, {
|
|
width: "abbreviated",
|
|
context: "formatting"
|
|
});
|
|
case "iiiii":
|
|
return localize2.day(dayOfWeek, {
|
|
width: "narrow",
|
|
context: "formatting"
|
|
});
|
|
case "iiiiii":
|
|
return localize2.day(dayOfWeek, {
|
|
width: "short",
|
|
context: "formatting"
|
|
});
|
|
case "iiii":
|
|
default:
|
|
return localize2.day(dayOfWeek, {
|
|
width: "wide",
|
|
context: "formatting"
|
|
});
|
|
}
|
|
},
|
|
a: function a4(date, token, localize2) {
|
|
var hours = date.getUTCHours();
|
|
var dayPeriodEnumValue = hours / 12 >= 1 ? "pm" : "am";
|
|
switch (token) {
|
|
case "a":
|
|
case "aa":
|
|
return localize2.dayPeriod(dayPeriodEnumValue, {
|
|
width: "abbreviated",
|
|
context: "formatting"
|
|
});
|
|
case "aaa":
|
|
return localize2.dayPeriod(dayPeriodEnumValue, {
|
|
width: "abbreviated",
|
|
context: "formatting"
|
|
}).toLowerCase();
|
|
case "aaaaa":
|
|
return localize2.dayPeriod(dayPeriodEnumValue, {
|
|
width: "narrow",
|
|
context: "formatting"
|
|
});
|
|
case "aaaa":
|
|
default:
|
|
return localize2.dayPeriod(dayPeriodEnumValue, {
|
|
width: "wide",
|
|
context: "formatting"
|
|
});
|
|
}
|
|
},
|
|
b: function b3(date, token, localize2) {
|
|
var hours = date.getUTCHours();
|
|
var dayPeriodEnumValue;
|
|
if (hours === 12) {
|
|
dayPeriodEnumValue = dayPeriodEnum.noon;
|
|
} else if (hours === 0) {
|
|
dayPeriodEnumValue = dayPeriodEnum.midnight;
|
|
} else {
|
|
dayPeriodEnumValue = hours / 12 >= 1 ? "pm" : "am";
|
|
}
|
|
switch (token) {
|
|
case "b":
|
|
case "bb":
|
|
return localize2.dayPeriod(dayPeriodEnumValue, {
|
|
width: "abbreviated",
|
|
context: "formatting"
|
|
});
|
|
case "bbb":
|
|
return localize2.dayPeriod(dayPeriodEnumValue, {
|
|
width: "abbreviated",
|
|
context: "formatting"
|
|
}).toLowerCase();
|
|
case "bbbbb":
|
|
return localize2.dayPeriod(dayPeriodEnumValue, {
|
|
width: "narrow",
|
|
context: "formatting"
|
|
});
|
|
case "bbbb":
|
|
default:
|
|
return localize2.dayPeriod(dayPeriodEnumValue, {
|
|
width: "wide",
|
|
context: "formatting"
|
|
});
|
|
}
|
|
},
|
|
B: function B4(date, token, localize2) {
|
|
var hours = date.getUTCHours();
|
|
var dayPeriodEnumValue;
|
|
if (hours >= 17) {
|
|
dayPeriodEnumValue = dayPeriodEnum.evening;
|
|
} else if (hours >= 12) {
|
|
dayPeriodEnumValue = dayPeriodEnum.afternoon;
|
|
} else if (hours >= 4) {
|
|
dayPeriodEnumValue = dayPeriodEnum.morning;
|
|
} else {
|
|
dayPeriodEnumValue = dayPeriodEnum.night;
|
|
}
|
|
switch (token) {
|
|
case "B":
|
|
case "BB":
|
|
case "BBB":
|
|
return localize2.dayPeriod(dayPeriodEnumValue, {
|
|
width: "abbreviated",
|
|
context: "formatting"
|
|
});
|
|
case "BBBBB":
|
|
return localize2.dayPeriod(dayPeriodEnumValue, {
|
|
width: "narrow",
|
|
context: "formatting"
|
|
});
|
|
case "BBBB":
|
|
default:
|
|
return localize2.dayPeriod(dayPeriodEnumValue, {
|
|
width: "wide",
|
|
context: "formatting"
|
|
});
|
|
}
|
|
},
|
|
h: function h4(date, token, localize2) {
|
|
if (token === "ho") {
|
|
var hours = date.getUTCHours() % 12;
|
|
if (hours === 0)
|
|
hours = 12;
|
|
return localize2.ordinalNumber(hours, {
|
|
unit: "hour"
|
|
});
|
|
}
|
|
return lightFormatters_default.h(date, token);
|
|
},
|
|
H: function H4(date, token, localize2) {
|
|
if (token === "Ho") {
|
|
return localize2.ordinalNumber(date.getUTCHours(), {
|
|
unit: "hour"
|
|
});
|
|
}
|
|
return lightFormatters_default.H(date, token);
|
|
},
|
|
K: function K2(date, token, localize2) {
|
|
var hours = date.getUTCHours() % 12;
|
|
if (token === "Ko") {
|
|
return localize2.ordinalNumber(hours, {
|
|
unit: "hour"
|
|
});
|
|
}
|
|
return addLeadingZeros(hours, token.length);
|
|
},
|
|
k: function k4(date, token, localize2) {
|
|
var hours = date.getUTCHours();
|
|
if (hours === 0)
|
|
hours = 24;
|
|
if (token === "ko") {
|
|
return localize2.ordinalNumber(hours, {
|
|
unit: "hour"
|
|
});
|
|
}
|
|
return addLeadingZeros(hours, token.length);
|
|
},
|
|
m: function m4(date, token, localize2) {
|
|
if (token === "mo") {
|
|
return localize2.ordinalNumber(date.getUTCMinutes(), {
|
|
unit: "minute"
|
|
});
|
|
}
|
|
return lightFormatters_default.m(date, token);
|
|
},
|
|
s: function s4(date, token, localize2) {
|
|
if (token === "so") {
|
|
return localize2.ordinalNumber(date.getUTCSeconds(), {
|
|
unit: "second"
|
|
});
|
|
}
|
|
return lightFormatters_default.s(date, token);
|
|
},
|
|
S: function S3(date, token) {
|
|
return lightFormatters_default.S(date, token);
|
|
},
|
|
X: function X2(date, token, _localize, options) {
|
|
var originalDate = options._originalDate || date;
|
|
var timezoneOffset = originalDate.getTimezoneOffset();
|
|
if (timezoneOffset === 0) {
|
|
return "Z";
|
|
}
|
|
switch (token) {
|
|
case "X":
|
|
return formatTimezoneWithOptionalMinutes(timezoneOffset);
|
|
case "XXXX":
|
|
case "XX":
|
|
return formatTimezone(timezoneOffset);
|
|
case "XXXXX":
|
|
case "XXX":
|
|
default:
|
|
return formatTimezone(timezoneOffset, ":");
|
|
}
|
|
},
|
|
x: function x4(date, token, _localize, options) {
|
|
var originalDate = options._originalDate || date;
|
|
var timezoneOffset = originalDate.getTimezoneOffset();
|
|
switch (token) {
|
|
case "x":
|
|
return formatTimezoneWithOptionalMinutes(timezoneOffset);
|
|
case "xxxx":
|
|
case "xx":
|
|
return formatTimezone(timezoneOffset);
|
|
case "xxxxx":
|
|
case "xxx":
|
|
default:
|
|
return formatTimezone(timezoneOffset, ":");
|
|
}
|
|
},
|
|
O: function O3(date, token, _localize, options) {
|
|
var originalDate = options._originalDate || date;
|
|
var timezoneOffset = originalDate.getTimezoneOffset();
|
|
switch (token) {
|
|
case "O":
|
|
case "OO":
|
|
case "OOO":
|
|
return "GMT" + formatTimezoneShort(timezoneOffset, ":");
|
|
case "OOOO":
|
|
default:
|
|
return "GMT" + formatTimezone(timezoneOffset, ":");
|
|
}
|
|
},
|
|
z: function z4(date, token, _localize, options) {
|
|
var originalDate = options._originalDate || date;
|
|
var timezoneOffset = originalDate.getTimezoneOffset();
|
|
switch (token) {
|
|
case "z":
|
|
case "zz":
|
|
case "zzz":
|
|
return "GMT" + formatTimezoneShort(timezoneOffset, ":");
|
|
case "zzzz":
|
|
default:
|
|
return "GMT" + formatTimezone(timezoneOffset, ":");
|
|
}
|
|
},
|
|
t: function t3(date, token, _localize, options) {
|
|
var originalDate = options._originalDate || date;
|
|
var timestamp = Math.floor(originalDate.getTime() / 1e3);
|
|
return addLeadingZeros(timestamp, token.length);
|
|
},
|
|
T: function T5(date, token, _localize, options) {
|
|
var originalDate = options._originalDate || date;
|
|
var timestamp = originalDate.getTime();
|
|
return addLeadingZeros(timestamp, token.length);
|
|
}
|
|
};
|
|
function formatTimezoneShort(offset, dirtyDelimiter) {
|
|
var sign = offset > 0 ? "-" : "+";
|
|
var absOffset = Math.abs(offset);
|
|
var hours = Math.floor(absOffset / 60);
|
|
var minutes = absOffset % 60;
|
|
if (minutes === 0) {
|
|
return sign + String(hours);
|
|
}
|
|
var delimiter = dirtyDelimiter || "";
|
|
return sign + String(hours) + delimiter + addLeadingZeros(minutes, 2);
|
|
}
|
|
function formatTimezoneWithOptionalMinutes(offset, dirtyDelimiter) {
|
|
if (offset % 60 === 0) {
|
|
var sign = offset > 0 ? "-" : "+";
|
|
return sign + addLeadingZeros(Math.abs(offset) / 60, 2);
|
|
}
|
|
return formatTimezone(offset, dirtyDelimiter);
|
|
}
|
|
function formatTimezone(offset, dirtyDelimiter) {
|
|
var delimiter = dirtyDelimiter || "";
|
|
var sign = offset > 0 ? "-" : "+";
|
|
var absOffset = Math.abs(offset);
|
|
var hours = addLeadingZeros(Math.floor(absOffset / 60), 2);
|
|
var minutes = addLeadingZeros(absOffset % 60, 2);
|
|
return sign + hours + delimiter + minutes;
|
|
}
|
|
var formatters_default = formatters2;
|
|
|
|
// node_modules/date-fns/esm/_lib/format/longFormatters/index.js
|
|
var dateLongFormatter = function dateLongFormatter2(pattern, formatLong2) {
|
|
switch (pattern) {
|
|
case "P":
|
|
return formatLong2.date({
|
|
width: "short"
|
|
});
|
|
case "PP":
|
|
return formatLong2.date({
|
|
width: "medium"
|
|
});
|
|
case "PPP":
|
|
return formatLong2.date({
|
|
width: "long"
|
|
});
|
|
case "PPPP":
|
|
default:
|
|
return formatLong2.date({
|
|
width: "full"
|
|
});
|
|
}
|
|
};
|
|
var timeLongFormatter = function timeLongFormatter2(pattern, formatLong2) {
|
|
switch (pattern) {
|
|
case "p":
|
|
return formatLong2.time({
|
|
width: "short"
|
|
});
|
|
case "pp":
|
|
return formatLong2.time({
|
|
width: "medium"
|
|
});
|
|
case "ppp":
|
|
return formatLong2.time({
|
|
width: "long"
|
|
});
|
|
case "pppp":
|
|
default:
|
|
return formatLong2.time({
|
|
width: "full"
|
|
});
|
|
}
|
|
};
|
|
var dateTimeLongFormatter = function dateTimeLongFormatter2(pattern, formatLong2) {
|
|
var matchResult = pattern.match(/(P+)(p+)?/) || [];
|
|
var datePattern = matchResult[1];
|
|
var timePattern = matchResult[2];
|
|
if (!timePattern) {
|
|
return dateLongFormatter(pattern, formatLong2);
|
|
}
|
|
var dateTimeFormat;
|
|
switch (datePattern) {
|
|
case "P":
|
|
dateTimeFormat = formatLong2.dateTime({
|
|
width: "short"
|
|
});
|
|
break;
|
|
case "PP":
|
|
dateTimeFormat = formatLong2.dateTime({
|
|
width: "medium"
|
|
});
|
|
break;
|
|
case "PPP":
|
|
dateTimeFormat = formatLong2.dateTime({
|
|
width: "long"
|
|
});
|
|
break;
|
|
case "PPPP":
|
|
default:
|
|
dateTimeFormat = formatLong2.dateTime({
|
|
width: "full"
|
|
});
|
|
break;
|
|
}
|
|
return dateTimeFormat.replace("{{date}}", dateLongFormatter(datePattern, formatLong2)).replace("{{time}}", timeLongFormatter(timePattern, formatLong2));
|
|
};
|
|
var longFormatters = {
|
|
p: timeLongFormatter,
|
|
P: dateTimeLongFormatter
|
|
};
|
|
var longFormatters_default = longFormatters;
|
|
|
|
// node_modules/date-fns/esm/_lib/protectedTokens/index.js
|
|
var protectedDayOfYearTokens = ["D", "DD"];
|
|
var protectedWeekYearTokens = ["YY", "YYYY"];
|
|
function isProtectedDayOfYearToken(token) {
|
|
return protectedDayOfYearTokens.indexOf(token) !== -1;
|
|
}
|
|
function isProtectedWeekYearToken(token) {
|
|
return protectedWeekYearTokens.indexOf(token) !== -1;
|
|
}
|
|
function throwProtectedError(token, format2, input) {
|
|
if (token === "YYYY") {
|
|
throw new RangeError("Use `yyyy` instead of `YYYY` (in `".concat(format2, "`) for formatting years to the input `").concat(input, "`; see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md"));
|
|
} else if (token === "YY") {
|
|
throw new RangeError("Use `yy` instead of `YY` (in `".concat(format2, "`) for formatting years to the input `").concat(input, "`; see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md"));
|
|
} else if (token === "D") {
|
|
throw new RangeError("Use `d` instead of `D` (in `".concat(format2, "`) for formatting days of the month to the input `").concat(input, "`; see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md"));
|
|
} else if (token === "DD") {
|
|
throw new RangeError("Use `dd` instead of `DD` (in `".concat(format2, "`) for formatting days of the month to the input `").concat(input, "`; see: https://github.com/date-fns/date-fns/blob/master/docs/unicodeTokens.md"));
|
|
}
|
|
}
|
|
|
|
// node_modules/date-fns/esm/locale/en-US/_lib/formatDistance/index.js
|
|
var formatDistanceLocale = {
|
|
lessThanXSeconds: {
|
|
one: "less than a second",
|
|
other: "less than {{count}} seconds"
|
|
},
|
|
xSeconds: {
|
|
one: "1 second",
|
|
other: "{{count}} seconds"
|
|
},
|
|
halfAMinute: "half a minute",
|
|
lessThanXMinutes: {
|
|
one: "less than a minute",
|
|
other: "less than {{count}} minutes"
|
|
},
|
|
xMinutes: {
|
|
one: "1 minute",
|
|
other: "{{count}} minutes"
|
|
},
|
|
aboutXHours: {
|
|
one: "about 1 hour",
|
|
other: "about {{count}} hours"
|
|
},
|
|
xHours: {
|
|
one: "1 hour",
|
|
other: "{{count}} hours"
|
|
},
|
|
xDays: {
|
|
one: "1 day",
|
|
other: "{{count}} days"
|
|
},
|
|
aboutXWeeks: {
|
|
one: "about 1 week",
|
|
other: "about {{count}} weeks"
|
|
},
|
|
xWeeks: {
|
|
one: "1 week",
|
|
other: "{{count}} weeks"
|
|
},
|
|
aboutXMonths: {
|
|
one: "about 1 month",
|
|
other: "about {{count}} months"
|
|
},
|
|
xMonths: {
|
|
one: "1 month",
|
|
other: "{{count}} months"
|
|
},
|
|
aboutXYears: {
|
|
one: "about 1 year",
|
|
other: "about {{count}} years"
|
|
},
|
|
xYears: {
|
|
one: "1 year",
|
|
other: "{{count}} years"
|
|
},
|
|
overXYears: {
|
|
one: "over 1 year",
|
|
other: "over {{count}} years"
|
|
},
|
|
almostXYears: {
|
|
one: "almost 1 year",
|
|
other: "almost {{count}} years"
|
|
}
|
|
};
|
|
var formatDistance = function formatDistance2(token, count2, options) {
|
|
var result;
|
|
var tokenValue = formatDistanceLocale[token];
|
|
if (typeof tokenValue === "string") {
|
|
result = tokenValue;
|
|
} else if (count2 === 1) {
|
|
result = tokenValue.one;
|
|
} else {
|
|
result = tokenValue.other.replace("{{count}}", count2.toString());
|
|
}
|
|
if (options !== null && options !== void 0 && options.addSuffix) {
|
|
if (options.comparison && options.comparison > 0) {
|
|
return "in " + result;
|
|
} else {
|
|
return result + " ago";
|
|
}
|
|
}
|
|
return result;
|
|
};
|
|
var formatDistance_default = formatDistance;
|
|
|
|
// node_modules/date-fns/esm/locale/_lib/buildFormatLongFn/index.js
|
|
function buildFormatLongFn(args) {
|
|
return function() {
|
|
var options = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {};
|
|
var width = options.width ? String(options.width) : args.defaultWidth;
|
|
var format2 = args.formats[width] || args.formats[args.defaultWidth];
|
|
return format2;
|
|
};
|
|
}
|
|
|
|
// node_modules/date-fns/esm/locale/en-US/_lib/formatLong/index.js
|
|
var dateFormats = {
|
|
full: "EEEE, MMMM do, y",
|
|
long: "MMMM do, y",
|
|
medium: "MMM d, y",
|
|
short: "MM/dd/yyyy"
|
|
};
|
|
var timeFormats = {
|
|
full: "h:mm:ss a zzzz",
|
|
long: "h:mm:ss a z",
|
|
medium: "h:mm:ss a",
|
|
short: "h:mm a"
|
|
};
|
|
var dateTimeFormats = {
|
|
full: "{{date}} 'at' {{time}}",
|
|
long: "{{date}} 'at' {{time}}",
|
|
medium: "{{date}}, {{time}}",
|
|
short: "{{date}}, {{time}}"
|
|
};
|
|
var formatLong = {
|
|
date: buildFormatLongFn({
|
|
formats: dateFormats,
|
|
defaultWidth: "full"
|
|
}),
|
|
time: buildFormatLongFn({
|
|
formats: timeFormats,
|
|
defaultWidth: "full"
|
|
}),
|
|
dateTime: buildFormatLongFn({
|
|
formats: dateTimeFormats,
|
|
defaultWidth: "full"
|
|
})
|
|
};
|
|
var formatLong_default = formatLong;
|
|
|
|
// node_modules/date-fns/esm/locale/en-US/_lib/formatRelative/index.js
|
|
var formatRelativeLocale = {
|
|
lastWeek: "'last' eeee 'at' p",
|
|
yesterday: "'yesterday at' p",
|
|
today: "'today at' p",
|
|
tomorrow: "'tomorrow at' p",
|
|
nextWeek: "eeee 'at' p",
|
|
other: "P"
|
|
};
|
|
var formatRelative = function formatRelative2(token, _date, _baseDate, _options) {
|
|
return formatRelativeLocale[token];
|
|
};
|
|
var formatRelative_default = formatRelative;
|
|
|
|
// node_modules/date-fns/esm/locale/_lib/buildLocalizeFn/index.js
|
|
function buildLocalizeFn(args) {
|
|
return function(dirtyIndex, options) {
|
|
var context = options !== null && options !== void 0 && options.context ? String(options.context) : "standalone";
|
|
var valuesArray;
|
|
if (context === "formatting" && args.formattingValues) {
|
|
var defaultWidth = args.defaultFormattingWidth || args.defaultWidth;
|
|
var width = options !== null && options !== void 0 && options.width ? String(options.width) : defaultWidth;
|
|
valuesArray = args.formattingValues[width] || args.formattingValues[defaultWidth];
|
|
} else {
|
|
var _defaultWidth = args.defaultWidth;
|
|
var _width = options !== null && options !== void 0 && options.width ? String(options.width) : args.defaultWidth;
|
|
valuesArray = args.values[_width] || args.values[_defaultWidth];
|
|
}
|
|
var index = args.argumentCallback ? args.argumentCallback(dirtyIndex) : dirtyIndex;
|
|
return valuesArray[index];
|
|
};
|
|
}
|
|
|
|
// node_modules/date-fns/esm/locale/en-US/_lib/localize/index.js
|
|
var eraValues = {
|
|
narrow: ["B", "A"],
|
|
abbreviated: ["BC", "AD"],
|
|
wide: ["Before Christ", "Anno Domini"]
|
|
};
|
|
var quarterValues = {
|
|
narrow: ["1", "2", "3", "4"],
|
|
abbreviated: ["Q1", "Q2", "Q3", "Q4"],
|
|
wide: ["1st quarter", "2nd quarter", "3rd quarter", "4th quarter"]
|
|
};
|
|
var monthValues = {
|
|
narrow: ["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"],
|
|
abbreviated: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"],
|
|
wide: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]
|
|
};
|
|
var dayValues = {
|
|
narrow: ["S", "M", "T", "W", "T", "F", "S"],
|
|
short: ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"],
|
|
abbreviated: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"],
|
|
wide: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"]
|
|
};
|
|
var dayPeriodValues = {
|
|
narrow: {
|
|
am: "a",
|
|
pm: "p",
|
|
midnight: "mi",
|
|
noon: "n",
|
|
morning: "morning",
|
|
afternoon: "afternoon",
|
|
evening: "evening",
|
|
night: "night"
|
|
},
|
|
abbreviated: {
|
|
am: "AM",
|
|
pm: "PM",
|
|
midnight: "midnight",
|
|
noon: "noon",
|
|
morning: "morning",
|
|
afternoon: "afternoon",
|
|
evening: "evening",
|
|
night: "night"
|
|
},
|
|
wide: {
|
|
am: "a.m.",
|
|
pm: "p.m.",
|
|
midnight: "midnight",
|
|
noon: "noon",
|
|
morning: "morning",
|
|
afternoon: "afternoon",
|
|
evening: "evening",
|
|
night: "night"
|
|
}
|
|
};
|
|
var formattingDayPeriodValues = {
|
|
narrow: {
|
|
am: "a",
|
|
pm: "p",
|
|
midnight: "mi",
|
|
noon: "n",
|
|
morning: "in the morning",
|
|
afternoon: "in the afternoon",
|
|
evening: "in the evening",
|
|
night: "at night"
|
|
},
|
|
abbreviated: {
|
|
am: "AM",
|
|
pm: "PM",
|
|
midnight: "midnight",
|
|
noon: "noon",
|
|
morning: "in the morning",
|
|
afternoon: "in the afternoon",
|
|
evening: "in the evening",
|
|
night: "at night"
|
|
},
|
|
wide: {
|
|
am: "a.m.",
|
|
pm: "p.m.",
|
|
midnight: "midnight",
|
|
noon: "noon",
|
|
morning: "in the morning",
|
|
afternoon: "in the afternoon",
|
|
evening: "in the evening",
|
|
night: "at night"
|
|
}
|
|
};
|
|
var ordinalNumber = function ordinalNumber2(dirtyNumber, _options) {
|
|
var number = Number(dirtyNumber);
|
|
var rem100 = number % 100;
|
|
if (rem100 > 20 || rem100 < 10) {
|
|
switch (rem100 % 10) {
|
|
case 1:
|
|
return number + "st";
|
|
case 2:
|
|
return number + "nd";
|
|
case 3:
|
|
return number + "rd";
|
|
}
|
|
}
|
|
return number + "th";
|
|
};
|
|
var localize = {
|
|
ordinalNumber,
|
|
era: buildLocalizeFn({
|
|
values: eraValues,
|
|
defaultWidth: "wide"
|
|
}),
|
|
quarter: buildLocalizeFn({
|
|
values: quarterValues,
|
|
defaultWidth: "wide",
|
|
argumentCallback: function argumentCallback(quarter) {
|
|
return quarter - 1;
|
|
}
|
|
}),
|
|
month: buildLocalizeFn({
|
|
values: monthValues,
|
|
defaultWidth: "wide"
|
|
}),
|
|
day: buildLocalizeFn({
|
|
values: dayValues,
|
|
defaultWidth: "wide"
|
|
}),
|
|
dayPeriod: buildLocalizeFn({
|
|
values: dayPeriodValues,
|
|
defaultWidth: "wide",
|
|
formattingValues: formattingDayPeriodValues,
|
|
defaultFormattingWidth: "wide"
|
|
})
|
|
};
|
|
var localize_default = localize;
|
|
|
|
// node_modules/date-fns/esm/locale/_lib/buildMatchFn/index.js
|
|
function buildMatchFn(args) {
|
|
return function(string) {
|
|
var options = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {};
|
|
var width = options.width;
|
|
var matchPattern = width && args.matchPatterns[width] || args.matchPatterns[args.defaultMatchWidth];
|
|
var matchResult = string.match(matchPattern);
|
|
if (!matchResult) {
|
|
return null;
|
|
}
|
|
var matchedString = matchResult[0];
|
|
var parsePatterns = width && args.parsePatterns[width] || args.parsePatterns[args.defaultParseWidth];
|
|
var key2 = Array.isArray(parsePatterns) ? findIndex(parsePatterns, function(pattern) {
|
|
return pattern.test(matchedString);
|
|
}) : findKey(parsePatterns, function(pattern) {
|
|
return pattern.test(matchedString);
|
|
});
|
|
var value;
|
|
value = args.valueCallback ? args.valueCallback(key2) : key2;
|
|
value = options.valueCallback ? options.valueCallback(value) : value;
|
|
var rest = string.slice(matchedString.length);
|
|
return {
|
|
value,
|
|
rest
|
|
};
|
|
};
|
|
}
|
|
function findKey(object, predicate) {
|
|
for (var key2 in object) {
|
|
if (object.hasOwnProperty(key2) && predicate(object[key2])) {
|
|
return key2;
|
|
}
|
|
}
|
|
return void 0;
|
|
}
|
|
function findIndex(array, predicate) {
|
|
for (var key2 = 0; key2 < array.length; key2++) {
|
|
if (predicate(array[key2])) {
|
|
return key2;
|
|
}
|
|
}
|
|
return void 0;
|
|
}
|
|
|
|
// node_modules/date-fns/esm/locale/_lib/buildMatchPatternFn/index.js
|
|
function buildMatchPatternFn(args) {
|
|
return function(string) {
|
|
var options = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {};
|
|
var matchResult = string.match(args.matchPattern);
|
|
if (!matchResult)
|
|
return null;
|
|
var matchedString = matchResult[0];
|
|
var parseResult = string.match(args.parsePattern);
|
|
if (!parseResult)
|
|
return null;
|
|
var value = args.valueCallback ? args.valueCallback(parseResult[0]) : parseResult[0];
|
|
value = options.valueCallback ? options.valueCallback(value) : value;
|
|
var rest = string.slice(matchedString.length);
|
|
return {
|
|
value,
|
|
rest
|
|
};
|
|
};
|
|
}
|
|
|
|
// node_modules/date-fns/esm/locale/en-US/_lib/match/index.js
|
|
var matchOrdinalNumberPattern = /^(\d+)(th|st|nd|rd)?/i;
|
|
var parseOrdinalNumberPattern = /\d+/i;
|
|
var matchEraPatterns = {
|
|
narrow: /^(b|a)/i,
|
|
abbreviated: /^(b\.?\s?c\.?|b\.?\s?c\.?\s?e\.?|a\.?\s?d\.?|c\.?\s?e\.?)/i,
|
|
wide: /^(before christ|before common era|anno domini|common era)/i
|
|
};
|
|
var parseEraPatterns = {
|
|
any: [/^b/i, /^(a|c)/i]
|
|
};
|
|
var matchQuarterPatterns = {
|
|
narrow: /^[1234]/i,
|
|
abbreviated: /^q[1234]/i,
|
|
wide: /^[1234](th|st|nd|rd)? quarter/i
|
|
};
|
|
var parseQuarterPatterns = {
|
|
any: [/1/i, /2/i, /3/i, /4/i]
|
|
};
|
|
var matchMonthPatterns = {
|
|
narrow: /^[jfmasond]/i,
|
|
abbreviated: /^(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)/i,
|
|
wide: /^(january|february|march|april|may|june|july|august|september|october|november|december)/i
|
|
};
|
|
var parseMonthPatterns = {
|
|
narrow: [/^j/i, /^f/i, /^m/i, /^a/i, /^m/i, /^j/i, /^j/i, /^a/i, /^s/i, /^o/i, /^n/i, /^d/i],
|
|
any: [/^ja/i, /^f/i, /^mar/i, /^ap/i, /^may/i, /^jun/i, /^jul/i, /^au/i, /^s/i, /^o/i, /^n/i, /^d/i]
|
|
};
|
|
var matchDayPatterns = {
|
|
narrow: /^[smtwf]/i,
|
|
short: /^(su|mo|tu|we|th|fr|sa)/i,
|
|
abbreviated: /^(sun|mon|tue|wed|thu|fri|sat)/i,
|
|
wide: /^(sunday|monday|tuesday|wednesday|thursday|friday|saturday)/i
|
|
};
|
|
var parseDayPatterns = {
|
|
narrow: [/^s/i, /^m/i, /^t/i, /^w/i, /^t/i, /^f/i, /^s/i],
|
|
any: [/^su/i, /^m/i, /^tu/i, /^w/i, /^th/i, /^f/i, /^sa/i]
|
|
};
|
|
var matchDayPeriodPatterns = {
|
|
narrow: /^(a|p|mi|n|(in the|at) (morning|afternoon|evening|night))/i,
|
|
any: /^([ap]\.?\s?m\.?|midnight|noon|(in the|at) (morning|afternoon|evening|night))/i
|
|
};
|
|
var parseDayPeriodPatterns = {
|
|
any: {
|
|
am: /^a/i,
|
|
pm: /^p/i,
|
|
midnight: /^mi/i,
|
|
noon: /^no/i,
|
|
morning: /morning/i,
|
|
afternoon: /afternoon/i,
|
|
evening: /evening/i,
|
|
night: /night/i
|
|
}
|
|
};
|
|
var match = {
|
|
ordinalNumber: buildMatchPatternFn({
|
|
matchPattern: matchOrdinalNumberPattern,
|
|
parsePattern: parseOrdinalNumberPattern,
|
|
valueCallback: function valueCallback(value) {
|
|
return parseInt(value, 10);
|
|
}
|
|
}),
|
|
era: buildMatchFn({
|
|
matchPatterns: matchEraPatterns,
|
|
defaultMatchWidth: "wide",
|
|
parsePatterns: parseEraPatterns,
|
|
defaultParseWidth: "any"
|
|
}),
|
|
quarter: buildMatchFn({
|
|
matchPatterns: matchQuarterPatterns,
|
|
defaultMatchWidth: "wide",
|
|
parsePatterns: parseQuarterPatterns,
|
|
defaultParseWidth: "any",
|
|
valueCallback: function valueCallback2(index) {
|
|
return index + 1;
|
|
}
|
|
}),
|
|
month: buildMatchFn({
|
|
matchPatterns: matchMonthPatterns,
|
|
defaultMatchWidth: "wide",
|
|
parsePatterns: parseMonthPatterns,
|
|
defaultParseWidth: "any"
|
|
}),
|
|
day: buildMatchFn({
|
|
matchPatterns: matchDayPatterns,
|
|
defaultMatchWidth: "wide",
|
|
parsePatterns: parseDayPatterns,
|
|
defaultParseWidth: "any"
|
|
}),
|
|
dayPeriod: buildMatchFn({
|
|
matchPatterns: matchDayPeriodPatterns,
|
|
defaultMatchWidth: "any",
|
|
parsePatterns: parseDayPeriodPatterns,
|
|
defaultParseWidth: "any"
|
|
})
|
|
};
|
|
var match_default = match;
|
|
|
|
// node_modules/date-fns/esm/locale/en-US/index.js
|
|
var locale = {
|
|
code: "en-US",
|
|
formatDistance: formatDistance_default,
|
|
formatLong: formatLong_default,
|
|
formatRelative: formatRelative_default,
|
|
localize: localize_default,
|
|
match: match_default,
|
|
options: {
|
|
weekStartsOn: 0,
|
|
firstWeekContainsDate: 1
|
|
}
|
|
};
|
|
var en_US_default = locale;
|
|
|
|
// node_modules/date-fns/esm/_lib/defaultLocale/index.js
|
|
var defaultLocale_default = en_US_default;
|
|
|
|
// node_modules/date-fns/esm/format/index.js
|
|
var formattingTokensRegExp = /[yYQqMLwIdDecihHKkms]o|(\w)\1*|''|'(''|[^'])+('|$)|./g;
|
|
var longFormattingTokensRegExp = /P+p+|P+|p+|''|'(''|[^'])+('|$)|./g;
|
|
var escapedStringRegExp = /^'([^]*?)'?$/;
|
|
var doubleQuoteRegExp = /''/g;
|
|
var unescapedLatinCharacterRegExp = /[a-zA-Z]/;
|
|
function format(dirtyDate, dirtyFormatStr, options) {
|
|
var _ref, _options$locale, _ref2, _ref3, _ref4, _options$firstWeekCon, _options$locale2, _options$locale2$opti, _defaultOptions$local, _defaultOptions$local2, _ref5, _ref6, _ref7, _options$weekStartsOn, _options$locale3, _options$locale3$opti, _defaultOptions$local3, _defaultOptions$local4;
|
|
requiredArgs(2, arguments);
|
|
var formatStr = String(dirtyFormatStr);
|
|
var defaultOptions3 = getDefaultOptions();
|
|
var locale2 = (_ref = (_options$locale = options === null || options === void 0 ? void 0 : options.locale) !== null && _options$locale !== void 0 ? _options$locale : defaultOptions3.locale) !== null && _ref !== void 0 ? _ref : defaultLocale_default;
|
|
var firstWeekContainsDate = toInteger((_ref2 = (_ref3 = (_ref4 = (_options$firstWeekCon = options === null || options === void 0 ? void 0 : options.firstWeekContainsDate) !== null && _options$firstWeekCon !== void 0 ? _options$firstWeekCon : options === null || options === void 0 ? void 0 : (_options$locale2 = options.locale) === null || _options$locale2 === void 0 ? void 0 : (_options$locale2$opti = _options$locale2.options) === null || _options$locale2$opti === void 0 ? void 0 : _options$locale2$opti.firstWeekContainsDate) !== null && _ref4 !== void 0 ? _ref4 : defaultOptions3.firstWeekContainsDate) !== null && _ref3 !== void 0 ? _ref3 : (_defaultOptions$local = defaultOptions3.locale) === null || _defaultOptions$local === void 0 ? void 0 : (_defaultOptions$local2 = _defaultOptions$local.options) === null || _defaultOptions$local2 === void 0 ? void 0 : _defaultOptions$local2.firstWeekContainsDate) !== null && _ref2 !== void 0 ? _ref2 : 1);
|
|
if (!(firstWeekContainsDate >= 1 && firstWeekContainsDate <= 7)) {
|
|
throw new RangeError("firstWeekContainsDate must be between 1 and 7 inclusively");
|
|
}
|
|
var weekStartsOn = toInteger((_ref5 = (_ref6 = (_ref7 = (_options$weekStartsOn = options === null || options === void 0 ? void 0 : options.weekStartsOn) !== null && _options$weekStartsOn !== void 0 ? _options$weekStartsOn : options === null || options === void 0 ? void 0 : (_options$locale3 = options.locale) === null || _options$locale3 === void 0 ? void 0 : (_options$locale3$opti = _options$locale3.options) === null || _options$locale3$opti === void 0 ? void 0 : _options$locale3$opti.weekStartsOn) !== null && _ref7 !== void 0 ? _ref7 : defaultOptions3.weekStartsOn) !== null && _ref6 !== void 0 ? _ref6 : (_defaultOptions$local3 = defaultOptions3.locale) === null || _defaultOptions$local3 === void 0 ? void 0 : (_defaultOptions$local4 = _defaultOptions$local3.options) === null || _defaultOptions$local4 === void 0 ? void 0 : _defaultOptions$local4.weekStartsOn) !== null && _ref5 !== void 0 ? _ref5 : 0);
|
|
if (!(weekStartsOn >= 0 && weekStartsOn <= 6)) {
|
|
throw new RangeError("weekStartsOn must be between 0 and 6 inclusively");
|
|
}
|
|
if (!locale2.localize) {
|
|
throw new RangeError("locale must contain localize property");
|
|
}
|
|
if (!locale2.formatLong) {
|
|
throw new RangeError("locale must contain formatLong property");
|
|
}
|
|
var originalDate = toDate(dirtyDate);
|
|
if (!isValid(originalDate)) {
|
|
throw new RangeError("Invalid time value");
|
|
}
|
|
var timezoneOffset = getTimezoneOffsetInMilliseconds(originalDate);
|
|
var utcDate = subMilliseconds(originalDate, timezoneOffset);
|
|
var formatterOptions = {
|
|
firstWeekContainsDate,
|
|
weekStartsOn,
|
|
locale: locale2,
|
|
_originalDate: originalDate
|
|
};
|
|
var result = formatStr.match(longFormattingTokensRegExp).map(function(substring) {
|
|
var firstCharacter = substring[0];
|
|
if (firstCharacter === "p" || firstCharacter === "P") {
|
|
var longFormatter = longFormatters_default[firstCharacter];
|
|
return longFormatter(substring, locale2.formatLong);
|
|
}
|
|
return substring;
|
|
}).join("").match(formattingTokensRegExp).map(function(substring) {
|
|
if (substring === "''") {
|
|
return "'";
|
|
}
|
|
var firstCharacter = substring[0];
|
|
if (firstCharacter === "'") {
|
|
return cleanEscapedString(substring);
|
|
}
|
|
var formatter = formatters_default[firstCharacter];
|
|
if (formatter) {
|
|
if (!(options !== null && options !== void 0 && options.useAdditionalWeekYearTokens) && isProtectedWeekYearToken(substring)) {
|
|
throwProtectedError(substring, dirtyFormatStr, String(dirtyDate));
|
|
}
|
|
if (!(options !== null && options !== void 0 && options.useAdditionalDayOfYearTokens) && isProtectedDayOfYearToken(substring)) {
|
|
throwProtectedError(substring, dirtyFormatStr, String(dirtyDate));
|
|
}
|
|
return formatter(utcDate, substring, locale2.localize, formatterOptions);
|
|
}
|
|
if (firstCharacter.match(unescapedLatinCharacterRegExp)) {
|
|
throw new RangeError("Format string contains an unescaped latin alphabet character `" + firstCharacter + "`");
|
|
}
|
|
return substring;
|
|
}).join("");
|
|
return result;
|
|
}
|
|
function cleanEscapedString(input) {
|
|
var matched = input.match(escapedStringRegExp);
|
|
if (!matched) {
|
|
return input;
|
|
}
|
|
return matched[1].replace(doubleQuoteRegExp, "'");
|
|
}
|
|
|
|
// node_modules/date-fns/esm/_lib/assign/index.js
|
|
function assign(target, object) {
|
|
if (target == null) {
|
|
throw new TypeError("assign requires that input parameter not be null or undefined");
|
|
}
|
|
for (var property in object) {
|
|
if (Object.prototype.hasOwnProperty.call(object, property)) {
|
|
;
|
|
target[property] = object[property];
|
|
}
|
|
}
|
|
return target;
|
|
}
|
|
|
|
// node_modules/date-fns/esm/_lib/cloneObject/index.js
|
|
function cloneObject(object) {
|
|
return assign({}, object);
|
|
}
|
|
|
|
// node_modules/date-fns/esm/formatDistance/index.js
|
|
var MINUTES_IN_DAY = 1440;
|
|
var MINUTES_IN_ALMOST_TWO_DAYS = 2520;
|
|
var MINUTES_IN_MONTH = 43200;
|
|
var MINUTES_IN_TWO_MONTHS = 86400;
|
|
function formatDistance3(dirtyDate, dirtyBaseDate, options) {
|
|
var _ref, _options$locale;
|
|
requiredArgs(2, arguments);
|
|
var defaultOptions3 = getDefaultOptions();
|
|
var locale2 = (_ref = (_options$locale = options === null || options === void 0 ? void 0 : options.locale) !== null && _options$locale !== void 0 ? _options$locale : defaultOptions3.locale) !== null && _ref !== void 0 ? _ref : defaultLocale_default;
|
|
if (!locale2.formatDistance) {
|
|
throw new RangeError("locale must contain formatDistance property");
|
|
}
|
|
var comparison = compareAsc(dirtyDate, dirtyBaseDate);
|
|
if (isNaN(comparison)) {
|
|
throw new RangeError("Invalid time value");
|
|
}
|
|
var localizeOptions = assign(cloneObject(options), {
|
|
addSuffix: Boolean(options === null || options === void 0 ? void 0 : options.addSuffix),
|
|
comparison
|
|
});
|
|
var dateLeft;
|
|
var dateRight;
|
|
if (comparison > 0) {
|
|
dateLeft = toDate(dirtyBaseDate);
|
|
dateRight = toDate(dirtyDate);
|
|
} else {
|
|
dateLeft = toDate(dirtyDate);
|
|
dateRight = toDate(dirtyBaseDate);
|
|
}
|
|
var seconds = differenceInSeconds(dateRight, dateLeft);
|
|
var offsetInSeconds = (getTimezoneOffsetInMilliseconds(dateRight) - getTimezoneOffsetInMilliseconds(dateLeft)) / 1e3;
|
|
var minutes = Math.round((seconds - offsetInSeconds) / 60);
|
|
var months;
|
|
if (minutes < 2) {
|
|
if (options !== null && options !== void 0 && options.includeSeconds) {
|
|
if (seconds < 5) {
|
|
return locale2.formatDistance("lessThanXSeconds", 5, localizeOptions);
|
|
} else if (seconds < 10) {
|
|
return locale2.formatDistance("lessThanXSeconds", 10, localizeOptions);
|
|
} else if (seconds < 20) {
|
|
return locale2.formatDistance("lessThanXSeconds", 20, localizeOptions);
|
|
} else if (seconds < 40) {
|
|
return locale2.formatDistance("halfAMinute", 0, localizeOptions);
|
|
} else if (seconds < 60) {
|
|
return locale2.formatDistance("lessThanXMinutes", 1, localizeOptions);
|
|
} else {
|
|
return locale2.formatDistance("xMinutes", 1, localizeOptions);
|
|
}
|
|
} else {
|
|
if (minutes === 0) {
|
|
return locale2.formatDistance("lessThanXMinutes", 1, localizeOptions);
|
|
} else {
|
|
return locale2.formatDistance("xMinutes", minutes, localizeOptions);
|
|
}
|
|
}
|
|
} else if (minutes < 45) {
|
|
return locale2.formatDistance("xMinutes", minutes, localizeOptions);
|
|
} else if (minutes < 90) {
|
|
return locale2.formatDistance("aboutXHours", 1, localizeOptions);
|
|
} else if (minutes < MINUTES_IN_DAY) {
|
|
var hours = Math.round(minutes / 60);
|
|
return locale2.formatDistance("aboutXHours", hours, localizeOptions);
|
|
} else if (minutes < MINUTES_IN_ALMOST_TWO_DAYS) {
|
|
return locale2.formatDistance("xDays", 1, localizeOptions);
|
|
} else if (minutes < MINUTES_IN_MONTH) {
|
|
var days = Math.round(minutes / MINUTES_IN_DAY);
|
|
return locale2.formatDistance("xDays", days, localizeOptions);
|
|
} else if (minutes < MINUTES_IN_TWO_MONTHS) {
|
|
months = Math.round(minutes / MINUTES_IN_MONTH);
|
|
return locale2.formatDistance("aboutXMonths", months, localizeOptions);
|
|
}
|
|
months = differenceInMonths(dateRight, dateLeft);
|
|
if (months < 12) {
|
|
var nearestMonth = Math.round(minutes / MINUTES_IN_MONTH);
|
|
return locale2.formatDistance("xMonths", nearestMonth, localizeOptions);
|
|
} else {
|
|
var monthsSinceStartOfYear = months % 12;
|
|
var years = Math.floor(months / 12);
|
|
if (monthsSinceStartOfYear < 3) {
|
|
return locale2.formatDistance("aboutXYears", years, localizeOptions);
|
|
} else if (monthsSinceStartOfYear < 9) {
|
|
return locale2.formatDistance("overXYears", years, localizeOptions);
|
|
} else {
|
|
return locale2.formatDistance("almostXYears", years + 1, localizeOptions);
|
|
}
|
|
}
|
|
}
|
|
|
|
// node_modules/date-fns/esm/getDaysInMonth/index.js
|
|
function getDaysInMonth(dirtyDate) {
|
|
requiredArgs(1, arguments);
|
|
var date = toDate(dirtyDate);
|
|
var year = date.getFullYear();
|
|
var monthIndex = date.getMonth();
|
|
var lastDayOfMonth2 = new Date(0);
|
|
lastDayOfMonth2.setFullYear(year, monthIndex + 1, 0);
|
|
lastDayOfMonth2.setHours(0, 0, 0, 0);
|
|
return lastDayOfMonth2.getDate();
|
|
}
|
|
|
|
// node_modules/date-fns/esm/getISOWeek/index.js
|
|
var MILLISECONDS_IN_WEEK4 = 6048e5;
|
|
function getISOWeek(dirtyDate) {
|
|
requiredArgs(1, arguments);
|
|
var date = toDate(dirtyDate);
|
|
var diff = startOfISOWeek(date).getTime() - startOfISOWeekYear(date).getTime();
|
|
return Math.round(diff / MILLISECONDS_IN_WEEK4) + 1;
|
|
}
|
|
|
|
// node_modules/date-fns/esm/getTime/index.js
|
|
function getTime(dirtyDate) {
|
|
requiredArgs(1, arguments);
|
|
var date = toDate(dirtyDate);
|
|
var timestamp = date.getTime();
|
|
return timestamp;
|
|
}
|
|
|
|
// node_modules/date-fns/esm/getUnixTime/index.js
|
|
function getUnixTime(dirtyDate) {
|
|
requiredArgs(1, arguments);
|
|
return Math.floor(getTime(dirtyDate) / 1e3);
|
|
}
|
|
|
|
// node_modules/date-fns/esm/getWeekYear/index.js
|
|
function getWeekYear(dirtyDate, options) {
|
|
var _ref, _ref2, _ref3, _options$firstWeekCon, _options$locale, _options$locale$optio, _defaultOptions$local, _defaultOptions$local2;
|
|
requiredArgs(1, arguments);
|
|
var date = toDate(dirtyDate);
|
|
var year = date.getFullYear();
|
|
var defaultOptions3 = getDefaultOptions();
|
|
var firstWeekContainsDate = toInteger((_ref = (_ref2 = (_ref3 = (_options$firstWeekCon = options === null || options === void 0 ? void 0 : options.firstWeekContainsDate) !== null && _options$firstWeekCon !== void 0 ? _options$firstWeekCon : options === null || options === void 0 ? void 0 : (_options$locale = options.locale) === null || _options$locale === void 0 ? void 0 : (_options$locale$optio = _options$locale.options) === null || _options$locale$optio === void 0 ? void 0 : _options$locale$optio.firstWeekContainsDate) !== null && _ref3 !== void 0 ? _ref3 : defaultOptions3.firstWeekContainsDate) !== null && _ref2 !== void 0 ? _ref2 : (_defaultOptions$local = defaultOptions3.locale) === null || _defaultOptions$local === void 0 ? void 0 : (_defaultOptions$local2 = _defaultOptions$local.options) === null || _defaultOptions$local2 === void 0 ? void 0 : _defaultOptions$local2.firstWeekContainsDate) !== null && _ref !== void 0 ? _ref : 1);
|
|
if (!(firstWeekContainsDate >= 1 && firstWeekContainsDate <= 7)) {
|
|
throw new RangeError("firstWeekContainsDate must be between 1 and 7 inclusively");
|
|
}
|
|
var firstWeekOfNextYear = new Date(0);
|
|
firstWeekOfNextYear.setFullYear(year + 1, 0, firstWeekContainsDate);
|
|
firstWeekOfNextYear.setHours(0, 0, 0, 0);
|
|
var startOfNextYear = startOfWeek(firstWeekOfNextYear, options);
|
|
var firstWeekOfThisYear = new Date(0);
|
|
firstWeekOfThisYear.setFullYear(year, 0, firstWeekContainsDate);
|
|
firstWeekOfThisYear.setHours(0, 0, 0, 0);
|
|
var startOfThisYear = startOfWeek(firstWeekOfThisYear, options);
|
|
if (date.getTime() >= startOfNextYear.getTime()) {
|
|
return year + 1;
|
|
} else if (date.getTime() >= startOfThisYear.getTime()) {
|
|
return year;
|
|
} else {
|
|
return year - 1;
|
|
}
|
|
}
|
|
|
|
// node_modules/date-fns/esm/startOfWeekYear/index.js
|
|
function startOfWeekYear(dirtyDate, options) {
|
|
var _ref, _ref2, _ref3, _options$firstWeekCon, _options$locale, _options$locale$optio, _defaultOptions$local, _defaultOptions$local2;
|
|
requiredArgs(1, arguments);
|
|
var defaultOptions3 = getDefaultOptions();
|
|
var firstWeekContainsDate = toInteger((_ref = (_ref2 = (_ref3 = (_options$firstWeekCon = options === null || options === void 0 ? void 0 : options.firstWeekContainsDate) !== null && _options$firstWeekCon !== void 0 ? _options$firstWeekCon : options === null || options === void 0 ? void 0 : (_options$locale = options.locale) === null || _options$locale === void 0 ? void 0 : (_options$locale$optio = _options$locale.options) === null || _options$locale$optio === void 0 ? void 0 : _options$locale$optio.firstWeekContainsDate) !== null && _ref3 !== void 0 ? _ref3 : defaultOptions3.firstWeekContainsDate) !== null && _ref2 !== void 0 ? _ref2 : (_defaultOptions$local = defaultOptions3.locale) === null || _defaultOptions$local === void 0 ? void 0 : (_defaultOptions$local2 = _defaultOptions$local.options) === null || _defaultOptions$local2 === void 0 ? void 0 : _defaultOptions$local2.firstWeekContainsDate) !== null && _ref !== void 0 ? _ref : 1);
|
|
var year = getWeekYear(dirtyDate, options);
|
|
var firstWeek = new Date(0);
|
|
firstWeek.setFullYear(year, 0, firstWeekContainsDate);
|
|
firstWeek.setHours(0, 0, 0, 0);
|
|
var date = startOfWeek(firstWeek, options);
|
|
return date;
|
|
}
|
|
|
|
// node_modules/date-fns/esm/getWeek/index.js
|
|
var MILLISECONDS_IN_WEEK5 = 6048e5;
|
|
function getWeek(dirtyDate, options) {
|
|
requiredArgs(1, arguments);
|
|
var date = toDate(dirtyDate);
|
|
var diff = startOfWeek(date, options).getTime() - startOfWeekYear(date, options).getTime();
|
|
return Math.round(diff / MILLISECONDS_IN_WEEK5) + 1;
|
|
}
|
|
|
|
// node_modules/date-fns/esm/lastDayOfMonth/index.js
|
|
function lastDayOfMonth(dirtyDate) {
|
|
requiredArgs(1, arguments);
|
|
var date = toDate(dirtyDate);
|
|
var month = date.getMonth();
|
|
date.setFullYear(date.getFullYear(), month + 1, 0);
|
|
date.setHours(0, 0, 0, 0);
|
|
return date;
|
|
}
|
|
|
|
// node_modules/date-fns/esm/getWeeksInMonth/index.js
|
|
function getWeeksInMonth(date, options) {
|
|
requiredArgs(1, arguments);
|
|
return differenceInCalendarWeeks(lastDayOfMonth(date), startOfMonth(date), options) + 1;
|
|
}
|
|
|
|
// node_modules/date-fns/esm/isAfter/index.js
|
|
function isAfter2(dirtyDate, dirtyDateToCompare) {
|
|
requiredArgs(2, arguments);
|
|
var date = toDate(dirtyDate);
|
|
var dateToCompare = toDate(dirtyDateToCompare);
|
|
return date.getTime() > dateToCompare.getTime();
|
|
}
|
|
|
|
// node_modules/date-fns/esm/isBefore/index.js
|
|
function isBefore(dirtyDate, dirtyDateToCompare) {
|
|
requiredArgs(2, arguments);
|
|
var date = toDate(dirtyDate);
|
|
var dateToCompare = toDate(dirtyDateToCompare);
|
|
return date.getTime() < dateToCompare.getTime();
|
|
}
|
|
|
|
// node_modules/date-fns/esm/isSameMonth/index.js
|
|
function isSameMonth(dirtyDateLeft, dirtyDateRight) {
|
|
requiredArgs(2, arguments);
|
|
var dateLeft = toDate(dirtyDateLeft);
|
|
var dateRight = toDate(dirtyDateRight);
|
|
return dateLeft.getFullYear() === dateRight.getFullYear() && dateLeft.getMonth() === dateRight.getMonth();
|
|
}
|
|
|
|
// node_modules/date-fns/esm/isSameYear/index.js
|
|
function isSameYear(dirtyDateLeft, dirtyDateRight) {
|
|
requiredArgs(2, arguments);
|
|
var dateLeft = toDate(dirtyDateLeft);
|
|
var dateRight = toDate(dirtyDateRight);
|
|
return dateLeft.getFullYear() === dateRight.getFullYear();
|
|
}
|
|
|
|
// node_modules/date-fns/esm/subDays/index.js
|
|
function subDays(dirtyDate, dirtyAmount) {
|
|
requiredArgs(2, arguments);
|
|
var amount = toInteger(dirtyAmount);
|
|
return addDays(dirtyDate, -amount);
|
|
}
|
|
|
|
// node_modules/date-fns/esm/setMonth/index.js
|
|
function setMonth(dirtyDate, dirtyMonth) {
|
|
requiredArgs(2, arguments);
|
|
var date = toDate(dirtyDate);
|
|
var month = toInteger(dirtyMonth);
|
|
var year = date.getFullYear();
|
|
var day = date.getDate();
|
|
var dateWithDesiredMonth = new Date(0);
|
|
dateWithDesiredMonth.setFullYear(year, month, 15);
|
|
dateWithDesiredMonth.setHours(0, 0, 0, 0);
|
|
var daysInMonth = getDaysInMonth(dateWithDesiredMonth);
|
|
date.setMonth(month, Math.min(day, daysInMonth));
|
|
return date;
|
|
}
|
|
|
|
// node_modules/date-fns/esm/setYear/index.js
|
|
function setYear(dirtyDate, dirtyYear) {
|
|
requiredArgs(2, arguments);
|
|
var date = toDate(dirtyDate);
|
|
var year = toInteger(dirtyYear);
|
|
if (isNaN(date.getTime())) {
|
|
return new Date(NaN);
|
|
}
|
|
date.setFullYear(year);
|
|
return date;
|
|
}
|
|
|
|
// src/utils/contexts/fm.ts
|
|
var import_lodash = __toESM(require_lodash());
|
|
var import_obsidian3 = require("obsidian");
|
|
|
|
// src/utils/contexts/dv.ts
|
|
var import_obsidian2 = require("obsidian");
|
|
var LocationWrapper = {
|
|
"fullLine": { start: "", end: "" },
|
|
"brackets": { start: "[", end: "]" },
|
|
"parenthesis": { start: "(", end: ")" }
|
|
};
|
|
var fieldComponents = ["inQuote", "inList", "startStyle", "attribute", "endStyle", "beforeSeparatorSpacer", "afterSeparatorSpacer", "values"];
|
|
var genericFieldRegex = "(?<inQuote>>(\\s+)?)?(?<inList>- )?(?<startStyle>[_\\*~`]*)(?<attribute>[0-9\\w\\p{Letter}\\p{Emoji_Presentation}][-0-9\\w\\p{Letter}\\p{Emoji_Presentation}\\s]*)(?<endStyle>[_\\*~`]*)(?<beforeSeparatorSpacer>\\s*)";
|
|
var inlineFieldRegex = (attribute) => `(?<inQuote>>(\\s+)?)?(?<inList>- )?(?<startStyle>[_\\*~\`]*)(?<attribute>${attribute})(?<endStyle>[_\\*~\`]*)(?<beforeSeparatorSpacer>\\s*)::(?<afterSeparatorSpacer>\\s*)`;
|
|
var fullLineRegex = new RegExp(`^${genericFieldRegex}::\\s*(?<values>.*)?`, "u");
|
|
var inSentenceRegexBrackets = new RegExp(`\\[${genericFieldRegex}::\\s*(?<values>[^\\]]+)?\\]`, "gu");
|
|
var inSentenceRegexPar = new RegExp(`\\(${genericFieldRegex}::\\s*(?<values>[^\\)]+)?\\)`, "gu");
|
|
var encodeLink = (value) => {
|
|
return value ? value.replace(/\[\[/g, "\u{1F54C}\u{1F527}").replace(/\]\]/g, "\u{1F413}\u{1F400}") : value;
|
|
};
|
|
var decodeLink = (value) => {
|
|
return value ? value.replace(/🕌🔧/gu, "[[").replace(/🐓🐀/gu, "]]") : value;
|
|
};
|
|
var matchInlineFields = (regex, line, attribute, input, location = "fullLine") => {
|
|
const sR = line.matchAll(regex);
|
|
let next = sR.next();
|
|
const newFields = [];
|
|
while (!next.done) {
|
|
const match2 = next.value;
|
|
if (match2.groups && Object.keys(match2.groups).every((j4) => fieldComponents.includes(j4))) {
|
|
const { inList, inQuote, startStyle, endStyle, beforeSeparatorSpacer, afterSeparatorSpacer, values } = match2.groups;
|
|
const inputArray = input ? input.replace(/(\,\s+)/g, ",").split(",") : [""];
|
|
const newValue = inputArray.length == 1 ? inputArray[0] : `${inputArray.join(", ")}`;
|
|
const start = LocationWrapper[location].start;
|
|
const end = LocationWrapper[location].end;
|
|
newFields.push({
|
|
oldField: match2[0],
|
|
newField: `${inQuote || ""}${start}${inList || ""}${startStyle}${attribute}${endStyle}${beforeSeparatorSpacer}::${afterSeparatorSpacer}${newValue}${end}`
|
|
});
|
|
}
|
|
next = sR.next();
|
|
}
|
|
return newFields;
|
|
};
|
|
async function replaceValues(plugin, fileOrFilePath, attribute, input, previousItemsCount = 0) {
|
|
var _a2, _b2;
|
|
let file;
|
|
if (fileOrFilePath instanceof import_obsidian2.TFile) {
|
|
file = fileOrFilePath;
|
|
} else {
|
|
const _file = plugin.app.vault.getAbstractFileByPath(fileOrFilePath);
|
|
if (_file instanceof import_obsidian2.TFile && _file.extension == "md") {
|
|
file = _file;
|
|
} else {
|
|
throw Error("path doesn't correspond to a proper file");
|
|
}
|
|
}
|
|
const content = (await plugin.app.vault.read(file)).split("\n");
|
|
const frontmatter = (_a2 = plugin.app.metadataCache.getFileCache(file)) == null ? void 0 : _a2.frontmatter;
|
|
const skippedLines = [];
|
|
const { position: { start, end } } = frontmatter ? frontmatter : { position: { start: void 0, end: void 0 } };
|
|
const newContent = content.map((line, i4) => {
|
|
const encodedInput = encodeLink(input);
|
|
let encodedLine = encodeLink(line);
|
|
const fullLineRegex2 = new RegExp(`^${inlineFieldRegex(attribute)}(?<values>[^\\]]*)`, "u");
|
|
const fR = encodedLine.match(fullLineRegex2);
|
|
if ((fR == null ? void 0 : fR.groups) && Object.keys(fR.groups).every((j4) => fieldComponents.includes(j4))) {
|
|
const { inList, inQuote, startStyle, endStyle, beforeSeparatorSpacer, afterSeparatorSpacer, values } = fR.groups;
|
|
const inputArray = input ? input.replace(/(\,\s+)/g, ",").split(",").sort() : [];
|
|
let newValue;
|
|
let hiddenValue = "";
|
|
newValue = inputArray.length == 1 ? inputArray[0] : `${inputArray.join(", ")}`;
|
|
return `${inQuote || ""}${inList || ""}${startStyle}${attribute}${endStyle}${beforeSeparatorSpacer}::${afterSeparatorSpacer}${hiddenValue + newValue}`;
|
|
} else {
|
|
const newFields = [];
|
|
const inSentenceRegexBrackets2 = new RegExp(`\\[${inlineFieldRegex(attribute)}(?<values>[^\\]]+)?\\]`, "gu");
|
|
const inSentenceRegexPar2 = new RegExp(`\\(${inlineFieldRegex(attribute)}(?<values>[^\\)]+)?\\)`, "gu");
|
|
newFields.push(...matchInlineFields(inSentenceRegexBrackets2, encodedLine, attribute, encodedInput, "brackets" /* brackets */));
|
|
newFields.push(...matchInlineFields(inSentenceRegexPar2, encodedLine, attribute, encodedInput, "parenthesis" /* parenthesis */));
|
|
newFields.forEach((field) => {
|
|
const fieldRegex = new RegExp(field.oldField.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"), "u");
|
|
encodedLine = encodedLine.replace(fieldRegex, field.newField);
|
|
});
|
|
return decodeLink(encodedLine);
|
|
}
|
|
});
|
|
await plugin.app.vault.modify(file, newContent.filter((line, i4) => !skippedLines.includes(i4)).join("\n"));
|
|
const editor = (_b2 = plugin.app.workspace.getActiveViewOfType(import_obsidian2.MarkdownView)) == null ? void 0 : _b2.editor;
|
|
if (editor) {
|
|
const lineNumber = editor.getCursor().line;
|
|
editor.setCursor({ line: editor.getCursor().line, ch: editor.getLine(lineNumber).length });
|
|
}
|
|
}
|
|
|
|
// src/utils/contexts/fm.ts
|
|
var saveContextToFile = (file, cols, context, plugin) => {
|
|
if (app.fileManager.processFrontMatter) {
|
|
app.fileManager.processFrontMatter(file, (frontmatter) => {
|
|
Object.keys(context).filter(
|
|
(f4) => cols.find((c4) => c4.name == f4) && cols.find((c4) => c4.name == f4).hidden != "true" && !cols.find((c4) => c4.name == f4).type.contains("file") && context[f4]
|
|
).forEach((f4) => {
|
|
const col = cols.find((c4) => c4.name == f4);
|
|
frontmatter[f4] = valueForFrontmatter(col.type, context[f4]);
|
|
if (plugin.dataViewAPI()) {
|
|
if (plugin.dataViewAPI().page(file.path)[f4] && !frontmatter[f4]) {
|
|
replaceValues(plugin, file.path, f4, context[f4]);
|
|
} else {
|
|
frontmatter[f4] = valueForFrontmatter(col.type, context[f4]);
|
|
}
|
|
} else {
|
|
frontmatter[f4] = valueForFrontmatter(col.type, context[f4]);
|
|
}
|
|
});
|
|
});
|
|
}
|
|
};
|
|
var frontMatterForFile = (file) => {
|
|
let currentCache;
|
|
if (file instanceof import_obsidian3.TFile && app.metadataCache.getFileCache(file) !== null) {
|
|
currentCache = app.metadataCache.getFileCache(file);
|
|
}
|
|
return currentCache == null ? void 0 : currentCache.frontmatter;
|
|
};
|
|
var frontMatterKeys = (fm) => {
|
|
return Object.keys(fm != null ? fm : {}).filter((f4) => f4 != "position");
|
|
};
|
|
var yamlTypeToMDBType = (YAMLtype) => {
|
|
switch (YAMLtype) {
|
|
case "duration":
|
|
return "text";
|
|
break;
|
|
case "unknown":
|
|
return "text";
|
|
break;
|
|
}
|
|
return YAMLtype;
|
|
};
|
|
var detectYAMLType = (value, key2) => {
|
|
if (typeof value === "string") {
|
|
if (/\/\/(\S+?(?:jpe?g|png|gif|svg))/gi.test(value) || value.contains("unsplash")) {
|
|
return "image";
|
|
}
|
|
if (/^\d{4}-\d{2}-\d{2}$/.test(value)) {
|
|
return "date";
|
|
}
|
|
if (key2 == "tag" || key2 == "tags") {
|
|
return "tag";
|
|
}
|
|
if (/\[\[.*?\]\]/.test(value)) {
|
|
return "link";
|
|
}
|
|
return "text";
|
|
} else if (typeof value === "number") {
|
|
return "number";
|
|
} else if (typeof value === "boolean") {
|
|
return "boolean";
|
|
} else if (!value) {
|
|
return "unknown";
|
|
} else if (Array.isArray(value)) {
|
|
if (key2 == "tag" || key2 == "tags") {
|
|
return "tag-multi";
|
|
}
|
|
if (value.length == 1 && Array.isArray(value[0]) && value[0].length == 1 && typeof value[0][0] === "string") {
|
|
return "link";
|
|
}
|
|
const types = uniq(value.map((f4) => detectYAMLType(f4, key2)));
|
|
if (types.length == 1 && types[0] == "link") {
|
|
return "link-multi";
|
|
}
|
|
return "option-multi";
|
|
} else if (value.isLuxonDateTime) {
|
|
return "date";
|
|
} else if (value.isLuxonDuration) {
|
|
return "duration";
|
|
} else if (value.type == "file") {
|
|
return "link";
|
|
}
|
|
return "text";
|
|
};
|
|
var mergeTableData = (mdb, yamlmdb, types) => {
|
|
return {
|
|
...mdb,
|
|
cols: [
|
|
...mdb.cols,
|
|
...yamlmdb.cols.filter(
|
|
(f4) => !mdb.cols.find((g4) => g4.name.toLowerCase() == f4.toLowerCase())
|
|
).map((f4) => ({
|
|
name: f4,
|
|
schemaId: mdb.schema.id,
|
|
type: yamlTypeToMDBType(types[f4])
|
|
}))
|
|
].filter(onlyUniqueProp("name")),
|
|
rows: mdb.rows.map((r3) => {
|
|
const fmRow = yamlmdb.rows.find((f4) => f4.File == r3.File);
|
|
if (fmRow) {
|
|
return {
|
|
...r3,
|
|
...fmRow
|
|
};
|
|
}
|
|
return r3;
|
|
})
|
|
};
|
|
};
|
|
var guestimateTypes = (_files, plugin, dv) => {
|
|
const typesArray = _files.map((f4) => getAbstractFileAtPath(app, f4)).filter((f4) => f4).map((k5) => {
|
|
const fm = dv && plugin.dataViewAPI() ? plugin.dataViewAPI().page(k5.path) : frontMatterForFile(k5);
|
|
const fmKeys = dv ? Object.keys(fm != null ? fm : {}).filter(
|
|
(f4, i4, self2) => !self2.find(
|
|
(g4, j4) => g4.toLowerCase().replace(/\s/g, "-") == f4.toLowerCase().replace(/\s/g, "-") && i4 > j4
|
|
) ? true : false
|
|
).filter((f4) => f4 != "file") : frontMatterKeys(fm);
|
|
return fmKeys.reduce(
|
|
(pk, ck) => ({ ...pk, [ck]: detectYAMLType(fm[ck], ck) }),
|
|
{}
|
|
);
|
|
});
|
|
const types = typesArray.reduce(
|
|
(p3, c4) => {
|
|
const newSet = Object.keys(c4).reduce(
|
|
(pk, ck) => {
|
|
var _a2;
|
|
return { ...pk, [ck]: [...(_a2 = p3 == null ? void 0 : p3[ck]) != null ? _a2 : [], c4[ck]] };
|
|
},
|
|
{ ...p3 }
|
|
);
|
|
return newSet;
|
|
},
|
|
{}
|
|
);
|
|
const guessType = (ts) => {
|
|
return import_lodash.default.head((0, import_lodash.default)(ts).countBy().entries().maxBy(import_lodash.default.last));
|
|
};
|
|
const guessedTypes = Object.keys(types).reduce((p3, c4) => {
|
|
return { ...p3, [c4]: guessType(types[c4]) };
|
|
}, {});
|
|
return guessedTypes;
|
|
};
|
|
var valueForFrontmatter = (type, value) => {
|
|
if (type == "number") {
|
|
return parseInt(value);
|
|
} else if (type == "boolean") {
|
|
return value == "true";
|
|
} else if (type.contains("multi")) {
|
|
return splitString(value);
|
|
}
|
|
return value;
|
|
};
|
|
var saveFrontmatterValue = (plugin, path, key2, value, type, forceSave) => {
|
|
const afile = getAbstractFileAtPath(app, path);
|
|
if (afile) {
|
|
if (app.fileManager.processFrontMatter) {
|
|
app.fileManager.processFrontMatter(afile, (frontmatter) => {
|
|
if (plugin.dataViewAPI()) {
|
|
if (plugin.dataViewAPI().page(path)[key2] && !frontmatter[key2]) {
|
|
replaceValues(plugin, path, key2, value);
|
|
} else {
|
|
if (key2 in frontmatter || forceSave) {
|
|
frontmatter[key2] = valueForFrontmatter(type, value);
|
|
}
|
|
}
|
|
} else {
|
|
if (key2 in frontmatter || forceSave) {
|
|
frontmatter[key2] = valueForFrontmatter(type, value);
|
|
}
|
|
}
|
|
});
|
|
}
|
|
}
|
|
};
|
|
var parseFrontMatter = (field, value, dv) => {
|
|
const YAMLtype = detectYAMLType(value, field);
|
|
switch (YAMLtype) {
|
|
case "number":
|
|
return value.toString();
|
|
break;
|
|
case "boolean":
|
|
return value ? "true" : "false";
|
|
break;
|
|
case "date":
|
|
if (!dv) {
|
|
return value;
|
|
} else {
|
|
return format(new Date(value.ts), "yyyy-MM-dd");
|
|
;
|
|
}
|
|
break;
|
|
case "duration":
|
|
return Object.keys(value.values).reduce(
|
|
(p3, c4) => [
|
|
...p3,
|
|
...value.values[c4] > 0 ? [value.values[c4] + " " + c4] : []
|
|
],
|
|
[]
|
|
).join(", ");
|
|
break;
|
|
case "option-multi":
|
|
case "link-multi":
|
|
case "tag-multi":
|
|
return value.join(",");
|
|
break;
|
|
case "link":
|
|
{
|
|
if (Array.isArray(value) && value.length == 1 && Array.isArray(value[0]) && value[0].length == 1 && typeof value[0][0] === "string") {
|
|
return value[0][0];
|
|
} else if (typeof value === "string") {
|
|
return value;
|
|
}
|
|
return value.path;
|
|
}
|
|
break;
|
|
case "text":
|
|
case "tag":
|
|
case "image":
|
|
return value;
|
|
break;
|
|
}
|
|
return "";
|
|
};
|
|
|
|
// src/utils/array.ts
|
|
var insert = (arr, index, newItem) => [
|
|
...arr.slice(0, index),
|
|
newItem,
|
|
...arr.slice(index)
|
|
];
|
|
|
|
// src/utils/sanitize.ts
|
|
var sanitizeTableName = (name) => {
|
|
return name == null ? void 0 : name.replace(/[^a-z0-9+]+/gi, "");
|
|
};
|
|
var sanitizeColumnName = (name) => {
|
|
return name == null ? void 0 : name.replace(/"/g, ``);
|
|
};
|
|
var sanitizeSQLStatement = (name) => {
|
|
return name == null ? void 0 : name.replace(/'/g, `''`);
|
|
};
|
|
|
|
// src/dispatch/mdb.ts
|
|
var import_lodash2 = __toESM(require_lodash());
|
|
var import_obsidian4 = require("obsidian");
|
|
var dispatchDatabaseFileChanged = (dbPath, tag) => {
|
|
let evt = new CustomEvent(eventTypes.mdbChange, { detail: { dbPath, tag } });
|
|
window.dispatchEvent(evt);
|
|
};
|
|
var processFolderDB = async (plugin, folderPath, processor, fallback) => {
|
|
let tags = [];
|
|
const dbPath = folderContextFromFolder(plugin, folderPath);
|
|
const dbFileExists = getAbstractFileAtPath(app, dbPath);
|
|
if (dbFileExists) {
|
|
const folderDB = await getMDBTable(plugin, "files", dbPath, false);
|
|
if (folderDB) {
|
|
tags.push(...folderDB.schema.def.split("&"));
|
|
const newDB = await processor(folderDB, dbPath);
|
|
const promises = tags.map((tag) => {
|
|
const tagdbPath = tagContextFromTag(plugin, tag);
|
|
const tagFileExists = getAbstractFileAtPath(app, tagdbPath);
|
|
if (tagFileExists) {
|
|
return consolidateRowsToTag(
|
|
plugin,
|
|
tagdbPath,
|
|
"files",
|
|
dbPath,
|
|
newDB.rows
|
|
).then((f4) => {
|
|
});
|
|
}
|
|
});
|
|
return Promise.all(promises);
|
|
} else if (fallback) {
|
|
await fallback();
|
|
}
|
|
} else if (fallback) {
|
|
await fallback();
|
|
}
|
|
};
|
|
var saveDB = async (plugin, dbPath, newTable) => {
|
|
return saveMDBToPath(plugin, dbPath, newTable);
|
|
};
|
|
var renameRow = (folder, filePath, toFilePath) => {
|
|
return {
|
|
...folder,
|
|
rows: folder.rows.map(
|
|
(f4) => f4.File == filePath && f4._source == "folder" ? { ...f4, File: toFilePath } : f4
|
|
)
|
|
};
|
|
};
|
|
var removeRows = (folder, source) => {
|
|
return { ...folder, rows: folder.rows.filter((f4) => f4._source != source) };
|
|
};
|
|
var removeRow = (folder, filePath) => {
|
|
return {
|
|
...folder,
|
|
rows: folder.rows.filter(
|
|
(f4) => f4.File != filePath && f4._source == "folder"
|
|
)
|
|
};
|
|
};
|
|
var insertRow = (folder, row, parent) => {
|
|
const existingRow = folder.rows.find(
|
|
(f4) => f4.File == row.File || parent + "/" + f4.File + ".md" == row.File
|
|
);
|
|
if (existingRow) {
|
|
return {
|
|
...folder,
|
|
rows: folder.rows.map(
|
|
(f4) => f4.File == existingRow.File ? { ...f4, File: row.File, _source: "folder", ...row } : f4
|
|
)
|
|
};
|
|
}
|
|
return { ...folder, rows: [...folder.rows, row] };
|
|
};
|
|
var insertRows = (folder, rows) => {
|
|
const newRows = rows.filter(
|
|
(row) => {
|
|
var _a2;
|
|
return ((_a2 = row.File) == null ? void 0 : _a2.length) > 0 && !folder.rows.some((f4) => f4.File == row.File && f4._source == "folder");
|
|
}
|
|
);
|
|
return { ...folder, rows: [...folder.rows, ...newRows] };
|
|
};
|
|
var saveContextToFrontmatter = (file, cols, context, plugin) => {
|
|
const afile = getAbstractFileAtPath(app, file);
|
|
if (afile && afile instanceof import_obsidian4.TFile)
|
|
saveContextToFile(afile, cols, context, plugin);
|
|
};
|
|
var removeSourceFromTag = async (plugin, tag, source) => {
|
|
const dbPath = tagContextFromTag(plugin, tag);
|
|
const tagFileExists = getAbstractFileAtPath(app, dbPath);
|
|
if (tagFileExists) {
|
|
const tagDB = await getMDBTable(plugin, "files", dbPath, true);
|
|
const files = tagDB.rows.filter((f4) => f4._source == source);
|
|
files.forEach(
|
|
(row) => saveContextToFrontmatter(
|
|
row["File"],
|
|
tagDB.cols,
|
|
tagDB.cols.reduce((p3, c4) => ({ ...p3, [c4.name]: row[c4.name] }), {}),
|
|
plugin
|
|
)
|
|
);
|
|
await saveDB(plugin, dbPath, removeRows(tagDB, source));
|
|
}
|
|
};
|
|
var contextShouldExist = async (plugin, tag) => {
|
|
const dbPath = tagContextFromTag(plugin, tag);
|
|
const tagFileExists = getAbstractFileAtPath(app, dbPath);
|
|
if (!tagFileExists)
|
|
return false;
|
|
return getMDBTable(plugin, "files", dbPath, true).then((f4) => (f4 == null ? void 0 : f4.rows.length) > 0);
|
|
};
|
|
var initiateContextIfNotExists = async (plugin, tag) => {
|
|
const dbPath = tagContextFromTag(plugin, tag);
|
|
const tagFileExists = getAbstractFileAtPath(app, dbPath);
|
|
if (tagFileExists)
|
|
return false;
|
|
return createDefaultDB(plugin, dbPath, true);
|
|
};
|
|
var insertContextItems = async (plugin, newPaths, t4) => {
|
|
const saveNewContextRows = async (tag, path) => {
|
|
const newRow = newPaths.map((newPath) => ({ File: newPath }));
|
|
await saveDB(plugin, path, insertRows(tag, newRow));
|
|
};
|
|
const dbPath = tagContextFromTag(plugin, t4);
|
|
const tagFileExists = getAbstractFileAtPath(app, dbPath);
|
|
if (!tagFileExists) {
|
|
await createDefaultDB(plugin, dbPath, true);
|
|
}
|
|
await getMDBTable(plugin, "files", dbPath, true).then(
|
|
(tagDB) => saveNewContextRows(tagDB, dbPath).then((f4) => {
|
|
})
|
|
);
|
|
};
|
|
var fileToFM = (file, cols, plugin) => {
|
|
const fm = frontMatterForFile(file);
|
|
const fmKeys = frontMatterKeys(fm).filter((f4) => cols.some((g4) => f4 == g4));
|
|
const rows = fmKeys.reduce(
|
|
(p3, c4) => ({ ...p3, [c4]: parseFrontMatter(c4, fm[c4], false) }),
|
|
{}
|
|
);
|
|
if (plugin.dataViewAPI()) {
|
|
return { ...rows, ...fileToDV(file, cols, plugin) };
|
|
}
|
|
return rows;
|
|
};
|
|
var fileToDV = (file, cols, plugin) => {
|
|
const dvValues = plugin.dataViewAPI().page(file.path);
|
|
const fmKeys = uniqCaseInsensitive(
|
|
Object.keys(dvValues != null ? dvValues : {}).filter(
|
|
(f4, i4, self2) => !self2.find(
|
|
(g4, j4) => g4.toLowerCase().replace(/\s/g, "-") == f4.toLowerCase().replace(/\s/g, "-") && i4 > j4
|
|
) ? true : false
|
|
).filter((f4) => f4 != "file")
|
|
).filter((f4) => cols.some((g4) => f4 == g4));
|
|
;
|
|
return fmKeys.reduce(
|
|
(p3, c4) => ({
|
|
...p3,
|
|
[c4]: parseFrontMatter(c4, dvValues[c4], true)
|
|
}),
|
|
{}
|
|
);
|
|
};
|
|
var onMetadataChange = async (plugin, file) => {
|
|
const folderPath = getFolderPathFromString(file.path);
|
|
let tags = [];
|
|
const dbPath = folderContextFromFolder(plugin, folderPath);
|
|
const dbFileExists = getAbstractFileAtPath(app, dbPath);
|
|
if (dbFileExists) {
|
|
const folderDB = await getMDBTable(plugin, "files", dbPath, false);
|
|
if (folderDB) {
|
|
tags.push(...folderDB.schema.def.split("&"));
|
|
const newDB = {
|
|
...folderDB,
|
|
rows: folderDB.rows.map(
|
|
(f4) => f4.File == file.path && f4._source == "folder" ? {
|
|
...f4,
|
|
...fileToFM(
|
|
file,
|
|
folderDB.cols.map((f5) => f5.name),
|
|
plugin
|
|
)
|
|
} : f4
|
|
)
|
|
};
|
|
const dbChanged = !import_lodash2.default.isEqual(folderDB.rows, newDB.rows);
|
|
if (dbChanged) {
|
|
await saveDB(plugin, dbPath, newDB);
|
|
}
|
|
const promises = tags.map((tag) => {
|
|
const tagdbPath = tagContextFromTag(plugin, tag);
|
|
const tagFileExists = getAbstractFileAtPath(app, tagdbPath);
|
|
if (tagFileExists) {
|
|
return getMDBTable(plugin, "files", tagdbPath, false).then(
|
|
(tagDB) => {
|
|
const newDB2 = {
|
|
...tagDB,
|
|
rows: tagDB.rows.map(
|
|
(f4) => f4.File == file.path && f4._source == dbPath ? {
|
|
...f4,
|
|
...fileToFM(
|
|
file,
|
|
tagDB.cols.map((f5) => f5.name),
|
|
plugin
|
|
)
|
|
} : f4
|
|
)
|
|
};
|
|
const dbChanged2 = !import_lodash2.default.isEqual(tagDB.rows, newDB2.rows);
|
|
if (dbChanged2) {
|
|
return saveDB(plugin, tagdbPath, newDB2);
|
|
}
|
|
return;
|
|
}
|
|
);
|
|
}
|
|
});
|
|
await Promise.all(promises);
|
|
}
|
|
}
|
|
};
|
|
var onFileCreated = async (plugin, newPath) => {
|
|
const newFolderPath = getFolderPathFromString(newPath);
|
|
await processFolderDB(plugin, newFolderPath, async (folder, path) => {
|
|
const amendedFolderDB = insertRow(
|
|
folder,
|
|
newRowByDBRow({ File: newPath, _source: "folder" }),
|
|
newFolderPath
|
|
);
|
|
await saveDB(plugin, path, amendedFolderDB);
|
|
return amendedFolderDB;
|
|
});
|
|
};
|
|
var onFileChanged = async (plugin, oldPath, newPath) => {
|
|
const oldFolderPath = getFolderPathFromString(oldPath);
|
|
const newFolderPath = getFolderPathFromString(newPath);
|
|
if (oldFolderPath == newFolderPath) {
|
|
await processFolderDB(plugin, oldFolderPath, async (folder, path) => {
|
|
const amendedFolderDB = renameRow(folder, oldPath, newPath);
|
|
await saveDB(plugin, path, amendedFolderDB);
|
|
return amendedFolderDB;
|
|
});
|
|
} else {
|
|
await processFolderDB(
|
|
plugin,
|
|
oldFolderPath,
|
|
async (folder, path) => {
|
|
const amendedFolderDB = removeRow(folder, oldPath);
|
|
await saveDB(plugin, path, amendedFolderDB);
|
|
const dbPath = folderContextFromFolder(plugin, newFolderPath);
|
|
const fromDBRow = folder.rows.find((f4) => f4.File == oldPath);
|
|
const toDBFileExists = getAbstractFileAtPath(app, dbPath);
|
|
if (toDBFileExists) {
|
|
const toFolderDB = await getMDBTable(plugin, "files", dbPath, false);
|
|
if (toFolderDB) {
|
|
const [newDBCols, fmDBCols] = Object.keys(fromDBRow).reduce(
|
|
(p3, c4) => fromDBRow[c4].length == 0 ? p3 : toFolderDB.cols.find((f4) => f4.name == fromDBRow[c4]) ? [[...p3[0], c4], p3[1]] : [p3[0], [...p3[1], c4]],
|
|
[[], []]
|
|
);
|
|
const newRow = {
|
|
...newDBCols.reduce((p3, c4) => ({ ...p3, [c4]: fromDBRow[c4] }), {}),
|
|
File: newPath
|
|
};
|
|
await saveDB(
|
|
plugin,
|
|
dbPath,
|
|
insertRow(toFolderDB, newRowByDBRow(newRow), newFolderPath)
|
|
);
|
|
saveContextToFrontmatter(
|
|
newPath,
|
|
folder.cols,
|
|
fmDBCols.reduce((p3, c4) => ({ ...p3, [c4]: fromDBRow[c4] }), {}),
|
|
plugin
|
|
);
|
|
}
|
|
} else {
|
|
saveContextToFrontmatter(
|
|
newPath,
|
|
folder.cols,
|
|
Object.keys(fromDBRow).reduce(
|
|
(p3, c4) => ({ ...p3, [c4]: fromDBRow[c4] }),
|
|
{}
|
|
),
|
|
plugin
|
|
);
|
|
}
|
|
return amendedFolderDB;
|
|
},
|
|
async () => {
|
|
const dbPath = folderContextFromFolder(plugin, newFolderPath);
|
|
const toDBFileExists = getAbstractFileAtPath(app, dbPath);
|
|
if (toDBFileExists) {
|
|
const toFolderDB = await getMDBTable(plugin, "files", dbPath, false);
|
|
}
|
|
}
|
|
);
|
|
}
|
|
};
|
|
var onFileDeleted = async (plugin, oldPath) => {
|
|
const oldFolderPath = getFolderPathFromString(oldPath);
|
|
await processFolderDB(plugin, oldFolderPath, async (folder, path) => {
|
|
const amendedFolderDB = removeRow(folder, oldPath);
|
|
await saveDB(plugin, path, amendedFolderDB);
|
|
return amendedFolderDB;
|
|
});
|
|
};
|
|
var onFolderChanged = async (plugin, oldPath, newPath) => {
|
|
await processFolderDB(plugin, newPath, async (folder, path) => {
|
|
const newDB = {
|
|
...folder,
|
|
rows: folder.rows.map(
|
|
(f4) => getFolderPathFromString(f4["File"]) == oldPath ? { ...f4, File: f4["File"].replace(oldPath, newPath) } : f4
|
|
)
|
|
};
|
|
await saveDB(plugin, path, newDB);
|
|
return newDB;
|
|
});
|
|
};
|
|
var onFolderDeleted = async (oldPath) => {
|
|
};
|
|
|
|
// src/utils/db/db.ts
|
|
var import_obsidian5 = require("obsidian");
|
|
var getDBFile = async (path) => {
|
|
if (!await app.vault.adapter.exists((0, import_obsidian5.normalizePath)(path))) {
|
|
return null;
|
|
}
|
|
const file = await app.vault.adapter.readBinary(
|
|
(0, import_obsidian5.normalizePath)(path)
|
|
);
|
|
return file;
|
|
};
|
|
var getDB = async (sqlJS, path) => {
|
|
const buf = await getDBFile(path);
|
|
if (buf) {
|
|
return new sqlJS.Database(new Uint8Array(buf));
|
|
}
|
|
return new sqlJS.Database();
|
|
};
|
|
var saveDBAndKeepAlive = (db, path) => {
|
|
const results = saveDBFile(path, db.export().buffer);
|
|
return results;
|
|
};
|
|
var saveDBFile = async (path, binary) => {
|
|
const file = app.vault.adapter.writeBinary(
|
|
(0, import_obsidian5.normalizePath)(path),
|
|
binary
|
|
);
|
|
return file;
|
|
};
|
|
var dbResultsToDBTables = (res) => {
|
|
return res.reduce(
|
|
(p3, c4, i4) => [
|
|
...p3,
|
|
{
|
|
cols: c4.columns,
|
|
rows: c4 ? c4.values.map(
|
|
(r3) => c4.columns.reduce(
|
|
(prev, curr, index) => ({ ...prev, [curr]: r3[index] }),
|
|
{}
|
|
)
|
|
) : []
|
|
}
|
|
],
|
|
[]
|
|
);
|
|
};
|
|
var selectDB = (db, table, condition, fields) => {
|
|
const fieldsStr = fields != null ? fields : "*";
|
|
const sqlstr = condition ? `SELECT ${fieldsStr} FROM "${table}" WHERE ${condition};` : `SELECT ${fieldsStr} FROM ${table};`;
|
|
let tables;
|
|
try {
|
|
tables = dbResultsToDBTables(db.exec(sqlstr));
|
|
} catch (e4) {
|
|
return null;
|
|
}
|
|
if (tables.length == 1)
|
|
return tables[0];
|
|
return null;
|
|
};
|
|
var updateDB = (db, tables, updateCol, updateRef) => {
|
|
const sqlstr = Object.keys(tables).map((t4) => {
|
|
const tableFields = tables[t4].cols.filter((f4) => f4 != updateRef);
|
|
const rowsQuery = tables[t4].rows.reduce((prev, curr) => {
|
|
var _a2;
|
|
return `${prev} UPDATE "${t4}" SET ${tableFields.map((c4) => {
|
|
var _a3;
|
|
return `${c4}='${(_a3 = sanitizeSQLStatement(curr == null ? void 0 : curr[c4])) != null ? _a3 : ""}'`;
|
|
}).join(", ")} WHERE ${updateCol}='${(_a2 = sanitizeSQLStatement(curr == null ? void 0 : curr[updateRef])) != null ? _a2 : ""}';`;
|
|
}, "");
|
|
return rowsQuery;
|
|
}).join("; ");
|
|
try {
|
|
db.exec(sqlstr);
|
|
} catch (e4) {
|
|
console.log(e4);
|
|
}
|
|
};
|
|
var execQuery = (db, sqlstr) => {
|
|
try {
|
|
db.exec(sqlstr);
|
|
} catch (e4) {
|
|
console.log(e4);
|
|
}
|
|
};
|
|
var deleteFromDB = (db, table, condition) => {
|
|
const sqlstr = `DELETE FROM "${table}" WHERE ${condition};`;
|
|
try {
|
|
db.exec(sqlstr);
|
|
} catch (e4) {
|
|
console.log(e4);
|
|
}
|
|
};
|
|
var dropTable = (db, table) => {
|
|
const sqlstr = `DROP TABLE IF EXISTS "${table}";`;
|
|
try {
|
|
db.exec(sqlstr);
|
|
} catch (e4) {
|
|
console.log(e4);
|
|
}
|
|
};
|
|
var insertIntoDB = (db, tables) => {
|
|
const sqlstr = Object.keys(tables).map((t4) => {
|
|
const tableFields = tables[t4].cols;
|
|
const rowsQuery = tables[t4].rows.reduce((prev, curr) => {
|
|
return `${prev} INSERT INTO "${t4}" VALUES (${tableFields.map((c4) => {
|
|
var _a2;
|
|
return `'${(_a2 = sanitizeSQLStatement(curr == null ? void 0 : curr[c4])) != null ? _a2 : ""}'`;
|
|
}).join(", ")});`;
|
|
}, "");
|
|
return rowsQuery;
|
|
}).join("; ");
|
|
try {
|
|
db.exec(`BEGIN TRANSACTION; ${sqlstr} COMMIT;`);
|
|
} catch (e4) {
|
|
console.log(e4);
|
|
}
|
|
};
|
|
var replaceDB = (db, tables) => {
|
|
const sqlstr = Object.keys(tables).map((t4) => {
|
|
const tableFields = tables[t4].cols;
|
|
const fieldQuery = uniq(tableFields).map((f4) => `'${sanitizeSQLStatement(f4)}' char`).join(", ");
|
|
const rowsQuery = tables[t4].rows.reduce((prev, curr) => {
|
|
return `${prev} REPLACE INTO "${t4}" VALUES (${tableFields.map((c4) => {
|
|
var _a2;
|
|
return `'${(_a2 = sanitizeSQLStatement(curr == null ? void 0 : curr[c4])) != null ? _a2 : ""}'`;
|
|
}).join(", ")});`;
|
|
}, "");
|
|
const idxQuery = tables[t4].uniques.filter((f4) => f4).reduce((p3, c4) => {
|
|
return `${p3} CREATE UNIQUE INDEX IF NOT EXISTS idx_${t4}_${c4.replace(
|
|
/,/g,
|
|
"_"
|
|
)} ON ${t4}(${c4});`;
|
|
}, "");
|
|
const insertQuery = `CREATE TABLE IF NOT EXISTS "${t4}" (${fieldQuery}); ${idxQuery} BEGIN TRANSACTION; ${rowsQuery} COMMIT;`;
|
|
return `DROP TABLE IF EXISTS "${t4}"; ${fieldQuery.length > 0 ? insertQuery : ""}`;
|
|
}).join("; ");
|
|
try {
|
|
db.exec(sqlstr);
|
|
} catch (e4) {
|
|
console.log(e4);
|
|
}
|
|
};
|
|
var saveDBToPath = async (plugin, path, tables) => {
|
|
const sqlJS = await plugin.sqlJS();
|
|
let db = await getDB(sqlJS, path);
|
|
replaceDB(db, tables);
|
|
await saveDBFile(path, db.export().buffer);
|
|
dispatchDatabaseFileChanged(path);
|
|
db.close();
|
|
return true;
|
|
};
|
|
|
|
// src/utils/contexts/mdb.ts
|
|
var dbTableToMDBTable = (table, schema, fields) => {
|
|
var _a2;
|
|
return {
|
|
schema,
|
|
cols: fields,
|
|
rows: (_a2 = table == null ? void 0 : table.rows) != null ? _a2 : []
|
|
};
|
|
};
|
|
var updateFieldsToSchema = (fields, tag) => {
|
|
if (tag) {
|
|
return [
|
|
...fields,
|
|
...defaultTagFields.rows.filter(
|
|
(f4) => !fields.some((g4) => g4.name == f4.name && g4.schemaId == f4.schemaId)
|
|
)
|
|
];
|
|
}
|
|
return [
|
|
...fields,
|
|
...defaultFolderFields.rows.filter(
|
|
(f4) => !fields.some((g4) => g4.name == f4.name && g4.schemaId == f4.schemaId)
|
|
)
|
|
];
|
|
};
|
|
var getMDBTable = async (plugin, table, path, tag) => {
|
|
const sqlJS = await plugin.sqlJS();
|
|
const buf = await getDBFile(path);
|
|
if (!buf) {
|
|
return null;
|
|
}
|
|
const db = new sqlJS.Database(new Uint8Array(buf));
|
|
await sanitizeTableSchema(plugin, db, path, tag);
|
|
let fieldsTables;
|
|
let schema;
|
|
try {
|
|
fieldsTables = dbResultsToDBTables(
|
|
db.exec(`SELECT * FROM m_fields WHERE schemaId = '${table}'`)
|
|
);
|
|
schema = dbResultsToDBTables(
|
|
db.exec(`SELECT * FROM m_schema WHERE id = '${table}'`)
|
|
)[0].rows[0];
|
|
} catch (e4) {
|
|
db.close();
|
|
return null;
|
|
}
|
|
if (fieldsTables.length == 0) {
|
|
db.close();
|
|
return {
|
|
schema,
|
|
cols: [],
|
|
rows: []
|
|
};
|
|
}
|
|
const fields = fieldsTables[0].rows.filter(
|
|
(f4) => f4.name.length > 0
|
|
);
|
|
const dbTable = dbResultsToDBTables(
|
|
db.exec(
|
|
`SELECT ${fields.reduce((p3, c4) => [...p3, `"${c4.name}"`], []).join(", ")} FROM "${table}"`
|
|
)
|
|
);
|
|
db.close();
|
|
return dbTableToMDBTable(
|
|
dbTable[0],
|
|
schema,
|
|
schema.primary ? updateFieldsToSchema(fields, tag) : fields
|
|
);
|
|
};
|
|
var deleteMDBTable = async (plugin, path, mdb) => {
|
|
const sqlJS = await plugin.sqlJS();
|
|
const buf = await getDBFile(path);
|
|
if (!buf) {
|
|
return false;
|
|
}
|
|
const db = new sqlJS.Database(new Uint8Array(buf));
|
|
deleteFromDB(db, "m_schema", `id = '${sanitizeSQLStatement(mdb)}'`);
|
|
deleteFromDB(db, "m_schema", `def = '${sanitizeSQLStatement(mdb)}'`);
|
|
deleteFromDB(db, "m_fields", `schemaId = '${sanitizeSQLStatement(mdb)}'`);
|
|
dropTable(db, mdb);
|
|
await saveDBFile(path, db.export().buffer);
|
|
db.close();
|
|
return true;
|
|
};
|
|
var getMDBTableSchemas = async (plugin, path, tag) => {
|
|
const sqlJS = await plugin.sqlJS();
|
|
const buf = await getDBFile(path);
|
|
if (!buf) {
|
|
return null;
|
|
}
|
|
const db = new sqlJS.Database(new Uint8Array(buf));
|
|
await sanitizeTableSchema(plugin, db, path, tag);
|
|
const tables = db.exec(`SELECT * FROM m_schema`);
|
|
db.close();
|
|
return tables[0].values.map((f4) => {
|
|
const [id2, name, type, def, predicate, primary] = f4;
|
|
return { id: id2, name, type, def, predicate, primary };
|
|
});
|
|
};
|
|
var getMDBSchema = async (plugin, path, schema) => {
|
|
const sqlJS = await plugin.sqlJS();
|
|
const buf = await getDBFile(path);
|
|
if (!buf) {
|
|
return null;
|
|
}
|
|
const db = new sqlJS.Database(new Uint8Array(buf));
|
|
const tables = db.exec(`SELECT * FROM m_schema WHERE id='${sanitizeSQLStatement(schema)}'`);
|
|
db.close();
|
|
if (!tables[0] || !tables[0].values[0]) {
|
|
return null;
|
|
}
|
|
return tables[0].values.map((f4) => {
|
|
const [id2, name, type, def, predicate, primary] = f4;
|
|
return { id: id2, name, type, def, predicate, primary };
|
|
})[0];
|
|
};
|
|
var saveMDBToPath = async (plugin, path, mdb) => {
|
|
var _a2, _b2;
|
|
const sqlJS = await plugin.sqlJS();
|
|
const buf = await getDBFile(path);
|
|
if (!buf) {
|
|
return null;
|
|
}
|
|
const db = new sqlJS.Database(new Uint8Array(buf));
|
|
const fieldsTables = dbResultsToDBTables(
|
|
db.exec(`SELECT * FROM m_fields WHERE schemaId != '${mdb.schema.id}'`)
|
|
);
|
|
const tables = {
|
|
m_fields: {
|
|
uniques: fieldSchema.uniques,
|
|
cols: fieldSchema.cols,
|
|
rows: [...(_b2 = (_a2 = fieldsTables[0]) == null ? void 0 : _a2.rows) != null ? _b2 : [], ...mdb.cols]
|
|
},
|
|
[mdb.schema.id]: {
|
|
uniques: mdb.cols.filter((c4) => c4.unique == "true").map((c4) => c4.name),
|
|
cols: mdb.cols.map((c4) => c4.name),
|
|
rows: mdb.rows
|
|
}
|
|
};
|
|
db.close();
|
|
return saveDBToPath(plugin, path, tables);
|
|
};
|
|
var optionValuesForColumn = (column, table) => {
|
|
var _a2;
|
|
return uniq(
|
|
(_a2 = table == null ? void 0 : table.rows.reduce((p3, c4) => {
|
|
return [...p3, ...splitString(c4[column])];
|
|
}, [])) != null ? _a2 : []
|
|
);
|
|
};
|
|
var createDefaultDB = async (plugin, path, tag) => {
|
|
const sqlJS = await plugin.sqlJS();
|
|
const table = tag ? defaultTagTables : defaultFolderTables;
|
|
return saveDBToPath(plugin, path, table);
|
|
};
|
|
var sanitizeTableSchema = async (plugin, db, path, tag) => {
|
|
const sqlJS = await plugin.sqlJS();
|
|
const tableRes = db.exec(
|
|
`SELECT name FROM sqlite_master WHERE type='table';`
|
|
);
|
|
if (!tableRes[0] || !tableRes[0].values.some((f4) => f4[0] == "m_schema") || !tableRes[0].values.some((f4) => f4[0] == "m_fields") || !tableRes[0].values.some((f4) => f4[0] == "files")) {
|
|
await createDefaultDB(plugin, path, tag);
|
|
}
|
|
};
|
|
var newRowByDBRow = (row) => ({
|
|
_id: genId(),
|
|
...row
|
|
});
|
|
var rowWithID = (row, tag) => {
|
|
return row._id && row._id.length > 0 ? row : {
|
|
...newRowByDBRow({ ...row, _source: tag ? "tag" : "folder" })
|
|
};
|
|
};
|
|
var createNewRow = (mdb, row, index) => {
|
|
if (index) {
|
|
return {
|
|
...mdb,
|
|
rows: insert(mdb.rows, index, newRowByDBRow(row))
|
|
};
|
|
}
|
|
return {
|
|
...mdb,
|
|
rows: [...mdb.rows, newRowByDBRow(row)]
|
|
};
|
|
};
|
|
var consolidateFilesToTable = async (plugin, path, table, files, tag) => {
|
|
const sqlJS = await plugin.sqlJS();
|
|
const isTag = tag ? true : false;
|
|
let db;
|
|
if (getAbstractFileAtPath(app, path)) {
|
|
const buf = await getDBFile(path);
|
|
db = new sqlJS.Database(new Uint8Array(buf));
|
|
} else {
|
|
db = new sqlJS.Database();
|
|
await createDefaultDB(plugin, path, false);
|
|
}
|
|
const mdbTable = await getMDBTable(plugin, table, path, isTag);
|
|
const missingFiles = files.filter((f4) => !mdbTable.rows.some((g4) => g4.File == f4 && g4._source != "")).map((f4) => ({ File: f4 }));
|
|
const mergeDuplicates = (rows, tag2) => {
|
|
const mergeFields = (row, row2) => {
|
|
return { ...row, ...row2 };
|
|
};
|
|
return rows.reduce((p3, c4) => {
|
|
const findIndex2 = p3.findIndex((f4) => f4._source != "" && f4.File == c4.File);
|
|
if (findIndex2 != -1) {
|
|
return p3.map((f4, i4) => i4 == findIndex2 ? mergeFields(f4, c4) : f4);
|
|
}
|
|
return [...p3, c4];
|
|
}, []);
|
|
};
|
|
let linkedFolderContexts = [""];
|
|
if (tag) {
|
|
const contexts = uniq(
|
|
mdbTable.rows.map((f4) => f4._source).filter((f4) => f4 != "" && f4 != "tag")
|
|
);
|
|
const promises = contexts.map(
|
|
(context) => getMDBTable(plugin, "files", context, false).then((f4) => [f4, context])
|
|
);
|
|
const results = await Promise.all(promises);
|
|
linkedFolderContexts.push(
|
|
...results.filter(([f4, g4]) => {
|
|
var _a2, _b2;
|
|
return (_b2 = (_a2 = f4 == null ? void 0 : f4.schema) == null ? void 0 : _a2.def) == null ? void 0 : _b2.split("&").some((h5) => h5 == tag);
|
|
}).map(([f4, g4]) => g4)
|
|
);
|
|
}
|
|
const nonLinkedRows = mdbTable.rows.filter(
|
|
(f4) => linkedFolderContexts.some((g4) => g4 == f4._source) && !missingFiles.some((g4) => f4.File == g4.File)
|
|
);
|
|
const newRows = [
|
|
...nonLinkedRows,
|
|
...[
|
|
...mergeDuplicates(
|
|
mdbTable.rows.filter(
|
|
(f4) => (f4._source != "" || missingFiles.some((g4) => f4.File == g4.File)) && files.some((g4) => g4 == f4.File)
|
|
),
|
|
isTag
|
|
),
|
|
...missingFiles
|
|
].map((f4) => rowWithID(f4, isTag))
|
|
];
|
|
const newMDBTable = {
|
|
...mdbTable,
|
|
cols: [
|
|
...(isTag ? defaultTagFields : defaultFolderFields).rows,
|
|
...mdbTable.cols
|
|
].filter(onlyUniqueProp("name")),
|
|
rows: newRows
|
|
};
|
|
await saveMDBToPath(plugin, path, newMDBTable);
|
|
db.close();
|
|
return newMDBTable;
|
|
};
|
|
var consolidateRowsToTag = async (plugin, path, table, source, rows) => {
|
|
const sqlJS = await plugin.sqlJS();
|
|
if (getAbstractFileAtPath(app, path)) {
|
|
} else {
|
|
await createDefaultDB(plugin, path, true);
|
|
}
|
|
const mdbTable = await getMDBTable(plugin, table, path, true);
|
|
const prevRows = mdbTable.rows.map((f4) => {
|
|
if (f4._source != source) {
|
|
return f4;
|
|
}
|
|
const row = rows.find((g4) => g4._id == f4._sourceId);
|
|
return row ? { ...f4, File: row["File"] } : f4;
|
|
}).filter(
|
|
(f4) => f4._source != source || rows.some((g4) => g4._id == f4._sourceId)
|
|
);
|
|
const missingRows = rows.filter(
|
|
(f4) => !mdbTable.rows.some((g4) => g4._source == source && g4._sourceId == f4._id)
|
|
).map(
|
|
(f4) => newRowByDBRow({ File: f4.File, _source: source, _sourceId: f4._id })
|
|
);
|
|
const newRows = [...prevRows, ...missingRows];
|
|
const newMDBTable = {
|
|
...mdbTable,
|
|
cols: [...defaultTagFields.rows, ...mdbTable.cols].filter(
|
|
onlyUniqueProp("name")
|
|
),
|
|
rows: newRows
|
|
};
|
|
await saveMDBToPath(plugin, path, newMDBTable);
|
|
return newMDBTable;
|
|
};
|
|
|
|
// src/components/ContextView/MDBContext.tsx
|
|
var MDBContext = B({
|
|
tables: [],
|
|
cols: [],
|
|
sortedColumns: [],
|
|
data: [],
|
|
filteredData: [],
|
|
tableData: null,
|
|
contextTable: {},
|
|
selectedRows: [],
|
|
selectRows: () => {
|
|
},
|
|
setContextTable: () => {
|
|
},
|
|
predicate: defaultPredicate,
|
|
savePredicate: () => {
|
|
},
|
|
saveDB: () => null,
|
|
saveContextDB: () => null,
|
|
schema: null,
|
|
dbSchema: null,
|
|
setSchema: () => {
|
|
},
|
|
setDBSchema: () => {
|
|
},
|
|
dbPath: null,
|
|
isFolderContext: false,
|
|
folderPath: "",
|
|
hideColumn: () => {
|
|
},
|
|
saveColumn: () => false,
|
|
newColumn: () => false,
|
|
sortColumn: () => {
|
|
},
|
|
delColumn: () => {
|
|
},
|
|
saveSchema: () => null,
|
|
deleteSchema: () => null,
|
|
tagContexts: [],
|
|
dbFileExists: false,
|
|
searchString: "",
|
|
setSearchString: () => {
|
|
},
|
|
loadContextFields: () => {
|
|
},
|
|
updateValue: () => {
|
|
},
|
|
updateFieldValue: () => {
|
|
}
|
|
});
|
|
var MDBProvider = (props2) => {
|
|
var _a2, _b2, _c2;
|
|
const { dbPath } = props2;
|
|
const [dbFileExists, setDBFileExists] = p2(false);
|
|
const [schema, setSchema] = p2(null);
|
|
const [searchString, setSearchString] = p2(null);
|
|
const [schemaTable, setSchemaTable] = p2(null);
|
|
const tables = (_a2 = schemaTable == null ? void 0 : schemaTable.rows) != null ? _a2 : [];
|
|
const [tableData, setTableData] = p2(null);
|
|
const [dbSchema, setDBSchema] = p2(null);
|
|
const [contextTable, setContextTable] = p2({});
|
|
const [predicate, setPredicate] = p2(defaultPredicate);
|
|
const [selectedRows, setSelectedRows] = p2([]);
|
|
const defaultSchema = props2.tag ? defaultTagSchema : defaultFolderSchema;
|
|
const folderPath = (_c2 = (_b2 = props2.folder) != null ? _b2 : props2.tag) != null ? _c2 : "";
|
|
const isFolderContext = props2.folder ? true : false;
|
|
const tagContexts = F(
|
|
() => {
|
|
var _a3, _b3, _c3;
|
|
return ((_a3 = dbSchema == null ? void 0 : dbSchema.def) == null ? void 0 : _a3.length) > 0 ? (_c3 = (_b3 = dbSchema == null ? void 0 : dbSchema.def) == null ? void 0 : _b3.split("&")) != null ? _c3 : [] : [];
|
|
},
|
|
[dbSchema]
|
|
);
|
|
const cols = F(
|
|
() => {
|
|
var _a3;
|
|
return [
|
|
...(_a3 = tableData == null ? void 0 : tableData.cols.map((f4) => ({ ...f4, table: "" }))) != null ? _a3 : [],
|
|
...tagContexts.reduce(
|
|
(p3, c4) => {
|
|
var _a4, _b3;
|
|
return [
|
|
...p3,
|
|
...(_b3 = (_a4 = contextTable[c4]) == null ? void 0 : _a4.cols.filter((f4) => f4.name != "File" && f4.type != "fileprop").map((f4) => ({ ...f4, table: c4 }))) != null ? _b3 : []
|
|
];
|
|
},
|
|
[]
|
|
)
|
|
];
|
|
},
|
|
[tableData, schema, contextTable, tagContexts]
|
|
);
|
|
const data = F(
|
|
() => {
|
|
var _a3;
|
|
return (_a3 = tableData == null ? void 0 : tableData.rows.map((r3, index) => linkContextRow({
|
|
_index: index.toString(),
|
|
...r3,
|
|
...tagContexts.reduce((p3, c4) => {
|
|
var _a4, _b3, _c3, _d2;
|
|
const contextRowIndexByFile = (_b3 = (_a4 = contextTable[c4]) == null ? void 0 : _a4.rows.findIndex((f4) => f4.File == r3.File)) != null ? _b3 : -1;
|
|
const contextRowsByFile = (_d2 = (_c3 = contextTable[c4]) == null ? void 0 : _c3.rows[contextRowIndexByFile]) != null ? _d2 : {};
|
|
const contextRowsWithKeysAppended = Object.keys(
|
|
contextRowsByFile
|
|
).reduce((pa, ca) => ({ ...pa, [ca + c4]: contextRowsByFile[ca] }), {
|
|
["_index" + c4]: contextRowIndexByFile.toString()
|
|
});
|
|
return { ...p3, ...contextRowsWithKeysAppended };
|
|
}, {})
|
|
}, cols, contextTable))) != null ? _a3 : [];
|
|
},
|
|
[tableData, schema, contextTable]
|
|
);
|
|
const sortedColumns = F(
|
|
() => {
|
|
return cols.filter((f4) => f4.hidden != "true" && !predicate.colsHidden.some((c4) => c4 == f4.name + f4.table)).sort(
|
|
(a5, b4) => predicate.colsOrder.findIndex((x5) => x5 == a5.name + a5.table) - predicate.colsOrder.findIndex((x5) => x5 == b4.name + b4.table)
|
|
);
|
|
},
|
|
[cols, predicate]
|
|
);
|
|
const filteredData = F(
|
|
() => data.filter((f4) => {
|
|
return predicate.filters.reduce((p3, c4) => {
|
|
return p3 ? filterReturnForCol(
|
|
cols.find((col) => col.name + col.table == c4.field),
|
|
c4,
|
|
f4
|
|
) : p3;
|
|
}, true);
|
|
}).filter(
|
|
(f4) => (searchString == null ? void 0 : searchString.length) > 0 ? matchAny(searchString).test(
|
|
Object.keys(f4).filter((g4) => g4.charAt(0) != "_").map((g4) => f4[g4]).join("|")
|
|
) : true
|
|
).sort((a5, b4) => {
|
|
return predicate.sort.reduce((p3, c4) => {
|
|
return p3 == 0 ? sortReturnForCol(
|
|
cols.find((col) => col.name + col.table == c4.field),
|
|
c4,
|
|
a5,
|
|
b4
|
|
) : p3;
|
|
}, 0);
|
|
}),
|
|
[predicate, data, cols, searchString]
|
|
);
|
|
const deleteSchema = async (table) => {
|
|
if (table.primary)
|
|
return;
|
|
const deleteResult = await deleteMDBTable(props2.plugin, dbPath, table.id);
|
|
if (deleteResult) {
|
|
const newSchemaTable = {
|
|
...schemaTable,
|
|
rows: schemaTable.rows.filter(
|
|
(f4) => f4.id != table.id && f4.def != table.id
|
|
)
|
|
};
|
|
setSchemaTable(newSchemaTable);
|
|
if (dbSchema.id == table.id) {
|
|
setDBSchema(
|
|
newSchemaTable.rows.find((g4) => g4.type == "db")
|
|
);
|
|
}
|
|
}
|
|
};
|
|
const saveSchema = async (table) => {
|
|
const newSchema = schemaTable.rows.find((f4) => f4.id == table.id) ? true : false;
|
|
const newSchemaTable = newSchema ? {
|
|
...schemaTable,
|
|
rows: schemaTable.rows.map((f4) => f4.id == table.id ? table : f4)
|
|
} : {
|
|
...schemaTable,
|
|
rows: [...schemaTable.rows, table]
|
|
};
|
|
await saveDBToPath(props2.plugin, dbPath, { m_schema: newSchemaTable });
|
|
if (table.id == (schema == null ? void 0 : schema.id)) {
|
|
setSchema(table);
|
|
}
|
|
if (table.id == (dbSchema == null ? void 0 : dbSchema.id)) {
|
|
setDBSchema(table);
|
|
setTableData((f4) => ({
|
|
...f4,
|
|
schema: table
|
|
}));
|
|
}
|
|
setSchemaTable(newSchemaTable);
|
|
};
|
|
const updateValue = (column, value, table, index, file) => {
|
|
var _a3, _b3;
|
|
const col = (_a3 = table == "" ? tableData : contextTable[table]) == null ? void 0 : _a3.cols.find(
|
|
(f4) => f4.name == column
|
|
);
|
|
if (col)
|
|
saveFrontmatterValue(props2.plugin, file != null ? file : (_b3 = tableData.rows[index]) == null ? void 0 : _b3.File, column, value, col.type, props2.plugin.settings.saveAllContextToFrontmatter);
|
|
if (table == "") {
|
|
saveDB2({
|
|
...tableData,
|
|
rows: tableData.rows.map(
|
|
(r3, i4) => i4 == index ? {
|
|
...r3,
|
|
[column]: value
|
|
} : r3
|
|
)
|
|
});
|
|
} else if (contextTable[table]) {
|
|
saveContextDB(
|
|
{
|
|
...contextTable[table],
|
|
rows: contextTable[table].rows.map(
|
|
(r3, i4) => i4 == index ? {
|
|
...r3,
|
|
[column]: value
|
|
} : r3
|
|
)
|
|
},
|
|
table
|
|
);
|
|
}
|
|
};
|
|
const sortColumn = (sort) => {
|
|
savePredicate({
|
|
...predicate,
|
|
sort: [sort]
|
|
});
|
|
};
|
|
const hideColumn = (col, hidden) => {
|
|
savePredicate({
|
|
...predicate,
|
|
colsHidden: hidden ? [...predicate.colsHidden.filter((s5) => s5 != col.name + col.table), col.name + col.table] : predicate.colsHidden.filter((s5) => s5 != col.name + col.table)
|
|
});
|
|
};
|
|
const updateFieldValue = (column, fieldValue, value, table, index, file) => {
|
|
var _a3;
|
|
const col = tableData.cols.find((f4) => f4.name == column);
|
|
saveFrontmatterValue(props2.plugin, file != null ? file : (_a3 = tableData.rows[index]) == null ? void 0 : _a3.File, column, value, col.type, props2.plugin.settings.saveAllContextToFrontmatter);
|
|
if (table == "") {
|
|
const newTable = {
|
|
...tableData,
|
|
cols: tableData.cols.map(
|
|
(m5) => m5.name == column ? {
|
|
...m5,
|
|
value: fieldValue
|
|
} : m5
|
|
),
|
|
rows: tableData.rows.map(
|
|
(r3, i4) => i4 == index ? {
|
|
...r3,
|
|
[column]: value
|
|
} : r3
|
|
)
|
|
};
|
|
saveDB2(newTable);
|
|
} else if (contextTable[table]) {
|
|
saveContextDB(
|
|
{
|
|
...contextTable[table],
|
|
cols: contextTable[table].cols.map(
|
|
(m5) => m5.name == column ? {
|
|
...m5,
|
|
value: fieldValue
|
|
} : m5
|
|
),
|
|
rows: contextTable[table].rows.map(
|
|
(r3, i4) => i4 == index ? {
|
|
...r3,
|
|
[column]: value
|
|
} : r3
|
|
)
|
|
},
|
|
table
|
|
);
|
|
}
|
|
};
|
|
const syncAllMetadata = (f4) => {
|
|
const files = f4.rows.map((f5) => f5.File);
|
|
const importYAML = (files2, fmKeys) => {
|
|
return files2.map((f5) => getAbstractFileAtPath(app, f5)).filter((f5) => f5).reduce(
|
|
(p3, c4) => {
|
|
const fm = frontMatterForFile(c4);
|
|
if (!fm)
|
|
return p3;
|
|
return {
|
|
uniques: [],
|
|
cols: uniq([...p3.cols, ...fmKeys]),
|
|
rows: [
|
|
...p3.rows,
|
|
{
|
|
File: c4.path,
|
|
...fmKeys.reduce((p4, c5) => {
|
|
const value = parseFrontMatter(c5, fm[c5], false);
|
|
if ((value == null ? void 0 : value.length) > 0)
|
|
return { ...p4, [c5]: value };
|
|
return p4;
|
|
}, {})
|
|
}
|
|
]
|
|
};
|
|
},
|
|
{ uniques: [], cols: [], rows: [] }
|
|
);
|
|
};
|
|
const yamlTableData = importYAML(
|
|
files,
|
|
f4.cols.filter((f5) => !f5.type.contains("file")).map((f5) => f5.name)
|
|
);
|
|
saveDB2({
|
|
...f4,
|
|
rows: f4.rows.map((r3) => {
|
|
const fmRow = yamlTableData.rows.find((f5) => f5.File == r3.File);
|
|
if (fmRow) {
|
|
return {
|
|
...r3,
|
|
...fmRow
|
|
};
|
|
}
|
|
return r3;
|
|
})
|
|
});
|
|
};
|
|
h2(() => {
|
|
if (props2.schema && schemaTable && (dbSchema == null ? void 0 : dbSchema.id) != props2.schema) {
|
|
const preselectSchema = schemaTable.rows.find(
|
|
(g4) => g4.id == props2.schema
|
|
);
|
|
if (preselectSchema) {
|
|
if (preselectSchema.type == "db") {
|
|
setDBSchema(preselectSchema);
|
|
return;
|
|
} else {
|
|
const preselectDBSchema = schemaTable.rows.find(
|
|
(g4) => g4.id == preselectSchema.def
|
|
);
|
|
if (preselectDBSchema) {
|
|
setDBSchema(preselectDBSchema);
|
|
return;
|
|
}
|
|
}
|
|
} else {
|
|
const newSchema = {
|
|
id: uniqueNameFromString(
|
|
sanitizeTableName(props2.schema),
|
|
schemaTable.rows.map((g4) => g4.id)
|
|
),
|
|
name: props2.schema,
|
|
type: "db"
|
|
};
|
|
setDBSchema(newSchema);
|
|
saveSchema(newSchema).then(
|
|
(f4) => saveDB2({
|
|
schema: newSchema,
|
|
cols: defaultTableFields.map((g4) => ({
|
|
...g4,
|
|
schemaId: newSchema.id
|
|
})),
|
|
rows: []
|
|
})
|
|
);
|
|
}
|
|
}
|
|
}, [schemaTable]);
|
|
const loadTables = async () => {
|
|
if (getAbstractFileAtPath(app, props2.dbPath)) {
|
|
setDBFileExists(true);
|
|
getMDBTableSchemas(
|
|
props2.plugin,
|
|
props2.dbPath,
|
|
props2.tag ? true : false
|
|
).then((f4) => {
|
|
setSchemaTable({
|
|
...defaultSchema,
|
|
rows: f4
|
|
});
|
|
if (!props2.schema)
|
|
setDBSchema(f4 == null ? void 0 : f4.find((g4) => g4.type == "db"));
|
|
});
|
|
} else {
|
|
if (props2.schema) {
|
|
saveDB2(props2.tag ? defaultTagMDBTable : defaultFolderMDBTable).then(
|
|
(f4) => {
|
|
setSchemaTable(defaultSchema);
|
|
}
|
|
);
|
|
} else {
|
|
setSchemaTable(defaultSchema);
|
|
setDBSchema(defaultFileDBSchema);
|
|
}
|
|
}
|
|
};
|
|
const refreshTags = async (evt) => {
|
|
if (!dbFileExists) {
|
|
loadDefaultTableData();
|
|
} else {
|
|
if (dbSchema.primary) {
|
|
runDef();
|
|
} else {
|
|
getMDBData();
|
|
}
|
|
}
|
|
};
|
|
const refreshSpace = async (evt) => {
|
|
if (!dbFileExists) {
|
|
loadDefaultTableData();
|
|
}
|
|
};
|
|
const getMDBData = () => {
|
|
getMDBTable(props2.plugin, dbSchema.id, dbPath, !isFolderContext).then(
|
|
(f4) => setTableData(f4)
|
|
);
|
|
};
|
|
const refreshSchema = (schema2) => {
|
|
};
|
|
const refreshMDB = async (evt) => {
|
|
if (!dbFileExists || (dbSchema == null ? void 0 : dbSchema.primary) != "true") {
|
|
return;
|
|
}
|
|
if (evt.detail.dbPath == dbPath) {
|
|
if (dbSchema) {
|
|
if (schema)
|
|
getMDBSchema(props2.plugin, dbPath, schema.id).then((f4) => {
|
|
if (f4) {
|
|
setSchema(f4);
|
|
const newSchemaTable = {
|
|
...schemaTable,
|
|
rows: schemaTable.rows.map((s5) => s5.id == f4.id ? f4 : s5)
|
|
};
|
|
setSchemaTable(newSchemaTable);
|
|
}
|
|
});
|
|
getMDBTable(props2.plugin, dbSchema.id, dbPath, !isFolderContext).then(
|
|
(f4) => setTableData(f4)
|
|
);
|
|
}
|
|
} else {
|
|
const tag = Object.keys(contextTable).find(
|
|
(t4) => tagContextFromTag(props2.plugin, t4) == evt.detail.dbPath
|
|
);
|
|
if (tag)
|
|
loadContextFields(tag);
|
|
}
|
|
};
|
|
h2(() => {
|
|
window.addEventListener(eventTypes.mdbChange, refreshMDB);
|
|
window.addEventListener(eventTypes.spacesChange, refreshSpace);
|
|
window.addEventListener(eventTypes.tagsChange, refreshTags);
|
|
return () => {
|
|
window.removeEventListener(eventTypes.mdbChange, refreshMDB);
|
|
window.removeEventListener(eventTypes.spacesChange, refreshSpace);
|
|
window.removeEventListener(eventTypes.tagsChange, refreshTags);
|
|
};
|
|
}, [contextTable, dbSchema, dbPath, schema]);
|
|
h2(() => {
|
|
loadTables();
|
|
}, [dbPath]);
|
|
const saveDB2 = async (newTable) => {
|
|
var _a3;
|
|
if (!dbFileExists) {
|
|
const defaultFields = isFolderContext ? defaultFolderFields : defaultTagFields;
|
|
const defaultTable = isFolderContext ? defaultFolderTables : defaultTagTables;
|
|
const dbField = {
|
|
...defaultTable,
|
|
m_fields: {
|
|
uniques: defaultFields.uniques,
|
|
cols: defaultFields.cols,
|
|
rows: [...(_a3 = defaultFields.rows) != null ? _a3 : [], ...newTable.cols]
|
|
},
|
|
[newTable.schema.id]: {
|
|
uniques: newTable.cols.filter((c4) => c4.unique == "true").map((c4) => c4.name),
|
|
cols: newTable.cols.map((c4) => c4.name),
|
|
rows: newTable.rows
|
|
}
|
|
};
|
|
await saveDBToPath(props2.plugin, dbPath, dbField).then((f4) => {
|
|
setDBFileExists(true);
|
|
f4 ? setTableData(newTable) : new import_obsidian6.Notice("DB ERROR");
|
|
});
|
|
} else {
|
|
await saveMDBToPath(props2.plugin, dbPath, newTable).then((f4) => {
|
|
setDBFileExists(true);
|
|
f4 ? setTableData(newTable) : new import_obsidian6.Notice("DB ERROR");
|
|
});
|
|
}
|
|
};
|
|
h2(() => {
|
|
var _a3;
|
|
if (!schemaTable || !dbSchema)
|
|
return;
|
|
const _schema = (schema == null ? void 0 : schema.def) == dbSchema.id ? schema : (_a3 = schemaTable.rows.find((f4) => f4.def == dbSchema.id)) != null ? _a3 : {
|
|
...dbSchema,
|
|
id: uniqueNameFromString(
|
|
dbSchema.id + "View",
|
|
schemaTable.rows.map((f4) => f4.id)
|
|
),
|
|
type: "table",
|
|
def: dbSchema.id
|
|
};
|
|
if (_schema) {
|
|
setSchema(_schema);
|
|
if (dbFileExists) {
|
|
if (dbSchema.primary) {
|
|
runDef();
|
|
} else {
|
|
getMDBData();
|
|
}
|
|
} else {
|
|
loadDefaultTableData();
|
|
}
|
|
}
|
|
}, [dbSchema]);
|
|
h2(() => {
|
|
if (dbFileExists)
|
|
parsePredicate(schema == null ? void 0 : schema.predicate);
|
|
}, [schema]);
|
|
h2(() => {
|
|
if (dbFileExists && tableData)
|
|
getContextTags(tableData);
|
|
}, [tableData]);
|
|
const selectRows = (lastSelected, rows) => {
|
|
if (lastSelected) {
|
|
const path = tableData.rows[parseInt(lastSelected)].File;
|
|
let evt = new CustomEvent(eventTypes.selectedFileChange, {
|
|
detail: { filePath: path }
|
|
});
|
|
window.dispatchEvent(evt);
|
|
} else {
|
|
let evt = new CustomEvent(eventTypes.selectedFileChange, {
|
|
detail: { filePath: null }
|
|
});
|
|
window.dispatchEvent(evt);
|
|
}
|
|
setSelectedRows(rows);
|
|
};
|
|
const loadDefaultTableData = () => {
|
|
let files;
|
|
if (props2.folder) {
|
|
files = folderChildren(
|
|
props2.plugin,
|
|
getAbstractFileAtPath(props2.plugin.app, props2.folder)
|
|
);
|
|
setTableData({
|
|
...isFolderContext ? defaultFolderMDBTable : defaultTagMDBTable,
|
|
rows: files.map(
|
|
(f4) => newRowByDBRow({ _source: "folder", File: f4.path })
|
|
)
|
|
});
|
|
} else if (props2.tag) {
|
|
files = getAllFilesForTag(props2.tag).map((f4) => getAbstractFileAtPath(app, f4)).filter((f4) => f4);
|
|
setTableData({
|
|
...isFolderContext ? defaultFolderMDBTable : defaultTagMDBTable,
|
|
rows: files.map((f4) => newRowByDBRow({ _source: "tag", File: f4.path }))
|
|
});
|
|
}
|
|
};
|
|
const getContextTags = async (_tableData) => {
|
|
const contextFields = _tableData.cols.filter((f4) => f4.type.contains("context")).map((f4) => f4.value).filter((f4) => !tagContexts.some((g4) => g4 == f4));
|
|
for (let c4 of contextFields) {
|
|
loadContextFields(c4);
|
|
}
|
|
};
|
|
const runDef = async () => {
|
|
let files;
|
|
if (props2.folder) {
|
|
files = folderChildren(
|
|
props2.plugin,
|
|
getAbstractFileAtPath(props2.plugin.app, props2.folder)
|
|
);
|
|
consolidateFilesToTable(
|
|
props2.plugin,
|
|
dbPath,
|
|
dbSchema.id,
|
|
files.map((f4) => f4.path)
|
|
).then((f4) => {
|
|
for (let c4 of tagContexts) {
|
|
loadTagContext(c4, f4.rows);
|
|
}
|
|
setTableData(f4);
|
|
return f4;
|
|
}).then((f4) => syncAllMetadata(f4));
|
|
} else if (props2.tag) {
|
|
files = getAllFilesForTag(props2.tag).map((f4) => getAbstractFileAtPath(app, f4)).filter((f4) => f4);
|
|
consolidateFilesToTable(
|
|
props2.plugin,
|
|
dbPath,
|
|
dbSchema.id,
|
|
files.map((f4) => f4.path),
|
|
props2.tag
|
|
).then((f4) => {
|
|
for (let c4 of tagContexts) {
|
|
loadTagContext(c4, f4.rows);
|
|
}
|
|
setTableData(f4);
|
|
return f4;
|
|
}).then((f4) => syncAllMetadata(f4));
|
|
}
|
|
};
|
|
const loadTagContext = async (tag, files) => {
|
|
consolidateRowsToTag(
|
|
props2.plugin,
|
|
tagContextFromTag(props2.plugin, tag),
|
|
dbSchema.id,
|
|
dbPath,
|
|
files
|
|
).then((f4) => {
|
|
if (f4) {
|
|
const contextFields = f4.cols.filter((g4) => g4.type.contains("context")).map((g4) => g4.value).filter((g4) => !tagContexts.some((h5) => h5 == g4));
|
|
for (let c4 of contextFields) {
|
|
loadContextFields(c4);
|
|
}
|
|
setContextTable((t4) => ({
|
|
...t4,
|
|
[tag]: f4
|
|
}));
|
|
}
|
|
});
|
|
};
|
|
const loadContextFields = async (tag) => {
|
|
getMDBTable(
|
|
props2.plugin,
|
|
"files",
|
|
tagContextFromTag(props2.plugin, tag),
|
|
true
|
|
).then((f4) => {
|
|
setContextTable((t4) => ({
|
|
...t4,
|
|
[tag]: f4
|
|
}));
|
|
});
|
|
};
|
|
const tagExists = (currentCache, findTag) => {
|
|
let currentTags = [];
|
|
if ((0, import_obsidian6.getAllTags)(currentCache)) {
|
|
currentTags = (0, import_obsidian6.getAllTags)(currentCache);
|
|
}
|
|
return currentTags.find((tag) => tag.toLowerCase() == findTag.toLowerCase()) ? true : false;
|
|
};
|
|
const getAllFilesForTag = (tag) => {
|
|
let tagsCache = [];
|
|
(() => {
|
|
app.vault.getMarkdownFiles().forEach((tfile) => {
|
|
let currentCache;
|
|
if (app.metadataCache.getFileCache(tfile) !== null) {
|
|
currentCache = app.metadataCache.getFileCache(tfile);
|
|
}
|
|
let relativePath = tfile.path;
|
|
const hasTag = tagExists(currentCache, tag);
|
|
if (hasTag) {
|
|
tagsCache.push(relativePath);
|
|
}
|
|
});
|
|
})();
|
|
return tagsCache;
|
|
};
|
|
const saveContextDB = async (newTable, context) => {
|
|
const dbPath2 = tagContextFromTag(props2.plugin, context);
|
|
await saveMDBToPath(props2.plugin, dbPath2, newTable).then(
|
|
(f4) => f4 && setContextTable((t4) => ({
|
|
...t4,
|
|
[context]: newTable
|
|
}))
|
|
);
|
|
};
|
|
const savePredicate = (newPredicate) => {
|
|
const cleanedPredicate = validatePredicate(newPredicate);
|
|
saveSchema({
|
|
...schema,
|
|
predicate: JSON.stringify(cleanedPredicate)
|
|
});
|
|
setPredicate(cleanedPredicate);
|
|
};
|
|
h2(() => {
|
|
setPredicate((p3) => ({
|
|
...p3,
|
|
colsOrder: uniq([
|
|
...p3.colsOrder,
|
|
...cols.filter((f4) => f4.hidden != "true").map((c4) => c4.name + c4.table)
|
|
])
|
|
}));
|
|
}, [cols]);
|
|
const parsePredicate = (predicateStr) => {
|
|
const newPredicate = safelyParseJSON(predicateStr);
|
|
setPredicate(validatePredicate(newPredicate));
|
|
};
|
|
const delColumn = (column) => {
|
|
let mdbtable;
|
|
const table = column.table;
|
|
if (table == "") {
|
|
mdbtable = tableData;
|
|
} else if (contextTable[table]) {
|
|
mdbtable = contextTable[table];
|
|
}
|
|
const newFields = mdbtable.cols.filter(
|
|
(f4, i4) => f4.name != column.name
|
|
);
|
|
const newTable = {
|
|
...mdbtable,
|
|
cols: newFields,
|
|
rows: mdbtable.rows.map((r3) => {
|
|
const { [column.name]: val, ...rest } = r3;
|
|
return rest;
|
|
})
|
|
};
|
|
if (table == "") {
|
|
saveDB2(newTable);
|
|
} else if (contextTable[table]) {
|
|
saveContextDB(newTable, table);
|
|
}
|
|
};
|
|
const newColumn = (col) => {
|
|
return saveColumn(col);
|
|
};
|
|
const saveColumn = (newColumn2, oldColumn) => {
|
|
let mdbtable;
|
|
const column = {
|
|
...newColumn2,
|
|
name: sanitizeColumnName(newColumn2.name)
|
|
};
|
|
const table = column.table;
|
|
if (table == "") {
|
|
mdbtable = tableData;
|
|
} else if (contextTable[table]) {
|
|
mdbtable = contextTable[table];
|
|
}
|
|
if (column.name == "") {
|
|
new import_obsidian6.Notice(i18n_default.notice.noPropertyName);
|
|
return false;
|
|
}
|
|
if (!oldColumn && mdbtable.cols.find(
|
|
(f4) => f4.name.toLowerCase() == column.name.toLowerCase()
|
|
) || oldColumn && oldColumn.name != column.name && mdbtable.cols.find(
|
|
(f4) => f4.name.toLowerCase() == column.name.toLowerCase()
|
|
)) {
|
|
new import_obsidian6.Notice(i18n_default.notice.duplicatePropertyName);
|
|
return false;
|
|
}
|
|
const oldFieldIndex = oldColumn ? mdbtable.cols.findIndex((f4) => f4.name == oldColumn.name) : -1;
|
|
const newFields = oldFieldIndex == -1 ? [...mdbtable.cols, column] : mdbtable.cols.map((f4, i4) => i4 == oldFieldIndex ? column : f4);
|
|
const newTable = {
|
|
...mdbtable,
|
|
cols: newFields,
|
|
rows: mdbtable.rows.map(
|
|
(f4) => oldColumn ? {
|
|
...f4,
|
|
[column.name]: f4[oldColumn.name],
|
|
oldColumn: void 0
|
|
} : f4
|
|
)
|
|
};
|
|
if (oldColumn)
|
|
savePredicate({
|
|
filters: predicate.filters.map(
|
|
(f4) => f4.field == oldColumn.name + oldColumn.table ? { ...f4, field: column.name + column.table } : f4
|
|
),
|
|
sort: predicate.sort.map(
|
|
(f4) => f4.field == oldColumn.name + oldColumn.table ? { ...f4, field: column.name + column.table } : f4
|
|
),
|
|
groupBy: predicate.groupBy.map(
|
|
(f4) => f4 == oldColumn.name + oldColumn.table ? column.name + column.table : f4
|
|
),
|
|
colsHidden: predicate.colsHidden.map(
|
|
(f4) => f4 == oldColumn.name + oldColumn.table ? column.name + column.table : f4
|
|
),
|
|
colsOrder: predicate.colsOrder.map(
|
|
(f4) => f4 == oldColumn.name + oldColumn.table ? column.name + column.table : f4
|
|
),
|
|
colsSize: {
|
|
...predicate.colsSize,
|
|
[column.name + column.table]: predicate.colsSize[oldColumn.name + oldColumn.table],
|
|
[oldColumn.name + oldColumn.table]: void 0
|
|
}
|
|
});
|
|
if (table == "") {
|
|
syncAllMetadata(newTable);
|
|
} else if (contextTable[table]) {
|
|
saveContextDB(newTable, table);
|
|
}
|
|
return true;
|
|
};
|
|
return /* @__PURE__ */ bn.createElement(MDBContext.Provider, {
|
|
value: {
|
|
data,
|
|
filteredData,
|
|
loadContextFields,
|
|
selectedRows,
|
|
selectRows,
|
|
tableData,
|
|
cols,
|
|
sortedColumns,
|
|
contextTable,
|
|
setContextTable,
|
|
predicate,
|
|
savePredicate,
|
|
saveDB: saveDB2,
|
|
saveContextDB,
|
|
schema,
|
|
dbPath,
|
|
saveColumn,
|
|
hideColumn,
|
|
sortColumn,
|
|
delColumn,
|
|
newColumn,
|
|
tagContexts,
|
|
tables,
|
|
setSchema,
|
|
saveSchema,
|
|
deleteSchema,
|
|
dbFileExists,
|
|
dbSchema,
|
|
searchString,
|
|
setSearchString,
|
|
folderPath,
|
|
isFolderContext,
|
|
setDBSchema,
|
|
updateValue,
|
|
updateFieldValue
|
|
}
|
|
}, props2.children);
|
|
};
|
|
|
|
// src/components/ContextView/CardsView/CardView.tsx
|
|
var import_classnames = __toESM(require_classnames());
|
|
|
|
// src/components/FlowEditor/FlowView.tsx
|
|
var FlowView = (props2) => {
|
|
const ref = _2(null);
|
|
const loadFile = async () => {
|
|
const div = ref.current;
|
|
const [link, refStr] = parseOutReferences(props2.path);
|
|
const type = viewTypeByString(link);
|
|
const portalType = type == "tag" || type == "folder" ? "context" : "doc";
|
|
const leaf = await spawnLeafFromFile(props2.plugin, link, div, portalType, refStr, props2.from, props2.to);
|
|
};
|
|
const toggleFlow = () => {
|
|
if (props2.load) {
|
|
loadFile();
|
|
} else {
|
|
ref.current.empty();
|
|
}
|
|
};
|
|
h2(() => {
|
|
toggleFlow();
|
|
}, [props2.load, props2.path, props2.from, props2.to]);
|
|
return /* @__PURE__ */ bn.createElement("div", {
|
|
className: "mk-flowspace-editor",
|
|
ref
|
|
});
|
|
};
|
|
|
|
// node_modules/@tanstack/table-core/build/lib/index.mjs
|
|
function functionalUpdate(updater, input) {
|
|
return typeof updater === "function" ? updater(input) : updater;
|
|
}
|
|
function makeStateUpdater(key2, instance) {
|
|
return (updater) => {
|
|
instance.setState((old) => {
|
|
return {
|
|
...old,
|
|
[key2]: functionalUpdate(updater, old[key2])
|
|
};
|
|
});
|
|
};
|
|
}
|
|
function isFunction(d5) {
|
|
return d5 instanceof Function;
|
|
}
|
|
function flattenBy(arr, getChildren) {
|
|
const flat = [];
|
|
const recurse = (subArr) => {
|
|
subArr.forEach((item) => {
|
|
flat.push(item);
|
|
const children = getChildren(item);
|
|
if (children == null ? void 0 : children.length) {
|
|
recurse(children);
|
|
}
|
|
});
|
|
};
|
|
recurse(arr);
|
|
return flat;
|
|
}
|
|
function memo(getDeps, fn2, opts) {
|
|
let deps = [];
|
|
let result;
|
|
return () => {
|
|
var _a2;
|
|
let depTime;
|
|
if (opts.key && opts.debug)
|
|
depTime = Date.now();
|
|
const newDeps = getDeps();
|
|
const depsChanged = newDeps.length !== deps.length || newDeps.some((dep, index) => deps[index] !== dep);
|
|
if (!depsChanged) {
|
|
return result;
|
|
}
|
|
deps = newDeps;
|
|
let resultTime;
|
|
if (opts.key && opts.debug)
|
|
resultTime = Date.now();
|
|
result = fn2(...newDeps);
|
|
(_a2 = opts == null ? void 0 : opts.onChange) == null ? void 0 : _a2.call(opts, result);
|
|
if (opts.key && opts.debug) {
|
|
if (opts == null ? void 0 : opts.debug()) {
|
|
const depEndTime = Math.round((Date.now() - depTime) * 100) / 100;
|
|
const resultEndTime = Math.round((Date.now() - resultTime) * 100) / 100;
|
|
const resultFpsPercentage = resultEndTime / 16;
|
|
const pad = (str, num) => {
|
|
str = String(str);
|
|
while (str.length < num) {
|
|
str = " " + str;
|
|
}
|
|
return str;
|
|
};
|
|
console.info(`%c\u23F1 ${pad(resultEndTime, 5)} /${pad(depEndTime, 5)} ms`, `
|
|
font-size: .6rem;
|
|
font-weight: bold;
|
|
color: hsl(${Math.max(0, Math.min(120 - 120 * resultFpsPercentage, 120))}deg 100% 31%);`, opts == null ? void 0 : opts.key);
|
|
}
|
|
}
|
|
return result;
|
|
};
|
|
}
|
|
function createColumn(table, columnDef, depth, parent) {
|
|
var _ref, _resolvedColumnDef$id;
|
|
const defaultColumn = table._getDefaultColumnDef();
|
|
const resolvedColumnDef = {
|
|
...defaultColumn,
|
|
...columnDef
|
|
};
|
|
const accessorKey = resolvedColumnDef.accessorKey;
|
|
let id2 = (_ref = (_resolvedColumnDef$id = resolvedColumnDef.id) != null ? _resolvedColumnDef$id : accessorKey ? accessorKey.replace(".", "_") : void 0) != null ? _ref : typeof resolvedColumnDef.header === "string" ? resolvedColumnDef.header : void 0;
|
|
let accessorFn;
|
|
if (resolvedColumnDef.accessorFn) {
|
|
accessorFn = resolvedColumnDef.accessorFn;
|
|
} else if (accessorKey) {
|
|
if (accessorKey.includes(".")) {
|
|
accessorFn = (originalRow) => {
|
|
let result = originalRow;
|
|
for (const key2 of accessorKey.split(".")) {
|
|
result = result[key2];
|
|
if (result === void 0) {
|
|
throw new Error(`"${key2}" in deeply nested key "${accessorKey}" returned undefined.`);
|
|
}
|
|
}
|
|
return result;
|
|
};
|
|
} else {
|
|
accessorFn = (originalRow) => originalRow[resolvedColumnDef.accessorKey];
|
|
}
|
|
}
|
|
if (!id2) {
|
|
if (true) {
|
|
throw new Error(resolvedColumnDef.accessorFn ? `Columns require an id when using an accessorFn` : `Columns require an id when using a non-string header`);
|
|
}
|
|
throw new Error();
|
|
}
|
|
let column = {
|
|
id: `${String(id2)}`,
|
|
accessorFn,
|
|
parent,
|
|
depth,
|
|
columnDef: resolvedColumnDef,
|
|
columns: [],
|
|
getFlatColumns: memo(() => [true], () => {
|
|
var _a2;
|
|
return [column, ...(_a2 = column.columns) == null ? void 0 : _a2.flatMap((d5) => d5.getFlatColumns())];
|
|
}, {
|
|
key: false,
|
|
debug: () => {
|
|
var _table$options$debugA;
|
|
return (_table$options$debugA = table.options.debugAll) != null ? _table$options$debugA : table.options.debugColumns;
|
|
}
|
|
}),
|
|
getLeafColumns: memo(() => [table._getOrderColumnsFn()], (orderColumns2) => {
|
|
var _a2;
|
|
if ((_a2 = column.columns) == null ? void 0 : _a2.length) {
|
|
let leafColumns = column.columns.flatMap((column2) => column2.getLeafColumns());
|
|
return orderColumns2(leafColumns);
|
|
}
|
|
return [column];
|
|
}, {
|
|
key: false,
|
|
debug: () => {
|
|
var _table$options$debugA2;
|
|
return (_table$options$debugA2 = table.options.debugAll) != null ? _table$options$debugA2 : table.options.debugColumns;
|
|
}
|
|
})
|
|
};
|
|
column = table._features.reduce((obj, feature) => {
|
|
var _a2;
|
|
return Object.assign(obj, (_a2 = feature.createColumn) == null ? void 0 : _a2.call(feature, column, table));
|
|
}, column);
|
|
return column;
|
|
}
|
|
function createHeader(table, column, options) {
|
|
var _options$id;
|
|
const id2 = (_options$id = options.id) != null ? _options$id : column.id;
|
|
let header = {
|
|
id: id2,
|
|
column,
|
|
index: options.index,
|
|
isPlaceholder: !!options.isPlaceholder,
|
|
placeholderId: options.placeholderId,
|
|
depth: options.depth,
|
|
subHeaders: [],
|
|
colSpan: 0,
|
|
rowSpan: 0,
|
|
headerGroup: null,
|
|
getLeafHeaders: () => {
|
|
const leafHeaders = [];
|
|
const recurseHeader = (h5) => {
|
|
if (h5.subHeaders && h5.subHeaders.length) {
|
|
h5.subHeaders.map(recurseHeader);
|
|
}
|
|
leafHeaders.push(h5);
|
|
};
|
|
recurseHeader(header);
|
|
return leafHeaders;
|
|
},
|
|
getContext: () => ({
|
|
table,
|
|
header,
|
|
column
|
|
})
|
|
};
|
|
table._features.forEach((feature) => {
|
|
var _a2;
|
|
Object.assign(header, (_a2 = feature.createHeader) == null ? void 0 : _a2.call(feature, header, table));
|
|
});
|
|
return header;
|
|
}
|
|
var Headers = {
|
|
createTable: (table) => {
|
|
return {
|
|
getHeaderGroups: memo(() => [table.getAllColumns(), table.getVisibleLeafColumns(), table.getState().columnPinning.left, table.getState().columnPinning.right], (allColumns, leafColumns, left, right) => {
|
|
var _left$map$filter, _right$map$filter;
|
|
const leftColumns = (_left$map$filter = left == null ? void 0 : left.map((columnId) => leafColumns.find((d5) => d5.id === columnId)).filter(Boolean)) != null ? _left$map$filter : [];
|
|
const rightColumns = (_right$map$filter = right == null ? void 0 : right.map((columnId) => leafColumns.find((d5) => d5.id === columnId)).filter(Boolean)) != null ? _right$map$filter : [];
|
|
const centerColumns = leafColumns.filter((column) => !(left == null ? void 0 : left.includes(column.id)) && !(right == null ? void 0 : right.includes(column.id)));
|
|
const headerGroups = buildHeaderGroups(allColumns, [...leftColumns, ...centerColumns, ...rightColumns], table);
|
|
return headerGroups;
|
|
}, {
|
|
key: "getHeaderGroups",
|
|
debug: () => {
|
|
var _table$options$debugA;
|
|
return (_table$options$debugA = table.options.debugAll) != null ? _table$options$debugA : table.options.debugHeaders;
|
|
}
|
|
}),
|
|
getCenterHeaderGroups: memo(() => [table.getAllColumns(), table.getVisibleLeafColumns(), table.getState().columnPinning.left, table.getState().columnPinning.right], (allColumns, leafColumns, left, right) => {
|
|
leafColumns = leafColumns.filter((column) => !(left == null ? void 0 : left.includes(column.id)) && !(right == null ? void 0 : right.includes(column.id)));
|
|
return buildHeaderGroups(allColumns, leafColumns, table, "center");
|
|
}, {
|
|
key: "getCenterHeaderGroups",
|
|
debug: () => {
|
|
var _table$options$debugA2;
|
|
return (_table$options$debugA2 = table.options.debugAll) != null ? _table$options$debugA2 : table.options.debugHeaders;
|
|
}
|
|
}),
|
|
getLeftHeaderGroups: memo(() => [table.getAllColumns(), table.getVisibleLeafColumns(), table.getState().columnPinning.left], (allColumns, leafColumns, left) => {
|
|
var _left$map$filter2;
|
|
const orderedLeafColumns = (_left$map$filter2 = left == null ? void 0 : left.map((columnId) => leafColumns.find((d5) => d5.id === columnId)).filter(Boolean)) != null ? _left$map$filter2 : [];
|
|
return buildHeaderGroups(allColumns, orderedLeafColumns, table, "left");
|
|
}, {
|
|
key: "getLeftHeaderGroups",
|
|
debug: () => {
|
|
var _table$options$debugA3;
|
|
return (_table$options$debugA3 = table.options.debugAll) != null ? _table$options$debugA3 : table.options.debugHeaders;
|
|
}
|
|
}),
|
|
getRightHeaderGroups: memo(() => [table.getAllColumns(), table.getVisibleLeafColumns(), table.getState().columnPinning.right], (allColumns, leafColumns, right) => {
|
|
var _right$map$filter2;
|
|
const orderedLeafColumns = (_right$map$filter2 = right == null ? void 0 : right.map((columnId) => leafColumns.find((d5) => d5.id === columnId)).filter(Boolean)) != null ? _right$map$filter2 : [];
|
|
return buildHeaderGroups(allColumns, orderedLeafColumns, table, "right");
|
|
}, {
|
|
key: "getRightHeaderGroups",
|
|
debug: () => {
|
|
var _table$options$debugA4;
|
|
return (_table$options$debugA4 = table.options.debugAll) != null ? _table$options$debugA4 : table.options.debugHeaders;
|
|
}
|
|
}),
|
|
getFooterGroups: memo(() => [table.getHeaderGroups()], (headerGroups) => {
|
|
return [...headerGroups].reverse();
|
|
}, {
|
|
key: "getFooterGroups",
|
|
debug: () => {
|
|
var _table$options$debugA5;
|
|
return (_table$options$debugA5 = table.options.debugAll) != null ? _table$options$debugA5 : table.options.debugHeaders;
|
|
}
|
|
}),
|
|
getLeftFooterGroups: memo(() => [table.getLeftHeaderGroups()], (headerGroups) => {
|
|
return [...headerGroups].reverse();
|
|
}, {
|
|
key: "getLeftFooterGroups",
|
|
debug: () => {
|
|
var _table$options$debugA6;
|
|
return (_table$options$debugA6 = table.options.debugAll) != null ? _table$options$debugA6 : table.options.debugHeaders;
|
|
}
|
|
}),
|
|
getCenterFooterGroups: memo(() => [table.getCenterHeaderGroups()], (headerGroups) => {
|
|
return [...headerGroups].reverse();
|
|
}, {
|
|
key: "getCenterFooterGroups",
|
|
debug: () => {
|
|
var _table$options$debugA7;
|
|
return (_table$options$debugA7 = table.options.debugAll) != null ? _table$options$debugA7 : table.options.debugHeaders;
|
|
}
|
|
}),
|
|
getRightFooterGroups: memo(() => [table.getRightHeaderGroups()], (headerGroups) => {
|
|
return [...headerGroups].reverse();
|
|
}, {
|
|
key: "getRightFooterGroups",
|
|
debug: () => {
|
|
var _table$options$debugA8;
|
|
return (_table$options$debugA8 = table.options.debugAll) != null ? _table$options$debugA8 : table.options.debugHeaders;
|
|
}
|
|
}),
|
|
getFlatHeaders: memo(() => [table.getHeaderGroups()], (headerGroups) => {
|
|
return headerGroups.map((headerGroup) => {
|
|
return headerGroup.headers;
|
|
}).flat();
|
|
}, {
|
|
key: "getFlatHeaders",
|
|
debug: () => {
|
|
var _table$options$debugA9;
|
|
return (_table$options$debugA9 = table.options.debugAll) != null ? _table$options$debugA9 : table.options.debugHeaders;
|
|
}
|
|
}),
|
|
getLeftFlatHeaders: memo(() => [table.getLeftHeaderGroups()], (left) => {
|
|
return left.map((headerGroup) => {
|
|
return headerGroup.headers;
|
|
}).flat();
|
|
}, {
|
|
key: "getLeftFlatHeaders",
|
|
debug: () => {
|
|
var _table$options$debugA10;
|
|
return (_table$options$debugA10 = table.options.debugAll) != null ? _table$options$debugA10 : table.options.debugHeaders;
|
|
}
|
|
}),
|
|
getCenterFlatHeaders: memo(() => [table.getCenterHeaderGroups()], (left) => {
|
|
return left.map((headerGroup) => {
|
|
return headerGroup.headers;
|
|
}).flat();
|
|
}, {
|
|
key: "getCenterFlatHeaders",
|
|
debug: () => {
|
|
var _table$options$debugA11;
|
|
return (_table$options$debugA11 = table.options.debugAll) != null ? _table$options$debugA11 : table.options.debugHeaders;
|
|
}
|
|
}),
|
|
getRightFlatHeaders: memo(() => [table.getRightHeaderGroups()], (left) => {
|
|
return left.map((headerGroup) => {
|
|
return headerGroup.headers;
|
|
}).flat();
|
|
}, {
|
|
key: "getRightFlatHeaders",
|
|
debug: () => {
|
|
var _table$options$debugA12;
|
|
return (_table$options$debugA12 = table.options.debugAll) != null ? _table$options$debugA12 : table.options.debugHeaders;
|
|
}
|
|
}),
|
|
getCenterLeafHeaders: memo(() => [table.getCenterFlatHeaders()], (flatHeaders) => {
|
|
return flatHeaders.filter((header) => {
|
|
var _a2;
|
|
return !((_a2 = header.subHeaders) == null ? void 0 : _a2.length);
|
|
});
|
|
}, {
|
|
key: "getCenterLeafHeaders",
|
|
debug: () => {
|
|
var _table$options$debugA13;
|
|
return (_table$options$debugA13 = table.options.debugAll) != null ? _table$options$debugA13 : table.options.debugHeaders;
|
|
}
|
|
}),
|
|
getLeftLeafHeaders: memo(() => [table.getLeftFlatHeaders()], (flatHeaders) => {
|
|
return flatHeaders.filter((header) => {
|
|
var _a2;
|
|
return !((_a2 = header.subHeaders) == null ? void 0 : _a2.length);
|
|
});
|
|
}, {
|
|
key: "getLeftLeafHeaders",
|
|
debug: () => {
|
|
var _table$options$debugA14;
|
|
return (_table$options$debugA14 = table.options.debugAll) != null ? _table$options$debugA14 : table.options.debugHeaders;
|
|
}
|
|
}),
|
|
getRightLeafHeaders: memo(() => [table.getRightFlatHeaders()], (flatHeaders) => {
|
|
return flatHeaders.filter((header) => {
|
|
var _a2;
|
|
return !((_a2 = header.subHeaders) == null ? void 0 : _a2.length);
|
|
});
|
|
}, {
|
|
key: "getRightLeafHeaders",
|
|
debug: () => {
|
|
var _table$options$debugA15;
|
|
return (_table$options$debugA15 = table.options.debugAll) != null ? _table$options$debugA15 : table.options.debugHeaders;
|
|
}
|
|
}),
|
|
getLeafHeaders: memo(() => [table.getLeftHeaderGroups(), table.getCenterHeaderGroups(), table.getRightHeaderGroups()], (left, center, right) => {
|
|
var _a2, _b2, _c2;
|
|
var _left$0$headers, _center$0$headers, _right$0$headers;
|
|
return [...(_left$0$headers = (_a2 = left[0]) == null ? void 0 : _a2.headers) != null ? _left$0$headers : [], ...(_center$0$headers = (_b2 = center[0]) == null ? void 0 : _b2.headers) != null ? _center$0$headers : [], ...(_right$0$headers = (_c2 = right[0]) == null ? void 0 : _c2.headers) != null ? _right$0$headers : []].map((header) => {
|
|
return header.getLeafHeaders();
|
|
}).flat();
|
|
}, {
|
|
key: "getLeafHeaders",
|
|
debug: () => {
|
|
var _table$options$debugA16;
|
|
return (_table$options$debugA16 = table.options.debugAll) != null ? _table$options$debugA16 : table.options.debugHeaders;
|
|
}
|
|
})
|
|
};
|
|
}
|
|
};
|
|
function buildHeaderGroups(allColumns, columnsToGroup, table, headerFamily) {
|
|
var _a2;
|
|
var _headerGroups$0$heade;
|
|
let maxDepth = 0;
|
|
const findMaxDepth = function(columns, depth) {
|
|
if (depth === void 0) {
|
|
depth = 1;
|
|
}
|
|
maxDepth = Math.max(maxDepth, depth);
|
|
columns.filter((column) => column.getIsVisible()).forEach((column) => {
|
|
var _a3;
|
|
if ((_a3 = column.columns) == null ? void 0 : _a3.length) {
|
|
findMaxDepth(column.columns, depth + 1);
|
|
}
|
|
}, 0);
|
|
};
|
|
findMaxDepth(allColumns);
|
|
let headerGroups = [];
|
|
const createHeaderGroup = (headersToGroup, depth) => {
|
|
const headerGroup = {
|
|
depth,
|
|
id: [headerFamily, `${depth}`].filter(Boolean).join("_"),
|
|
headers: []
|
|
};
|
|
const pendingParentHeaders = [];
|
|
headersToGroup.forEach((headerToGroup) => {
|
|
const latestPendingParentHeader = [...pendingParentHeaders].reverse()[0];
|
|
const isLeafHeader = headerToGroup.column.depth === headerGroup.depth;
|
|
let column;
|
|
let isPlaceholder = false;
|
|
if (isLeafHeader && headerToGroup.column.parent) {
|
|
column = headerToGroup.column.parent;
|
|
} else {
|
|
column = headerToGroup.column;
|
|
isPlaceholder = true;
|
|
}
|
|
if (latestPendingParentHeader && (latestPendingParentHeader == null ? void 0 : latestPendingParentHeader.column) === column) {
|
|
latestPendingParentHeader.subHeaders.push(headerToGroup);
|
|
} else {
|
|
const header = createHeader(table, column, {
|
|
id: [headerFamily, depth, column.id, headerToGroup == null ? void 0 : headerToGroup.id].filter(Boolean).join("_"),
|
|
isPlaceholder,
|
|
placeholderId: isPlaceholder ? `${pendingParentHeaders.filter((d5) => d5.column === column).length}` : void 0,
|
|
depth,
|
|
index: pendingParentHeaders.length
|
|
});
|
|
header.subHeaders.push(headerToGroup);
|
|
pendingParentHeaders.push(header);
|
|
}
|
|
headerGroup.headers.push(headerToGroup);
|
|
headerToGroup.headerGroup = headerGroup;
|
|
});
|
|
headerGroups.push(headerGroup);
|
|
if (depth > 0) {
|
|
createHeaderGroup(pendingParentHeaders, depth - 1);
|
|
}
|
|
};
|
|
const bottomHeaders = columnsToGroup.map((column, index) => createHeader(table, column, {
|
|
depth: maxDepth,
|
|
index
|
|
}));
|
|
createHeaderGroup(bottomHeaders, maxDepth - 1);
|
|
headerGroups.reverse();
|
|
const recurseHeadersForSpans = (headers) => {
|
|
const filteredHeaders = headers.filter((header) => header.column.getIsVisible());
|
|
return filteredHeaders.map((header) => {
|
|
let colSpan = 0;
|
|
let rowSpan = 0;
|
|
let childRowSpans = [0];
|
|
if (header.subHeaders && header.subHeaders.length) {
|
|
childRowSpans = [];
|
|
recurseHeadersForSpans(header.subHeaders).forEach((_ref) => {
|
|
let {
|
|
colSpan: childColSpan,
|
|
rowSpan: childRowSpan
|
|
} = _ref;
|
|
colSpan += childColSpan;
|
|
childRowSpans.push(childRowSpan);
|
|
});
|
|
} else {
|
|
colSpan = 1;
|
|
}
|
|
const minChildRowSpan = Math.min(...childRowSpans);
|
|
rowSpan = rowSpan + minChildRowSpan;
|
|
header.colSpan = colSpan;
|
|
header.rowSpan = rowSpan;
|
|
return {
|
|
colSpan,
|
|
rowSpan
|
|
};
|
|
});
|
|
};
|
|
recurseHeadersForSpans((_headerGroups$0$heade = (_a2 = headerGroups[0]) == null ? void 0 : _a2.headers) != null ? _headerGroups$0$heade : []);
|
|
return headerGroups;
|
|
}
|
|
var defaultColumnSizing = {
|
|
size: 150,
|
|
minSize: 20,
|
|
maxSize: Number.MAX_SAFE_INTEGER
|
|
};
|
|
var getDefaultColumnSizingInfoState = () => ({
|
|
startOffset: null,
|
|
startSize: null,
|
|
deltaOffset: null,
|
|
deltaPercentage: null,
|
|
isResizingColumn: false,
|
|
columnSizingStart: []
|
|
});
|
|
var ColumnSizing = {
|
|
getDefaultColumnDef: () => {
|
|
return defaultColumnSizing;
|
|
},
|
|
getInitialState: (state) => {
|
|
return {
|
|
columnSizing: {},
|
|
columnSizingInfo: getDefaultColumnSizingInfoState(),
|
|
...state
|
|
};
|
|
},
|
|
getDefaultOptions: (table) => {
|
|
return {
|
|
columnResizeMode: "onEnd",
|
|
onColumnSizingChange: makeStateUpdater("columnSizing", table),
|
|
onColumnSizingInfoChange: makeStateUpdater("columnSizingInfo", table)
|
|
};
|
|
},
|
|
createColumn: (column, table) => {
|
|
return {
|
|
getSize: () => {
|
|
var _column$columnDef$min, _ref, _column$columnDef$max;
|
|
const columnSize = table.getState().columnSizing[column.id];
|
|
return Math.min(Math.max((_column$columnDef$min = column.columnDef.minSize) != null ? _column$columnDef$min : defaultColumnSizing.minSize, (_ref = columnSize != null ? columnSize : column.columnDef.size) != null ? _ref : defaultColumnSizing.size), (_column$columnDef$max = column.columnDef.maxSize) != null ? _column$columnDef$max : defaultColumnSizing.maxSize);
|
|
},
|
|
getStart: (position) => {
|
|
const columns = !position ? table.getVisibleLeafColumns() : position === "left" ? table.getLeftVisibleLeafColumns() : table.getRightVisibleLeafColumns();
|
|
const index = columns.findIndex((d5) => d5.id === column.id);
|
|
if (index > 0) {
|
|
const prevSiblingColumn = columns[index - 1];
|
|
return prevSiblingColumn.getStart(position) + prevSiblingColumn.getSize();
|
|
}
|
|
return 0;
|
|
},
|
|
resetSize: () => {
|
|
table.setColumnSizing((_ref2) => {
|
|
let {
|
|
[column.id]: _5,
|
|
...rest
|
|
} = _ref2;
|
|
return rest;
|
|
});
|
|
},
|
|
getCanResize: () => {
|
|
var _column$columnDef$ena, _table$options$enable;
|
|
return ((_column$columnDef$ena = column.columnDef.enableResizing) != null ? _column$columnDef$ena : true) && ((_table$options$enable = table.options.enableColumnResizing) != null ? _table$options$enable : true);
|
|
},
|
|
getIsResizing: () => {
|
|
return table.getState().columnSizingInfo.isResizingColumn === column.id;
|
|
}
|
|
};
|
|
},
|
|
createHeader: (header, table) => {
|
|
return {
|
|
getSize: () => {
|
|
let sum2 = 0;
|
|
const recurse = (header2) => {
|
|
if (header2.subHeaders.length) {
|
|
header2.subHeaders.forEach(recurse);
|
|
} else {
|
|
var _header$column$getSiz;
|
|
sum2 += (_header$column$getSiz = header2.column.getSize()) != null ? _header$column$getSiz : 0;
|
|
}
|
|
};
|
|
recurse(header);
|
|
return sum2;
|
|
},
|
|
getStart: () => {
|
|
if (header.index > 0) {
|
|
const prevSiblingHeader = header.headerGroup.headers[header.index - 1];
|
|
return prevSiblingHeader.getStart() + prevSiblingHeader.getSize();
|
|
}
|
|
return 0;
|
|
},
|
|
getResizeHandler: () => {
|
|
const column = table.getColumn(header.column.id);
|
|
const canResize = column.getCanResize();
|
|
return (e4) => {
|
|
var _a2;
|
|
if (!canResize) {
|
|
return;
|
|
}
|
|
(_a2 = e4.persist) == null ? void 0 : _a2.call(e4);
|
|
if (isTouchStartEvent(e4)) {
|
|
if (e4.touches && e4.touches.length > 1) {
|
|
return;
|
|
}
|
|
}
|
|
const startSize = header.getSize();
|
|
const columnSizingStart = header ? header.getLeafHeaders().map((d5) => [d5.column.id, d5.column.getSize()]) : [[column.id, column.getSize()]];
|
|
const clientX = isTouchStartEvent(e4) ? Math.round(e4.touches[0].clientX) : e4.clientX;
|
|
const newColumnSizing = {};
|
|
const updateOffset = (eventType, clientXPos) => {
|
|
if (typeof clientXPos !== "number") {
|
|
return;
|
|
}
|
|
table.setColumnSizingInfo((old) => {
|
|
var _old$startOffset, _old$startSize;
|
|
const deltaOffset = clientXPos - ((_old$startOffset = old == null ? void 0 : old.startOffset) != null ? _old$startOffset : 0);
|
|
const deltaPercentage = Math.max(deltaOffset / ((_old$startSize = old == null ? void 0 : old.startSize) != null ? _old$startSize : 0), -0.999999);
|
|
old.columnSizingStart.forEach((_ref3) => {
|
|
let [columnId, headerSize] = _ref3;
|
|
newColumnSizing[columnId] = Math.round(Math.max(headerSize + headerSize * deltaPercentage, 0) * 100) / 100;
|
|
});
|
|
return {
|
|
...old,
|
|
deltaOffset,
|
|
deltaPercentage
|
|
};
|
|
});
|
|
if (table.options.columnResizeMode === "onChange" || eventType === "end") {
|
|
table.setColumnSizing((old) => ({
|
|
...old,
|
|
...newColumnSizing
|
|
}));
|
|
}
|
|
};
|
|
const onMove = (clientXPos) => updateOffset("move", clientXPos);
|
|
const onEnd = (clientXPos) => {
|
|
updateOffset("end", clientXPos);
|
|
table.setColumnSizingInfo((old) => ({
|
|
...old,
|
|
isResizingColumn: false,
|
|
startOffset: null,
|
|
startSize: null,
|
|
deltaOffset: null,
|
|
deltaPercentage: null,
|
|
columnSizingStart: []
|
|
}));
|
|
};
|
|
const mouseEvents = {
|
|
moveHandler: (e5) => onMove(e5.clientX),
|
|
upHandler: (e5) => {
|
|
document.removeEventListener("mousemove", mouseEvents.moveHandler);
|
|
document.removeEventListener("mouseup", mouseEvents.upHandler);
|
|
onEnd(e5.clientX);
|
|
}
|
|
};
|
|
const touchEvents = {
|
|
moveHandler: (e5) => {
|
|
if (e5.cancelable) {
|
|
e5.preventDefault();
|
|
e5.stopPropagation();
|
|
}
|
|
onMove(e5.touches[0].clientX);
|
|
return false;
|
|
},
|
|
upHandler: (e5) => {
|
|
var _a3;
|
|
document.removeEventListener("touchmove", touchEvents.moveHandler);
|
|
document.removeEventListener("touchend", touchEvents.upHandler);
|
|
if (e5.cancelable) {
|
|
e5.preventDefault();
|
|
e5.stopPropagation();
|
|
}
|
|
onEnd((_a3 = e5.touches[0]) == null ? void 0 : _a3.clientX);
|
|
}
|
|
};
|
|
const passiveIfSupported = passiveEventSupported() ? {
|
|
passive: false
|
|
} : false;
|
|
if (isTouchStartEvent(e4)) {
|
|
document.addEventListener("touchmove", touchEvents.moveHandler, passiveIfSupported);
|
|
document.addEventListener("touchend", touchEvents.upHandler, passiveIfSupported);
|
|
} else {
|
|
document.addEventListener("mousemove", mouseEvents.moveHandler, passiveIfSupported);
|
|
document.addEventListener("mouseup", mouseEvents.upHandler, passiveIfSupported);
|
|
}
|
|
table.setColumnSizingInfo((old) => ({
|
|
...old,
|
|
startOffset: clientX,
|
|
startSize,
|
|
deltaOffset: 0,
|
|
deltaPercentage: 0,
|
|
columnSizingStart,
|
|
isResizingColumn: column.id
|
|
}));
|
|
};
|
|
}
|
|
};
|
|
},
|
|
createTable: (table) => {
|
|
return {
|
|
setColumnSizing: (updater) => {
|
|
var _a2, _b2;
|
|
return (_b2 = (_a2 = table.options).onColumnSizingChange) == null ? void 0 : _b2.call(_a2, updater);
|
|
},
|
|
setColumnSizingInfo: (updater) => {
|
|
var _a2, _b2;
|
|
return (_b2 = (_a2 = table.options).onColumnSizingInfoChange) == null ? void 0 : _b2.call(_a2, updater);
|
|
},
|
|
resetColumnSizing: (defaultState) => {
|
|
var _table$initialState$c;
|
|
table.setColumnSizing(defaultState ? {} : (_table$initialState$c = table.initialState.columnSizing) != null ? _table$initialState$c : {});
|
|
},
|
|
resetHeaderSizeInfo: (defaultState) => {
|
|
var _table$initialState$c2;
|
|
table.setColumnSizingInfo(defaultState ? getDefaultColumnSizingInfoState() : (_table$initialState$c2 = table.initialState.columnSizingInfo) != null ? _table$initialState$c2 : getDefaultColumnSizingInfoState());
|
|
},
|
|
getTotalSize: () => {
|
|
var _a2;
|
|
var _table$getHeaderGroup;
|
|
return (_table$getHeaderGroup = (_a2 = table.getHeaderGroups()[0]) == null ? void 0 : _a2.headers.reduce((sum2, header) => {
|
|
return sum2 + header.getSize();
|
|
}, 0)) != null ? _table$getHeaderGroup : 0;
|
|
},
|
|
getLeftTotalSize: () => {
|
|
var _a2;
|
|
var _table$getLeftHeaderG;
|
|
return (_table$getLeftHeaderG = (_a2 = table.getLeftHeaderGroups()[0]) == null ? void 0 : _a2.headers.reduce((sum2, header) => {
|
|
return sum2 + header.getSize();
|
|
}, 0)) != null ? _table$getLeftHeaderG : 0;
|
|
},
|
|
getCenterTotalSize: () => {
|
|
var _a2;
|
|
var _table$getCenterHeade;
|
|
return (_table$getCenterHeade = (_a2 = table.getCenterHeaderGroups()[0]) == null ? void 0 : _a2.headers.reduce((sum2, header) => {
|
|
return sum2 + header.getSize();
|
|
}, 0)) != null ? _table$getCenterHeade : 0;
|
|
},
|
|
getRightTotalSize: () => {
|
|
var _a2;
|
|
var _table$getRightHeader;
|
|
return (_table$getRightHeader = (_a2 = table.getRightHeaderGroups()[0]) == null ? void 0 : _a2.headers.reduce((sum2, header) => {
|
|
return sum2 + header.getSize();
|
|
}, 0)) != null ? _table$getRightHeader : 0;
|
|
}
|
|
};
|
|
}
|
|
};
|
|
var passiveSupported = null;
|
|
function passiveEventSupported() {
|
|
if (typeof passiveSupported === "boolean")
|
|
return passiveSupported;
|
|
let supported = false;
|
|
try {
|
|
const options = {
|
|
get passive() {
|
|
supported = true;
|
|
return false;
|
|
}
|
|
};
|
|
const noop2 = () => {
|
|
};
|
|
window.addEventListener("test", noop2, options);
|
|
window.removeEventListener("test", noop2);
|
|
} catch (err) {
|
|
supported = false;
|
|
}
|
|
passiveSupported = supported;
|
|
return passiveSupported;
|
|
}
|
|
function isTouchStartEvent(e4) {
|
|
return e4.type === "touchstart";
|
|
}
|
|
var Expanding = {
|
|
getInitialState: (state) => {
|
|
return {
|
|
expanded: {},
|
|
...state
|
|
};
|
|
},
|
|
getDefaultOptions: (table) => {
|
|
return {
|
|
onExpandedChange: makeStateUpdater("expanded", table),
|
|
paginateExpandedRows: true
|
|
};
|
|
},
|
|
createTable: (table) => {
|
|
let registered = false;
|
|
let queued = false;
|
|
return {
|
|
_autoResetExpanded: () => {
|
|
var _ref, _table$options$autoRe;
|
|
if (!registered) {
|
|
table._queue(() => {
|
|
registered = true;
|
|
});
|
|
return;
|
|
}
|
|
if ((_ref = (_table$options$autoRe = table.options.autoResetAll) != null ? _table$options$autoRe : table.options.autoResetExpanded) != null ? _ref : !table.options.manualExpanding) {
|
|
if (queued)
|
|
return;
|
|
queued = true;
|
|
table._queue(() => {
|
|
table.resetExpanded();
|
|
queued = false;
|
|
});
|
|
}
|
|
},
|
|
setExpanded: (updater) => {
|
|
var _a2, _b2;
|
|
return (_b2 = (_a2 = table.options).onExpandedChange) == null ? void 0 : _b2.call(_a2, updater);
|
|
},
|
|
toggleAllRowsExpanded: (expanded) => {
|
|
if (expanded != null ? expanded : !table.getIsAllRowsExpanded()) {
|
|
table.setExpanded(true);
|
|
} else {
|
|
table.setExpanded({});
|
|
}
|
|
},
|
|
resetExpanded: (defaultState) => {
|
|
var _a2;
|
|
var _table$initialState$e;
|
|
table.setExpanded(defaultState ? {} : (_table$initialState$e = (_a2 = table.initialState) == null ? void 0 : _a2.expanded) != null ? _table$initialState$e : {});
|
|
},
|
|
getCanSomeRowsExpand: () => {
|
|
return table.getRowModel().flatRows.some((row) => row.getCanExpand());
|
|
},
|
|
getToggleAllRowsExpandedHandler: () => {
|
|
return (e4) => {
|
|
var _a2;
|
|
(_a2 = e4.persist) == null ? void 0 : _a2.call(e4);
|
|
table.toggleAllRowsExpanded();
|
|
};
|
|
},
|
|
getIsSomeRowsExpanded: () => {
|
|
const expanded = table.getState().expanded;
|
|
return expanded === true || Object.values(expanded).some(Boolean);
|
|
},
|
|
getIsAllRowsExpanded: () => {
|
|
const expanded = table.getState().expanded;
|
|
if (typeof expanded === "boolean") {
|
|
return expanded === true;
|
|
}
|
|
if (!Object.keys(expanded).length) {
|
|
return false;
|
|
}
|
|
if (table.getRowModel().flatRows.some((row) => !row.getIsExpanded())) {
|
|
return false;
|
|
}
|
|
return true;
|
|
},
|
|
getExpandedDepth: () => {
|
|
let maxDepth = 0;
|
|
const rowIds = table.getState().expanded === true ? Object.keys(table.getRowModel().rowsById) : Object.keys(table.getState().expanded);
|
|
rowIds.forEach((id2) => {
|
|
const splitId = id2.split(".");
|
|
maxDepth = Math.max(maxDepth, splitId.length);
|
|
});
|
|
return maxDepth;
|
|
},
|
|
getPreExpandedRowModel: () => table.getSortedRowModel(),
|
|
getExpandedRowModel: () => {
|
|
if (!table._getExpandedRowModel && table.options.getExpandedRowModel) {
|
|
table._getExpandedRowModel = table.options.getExpandedRowModel(table);
|
|
}
|
|
if (table.options.manualExpanding || !table._getExpandedRowModel) {
|
|
return table.getPreExpandedRowModel();
|
|
}
|
|
return table._getExpandedRowModel();
|
|
}
|
|
};
|
|
},
|
|
createRow: (row, table) => {
|
|
return {
|
|
toggleExpanded: (expanded) => {
|
|
table.setExpanded((old) => {
|
|
var _expanded;
|
|
const exists = old === true ? true : !!(old == null ? void 0 : old[row.id]);
|
|
let oldExpanded = {};
|
|
if (old === true) {
|
|
Object.keys(table.getRowModel().rowsById).forEach((rowId) => {
|
|
oldExpanded[rowId] = true;
|
|
});
|
|
} else {
|
|
oldExpanded = old;
|
|
}
|
|
expanded = (_expanded = expanded) != null ? _expanded : !exists;
|
|
if (!exists && expanded) {
|
|
return {
|
|
...oldExpanded,
|
|
[row.id]: true
|
|
};
|
|
}
|
|
if (exists && !expanded) {
|
|
const {
|
|
[row.id]: _5,
|
|
...rest
|
|
} = oldExpanded;
|
|
return rest;
|
|
}
|
|
return old;
|
|
});
|
|
},
|
|
getIsExpanded: () => {
|
|
var _a2, _b2;
|
|
var _table$options$getIsR;
|
|
const expanded = table.getState().expanded;
|
|
return !!((_table$options$getIsR = (_b2 = (_a2 = table.options).getIsRowExpanded) == null ? void 0 : _b2.call(_a2, row)) != null ? _table$options$getIsR : expanded === true || (expanded == null ? void 0 : expanded[row.id]));
|
|
},
|
|
getCanExpand: () => {
|
|
var _a2, _b2, _c2;
|
|
var _table$options$getRow, _table$options$enable;
|
|
return (_table$options$getRow = (_b2 = (_a2 = table.options).getRowCanExpand) == null ? void 0 : _b2.call(_a2, row)) != null ? _table$options$getRow : ((_table$options$enable = table.options.enableExpanding) != null ? _table$options$enable : true) && !!((_c2 = row.subRows) == null ? void 0 : _c2.length);
|
|
},
|
|
getToggleExpandedHandler: () => {
|
|
const canExpand = row.getCanExpand();
|
|
return () => {
|
|
if (!canExpand)
|
|
return;
|
|
row.toggleExpanded();
|
|
};
|
|
}
|
|
};
|
|
}
|
|
};
|
|
var includesString = (row, columnId, filterValue) => {
|
|
var _a2;
|
|
const search = filterValue.toLowerCase();
|
|
return Boolean((_a2 = row.getValue(columnId)) == null ? void 0 : _a2.toLowerCase().includes(search));
|
|
};
|
|
includesString.autoRemove = (val) => testFalsey(val);
|
|
var includesStringSensitive = (row, columnId, filterValue) => {
|
|
var _a2;
|
|
return Boolean((_a2 = row.getValue(columnId)) == null ? void 0 : _a2.includes(filterValue));
|
|
};
|
|
includesStringSensitive.autoRemove = (val) => testFalsey(val);
|
|
var equalsString = (row, columnId, filterValue) => {
|
|
var _a2;
|
|
return ((_a2 = row.getValue(columnId)) == null ? void 0 : _a2.toLowerCase()) === filterValue.toLowerCase();
|
|
};
|
|
equalsString.autoRemove = (val) => testFalsey(val);
|
|
var arrIncludes = (row, columnId, filterValue) => {
|
|
var _a2;
|
|
return (_a2 = row.getValue(columnId)) == null ? void 0 : _a2.includes(filterValue);
|
|
};
|
|
arrIncludes.autoRemove = (val) => testFalsey(val) || !(val == null ? void 0 : val.length);
|
|
var arrIncludesAll = (row, columnId, filterValue) => {
|
|
return !filterValue.some((val) => {
|
|
var _a2;
|
|
return !((_a2 = row.getValue(columnId)) == null ? void 0 : _a2.includes(val));
|
|
});
|
|
};
|
|
arrIncludesAll.autoRemove = (val) => testFalsey(val) || !(val == null ? void 0 : val.length);
|
|
var arrIncludesSome = (row, columnId, filterValue) => {
|
|
return filterValue.some((val) => {
|
|
var _a2;
|
|
return (_a2 = row.getValue(columnId)) == null ? void 0 : _a2.includes(val);
|
|
});
|
|
};
|
|
arrIncludesSome.autoRemove = (val) => testFalsey(val) || !(val == null ? void 0 : val.length);
|
|
var equals = (row, columnId, filterValue) => {
|
|
return row.getValue(columnId) === filterValue;
|
|
};
|
|
equals.autoRemove = (val) => testFalsey(val);
|
|
var weakEquals = (row, columnId, filterValue) => {
|
|
return row.getValue(columnId) == filterValue;
|
|
};
|
|
weakEquals.autoRemove = (val) => testFalsey(val);
|
|
var inNumberRange = (row, columnId, filterValue) => {
|
|
let [min3, max3] = filterValue;
|
|
const rowValue = row.getValue(columnId);
|
|
return rowValue >= min3 && rowValue <= max3;
|
|
};
|
|
inNumberRange.resolveFilterValue = (val) => {
|
|
let [unsafeMin, unsafeMax] = val;
|
|
let parsedMin = typeof unsafeMin !== "number" ? parseFloat(unsafeMin) : unsafeMin;
|
|
let parsedMax = typeof unsafeMax !== "number" ? parseFloat(unsafeMax) : unsafeMax;
|
|
let min3 = unsafeMin === null || Number.isNaN(parsedMin) ? -Infinity : parsedMin;
|
|
let max3 = unsafeMax === null || Number.isNaN(parsedMax) ? Infinity : parsedMax;
|
|
if (min3 > max3) {
|
|
const temp = min3;
|
|
min3 = max3;
|
|
max3 = temp;
|
|
}
|
|
return [min3, max3];
|
|
};
|
|
inNumberRange.autoRemove = (val) => testFalsey(val) || testFalsey(val[0]) && testFalsey(val[1]);
|
|
var filterFns = {
|
|
includesString,
|
|
includesStringSensitive,
|
|
equalsString,
|
|
arrIncludes,
|
|
arrIncludesAll,
|
|
arrIncludesSome,
|
|
equals,
|
|
weakEquals,
|
|
inNumberRange
|
|
};
|
|
function testFalsey(val) {
|
|
return val === void 0 || val === null || val === "";
|
|
}
|
|
var Filters = {
|
|
getDefaultColumnDef: () => {
|
|
return {
|
|
filterFn: "auto"
|
|
};
|
|
},
|
|
getInitialState: (state) => {
|
|
return {
|
|
columnFilters: [],
|
|
globalFilter: void 0,
|
|
...state
|
|
};
|
|
},
|
|
getDefaultOptions: (table) => {
|
|
return {
|
|
onColumnFiltersChange: makeStateUpdater("columnFilters", table),
|
|
onGlobalFilterChange: makeStateUpdater("globalFilter", table),
|
|
filterFromLeafRows: false,
|
|
maxLeafRowFilterDepth: 100,
|
|
globalFilterFn: "auto",
|
|
getColumnCanGlobalFilter: (column) => {
|
|
var _a2, _b2;
|
|
const value = (_b2 = (_a2 = table.getCoreRowModel().flatRows[0]) == null ? void 0 : _a2._getAllCellsByColumnId()[column.id]) == null ? void 0 : _b2.getValue();
|
|
return typeof value === "string" || typeof value === "number";
|
|
}
|
|
};
|
|
},
|
|
createColumn: (column, table) => {
|
|
return {
|
|
getAutoFilterFn: () => {
|
|
const firstRow = table.getCoreRowModel().flatRows[0];
|
|
const value = firstRow == null ? void 0 : firstRow.getValue(column.id);
|
|
if (typeof value === "string") {
|
|
return filterFns.includesString;
|
|
}
|
|
if (typeof value === "number") {
|
|
return filterFns.inNumberRange;
|
|
}
|
|
if (typeof value === "boolean") {
|
|
return filterFns.equals;
|
|
}
|
|
if (value !== null && typeof value === "object") {
|
|
return filterFns.equals;
|
|
}
|
|
if (Array.isArray(value)) {
|
|
return filterFns.arrIncludes;
|
|
}
|
|
return filterFns.weakEquals;
|
|
},
|
|
getFilterFn: () => {
|
|
var _a2;
|
|
var _table$options$filter;
|
|
return isFunction(column.columnDef.filterFn) ? column.columnDef.filterFn : column.columnDef.filterFn === "auto" ? column.getAutoFilterFn() : (_table$options$filter = (_a2 = table.options.filterFns) == null ? void 0 : _a2[column.columnDef.filterFn]) != null ? _table$options$filter : filterFns[column.columnDef.filterFn];
|
|
},
|
|
getCanFilter: () => {
|
|
var _column$columnDef$ena, _table$options$enable, _table$options$enable2;
|
|
return ((_column$columnDef$ena = column.columnDef.enableColumnFilter) != null ? _column$columnDef$ena : true) && ((_table$options$enable = table.options.enableColumnFilters) != null ? _table$options$enable : true) && ((_table$options$enable2 = table.options.enableFilters) != null ? _table$options$enable2 : true) && !!column.accessorFn;
|
|
},
|
|
getCanGlobalFilter: () => {
|
|
var _a2, _b2;
|
|
var _column$columnDef$ena2, _table$options$enable3, _table$options$enable4, _table$options$getCol;
|
|
return ((_column$columnDef$ena2 = column.columnDef.enableGlobalFilter) != null ? _column$columnDef$ena2 : true) && ((_table$options$enable3 = table.options.enableGlobalFilter) != null ? _table$options$enable3 : true) && ((_table$options$enable4 = table.options.enableFilters) != null ? _table$options$enable4 : true) && ((_table$options$getCol = (_b2 = (_a2 = table.options).getColumnCanGlobalFilter) == null ? void 0 : _b2.call(_a2, column)) != null ? _table$options$getCol : true) && !!column.accessorFn;
|
|
},
|
|
getIsFiltered: () => column.getFilterIndex() > -1,
|
|
getFilterValue: () => {
|
|
var _a2, _b2;
|
|
return (_b2 = (_a2 = table.getState().columnFilters) == null ? void 0 : _a2.find((d5) => d5.id === column.id)) == null ? void 0 : _b2.value;
|
|
},
|
|
getFilterIndex: () => {
|
|
var _a2;
|
|
var _table$getState$colum;
|
|
return (_table$getState$colum = (_a2 = table.getState().columnFilters) == null ? void 0 : _a2.findIndex((d5) => d5.id === column.id)) != null ? _table$getState$colum : -1;
|
|
},
|
|
setFilterValue: (value) => {
|
|
table.setColumnFilters((old) => {
|
|
const filterFn = column.getFilterFn();
|
|
const previousfilter = old == null ? void 0 : old.find((d5) => d5.id === column.id);
|
|
const newFilter = functionalUpdate(value, previousfilter ? previousfilter.value : void 0);
|
|
if (shouldAutoRemoveFilter(filterFn, newFilter, column)) {
|
|
var _old$filter;
|
|
return (_old$filter = old == null ? void 0 : old.filter((d5) => d5.id !== column.id)) != null ? _old$filter : [];
|
|
}
|
|
const newFilterObj = {
|
|
id: column.id,
|
|
value: newFilter
|
|
};
|
|
if (previousfilter) {
|
|
var _old$map;
|
|
return (_old$map = old == null ? void 0 : old.map((d5) => {
|
|
if (d5.id === column.id) {
|
|
return newFilterObj;
|
|
}
|
|
return d5;
|
|
})) != null ? _old$map : [];
|
|
}
|
|
if (old == null ? void 0 : old.length) {
|
|
return [...old, newFilterObj];
|
|
}
|
|
return [newFilterObj];
|
|
});
|
|
},
|
|
_getFacetedRowModel: table.options.getFacetedRowModel && table.options.getFacetedRowModel(table, column.id),
|
|
getFacetedRowModel: () => {
|
|
if (!column._getFacetedRowModel) {
|
|
return table.getPreFilteredRowModel();
|
|
}
|
|
return column._getFacetedRowModel();
|
|
},
|
|
_getFacetedUniqueValues: table.options.getFacetedUniqueValues && table.options.getFacetedUniqueValues(table, column.id),
|
|
getFacetedUniqueValues: () => {
|
|
if (!column._getFacetedUniqueValues) {
|
|
return /* @__PURE__ */ new Map();
|
|
}
|
|
return column._getFacetedUniqueValues();
|
|
},
|
|
_getFacetedMinMaxValues: table.options.getFacetedMinMaxValues && table.options.getFacetedMinMaxValues(table, column.id),
|
|
getFacetedMinMaxValues: () => {
|
|
if (!column._getFacetedMinMaxValues) {
|
|
return void 0;
|
|
}
|
|
return column._getFacetedMinMaxValues();
|
|
}
|
|
};
|
|
},
|
|
createRow: (row, table) => {
|
|
return {
|
|
columnFilters: {},
|
|
columnFiltersMeta: {}
|
|
};
|
|
},
|
|
createTable: (table) => {
|
|
return {
|
|
getGlobalAutoFilterFn: () => {
|
|
return filterFns.includesString;
|
|
},
|
|
getGlobalFilterFn: () => {
|
|
var _a2;
|
|
var _table$options$filter2;
|
|
const {
|
|
globalFilterFn
|
|
} = table.options;
|
|
return isFunction(globalFilterFn) ? globalFilterFn : globalFilterFn === "auto" ? table.getGlobalAutoFilterFn() : (_table$options$filter2 = (_a2 = table.options.filterFns) == null ? void 0 : _a2[globalFilterFn]) != null ? _table$options$filter2 : filterFns[globalFilterFn];
|
|
},
|
|
setColumnFilters: (updater) => {
|
|
var _a2, _b2;
|
|
const leafColumns = table.getAllLeafColumns();
|
|
const updateFn = (old) => {
|
|
var _a3;
|
|
return (_a3 = functionalUpdate(updater, old)) == null ? void 0 : _a3.filter((filter) => {
|
|
const column = leafColumns.find((d5) => d5.id === filter.id);
|
|
if (column) {
|
|
const filterFn = column.getFilterFn();
|
|
if (shouldAutoRemoveFilter(filterFn, filter.value, column)) {
|
|
return false;
|
|
}
|
|
}
|
|
return true;
|
|
});
|
|
};
|
|
(_b2 = (_a2 = table.options).onColumnFiltersChange) == null ? void 0 : _b2.call(_a2, updateFn);
|
|
},
|
|
setGlobalFilter: (updater) => {
|
|
var _a2, _b2;
|
|
(_b2 = (_a2 = table.options).onGlobalFilterChange) == null ? void 0 : _b2.call(_a2, updater);
|
|
},
|
|
resetGlobalFilter: (defaultState) => {
|
|
table.setGlobalFilter(defaultState ? void 0 : table.initialState.globalFilter);
|
|
},
|
|
resetColumnFilters: (defaultState) => {
|
|
var _a2;
|
|
var _table$initialState$c;
|
|
table.setColumnFilters(defaultState ? [] : (_table$initialState$c = (_a2 = table.initialState) == null ? void 0 : _a2.columnFilters) != null ? _table$initialState$c : []);
|
|
},
|
|
getPreFilteredRowModel: () => table.getCoreRowModel(),
|
|
getFilteredRowModel: () => {
|
|
if (!table._getFilteredRowModel && table.options.getFilteredRowModel) {
|
|
table._getFilteredRowModel = table.options.getFilteredRowModel(table);
|
|
}
|
|
if (table.options.manualFiltering || !table._getFilteredRowModel) {
|
|
return table.getPreFilteredRowModel();
|
|
}
|
|
return table._getFilteredRowModel();
|
|
},
|
|
_getGlobalFacetedRowModel: table.options.getFacetedRowModel && table.options.getFacetedRowModel(table, "__global__"),
|
|
getGlobalFacetedRowModel: () => {
|
|
if (table.options.manualFiltering || !table._getGlobalFacetedRowModel) {
|
|
return table.getPreFilteredRowModel();
|
|
}
|
|
return table._getGlobalFacetedRowModel();
|
|
},
|
|
_getGlobalFacetedUniqueValues: table.options.getFacetedUniqueValues && table.options.getFacetedUniqueValues(table, "__global__"),
|
|
getGlobalFacetedUniqueValues: () => {
|
|
if (!table._getGlobalFacetedUniqueValues) {
|
|
return /* @__PURE__ */ new Map();
|
|
}
|
|
return table._getGlobalFacetedUniqueValues();
|
|
},
|
|
_getGlobalFacetedMinMaxValues: table.options.getFacetedMinMaxValues && table.options.getFacetedMinMaxValues(table, "__global__"),
|
|
getGlobalFacetedMinMaxValues: () => {
|
|
if (!table._getGlobalFacetedMinMaxValues) {
|
|
return;
|
|
}
|
|
return table._getGlobalFacetedMinMaxValues();
|
|
}
|
|
};
|
|
}
|
|
};
|
|
function shouldAutoRemoveFilter(filterFn, value, column) {
|
|
return (filterFn && filterFn.autoRemove ? filterFn.autoRemove(value, column) : false) || typeof value === "undefined" || typeof value === "string" && !value;
|
|
}
|
|
var sum = (columnId, _leafRows, childRows) => {
|
|
return childRows.reduce((sum2, next) => {
|
|
const nextValue = next.getValue(columnId);
|
|
return sum2 + (typeof nextValue === "number" ? nextValue : 0);
|
|
}, 0);
|
|
};
|
|
var min2 = (columnId, _leafRows, childRows) => {
|
|
let min3;
|
|
childRows.forEach((row) => {
|
|
const value = row.getValue(columnId);
|
|
if (value != null && (min3 > value || min3 === void 0 && value >= value)) {
|
|
min3 = value;
|
|
}
|
|
});
|
|
return min3;
|
|
};
|
|
var max2 = (columnId, _leafRows, childRows) => {
|
|
let max3;
|
|
childRows.forEach((row) => {
|
|
const value = row.getValue(columnId);
|
|
if (value != null && (max3 < value || max3 === void 0 && value >= value)) {
|
|
max3 = value;
|
|
}
|
|
});
|
|
return max3;
|
|
};
|
|
var extent = (columnId, _leafRows, childRows) => {
|
|
let min3;
|
|
let max3;
|
|
childRows.forEach((row) => {
|
|
const value = row.getValue(columnId);
|
|
if (value != null) {
|
|
if (min3 === void 0) {
|
|
if (value >= value)
|
|
min3 = max3 = value;
|
|
} else {
|
|
if (min3 > value)
|
|
min3 = value;
|
|
if (max3 < value)
|
|
max3 = value;
|
|
}
|
|
}
|
|
});
|
|
return [min3, max3];
|
|
};
|
|
var mean = (columnId, leafRows) => {
|
|
let count2 = 0;
|
|
let sum2 = 0;
|
|
leafRows.forEach((row) => {
|
|
let value = row.getValue(columnId);
|
|
if (value != null && (value = +value) >= value) {
|
|
++count2, sum2 += value;
|
|
}
|
|
});
|
|
if (count2)
|
|
return sum2 / count2;
|
|
return;
|
|
};
|
|
var median = (columnId, leafRows) => {
|
|
if (!leafRows.length) {
|
|
return;
|
|
}
|
|
let min3 = 0;
|
|
let max3 = 0;
|
|
leafRows.forEach((row) => {
|
|
let value = row.getValue(columnId);
|
|
if (typeof value === "number") {
|
|
min3 = Math.min(min3, value);
|
|
max3 = Math.max(max3, value);
|
|
}
|
|
});
|
|
return (min3 + max3) / 2;
|
|
};
|
|
var unique = (columnId, leafRows) => {
|
|
return Array.from(new Set(leafRows.map((d5) => d5.getValue(columnId))).values());
|
|
};
|
|
var uniqueCount = (columnId, leafRows) => {
|
|
return new Set(leafRows.map((d5) => d5.getValue(columnId))).size;
|
|
};
|
|
var count = (_columnId, leafRows) => {
|
|
return leafRows.length;
|
|
};
|
|
var aggregationFns = {
|
|
sum,
|
|
min: min2,
|
|
max: max2,
|
|
extent,
|
|
mean,
|
|
median,
|
|
unique,
|
|
uniqueCount,
|
|
count
|
|
};
|
|
var Grouping = {
|
|
getDefaultColumnDef: () => {
|
|
return {
|
|
aggregatedCell: (props2) => {
|
|
var _a2, _b2;
|
|
var _toString;
|
|
return (_toString = (_b2 = (_a2 = props2.getValue()) == null ? void 0 : _a2.toString) == null ? void 0 : _b2.call(_a2)) != null ? _toString : null;
|
|
},
|
|
aggregationFn: "auto"
|
|
};
|
|
},
|
|
getInitialState: (state) => {
|
|
return {
|
|
grouping: [],
|
|
...state
|
|
};
|
|
},
|
|
getDefaultOptions: (table) => {
|
|
return {
|
|
onGroupingChange: makeStateUpdater("grouping", table),
|
|
groupedColumnMode: "reorder"
|
|
};
|
|
},
|
|
createColumn: (column, table) => {
|
|
return {
|
|
toggleGrouping: () => {
|
|
table.setGrouping((old) => {
|
|
if (old == null ? void 0 : old.includes(column.id)) {
|
|
return old.filter((d5) => d5 !== column.id);
|
|
}
|
|
return [...old != null ? old : [], column.id];
|
|
});
|
|
},
|
|
getCanGroup: () => {
|
|
var _ref, _ref2, _ref3, _column$columnDef$ena;
|
|
return (_ref = (_ref2 = (_ref3 = (_column$columnDef$ena = column.columnDef.enableGrouping) != null ? _column$columnDef$ena : true) != null ? _ref3 : table.options.enableGrouping) != null ? _ref2 : true) != null ? _ref : !!column.accessorFn;
|
|
},
|
|
getIsGrouped: () => {
|
|
var _a2;
|
|
return (_a2 = table.getState().grouping) == null ? void 0 : _a2.includes(column.id);
|
|
},
|
|
getGroupedIndex: () => {
|
|
var _a2;
|
|
return (_a2 = table.getState().grouping) == null ? void 0 : _a2.indexOf(column.id);
|
|
},
|
|
getToggleGroupingHandler: () => {
|
|
const canGroup = column.getCanGroup();
|
|
return () => {
|
|
if (!canGroup)
|
|
return;
|
|
column.toggleGrouping();
|
|
};
|
|
},
|
|
getAutoAggregationFn: () => {
|
|
const firstRow = table.getCoreRowModel().flatRows[0];
|
|
const value = firstRow == null ? void 0 : firstRow.getValue(column.id);
|
|
if (typeof value === "number") {
|
|
return aggregationFns.sum;
|
|
}
|
|
if (Object.prototype.toString.call(value) === "[object Date]") {
|
|
return aggregationFns.extent;
|
|
}
|
|
},
|
|
getAggregationFn: () => {
|
|
var _a2;
|
|
var _table$options$aggreg;
|
|
if (!column) {
|
|
throw new Error();
|
|
}
|
|
return isFunction(column.columnDef.aggregationFn) ? column.columnDef.aggregationFn : column.columnDef.aggregationFn === "auto" ? column.getAutoAggregationFn() : (_table$options$aggreg = (_a2 = table.options.aggregationFns) == null ? void 0 : _a2[column.columnDef.aggregationFn]) != null ? _table$options$aggreg : aggregationFns[column.columnDef.aggregationFn];
|
|
}
|
|
};
|
|
},
|
|
createTable: (table) => {
|
|
return {
|
|
setGrouping: (updater) => {
|
|
var _a2, _b2;
|
|
return (_b2 = (_a2 = table.options).onGroupingChange) == null ? void 0 : _b2.call(_a2, updater);
|
|
},
|
|
resetGrouping: (defaultState) => {
|
|
var _a2;
|
|
var _table$initialState$g;
|
|
table.setGrouping(defaultState ? [] : (_table$initialState$g = (_a2 = table.initialState) == null ? void 0 : _a2.grouping) != null ? _table$initialState$g : []);
|
|
},
|
|
getPreGroupedRowModel: () => table.getFilteredRowModel(),
|
|
getGroupedRowModel: () => {
|
|
if (!table._getGroupedRowModel && table.options.getGroupedRowModel) {
|
|
table._getGroupedRowModel = table.options.getGroupedRowModel(table);
|
|
}
|
|
if (table.options.manualGrouping || !table._getGroupedRowModel) {
|
|
return table.getPreGroupedRowModel();
|
|
}
|
|
return table._getGroupedRowModel();
|
|
}
|
|
};
|
|
},
|
|
createRow: (row) => {
|
|
return {
|
|
getIsGrouped: () => !!row.groupingColumnId,
|
|
_groupingValuesCache: {}
|
|
};
|
|
},
|
|
createCell: (cell, column, row, table) => {
|
|
return {
|
|
getIsGrouped: () => column.getIsGrouped() && column.id === row.groupingColumnId,
|
|
getIsPlaceholder: () => !cell.getIsGrouped() && column.getIsGrouped(),
|
|
getIsAggregated: () => {
|
|
var _a2;
|
|
return !cell.getIsGrouped() && !cell.getIsPlaceholder() && !!((_a2 = row.subRows) == null ? void 0 : _a2.length);
|
|
}
|
|
};
|
|
}
|
|
};
|
|
function orderColumns(leafColumns, grouping, groupedColumnMode) {
|
|
if (!(grouping == null ? void 0 : grouping.length) || !groupedColumnMode) {
|
|
return leafColumns;
|
|
}
|
|
const nonGroupingColumns = leafColumns.filter((col) => !grouping.includes(col.id));
|
|
if (groupedColumnMode === "remove") {
|
|
return nonGroupingColumns;
|
|
}
|
|
const groupingColumns = grouping.map((g4) => leafColumns.find((col) => col.id === g4)).filter(Boolean);
|
|
return [...groupingColumns, ...nonGroupingColumns];
|
|
}
|
|
var Ordering = {
|
|
getInitialState: (state) => {
|
|
return {
|
|
columnOrder: [],
|
|
...state
|
|
};
|
|
},
|
|
getDefaultOptions: (table) => {
|
|
return {
|
|
onColumnOrderChange: makeStateUpdater("columnOrder", table)
|
|
};
|
|
},
|
|
createTable: (table) => {
|
|
return {
|
|
setColumnOrder: (updater) => {
|
|
var _a2, _b2;
|
|
return (_b2 = (_a2 = table.options).onColumnOrderChange) == null ? void 0 : _b2.call(_a2, updater);
|
|
},
|
|
resetColumnOrder: (defaultState) => {
|
|
var _table$initialState$c;
|
|
table.setColumnOrder(defaultState ? [] : (_table$initialState$c = table.initialState.columnOrder) != null ? _table$initialState$c : []);
|
|
},
|
|
_getOrderColumnsFn: memo(() => [table.getState().columnOrder, table.getState().grouping, table.options.groupedColumnMode], (columnOrder, grouping, groupedColumnMode) => (columns) => {
|
|
let orderedColumns = [];
|
|
if (!(columnOrder == null ? void 0 : columnOrder.length)) {
|
|
orderedColumns = columns;
|
|
} else {
|
|
const columnOrderCopy = [...columnOrder];
|
|
const columnsCopy = [...columns];
|
|
while (columnsCopy.length && columnOrderCopy.length) {
|
|
const targetColumnId = columnOrderCopy.shift();
|
|
const foundIndex = columnsCopy.findIndex((d5) => d5.id === targetColumnId);
|
|
if (foundIndex > -1) {
|
|
orderedColumns.push(columnsCopy.splice(foundIndex, 1)[0]);
|
|
}
|
|
}
|
|
orderedColumns = [...orderedColumns, ...columnsCopy];
|
|
}
|
|
return orderColumns(orderedColumns, grouping, groupedColumnMode);
|
|
}, {
|
|
key: "getOrderColumnsFn"
|
|
})
|
|
};
|
|
}
|
|
};
|
|
var defaultPageIndex = 0;
|
|
var defaultPageSize = 10;
|
|
var getDefaultPaginationState = () => ({
|
|
pageIndex: defaultPageIndex,
|
|
pageSize: defaultPageSize
|
|
});
|
|
var Pagination = {
|
|
getInitialState: (state) => {
|
|
return {
|
|
...state,
|
|
pagination: {
|
|
...getDefaultPaginationState(),
|
|
...state == null ? void 0 : state.pagination
|
|
}
|
|
};
|
|
},
|
|
getDefaultOptions: (table) => {
|
|
return {
|
|
onPaginationChange: makeStateUpdater("pagination", table)
|
|
};
|
|
},
|
|
createTable: (table) => {
|
|
let registered = false;
|
|
let queued = false;
|
|
return {
|
|
_autoResetPageIndex: () => {
|
|
var _ref, _table$options$autoRe;
|
|
if (!registered) {
|
|
table._queue(() => {
|
|
registered = true;
|
|
});
|
|
return;
|
|
}
|
|
if ((_ref = (_table$options$autoRe = table.options.autoResetAll) != null ? _table$options$autoRe : table.options.autoResetPageIndex) != null ? _ref : !table.options.manualPagination) {
|
|
if (queued)
|
|
return;
|
|
queued = true;
|
|
table._queue(() => {
|
|
table.resetPageIndex();
|
|
queued = false;
|
|
});
|
|
}
|
|
},
|
|
setPagination: (updater) => {
|
|
var _a2, _b2;
|
|
const safeUpdater = (old) => {
|
|
let newState = functionalUpdate(updater, old);
|
|
return newState;
|
|
};
|
|
return (_b2 = (_a2 = table.options).onPaginationChange) == null ? void 0 : _b2.call(_a2, safeUpdater);
|
|
},
|
|
resetPagination: (defaultState) => {
|
|
var _table$initialState$p;
|
|
table.setPagination(defaultState ? getDefaultPaginationState() : (_table$initialState$p = table.initialState.pagination) != null ? _table$initialState$p : getDefaultPaginationState());
|
|
},
|
|
setPageIndex: (updater) => {
|
|
table.setPagination((old) => {
|
|
let pageIndex = functionalUpdate(updater, old.pageIndex);
|
|
const maxPageIndex = typeof table.options.pageCount === "undefined" || table.options.pageCount === -1 ? Number.MAX_SAFE_INTEGER : table.options.pageCount - 1;
|
|
pageIndex = Math.max(0, Math.min(pageIndex, maxPageIndex));
|
|
return {
|
|
...old,
|
|
pageIndex
|
|
};
|
|
});
|
|
},
|
|
resetPageIndex: (defaultState) => {
|
|
var _a2, _b2;
|
|
var _table$initialState$p2;
|
|
table.setPageIndex(defaultState ? defaultPageIndex : (_table$initialState$p2 = (_b2 = (_a2 = table.initialState) == null ? void 0 : _a2.pagination) == null ? void 0 : _b2.pageIndex) != null ? _table$initialState$p2 : defaultPageIndex);
|
|
},
|
|
resetPageSize: (defaultState) => {
|
|
var _a2, _b2;
|
|
var _table$initialState$p3;
|
|
table.setPageSize(defaultState ? defaultPageSize : (_table$initialState$p3 = (_b2 = (_a2 = table.initialState) == null ? void 0 : _a2.pagination) == null ? void 0 : _b2.pageSize) != null ? _table$initialState$p3 : defaultPageSize);
|
|
},
|
|
setPageSize: (updater) => {
|
|
table.setPagination((old) => {
|
|
const pageSize = Math.max(1, functionalUpdate(updater, old.pageSize));
|
|
const topRowIndex = old.pageSize * old.pageIndex;
|
|
const pageIndex = Math.floor(topRowIndex / pageSize);
|
|
return {
|
|
...old,
|
|
pageIndex,
|
|
pageSize
|
|
};
|
|
});
|
|
},
|
|
setPageCount: (updater) => table.setPagination((old) => {
|
|
var _table$options$pageCo;
|
|
let newPageCount = functionalUpdate(updater, (_table$options$pageCo = table.options.pageCount) != null ? _table$options$pageCo : -1);
|
|
if (typeof newPageCount === "number") {
|
|
newPageCount = Math.max(-1, newPageCount);
|
|
}
|
|
return {
|
|
...old,
|
|
pageCount: newPageCount
|
|
};
|
|
}),
|
|
getPageOptions: memo(() => [table.getPageCount()], (pageCount) => {
|
|
let pageOptions = [];
|
|
if (pageCount && pageCount > 0) {
|
|
pageOptions = [...new Array(pageCount)].fill(null).map((_5, i4) => i4);
|
|
}
|
|
return pageOptions;
|
|
}, {
|
|
key: "getPageOptions",
|
|
debug: () => {
|
|
var _table$options$debugA;
|
|
return (_table$options$debugA = table.options.debugAll) != null ? _table$options$debugA : table.options.debugTable;
|
|
}
|
|
}),
|
|
getCanPreviousPage: () => table.getState().pagination.pageIndex > 0,
|
|
getCanNextPage: () => {
|
|
const {
|
|
pageIndex
|
|
} = table.getState().pagination;
|
|
const pageCount = table.getPageCount();
|
|
if (pageCount === -1) {
|
|
return true;
|
|
}
|
|
if (pageCount === 0) {
|
|
return false;
|
|
}
|
|
return pageIndex < pageCount - 1;
|
|
},
|
|
previousPage: () => {
|
|
return table.setPageIndex((old) => old - 1);
|
|
},
|
|
nextPage: () => {
|
|
return table.setPageIndex((old) => {
|
|
return old + 1;
|
|
});
|
|
},
|
|
getPrePaginationRowModel: () => table.getExpandedRowModel(),
|
|
getPaginationRowModel: () => {
|
|
if (!table._getPaginationRowModel && table.options.getPaginationRowModel) {
|
|
table._getPaginationRowModel = table.options.getPaginationRowModel(table);
|
|
}
|
|
if (table.options.manualPagination || !table._getPaginationRowModel) {
|
|
return table.getPrePaginationRowModel();
|
|
}
|
|
return table._getPaginationRowModel();
|
|
},
|
|
getPageCount: () => {
|
|
var _table$options$pageCo2;
|
|
return (_table$options$pageCo2 = table.options.pageCount) != null ? _table$options$pageCo2 : Math.ceil(table.getPrePaginationRowModel().rows.length / table.getState().pagination.pageSize);
|
|
}
|
|
};
|
|
}
|
|
};
|
|
var getDefaultPinningState = () => ({
|
|
left: [],
|
|
right: []
|
|
});
|
|
var Pinning = {
|
|
getInitialState: (state) => {
|
|
return {
|
|
columnPinning: getDefaultPinningState(),
|
|
...state
|
|
};
|
|
},
|
|
getDefaultOptions: (table) => {
|
|
return {
|
|
onColumnPinningChange: makeStateUpdater("columnPinning", table)
|
|
};
|
|
},
|
|
createColumn: (column, table) => {
|
|
return {
|
|
pin: (position) => {
|
|
const columnIds = column.getLeafColumns().map((d5) => d5.id).filter(Boolean);
|
|
table.setColumnPinning((old) => {
|
|
var _old$left3, _old$right3;
|
|
if (position === "right") {
|
|
var _old$left, _old$right;
|
|
return {
|
|
left: ((_old$left = old == null ? void 0 : old.left) != null ? _old$left : []).filter((d5) => !(columnIds == null ? void 0 : columnIds.includes(d5))),
|
|
right: [...((_old$right = old == null ? void 0 : old.right) != null ? _old$right : []).filter((d5) => !(columnIds == null ? void 0 : columnIds.includes(d5))), ...columnIds]
|
|
};
|
|
}
|
|
if (position === "left") {
|
|
var _old$left2, _old$right2;
|
|
return {
|
|
left: [...((_old$left2 = old == null ? void 0 : old.left) != null ? _old$left2 : []).filter((d5) => !(columnIds == null ? void 0 : columnIds.includes(d5))), ...columnIds],
|
|
right: ((_old$right2 = old == null ? void 0 : old.right) != null ? _old$right2 : []).filter((d5) => !(columnIds == null ? void 0 : columnIds.includes(d5)))
|
|
};
|
|
}
|
|
return {
|
|
left: ((_old$left3 = old == null ? void 0 : old.left) != null ? _old$left3 : []).filter((d5) => !(columnIds == null ? void 0 : columnIds.includes(d5))),
|
|
right: ((_old$right3 = old == null ? void 0 : old.right) != null ? _old$right3 : []).filter((d5) => !(columnIds == null ? void 0 : columnIds.includes(d5)))
|
|
};
|
|
});
|
|
},
|
|
getCanPin: () => {
|
|
const leafColumns = column.getLeafColumns();
|
|
return leafColumns.some((d5) => {
|
|
var _d$columnDef$enablePi, _table$options$enable;
|
|
return ((_d$columnDef$enablePi = d5.columnDef.enablePinning) != null ? _d$columnDef$enablePi : true) && ((_table$options$enable = table.options.enablePinning) != null ? _table$options$enable : true);
|
|
});
|
|
},
|
|
getIsPinned: () => {
|
|
const leafColumnIds = column.getLeafColumns().map((d5) => d5.id);
|
|
const {
|
|
left,
|
|
right
|
|
} = table.getState().columnPinning;
|
|
const isLeft = leafColumnIds.some((d5) => left == null ? void 0 : left.includes(d5));
|
|
const isRight = leafColumnIds.some((d5) => right == null ? void 0 : right.includes(d5));
|
|
return isLeft ? "left" : isRight ? "right" : false;
|
|
},
|
|
getPinnedIndex: () => {
|
|
var _a2, _b2;
|
|
var _table$getState$colum;
|
|
const position = column.getIsPinned();
|
|
return position ? (_table$getState$colum = (_b2 = (_a2 = table.getState().columnPinning) == null ? void 0 : _a2[position]) == null ? void 0 : _b2.indexOf(column.id)) != null ? _table$getState$colum : -1 : 0;
|
|
}
|
|
};
|
|
},
|
|
createRow: (row, table) => {
|
|
return {
|
|
getCenterVisibleCells: memo(() => [row._getAllVisibleCells(), table.getState().columnPinning.left, table.getState().columnPinning.right], (allCells, left, right) => {
|
|
const leftAndRight = [...left != null ? left : [], ...right != null ? right : []];
|
|
return allCells.filter((d5) => !leftAndRight.includes(d5.column.id));
|
|
}, {
|
|
key: false,
|
|
debug: () => {
|
|
var _table$options$debugA;
|
|
return (_table$options$debugA = table.options.debugAll) != null ? _table$options$debugA : table.options.debugRows;
|
|
}
|
|
}),
|
|
getLeftVisibleCells: memo(() => [row._getAllVisibleCells(), table.getState().columnPinning.left, ,], (allCells, left) => {
|
|
const cells = (left != null ? left : []).map((columnId) => allCells.find((cell) => cell.column.id === columnId)).filter(Boolean).map((d5) => ({
|
|
...d5,
|
|
position: "left"
|
|
}));
|
|
return cells;
|
|
}, {
|
|
key: false,
|
|
debug: () => {
|
|
var _table$options$debugA2;
|
|
return (_table$options$debugA2 = table.options.debugAll) != null ? _table$options$debugA2 : table.options.debugRows;
|
|
}
|
|
}),
|
|
getRightVisibleCells: memo(() => [row._getAllVisibleCells(), table.getState().columnPinning.right], (allCells, right) => {
|
|
const cells = (right != null ? right : []).map((columnId) => allCells.find((cell) => cell.column.id === columnId)).filter(Boolean).map((d5) => ({
|
|
...d5,
|
|
position: "right"
|
|
}));
|
|
return cells;
|
|
}, {
|
|
key: false,
|
|
debug: () => {
|
|
var _table$options$debugA3;
|
|
return (_table$options$debugA3 = table.options.debugAll) != null ? _table$options$debugA3 : table.options.debugRows;
|
|
}
|
|
})
|
|
};
|
|
},
|
|
createTable: (table) => {
|
|
return {
|
|
setColumnPinning: (updater) => {
|
|
var _a2, _b2;
|
|
return (_b2 = (_a2 = table.options).onColumnPinningChange) == null ? void 0 : _b2.call(_a2, updater);
|
|
},
|
|
resetColumnPinning: (defaultState) => {
|
|
var _a2;
|
|
var _table$initialState$c;
|
|
return table.setColumnPinning(defaultState ? getDefaultPinningState() : (_table$initialState$c = (_a2 = table.initialState) == null ? void 0 : _a2.columnPinning) != null ? _table$initialState$c : getDefaultPinningState());
|
|
},
|
|
getIsSomeColumnsPinned: (position) => {
|
|
var _a2, _b2, _c2;
|
|
const pinningState = table.getState().columnPinning;
|
|
if (!position) {
|
|
return Boolean(((_a2 = pinningState.left) == null ? void 0 : _a2.length) || ((_b2 = pinningState.right) == null ? void 0 : _b2.length));
|
|
}
|
|
return Boolean((_c2 = pinningState[position]) == null ? void 0 : _c2.length);
|
|
},
|
|
getLeftLeafColumns: memo(() => [table.getAllLeafColumns(), table.getState().columnPinning.left], (allColumns, left) => {
|
|
return (left != null ? left : []).map((columnId) => allColumns.find((column) => column.id === columnId)).filter(Boolean);
|
|
}, {
|
|
key: "getLeftLeafColumns",
|
|
debug: () => {
|
|
var _table$options$debugA4;
|
|
return (_table$options$debugA4 = table.options.debugAll) != null ? _table$options$debugA4 : table.options.debugColumns;
|
|
}
|
|
}),
|
|
getRightLeafColumns: memo(() => [table.getAllLeafColumns(), table.getState().columnPinning.right], (allColumns, right) => {
|
|
return (right != null ? right : []).map((columnId) => allColumns.find((column) => column.id === columnId)).filter(Boolean);
|
|
}, {
|
|
key: "getRightLeafColumns",
|
|
debug: () => {
|
|
var _table$options$debugA5;
|
|
return (_table$options$debugA5 = table.options.debugAll) != null ? _table$options$debugA5 : table.options.debugColumns;
|
|
}
|
|
}),
|
|
getCenterLeafColumns: memo(() => [table.getAllLeafColumns(), table.getState().columnPinning.left, table.getState().columnPinning.right], (allColumns, left, right) => {
|
|
const leftAndRight = [...left != null ? left : [], ...right != null ? right : []];
|
|
return allColumns.filter((d5) => !leftAndRight.includes(d5.id));
|
|
}, {
|
|
key: "getCenterLeafColumns",
|
|
debug: () => {
|
|
var _table$options$debugA6;
|
|
return (_table$options$debugA6 = table.options.debugAll) != null ? _table$options$debugA6 : table.options.debugColumns;
|
|
}
|
|
})
|
|
};
|
|
}
|
|
};
|
|
var RowSelection = {
|
|
getInitialState: (state) => {
|
|
return {
|
|
rowSelection: {},
|
|
...state
|
|
};
|
|
},
|
|
getDefaultOptions: (table) => {
|
|
return {
|
|
onRowSelectionChange: makeStateUpdater("rowSelection", table),
|
|
enableRowSelection: true,
|
|
enableMultiRowSelection: true,
|
|
enableSubRowSelection: true
|
|
};
|
|
},
|
|
createTable: (table) => {
|
|
return {
|
|
setRowSelection: (updater) => {
|
|
var _a2, _b2;
|
|
return (_b2 = (_a2 = table.options).onRowSelectionChange) == null ? void 0 : _b2.call(_a2, updater);
|
|
},
|
|
resetRowSelection: (defaultState) => {
|
|
var _table$initialState$r;
|
|
return table.setRowSelection(defaultState ? {} : (_table$initialState$r = table.initialState.rowSelection) != null ? _table$initialState$r : {});
|
|
},
|
|
toggleAllRowsSelected: (value) => {
|
|
table.setRowSelection((old) => {
|
|
value = typeof value !== "undefined" ? value : !table.getIsAllRowsSelected();
|
|
const rowSelection = {
|
|
...old
|
|
};
|
|
const preGroupedFlatRows = table.getPreGroupedRowModel().flatRows;
|
|
if (value) {
|
|
preGroupedFlatRows.forEach((row) => {
|
|
if (!row.getCanSelect()) {
|
|
return;
|
|
}
|
|
rowSelection[row.id] = true;
|
|
});
|
|
} else {
|
|
preGroupedFlatRows.forEach((row) => {
|
|
delete rowSelection[row.id];
|
|
});
|
|
}
|
|
return rowSelection;
|
|
});
|
|
},
|
|
toggleAllPageRowsSelected: (value) => table.setRowSelection((old) => {
|
|
const resolvedValue = typeof value !== "undefined" ? value : !table.getIsAllPageRowsSelected();
|
|
const rowSelection = {
|
|
...old
|
|
};
|
|
table.getRowModel().rows.forEach((row) => {
|
|
mutateRowIsSelected(rowSelection, row.id, resolvedValue, table);
|
|
});
|
|
return rowSelection;
|
|
}),
|
|
getPreSelectedRowModel: () => table.getCoreRowModel(),
|
|
getSelectedRowModel: memo(() => [table.getState().rowSelection, table.getCoreRowModel()], (rowSelection, rowModel) => {
|
|
if (!Object.keys(rowSelection).length) {
|
|
return {
|
|
rows: [],
|
|
flatRows: [],
|
|
rowsById: {}
|
|
};
|
|
}
|
|
return selectRowsFn(table, rowModel);
|
|
}, {
|
|
key: "getSelectedRowModel",
|
|
debug: () => {
|
|
var _table$options$debugA;
|
|
return (_table$options$debugA = table.options.debugAll) != null ? _table$options$debugA : table.options.debugTable;
|
|
}
|
|
}),
|
|
getFilteredSelectedRowModel: memo(() => [table.getState().rowSelection, table.getFilteredRowModel()], (rowSelection, rowModel) => {
|
|
if (!Object.keys(rowSelection).length) {
|
|
return {
|
|
rows: [],
|
|
flatRows: [],
|
|
rowsById: {}
|
|
};
|
|
}
|
|
return selectRowsFn(table, rowModel);
|
|
}, {
|
|
key: false,
|
|
debug: () => {
|
|
var _table$options$debugA2;
|
|
return (_table$options$debugA2 = table.options.debugAll) != null ? _table$options$debugA2 : table.options.debugTable;
|
|
}
|
|
}),
|
|
getGroupedSelectedRowModel: memo(() => [table.getState().rowSelection, table.getSortedRowModel()], (rowSelection, rowModel) => {
|
|
if (!Object.keys(rowSelection).length) {
|
|
return {
|
|
rows: [],
|
|
flatRows: [],
|
|
rowsById: {}
|
|
};
|
|
}
|
|
return selectRowsFn(table, rowModel);
|
|
}, {
|
|
key: false,
|
|
debug: () => {
|
|
var _table$options$debugA3;
|
|
return (_table$options$debugA3 = table.options.debugAll) != null ? _table$options$debugA3 : table.options.debugTable;
|
|
}
|
|
}),
|
|
getIsAllRowsSelected: () => {
|
|
const preGroupedFlatRows = table.getFilteredRowModel().flatRows;
|
|
const {
|
|
rowSelection
|
|
} = table.getState();
|
|
let isAllRowsSelected = Boolean(preGroupedFlatRows.length && Object.keys(rowSelection).length);
|
|
if (isAllRowsSelected) {
|
|
if (preGroupedFlatRows.some((row) => row.getCanSelect() && !rowSelection[row.id])) {
|
|
isAllRowsSelected = false;
|
|
}
|
|
}
|
|
return isAllRowsSelected;
|
|
},
|
|
getIsAllPageRowsSelected: () => {
|
|
const paginationFlatRows = table.getPaginationRowModel().flatRows;
|
|
const {
|
|
rowSelection
|
|
} = table.getState();
|
|
let isAllPageRowsSelected = !!paginationFlatRows.length;
|
|
if (isAllPageRowsSelected && paginationFlatRows.some((row) => !rowSelection[row.id])) {
|
|
isAllPageRowsSelected = false;
|
|
}
|
|
return isAllPageRowsSelected;
|
|
},
|
|
getIsSomeRowsSelected: () => {
|
|
var _table$getState$rowSe;
|
|
const totalSelected = Object.keys((_table$getState$rowSe = table.getState().rowSelection) != null ? _table$getState$rowSe : {}).length;
|
|
return totalSelected > 0 && totalSelected < table.getFilteredRowModel().flatRows.length;
|
|
},
|
|
getIsSomePageRowsSelected: () => {
|
|
const paginationFlatRows = table.getPaginationRowModel().flatRows;
|
|
return table.getIsAllPageRowsSelected() ? false : paginationFlatRows.some((d5) => d5.getIsSelected() || d5.getIsSomeSelected());
|
|
},
|
|
getToggleAllRowsSelectedHandler: () => {
|
|
return (e4) => {
|
|
table.toggleAllRowsSelected(e4.target.checked);
|
|
};
|
|
},
|
|
getToggleAllPageRowsSelectedHandler: () => {
|
|
return (e4) => {
|
|
table.toggleAllPageRowsSelected(e4.target.checked);
|
|
};
|
|
}
|
|
};
|
|
},
|
|
createRow: (row, table) => {
|
|
return {
|
|
toggleSelected: (value) => {
|
|
const isSelected = row.getIsSelected();
|
|
table.setRowSelection((old) => {
|
|
value = typeof value !== "undefined" ? value : !isSelected;
|
|
if (isSelected === value) {
|
|
return old;
|
|
}
|
|
const selectedRowIds = {
|
|
...old
|
|
};
|
|
mutateRowIsSelected(selectedRowIds, row.id, value, table);
|
|
return selectedRowIds;
|
|
});
|
|
},
|
|
getIsSelected: () => {
|
|
const {
|
|
rowSelection
|
|
} = table.getState();
|
|
return isRowSelected(row, rowSelection);
|
|
},
|
|
getIsSomeSelected: () => {
|
|
const {
|
|
rowSelection
|
|
} = table.getState();
|
|
return isSubRowSelected(row, rowSelection) === "some";
|
|
},
|
|
getIsAllSubRowsSelected: () => {
|
|
const {
|
|
rowSelection
|
|
} = table.getState();
|
|
return isSubRowSelected(row, rowSelection) === "all";
|
|
},
|
|
getCanSelect: () => {
|
|
var _table$options$enable;
|
|
if (typeof table.options.enableRowSelection === "function") {
|
|
return table.options.enableRowSelection(row);
|
|
}
|
|
return (_table$options$enable = table.options.enableRowSelection) != null ? _table$options$enable : true;
|
|
},
|
|
getCanSelectSubRows: () => {
|
|
var _table$options$enable2;
|
|
if (typeof table.options.enableSubRowSelection === "function") {
|
|
return table.options.enableSubRowSelection(row);
|
|
}
|
|
return (_table$options$enable2 = table.options.enableSubRowSelection) != null ? _table$options$enable2 : true;
|
|
},
|
|
getCanMultiSelect: () => {
|
|
var _table$options$enable3;
|
|
if (typeof table.options.enableMultiRowSelection === "function") {
|
|
return table.options.enableMultiRowSelection(row);
|
|
}
|
|
return (_table$options$enable3 = table.options.enableMultiRowSelection) != null ? _table$options$enable3 : true;
|
|
},
|
|
getToggleSelectedHandler: () => {
|
|
const canSelect = row.getCanSelect();
|
|
return (e4) => {
|
|
var _a2;
|
|
if (!canSelect)
|
|
return;
|
|
row.toggleSelected((_a2 = e4.target) == null ? void 0 : _a2.checked);
|
|
};
|
|
}
|
|
};
|
|
}
|
|
};
|
|
var mutateRowIsSelected = (selectedRowIds, id2, value, table) => {
|
|
var _a2;
|
|
const row = table.getRow(id2);
|
|
if (value) {
|
|
if (!row.getCanMultiSelect()) {
|
|
Object.keys(selectedRowIds).forEach((key2) => delete selectedRowIds[key2]);
|
|
}
|
|
if (row.getCanSelect()) {
|
|
selectedRowIds[id2] = true;
|
|
}
|
|
} else {
|
|
delete selectedRowIds[id2];
|
|
}
|
|
if (((_a2 = row.subRows) == null ? void 0 : _a2.length) && row.getCanSelectSubRows()) {
|
|
row.subRows.forEach((row2) => mutateRowIsSelected(selectedRowIds, row2.id, value, table));
|
|
}
|
|
};
|
|
function selectRowsFn(table, rowModel) {
|
|
const rowSelection = table.getState().rowSelection;
|
|
const newSelectedFlatRows = [];
|
|
const newSelectedRowsById = {};
|
|
const recurseRows = function(rows, depth) {
|
|
return rows.map((row) => {
|
|
var _a2;
|
|
const isSelected = isRowSelected(row, rowSelection);
|
|
if (isSelected) {
|
|
newSelectedFlatRows.push(row);
|
|
newSelectedRowsById[row.id] = row;
|
|
}
|
|
if ((_a2 = row.subRows) == null ? void 0 : _a2.length) {
|
|
row = {
|
|
...row,
|
|
subRows: recurseRows(row.subRows)
|
|
};
|
|
}
|
|
if (isSelected) {
|
|
return row;
|
|
}
|
|
}).filter(Boolean);
|
|
};
|
|
return {
|
|
rows: recurseRows(rowModel.rows),
|
|
flatRows: newSelectedFlatRows,
|
|
rowsById: newSelectedRowsById
|
|
};
|
|
}
|
|
function isRowSelected(row, selection) {
|
|
var _selection$row$id;
|
|
return (_selection$row$id = selection[row.id]) != null ? _selection$row$id : false;
|
|
}
|
|
function isSubRowSelected(row, selection, table) {
|
|
if (row.subRows && row.subRows.length) {
|
|
let allChildrenSelected = true;
|
|
let someSelected = false;
|
|
row.subRows.forEach((subRow) => {
|
|
if (someSelected && !allChildrenSelected) {
|
|
return;
|
|
}
|
|
if (isRowSelected(subRow, selection)) {
|
|
someSelected = true;
|
|
} else {
|
|
allChildrenSelected = false;
|
|
}
|
|
});
|
|
return allChildrenSelected ? "all" : someSelected ? "some" : false;
|
|
}
|
|
return false;
|
|
}
|
|
var reSplitAlphaNumeric = /([0-9]+)/gm;
|
|
var alphanumeric = (rowA, rowB, columnId) => {
|
|
return compareAlphanumeric(toString(rowA.getValue(columnId)).toLowerCase(), toString(rowB.getValue(columnId)).toLowerCase());
|
|
};
|
|
var alphanumericCaseSensitive = (rowA, rowB, columnId) => {
|
|
return compareAlphanumeric(toString(rowA.getValue(columnId)), toString(rowB.getValue(columnId)));
|
|
};
|
|
var text = (rowA, rowB, columnId) => {
|
|
return compareBasic(toString(rowA.getValue(columnId)).toLowerCase(), toString(rowB.getValue(columnId)).toLowerCase());
|
|
};
|
|
var textCaseSensitive = (rowA, rowB, columnId) => {
|
|
return compareBasic(toString(rowA.getValue(columnId)), toString(rowB.getValue(columnId)));
|
|
};
|
|
var datetime = (rowA, rowB, columnId) => {
|
|
const a5 = rowA.getValue(columnId);
|
|
const b4 = rowB.getValue(columnId);
|
|
return a5 > b4 ? 1 : a5 < b4 ? -1 : 0;
|
|
};
|
|
var basic = (rowA, rowB, columnId) => {
|
|
return compareBasic(rowA.getValue(columnId), rowB.getValue(columnId));
|
|
};
|
|
function compareBasic(a5, b4) {
|
|
return a5 === b4 ? 0 : a5 > b4 ? 1 : -1;
|
|
}
|
|
function toString(a5) {
|
|
if (typeof a5 === "number") {
|
|
if (isNaN(a5) || a5 === Infinity || a5 === -Infinity) {
|
|
return "";
|
|
}
|
|
return String(a5);
|
|
}
|
|
if (typeof a5 === "string") {
|
|
return a5;
|
|
}
|
|
return "";
|
|
}
|
|
function compareAlphanumeric(aStr, bStr) {
|
|
const a5 = aStr.split(reSplitAlphaNumeric).filter(Boolean);
|
|
const b4 = bStr.split(reSplitAlphaNumeric).filter(Boolean);
|
|
while (a5.length && b4.length) {
|
|
const aa = a5.shift();
|
|
const bb = b4.shift();
|
|
const an2 = parseInt(aa, 10);
|
|
const bn2 = parseInt(bb, 10);
|
|
const combo = [an2, bn2].sort();
|
|
if (isNaN(combo[0])) {
|
|
if (aa > bb) {
|
|
return 1;
|
|
}
|
|
if (bb > aa) {
|
|
return -1;
|
|
}
|
|
continue;
|
|
}
|
|
if (isNaN(combo[1])) {
|
|
return isNaN(an2) ? -1 : 1;
|
|
}
|
|
if (an2 > bn2) {
|
|
return 1;
|
|
}
|
|
if (bn2 > an2) {
|
|
return -1;
|
|
}
|
|
}
|
|
return a5.length - b4.length;
|
|
}
|
|
var sortingFns = {
|
|
alphanumeric,
|
|
alphanumericCaseSensitive,
|
|
text,
|
|
textCaseSensitive,
|
|
datetime,
|
|
basic
|
|
};
|
|
var Sorting = {
|
|
getInitialState: (state) => {
|
|
return {
|
|
sorting: [],
|
|
...state
|
|
};
|
|
},
|
|
getDefaultColumnDef: () => {
|
|
return {
|
|
sortingFn: "auto"
|
|
};
|
|
},
|
|
getDefaultOptions: (table) => {
|
|
return {
|
|
onSortingChange: makeStateUpdater("sorting", table),
|
|
isMultiSortEvent: (e4) => {
|
|
return e4.shiftKey;
|
|
}
|
|
};
|
|
},
|
|
createColumn: (column, table) => {
|
|
return {
|
|
getAutoSortingFn: () => {
|
|
const firstRows = table.getFilteredRowModel().flatRows.slice(10);
|
|
let isString = false;
|
|
for (const row of firstRows) {
|
|
const value = row == null ? void 0 : row.getValue(column.id);
|
|
if (Object.prototype.toString.call(value) === "[object Date]") {
|
|
return sortingFns.datetime;
|
|
}
|
|
if (typeof value === "string") {
|
|
isString = true;
|
|
if (value.split(reSplitAlphaNumeric).length > 1) {
|
|
return sortingFns.alphanumeric;
|
|
}
|
|
}
|
|
}
|
|
if (isString) {
|
|
return sortingFns.text;
|
|
}
|
|
return sortingFns.basic;
|
|
},
|
|
getAutoSortDir: () => {
|
|
const firstRow = table.getFilteredRowModel().flatRows[0];
|
|
const value = firstRow == null ? void 0 : firstRow.getValue(column.id);
|
|
if (typeof value === "string") {
|
|
return "asc";
|
|
}
|
|
return "desc";
|
|
},
|
|
getSortingFn: () => {
|
|
var _a2;
|
|
var _table$options$sortin;
|
|
if (!column) {
|
|
throw new Error();
|
|
}
|
|
return isFunction(column.columnDef.sortingFn) ? column.columnDef.sortingFn : column.columnDef.sortingFn === "auto" ? column.getAutoSortingFn() : (_table$options$sortin = (_a2 = table.options.sortingFns) == null ? void 0 : _a2[column.columnDef.sortingFn]) != null ? _table$options$sortin : sortingFns[column.columnDef.sortingFn];
|
|
},
|
|
toggleSorting: (desc, multi) => {
|
|
const nextSortingOrder = column.getNextSortingOrder();
|
|
const hasManualValue = typeof desc !== "undefined" && desc !== null;
|
|
table.setSorting((old) => {
|
|
const existingSorting = old == null ? void 0 : old.find((d5) => d5.id === column.id);
|
|
const existingIndex = old == null ? void 0 : old.findIndex((d5) => d5.id === column.id);
|
|
let newSorting = [];
|
|
let sortAction;
|
|
let nextDesc = hasManualValue ? desc : nextSortingOrder === "desc";
|
|
if ((old == null ? void 0 : old.length) && column.getCanMultiSort() && multi) {
|
|
if (existingSorting) {
|
|
sortAction = "toggle";
|
|
} else {
|
|
sortAction = "add";
|
|
}
|
|
} else {
|
|
if ((old == null ? void 0 : old.length) && existingIndex !== old.length - 1) {
|
|
sortAction = "replace";
|
|
} else if (existingSorting) {
|
|
sortAction = "toggle";
|
|
} else {
|
|
sortAction = "replace";
|
|
}
|
|
}
|
|
if (sortAction === "toggle") {
|
|
if (!hasManualValue) {
|
|
if (!nextSortingOrder) {
|
|
sortAction = "remove";
|
|
}
|
|
}
|
|
}
|
|
if (sortAction === "add") {
|
|
var _table$options$maxMul;
|
|
newSorting = [...old, {
|
|
id: column.id,
|
|
desc: nextDesc
|
|
}];
|
|
newSorting.splice(0, newSorting.length - ((_table$options$maxMul = table.options.maxMultiSortColCount) != null ? _table$options$maxMul : Number.MAX_SAFE_INTEGER));
|
|
} else if (sortAction === "toggle") {
|
|
newSorting = old.map((d5) => {
|
|
if (d5.id === column.id) {
|
|
return {
|
|
...d5,
|
|
desc: nextDesc
|
|
};
|
|
}
|
|
return d5;
|
|
});
|
|
} else if (sortAction === "remove") {
|
|
newSorting = old.filter((d5) => d5.id !== column.id);
|
|
} else {
|
|
newSorting = [{
|
|
id: column.id,
|
|
desc: nextDesc
|
|
}];
|
|
}
|
|
return newSorting;
|
|
});
|
|
},
|
|
getFirstSortDir: () => {
|
|
var _ref, _column$columnDef$sor;
|
|
const sortDescFirst = (_ref = (_column$columnDef$sor = column.columnDef.sortDescFirst) != null ? _column$columnDef$sor : table.options.sortDescFirst) != null ? _ref : column.getAutoSortDir() === "desc";
|
|
return sortDescFirst ? "desc" : "asc";
|
|
},
|
|
getNextSortingOrder: (multi) => {
|
|
var _table$options$enable, _table$options$enable2;
|
|
const firstSortDirection = column.getFirstSortDir();
|
|
const isSorted = column.getIsSorted();
|
|
if (!isSorted) {
|
|
return firstSortDirection;
|
|
}
|
|
if (isSorted !== firstSortDirection && ((_table$options$enable = table.options.enableSortingRemoval) != null ? _table$options$enable : true) && (multi ? (_table$options$enable2 = table.options.enableMultiRemove) != null ? _table$options$enable2 : true : true)) {
|
|
return false;
|
|
}
|
|
return isSorted === "desc" ? "asc" : "desc";
|
|
},
|
|
getCanSort: () => {
|
|
var _column$columnDef$ena, _table$options$enable3;
|
|
return ((_column$columnDef$ena = column.columnDef.enableSorting) != null ? _column$columnDef$ena : true) && ((_table$options$enable3 = table.options.enableSorting) != null ? _table$options$enable3 : true) && !!column.accessorFn;
|
|
},
|
|
getCanMultiSort: () => {
|
|
var _ref2, _column$columnDef$ena2;
|
|
return (_ref2 = (_column$columnDef$ena2 = column.columnDef.enableMultiSort) != null ? _column$columnDef$ena2 : table.options.enableMultiSort) != null ? _ref2 : !!column.accessorFn;
|
|
},
|
|
getIsSorted: () => {
|
|
var _a2;
|
|
const columnSort = (_a2 = table.getState().sorting) == null ? void 0 : _a2.find((d5) => d5.id === column.id);
|
|
return !columnSort ? false : columnSort.desc ? "desc" : "asc";
|
|
},
|
|
getSortIndex: () => {
|
|
var _a2;
|
|
var _table$getState$sorti;
|
|
return (_table$getState$sorti = (_a2 = table.getState().sorting) == null ? void 0 : _a2.findIndex((d5) => d5.id === column.id)) != null ? _table$getState$sorti : -1;
|
|
},
|
|
clearSorting: () => {
|
|
table.setSorting((old) => (old == null ? void 0 : old.length) ? old.filter((d5) => d5.id !== column.id) : []);
|
|
},
|
|
getToggleSortingHandler: () => {
|
|
const canSort = column.getCanSort();
|
|
return (e4) => {
|
|
var _a2, _b2, _c2, _d2;
|
|
if (!canSort)
|
|
return;
|
|
(_a2 = e4.persist) == null ? void 0 : _a2.call(e4);
|
|
(_d2 = column.toggleSorting) == null ? void 0 : _d2.call(column, void 0, column.getCanMultiSort() ? (_c2 = (_b2 = table.options).isMultiSortEvent) == null ? void 0 : _c2.call(_b2, e4) : false);
|
|
};
|
|
}
|
|
};
|
|
},
|
|
createTable: (table) => {
|
|
return {
|
|
setSorting: (updater) => {
|
|
var _a2, _b2;
|
|
return (_b2 = (_a2 = table.options).onSortingChange) == null ? void 0 : _b2.call(_a2, updater);
|
|
},
|
|
resetSorting: (defaultState) => {
|
|
var _a2;
|
|
var _table$initialState$s;
|
|
table.setSorting(defaultState ? [] : (_table$initialState$s = (_a2 = table.initialState) == null ? void 0 : _a2.sorting) != null ? _table$initialState$s : []);
|
|
},
|
|
getPreSortedRowModel: () => table.getGroupedRowModel(),
|
|
getSortedRowModel: () => {
|
|
if (!table._getSortedRowModel && table.options.getSortedRowModel) {
|
|
table._getSortedRowModel = table.options.getSortedRowModel(table);
|
|
}
|
|
if (table.options.manualSorting || !table._getSortedRowModel) {
|
|
return table.getPreSortedRowModel();
|
|
}
|
|
return table._getSortedRowModel();
|
|
}
|
|
};
|
|
}
|
|
};
|
|
var Visibility = {
|
|
getInitialState: (state) => {
|
|
return {
|
|
columnVisibility: {},
|
|
...state
|
|
};
|
|
},
|
|
getDefaultOptions: (table) => {
|
|
return {
|
|
onColumnVisibilityChange: makeStateUpdater("columnVisibility", table)
|
|
};
|
|
},
|
|
createColumn: (column, table) => {
|
|
return {
|
|
toggleVisibility: (value) => {
|
|
if (column.getCanHide()) {
|
|
table.setColumnVisibility((old) => ({
|
|
...old,
|
|
[column.id]: value != null ? value : !column.getIsVisible()
|
|
}));
|
|
}
|
|
},
|
|
getIsVisible: () => {
|
|
var _a2;
|
|
var _table$getState$colum;
|
|
return (_table$getState$colum = (_a2 = table.getState().columnVisibility) == null ? void 0 : _a2[column.id]) != null ? _table$getState$colum : true;
|
|
},
|
|
getCanHide: () => {
|
|
var _column$columnDef$ena, _table$options$enable;
|
|
return ((_column$columnDef$ena = column.columnDef.enableHiding) != null ? _column$columnDef$ena : true) && ((_table$options$enable = table.options.enableHiding) != null ? _table$options$enable : true);
|
|
},
|
|
getToggleVisibilityHandler: () => {
|
|
return (e4) => {
|
|
var _a2;
|
|
(_a2 = column.toggleVisibility) == null ? void 0 : _a2.call(column, e4.target.checked);
|
|
};
|
|
}
|
|
};
|
|
},
|
|
createRow: (row, table) => {
|
|
return {
|
|
_getAllVisibleCells: memo(() => [row.getAllCells(), table.getState().columnVisibility], (cells) => {
|
|
return cells.filter((cell) => cell.column.getIsVisible());
|
|
}, {
|
|
key: false,
|
|
debug: () => {
|
|
var _table$options$debugA;
|
|
return (_table$options$debugA = table.options.debugAll) != null ? _table$options$debugA : table.options.debugRows;
|
|
}
|
|
}),
|
|
getVisibleCells: memo(() => [row.getLeftVisibleCells(), row.getCenterVisibleCells(), row.getRightVisibleCells()], (left, center, right) => [...left, ...center, ...right], {
|
|
key: "row.getVisibleCells",
|
|
debug: () => {
|
|
var _table$options$debugA2;
|
|
return (_table$options$debugA2 = table.options.debugAll) != null ? _table$options$debugA2 : table.options.debugRows;
|
|
}
|
|
})
|
|
};
|
|
},
|
|
createTable: (table) => {
|
|
const makeVisibleColumnsMethod = (key2, getColumns) => {
|
|
return memo(() => [getColumns(), getColumns().filter((d5) => d5.getIsVisible()).map((d5) => d5.id).join("_")], (columns) => {
|
|
return columns.filter((d5) => {
|
|
var _a2;
|
|
return (_a2 = d5.getIsVisible) == null ? void 0 : _a2.call(d5);
|
|
});
|
|
}, {
|
|
key: key2,
|
|
debug: () => {
|
|
var _table$options$debugA3;
|
|
return (_table$options$debugA3 = table.options.debugAll) != null ? _table$options$debugA3 : table.options.debugColumns;
|
|
}
|
|
});
|
|
};
|
|
return {
|
|
getVisibleFlatColumns: makeVisibleColumnsMethod("getVisibleFlatColumns", () => table.getAllFlatColumns()),
|
|
getVisibleLeafColumns: makeVisibleColumnsMethod("getVisibleLeafColumns", () => table.getAllLeafColumns()),
|
|
getLeftVisibleLeafColumns: makeVisibleColumnsMethod("getLeftVisibleLeafColumns", () => table.getLeftLeafColumns()),
|
|
getRightVisibleLeafColumns: makeVisibleColumnsMethod("getRightVisibleLeafColumns", () => table.getRightLeafColumns()),
|
|
getCenterVisibleLeafColumns: makeVisibleColumnsMethod("getCenterVisibleLeafColumns", () => table.getCenterLeafColumns()),
|
|
setColumnVisibility: (updater) => {
|
|
var _a2, _b2;
|
|
return (_b2 = (_a2 = table.options).onColumnVisibilityChange) == null ? void 0 : _b2.call(_a2, updater);
|
|
},
|
|
resetColumnVisibility: (defaultState) => {
|
|
var _table$initialState$c;
|
|
table.setColumnVisibility(defaultState ? {} : (_table$initialState$c = table.initialState.columnVisibility) != null ? _table$initialState$c : {});
|
|
},
|
|
toggleAllColumnsVisible: (value) => {
|
|
var _value;
|
|
value = (_value = value) != null ? _value : !table.getIsAllColumnsVisible();
|
|
table.setColumnVisibility(table.getAllLeafColumns().reduce((obj, column) => {
|
|
var _a2;
|
|
return {
|
|
...obj,
|
|
[column.id]: !value ? !((_a2 = column.getCanHide) == null ? void 0 : _a2.call(column)) : value
|
|
};
|
|
}, {}));
|
|
},
|
|
getIsAllColumnsVisible: () => !table.getAllLeafColumns().some((column) => {
|
|
var _a2;
|
|
return !((_a2 = column.getIsVisible) == null ? void 0 : _a2.call(column));
|
|
}),
|
|
getIsSomeColumnsVisible: () => table.getAllLeafColumns().some((column) => {
|
|
var _a2;
|
|
return (_a2 = column.getIsVisible) == null ? void 0 : _a2.call(column);
|
|
}),
|
|
getToggleAllColumnsVisibilityHandler: () => {
|
|
return (e4) => {
|
|
var _a2;
|
|
table.toggleAllColumnsVisible((_a2 = e4.target) == null ? void 0 : _a2.checked);
|
|
};
|
|
}
|
|
};
|
|
}
|
|
};
|
|
var features = [Headers, Visibility, Ordering, Pinning, Filters, Sorting, Grouping, Expanding, Pagination, RowSelection, ColumnSizing];
|
|
function createTable(options) {
|
|
var _options$initialState;
|
|
if (options.debugAll || options.debugTable) {
|
|
console.info("Creating Table Instance...");
|
|
}
|
|
let table = {
|
|
_features: features
|
|
};
|
|
const defaultOptions3 = table._features.reduce((obj, feature) => {
|
|
var _a2;
|
|
return Object.assign(obj, (_a2 = feature.getDefaultOptions) == null ? void 0 : _a2.call(feature, table));
|
|
}, {});
|
|
const mergeOptions = (options2) => {
|
|
if (table.options.mergeOptions) {
|
|
return table.options.mergeOptions(defaultOptions3, options2);
|
|
}
|
|
return {
|
|
...defaultOptions3,
|
|
...options2
|
|
};
|
|
};
|
|
const coreInitialState = {};
|
|
let initialState = {
|
|
...coreInitialState,
|
|
...(_options$initialState = options.initialState) != null ? _options$initialState : {}
|
|
};
|
|
table._features.forEach((feature) => {
|
|
var _a2;
|
|
var _feature$getInitialSt;
|
|
initialState = (_feature$getInitialSt = (_a2 = feature.getInitialState) == null ? void 0 : _a2.call(feature, initialState)) != null ? _feature$getInitialSt : initialState;
|
|
});
|
|
const queued = [];
|
|
let queuedTimeout = false;
|
|
const coreInstance = {
|
|
_features: features,
|
|
options: {
|
|
...defaultOptions3,
|
|
...options
|
|
},
|
|
initialState,
|
|
_queue: (cb) => {
|
|
queued.push(cb);
|
|
if (!queuedTimeout) {
|
|
queuedTimeout = true;
|
|
Promise.resolve().then(() => {
|
|
while (queued.length) {
|
|
queued.shift()();
|
|
}
|
|
queuedTimeout = false;
|
|
}).catch((error) => setTimeout(() => {
|
|
throw error;
|
|
}));
|
|
}
|
|
},
|
|
reset: () => {
|
|
table.setState(table.initialState);
|
|
},
|
|
setOptions: (updater) => {
|
|
const newOptions = functionalUpdate(updater, table.options);
|
|
table.options = mergeOptions(newOptions);
|
|
},
|
|
getState: () => {
|
|
return table.options.state;
|
|
},
|
|
setState: (updater) => {
|
|
var _a2, _b2;
|
|
(_b2 = (_a2 = table.options).onStateChange) == null ? void 0 : _b2.call(_a2, updater);
|
|
},
|
|
_getRowId: (row, index, parent) => {
|
|
var _a2, _b2;
|
|
var _table$options$getRow;
|
|
return (_table$options$getRow = (_b2 = (_a2 = table.options).getRowId) == null ? void 0 : _b2.call(_a2, row, index, parent)) != null ? _table$options$getRow : `${parent ? [parent.id, index].join(".") : index}`;
|
|
},
|
|
getCoreRowModel: () => {
|
|
if (!table._getCoreRowModel) {
|
|
table._getCoreRowModel = table.options.getCoreRowModel(table);
|
|
}
|
|
return table._getCoreRowModel();
|
|
},
|
|
getRowModel: () => {
|
|
return table.getPaginationRowModel();
|
|
},
|
|
getRow: (id2) => {
|
|
const row = table.getRowModel().rowsById[id2];
|
|
if (!row) {
|
|
if (true) {
|
|
throw new Error(`getRow expected an ID, but got ${id2}`);
|
|
}
|
|
throw new Error();
|
|
}
|
|
return row;
|
|
},
|
|
_getDefaultColumnDef: memo(() => [table.options.defaultColumn], (defaultColumn) => {
|
|
var _defaultColumn;
|
|
defaultColumn = (_defaultColumn = defaultColumn) != null ? _defaultColumn : {};
|
|
return {
|
|
header: (props2) => {
|
|
const resolvedColumnDef = props2.header.column.columnDef;
|
|
if (resolvedColumnDef.accessorKey) {
|
|
return resolvedColumnDef.accessorKey;
|
|
}
|
|
if (resolvedColumnDef.accessorFn) {
|
|
return resolvedColumnDef.id;
|
|
}
|
|
return null;
|
|
},
|
|
cell: (props2) => {
|
|
var _a2, _b2;
|
|
var _props$renderValue$to;
|
|
return (_props$renderValue$to = (_b2 = (_a2 = props2.renderValue()) == null ? void 0 : _a2.toString) == null ? void 0 : _b2.call(_a2)) != null ? _props$renderValue$to : null;
|
|
},
|
|
...table._features.reduce((obj, feature) => {
|
|
var _a2;
|
|
return Object.assign(obj, (_a2 = feature.getDefaultColumnDef) == null ? void 0 : _a2.call(feature));
|
|
}, {}),
|
|
...defaultColumn
|
|
};
|
|
}, {
|
|
debug: () => {
|
|
var _table$options$debugA;
|
|
return (_table$options$debugA = table.options.debugAll) != null ? _table$options$debugA : table.options.debugColumns;
|
|
},
|
|
key: "getDefaultColumnDef"
|
|
}),
|
|
_getColumnDefs: () => table.options.columns,
|
|
getAllColumns: memo(() => [table._getColumnDefs()], (columnDefs) => {
|
|
const recurseColumns = function(columnDefs2, parent, depth) {
|
|
if (depth === void 0) {
|
|
depth = 0;
|
|
}
|
|
return columnDefs2.map((columnDef) => {
|
|
const column = createColumn(table, columnDef, depth, parent);
|
|
const groupingColumnDef = columnDef;
|
|
column.columns = groupingColumnDef.columns ? recurseColumns(groupingColumnDef.columns, column, depth + 1) : [];
|
|
return column;
|
|
});
|
|
};
|
|
return recurseColumns(columnDefs);
|
|
}, {
|
|
key: "getAllColumns",
|
|
debug: () => {
|
|
var _table$options$debugA2;
|
|
return (_table$options$debugA2 = table.options.debugAll) != null ? _table$options$debugA2 : table.options.debugColumns;
|
|
}
|
|
}),
|
|
getAllFlatColumns: memo(() => [table.getAllColumns()], (allColumns) => {
|
|
return allColumns.flatMap((column) => {
|
|
return column.getFlatColumns();
|
|
});
|
|
}, {
|
|
key: "getAllFlatColumns",
|
|
debug: () => {
|
|
var _table$options$debugA3;
|
|
return (_table$options$debugA3 = table.options.debugAll) != null ? _table$options$debugA3 : table.options.debugColumns;
|
|
}
|
|
}),
|
|
_getAllFlatColumnsById: memo(() => [table.getAllFlatColumns()], (flatColumns) => {
|
|
return flatColumns.reduce((acc, column) => {
|
|
acc[column.id] = column;
|
|
return acc;
|
|
}, {});
|
|
}, {
|
|
key: "getAllFlatColumnsById",
|
|
debug: () => {
|
|
var _table$options$debugA4;
|
|
return (_table$options$debugA4 = table.options.debugAll) != null ? _table$options$debugA4 : table.options.debugColumns;
|
|
}
|
|
}),
|
|
getAllLeafColumns: memo(() => [table.getAllColumns(), table._getOrderColumnsFn()], (allColumns, orderColumns2) => {
|
|
let leafColumns = allColumns.flatMap((column) => column.getLeafColumns());
|
|
return orderColumns2(leafColumns);
|
|
}, {
|
|
key: "getAllLeafColumns",
|
|
debug: () => {
|
|
var _table$options$debugA5;
|
|
return (_table$options$debugA5 = table.options.debugAll) != null ? _table$options$debugA5 : table.options.debugColumns;
|
|
}
|
|
}),
|
|
getColumn: (columnId) => {
|
|
const column = table._getAllFlatColumnsById()[columnId];
|
|
if (!column) {
|
|
if (true) {
|
|
console.warn(`[Table] Column with id ${columnId} does not exist.`);
|
|
}
|
|
throw new Error();
|
|
}
|
|
return column;
|
|
}
|
|
};
|
|
Object.assign(table, coreInstance);
|
|
table._features.forEach((feature) => {
|
|
var _a2;
|
|
return Object.assign(table, (_a2 = feature.createTable) == null ? void 0 : _a2.call(feature, table));
|
|
});
|
|
return table;
|
|
}
|
|
function createCell(table, row, column, columnId) {
|
|
const getRenderValue = () => {
|
|
var _cell$getValue;
|
|
return (_cell$getValue = cell.getValue()) != null ? _cell$getValue : table.options.renderFallbackValue;
|
|
};
|
|
const cell = {
|
|
id: `${row.id}_${column.id}`,
|
|
row,
|
|
column,
|
|
getValue: () => row.getValue(columnId),
|
|
renderValue: getRenderValue,
|
|
getContext: memo(() => [table, column, row, cell], (table2, column2, row2, cell2) => ({
|
|
table: table2,
|
|
column: column2,
|
|
row: row2,
|
|
cell: cell2,
|
|
getValue: cell2.getValue,
|
|
renderValue: cell2.renderValue
|
|
}), {
|
|
key: "cell.getContext",
|
|
debug: () => table.options.debugAll
|
|
})
|
|
};
|
|
table._features.forEach((feature) => {
|
|
var _a2;
|
|
Object.assign(cell, (_a2 = feature.createCell) == null ? void 0 : _a2.call(feature, cell, column, row, table));
|
|
}, {});
|
|
return cell;
|
|
}
|
|
var createRow = (table, id2, original, rowIndex, depth, subRows) => {
|
|
var _a2;
|
|
let row = {
|
|
id: id2,
|
|
index: rowIndex,
|
|
original,
|
|
depth,
|
|
_valuesCache: {},
|
|
_uniqueValuesCache: {},
|
|
getValue: (columnId) => {
|
|
if (row._valuesCache.hasOwnProperty(columnId)) {
|
|
return row._valuesCache[columnId];
|
|
}
|
|
const column = table.getColumn(columnId);
|
|
if (!column.accessorFn) {
|
|
return void 0;
|
|
}
|
|
row._valuesCache[columnId] = column.accessorFn(row.original, rowIndex);
|
|
return row._valuesCache[columnId];
|
|
},
|
|
getUniqueValues: (columnId) => {
|
|
if (row._uniqueValuesCache.hasOwnProperty(columnId)) {
|
|
return row._uniqueValuesCache[columnId];
|
|
}
|
|
const column = table.getColumn(columnId);
|
|
if (!column.accessorFn) {
|
|
return void 0;
|
|
}
|
|
if (!column.columnDef.getUniqueValues) {
|
|
row._uniqueValuesCache[columnId] = [row.getValue(columnId)];
|
|
return row._uniqueValuesCache[columnId];
|
|
}
|
|
row._uniqueValuesCache[columnId] = column.columnDef.getUniqueValues(row.original, rowIndex);
|
|
return row._uniqueValuesCache[columnId];
|
|
},
|
|
renderValue: (columnId) => {
|
|
var _row$getValue;
|
|
return (_row$getValue = row.getValue(columnId)) != null ? _row$getValue : table.options.renderFallbackValue;
|
|
},
|
|
subRows: subRows != null ? subRows : [],
|
|
getLeafRows: () => flattenBy(row.subRows, (d5) => d5.subRows),
|
|
getAllCells: memo(() => [table.getAllLeafColumns()], (leafColumns) => {
|
|
return leafColumns.map((column) => {
|
|
return createCell(table, row, column, column.id);
|
|
});
|
|
}, {
|
|
key: "row.getAllCells",
|
|
debug: () => {
|
|
var _table$options$debugA;
|
|
return (_table$options$debugA = table.options.debugAll) != null ? _table$options$debugA : table.options.debugRows;
|
|
}
|
|
}),
|
|
_getAllCellsByColumnId: memo(() => [row.getAllCells()], (allCells) => {
|
|
return allCells.reduce((acc, cell) => {
|
|
acc[cell.column.id] = cell;
|
|
return acc;
|
|
}, {});
|
|
}, {
|
|
key: false,
|
|
debug: () => {
|
|
var _table$options$debugA2;
|
|
return (_table$options$debugA2 = table.options.debugAll) != null ? _table$options$debugA2 : table.options.debugRows;
|
|
}
|
|
})
|
|
};
|
|
for (let i4 = 0; i4 < table._features.length; i4++) {
|
|
const feature = table._features[i4];
|
|
Object.assign(row, (_a2 = feature == null ? void 0 : feature.createRow) == null ? void 0 : _a2.call(feature, row, table));
|
|
}
|
|
return row;
|
|
};
|
|
function getCoreRowModel() {
|
|
return (table) => memo(() => [table.options.data], (data) => {
|
|
const rowModel = {
|
|
rows: [],
|
|
flatRows: [],
|
|
rowsById: {}
|
|
};
|
|
const accessRows = function(originalRows, depth, parent) {
|
|
var _a2;
|
|
if (depth === void 0) {
|
|
depth = 0;
|
|
}
|
|
const rows = [];
|
|
for (let i4 = 0; i4 < originalRows.length; i4++) {
|
|
const row = createRow(table, table._getRowId(originalRows[i4], i4, parent), originalRows[i4], i4, depth);
|
|
rowModel.flatRows.push(row);
|
|
rowModel.rowsById[row.id] = row;
|
|
rows.push(row);
|
|
if (table.options.getSubRows) {
|
|
row.originalSubRows = table.options.getSubRows(originalRows[i4], i4);
|
|
if ((_a2 = row.originalSubRows) == null ? void 0 : _a2.length) {
|
|
row.subRows = accessRows(row.originalSubRows, depth + 1, row);
|
|
}
|
|
}
|
|
}
|
|
return rows;
|
|
};
|
|
rowModel.rows = accessRows(data);
|
|
return rowModel;
|
|
}, {
|
|
key: "getRowModel",
|
|
debug: () => {
|
|
var _table$options$debugA;
|
|
return (_table$options$debugA = table.options.debugAll) != null ? _table$options$debugA : table.options.debugTable;
|
|
},
|
|
onChange: () => {
|
|
table._autoResetPageIndex();
|
|
}
|
|
});
|
|
}
|
|
function getGroupedRowModel() {
|
|
return (table) => memo(() => [table.getState().grouping, table.getPreGroupedRowModel()], (grouping, rowModel) => {
|
|
if (!rowModel.rows.length || !grouping.length) {
|
|
return rowModel;
|
|
}
|
|
const existingGrouping = grouping.filter((columnId) => table.getColumn(columnId));
|
|
const groupedFlatRows = [];
|
|
const groupedRowsById = {};
|
|
const groupUpRecursively = function(rows, depth, parentId) {
|
|
if (depth === void 0) {
|
|
depth = 0;
|
|
}
|
|
if (depth >= existingGrouping.length) {
|
|
return rows.map((row) => {
|
|
row.depth = depth;
|
|
groupedFlatRows.push(row);
|
|
groupedRowsById[row.id] = row;
|
|
if (row.subRows) {
|
|
row.subRows = groupUpRecursively(row.subRows, depth + 1);
|
|
}
|
|
return row;
|
|
});
|
|
}
|
|
const columnId = existingGrouping[depth];
|
|
const rowGroupsMap = groupBy(rows, columnId);
|
|
const aggregatedGroupedRows = Array.from(rowGroupsMap.entries()).map((_ref, index) => {
|
|
let [groupingValue, groupedRows2] = _ref;
|
|
let id2 = `${columnId}:${groupingValue}`;
|
|
id2 = parentId ? `${parentId}>${id2}` : id2;
|
|
const subRows = groupUpRecursively(groupedRows2, depth + 1, id2);
|
|
const leafRows = depth ? flattenBy(groupedRows2, (row2) => row2.subRows) : groupedRows2;
|
|
const row = createRow(table, id2, leafRows[0].original, index, depth);
|
|
Object.assign(row, {
|
|
groupingColumnId: columnId,
|
|
groupingValue,
|
|
subRows,
|
|
leafRows,
|
|
getValue: (columnId2) => {
|
|
if (existingGrouping.includes(columnId2)) {
|
|
if (row._valuesCache.hasOwnProperty(columnId2)) {
|
|
return row._valuesCache[columnId2];
|
|
}
|
|
if (groupedRows2[0]) {
|
|
var _groupedRows$0$getVal;
|
|
row._valuesCache[columnId2] = (_groupedRows$0$getVal = groupedRows2[0].getValue(columnId2)) != null ? _groupedRows$0$getVal : void 0;
|
|
}
|
|
return row._valuesCache[columnId2];
|
|
}
|
|
if (row._groupingValuesCache.hasOwnProperty(columnId2)) {
|
|
return row._groupingValuesCache[columnId2];
|
|
}
|
|
const column = table.getColumn(columnId2);
|
|
const aggregateFn = column.getAggregationFn();
|
|
if (aggregateFn) {
|
|
row._groupingValuesCache[columnId2] = aggregateFn(columnId2, leafRows, groupedRows2);
|
|
return row._groupingValuesCache[columnId2];
|
|
}
|
|
}
|
|
});
|
|
subRows.forEach((subRow) => {
|
|
groupedFlatRows.push(subRow);
|
|
groupedRowsById[subRow.id] = subRow;
|
|
});
|
|
return row;
|
|
});
|
|
return aggregatedGroupedRows;
|
|
};
|
|
const groupedRows = groupUpRecursively(rowModel.rows, 0, "");
|
|
groupedRows.forEach((subRow) => {
|
|
groupedFlatRows.push(subRow);
|
|
groupedRowsById[subRow.id] = subRow;
|
|
});
|
|
return {
|
|
rows: groupedRows,
|
|
flatRows: groupedFlatRows,
|
|
rowsById: groupedRowsById
|
|
};
|
|
}, {
|
|
key: "getGroupedRowModel",
|
|
debug: () => {
|
|
var _table$options$debugA;
|
|
return (_table$options$debugA = table.options.debugAll) != null ? _table$options$debugA : table.options.debugTable;
|
|
},
|
|
onChange: () => {
|
|
table._queue(() => {
|
|
table._autoResetExpanded();
|
|
table._autoResetPageIndex();
|
|
});
|
|
}
|
|
});
|
|
}
|
|
function groupBy(rows, columnId) {
|
|
const groupMap = /* @__PURE__ */ new Map();
|
|
return rows.reduce((map, row) => {
|
|
const resKey = `${row.getValue(columnId)}`;
|
|
const previous = map.get(resKey);
|
|
if (!previous) {
|
|
map.set(resKey, [row]);
|
|
} else {
|
|
previous.push(row);
|
|
}
|
|
return map;
|
|
}, groupMap);
|
|
}
|
|
function getExpandedRowModel() {
|
|
return (table) => memo(() => [table.getState().expanded, table.getPreExpandedRowModel(), table.options.paginateExpandedRows], (expanded, rowModel, paginateExpandedRows) => {
|
|
if (!rowModel.rows.length || expanded !== true && !Object.keys(expanded != null ? expanded : {}).length) {
|
|
return rowModel;
|
|
}
|
|
if (!paginateExpandedRows) {
|
|
return rowModel;
|
|
}
|
|
return expandRows(rowModel);
|
|
}, {
|
|
key: "getExpandedRowModel",
|
|
debug: () => {
|
|
var _table$options$debugA;
|
|
return (_table$options$debugA = table.options.debugAll) != null ? _table$options$debugA : table.options.debugTable;
|
|
}
|
|
});
|
|
}
|
|
function expandRows(rowModel) {
|
|
const expandedRows = [];
|
|
const handleRow = (row) => {
|
|
var _a2;
|
|
expandedRows.push(row);
|
|
if (((_a2 = row.subRows) == null ? void 0 : _a2.length) && row.getIsExpanded()) {
|
|
row.subRows.forEach(handleRow);
|
|
}
|
|
};
|
|
rowModel.rows.forEach(handleRow);
|
|
return {
|
|
rows: expandedRows,
|
|
flatRows: rowModel.flatRows,
|
|
rowsById: rowModel.rowsById
|
|
};
|
|
}
|
|
|
|
// node_modules/@tanstack/react-table/build/lib/index.mjs
|
|
function flexRender(Comp, props2) {
|
|
return !Comp ? null : isReactComponent(Comp) ? /* @__PURE__ */ h(Comp, props2) : Comp;
|
|
}
|
|
function isReactComponent(component) {
|
|
return isClassComponent(component) || typeof component === "function" || isExoticComponent(component);
|
|
}
|
|
function isClassComponent(component) {
|
|
return typeof component === "function" && (() => {
|
|
const proto = Object.getPrototypeOf(component);
|
|
return proto.prototype && proto.prototype.isReactComponent;
|
|
})();
|
|
}
|
|
function isExoticComponent(component) {
|
|
return typeof component === "object" && typeof component.$$typeof === "symbol" && ["react.memo", "react.forward_ref"].includes(component.$$typeof.description);
|
|
}
|
|
function useReactTable(options) {
|
|
const resolvedOptions = {
|
|
state: {},
|
|
onStateChange: () => {
|
|
},
|
|
renderFallbackValue: null,
|
|
...options
|
|
};
|
|
const [tableRef] = p2(() => ({
|
|
current: createTable(resolvedOptions)
|
|
}));
|
|
const [state, setState] = p2(() => tableRef.current.initialState);
|
|
tableRef.current.setOptions((prev) => ({
|
|
...prev,
|
|
...options,
|
|
state: {
|
|
...state,
|
|
...options.state
|
|
},
|
|
onStateChange: (updater) => {
|
|
var _a2;
|
|
setState(updater);
|
|
(_a2 = options.onStateChange) == null ? void 0 : _a2.call(options, updater);
|
|
}
|
|
}));
|
|
return tableRef.current;
|
|
}
|
|
|
|
// src/components/ui/menus/menuItems.tsx
|
|
var import_obsidian7 = require("obsidian");
|
|
|
|
// src/components/ui/menus/selectMenu/concerns/focusNextElement.js
|
|
function focusNextElement(scope, currentTarget) {
|
|
const interactiveEls = scope.querySelectorAll("a,button,input");
|
|
const currentEl = Array.prototype.findIndex.call(
|
|
interactiveEls,
|
|
(element) => element === currentTarget
|
|
);
|
|
const nextEl = interactiveEls[currentEl - 1] || interactiveEls[currentEl + 1];
|
|
if (nextEl) {
|
|
nextEl.focus();
|
|
}
|
|
}
|
|
|
|
// src/components/ui/menus/selectMenu/SelectMenuInput.tsx
|
|
var SIZER_STYLES = {
|
|
position: "absolute",
|
|
width: 0,
|
|
height: 0,
|
|
visibility: "hidden",
|
|
overflow: "scroll",
|
|
whiteSpace: "pre"
|
|
};
|
|
var STYLE_PROPS = [
|
|
"fontSize",
|
|
"fontFamily",
|
|
"fontWeight",
|
|
"fontStyle",
|
|
"letterSpacing",
|
|
"textTransform"
|
|
];
|
|
var SelectMenuInput = k3(
|
|
(props2, input) => {
|
|
const { classNames: classNames8, inputAttributes, inputEventHandlers, index } = props2;
|
|
const sizer = _2(null);
|
|
const [inputWidth, setInputWidth] = p2(null);
|
|
const [query, setQuery] = p2("");
|
|
const [placeholderText, setPlaceholderText] = p2("");
|
|
h2(() => {
|
|
copyInputStyles();
|
|
updateInputWidth();
|
|
setTimeout(() => {
|
|
input.current.focus();
|
|
}, 50);
|
|
}, []);
|
|
h2(() => {
|
|
if (query !== props2.query || placeholderText !== props2.placeholderText) {
|
|
setQuery(props2.query);
|
|
setPlaceholderText(props2.placeholderText);
|
|
updateInputWidth();
|
|
}
|
|
}, [props2.query, props2.placeholderText]);
|
|
const copyInputStyles = () => {
|
|
const inputStyle = window.getComputedStyle(input.current);
|
|
STYLE_PROPS.forEach((prop) => {
|
|
sizer.current.style[prop] = inputStyle[prop];
|
|
});
|
|
};
|
|
const updateInputWidth = () => {
|
|
let _inputWidth;
|
|
_inputWidth = Math.ceil(sizer.current.scrollWidth) + 2;
|
|
if (_inputWidth !== inputWidth) {
|
|
setInputWidth(_inputWidth);
|
|
}
|
|
};
|
|
return /* @__PURE__ */ bn.createElement("div", {
|
|
className: classNames8.searchWrapper
|
|
}, /* @__PURE__ */ bn.createElement("input", {
|
|
...inputAttributes,
|
|
...inputEventHandlers,
|
|
ref: input,
|
|
value: query,
|
|
placeholder: placeholderText,
|
|
className: classNames8.searchInput,
|
|
role: "combobox",
|
|
style: { width: "100%" }
|
|
}), /* @__PURE__ */ bn.createElement("div", {
|
|
ref: sizer,
|
|
style: SIZER_STYLES
|
|
}, query || placeholderText));
|
|
}
|
|
);
|
|
var SelectMenuInput_default = SelectMenuInput;
|
|
|
|
// src/components/ui/menus/selectMenu/SelectMenuSuggestions.tsx
|
|
function markIt(name, query) {
|
|
const regexp = matchAny(query);
|
|
return name.replace(regexp, "<mark>$&</mark>");
|
|
}
|
|
var SelectMenuSuggestionsComponent = (props2) => {
|
|
const ref = _2(null);
|
|
h2(() => {
|
|
var _a2;
|
|
if (props2.active) {
|
|
(_a2 = ref == null ? void 0 : ref.current) == null ? void 0 : _a2.scrollIntoViewIfNeeded();
|
|
}
|
|
}, [props2.active]);
|
|
return /* @__PURE__ */ bn.createElement(bn.Fragment, null, props2.item.onToggle && /* @__PURE__ */ bn.createElement("div", null, "Toggle"), /* @__PURE__ */ bn.createElement("span", {
|
|
ref,
|
|
dangerouslySetInnerHTML: {
|
|
__html: markIt(props2.item.name, props2.query)
|
|
}
|
|
}), props2.item.description && /* @__PURE__ */ bn.createElement("span", {
|
|
className: "mk-description",
|
|
ref,
|
|
dangerouslySetInnerHTML: {
|
|
__html: markIt(props2.item.description, props2.query)
|
|
}
|
|
}), props2.item.removeable && /* @__PURE__ */ bn.createElement("div", null, "Remove"));
|
|
};
|
|
var SelectMenuSuggestions = (props2) => {
|
|
const timer = _2(null);
|
|
const mouseOver = (e4, index) => {
|
|
if (!props2.hoverSelect) {
|
|
return;
|
|
}
|
|
timer.current && clearTimeout(timer.current);
|
|
timer.current = setTimeout(() => props2.setIndex(index), 300);
|
|
};
|
|
const options = props2.options.map((item, index) => {
|
|
const key2 = `${props2.id}-${index}`;
|
|
const classNames8 = [];
|
|
if (props2.index === index) {
|
|
classNames8.push(props2.classNames.suggestionActive);
|
|
}
|
|
if (item.disabled) {
|
|
classNames8.push(props2.classNames.suggestionDisabled);
|
|
}
|
|
return /* @__PURE__ */ bn.createElement("li", {
|
|
id: key2,
|
|
key: key2,
|
|
role: "option",
|
|
className: classNames8.join(" "),
|
|
"aria-disabled": Boolean(item.disabled),
|
|
onMouseDown: (e4) => e4.preventDefault(),
|
|
onClick: () => props2.addTag(item),
|
|
onMouseOver: (e4) => mouseOver(e4, index),
|
|
onMouseOut: (e4) => props2.hoverSelect && clearTimeout(timer.current)
|
|
}, /* @__PURE__ */ bn.createElement(SelectMenuSuggestionsComponent, {
|
|
item,
|
|
query: props2.query,
|
|
active: index == props2.index
|
|
}));
|
|
});
|
|
return /* @__PURE__ */ bn.createElement("div", {
|
|
className: props2.classNames.suggestions
|
|
}, /* @__PURE__ */ bn.createElement("ul", {
|
|
role: "listbox",
|
|
id: props2.id
|
|
}, options, props2.query && props2.allowNew && /* @__PURE__ */ bn.createElement("li", {
|
|
onMouseDown: (e4) => e4.preventDefault(),
|
|
onClick: () => props2.addTag({ name: props2.query, value: props2.query })
|
|
}, "Add ", props2.query)));
|
|
};
|
|
var SelectMenuSuggestions_default = SelectMenuSuggestions;
|
|
|
|
// src/components/ui/menus/selectMenu/SelectMenuPill.tsx
|
|
var SelectMenuPillComponent = (props2) => {
|
|
return /* @__PURE__ */ bn.createElement("button", {
|
|
type: "button",
|
|
className: props2.classNames.selectedTag,
|
|
onClick: props2.onDelete
|
|
}, /* @__PURE__ */ bn.createElement("span", {
|
|
className: props2.classNames.selectedTagName
|
|
}, props2.tag.name));
|
|
};
|
|
var SelectMenuPill_default = SelectMenuPillComponent;
|
|
|
|
// src/components/ui/menus/selectMenu/SelectMenuComponent.tsx
|
|
var import_lodash3 = __toESM(require_lodash());
|
|
var KEYS = {
|
|
ENTER: "Enter",
|
|
TAB: "Tab",
|
|
BACKSPACE: "Backspace",
|
|
UP_ARROW: "ArrowUp",
|
|
UP_ARROW_COMPAT: "Up",
|
|
DOWN_ARROW: "ArrowDown",
|
|
DOWN_ARROW_COMPAT: "Down"
|
|
};
|
|
var CLASS_NAMES = {
|
|
root: "mk-options-menu",
|
|
rootFocused: "is-focused",
|
|
selected: "mk-options-menu__selected",
|
|
selectedTag: "mk-options-menu__selected-tag",
|
|
selectedTagName: "mk-options-menu__selected-tag-name",
|
|
search: "mk-options-menu__search",
|
|
searchWrapper: "mk-options-menu__search-wrapper",
|
|
searchInput: "mk-options-menu__search-input",
|
|
suggestions: "mk-options-menu__suggestions",
|
|
suggestionActive: "is-active",
|
|
suggestionDisabled: "is-disabled"
|
|
};
|
|
var defaultProps = {
|
|
id: "SelectMenu",
|
|
tags: [],
|
|
suggestionsOnly: false,
|
|
placeholderText: i18n_default.labels.optionItemSelectPlaceholder,
|
|
noSuggestionsText: null,
|
|
newTagText: null,
|
|
suggestions: [],
|
|
suggestionsFilter: defaultSuggestionsFilter,
|
|
suggestionsTransform: null,
|
|
classNames: CLASS_NAMES,
|
|
delimiters: [KEYS.ENTER],
|
|
minQueryLength: 2,
|
|
maxSuggestionsLength: 8,
|
|
inputAttributes: {},
|
|
hoverSelect: false
|
|
};
|
|
var findMatchIndex = (options, query) => {
|
|
return options.findIndex((option) => matchExact(query).test(option.name));
|
|
};
|
|
var pressDelimiter = (props2, query, index, options, addTag) => {
|
|
if (query.length >= props2.minQueryLength) {
|
|
const match2 = findMatchIndex(options, query);
|
|
const _index = index === -1 ? match2 : index;
|
|
const tag = _index > -1 ? options[_index] : null;
|
|
if (tag) {
|
|
addTag(tag);
|
|
} else {
|
|
addTag({ name: query, value: query });
|
|
}
|
|
}
|
|
};
|
|
function defaultSuggestionsFilter(item, query) {
|
|
const regexp = matchAny(query);
|
|
return regexp.test(item.name);
|
|
}
|
|
function getOptions(props2, query) {
|
|
let options;
|
|
if (props2.suggestionsTransform) {
|
|
options = props2.suggestionsTransform(query, props2.suggestions);
|
|
} else {
|
|
options = props2.suggestions.filter(
|
|
(item) => props2.suggestionsFilter(item, query)
|
|
);
|
|
}
|
|
options = options.slice(0, props2.maxSuggestionsLength);
|
|
if (props2.newTagText && findMatchIndex(options, query) === -1) {
|
|
options.push({ id: 0, name: query, value: query });
|
|
} else if (props2.noSuggestionsText && options.length === 0) {
|
|
options.push({
|
|
id: 0,
|
|
name: props2.noSuggestionsText,
|
|
value: "",
|
|
disabled: true
|
|
});
|
|
}
|
|
return options;
|
|
}
|
|
var SelectMenuComponent = bn.forwardRef((_props, ref) => {
|
|
const props2 = { ...defaultProps, ..._props };
|
|
const [options, setOptions] = p2([]);
|
|
const inputRef = _2(null);
|
|
const [query, setQuery] = p2("");
|
|
const [focused, setFocused] = p2(false);
|
|
const [index, setIndex] = p2(0);
|
|
const onComposition = _2(false);
|
|
h2(() => {
|
|
if (ref) {
|
|
ref.current = () => {
|
|
var _a2;
|
|
if (!focused) {
|
|
(_a2 = inputRef == null ? void 0 : inputRef.current) == null ? void 0 : _a2.focus();
|
|
setFocused(true);
|
|
return false;
|
|
}
|
|
return true;
|
|
};
|
|
}
|
|
}, [focused]);
|
|
h2(() => {
|
|
var _a2;
|
|
if (index != -1 && props2.onHover && props2.hoverSelect) {
|
|
debounceFn((_a2 = options[index]) == null ? void 0 : _a2.value);
|
|
}
|
|
}, [index, options]);
|
|
const debounceFn = T2((0, import_lodash3.debounce)(handleDebounceFn, 100), []);
|
|
function handleDebounceFn(inputValue) {
|
|
props2.onHover(inputValue);
|
|
}
|
|
h2(() => {
|
|
if (query.length == 0 && props2.defaultSuggestions) {
|
|
setOptions(props2.defaultSuggestions);
|
|
return;
|
|
}
|
|
setOptions(getOptions(props2, query));
|
|
}, [query, props2.suggestions]);
|
|
const container = _2(null);
|
|
const onInput = (e4) => {
|
|
if (e4.type === "compositionstart") {
|
|
onComposition.current = true;
|
|
return;
|
|
}
|
|
if (e4.type === "compositionend") {
|
|
onComposition.current = false;
|
|
}
|
|
if (onComposition.current) {
|
|
return;
|
|
}
|
|
const _query = e4.target.value;
|
|
if (props2.onInput) {
|
|
props2.onInput(_query);
|
|
}
|
|
if (_query.length === query.length + 1 && props2.delimiters.indexOf(query.slice(-1)) > -1) {
|
|
pressDelimiter(props2, query, index, options, addTag);
|
|
} else if (_query !== query) {
|
|
setQuery(_query);
|
|
}
|
|
};
|
|
const onKeyDown = (e4) => {
|
|
if (props2.delimiters.indexOf(e4.key) > -1) {
|
|
if (query || index > -1) {
|
|
e4.preventDefault();
|
|
}
|
|
pressDelimiter(props2, query, index, options, addTag);
|
|
}
|
|
if (e4.key === KEYS.BACKSPACE) {
|
|
pressBackspaceKey();
|
|
}
|
|
if (e4.key === KEYS.UP_ARROW || e4.key === KEYS.UP_ARROW_COMPAT) {
|
|
pressUpKey(e4);
|
|
}
|
|
if (e4.key === KEYS.DOWN_ARROW || e4.key === KEYS.DOWN_ARROW_COMPAT) {
|
|
pressDownKey(e4);
|
|
}
|
|
};
|
|
const onBlur = () => {
|
|
setFocused(false);
|
|
if (props2.onBlur) {
|
|
props2.onBlur();
|
|
}
|
|
};
|
|
const onFocus = () => {
|
|
setFocused(true);
|
|
if (props2.onFocus) {
|
|
props2.onFocus();
|
|
}
|
|
};
|
|
const onDeleteTag = (index2, event) => {
|
|
if (container.current) {
|
|
focusNextElement(container.current, event.currentTarget);
|
|
}
|
|
deleteTag(index2);
|
|
};
|
|
const addTag = (tag) => {
|
|
if (tag.disabled) {
|
|
return;
|
|
}
|
|
if (props2.onValidate && !props2.onValidate(tag)) {
|
|
return;
|
|
}
|
|
props2.onAddition(tag);
|
|
clearInput();
|
|
};
|
|
const deleteTag = (i4) => {
|
|
props2.onDelete(i4);
|
|
};
|
|
const clearInput = () => {
|
|
setQuery("");
|
|
setIndex(-1);
|
|
};
|
|
const clearSelectedIndex = () => {
|
|
setIndex(-1);
|
|
};
|
|
const pressUpKey = (e4) => {
|
|
e4.preventDefault();
|
|
const size = options.length - 1;
|
|
setIndex(index <= 0 ? size : index - 1);
|
|
};
|
|
const pressDownKey = (e4) => {
|
|
e4.preventDefault();
|
|
const size = options.length - 1;
|
|
setIndex((i4) => i4 >= size ? 0 : i4 + 1);
|
|
};
|
|
function pressBackspaceKey() {
|
|
if (!query.length) {
|
|
deleteTag(props2.tags.length - 1);
|
|
}
|
|
}
|
|
const focusInput = () => {
|
|
inputRef.current.focus();
|
|
};
|
|
const inputEventHandlers = {
|
|
onChange: onInput,
|
|
onBlur,
|
|
onFocus,
|
|
onInput: () => {
|
|
},
|
|
onKeyDown,
|
|
onCompositionEnd: onInput,
|
|
onCompositionStart: onInput
|
|
};
|
|
const expanded = focused && query.length >= props2.minQueryLength;
|
|
const classNames8 = Object.assign({}, CLASS_NAMES, props2.classNames);
|
|
const rootClassNames = [classNames8.root];
|
|
focused && rootClassNames.push(classNames8.rootFocused);
|
|
return /* @__PURE__ */ bn.createElement("div", {
|
|
ref: container,
|
|
className: rootClassNames.join(" ")
|
|
}, !props2.suggestionsOnly ? /* @__PURE__ */ bn.createElement("div", {
|
|
className: classNames8.selected,
|
|
"aria-relevant": "additions removals",
|
|
"aria-live": "polite"
|
|
}, /* @__PURE__ */ bn.createElement(bn.Fragment, null, props2.tags.map((tag, i4) => /* @__PURE__ */ bn.createElement(SelectMenuPill_default, {
|
|
key: i4,
|
|
tag,
|
|
classNames: classNames8,
|
|
onDelete: (e4) => onDeleteTag(i4, e4)
|
|
}))), /* @__PURE__ */ bn.createElement("div", {
|
|
className: classNames8.search
|
|
}, /* @__PURE__ */ bn.createElement(SelectMenuInput_default, {
|
|
ref: inputRef,
|
|
query,
|
|
index,
|
|
id: props2.id,
|
|
classNames: classNames8,
|
|
inputAttributes: props2.inputAttributes,
|
|
inputEventHandlers,
|
|
expanded,
|
|
placeholderText: props2.placeholderText
|
|
}))) : null, options.length || props2.allowNew ? /* @__PURE__ */ bn.createElement(SelectMenuSuggestions_default, {
|
|
options,
|
|
hoverSelect: props2.hoverSelect,
|
|
query,
|
|
setIndex,
|
|
index,
|
|
id: props2.id,
|
|
classNames: classNames8,
|
|
expanded,
|
|
addTag,
|
|
allowNew: props2.allowNew
|
|
}) : null, props2.previewComponent);
|
|
});
|
|
var SelectMenuComponent_default = SelectMenuComponent;
|
|
|
|
// src/components/ui/menus/selectMenu.tsx
|
|
var SelectMenu = bn.forwardRef(
|
|
(props2, ref) => {
|
|
var _a2;
|
|
const initialOptions = props2.options.map((o3, i4) => {
|
|
return {
|
|
...o3,
|
|
id: i4 + 1
|
|
};
|
|
});
|
|
h2(() => {
|
|
setSuggestions(
|
|
props2.options.map((o3, i4) => {
|
|
return {
|
|
...o3,
|
|
id: i4 + 1
|
|
};
|
|
})
|
|
);
|
|
}, [props2.options]);
|
|
const [suggestions, setSuggestions] = p2(initialOptions);
|
|
const [tags, setTags] = p2(
|
|
props2.value.map(
|
|
(v3) => {
|
|
var _a3;
|
|
return (_a3 = initialOptions.find((f4) => f4.value == v3)) != null ? _a3 : {
|
|
id: 0,
|
|
name: v3,
|
|
value: v3
|
|
};
|
|
}
|
|
)
|
|
);
|
|
const onDelete = T2(
|
|
(tagIndex) => {
|
|
const newTags = tags.filter((_5, i4) => i4 !== tagIndex);
|
|
setTags(newTags);
|
|
props2.saveOptions(
|
|
suggestions.map((f4) => f4.value),
|
|
newTags.map((f4) => f4.value)
|
|
);
|
|
},
|
|
[suggestions, tags]
|
|
);
|
|
const onAddition = T2(
|
|
(newTag) => {
|
|
let tag = newTag;
|
|
let newSuggestions = suggestions;
|
|
let newTags = tags;
|
|
if (!suggestions.find((s5) => s5.value == newTag.value)) {
|
|
tag = {
|
|
id: suggestions.length + 1,
|
|
name: newTag.name,
|
|
value: newTag.name
|
|
};
|
|
newSuggestions = [...suggestions, tag];
|
|
setSuggestions(newSuggestions);
|
|
}
|
|
if (props2.multi) {
|
|
if (!tags.find((t4) => t4.value == tag.value)) {
|
|
newTags = [...tags, tag];
|
|
setTags(newTags);
|
|
}
|
|
} else {
|
|
newTags = [tag];
|
|
setTags(newTags);
|
|
}
|
|
props2.saveOptions(
|
|
newSuggestions.map((f4) => f4.value),
|
|
newTags.map((f4) => f4.value)
|
|
);
|
|
if (!props2.multi) {
|
|
props2.hide();
|
|
}
|
|
},
|
|
[tags, suggestions]
|
|
);
|
|
const onValidation = T2(
|
|
(newTag) => {
|
|
if (!props2.editable && !suggestions.find((s5) => s5.value == newTag.value)) {
|
|
return false;
|
|
}
|
|
if (newTag.name.length == 0) {
|
|
return false;
|
|
}
|
|
return true;
|
|
},
|
|
[suggestions]
|
|
);
|
|
return /* @__PURE__ */ bn.createElement(SelectMenuComponent_default, {
|
|
tags: props2.multi ? tags : [],
|
|
suggestions,
|
|
ref,
|
|
onDelete,
|
|
onAddition,
|
|
onValidate: onValidation,
|
|
defaultSuggestions: props2.defaultOptions,
|
|
placeholderText: (_a2 = props2.placeholder) != null ? _a2 : "",
|
|
minQueryLength: 0,
|
|
onHover: props2.onHover,
|
|
hoverSelect: props2.onHover ? true : false,
|
|
maxSuggestionsLength: props2.showAll ? Math.min(50, props2.options.length) : 8,
|
|
suggestionsOnly: !props2.searchable && !props2.editable,
|
|
allowNew: props2.editable,
|
|
previewComponent: props2.previewComponent
|
|
});
|
|
}
|
|
);
|
|
|
|
// src/components/ui/menus/menuItems.tsx
|
|
var inputMenuItem = (menuItem, value, setValue) => {
|
|
const frag = document.createDocumentFragment();
|
|
const spanEl = frag.createEl("span");
|
|
const inputEl = frag.createEl("input");
|
|
inputEl.type = "text";
|
|
inputEl.value = value;
|
|
inputEl.addEventListener("click", (e4) => {
|
|
e4.stopImmediatePropagation();
|
|
});
|
|
inputEl.addEventListener("mousedown", (e4) => {
|
|
e4.stopImmediatePropagation();
|
|
});
|
|
inputEl.addEventListener("mouseup", (e4) => {
|
|
e4.stopImmediatePropagation();
|
|
});
|
|
inputEl.addEventListener("blur", (e4) => {
|
|
setValue(inputEl.value);
|
|
});
|
|
menuItem.dom.toggleClass("mk-menu-input", true);
|
|
menuItem.setTitle(frag);
|
|
return menuItem;
|
|
};
|
|
var showSelectMenu = (point, optionProps) => {
|
|
const menu = new import_obsidian7.Menu();
|
|
menu.dom.toggleClass("mk-menu", true);
|
|
menu.setUseNativeMenu(false);
|
|
const frag = document.createDocumentFragment();
|
|
const div = frag.createDiv("mk-options-container");
|
|
div.style.minHeight = Math.min(
|
|
200,
|
|
(optionProps.options.length + (optionProps.searchable ? 1 : 0)) * 28
|
|
).toString() + "px";
|
|
div.addEventListener("click", (e4) => {
|
|
e4.stopImmediatePropagation();
|
|
});
|
|
div.addEventListener("mousedown", (e4) => {
|
|
e4.stopImmediatePropagation();
|
|
});
|
|
div.addEventListener("mouseup", (e4) => {
|
|
e4.stopImmediatePropagation();
|
|
});
|
|
div.addEventListener("keydown", (e4) => {
|
|
});
|
|
menu.onHide(() => optionProps.onHide && optionProps.onHide());
|
|
const root = createRoot(div);
|
|
root.render(
|
|
/* @__PURE__ */ bn.createElement(bn.Fragment, null, /* @__PURE__ */ bn.createElement(SelectMenu, {
|
|
hide: () => {
|
|
menu.hide();
|
|
optionProps.onHide && optionProps.onHide();
|
|
},
|
|
...optionProps
|
|
}))
|
|
);
|
|
menu.addItem((item) => {
|
|
item.setTitle(frag);
|
|
});
|
|
const keys = [...menu.scope.keys];
|
|
for (let i4 = 0; i4 < keys.length; i4++) {
|
|
if (keys[i4].key != "Escape") {
|
|
menu.scope.unregister(keys[i4]);
|
|
}
|
|
}
|
|
menu.showAtPosition(point);
|
|
return menu;
|
|
};
|
|
var disclosureMenuItem = (menuItem, multi, editable, title, value, options, saveOptions) => {
|
|
const frag = document.createDocumentFragment();
|
|
const div = frag.createDiv("title");
|
|
div.textContent = title;
|
|
const div2 = frag.createDiv("disclosure");
|
|
div2.textContent = value;
|
|
menuItem.setTitle(frag);
|
|
menuItem.onClick((ev) => {
|
|
var _a2;
|
|
ev.stopPropagation();
|
|
const offset = menuItem.dom.getBoundingClientRect();
|
|
showSelectMenu(
|
|
{ x: offset.right + 10, y: offset.top },
|
|
{
|
|
multi,
|
|
editable,
|
|
value: (_a2 = splitString(value)) != null ? _a2 : [],
|
|
options,
|
|
saveOptions,
|
|
searchable: true,
|
|
showAll: true
|
|
}
|
|
);
|
|
});
|
|
return menuItem;
|
|
};
|
|
|
|
// src/components/ContextView/DataTypeView/OptionCell.tsx
|
|
var OptionCell = (props2) => {
|
|
var _a2, _b2;
|
|
const initialValue = (props2.multi ? (_a2 = splitString(props2.initialValue)) != null ? _a2 : [] : [props2.initialValue]).filter((f4) => f4);
|
|
const initialOptions = [
|
|
...(_b2 = splitString(props2.options).filter((f4) => f4).map((t4) => ({ name: t4, value: t4 }))) != null ? _b2 : [],
|
|
...initialValue.map((f4) => ({ name: f4, value: f4 }))
|
|
].filter(onlyUniqueProp("value"));
|
|
const [options, setOptions] = p2(initialOptions);
|
|
const [value, setValue] = p2(initialValue);
|
|
h2(() => {
|
|
var _a3;
|
|
setValue(
|
|
(props2.multi ? (_a3 = splitString(props2.initialValue)) != null ? _a3 : [] : [props2.initialValue]).filter((f4) => f4)
|
|
);
|
|
}, [props2.initialValue]);
|
|
const removeValue = (v3) => {
|
|
const newValues = value.filter((f4) => f4 != v3);
|
|
setValue(newValues);
|
|
props2.saveOptions(
|
|
options.map((f4) => f4.value).join(","),
|
|
newValues.join(",")
|
|
);
|
|
};
|
|
const saveOptions = (_options, _value) => {
|
|
if (!props2.multi) {
|
|
setOptions(
|
|
_options.filter((f4) => f4.length > 0).map((t4) => ({ name: t4, value: t4 }))
|
|
);
|
|
setValue(_value);
|
|
props2.saveOptions(_options.filter((f4) => f4.length > 0).join(","), _value.join(","));
|
|
} else {
|
|
setOptions(_options.map((t4) => ({ name: t4, value: t4 })));
|
|
setValue(_value);
|
|
props2.saveOptions(_options.filter((f4) => f4.length > 0).join(","), _value.join(","));
|
|
}
|
|
};
|
|
const menuProps = () => ({
|
|
multi: false,
|
|
editable: true,
|
|
value,
|
|
options: !props2.multi ? [{ name: i18n_default.menu.none, value: "" }, ...options] : options,
|
|
saveOptions,
|
|
placeholder: i18n_default.labels.optionItemSelectPlaceholder,
|
|
searchable: true,
|
|
showAll: true,
|
|
onHide: () => props2.setEditMode(null)
|
|
});
|
|
return /* @__PURE__ */ bn.createElement(OptionCellBase, {
|
|
value,
|
|
menuProps,
|
|
multi: props2.multi,
|
|
editMode: props2.editMode,
|
|
removeValue
|
|
});
|
|
};
|
|
var OptionCellBase = (props2) => {
|
|
const {
|
|
value,
|
|
menuProps,
|
|
removeValue,
|
|
getLabelString,
|
|
openItem,
|
|
valueClass
|
|
} = props2;
|
|
const menuRef = _2(null);
|
|
h2(() => {
|
|
if (props2.editMode == 2) {
|
|
if (!menuRef.current)
|
|
showMenu();
|
|
}
|
|
}, [props2.editMode]);
|
|
const ref = _2(null);
|
|
const showMenu = () => {
|
|
const offset = ref.current.getBoundingClientRect();
|
|
menuRef.current = showSelectMenu(
|
|
{ x: offset.left - 4, y: offset.bottom - 4 },
|
|
menuProps()
|
|
);
|
|
};
|
|
const editable = props2.editMode > 0;
|
|
return /* @__PURE__ */ bn.createElement("div", {
|
|
className: "mk-cell-option",
|
|
ref
|
|
}, value.length > 0 ? value.map((o3) => /* @__PURE__ */ bn.createElement("div", {
|
|
className: "mk-cell-option-item"
|
|
}, (getLabelString ? getLabelString(o3).length > 0 : o3.length > 0) ? /* @__PURE__ */ bn.createElement(bn.Fragment, null, /* @__PURE__ */ bn.createElement("div", {
|
|
className: valueClass && valueClass(o3),
|
|
onClick: () => openItem && openItem(o3)
|
|
}, getLabelString ? getLabelString(o3) : o3), editable && props2.multi ? /* @__PURE__ */ bn.createElement("div", {
|
|
className: "mk-icon-xsmall",
|
|
onClick: () => removeValue(o3),
|
|
dangerouslySetInnerHTML: {
|
|
__html: uiIconSet["mk-ui-close"]
|
|
}
|
|
}) : /* @__PURE__ */ bn.createElement(bn.Fragment, null)) : /* @__PURE__ */ bn.createElement("div", null, i18n_default.labels.select), editable && !props2.multi && value.length > 0 ? /* @__PURE__ */ bn.createElement(bn.Fragment, null, /* @__PURE__ */ bn.createElement("span", null), /* @__PURE__ */ bn.createElement("div", {
|
|
onClick: (e4) => editable && !props2.multi && showMenu(),
|
|
className: "mk-cell-option-select mk-icon-xxsmall mk-icon-rotated",
|
|
dangerouslySetInnerHTML: {
|
|
__html: uiIconSet["mk-ui-collapse-sm"]
|
|
}
|
|
})) : /* @__PURE__ */ bn.createElement(bn.Fragment, null))) : editable && !props2.multi ? /* @__PURE__ */ bn.createElement("div", {
|
|
className: "mk-cell-option-item"
|
|
}, /* @__PURE__ */ bn.createElement("div", {
|
|
onClick: (e4) => !props2.multi && showMenu()
|
|
}, i18n_default.labels.select)) : props2.editMode == -1 ? /* @__PURE__ */ bn.createElement("div", {
|
|
className: "mk-cell-option-item mk-cell-empty"
|
|
}, /* @__PURE__ */ bn.createElement("div", null, i18n_default.menu.none)) : /* @__PURE__ */ bn.createElement(bn.Fragment, null), editable && props2.multi ? /* @__PURE__ */ bn.createElement("div", {
|
|
onClick: (e4) => editable && showMenu(),
|
|
className: "mk-cell-option-new mk-icon-small",
|
|
dangerouslySetInnerHTML: { __html: uiIconSet["mk-ui-plus"] }
|
|
}) : /* @__PURE__ */ bn.createElement(bn.Fragment, null));
|
|
};
|
|
|
|
// src/components/ContextView/DataTypeView/ContextCell.tsx
|
|
var ContextCell = (props2) => {
|
|
var _a2, _b2, _c2;
|
|
const initialValue = (props2.multi ? (_a2 = splitString(props2.initialValue)) != null ? _a2 : [] : [props2.initialValue]).filter((f4) => (f4 == null ? void 0 : f4.length) > 0).map((f4) => ({
|
|
path: f4,
|
|
label: fileNameToString(folderPathToString(f4))
|
|
}));
|
|
const ref = _2(null);
|
|
const options = (_c2 = (_b2 = props2.contextTable) == null ? void 0 : _b2.rows.map((f4) => ({
|
|
name: fileNameToString(folderPathToString(f4["File"])),
|
|
value: f4["File"]
|
|
}))) != null ? _c2 : [];
|
|
const [value, setValue] = p2(initialValue);
|
|
const removeValue = (v3) => {
|
|
const newValues = value.filter((f4) => f4.path != v3.path);
|
|
setValue(newValues);
|
|
props2.saveValue(newValues.map((f4) => f4.path).join(","));
|
|
};
|
|
h2(() => {
|
|
var _a3;
|
|
setValue(
|
|
(props2.multi ? (_a3 = splitString(props2.initialValue)) != null ? _a3 : [] : [props2.initialValue]).filter((f4) => (f4 == null ? void 0 : f4.length) > 0).map((f4) => ({
|
|
path: f4,
|
|
label: fileNameToString(folderPathToString(f4))
|
|
}))
|
|
);
|
|
}, [props2.initialValue]);
|
|
const saveOptions = (_options, _value) => {
|
|
insertContextItems(props2.plugin, _options, props2.contextTag);
|
|
if (!props2.multi) {
|
|
setValue(
|
|
_value.map((f4) => ({
|
|
path: f4,
|
|
label: fileNameToString(folderPathToString(f4))
|
|
}))
|
|
);
|
|
props2.saveValue(_value.join(","));
|
|
} else {
|
|
const newValue = _value[0];
|
|
if (newValue) {
|
|
const newValues = uniq([...value.map((f4) => f4.path), newValue]);
|
|
setValue(
|
|
newValues.map((f4) => ({
|
|
label: fileNameToString(folderPathToString(f4)),
|
|
path: f4
|
|
}))
|
|
);
|
|
props2.saveValue(newValues.join(","));
|
|
}
|
|
}
|
|
};
|
|
const openLink = async (o3) => {
|
|
const file = getAbstractFileAtPath(app, o3.path);
|
|
if (file) {
|
|
openAFile(file, props2.plugin, false);
|
|
}
|
|
};
|
|
const menuProps = () => {
|
|
const _options = !props2.multi ? [{ name: i18n_default.menu.none, value: "" }, ...options] : options;
|
|
return {
|
|
multi: false,
|
|
editable: true,
|
|
value: value.map((f4) => f4.path),
|
|
options: _options,
|
|
saveOptions,
|
|
placeholder: i18n_default.labels.contextItemSelectPlaceholder,
|
|
searchable: true,
|
|
showAll: true,
|
|
onHide: () => props2.setEditMode(null)
|
|
};
|
|
};
|
|
return /* @__PURE__ */ bn.createElement(OptionCellBase, {
|
|
menuProps,
|
|
openItem: openLink,
|
|
getLabelString: (o3) => o3.label,
|
|
value,
|
|
multi: props2.multi,
|
|
editMode: props2.editMode,
|
|
removeValue
|
|
});
|
|
};
|
|
|
|
// src/components/ui/menus/datePickerMenu.tsx
|
|
var import_obsidian8 = require("obsidian");
|
|
|
|
// node_modules/react-day-picker/dist/index.esm.js
|
|
var __assign2 = function() {
|
|
__assign2 = Object.assign || function __assign3(t4) {
|
|
for (var s5, i4 = 1, n2 = arguments.length; i4 < n2; i4++) {
|
|
s5 = arguments[i4];
|
|
for (var p3 in s5)
|
|
if (Object.prototype.hasOwnProperty.call(s5, p3))
|
|
t4[p3] = s5[p3];
|
|
}
|
|
return t4;
|
|
};
|
|
return __assign2.apply(this, arguments);
|
|
};
|
|
function __rest2(s5, e4) {
|
|
var t4 = {};
|
|
for (var p3 in s5)
|
|
if (Object.prototype.hasOwnProperty.call(s5, p3) && e4.indexOf(p3) < 0)
|
|
t4[p3] = s5[p3];
|
|
if (s5 != null && typeof Object.getOwnPropertySymbols === "function")
|
|
for (var i4 = 0, p3 = Object.getOwnPropertySymbols(s5); i4 < p3.length; i4++) {
|
|
if (e4.indexOf(p3[i4]) < 0 && Object.prototype.propertyIsEnumerable.call(s5, p3[i4]))
|
|
t4[p3[i4]] = s5[p3[i4]];
|
|
}
|
|
return t4;
|
|
}
|
|
function __spreadArray2(to, from, pack) {
|
|
if (pack || arguments.length === 2)
|
|
for (var i4 = 0, l3 = from.length, ar; i4 < l3; i4++) {
|
|
if (ar || !(i4 in from)) {
|
|
if (!ar)
|
|
ar = Array.prototype.slice.call(from, 0, i4);
|
|
ar[i4] = from[i4];
|
|
}
|
|
}
|
|
return to.concat(ar || Array.prototype.slice.call(from));
|
|
}
|
|
function isDayPickerMultiple(props2) {
|
|
return props2.mode === "multiple";
|
|
}
|
|
function isDayPickerRange(props2) {
|
|
return props2.mode === "range";
|
|
}
|
|
function isDayPickerSingle(props2) {
|
|
return props2.mode === "single";
|
|
}
|
|
var defaultClassNames = {
|
|
root: "rdp",
|
|
multiple_months: "rdp-multiple_months",
|
|
with_weeknumber: "rdp-with_weeknumber",
|
|
vhidden: "rdp-vhidden",
|
|
button_reset: "rdp-button_reset",
|
|
button: "rdp-button",
|
|
caption: "rdp-caption",
|
|
caption_start: "rdp-caption_start",
|
|
caption_end: "rdp-caption_end",
|
|
caption_between: "rdp-caption_between",
|
|
caption_label: "rdp-caption_label",
|
|
caption_dropdowns: "rdp-caption_dropdowns",
|
|
dropdown: "rdp-dropdown",
|
|
dropdown_month: "rdp-dropdown_month",
|
|
dropdown_year: "rdp-dropdown_year",
|
|
dropdown_icon: "rdp-dropdown_icon",
|
|
months: "rdp-months",
|
|
month: "rdp-month",
|
|
table: "rdp-table",
|
|
tbody: "rdp-tbody",
|
|
tfoot: "rdp-tfoot",
|
|
head: "rdp-head",
|
|
head_row: "rdp-head_row",
|
|
head_cell: "rdp-head_cell",
|
|
nav: "rdp-nav",
|
|
nav_button: "rdp-nav_button",
|
|
nav_button_previous: "rdp-nav_button_previous",
|
|
nav_button_next: "rdp-nav_button_next",
|
|
nav_icon: "rdp-nav_icon",
|
|
row: "rdp-row",
|
|
weeknumber: "rdp-weeknumber",
|
|
cell: "rdp-cell",
|
|
day: "rdp-day",
|
|
day_today: "rdp-day_today",
|
|
day_outside: "rdp-day_outside",
|
|
day_selected: "rdp-day_selected",
|
|
day_disabled: "rdp-day_disabled",
|
|
day_hidden: "rdp-day_hidden",
|
|
day_range_start: "rdp-day_range_start",
|
|
day_range_end: "rdp-day_range_end",
|
|
day_range_middle: "rdp-day_range_middle"
|
|
};
|
|
function formatCaption(month, options) {
|
|
return format(month, "LLLL y", options);
|
|
}
|
|
function formatDay(day, options) {
|
|
return format(day, "d", options);
|
|
}
|
|
function formatMonthCaption(month, options) {
|
|
return format(month, "LLLL", options);
|
|
}
|
|
function formatWeekNumber(weekNumber) {
|
|
return "".concat(weekNumber);
|
|
}
|
|
function formatWeekdayName(weekday, options) {
|
|
return format(weekday, "cccccc", options);
|
|
}
|
|
function formatYearCaption(year, options) {
|
|
return format(year, "yyyy", options);
|
|
}
|
|
var formatters3 = /* @__PURE__ */ Object.freeze({
|
|
__proto__: null,
|
|
formatCaption,
|
|
formatDay,
|
|
formatMonthCaption,
|
|
formatWeekNumber,
|
|
formatWeekdayName,
|
|
formatYearCaption
|
|
});
|
|
var labelDay = function(day, activeModifiers, options) {
|
|
return format(day, "do MMMM (EEEE)", options);
|
|
};
|
|
var labelMonthDropdown = function() {
|
|
return "Month: ";
|
|
};
|
|
var labelNext = function() {
|
|
return "Go to next month";
|
|
};
|
|
var labelPrevious = function() {
|
|
return "Go to previous month";
|
|
};
|
|
var labelWeekday = function(day, options) {
|
|
return format(day, "cccc", options);
|
|
};
|
|
var labelWeekNumber = function(n2) {
|
|
return "Week n. ".concat(n2);
|
|
};
|
|
var labelYearDropdown = function() {
|
|
return "Year: ";
|
|
};
|
|
var labels = /* @__PURE__ */ Object.freeze({
|
|
__proto__: null,
|
|
labelDay,
|
|
labelMonthDropdown,
|
|
labelNext,
|
|
labelPrevious,
|
|
labelWeekday,
|
|
labelWeekNumber,
|
|
labelYearDropdown
|
|
});
|
|
function getDefaultContextValues() {
|
|
var captionLayout = "buttons";
|
|
var classNames8 = defaultClassNames;
|
|
var locale2 = en_US_default;
|
|
var modifiersClassNames = {};
|
|
var modifiers = {};
|
|
var numberOfMonths = 1;
|
|
var styles = {};
|
|
var today = new Date();
|
|
return {
|
|
captionLayout,
|
|
classNames: classNames8,
|
|
formatters: formatters3,
|
|
labels,
|
|
locale: locale2,
|
|
modifiersClassNames,
|
|
modifiers,
|
|
numberOfMonths,
|
|
styles,
|
|
today,
|
|
mode: "default"
|
|
};
|
|
}
|
|
function parseFromToProps(props2) {
|
|
var fromYear = props2.fromYear, toYear = props2.toYear, fromMonth = props2.fromMonth, toMonth = props2.toMonth;
|
|
var fromDate = props2.fromDate, toDate2 = props2.toDate;
|
|
if (fromMonth) {
|
|
fromDate = startOfMonth(fromMonth);
|
|
} else if (fromYear) {
|
|
fromDate = new Date(fromYear, 0, 1);
|
|
}
|
|
if (toMonth) {
|
|
toDate2 = endOfMonth(toMonth);
|
|
} else if (toYear) {
|
|
toDate2 = new Date(toYear, 11, 31);
|
|
}
|
|
return {
|
|
fromDate: fromDate ? startOfDay(fromDate) : void 0,
|
|
toDate: toDate2 ? startOfDay(toDate2) : void 0
|
|
};
|
|
}
|
|
var DayPickerContext = B(void 0);
|
|
function DayPickerProvider(props2) {
|
|
var _a2;
|
|
var initialProps = props2.initialProps;
|
|
var defaultContextValues = getDefaultContextValues();
|
|
var _b2 = parseFromToProps(initialProps), fromDate = _b2.fromDate, toDate2 = _b2.toDate;
|
|
var captionLayout = (_a2 = initialProps.captionLayout) !== null && _a2 !== void 0 ? _a2 : defaultContextValues.captionLayout;
|
|
if (captionLayout !== "buttons" && (!fromDate || !toDate2)) {
|
|
captionLayout = "buttons";
|
|
}
|
|
var onSelect;
|
|
if (isDayPickerSingle(initialProps) || isDayPickerMultiple(initialProps) || isDayPickerRange(initialProps)) {
|
|
onSelect = initialProps.onSelect;
|
|
}
|
|
var value = __assign2(__assign2(__assign2({}, defaultContextValues), initialProps), { captionLayout, classNames: __assign2(__assign2({}, defaultContextValues.classNames), initialProps.classNames), components: __assign2({}, initialProps.components), formatters: __assign2(__assign2({}, defaultContextValues.formatters), initialProps.formatters), fromDate, labels: __assign2(__assign2({}, defaultContextValues.labels), initialProps.labels), mode: initialProps.mode || defaultContextValues.mode, modifiers: __assign2(__assign2({}, defaultContextValues.modifiers), initialProps.modifiers), modifiersClassNames: __assign2(__assign2({}, defaultContextValues.modifiersClassNames), initialProps.modifiersClassNames), onSelect, styles: __assign2(__assign2({}, defaultContextValues.styles), initialProps.styles), toDate: toDate2 });
|
|
return bn.createElement(DayPickerContext.Provider, { value }, props2.children);
|
|
}
|
|
function useDayPicker() {
|
|
var context = q2(DayPickerContext);
|
|
if (!context) {
|
|
throw new Error("useDayPicker must be used within a DayPickerProvider.");
|
|
}
|
|
return context;
|
|
}
|
|
function CaptionLabel(props2) {
|
|
var _a2 = useDayPicker(), locale2 = _a2.locale, classNames8 = _a2.classNames, styles = _a2.styles, formatCaption2 = _a2.formatters.formatCaption;
|
|
return bn.createElement("h2", { className: classNames8.caption_label, style: styles.caption_label, "aria-live": "polite", "aria-atomic": "true", id: props2.id }, formatCaption2(props2.displayMonth, { locale: locale2 }));
|
|
}
|
|
function IconDropdown(props2) {
|
|
return bn.createElement(
|
|
"svg",
|
|
__assign2({ width: "8px", height: "8px", viewBox: "0 0 120 120", "data-testid": "iconDropdown" }, props2),
|
|
bn.createElement("path", { d: "M4.22182541,48.2218254 C8.44222828,44.0014225 15.2388494,43.9273804 19.5496459,47.9996989 L19.7781746,48.2218254 L60,88.443 L100.221825,48.2218254 C104.442228,44.0014225 111.238849,43.9273804 115.549646,47.9996989 L115.778175,48.2218254 C119.998577,52.4422283 120.07262,59.2388494 116.000301,63.5496459 L115.778175,63.7781746 L67.7781746,111.778175 C63.5577717,115.998577 56.7611506,116.07262 52.4503541,112.000301 L52.2218254,111.778175 L4.22182541,63.7781746 C-0.0739418023,59.4824074 -0.0739418023,52.5175926 4.22182541,48.2218254 Z", fill: "currentColor", fillRule: "nonzero" })
|
|
);
|
|
}
|
|
function Dropdown(props2) {
|
|
var _a2, _b2;
|
|
var onChange = props2.onChange, value = props2.value, children = props2.children, caption = props2.caption, className = props2.className, style = props2.style;
|
|
var dayPicker = useDayPicker();
|
|
var IconDropdownComponent = (_b2 = (_a2 = dayPicker.components) === null || _a2 === void 0 ? void 0 : _a2.IconDropdown) !== null && _b2 !== void 0 ? _b2 : IconDropdown;
|
|
return bn.createElement(
|
|
"div",
|
|
{ className, style },
|
|
bn.createElement("span", { className: dayPicker.classNames.vhidden }, props2["aria-label"]),
|
|
bn.createElement("select", { name: props2.name, "aria-label": props2["aria-label"], className: dayPicker.classNames.dropdown, style: dayPicker.styles.dropdown, value, onChange }, children),
|
|
bn.createElement(
|
|
"div",
|
|
{ className: dayPicker.classNames.caption_label, style: dayPicker.styles.caption_label, "aria-hidden": "true" },
|
|
caption,
|
|
bn.createElement(IconDropdownComponent, { className: dayPicker.classNames.dropdown_icon, style: dayPicker.styles.dropdown_icon })
|
|
)
|
|
);
|
|
}
|
|
function MonthsDropdown(props2) {
|
|
var _a2;
|
|
var _b2 = useDayPicker(), fromDate = _b2.fromDate, toDate2 = _b2.toDate, styles = _b2.styles, locale2 = _b2.locale, formatMonthCaption2 = _b2.formatters.formatMonthCaption, classNames8 = _b2.classNames, components = _b2.components, labelMonthDropdown2 = _b2.labels.labelMonthDropdown;
|
|
if (!fromDate)
|
|
return bn.createElement(bn.Fragment, null);
|
|
if (!toDate2)
|
|
return bn.createElement(bn.Fragment, null);
|
|
var dropdownMonths = [];
|
|
if (isSameYear(fromDate, toDate2)) {
|
|
var date = startOfMonth(fromDate);
|
|
for (var month = fromDate.getMonth(); month <= toDate2.getMonth(); month++) {
|
|
dropdownMonths.push(setMonth(date, month));
|
|
}
|
|
} else {
|
|
var date = startOfMonth(new Date());
|
|
for (var month = 0; month <= 11; month++) {
|
|
dropdownMonths.push(setMonth(date, month));
|
|
}
|
|
}
|
|
var handleChange = function(e4) {
|
|
var selectedMonth = Number(e4.target.value);
|
|
var newMonth = setMonth(startOfMonth(props2.displayMonth), selectedMonth);
|
|
props2.onChange(newMonth);
|
|
};
|
|
var DropdownComponent2 = (_a2 = components === null || components === void 0 ? void 0 : components.Dropdown) !== null && _a2 !== void 0 ? _a2 : Dropdown;
|
|
return bn.createElement(DropdownComponent2, { name: "months", "aria-label": labelMonthDropdown2(), className: classNames8.dropdown_month, style: styles.dropdown_month, onChange: handleChange, value: props2.displayMonth.getMonth(), caption: formatMonthCaption2(props2.displayMonth, { locale: locale2 }) }, dropdownMonths.map(function(m5) {
|
|
return bn.createElement("option", { key: m5.getMonth(), value: m5.getMonth() }, formatMonthCaption2(m5, { locale: locale2 }));
|
|
}));
|
|
}
|
|
function YearsDropdown(props2) {
|
|
var _a2;
|
|
var displayMonth = props2.displayMonth;
|
|
var _b2 = useDayPicker(), fromDate = _b2.fromDate, toDate2 = _b2.toDate, locale2 = _b2.locale, styles = _b2.styles, classNames8 = _b2.classNames, components = _b2.components, formatYearCaption2 = _b2.formatters.formatYearCaption, labelYearDropdown2 = _b2.labels.labelYearDropdown;
|
|
var years = [];
|
|
if (!fromDate)
|
|
return bn.createElement(bn.Fragment, null);
|
|
if (!toDate2)
|
|
return bn.createElement(bn.Fragment, null);
|
|
var fromYear = fromDate.getFullYear();
|
|
var toYear = toDate2.getFullYear();
|
|
for (var year = fromYear; year <= toYear; year++) {
|
|
years.push(setYear(startOfYear(new Date()), year));
|
|
}
|
|
var handleChange = function(e4) {
|
|
var newMonth = setYear(startOfMonth(displayMonth), Number(e4.target.value));
|
|
props2.onChange(newMonth);
|
|
};
|
|
var DropdownComponent2 = (_a2 = components === null || components === void 0 ? void 0 : components.Dropdown) !== null && _a2 !== void 0 ? _a2 : Dropdown;
|
|
return bn.createElement(DropdownComponent2, { name: "years", "aria-label": labelYearDropdown2(), className: classNames8.dropdown_year, style: styles.dropdown_year, onChange: handleChange, value: displayMonth.getFullYear(), caption: formatYearCaption2(displayMonth, { locale: locale2 }) }, years.map(function(year2) {
|
|
return bn.createElement("option", { key: year2.getFullYear(), value: year2.getFullYear() }, formatYearCaption2(year2, { locale: locale2 }));
|
|
}));
|
|
}
|
|
function useControlledValue(defaultValue2, controlledValue) {
|
|
var _a2 = p2(defaultValue2), uncontrolledValue = _a2[0], setValue = _a2[1];
|
|
var value = controlledValue === void 0 ? uncontrolledValue : controlledValue;
|
|
return [value, setValue];
|
|
}
|
|
function getInitialMonth(context) {
|
|
var month = context.month, defaultMonth = context.defaultMonth, today = context.today;
|
|
var initialMonth = month || defaultMonth || today || new Date();
|
|
var toDate2 = context.toDate, fromDate = context.fromDate, _a2 = context.numberOfMonths, numberOfMonths = _a2 === void 0 ? 1 : _a2;
|
|
if (toDate2 && differenceInCalendarMonths(toDate2, initialMonth) < 0) {
|
|
var offset = -1 * (numberOfMonths - 1);
|
|
initialMonth = addMonths(toDate2, offset);
|
|
}
|
|
if (fromDate && differenceInCalendarMonths(initialMonth, fromDate) < 0) {
|
|
initialMonth = fromDate;
|
|
}
|
|
return startOfMonth(initialMonth);
|
|
}
|
|
function useNavigationState() {
|
|
var context = useDayPicker();
|
|
var initialMonth = getInitialMonth(context);
|
|
var _a2 = useControlledValue(initialMonth, context.month), month = _a2[0], setMonth2 = _a2[1];
|
|
var goToMonth = function(date) {
|
|
var _a3;
|
|
if (context.disableNavigation)
|
|
return;
|
|
var month2 = startOfMonth(date);
|
|
setMonth2(month2);
|
|
(_a3 = context.onMonthChange) === null || _a3 === void 0 ? void 0 : _a3.call(context, month2);
|
|
};
|
|
return [month, goToMonth];
|
|
}
|
|
function getDisplayMonths(month, _a2) {
|
|
var reverseMonths = _a2.reverseMonths, numberOfMonths = _a2.numberOfMonths;
|
|
var start = startOfMonth(month);
|
|
var end = startOfMonth(addMonths(start, numberOfMonths));
|
|
var monthsDiff = differenceInCalendarMonths(end, start);
|
|
var months = [];
|
|
for (var i4 = 0; i4 < monthsDiff; i4++) {
|
|
var nextMonth = addMonths(start, i4);
|
|
months.push(nextMonth);
|
|
}
|
|
if (reverseMonths)
|
|
months = months.reverse();
|
|
return months;
|
|
}
|
|
function getNextMonth(startingMonth, options) {
|
|
if (options.disableNavigation) {
|
|
return void 0;
|
|
}
|
|
var toDate2 = options.toDate, pagedNavigation = options.pagedNavigation, _a2 = options.numberOfMonths, numberOfMonths = _a2 === void 0 ? 1 : _a2;
|
|
var offset = pagedNavigation ? numberOfMonths : 1;
|
|
var month = startOfMonth(startingMonth);
|
|
if (!toDate2) {
|
|
return addMonths(month, offset);
|
|
}
|
|
var monthsDiff = differenceInCalendarMonths(toDate2, startingMonth);
|
|
if (monthsDiff < numberOfMonths) {
|
|
return void 0;
|
|
}
|
|
return addMonths(month, offset);
|
|
}
|
|
function getPreviousMonth(startingMonth, options) {
|
|
if (options.disableNavigation) {
|
|
return void 0;
|
|
}
|
|
var fromDate = options.fromDate, pagedNavigation = options.pagedNavigation, _a2 = options.numberOfMonths, numberOfMonths = _a2 === void 0 ? 1 : _a2;
|
|
var offset = pagedNavigation ? numberOfMonths : 1;
|
|
var month = startOfMonth(startingMonth);
|
|
if (!fromDate) {
|
|
return addMonths(month, -offset);
|
|
}
|
|
var monthsDiff = differenceInCalendarMonths(month, fromDate);
|
|
if (monthsDiff <= 0) {
|
|
return void 0;
|
|
}
|
|
return addMonths(month, -offset);
|
|
}
|
|
var NavigationContext = B(void 0);
|
|
function NavigationProvider(props2) {
|
|
var dayPicker = useDayPicker();
|
|
var _a2 = useNavigationState(), currentMonth = _a2[0], goToMonth = _a2[1];
|
|
var displayMonths = getDisplayMonths(currentMonth, dayPicker);
|
|
var nextMonth = getNextMonth(currentMonth, dayPicker);
|
|
var previousMonth = getPreviousMonth(currentMonth, dayPicker);
|
|
var isDateDisplayed = function(date) {
|
|
return displayMonths.some(function(displayMonth) {
|
|
return isSameMonth(date, displayMonth);
|
|
});
|
|
};
|
|
var goToDate = function(date, refDate) {
|
|
if (isDateDisplayed(date)) {
|
|
return;
|
|
}
|
|
if (refDate && isBefore(date, refDate)) {
|
|
goToMonth(addMonths(date, 1 + dayPicker.numberOfMonths * -1));
|
|
} else {
|
|
goToMonth(date);
|
|
}
|
|
};
|
|
var value = {
|
|
currentMonth,
|
|
displayMonths,
|
|
goToMonth,
|
|
goToDate,
|
|
previousMonth,
|
|
nextMonth,
|
|
isDateDisplayed
|
|
};
|
|
return bn.createElement(NavigationContext.Provider, { value }, props2.children);
|
|
}
|
|
function useNavigation() {
|
|
var context = q2(NavigationContext);
|
|
if (!context) {
|
|
throw new Error("useNavigation must be used within a NavigationProvider");
|
|
}
|
|
return context;
|
|
}
|
|
function CaptionDropdowns(props2) {
|
|
var _a2;
|
|
var _b2 = useDayPicker(), classNames8 = _b2.classNames, styles = _b2.styles, components = _b2.components;
|
|
var goToMonth = useNavigation().goToMonth;
|
|
var handleMonthChange = function(newMonth) {
|
|
goToMonth(newMonth);
|
|
};
|
|
var CaptionLabelComponent = (_a2 = components === null || components === void 0 ? void 0 : components.CaptionLabel) !== null && _a2 !== void 0 ? _a2 : CaptionLabel;
|
|
var captionLabel = bn.createElement(CaptionLabelComponent, { id: props2.id, displayMonth: props2.displayMonth });
|
|
return bn.createElement(
|
|
"div",
|
|
{ className: classNames8.caption_dropdowns, style: styles.caption_dropdowns },
|
|
bn.createElement("div", { className: classNames8.vhidden }, captionLabel),
|
|
bn.createElement(MonthsDropdown, { onChange: handleMonthChange, displayMonth: props2.displayMonth }),
|
|
bn.createElement(YearsDropdown, { onChange: handleMonthChange, displayMonth: props2.displayMonth })
|
|
);
|
|
}
|
|
function IconLeft(props2) {
|
|
return bn.createElement(
|
|
"svg",
|
|
__assign2({ width: "16px", height: "16px", viewBox: "0 0 120 120" }, props2),
|
|
bn.createElement("path", { d: "M69.490332,3.34314575 C72.6145263,0.218951416 77.6798462,0.218951416 80.8040405,3.34314575 C83.8617626,6.40086786 83.9268205,11.3179931 80.9992143,14.4548388 L80.8040405,14.6568542 L35.461,60 L80.8040405,105.343146 C83.8617626,108.400868 83.9268205,113.317993 80.9992143,116.454839 L80.8040405,116.656854 C77.7463184,119.714576 72.8291931,119.779634 69.6923475,116.852028 L69.490332,116.656854 L18.490332,65.6568542 C15.4326099,62.5991321 15.367552,57.6820069 18.2951583,54.5451612 L18.490332,54.3431458 L69.490332,3.34314575 Z", fill: "currentColor", fillRule: "nonzero" })
|
|
);
|
|
}
|
|
function IconRight(props2) {
|
|
return bn.createElement(
|
|
"svg",
|
|
__assign2({ width: "16px", height: "16px", viewBox: "0 0 120 120" }, props2),
|
|
bn.createElement("path", { d: "M49.8040405,3.34314575 C46.6798462,0.218951416 41.6145263,0.218951416 38.490332,3.34314575 C35.4326099,6.40086786 35.367552,11.3179931 38.2951583,14.4548388 L38.490332,14.6568542 L83.8333725,60 L38.490332,105.343146 C35.4326099,108.400868 35.367552,113.317993 38.2951583,116.454839 L38.490332,116.656854 C41.5480541,119.714576 46.4651794,119.779634 49.602025,116.852028 L49.8040405,116.656854 L100.804041,65.6568542 C103.861763,62.5991321 103.926821,57.6820069 100.999214,54.5451612 L100.804041,54.3431458 L49.8040405,3.34314575 Z", fill: "currentColor" })
|
|
);
|
|
}
|
|
var Button = k3(function(props2, ref) {
|
|
var _a2 = useDayPicker(), classNames8 = _a2.classNames, styles = _a2.styles;
|
|
var classNamesArr = [classNames8.button_reset, classNames8.button];
|
|
if (props2.className) {
|
|
classNamesArr.push(props2.className);
|
|
}
|
|
var className = classNamesArr.join(" ");
|
|
var style = __assign2(__assign2({}, styles.button_reset), styles.button);
|
|
if (props2.style) {
|
|
Object.assign(style, props2.style);
|
|
}
|
|
return bn.createElement("button", __assign2({}, props2, { ref, type: "button", className, style }));
|
|
});
|
|
function Navigation(props2) {
|
|
var _a2, _b2;
|
|
var _c2 = useDayPicker(), dir = _c2.dir, locale2 = _c2.locale, classNames8 = _c2.classNames, styles = _c2.styles, _d2 = _c2.labels, labelPrevious2 = _d2.labelPrevious, labelNext2 = _d2.labelNext, components = _c2.components;
|
|
if (!props2.nextMonth && !props2.previousMonth) {
|
|
return bn.createElement(bn.Fragment, null);
|
|
}
|
|
var previousLabel = labelPrevious2(props2.previousMonth, { locale: locale2 });
|
|
var previousClassName = [
|
|
classNames8.nav_button,
|
|
classNames8.nav_button_previous
|
|
].join(" ");
|
|
var nextLabel = labelNext2(props2.nextMonth, { locale: locale2 });
|
|
var nextClassName = [
|
|
classNames8.nav_button,
|
|
classNames8.nav_button_next
|
|
].join(" ");
|
|
var IconRightComponent = (_a2 = components === null || components === void 0 ? void 0 : components.IconRight) !== null && _a2 !== void 0 ? _a2 : IconRight;
|
|
var IconLeftComponent = (_b2 = components === null || components === void 0 ? void 0 : components.IconLeft) !== null && _b2 !== void 0 ? _b2 : IconLeft;
|
|
return bn.createElement(
|
|
"div",
|
|
{ className: classNames8.nav, style: styles.nav },
|
|
!props2.hidePrevious && bn.createElement(Button, { name: "previous-month", "aria-label": previousLabel, className: previousClassName, style: styles.nav_button_previous, disabled: !props2.previousMonth, onClick: props2.onPreviousClick }, dir === "rtl" ? bn.createElement(IconRightComponent, { className: classNames8.nav_icon, style: styles.nav_icon }) : bn.createElement(IconLeftComponent, { className: classNames8.nav_icon, style: styles.nav_icon })),
|
|
!props2.hideNext && bn.createElement(Button, { name: "next-month", "aria-label": nextLabel, className: nextClassName, style: styles.nav_button_next, disabled: !props2.nextMonth, onClick: props2.onNextClick }, dir === "rtl" ? bn.createElement(IconLeftComponent, { className: classNames8.nav_icon, style: styles.nav_icon }) : bn.createElement(IconRightComponent, { className: classNames8.nav_icon, style: styles.nav_icon }))
|
|
);
|
|
}
|
|
function CaptionNavigation(props2) {
|
|
var _a2;
|
|
var _b2;
|
|
var _c2 = useDayPicker(), numberOfMonths = _c2.numberOfMonths, dir = _c2.dir, components = _c2.components;
|
|
var _d2 = useNavigation(), previousMonth = _d2.previousMonth, nextMonth = _d2.nextMonth, goToMonth = _d2.goToMonth, displayMonths = _d2.displayMonths;
|
|
var displayIndex = displayMonths.findIndex(function(month) {
|
|
return isSameMonth(props2.displayMonth, month);
|
|
});
|
|
var isFirst = displayIndex === 0;
|
|
var isLast = displayIndex === displayMonths.length - 1;
|
|
if (dir === "rtl") {
|
|
_a2 = [isFirst, isLast], isLast = _a2[0], isFirst = _a2[1];
|
|
}
|
|
var hideNext = numberOfMonths > 1 && (isFirst || !isLast);
|
|
var hidePrevious = numberOfMonths > 1 && (isLast || !isFirst);
|
|
var handlePreviousClick = function() {
|
|
if (!previousMonth)
|
|
return;
|
|
goToMonth(previousMonth);
|
|
};
|
|
var handleNextClick = function() {
|
|
if (!nextMonth)
|
|
return;
|
|
goToMonth(nextMonth);
|
|
};
|
|
var CaptionLabelComponent = (_b2 = components === null || components === void 0 ? void 0 : components.CaptionLabel) !== null && _b2 !== void 0 ? _b2 : CaptionLabel;
|
|
var captionLabel = bn.createElement(CaptionLabelComponent, { id: props2.id, displayMonth: props2.displayMonth });
|
|
return bn.createElement(
|
|
bn.Fragment,
|
|
null,
|
|
captionLabel,
|
|
bn.createElement(Navigation, { displayMonth: props2.displayMonth, hideNext, hidePrevious, nextMonth, previousMonth, onPreviousClick: handlePreviousClick, onNextClick: handleNextClick })
|
|
);
|
|
}
|
|
function Caption(props2) {
|
|
var _a2;
|
|
var _b2 = useDayPicker(), classNames8 = _b2.classNames, disableNavigation = _b2.disableNavigation, styles = _b2.styles, captionLayout = _b2.captionLayout, components = _b2.components;
|
|
var CaptionLabelComponent = (_a2 = components === null || components === void 0 ? void 0 : components.CaptionLabel) !== null && _a2 !== void 0 ? _a2 : CaptionLabel;
|
|
var caption;
|
|
if (disableNavigation) {
|
|
caption = bn.createElement(CaptionLabelComponent, { id: props2.id, displayMonth: props2.displayMonth });
|
|
} else if (captionLayout === "dropdown") {
|
|
caption = bn.createElement(CaptionDropdowns, { displayMonth: props2.displayMonth, id: props2.id });
|
|
} else {
|
|
caption = bn.createElement(CaptionNavigation, { displayMonth: props2.displayMonth, id: props2.id });
|
|
}
|
|
return bn.createElement("div", { className: classNames8.caption, style: styles.caption }, caption);
|
|
}
|
|
function Footer() {
|
|
var _a2 = useDayPicker(), footer = _a2.footer, styles = _a2.styles, tfoot = _a2.classNames.tfoot;
|
|
if (!footer)
|
|
return bn.createElement(bn.Fragment, null);
|
|
return bn.createElement(
|
|
"tfoot",
|
|
{ className: tfoot, style: styles.tfoot },
|
|
bn.createElement(
|
|
"tr",
|
|
null,
|
|
bn.createElement("td", { colSpan: 8 }, footer)
|
|
)
|
|
);
|
|
}
|
|
function getWeekdays(locale2, weekStartsOn, ISOWeek) {
|
|
var start = ISOWeek ? startOfISOWeek(new Date()) : startOfWeek(new Date(), { locale: locale2, weekStartsOn });
|
|
var days = [];
|
|
for (var i4 = 0; i4 < 7; i4++) {
|
|
var day = addDays(start, i4);
|
|
days.push(day);
|
|
}
|
|
return days;
|
|
}
|
|
function HeadRow() {
|
|
var _a2 = useDayPicker(), classNames8 = _a2.classNames, styles = _a2.styles, showWeekNumber = _a2.showWeekNumber, locale2 = _a2.locale, weekStartsOn = _a2.weekStartsOn, ISOWeek = _a2.ISOWeek, formatWeekdayName2 = _a2.formatters.formatWeekdayName, labelWeekday2 = _a2.labels.labelWeekday;
|
|
var weekdays = getWeekdays(locale2, weekStartsOn, ISOWeek);
|
|
return bn.createElement(
|
|
"tr",
|
|
{ style: styles.head_row, className: classNames8.head_row },
|
|
showWeekNumber && bn.createElement("th", { scope: "col", style: styles.head_cell, className: classNames8.head_cell }),
|
|
weekdays.map(function(weekday, i4) {
|
|
return bn.createElement(
|
|
"th",
|
|
{ key: i4, scope: "col", className: classNames8.head_cell, style: styles.head_cell },
|
|
bn.createElement("span", { "aria-hidden": true }, formatWeekdayName2(weekday, { locale: locale2 })),
|
|
bn.createElement("span", { className: classNames8.vhidden }, labelWeekday2(weekday, { locale: locale2 }))
|
|
);
|
|
})
|
|
);
|
|
}
|
|
function Head() {
|
|
var _a2;
|
|
var _b2 = useDayPicker(), classNames8 = _b2.classNames, styles = _b2.styles, components = _b2.components;
|
|
var HeadRowComponent = (_a2 = components === null || components === void 0 ? void 0 : components.HeadRow) !== null && _a2 !== void 0 ? _a2 : HeadRow;
|
|
return bn.createElement(
|
|
"thead",
|
|
{ style: styles.head, className: classNames8.head },
|
|
bn.createElement(HeadRowComponent, null)
|
|
);
|
|
}
|
|
function DayContent(props2) {
|
|
var _a2 = useDayPicker(), locale2 = _a2.locale, formatDay2 = _a2.formatters.formatDay;
|
|
return bn.createElement(bn.Fragment, null, formatDay2(props2.date, { locale: locale2 }));
|
|
}
|
|
var SelectMultipleContext = B(void 0);
|
|
function SelectMultipleProvider(props2) {
|
|
if (!isDayPickerMultiple(props2.initialProps)) {
|
|
var emptyContextValue = {
|
|
selected: void 0,
|
|
modifiers: {
|
|
disabled: []
|
|
}
|
|
};
|
|
return bn.createElement(SelectMultipleContext.Provider, { value: emptyContextValue }, props2.children);
|
|
}
|
|
return bn.createElement(SelectMultipleProviderInternal, { initialProps: props2.initialProps, children: props2.children });
|
|
}
|
|
function SelectMultipleProviderInternal(_a2) {
|
|
var initialProps = _a2.initialProps, children = _a2.children;
|
|
var selected = initialProps.selected, min3 = initialProps.min, max3 = initialProps.max;
|
|
var onDayClick = function(day, activeModifiers, e4) {
|
|
var _a3, _b2;
|
|
(_a3 = initialProps.onDayClick) === null || _a3 === void 0 ? void 0 : _a3.call(initialProps, day, activeModifiers, e4);
|
|
var isMinSelected = Boolean(activeModifiers.selected && min3 && (selected === null || selected === void 0 ? void 0 : selected.length) === min3);
|
|
if (isMinSelected) {
|
|
return;
|
|
}
|
|
var isMaxSelected = Boolean(!activeModifiers.selected && max3 && (selected === null || selected === void 0 ? void 0 : selected.length) === max3);
|
|
if (isMaxSelected) {
|
|
return;
|
|
}
|
|
var selectedDays = selected ? __spreadArray2([], selected, true) : [];
|
|
if (activeModifiers.selected) {
|
|
var index = selectedDays.findIndex(function(selectedDay) {
|
|
return isSameDay(day, selectedDay);
|
|
});
|
|
selectedDays.splice(index, 1);
|
|
} else {
|
|
selectedDays.push(day);
|
|
}
|
|
(_b2 = initialProps.onSelect) === null || _b2 === void 0 ? void 0 : _b2.call(initialProps, selectedDays, day, activeModifiers, e4);
|
|
};
|
|
var modifiers = {
|
|
disabled: []
|
|
};
|
|
if (selected) {
|
|
modifiers.disabled.push(function(day) {
|
|
var isMaxSelected = max3 && selected.length > max3 - 1;
|
|
var isSelected = selected.some(function(selectedDay) {
|
|
return isSameDay(selectedDay, day);
|
|
});
|
|
return Boolean(isMaxSelected && !isSelected);
|
|
});
|
|
}
|
|
var contextValue = {
|
|
selected,
|
|
onDayClick,
|
|
modifiers
|
|
};
|
|
return bn.createElement(SelectMultipleContext.Provider, { value: contextValue }, children);
|
|
}
|
|
function useSelectMultiple() {
|
|
var context = q2(SelectMultipleContext);
|
|
if (!context) {
|
|
throw new Error("useSelectMultiple must be used within a SelectMultipleProvider");
|
|
}
|
|
return context;
|
|
}
|
|
function addToRange(day, range) {
|
|
var _a2 = range || {}, from = _a2.from, to = _a2.to;
|
|
if (!from) {
|
|
return { from: day, to: void 0 };
|
|
}
|
|
if (!to && isSameDay(from, day)) {
|
|
return { from, to: day };
|
|
}
|
|
if (!to && isBefore(day, from)) {
|
|
return { from: day, to: from };
|
|
}
|
|
if (!to) {
|
|
return { from, to: day };
|
|
}
|
|
if (isSameDay(to, day) && isSameDay(from, day)) {
|
|
return void 0;
|
|
}
|
|
if (isSameDay(to, day)) {
|
|
return { from: to, to: void 0 };
|
|
}
|
|
if (isSameDay(from, day)) {
|
|
return void 0;
|
|
}
|
|
if (isAfter2(from, day)) {
|
|
return { from: day, to };
|
|
}
|
|
return { from, to: day };
|
|
}
|
|
var SelectRangeContext = B(void 0);
|
|
function SelectRangeProvider(props2) {
|
|
if (!isDayPickerRange(props2.initialProps)) {
|
|
var emptyContextValue = {
|
|
selected: void 0,
|
|
modifiers: {
|
|
range_start: [],
|
|
range_end: [],
|
|
range_middle: [],
|
|
disabled: []
|
|
}
|
|
};
|
|
return bn.createElement(SelectRangeContext.Provider, { value: emptyContextValue }, props2.children);
|
|
}
|
|
return bn.createElement(SelectRangeProviderInternal, { initialProps: props2.initialProps, children: props2.children });
|
|
}
|
|
function SelectRangeProviderInternal(_a2) {
|
|
var initialProps = _a2.initialProps, children = _a2.children;
|
|
var selected = initialProps.selected;
|
|
var _b2 = selected || {}, selectedFrom = _b2.from, selectedTo = _b2.to;
|
|
var min3 = initialProps.min;
|
|
var max3 = initialProps.max;
|
|
var onDayClick = function(day, activeModifiers, e4) {
|
|
var _a3, _b3;
|
|
(_a3 = initialProps.onDayClick) === null || _a3 === void 0 ? void 0 : _a3.call(initialProps, day, activeModifiers, e4);
|
|
var newRange = addToRange(day, selected);
|
|
(_b3 = initialProps.onSelect) === null || _b3 === void 0 ? void 0 : _b3.call(initialProps, newRange, day, activeModifiers, e4);
|
|
};
|
|
var modifiers = {
|
|
range_start: [],
|
|
range_end: [],
|
|
range_middle: [],
|
|
disabled: []
|
|
};
|
|
if (selectedFrom) {
|
|
modifiers.range_start = [selectedFrom];
|
|
if (!selectedTo) {
|
|
modifiers.range_end = [selectedFrom];
|
|
} else {
|
|
modifiers.range_end = [selectedTo];
|
|
if (!isSameDay(selectedFrom, selectedTo)) {
|
|
modifiers.range_middle = [
|
|
{
|
|
after: selectedFrom,
|
|
before: selectedTo
|
|
}
|
|
];
|
|
}
|
|
}
|
|
}
|
|
if (min3) {
|
|
if (selectedFrom && !selectedTo) {
|
|
modifiers.disabled.push({
|
|
after: subDays(selectedFrom, min3 - 1),
|
|
before: addDays(selectedFrom, min3 - 1)
|
|
});
|
|
}
|
|
if (selectedFrom && selectedTo) {
|
|
modifiers.disabled.push({
|
|
after: selectedFrom,
|
|
before: addDays(selectedFrom, min3 - 1)
|
|
});
|
|
}
|
|
}
|
|
if (max3) {
|
|
if (selectedFrom && !selectedTo) {
|
|
modifiers.disabled.push({
|
|
before: addDays(selectedFrom, -max3 + 1)
|
|
});
|
|
modifiers.disabled.push({
|
|
after: addDays(selectedFrom, max3 - 1)
|
|
});
|
|
}
|
|
if (selectedFrom && selectedTo) {
|
|
var selectedCount = differenceInCalendarDays(selectedTo, selectedFrom) + 1;
|
|
var offset = max3 - selectedCount;
|
|
modifiers.disabled.push({
|
|
before: subDays(selectedFrom, offset)
|
|
});
|
|
modifiers.disabled.push({
|
|
after: addDays(selectedTo, offset)
|
|
});
|
|
}
|
|
}
|
|
return bn.createElement(SelectRangeContext.Provider, { value: { selected, onDayClick, modifiers } }, children);
|
|
}
|
|
function useSelectRange() {
|
|
var context = q2(SelectRangeContext);
|
|
if (!context) {
|
|
throw new Error("useSelectRange must be used within a SelectRangeProvider");
|
|
}
|
|
return context;
|
|
}
|
|
function matcherToArray(matcher) {
|
|
if (Array.isArray(matcher)) {
|
|
return __spreadArray2([], matcher, true);
|
|
} else if (matcher !== void 0) {
|
|
return [matcher];
|
|
} else {
|
|
return [];
|
|
}
|
|
}
|
|
function getCustomModifiers(dayModifiers) {
|
|
var customModifiers = {};
|
|
Object.entries(dayModifiers).forEach(function(_a2) {
|
|
var modifier = _a2[0], matcher = _a2[1];
|
|
customModifiers[modifier] = matcherToArray(matcher);
|
|
});
|
|
return customModifiers;
|
|
}
|
|
var InternalModifier;
|
|
(function(InternalModifier2) {
|
|
InternalModifier2["Outside"] = "outside";
|
|
InternalModifier2["Disabled"] = "disabled";
|
|
InternalModifier2["Selected"] = "selected";
|
|
InternalModifier2["Hidden"] = "hidden";
|
|
InternalModifier2["Today"] = "today";
|
|
InternalModifier2["RangeStart"] = "range_start";
|
|
InternalModifier2["RangeEnd"] = "range_end";
|
|
InternalModifier2["RangeMiddle"] = "range_middle";
|
|
})(InternalModifier || (InternalModifier = {}));
|
|
var Selected = InternalModifier.Selected;
|
|
var Disabled = InternalModifier.Disabled;
|
|
var Hidden = InternalModifier.Hidden;
|
|
var Today = InternalModifier.Today;
|
|
var RangeEnd = InternalModifier.RangeEnd;
|
|
var RangeMiddle = InternalModifier.RangeMiddle;
|
|
var RangeStart = InternalModifier.RangeStart;
|
|
var Outside2 = InternalModifier.Outside;
|
|
function getInternalModifiers(dayPicker, selectMultiple, selectRange2) {
|
|
var _a2;
|
|
var internalModifiers = (_a2 = {}, _a2[Selected] = matcherToArray(dayPicker.selected), _a2[Disabled] = matcherToArray(dayPicker.disabled), _a2[Hidden] = matcherToArray(dayPicker.hidden), _a2[Today] = [dayPicker.today], _a2[RangeEnd] = [], _a2[RangeMiddle] = [], _a2[RangeStart] = [], _a2[Outside2] = [], _a2);
|
|
if (dayPicker.fromDate) {
|
|
internalModifiers[Disabled].push({ before: dayPicker.fromDate });
|
|
}
|
|
if (dayPicker.toDate) {
|
|
internalModifiers[Disabled].push({ after: dayPicker.toDate });
|
|
}
|
|
if (isDayPickerMultiple(dayPicker)) {
|
|
internalModifiers[Disabled] = internalModifiers[Disabled].concat(selectMultiple.modifiers[Disabled]);
|
|
} else if (isDayPickerRange(dayPicker)) {
|
|
internalModifiers[Disabled] = internalModifiers[Disabled].concat(selectRange2.modifiers[Disabled]);
|
|
internalModifiers[RangeStart] = selectRange2.modifiers[RangeStart];
|
|
internalModifiers[RangeMiddle] = selectRange2.modifiers[RangeMiddle];
|
|
internalModifiers[RangeEnd] = selectRange2.modifiers[RangeEnd];
|
|
}
|
|
return internalModifiers;
|
|
}
|
|
var ModifiersContext = B(void 0);
|
|
function ModifiersProvider(props2) {
|
|
var dayPicker = useDayPicker();
|
|
var selectMultiple = useSelectMultiple();
|
|
var selectRange2 = useSelectRange();
|
|
var internalModifiers = getInternalModifiers(dayPicker, selectMultiple, selectRange2);
|
|
var customModifiers = getCustomModifiers(dayPicker.modifiers);
|
|
var modifiers = __assign2(__assign2({}, internalModifiers), customModifiers);
|
|
return bn.createElement(ModifiersContext.Provider, { value: modifiers }, props2.children);
|
|
}
|
|
function useModifiers() {
|
|
var context = q2(ModifiersContext);
|
|
if (!context) {
|
|
throw new Error("useModifiers must be used within a ModifiersProvider");
|
|
}
|
|
return context;
|
|
}
|
|
function isDateInterval(matcher) {
|
|
return Boolean(matcher && typeof matcher === "object" && "before" in matcher && "after" in matcher);
|
|
}
|
|
function isDateRange(value) {
|
|
return Boolean(value && typeof value === "object" && "from" in value);
|
|
}
|
|
function isDateAfterType(value) {
|
|
return Boolean(value && typeof value === "object" && "after" in value);
|
|
}
|
|
function isDateBeforeType(value) {
|
|
return Boolean(value && typeof value === "object" && "before" in value);
|
|
}
|
|
function isDayOfWeekType(value) {
|
|
return Boolean(value && typeof value === "object" && "dayOfWeek" in value);
|
|
}
|
|
function isDateInRange(date, range) {
|
|
var _a2;
|
|
var from = range.from, to = range.to;
|
|
if (!from) {
|
|
return false;
|
|
}
|
|
if (!to && isSameDay(from, date)) {
|
|
return true;
|
|
}
|
|
if (!to) {
|
|
return false;
|
|
}
|
|
var isRangeInverted = differenceInCalendarDays(to, from) < 0;
|
|
if (isRangeInverted) {
|
|
_a2 = [to, from], from = _a2[0], to = _a2[1];
|
|
}
|
|
var isInRange = differenceInCalendarDays(date, from) >= 0 && differenceInCalendarDays(to, date) >= 0;
|
|
return isInRange;
|
|
}
|
|
function isDateType(value) {
|
|
return isDate(value);
|
|
}
|
|
function isArrayOfDates(value) {
|
|
return Array.isArray(value) && value.every(isDate);
|
|
}
|
|
function isMatch(day, matchers) {
|
|
return matchers.some(function(matcher) {
|
|
if (typeof matcher === "boolean") {
|
|
return matcher;
|
|
}
|
|
if (isDateType(matcher)) {
|
|
return isSameDay(day, matcher);
|
|
}
|
|
if (isArrayOfDates(matcher)) {
|
|
return matcher.includes(day);
|
|
}
|
|
if (isDateRange(matcher)) {
|
|
return isDateInRange(day, matcher);
|
|
}
|
|
if (isDayOfWeekType(matcher)) {
|
|
return matcher.dayOfWeek.includes(day.getDay());
|
|
}
|
|
if (isDateInterval(matcher)) {
|
|
var diffBefore = differenceInCalendarDays(matcher.before, day);
|
|
var diffAfter = differenceInCalendarDays(matcher.after, day);
|
|
var isDayBefore = diffBefore > 0;
|
|
var isDayAfter = diffAfter < 0;
|
|
var isClosedInterval = isAfter2(matcher.before, matcher.after);
|
|
if (isClosedInterval) {
|
|
return isDayAfter && isDayBefore;
|
|
} else {
|
|
return isDayBefore || isDayAfter;
|
|
}
|
|
}
|
|
if (isDateAfterType(matcher)) {
|
|
return differenceInCalendarDays(day, matcher.after) > 0;
|
|
}
|
|
if (isDateBeforeType(matcher)) {
|
|
return differenceInCalendarDays(matcher.before, day) > 0;
|
|
}
|
|
if (typeof matcher === "function") {
|
|
return matcher(day);
|
|
}
|
|
return false;
|
|
});
|
|
}
|
|
function getActiveModifiers(day, modifiers, displayMonth) {
|
|
var matchedModifiers = Object.keys(modifiers).reduce(function(result, key2) {
|
|
var modifier = modifiers[key2];
|
|
if (isMatch(day, modifier)) {
|
|
result.push(key2);
|
|
}
|
|
return result;
|
|
}, []);
|
|
var activeModifiers = {};
|
|
matchedModifiers.forEach(function(modifier) {
|
|
return activeModifiers[modifier] = true;
|
|
});
|
|
if (displayMonth && !isSameMonth(day, displayMonth)) {
|
|
activeModifiers.outside = true;
|
|
}
|
|
return activeModifiers;
|
|
}
|
|
function getInitialFocusTarget(displayMonths, modifiers) {
|
|
var firstDayInMonth = startOfMonth(displayMonths[0]);
|
|
var lastDayInMonth = endOfMonth(displayMonths[displayMonths.length - 1]);
|
|
var firstFocusableDay;
|
|
var today;
|
|
var date = firstDayInMonth;
|
|
while (date <= lastDayInMonth) {
|
|
var activeModifiers = getActiveModifiers(date, modifiers);
|
|
var isFocusable = !activeModifiers.disabled && !activeModifiers.hidden;
|
|
if (!isFocusable) {
|
|
date = addDays(date, 1);
|
|
continue;
|
|
}
|
|
if (activeModifiers.selected) {
|
|
return date;
|
|
}
|
|
if (activeModifiers.today && !today) {
|
|
today = date;
|
|
}
|
|
if (!firstFocusableDay) {
|
|
firstFocusableDay = date;
|
|
}
|
|
date = addDays(date, 1);
|
|
}
|
|
if (today) {
|
|
return today;
|
|
} else {
|
|
return firstFocusableDay;
|
|
}
|
|
}
|
|
var MAX_RETRY = 365;
|
|
function getNextFocus(focusedDay, options) {
|
|
var moveBy = options.moveBy, direction = options.direction, context = options.context, modifiers = options.modifiers, _a2 = options.retry, retry = _a2 === void 0 ? { count: 0, lastFocused: focusedDay } : _a2;
|
|
var weekStartsOn = context.weekStartsOn, fromDate = context.fromDate, toDate2 = context.toDate, locale2 = context.locale;
|
|
var moveFns = {
|
|
day: addDays,
|
|
week: addWeeks,
|
|
month: addMonths,
|
|
year: addYears,
|
|
startOfWeek: function(date) {
|
|
return context.ISOWeek ? startOfISOWeek(date) : startOfWeek(date, { locale: locale2, weekStartsOn });
|
|
},
|
|
endOfWeek: function(date) {
|
|
return context.ISOWeek ? endOfISOWeek(date) : endOfWeek(date, { locale: locale2, weekStartsOn });
|
|
}
|
|
};
|
|
var newFocusedDay = moveFns[moveBy](focusedDay, direction === "after" ? 1 : -1);
|
|
if (direction === "before" && fromDate) {
|
|
newFocusedDay = max([fromDate, newFocusedDay]);
|
|
} else if (direction === "after" && toDate2) {
|
|
newFocusedDay = min([toDate2, newFocusedDay]);
|
|
}
|
|
var isFocusable = true;
|
|
if (modifiers) {
|
|
var activeModifiers = getActiveModifiers(newFocusedDay, modifiers);
|
|
isFocusable = !activeModifiers.disabled && !activeModifiers.hidden;
|
|
}
|
|
if (isFocusable) {
|
|
return newFocusedDay;
|
|
} else {
|
|
if (retry.count > MAX_RETRY) {
|
|
return retry.lastFocused;
|
|
}
|
|
return getNextFocus(newFocusedDay, {
|
|
moveBy,
|
|
direction,
|
|
context,
|
|
modifiers,
|
|
retry: __assign2(__assign2({}, retry), { count: retry.count + 1 })
|
|
});
|
|
}
|
|
}
|
|
var FocusContext = B(void 0);
|
|
function FocusProvider(props2) {
|
|
var navigation = useNavigation();
|
|
var modifiers = useModifiers();
|
|
var _a2 = p2(), focusedDay = _a2[0], setFocusedDay = _a2[1];
|
|
var _b2 = p2(), lastFocused = _b2[0], setLastFocused = _b2[1];
|
|
var initialFocusTarget = getInitialFocusTarget(navigation.displayMonths, modifiers);
|
|
var focusTarget = (focusedDay !== null && focusedDay !== void 0 ? focusedDay : lastFocused && navigation.isDateDisplayed(lastFocused)) ? lastFocused : initialFocusTarget;
|
|
var blur = function() {
|
|
setLastFocused(focusedDay);
|
|
setFocusedDay(void 0);
|
|
};
|
|
var focus = function(date) {
|
|
setFocusedDay(date);
|
|
};
|
|
var context = useDayPicker();
|
|
var moveFocus = function(moveBy, direction) {
|
|
if (!focusedDay)
|
|
return;
|
|
var nextFocused = getNextFocus(focusedDay, {
|
|
moveBy,
|
|
direction,
|
|
context,
|
|
modifiers
|
|
});
|
|
if (isSameDay(focusedDay, nextFocused))
|
|
return void 0;
|
|
navigation.goToDate(nextFocused, focusedDay);
|
|
focus(nextFocused);
|
|
};
|
|
var value = {
|
|
focusedDay,
|
|
focusTarget,
|
|
blur,
|
|
focus,
|
|
focusDayAfter: function() {
|
|
return moveFocus("day", "after");
|
|
},
|
|
focusDayBefore: function() {
|
|
return moveFocus("day", "before");
|
|
},
|
|
focusWeekAfter: function() {
|
|
return moveFocus("week", "after");
|
|
},
|
|
focusWeekBefore: function() {
|
|
return moveFocus("week", "before");
|
|
},
|
|
focusMonthBefore: function() {
|
|
return moveFocus("month", "before");
|
|
},
|
|
focusMonthAfter: function() {
|
|
return moveFocus("month", "after");
|
|
},
|
|
focusYearBefore: function() {
|
|
return moveFocus("year", "before");
|
|
},
|
|
focusYearAfter: function() {
|
|
return moveFocus("year", "after");
|
|
},
|
|
focusStartOfWeek: function() {
|
|
return moveFocus("startOfWeek", "before");
|
|
},
|
|
focusEndOfWeek: function() {
|
|
return moveFocus("endOfWeek", "after");
|
|
}
|
|
};
|
|
return bn.createElement(FocusContext.Provider, { value }, props2.children);
|
|
}
|
|
function useFocusContext() {
|
|
var context = q2(FocusContext);
|
|
if (!context) {
|
|
throw new Error("useFocusContext must be used within a FocusProvider");
|
|
}
|
|
return context;
|
|
}
|
|
function useActiveModifiers(day, displayMonth) {
|
|
var modifiers = useModifiers();
|
|
var activeModifiers = getActiveModifiers(day, modifiers, displayMonth);
|
|
return activeModifiers;
|
|
}
|
|
var SelectSingleContext = B(void 0);
|
|
function SelectSingleProvider(props2) {
|
|
if (!isDayPickerSingle(props2.initialProps)) {
|
|
var emptyContextValue = {
|
|
selected: void 0
|
|
};
|
|
return bn.createElement(SelectSingleContext.Provider, { value: emptyContextValue }, props2.children);
|
|
}
|
|
return bn.createElement(SelectSingleProviderInternal, { initialProps: props2.initialProps, children: props2.children });
|
|
}
|
|
function SelectSingleProviderInternal(_a2) {
|
|
var initialProps = _a2.initialProps, children = _a2.children;
|
|
var onDayClick = function(day, activeModifiers, e4) {
|
|
var _a3, _b2, _c2;
|
|
(_a3 = initialProps.onDayClick) === null || _a3 === void 0 ? void 0 : _a3.call(initialProps, day, activeModifiers, e4);
|
|
if (activeModifiers.selected && !initialProps.required) {
|
|
(_b2 = initialProps.onSelect) === null || _b2 === void 0 ? void 0 : _b2.call(initialProps, void 0, day, activeModifiers, e4);
|
|
return;
|
|
}
|
|
(_c2 = initialProps.onSelect) === null || _c2 === void 0 ? void 0 : _c2.call(initialProps, day, day, activeModifiers, e4);
|
|
};
|
|
var contextValue = {
|
|
selected: initialProps.selected,
|
|
onDayClick
|
|
};
|
|
return bn.createElement(SelectSingleContext.Provider, { value: contextValue }, children);
|
|
}
|
|
function useSelectSingle() {
|
|
var context = q2(SelectSingleContext);
|
|
if (!context) {
|
|
throw new Error("useSelectSingle must be used within a SelectSingleProvider");
|
|
}
|
|
return context;
|
|
}
|
|
function useDayEventHandlers(date, activeModifiers) {
|
|
var dayPicker = useDayPicker();
|
|
var single = useSelectSingle();
|
|
var multiple = useSelectMultiple();
|
|
var range = useSelectRange();
|
|
var _a2 = useFocusContext(), focusDayAfter = _a2.focusDayAfter, focusDayBefore = _a2.focusDayBefore, focusWeekAfter = _a2.focusWeekAfter, focusWeekBefore = _a2.focusWeekBefore, blur = _a2.blur, focus = _a2.focus, focusMonthBefore = _a2.focusMonthBefore, focusMonthAfter = _a2.focusMonthAfter, focusYearBefore = _a2.focusYearBefore, focusYearAfter = _a2.focusYearAfter, focusStartOfWeek = _a2.focusStartOfWeek, focusEndOfWeek = _a2.focusEndOfWeek;
|
|
var onClick = function(e4) {
|
|
var _a3, _b2, _c2, _d2;
|
|
if (isDayPickerSingle(dayPicker)) {
|
|
(_a3 = single.onDayClick) === null || _a3 === void 0 ? void 0 : _a3.call(single, date, activeModifiers, e4);
|
|
} else if (isDayPickerMultiple(dayPicker)) {
|
|
(_b2 = multiple.onDayClick) === null || _b2 === void 0 ? void 0 : _b2.call(multiple, date, activeModifiers, e4);
|
|
} else if (isDayPickerRange(dayPicker)) {
|
|
(_c2 = range.onDayClick) === null || _c2 === void 0 ? void 0 : _c2.call(range, date, activeModifiers, e4);
|
|
} else {
|
|
(_d2 = dayPicker.onDayClick) === null || _d2 === void 0 ? void 0 : _d2.call(dayPicker, date, activeModifiers, e4);
|
|
}
|
|
};
|
|
var onFocus = function(e4) {
|
|
var _a3;
|
|
focus(date);
|
|
(_a3 = dayPicker.onDayFocus) === null || _a3 === void 0 ? void 0 : _a3.call(dayPicker, date, activeModifiers, e4);
|
|
};
|
|
var onBlur = function(e4) {
|
|
var _a3;
|
|
blur();
|
|
(_a3 = dayPicker.onDayBlur) === null || _a3 === void 0 ? void 0 : _a3.call(dayPicker, date, activeModifiers, e4);
|
|
};
|
|
var onMouseEnter = function(e4) {
|
|
var _a3;
|
|
(_a3 = dayPicker.onDayMouseEnter) === null || _a3 === void 0 ? void 0 : _a3.call(dayPicker, date, activeModifiers, e4);
|
|
};
|
|
var onMouseLeave = function(e4) {
|
|
var _a3;
|
|
(_a3 = dayPicker.onDayMouseLeave) === null || _a3 === void 0 ? void 0 : _a3.call(dayPicker, date, activeModifiers, e4);
|
|
};
|
|
var onPointerEnter = function(e4) {
|
|
var _a3;
|
|
(_a3 = dayPicker.onDayPointerEnter) === null || _a3 === void 0 ? void 0 : _a3.call(dayPicker, date, activeModifiers, e4);
|
|
};
|
|
var onPointerLeave = function(e4) {
|
|
var _a3;
|
|
(_a3 = dayPicker.onDayPointerLeave) === null || _a3 === void 0 ? void 0 : _a3.call(dayPicker, date, activeModifiers, e4);
|
|
};
|
|
var onTouchCancel = function(e4) {
|
|
var _a3;
|
|
(_a3 = dayPicker.onDayTouchCancel) === null || _a3 === void 0 ? void 0 : _a3.call(dayPicker, date, activeModifiers, e4);
|
|
};
|
|
var onTouchEnd = function(e4) {
|
|
var _a3;
|
|
(_a3 = dayPicker.onDayTouchEnd) === null || _a3 === void 0 ? void 0 : _a3.call(dayPicker, date, activeModifiers, e4);
|
|
};
|
|
var onTouchMove = function(e4) {
|
|
var _a3;
|
|
(_a3 = dayPicker.onDayTouchMove) === null || _a3 === void 0 ? void 0 : _a3.call(dayPicker, date, activeModifiers, e4);
|
|
};
|
|
var onTouchStart = function(e4) {
|
|
var _a3;
|
|
(_a3 = dayPicker.onDayTouchStart) === null || _a3 === void 0 ? void 0 : _a3.call(dayPicker, date, activeModifiers, e4);
|
|
};
|
|
var onKeyUp = function(e4) {
|
|
var _a3;
|
|
(_a3 = dayPicker.onDayKeyUp) === null || _a3 === void 0 ? void 0 : _a3.call(dayPicker, date, activeModifiers, e4);
|
|
};
|
|
var onKeyDown = function(e4) {
|
|
var _a3;
|
|
switch (e4.key) {
|
|
case "ArrowLeft":
|
|
e4.preventDefault();
|
|
e4.stopPropagation();
|
|
dayPicker.dir === "rtl" ? focusDayAfter() : focusDayBefore();
|
|
break;
|
|
case "ArrowRight":
|
|
e4.preventDefault();
|
|
e4.stopPropagation();
|
|
dayPicker.dir === "rtl" ? focusDayBefore() : focusDayAfter();
|
|
break;
|
|
case "ArrowDown":
|
|
e4.preventDefault();
|
|
e4.stopPropagation();
|
|
focusWeekAfter();
|
|
break;
|
|
case "ArrowUp":
|
|
e4.preventDefault();
|
|
e4.stopPropagation();
|
|
focusWeekBefore();
|
|
break;
|
|
case "PageUp":
|
|
e4.preventDefault();
|
|
e4.stopPropagation();
|
|
e4.shiftKey ? focusYearBefore() : focusMonthBefore();
|
|
break;
|
|
case "PageDown":
|
|
e4.preventDefault();
|
|
e4.stopPropagation();
|
|
e4.shiftKey ? focusYearAfter() : focusMonthAfter();
|
|
break;
|
|
case "Home":
|
|
e4.preventDefault();
|
|
e4.stopPropagation();
|
|
focusStartOfWeek();
|
|
break;
|
|
case "End":
|
|
e4.preventDefault();
|
|
e4.stopPropagation();
|
|
focusEndOfWeek();
|
|
break;
|
|
}
|
|
(_a3 = dayPicker.onDayKeyDown) === null || _a3 === void 0 ? void 0 : _a3.call(dayPicker, date, activeModifiers, e4);
|
|
};
|
|
var eventHandlers = {
|
|
onClick,
|
|
onFocus,
|
|
onBlur,
|
|
onKeyDown,
|
|
onKeyUp,
|
|
onMouseEnter,
|
|
onMouseLeave,
|
|
onPointerEnter,
|
|
onPointerLeave,
|
|
onTouchCancel,
|
|
onTouchEnd,
|
|
onTouchMove,
|
|
onTouchStart
|
|
};
|
|
return eventHandlers;
|
|
}
|
|
function useSelectedDays() {
|
|
var dayPicker = useDayPicker();
|
|
var single = useSelectSingle();
|
|
var multiple = useSelectMultiple();
|
|
var range = useSelectRange();
|
|
var selectedDays = isDayPickerSingle(dayPicker) ? single.selected : isDayPickerMultiple(dayPicker) ? multiple.selected : isDayPickerRange(dayPicker) ? range.selected : void 0;
|
|
return selectedDays;
|
|
}
|
|
function isInternalModifier(modifier) {
|
|
return Object.values(InternalModifier).includes(modifier);
|
|
}
|
|
function getDayClassNames(dayPicker, activeModifiers) {
|
|
var classNames8 = [dayPicker.classNames.day];
|
|
Object.keys(activeModifiers).forEach(function(modifier) {
|
|
var customClassName = dayPicker.modifiersClassNames[modifier];
|
|
if (customClassName) {
|
|
classNames8.push(customClassName);
|
|
} else if (isInternalModifier(modifier)) {
|
|
var internalClassName = dayPicker.classNames["day_".concat(modifier)];
|
|
if (internalClassName) {
|
|
classNames8.push(internalClassName);
|
|
}
|
|
}
|
|
});
|
|
return classNames8;
|
|
}
|
|
function getDayStyle(dayPicker, activeModifiers) {
|
|
var style = __assign2({}, dayPicker.styles.day);
|
|
Object.keys(activeModifiers).forEach(function(modifier) {
|
|
var _a2;
|
|
style = __assign2(__assign2({}, style), (_a2 = dayPicker.modifiersStyles) === null || _a2 === void 0 ? void 0 : _a2[modifier]);
|
|
});
|
|
return style;
|
|
}
|
|
function useDayRender(day, displayMonth, buttonRef) {
|
|
var _a2;
|
|
var _b2, _c2;
|
|
var dayPicker = useDayPicker();
|
|
var focusContext = useFocusContext();
|
|
var activeModifiers = useActiveModifiers(day, displayMonth);
|
|
var eventHandlers = useDayEventHandlers(day, activeModifiers);
|
|
var selectedDays = useSelectedDays();
|
|
var isButton = Boolean(dayPicker.onDayClick || dayPicker.mode !== "default");
|
|
h2(function() {
|
|
var _a3;
|
|
if (activeModifiers.outside)
|
|
return;
|
|
if (!focusContext.focusedDay)
|
|
return;
|
|
if (!isButton)
|
|
return;
|
|
if (isSameDay(focusContext.focusedDay, day)) {
|
|
(_a3 = buttonRef.current) === null || _a3 === void 0 ? void 0 : _a3.focus();
|
|
}
|
|
}, [
|
|
focusContext.focusedDay,
|
|
day,
|
|
buttonRef,
|
|
isButton,
|
|
activeModifiers.outside
|
|
]);
|
|
var className = getDayClassNames(dayPicker, activeModifiers).join(" ");
|
|
var style = getDayStyle(dayPicker, activeModifiers);
|
|
var ariaLabel = dayPicker.labels.labelDay(day, activeModifiers, {
|
|
locale: dayPicker.locale
|
|
});
|
|
var isHidden = Boolean(activeModifiers.outside && !dayPicker.showOutsideDays || activeModifiers.hidden);
|
|
var DayContentComponent = (_c2 = (_b2 = dayPicker.components) === null || _b2 === void 0 ? void 0 : _b2.DayContent) !== null && _c2 !== void 0 ? _c2 : DayContent;
|
|
var children = bn.createElement(DayContentComponent, { date: day, displayMonth, activeModifiers });
|
|
var divProps = {
|
|
style,
|
|
className,
|
|
children,
|
|
"aria-label": ariaLabel
|
|
};
|
|
var isFocusTarget = focusContext.focusTarget && isSameDay(focusContext.focusTarget, day) && !activeModifiers.outside;
|
|
var isFocused = focusContext.focusedDay && isSameDay(focusContext.focusedDay, day);
|
|
var buttonProps = __assign2(__assign2(__assign2({}, divProps), (_a2 = { disabled: activeModifiers.disabled }, _a2["aria-pressed"] = activeModifiers.selected, _a2["aria-label"] = ariaLabel, _a2.tabIndex = isFocused || isFocusTarget ? 0 : -1, _a2)), eventHandlers);
|
|
var dayRender = {
|
|
isButton,
|
|
isHidden,
|
|
activeModifiers,
|
|
selectedDays,
|
|
buttonProps,
|
|
divProps
|
|
};
|
|
return dayRender;
|
|
}
|
|
function Day(props2) {
|
|
var buttonRef = _2(null);
|
|
var dayRender = useDayRender(props2.date, props2.displayMonth, buttonRef);
|
|
if (dayRender.isHidden) {
|
|
return bn.createElement(bn.Fragment, null);
|
|
}
|
|
if (!dayRender.isButton) {
|
|
return bn.createElement("div", __assign2({}, dayRender.divProps));
|
|
}
|
|
return bn.createElement(Button, __assign2({ name: "day", ref: buttonRef }, dayRender.buttonProps));
|
|
}
|
|
function WeekNumber(props2) {
|
|
var weekNumber = props2.number, dates = props2.dates;
|
|
var _a2 = useDayPicker(), onWeekNumberClick = _a2.onWeekNumberClick, styles = _a2.styles, classNames8 = _a2.classNames, locale2 = _a2.locale, labelWeekNumber2 = _a2.labels.labelWeekNumber, formatWeekNumber2 = _a2.formatters.formatWeekNumber;
|
|
var content = formatWeekNumber2(Number(weekNumber), { locale: locale2 });
|
|
if (!onWeekNumberClick) {
|
|
return bn.createElement("span", { className: classNames8.weeknumber, style: styles.weeknumber }, content);
|
|
}
|
|
var label = labelWeekNumber2(Number(weekNumber), { locale: locale2 });
|
|
var handleClick = function(e4) {
|
|
onWeekNumberClick(weekNumber, dates, e4);
|
|
};
|
|
return bn.createElement(Button, { name: "week-number", "aria-label": label, className: classNames8.weeknumber, style: styles.weeknumber, onClick: handleClick }, content);
|
|
}
|
|
function Row(props2) {
|
|
var _a2, _b2;
|
|
var _c2 = useDayPicker(), styles = _c2.styles, classNames8 = _c2.classNames, showWeekNumber = _c2.showWeekNumber, components = _c2.components;
|
|
var DayComponent = (_a2 = components === null || components === void 0 ? void 0 : components.Day) !== null && _a2 !== void 0 ? _a2 : Day;
|
|
var WeeknumberComponent = (_b2 = components === null || components === void 0 ? void 0 : components.WeekNumber) !== null && _b2 !== void 0 ? _b2 : WeekNumber;
|
|
var weekNumberCell;
|
|
if (showWeekNumber) {
|
|
weekNumberCell = bn.createElement(
|
|
"td",
|
|
{ className: classNames8.cell, style: styles.cell },
|
|
bn.createElement(WeeknumberComponent, { number: props2.weekNumber, dates: props2.dates })
|
|
);
|
|
}
|
|
return bn.createElement(
|
|
"tr",
|
|
{ className: classNames8.row, style: styles.row },
|
|
weekNumberCell,
|
|
props2.dates.map(function(date) {
|
|
return bn.createElement(
|
|
"td",
|
|
{ className: classNames8.cell, style: styles.cell, key: getUnixTime(date) },
|
|
bn.createElement(DayComponent, { displayMonth: props2.displayMonth, date })
|
|
);
|
|
})
|
|
);
|
|
}
|
|
function daysToMonthWeeks(fromDate, toDate2, options) {
|
|
var toWeek = (options === null || options === void 0 ? void 0 : options.ISOWeek) ? endOfISOWeek(toDate2) : endOfWeek(toDate2, options);
|
|
var fromWeek = (options === null || options === void 0 ? void 0 : options.ISOWeek) ? startOfISOWeek(fromDate) : startOfWeek(fromDate, options);
|
|
var nOfDays = differenceInCalendarDays(toWeek, fromWeek);
|
|
var days = [];
|
|
for (var i4 = 0; i4 <= nOfDays; i4++) {
|
|
days.push(addDays(fromWeek, i4));
|
|
}
|
|
var weeksInMonth = days.reduce(function(result, date) {
|
|
var weekNumber = (options === null || options === void 0 ? void 0 : options.ISOWeek) ? getISOWeek(date) : getWeek(date, options);
|
|
var existingWeek = result.find(function(value) {
|
|
return value.weekNumber === weekNumber;
|
|
});
|
|
if (existingWeek) {
|
|
existingWeek.dates.push(date);
|
|
return result;
|
|
}
|
|
result.push({
|
|
weekNumber,
|
|
dates: [date]
|
|
});
|
|
return result;
|
|
}, []);
|
|
return weeksInMonth;
|
|
}
|
|
function getMonthWeeks(month, options) {
|
|
var weeksInMonth = daysToMonthWeeks(startOfMonth(month), endOfMonth(month), options);
|
|
if (options === null || options === void 0 ? void 0 : options.useFixedWeeks) {
|
|
var nrOfMonthWeeks = getWeeksInMonth(month, options);
|
|
if (nrOfMonthWeeks < 6) {
|
|
var lastWeek = weeksInMonth[weeksInMonth.length - 1];
|
|
var lastDate = lastWeek.dates[lastWeek.dates.length - 1];
|
|
var toDate2 = addWeeks(lastDate, 6 - nrOfMonthWeeks);
|
|
var extraWeeks = daysToMonthWeeks(addWeeks(lastDate, 1), toDate2, options);
|
|
weeksInMonth.push.apply(weeksInMonth, extraWeeks);
|
|
}
|
|
}
|
|
return weeksInMonth;
|
|
}
|
|
function Table(props2) {
|
|
var _a2, _b2, _c2;
|
|
var _d2 = useDayPicker(), locale2 = _d2.locale, classNames8 = _d2.classNames, styles = _d2.styles, hideHead = _d2.hideHead, fixedWeeks = _d2.fixedWeeks, components = _d2.components, weekStartsOn = _d2.weekStartsOn, firstWeekContainsDate = _d2.firstWeekContainsDate, ISOWeek = _d2.ISOWeek;
|
|
var weeks = getMonthWeeks(props2.displayMonth, {
|
|
useFixedWeeks: Boolean(fixedWeeks),
|
|
ISOWeek,
|
|
locale: locale2,
|
|
weekStartsOn,
|
|
firstWeekContainsDate
|
|
});
|
|
var HeadComponent = (_a2 = components === null || components === void 0 ? void 0 : components.Head) !== null && _a2 !== void 0 ? _a2 : Head;
|
|
var RowComponent = (_b2 = components === null || components === void 0 ? void 0 : components.Row) !== null && _b2 !== void 0 ? _b2 : Row;
|
|
var FooterComponent = (_c2 = components === null || components === void 0 ? void 0 : components.Footer) !== null && _c2 !== void 0 ? _c2 : Footer;
|
|
return bn.createElement(
|
|
"table",
|
|
{ className: classNames8.table, style: styles.table, role: "grid", "aria-labelledby": props2["aria-labelledby"] },
|
|
!hideHead && bn.createElement(HeadComponent, null),
|
|
bn.createElement("tbody", { className: classNames8.tbody, style: styles.tbody }, weeks.map(function(week) {
|
|
return bn.createElement(RowComponent, { displayMonth: props2.displayMonth, key: week.weekNumber, dates: week.dates, weekNumber: week.weekNumber });
|
|
})),
|
|
bn.createElement(FooterComponent, null)
|
|
);
|
|
}
|
|
function canUseDOM2() {
|
|
return !!(typeof window !== "undefined" && window.document && window.document.createElement);
|
|
}
|
|
var useIsomorphicLayoutEffect2 = canUseDOM2() ? s2 : h2;
|
|
var serverHandoffComplete = false;
|
|
var id = 0;
|
|
function genId2() {
|
|
return "react-day-picker-".concat(++id);
|
|
}
|
|
function useId(providedId) {
|
|
var _a2;
|
|
var initialId = providedId !== null && providedId !== void 0 ? providedId : serverHandoffComplete ? genId2() : null;
|
|
var _b2 = p2(initialId), id2 = _b2[0], setId = _b2[1];
|
|
useIsomorphicLayoutEffect2(function() {
|
|
if (id2 === null) {
|
|
setId(genId2());
|
|
}
|
|
}, []);
|
|
h2(function() {
|
|
if (serverHandoffComplete === false) {
|
|
serverHandoffComplete = true;
|
|
}
|
|
}, []);
|
|
return (_a2 = providedId !== null && providedId !== void 0 ? providedId : id2) !== null && _a2 !== void 0 ? _a2 : void 0;
|
|
}
|
|
function Month(props2) {
|
|
var _a2;
|
|
var _b2;
|
|
var dayPicker = useDayPicker();
|
|
var dir = dayPicker.dir, classNames8 = dayPicker.classNames, styles = dayPicker.styles, components = dayPicker.components;
|
|
var displayMonths = useNavigation().displayMonths;
|
|
var captionId = useId(dayPicker.id ? "".concat(dayPicker.id, "-").concat(props2.displayIndex) : void 0);
|
|
var className = [classNames8.month];
|
|
var style = styles.month;
|
|
var isStart = props2.displayIndex === 0;
|
|
var isEnd = props2.displayIndex === displayMonths.length - 1;
|
|
var isCenter = !isStart && !isEnd;
|
|
if (dir === "rtl") {
|
|
_a2 = [isStart, isEnd], isEnd = _a2[0], isStart = _a2[1];
|
|
}
|
|
if (isStart) {
|
|
className.push(classNames8.caption_start);
|
|
style = __assign2(__assign2({}, style), styles.caption_start);
|
|
}
|
|
if (isEnd) {
|
|
className.push(classNames8.caption_end);
|
|
style = __assign2(__assign2({}, style), styles.caption_end);
|
|
}
|
|
if (isCenter) {
|
|
className.push(classNames8.caption_between);
|
|
style = __assign2(__assign2({}, style), styles.caption_between);
|
|
}
|
|
var CaptionComponent = (_b2 = components === null || components === void 0 ? void 0 : components.Caption) !== null && _b2 !== void 0 ? _b2 : Caption;
|
|
return bn.createElement(
|
|
"div",
|
|
{ key: props2.displayIndex, className: className.join(" "), style },
|
|
bn.createElement(CaptionComponent, { id: captionId, displayMonth: props2.displayMonth }),
|
|
bn.createElement(Table, { "aria-labelledby": captionId, displayMonth: props2.displayMonth })
|
|
);
|
|
}
|
|
function Root() {
|
|
var dayPicker = useDayPicker();
|
|
var focusContext = useFocusContext();
|
|
var navigation = useNavigation();
|
|
var _a2 = p2(false), hasInitialFocus = _a2[0], setHasInitialFocus = _a2[1];
|
|
h2(function() {
|
|
if (!dayPicker.initialFocus)
|
|
return;
|
|
if (!focusContext.focusTarget)
|
|
return;
|
|
if (hasInitialFocus)
|
|
return;
|
|
focusContext.focus(focusContext.focusTarget);
|
|
setHasInitialFocus(true);
|
|
}, [
|
|
dayPicker.initialFocus,
|
|
hasInitialFocus,
|
|
focusContext.focus,
|
|
focusContext.focusTarget,
|
|
focusContext
|
|
]);
|
|
var classNames8 = [dayPicker.classNames.root, dayPicker.className];
|
|
if (dayPicker.numberOfMonths > 1) {
|
|
classNames8.push(dayPicker.classNames.multiple_months);
|
|
}
|
|
if (dayPicker.showWeekNumber) {
|
|
classNames8.push(dayPicker.classNames.with_weeknumber);
|
|
}
|
|
var style = __assign2(__assign2({}, dayPicker.styles.root), dayPicker.style);
|
|
return bn.createElement(
|
|
"div",
|
|
{ className: classNames8.join(" "), style, dir: dayPicker.dir },
|
|
bn.createElement("div", { className: dayPicker.classNames.months, style: dayPicker.styles.months }, navigation.displayMonths.map(function(month, i4) {
|
|
return bn.createElement(Month, { key: i4, displayIndex: i4, displayMonth: month });
|
|
}))
|
|
);
|
|
}
|
|
function RootProvider(props2) {
|
|
var children = props2.children, initialProps = __rest2(props2, ["children"]);
|
|
return bn.createElement(
|
|
DayPickerProvider,
|
|
{ initialProps },
|
|
bn.createElement(
|
|
NavigationProvider,
|
|
null,
|
|
bn.createElement(
|
|
SelectSingleProvider,
|
|
{ initialProps },
|
|
bn.createElement(
|
|
SelectMultipleProvider,
|
|
{ initialProps },
|
|
bn.createElement(
|
|
SelectRangeProvider,
|
|
{ initialProps },
|
|
bn.createElement(
|
|
ModifiersProvider,
|
|
null,
|
|
bn.createElement(FocusProvider, null, children)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
)
|
|
);
|
|
}
|
|
function DayPicker(props2) {
|
|
return bn.createElement(
|
|
RootProvider,
|
|
__assign2({}, props2),
|
|
bn.createElement(Root, null)
|
|
);
|
|
}
|
|
|
|
// src/components/ui/menus/datePickerMenu.tsx
|
|
var showDatePickerMenu = (point, value, setValue, format2) => {
|
|
const menu = new import_obsidian8.Menu();
|
|
menu.dom.toggleClass("mk-menu", true);
|
|
menu.setUseNativeMenu(false);
|
|
const frag = document.createDocumentFragment();
|
|
const div = frag.createEl("div");
|
|
div.addEventListener("click", (e4) => {
|
|
e4.stopImmediatePropagation();
|
|
});
|
|
div.addEventListener("mousedown", (e4) => {
|
|
e4.stopImmediatePropagation();
|
|
});
|
|
div.addEventListener("mouseup", (e4) => {
|
|
e4.stopImmediatePropagation();
|
|
});
|
|
div.addEventListener("keydown", (e4) => {
|
|
});
|
|
const setDate = (date) => {
|
|
setValue(date);
|
|
menu.hide();
|
|
};
|
|
const root = createRoot(div);
|
|
root.render(
|
|
/* @__PURE__ */ bn.createElement(bn.Fragment, null, /* @__PURE__ */ bn.createElement(DayPicker, {
|
|
defaultMonth: value,
|
|
mode: "single",
|
|
selected: value,
|
|
labels: {
|
|
labelMonthDropdown: () => void 0,
|
|
labelYearDropdown: () => void 0,
|
|
labelNext: () => void 0,
|
|
labelPrevious: () => void 0,
|
|
labelDay: () => void 0,
|
|
labelWeekday: () => void 0,
|
|
labelWeekNumber: () => void 0
|
|
},
|
|
onSelect: setDate
|
|
}))
|
|
);
|
|
menu.addItem((item) => {
|
|
item.setTitle(frag);
|
|
});
|
|
const keys = [...menu.scope.keys];
|
|
for (let i4 = 0; i4 < keys.length; i4++) {
|
|
if (keys[i4].key != "Escape") {
|
|
menu.scope.unregister(keys[i4]);
|
|
}
|
|
}
|
|
menu.showAtPosition(point);
|
|
return menu;
|
|
};
|
|
|
|
// src/components/ContextView/DataTypeView/DateCell.tsx
|
|
var DateCell = (props2) => {
|
|
const [value, setValue] = p2(props2.initialValue);
|
|
h2(() => {
|
|
setValue(props2.initialValue);
|
|
}, [props2.initialValue]);
|
|
const date = F(() => {
|
|
const dateTime = Date.parse(value);
|
|
return dateTime > 0 ? new Date(dateTime + new Date().getTimezoneOffset() * 60 * 1e3) : null;
|
|
}, [value]);
|
|
const saveValue = (date2) => {
|
|
const newValue = format(date2, "yyyy-MM-dd");
|
|
props2.saveValue(newValue);
|
|
setValue(newValue);
|
|
props2.setEditMode(null);
|
|
};
|
|
const menuRef = _2(null);
|
|
const ref = _2(null);
|
|
h2(() => {
|
|
if (props2.editMode == 2 /* EditModeActive */) {
|
|
if (ref.current) {
|
|
showPicker();
|
|
ref.current.focus();
|
|
}
|
|
}
|
|
}, [props2.editMode]);
|
|
const showPicker = T2((e4) => {
|
|
const offset = e4 ? e4.target.getBoundingClientRect() : ref.current.getBoundingClientRect();
|
|
menuRef.current = showDatePickerMenu(
|
|
{ x: offset.left - 4, y: offset.bottom - 4 },
|
|
date,
|
|
saveValue
|
|
);
|
|
}, [date]);
|
|
const onKeyDown = (e4) => {
|
|
e4.stopPropagation();
|
|
if (e4.key == "Enter" || e4.key == "Escape") {
|
|
e4.target.blur();
|
|
saveValue(date);
|
|
menuRef.current.hide();
|
|
}
|
|
};
|
|
return /* @__PURE__ */ bn.createElement("div", {
|
|
className: "mk-cell-date",
|
|
onClick: (e4) => !value && showPicker(e4)
|
|
}, props2.editMode == 2 ? /* @__PURE__ */ bn.createElement("input", {
|
|
onClick: (e4) => e4.stopPropagation(),
|
|
className: "mk-cell-text",
|
|
ref,
|
|
type: "text",
|
|
value,
|
|
onChange: (e4) => setValue(e4.target.value),
|
|
onMouseDown: () => showPicker(),
|
|
onKeyDown
|
|
}) : /* @__PURE__ */ bn.createElement("div", {
|
|
className: "mk-cell-date-value",
|
|
onClick: (e4) => showPicker(e4)
|
|
}, date ? format(date, "MMM dd yyyy") : value));
|
|
};
|
|
|
|
// src/components/StickerMenu/emojis/default.ts
|
|
var emojis = {
|
|
smileys_people: [
|
|
{ n: ["grinning", "grinning face"], u: "1f600" },
|
|
{ n: ["smiley", "smiling face with open mouth"], u: "1f603" },
|
|
{
|
|
n: ["smile", "smiling face with open mouth and smiling eyes"],
|
|
u: "1f604"
|
|
},
|
|
{ n: ["grin", "grinning face with smiling eyes"], u: "1f601" },
|
|
{
|
|
n: [
|
|
"laughing",
|
|
"satisfied",
|
|
"smiling face with open mouth and tightly-closed eyes"
|
|
],
|
|
u: "1f606"
|
|
},
|
|
{
|
|
n: ["sweat smile", "smiling face with open mouth and cold sweat"],
|
|
u: "1f605"
|
|
},
|
|
{ n: ["rolling on the floor laughing"], u: "1f923" },
|
|
{ n: ["joy", "face with tears of joy"], u: "1f602" },
|
|
{ n: ["slightly smiling face"], u: "1f642" },
|
|
{ n: ["upside-down face", "upside down face"], u: "1f643" },
|
|
{ n: ["melting face"], u: "1fae0" },
|
|
{ n: ["wink", "winking face"], u: "1f609" },
|
|
{ n: ["blush", "smiling face with smiling eyes"], u: "1f60a" },
|
|
{ n: ["innocent", "smiling face with halo"], u: "1f607" },
|
|
{
|
|
n: [
|
|
"smiling face with 3 hearts",
|
|
"smiling face with smiling eyes and three hearts"
|
|
],
|
|
u: "1f970"
|
|
},
|
|
{ n: ["heart eyes", "smiling face with heart-shaped eyes"], u: "1f60d" },
|
|
{ n: ["star-struck", "grinning face with star eyes"], u: "1f929" },
|
|
{ n: ["kissing heart", "face throwing a kiss"], u: "1f618" },
|
|
{ n: ["kissing", "kissing face"], u: "1f617" },
|
|
{ n: ["relaxed", "white smiling face"], u: "263a-fe0f" },
|
|
{ n: ["kissing closed eyes", "kissing face with closed eyes"], u: "1f61a" },
|
|
{
|
|
n: ["kissing smiling eyes", "kissing face with smiling eyes"],
|
|
u: "1f619"
|
|
},
|
|
{ n: ["smiling face with tear"], u: "1f972" },
|
|
{ n: ["yum", "face savouring delicious food"], u: "1f60b" },
|
|
{ n: ["stuck out tongue", "face with stuck-out tongue"], u: "1f61b" },
|
|
{
|
|
n: [
|
|
"stuck out tongue winking eye",
|
|
"face with stuck-out tongue and winking eye"
|
|
],
|
|
u: "1f61c"
|
|
},
|
|
{
|
|
n: ["zany face", "grinning face with one large and one small eye"],
|
|
u: "1f92a"
|
|
},
|
|
{
|
|
n: [
|
|
"stuck out tongue closed eyes",
|
|
"face with stuck-out tongue and tightly-closed eyes"
|
|
],
|
|
u: "1f61d"
|
|
},
|
|
{ n: ["money-mouth face", "money mouth face"], u: "1f911" },
|
|
{ n: ["hugging face"], u: "1f917" },
|
|
{
|
|
n: [
|
|
"face with hand over mouth",
|
|
"smiling face with smiling eyes and hand covering mouth"
|
|
],
|
|
u: "1f92d"
|
|
},
|
|
{ n: ["face with open eyes and hand over mouth"], u: "1fae2" },
|
|
{ n: ["face with peeking eye"], u: "1fae3" },
|
|
{
|
|
n: ["shushing face", "face with finger covering closed lips"],
|
|
u: "1f92b"
|
|
},
|
|
{ n: ["thinking face"], u: "1f914" },
|
|
{ n: ["saluting face"], u: "1fae1" },
|
|
{ n: ["zipper-mouth face", "zipper mouth face"], u: "1f910" },
|
|
{
|
|
n: ["face with raised eyebrow", "face with one eyebrow raised"],
|
|
u: "1f928"
|
|
},
|
|
{ n: ["neutral face"], u: "1f610" },
|
|
{ n: ["expressionless", "expressionless face"], u: "1f611" },
|
|
{ n: ["no mouth", "face without mouth"], u: "1f636" },
|
|
{ n: ["dotted line face"], u: "1fae5" },
|
|
{ n: ["face in clouds"], u: "1f636-200d-1f32b-fe0f" },
|
|
{ n: ["smirk", "smirking face"], u: "1f60f" },
|
|
{ n: ["unamused", "unamused face"], u: "1f612" },
|
|
{ n: ["face with rolling eyes"], u: "1f644" },
|
|
{ n: ["grimacing", "grimacing face"], u: "1f62c" },
|
|
{ n: ["face exhaling"], u: "1f62e-200d-1f4a8" },
|
|
{ n: ["lying face"], u: "1f925" },
|
|
{ n: ["relieved", "relieved face"], u: "1f60c" },
|
|
{ n: ["pensive", "pensive face"], u: "1f614" },
|
|
{ n: ["sleepy", "sleepy face"], u: "1f62a" },
|
|
{ n: ["drooling face"], u: "1f924" },
|
|
{ n: ["sleeping", "sleeping face"], u: "1f634" },
|
|
{ n: ["mask", "face with medical mask"], u: "1f637" },
|
|
{ n: ["face with thermometer"], u: "1f912" },
|
|
{ n: ["face with head-bandage", "face with head bandage"], u: "1f915" },
|
|
{ n: ["nauseated face"], u: "1f922" },
|
|
{ n: ["face vomiting", "face with open mouth vomiting"], u: "1f92e" },
|
|
{ n: ["sneezing face"], u: "1f927" },
|
|
{ n: ["hot face", "overheated face"], u: "1f975" },
|
|
{ n: ["cold face", "freezing face"], u: "1f976" },
|
|
{ n: ["woozy face", "face with uneven eyes and wavy mouth"], u: "1f974" },
|
|
{ n: ["dizzy face"], u: "1f635" },
|
|
{ n: ["face with spiral eyes"], u: "1f635-200d-1f4ab" },
|
|
{ n: ["exploding head", "shocked face with exploding head"], u: "1f92f" },
|
|
{ n: ["face with cowboy hat"], u: "1f920" },
|
|
{ n: ["partying face", "face with party horn and party hat"], u: "1f973" },
|
|
{ n: ["disguised face"], u: "1f978" },
|
|
{ n: ["sunglasses", "smiling face with sunglasses"], u: "1f60e" },
|
|
{ n: ["nerd face"], u: "1f913" },
|
|
{ n: ["face with monocle"], u: "1f9d0" },
|
|
{ n: ["confused", "confused face"], u: "1f615" },
|
|
{ n: ["face with diagonal mouth"], u: "1fae4" },
|
|
{ n: ["worried", "worried face"], u: "1f61f" },
|
|
{ n: ["slightly frowning face"], u: "1f641" },
|
|
{ n: ["frowning face", "white frowning face"], u: "2639-fe0f" },
|
|
{ n: ["open mouth", "face with open mouth"], u: "1f62e" },
|
|
{ n: ["hushed", "hushed face"], u: "1f62f" },
|
|
{ n: ["astonished", "astonished face"], u: "1f632" },
|
|
{ n: ["flushed", "flushed face"], u: "1f633" },
|
|
{ n: ["pleading face", "face with pleading eyes"], u: "1f97a" },
|
|
{ n: ["face holding back tears"], u: "1f979" },
|
|
{ n: ["frowning", "frowning face with open mouth"], u: "1f626" },
|
|
{ n: ["anguished", "anguished face"], u: "1f627" },
|
|
{ n: ["fearful", "fearful face"], u: "1f628" },
|
|
{ n: ["cold sweat", "face with open mouth and cold sweat"], u: "1f630" },
|
|
{
|
|
n: ["disappointed relieved", "disappointed but relieved face"],
|
|
u: "1f625"
|
|
},
|
|
{ n: ["cry", "crying face"], u: "1f622" },
|
|
{ n: ["sob", "loudly crying face"], u: "1f62d" },
|
|
{ n: ["scream", "face screaming in fear"], u: "1f631" },
|
|
{ n: ["confounded", "confounded face"], u: "1f616" },
|
|
{ n: ["persevere", "persevering face"], u: "1f623" },
|
|
{ n: ["disappointed", "disappointed face"], u: "1f61e" },
|
|
{ n: ["sweat", "face with cold sweat"], u: "1f613" },
|
|
{ n: ["weary", "weary face"], u: "1f629" },
|
|
{ n: ["tired face"], u: "1f62b" },
|
|
{ n: ["yawning face"], u: "1f971" },
|
|
{ n: ["triumph", "face with look of triumph"], u: "1f624" },
|
|
{ n: ["rage", "pouting face"], u: "1f621" },
|
|
{ n: ["angry", "angry face"], u: "1f620" },
|
|
{
|
|
n: [
|
|
"face with symbols on mouth",
|
|
"serious face with symbols covering mouth"
|
|
],
|
|
u: "1f92c"
|
|
},
|
|
{ n: ["smiling imp", "smiling face with horns"], u: "1f608" },
|
|
{ n: ["imp"], u: "1f47f" },
|
|
{ n: ["skull"], u: "1f480" },
|
|
{ n: ["skull and crossbones"], u: "2620-fe0f" },
|
|
{ n: ["poop", "shit", "hankey", "pile of poo"], u: "1f4a9" },
|
|
{ n: ["clown face"], u: "1f921" },
|
|
{ n: ["japanese ogre"], u: "1f479" },
|
|
{ n: ["japanese goblin"], u: "1f47a" },
|
|
{ n: ["ghost"], u: "1f47b" },
|
|
{ n: ["alien", "extraterrestrial alien"], u: "1f47d" },
|
|
{ n: ["alien monster", "space invader"], u: "1f47e" },
|
|
{ n: ["robot face"], u: "1f916" },
|
|
{ n: ["smiley cat", "smiling cat face with open mouth"], u: "1f63a" },
|
|
{ n: ["smile cat", "grinning cat face with smiling eyes"], u: "1f638" },
|
|
{ n: ["joy cat", "cat face with tears of joy"], u: "1f639" },
|
|
{
|
|
n: ["heart eyes cat", "smiling cat face with heart-shaped eyes"],
|
|
u: "1f63b"
|
|
},
|
|
{ n: ["smirk cat", "cat face with wry smile"], u: "1f63c" },
|
|
{ n: ["kissing cat", "kissing cat face with closed eyes"], u: "1f63d" },
|
|
{ n: ["scream cat", "weary cat face"], u: "1f640" },
|
|
{ n: ["crying cat face"], u: "1f63f" },
|
|
{ n: ["pouting cat", "pouting cat face"], u: "1f63e" },
|
|
{ n: ["see no evil", "see-no-evil monkey"], u: "1f648" },
|
|
{ n: ["hear no evil", "hear-no-evil monkey"], u: "1f649" },
|
|
{ n: ["speak no evil", "speak-no-evil monkey"], u: "1f64a" },
|
|
{ n: ["kiss", "kiss mark"], u: "1f48b" },
|
|
{ n: ["love letter"], u: "1f48c" },
|
|
{ n: ["cupid", "heart with arrow"], u: "1f498" },
|
|
{ n: ["gift heart", "heart with ribbon"], u: "1f49d" },
|
|
{ n: ["sparkling heart"], u: "1f496" },
|
|
{ n: ["heartpulse", "growing heart"], u: "1f497" },
|
|
{ n: ["heartbeat", "beating heart"], u: "1f493" },
|
|
{ n: ["revolving hearts"], u: "1f49e" },
|
|
{ n: ["two hearts"], u: "1f495" },
|
|
{ n: ["heart decoration"], u: "1f49f" },
|
|
{
|
|
n: ["heart exclamation", "heavy heart exclamation mark ornament"],
|
|
u: "2763-fe0f"
|
|
},
|
|
{ n: ["broken heart"], u: "1f494" },
|
|
{ n: ["heart on fire"], u: "2764-fe0f-200d-1f525" },
|
|
{ n: ["mending heart"], u: "2764-fe0f-200d-1fa79" },
|
|
{ n: ["heart", "heavy black heart"], u: "2764-fe0f" },
|
|
{ n: ["orange heart"], u: "1f9e1" },
|
|
{ n: ["yellow heart"], u: "1f49b" },
|
|
{ n: ["green heart"], u: "1f49a" },
|
|
{ n: ["blue heart"], u: "1f499" },
|
|
{ n: ["purple heart"], u: "1f49c" },
|
|
{ n: ["brown heart"], u: "1f90e" },
|
|
{ n: ["black heart"], u: "1f5a4" },
|
|
{ n: ["white heart"], u: "1f90d" },
|
|
{ n: ["100", "hundred points symbol"], u: "1f4af" },
|
|
{ n: ["anger", "anger symbol"], u: "1f4a2" },
|
|
{ n: ["boom", "collision", "collision symbol"], u: "1f4a5" },
|
|
{ n: ["dizzy", "dizzy symbol"], u: "1f4ab" },
|
|
{ n: ["sweat drops", "splashing sweat symbol"], u: "1f4a6" },
|
|
{ n: ["dash", "dash symbol"], u: "1f4a8" },
|
|
{ n: ["hole"], u: "1f573-fe0f" },
|
|
{ n: ["bomb"], u: "1f4a3" },
|
|
{ n: ["speech balloon"], u: "1f4ac" },
|
|
{
|
|
n: ["eye in speech bubble", "eye-in-speech-bubble"],
|
|
u: "1f441-fe0f-200d-1f5e8-fe0f"
|
|
},
|
|
{ n: ["left speech bubble"], u: "1f5e8-fe0f" },
|
|
{ n: ["right anger bubble"], u: "1f5ef-fe0f" },
|
|
{ n: ["thought balloon"], u: "1f4ad" },
|
|
{ n: ["zzz", "sleeping symbol"], u: "1f4a4" },
|
|
{
|
|
n: ["wave", "waving hand sign"],
|
|
u: "1f44b",
|
|
v: [
|
|
"1f44b-1f3fb",
|
|
"1f44b-1f3fc",
|
|
"1f44b-1f3fd",
|
|
"1f44b-1f3fe",
|
|
"1f44b-1f3ff"
|
|
]
|
|
},
|
|
{
|
|
n: ["raised back of hand"],
|
|
u: "1f91a",
|
|
v: [
|
|
"1f91a-1f3fb",
|
|
"1f91a-1f3fc",
|
|
"1f91a-1f3fd",
|
|
"1f91a-1f3fe",
|
|
"1f91a-1f3ff"
|
|
]
|
|
},
|
|
{
|
|
n: ["hand with fingers splayed", "raised hand with fingers splayed"],
|
|
u: "1f590-fe0f",
|
|
v: [
|
|
"1f590-1f3fb",
|
|
"1f590-1f3fc",
|
|
"1f590-1f3fd",
|
|
"1f590-1f3fe",
|
|
"1f590-1f3ff"
|
|
]
|
|
},
|
|
{
|
|
n: ["hand", "raised hand"],
|
|
u: "270b",
|
|
v: ["270b-1f3fb", "270b-1f3fc", "270b-1f3fd", "270b-1f3fe", "270b-1f3ff"]
|
|
},
|
|
{
|
|
n: [
|
|
"spock-hand",
|
|
"raised hand with part between middle and ring fingers"
|
|
],
|
|
u: "1f596",
|
|
v: [
|
|
"1f596-1f3fb",
|
|
"1f596-1f3fc",
|
|
"1f596-1f3fd",
|
|
"1f596-1f3fe",
|
|
"1f596-1f3ff"
|
|
]
|
|
},
|
|
{
|
|
n: ["rightwards hand"],
|
|
u: "1faf1",
|
|
v: [
|
|
"1faf1-1f3fb",
|
|
"1faf1-1f3fc",
|
|
"1faf1-1f3fd",
|
|
"1faf1-1f3fe",
|
|
"1faf1-1f3ff"
|
|
]
|
|
},
|
|
{
|
|
n: ["leftwards hand"],
|
|
u: "1faf2",
|
|
v: [
|
|
"1faf2-1f3fb",
|
|
"1faf2-1f3fc",
|
|
"1faf2-1f3fd",
|
|
"1faf2-1f3fe",
|
|
"1faf2-1f3ff"
|
|
]
|
|
},
|
|
{
|
|
n: ["palm down hand"],
|
|
u: "1faf3",
|
|
v: [
|
|
"1faf3-1f3fb",
|
|
"1faf3-1f3fc",
|
|
"1faf3-1f3fd",
|
|
"1faf3-1f3fe",
|
|
"1faf3-1f3ff"
|
|
]
|
|
},
|
|
{
|
|
n: ["palm up hand"],
|
|
u: "1faf4",
|
|
v: [
|
|
"1faf4-1f3fb",
|
|
"1faf4-1f3fc",
|
|
"1faf4-1f3fd",
|
|
"1faf4-1f3fe",
|
|
"1faf4-1f3ff"
|
|
]
|
|
},
|
|
{
|
|
n: ["ok hand", "ok hand sign"],
|
|
u: "1f44c",
|
|
v: [
|
|
"1f44c-1f3fb",
|
|
"1f44c-1f3fc",
|
|
"1f44c-1f3fd",
|
|
"1f44c-1f3fe",
|
|
"1f44c-1f3ff"
|
|
]
|
|
},
|
|
{
|
|
n: ["pinched fingers"],
|
|
u: "1f90c",
|
|
v: [
|
|
"1f90c-1f3fb",
|
|
"1f90c-1f3fc",
|
|
"1f90c-1f3fd",
|
|
"1f90c-1f3fe",
|
|
"1f90c-1f3ff"
|
|
]
|
|
},
|
|
{
|
|
n: ["pinching hand"],
|
|
u: "1f90f",
|
|
v: [
|
|
"1f90f-1f3fb",
|
|
"1f90f-1f3fc",
|
|
"1f90f-1f3fd",
|
|
"1f90f-1f3fe",
|
|
"1f90f-1f3ff"
|
|
]
|
|
},
|
|
{
|
|
n: ["v", "victory hand"],
|
|
u: "270c-fe0f",
|
|
v: ["270c-1f3fb", "270c-1f3fc", "270c-1f3fd", "270c-1f3fe", "270c-1f3ff"]
|
|
},
|
|
{
|
|
n: ["crossed fingers", "hand with index and middle fingers crossed"],
|
|
u: "1f91e",
|
|
v: [
|
|
"1f91e-1f3fb",
|
|
"1f91e-1f3fc",
|
|
"1f91e-1f3fd",
|
|
"1f91e-1f3fe",
|
|
"1f91e-1f3ff"
|
|
]
|
|
},
|
|
{
|
|
n: ["hand with index finger and thumb crossed"],
|
|
u: "1faf0",
|
|
v: [
|
|
"1faf0-1f3fb",
|
|
"1faf0-1f3fc",
|
|
"1faf0-1f3fd",
|
|
"1faf0-1f3fe",
|
|
"1faf0-1f3ff"
|
|
]
|
|
},
|
|
{
|
|
n: ["i love you hand sign"],
|
|
u: "1f91f",
|
|
v: [
|
|
"1f91f-1f3fb",
|
|
"1f91f-1f3fc",
|
|
"1f91f-1f3fd",
|
|
"1f91f-1f3fe",
|
|
"1f91f-1f3ff"
|
|
]
|
|
},
|
|
{
|
|
n: ["the horns", "sign of the horns"],
|
|
u: "1f918",
|
|
v: [
|
|
"1f918-1f3fb",
|
|
"1f918-1f3fc",
|
|
"1f918-1f3fd",
|
|
"1f918-1f3fe",
|
|
"1f918-1f3ff"
|
|
]
|
|
},
|
|
{
|
|
n: ["call me hand"],
|
|
u: "1f919",
|
|
v: [
|
|
"1f919-1f3fb",
|
|
"1f919-1f3fc",
|
|
"1f919-1f3fd",
|
|
"1f919-1f3fe",
|
|
"1f919-1f3ff"
|
|
]
|
|
},
|
|
{
|
|
n: ["point left", "white left pointing backhand index"],
|
|
u: "1f448",
|
|
v: [
|
|
"1f448-1f3fb",
|
|
"1f448-1f3fc",
|
|
"1f448-1f3fd",
|
|
"1f448-1f3fe",
|
|
"1f448-1f3ff"
|
|
]
|
|
},
|
|
{
|
|
n: ["point right", "white right pointing backhand index"],
|
|
u: "1f449",
|
|
v: [
|
|
"1f449-1f3fb",
|
|
"1f449-1f3fc",
|
|
"1f449-1f3fd",
|
|
"1f449-1f3fe",
|
|
"1f449-1f3ff"
|
|
]
|
|
},
|
|
{
|
|
n: ["point up 2", "white up pointing backhand index"],
|
|
u: "1f446",
|
|
v: [
|
|
"1f446-1f3fb",
|
|
"1f446-1f3fc",
|
|
"1f446-1f3fd",
|
|
"1f446-1f3fe",
|
|
"1f446-1f3ff"
|
|
]
|
|
},
|
|
{
|
|
n: ["middle finger", "reversed hand with middle finger extended"],
|
|
u: "1f595",
|
|
v: [
|
|
"1f595-1f3fb",
|
|
"1f595-1f3fc",
|
|
"1f595-1f3fd",
|
|
"1f595-1f3fe",
|
|
"1f595-1f3ff"
|
|
]
|
|
},
|
|
{
|
|
n: ["point down", "white down pointing backhand index"],
|
|
u: "1f447",
|
|
v: [
|
|
"1f447-1f3fb",
|
|
"1f447-1f3fc",
|
|
"1f447-1f3fd",
|
|
"1f447-1f3fe",
|
|
"1f447-1f3ff"
|
|
]
|
|
},
|
|
{
|
|
n: ["point up", "white up pointing index"],
|
|
u: "261d-fe0f",
|
|
v: ["261d-1f3fb", "261d-1f3fc", "261d-1f3fd", "261d-1f3fe", "261d-1f3ff"]
|
|
},
|
|
{
|
|
n: ["index pointing at the viewer"],
|
|
u: "1faf5",
|
|
v: [
|
|
"1faf5-1f3fb",
|
|
"1faf5-1f3fc",
|
|
"1faf5-1f3fd",
|
|
"1faf5-1f3fe",
|
|
"1faf5-1f3ff"
|
|
]
|
|
},
|
|
{
|
|
n: ["+1", "thumbsup", "thumbs up sign"],
|
|
u: "1f44d",
|
|
v: [
|
|
"1f44d-1f3fb",
|
|
"1f44d-1f3fc",
|
|
"1f44d-1f3fd",
|
|
"1f44d-1f3fe",
|
|
"1f44d-1f3ff"
|
|
]
|
|
},
|
|
{
|
|
n: ["-1", "thumbsdown", "thumbs down sign"],
|
|
u: "1f44e",
|
|
v: [
|
|
"1f44e-1f3fb",
|
|
"1f44e-1f3fc",
|
|
"1f44e-1f3fd",
|
|
"1f44e-1f3fe",
|
|
"1f44e-1f3ff"
|
|
]
|
|
},
|
|
{
|
|
n: ["fist", "raised fist"],
|
|
u: "270a",
|
|
v: ["270a-1f3fb", "270a-1f3fc", "270a-1f3fd", "270a-1f3fe", "270a-1f3ff"]
|
|
},
|
|
{
|
|
n: ["punch", "facepunch", "fisted hand sign"],
|
|
u: "1f44a",
|
|
v: [
|
|
"1f44a-1f3fb",
|
|
"1f44a-1f3fc",
|
|
"1f44a-1f3fd",
|
|
"1f44a-1f3fe",
|
|
"1f44a-1f3ff"
|
|
]
|
|
},
|
|
{
|
|
n: ["left-facing fist"],
|
|
u: "1f91b",
|
|
v: [
|
|
"1f91b-1f3fb",
|
|
"1f91b-1f3fc",
|
|
"1f91b-1f3fd",
|
|
"1f91b-1f3fe",
|
|
"1f91b-1f3ff"
|
|
]
|
|
},
|
|
{
|
|
n: ["right-facing fist"],
|
|
u: "1f91c",
|
|
v: [
|
|
"1f91c-1f3fb",
|
|
"1f91c-1f3fc",
|
|
"1f91c-1f3fd",
|
|
"1f91c-1f3fe",
|
|
"1f91c-1f3ff"
|
|
]
|
|
},
|
|
{
|
|
n: ["clap", "clapping hands sign"],
|
|
u: "1f44f",
|
|
v: [
|
|
"1f44f-1f3fb",
|
|
"1f44f-1f3fc",
|
|
"1f44f-1f3fd",
|
|
"1f44f-1f3fe",
|
|
"1f44f-1f3ff"
|
|
]
|
|
},
|
|
{
|
|
n: ["raised hands", "person raising both hands in celebration"],
|
|
u: "1f64c",
|
|
v: [
|
|
"1f64c-1f3fb",
|
|
"1f64c-1f3fc",
|
|
"1f64c-1f3fd",
|
|
"1f64c-1f3fe",
|
|
"1f64c-1f3ff"
|
|
]
|
|
},
|
|
{
|
|
n: ["heart hands"],
|
|
u: "1faf6",
|
|
v: [
|
|
"1faf6-1f3fb",
|
|
"1faf6-1f3fc",
|
|
"1faf6-1f3fd",
|
|
"1faf6-1f3fe",
|
|
"1faf6-1f3ff"
|
|
]
|
|
},
|
|
{
|
|
n: ["open hands", "open hands sign"],
|
|
u: "1f450",
|
|
v: [
|
|
"1f450-1f3fb",
|
|
"1f450-1f3fc",
|
|
"1f450-1f3fd",
|
|
"1f450-1f3fe",
|
|
"1f450-1f3ff"
|
|
]
|
|
},
|
|
{
|
|
n: ["palms up together"],
|
|
u: "1f932",
|
|
v: [
|
|
"1f932-1f3fb",
|
|
"1f932-1f3fc",
|
|
"1f932-1f3fd",
|
|
"1f932-1f3fe",
|
|
"1f932-1f3ff"
|
|
]
|
|
},
|
|
{
|
|
n: ["handshake"],
|
|
u: "1f91d",
|
|
v: [
|
|
"1f91d-1f3fb",
|
|
"1f91d-1f3fc",
|
|
"1f91d-1f3fd",
|
|
"1f91d-1f3fe",
|
|
"1f91d-1f3ff",
|
|
"1faf1-1f3fb-200d-1faf2-1f3fc",
|
|
"1faf1-1f3fb-200d-1faf2-1f3fd",
|
|
"1faf1-1f3fb-200d-1faf2-1f3fe",
|
|
"1faf1-1f3fb-200d-1faf2-1f3ff",
|
|
"1faf1-1f3fc-200d-1faf2-1f3fb",
|
|
"1faf1-1f3fc-200d-1faf2-1f3fd",
|
|
"1faf1-1f3fc-200d-1faf2-1f3fe",
|
|
"1faf1-1f3fc-200d-1faf2-1f3ff",
|
|
"1faf1-1f3fd-200d-1faf2-1f3fb",
|
|
"1faf1-1f3fd-200d-1faf2-1f3fc",
|
|
"1faf1-1f3fd-200d-1faf2-1f3fe",
|
|
"1faf1-1f3fd-200d-1faf2-1f3ff",
|
|
"1faf1-1f3fe-200d-1faf2-1f3fb",
|
|
"1faf1-1f3fe-200d-1faf2-1f3fc",
|
|
"1faf1-1f3fe-200d-1faf2-1f3fd",
|
|
"1faf1-1f3fe-200d-1faf2-1f3ff",
|
|
"1faf1-1f3ff-200d-1faf2-1f3fb",
|
|
"1faf1-1f3ff-200d-1faf2-1f3fc",
|
|
"1faf1-1f3ff-200d-1faf2-1f3fd",
|
|
"1faf1-1f3ff-200d-1faf2-1f3fe"
|
|
]
|
|
},
|
|
{
|
|
n: ["pray", "person with folded hands"],
|
|
u: "1f64f",
|
|
v: [
|
|
"1f64f-1f3fb",
|
|
"1f64f-1f3fc",
|
|
"1f64f-1f3fd",
|
|
"1f64f-1f3fe",
|
|
"1f64f-1f3ff"
|
|
]
|
|
},
|
|
{
|
|
n: ["writing hand"],
|
|
u: "270d-fe0f",
|
|
v: ["270d-1f3fb", "270d-1f3fc", "270d-1f3fd", "270d-1f3fe", "270d-1f3ff"]
|
|
},
|
|
{
|
|
n: ["nail care", "nail polish"],
|
|
u: "1f485",
|
|
v: [
|
|
"1f485-1f3fb",
|
|
"1f485-1f3fc",
|
|
"1f485-1f3fd",
|
|
"1f485-1f3fe",
|
|
"1f485-1f3ff"
|
|
]
|
|
},
|
|
{
|
|
n: ["selfie"],
|
|
u: "1f933",
|
|
v: [
|
|
"1f933-1f3fb",
|
|
"1f933-1f3fc",
|
|
"1f933-1f3fd",
|
|
"1f933-1f3fe",
|
|
"1f933-1f3ff"
|
|
]
|
|
},
|
|
{
|
|
n: ["muscle", "flexed biceps"],
|
|
u: "1f4aa",
|
|
v: [
|
|
"1f4aa-1f3fb",
|
|
"1f4aa-1f3fc",
|
|
"1f4aa-1f3fd",
|
|
"1f4aa-1f3fe",
|
|
"1f4aa-1f3ff"
|
|
]
|
|
},
|
|
{ n: ["mechanical arm"], u: "1f9be" },
|
|
{ n: ["mechanical leg"], u: "1f9bf" },
|
|
{
|
|
n: ["leg"],
|
|
u: "1f9b5",
|
|
v: [
|
|
"1f9b5-1f3fb",
|
|
"1f9b5-1f3fc",
|
|
"1f9b5-1f3fd",
|
|
"1f9b5-1f3fe",
|
|
"1f9b5-1f3ff"
|
|
]
|
|
},
|
|
{
|
|
n: ["foot"],
|
|
u: "1f9b6",
|
|
v: [
|
|
"1f9b6-1f3fb",
|
|
"1f9b6-1f3fc",
|
|
"1f9b6-1f3fd",
|
|
"1f9b6-1f3fe",
|
|
"1f9b6-1f3ff"
|
|
]
|
|
},
|
|
{
|
|
n: ["ear"],
|
|
u: "1f442",
|
|
v: [
|
|
"1f442-1f3fb",
|
|
"1f442-1f3fc",
|
|
"1f442-1f3fd",
|
|
"1f442-1f3fe",
|
|
"1f442-1f3ff"
|
|
]
|
|
},
|
|
{
|
|
n: ["ear with hearing aid"],
|
|
u: "1f9bb",
|
|
v: [
|
|
"1f9bb-1f3fb",
|
|
"1f9bb-1f3fc",
|
|
"1f9bb-1f3fd",
|
|
"1f9bb-1f3fe",
|
|
"1f9bb-1f3ff"
|
|
]
|
|
},
|
|
{
|
|
n: ["nose"],
|
|
u: "1f443",
|
|
v: [
|
|
"1f443-1f3fb",
|
|
"1f443-1f3fc",
|
|
"1f443-1f3fd",
|
|
"1f443-1f3fe",
|
|
"1f443-1f3ff"
|
|
]
|
|
},
|
|
{ n: ["brain"], u: "1f9e0" },
|
|
{ n: ["anatomical heart"], u: "1fac0" },
|
|
{ n: ["lungs"], u: "1fac1" },
|
|
{ n: ["tooth"], u: "1f9b7" },
|
|
{ n: ["bone"], u: "1f9b4" },
|
|
{ n: ["eyes"], u: "1f440" },
|
|
{ n: ["eye"], u: "1f441-fe0f" },
|
|
{ n: ["tongue"], u: "1f445" },
|
|
{ n: ["lips", "mouth"], u: "1f444" },
|
|
{ n: ["biting lip"], u: "1fae6" },
|
|
{
|
|
n: ["baby"],
|
|
u: "1f476",
|
|
v: [
|
|
"1f476-1f3fb",
|
|
"1f476-1f3fc",
|
|
"1f476-1f3fd",
|
|
"1f476-1f3fe",
|
|
"1f476-1f3ff"
|
|
]
|
|
},
|
|
{
|
|
n: ["child"],
|
|
u: "1f9d2",
|
|
v: [
|
|
"1f9d2-1f3fb",
|
|
"1f9d2-1f3fc",
|
|
"1f9d2-1f3fd",
|
|
"1f9d2-1f3fe",
|
|
"1f9d2-1f3ff"
|
|
]
|
|
},
|
|
{
|
|
n: ["boy"],
|
|
u: "1f466",
|
|
v: [
|
|
"1f466-1f3fb",
|
|
"1f466-1f3fc",
|
|
"1f466-1f3fd",
|
|
"1f466-1f3fe",
|
|
"1f466-1f3ff"
|
|
]
|
|
},
|
|
{
|
|
n: ["girl"],
|
|
u: "1f467",
|
|
v: [
|
|
"1f467-1f3fb",
|
|
"1f467-1f3fc",
|
|
"1f467-1f3fd",
|
|
"1f467-1f3fe",
|
|
"1f467-1f3ff"
|
|
]
|
|
},
|
|
{
|
|
n: ["adult"],
|
|
u: "1f9d1",
|
|
v: [
|
|
"1f9d1-1f3fb",
|
|
"1f9d1-1f3fc",
|
|
"1f9d1-1f3fd",
|
|
"1f9d1-1f3fe",
|
|
"1f9d1-1f3ff"
|
|
]
|
|
},
|
|
{
|
|
n: ["person with blond hair"],
|
|
u: "1f471",
|
|
v: [
|
|
"1f471-1f3fb",
|
|
"1f471-1f3fc",
|
|
"1f471-1f3fd",
|
|
"1f471-1f3fe",
|
|
"1f471-1f3ff"
|
|
]
|
|
},
|
|
{
|
|
n: ["man"],
|
|
u: "1f468",
|
|
v: [
|
|
"1f468-1f3fb",
|
|
"1f468-1f3fc",
|
|
"1f468-1f3fd",
|
|
"1f468-1f3fe",
|
|
"1f468-1f3ff"
|
|
]
|
|
},
|
|
{
|
|
n: ["bearded person"],
|
|
u: "1f9d4",
|
|
v: [
|
|
"1f9d4-1f3fb",
|
|
"1f9d4-1f3fc",
|
|
"1f9d4-1f3fd",
|
|
"1f9d4-1f3fe",
|
|
"1f9d4-1f3ff"
|
|
]
|
|
},
|
|
{
|
|
n: ["man: beard", "man with beard"],
|
|
u: "1f9d4-200d-2642-fe0f",
|
|
v: [
|
|
"1f9d4-1f3fb-200d-2642-fe0f",
|
|
"1f9d4-1f3fc-200d-2642-fe0f",
|
|
"1f9d4-1f3fd-200d-2642-fe0f",
|
|
"1f9d4-1f3fe-200d-2642-fe0f",
|
|
"1f9d4-1f3ff-200d-2642-fe0f"
|
|
]
|
|
},
|
|
{
|
|
n: ["woman: beard", "woman with beard"],
|
|
u: "1f9d4-200d-2640-fe0f",
|
|
v: [
|
|
"1f9d4-1f3fb-200d-2640-fe0f",
|
|
"1f9d4-1f3fc-200d-2640-fe0f",
|
|
"1f9d4-1f3fd-200d-2640-fe0f",
|
|
"1f9d4-1f3fe-200d-2640-fe0f",
|
|
"1f9d4-1f3ff-200d-2640-fe0f"
|
|
]
|
|
},
|
|
{
|
|
n: ["man: red hair", "red haired man"],
|
|
u: "1f468-200d-1f9b0",
|
|
v: [
|
|
"1f468-1f3fb-200d-1f9b0",
|
|
"1f468-1f3fc-200d-1f9b0",
|
|
"1f468-1f3fd-200d-1f9b0",
|
|
"1f468-1f3fe-200d-1f9b0",
|
|
"1f468-1f3ff-200d-1f9b0"
|
|
]
|
|
},
|
|
{
|
|
n: ["man: curly hair", "curly haired man"],
|
|
u: "1f468-200d-1f9b1",
|
|
v: [
|
|
"1f468-1f3fb-200d-1f9b1",
|
|
"1f468-1f3fc-200d-1f9b1",
|
|
"1f468-1f3fd-200d-1f9b1",
|
|
"1f468-1f3fe-200d-1f9b1",
|
|
"1f468-1f3ff-200d-1f9b1"
|
|
]
|
|
},
|
|
{
|
|
n: ["man: white hair", "white haired man"],
|
|
u: "1f468-200d-1f9b3",
|
|
v: [
|
|
"1f468-1f3fb-200d-1f9b3",
|
|
"1f468-1f3fc-200d-1f9b3",
|
|
"1f468-1f3fd-200d-1f9b3",
|
|
"1f468-1f3fe-200d-1f9b3",
|
|
"1f468-1f3ff-200d-1f9b3"
|
|
]
|
|
},
|
|
{
|
|
n: ["bald man", "man: bald"],
|
|
u: "1f468-200d-1f9b2",
|
|
v: [
|
|
"1f468-1f3fb-200d-1f9b2",
|
|
"1f468-1f3fc-200d-1f9b2",
|
|
"1f468-1f3fd-200d-1f9b2",
|
|
"1f468-1f3fe-200d-1f9b2",
|
|
"1f468-1f3ff-200d-1f9b2"
|
|
]
|
|
},
|
|
{
|
|
n: ["woman"],
|
|
u: "1f469",
|
|
v: [
|
|
"1f469-1f3fb",
|
|
"1f469-1f3fc",
|
|
"1f469-1f3fd",
|
|
"1f469-1f3fe",
|
|
"1f469-1f3ff"
|
|
]
|
|
},
|
|
{
|
|
n: ["woman: red hair", "red haired woman"],
|
|
u: "1f469-200d-1f9b0",
|
|
v: [
|
|
"1f469-1f3fb-200d-1f9b0",
|
|
"1f469-1f3fc-200d-1f9b0",
|
|
"1f469-1f3fd-200d-1f9b0",
|
|
"1f469-1f3fe-200d-1f9b0",
|
|
"1f469-1f3ff-200d-1f9b0"
|
|
]
|
|
},
|
|
{
|
|
n: ["person: red hair", "red haired person"],
|
|
u: "1f9d1-200d-1f9b0",
|
|
v: [
|
|
"1f9d1-1f3fb-200d-1f9b0",
|
|
"1f9d1-1f3fc-200d-1f9b0",
|
|
"1f9d1-1f3fd-200d-1f9b0",
|
|
"1f9d1-1f3fe-200d-1f9b0",
|
|
"1f9d1-1f3ff-200d-1f9b0"
|
|
]
|
|
},
|
|
{
|
|
n: ["woman: curly hair", "curly haired woman"],
|
|
u: "1f469-200d-1f9b1",
|
|
v: [
|
|
"1f469-1f3fb-200d-1f9b1",
|
|
"1f469-1f3fc-200d-1f9b1",
|
|
"1f469-1f3fd-200d-1f9b1",
|
|
"1f469-1f3fe-200d-1f9b1",
|
|
"1f469-1f3ff-200d-1f9b1"
|
|
]
|
|
},
|
|
{
|
|
n: ["person: curly hair", "curly haired person"],
|
|
u: "1f9d1-200d-1f9b1",
|
|
v: [
|
|
"1f9d1-1f3fb-200d-1f9b1",
|
|
"1f9d1-1f3fc-200d-1f9b1",
|
|
"1f9d1-1f3fd-200d-1f9b1",
|
|
"1f9d1-1f3fe-200d-1f9b1",
|
|
"1f9d1-1f3ff-200d-1f9b1"
|
|
]
|
|
},
|
|
{
|
|
n: ["woman: white hair", "white haired woman"],
|
|
u: "1f469-200d-1f9b3",
|
|
v: [
|
|
"1f469-1f3fb-200d-1f9b3",
|
|
"1f469-1f3fc-200d-1f9b3",
|
|
"1f469-1f3fd-200d-1f9b3",
|
|
"1f469-1f3fe-200d-1f9b3",
|
|
"1f469-1f3ff-200d-1f9b3"
|
|
]
|
|
},
|
|
{
|
|
n: ["person: white hair", "white haired person"],
|
|
u: "1f9d1-200d-1f9b3",
|
|
v: [
|
|
"1f9d1-1f3fb-200d-1f9b3",
|
|
"1f9d1-1f3fc-200d-1f9b3",
|
|
"1f9d1-1f3fd-200d-1f9b3",
|
|
"1f9d1-1f3fe-200d-1f9b3",
|
|
"1f9d1-1f3ff-200d-1f9b3"
|
|
]
|
|
},
|
|
{
|
|
n: ["bald woman", "woman: bald"],
|
|
u: "1f469-200d-1f9b2",
|
|
v: [
|
|
"1f469-1f3fb-200d-1f9b2",
|
|
"1f469-1f3fc-200d-1f9b2",
|
|
"1f469-1f3fd-200d-1f9b2",
|
|
"1f469-1f3fe-200d-1f9b2",
|
|
"1f469-1f3ff-200d-1f9b2"
|
|
]
|
|
},
|
|
{
|
|
n: ["bald person", "person: bald"],
|
|
u: "1f9d1-200d-1f9b2",
|
|
v: [
|
|
"1f9d1-1f3fb-200d-1f9b2",
|
|
"1f9d1-1f3fc-200d-1f9b2",
|
|
"1f9d1-1f3fd-200d-1f9b2",
|
|
"1f9d1-1f3fe-200d-1f9b2",
|
|
"1f9d1-1f3ff-200d-1f9b2"
|
|
]
|
|
},
|
|
{
|
|
n: ["woman: blond hair", "blond-haired-woman"],
|
|
u: "1f471-200d-2640-fe0f",
|
|
v: [
|
|
"1f471-1f3fb-200d-2640-fe0f",
|
|
"1f471-1f3fc-200d-2640-fe0f",
|
|
"1f471-1f3fd-200d-2640-fe0f",
|
|
"1f471-1f3fe-200d-2640-fe0f",
|
|
"1f471-1f3ff-200d-2640-fe0f"
|
|
]
|
|
},
|
|
{
|
|
n: ["man: blond hair", "blond-haired-man"],
|
|
u: "1f471-200d-2642-fe0f",
|
|
v: [
|
|
"1f471-1f3fb-200d-2642-fe0f",
|
|
"1f471-1f3fc-200d-2642-fe0f",
|
|
"1f471-1f3fd-200d-2642-fe0f",
|
|
"1f471-1f3fe-200d-2642-fe0f",
|
|
"1f471-1f3ff-200d-2642-fe0f"
|
|
]
|
|
},
|
|
{
|
|
n: ["older adult"],
|
|
u: "1f9d3",
|
|
v: [
|
|
"1f9d3-1f3fb",
|
|
"1f9d3-1f3fc",
|
|
"1f9d3-1f3fd",
|
|
"1f9d3-1f3fe",
|
|
"1f9d3-1f3ff"
|
|
]
|
|
},
|
|
{
|
|
n: ["older man"],
|
|
u: "1f474",
|
|
v: [
|
|
"1f474-1f3fb",
|
|
"1f474-1f3fc",
|
|
"1f474-1f3fd",
|
|
"1f474-1f3fe",
|
|
"1f474-1f3ff"
|
|
]
|
|
},
|
|
{
|
|
n: ["older woman"],
|
|
u: "1f475",
|
|
v: [
|
|
"1f475-1f3fb",
|
|
"1f475-1f3fc",
|
|
"1f475-1f3fd",
|
|
"1f475-1f3fe",
|
|
"1f475-1f3ff"
|
|
]
|
|
},
|
|
{
|
|
n: ["person frowning"],
|
|
u: "1f64d",
|
|
v: [
|
|
"1f64d-1f3fb",
|
|
"1f64d-1f3fc",
|
|
"1f64d-1f3fd",
|
|
"1f64d-1f3fe",
|
|
"1f64d-1f3ff"
|
|
]
|
|
},
|
|
{
|
|
n: ["man frowning", "man-frowning"],
|
|
u: "1f64d-200d-2642-fe0f",
|
|
v: [
|
|
"1f64d-1f3fb-200d-2642-fe0f",
|
|
"1f64d-1f3fc-200d-2642-fe0f",
|
|
"1f64d-1f3fd-200d-2642-fe0f",
|
|
"1f64d-1f3fe-200d-2642-fe0f",
|
|
"1f64d-1f3ff-200d-2642-fe0f"
|
|
]
|
|
},
|
|
{
|
|
n: ["woman frowning", "woman-frowning"],
|
|
u: "1f64d-200d-2640-fe0f",
|
|
v: [
|
|
"1f64d-1f3fb-200d-2640-fe0f",
|
|
"1f64d-1f3fc-200d-2640-fe0f",
|
|
"1f64d-1f3fd-200d-2640-fe0f",
|
|
"1f64d-1f3fe-200d-2640-fe0f",
|
|
"1f64d-1f3ff-200d-2640-fe0f"
|
|
]
|
|
},
|
|
{
|
|
n: ["person with pouting face"],
|
|
u: "1f64e",
|
|
v: [
|
|
"1f64e-1f3fb",
|
|
"1f64e-1f3fc",
|
|
"1f64e-1f3fd",
|
|
"1f64e-1f3fe",
|
|
"1f64e-1f3ff"
|
|
]
|
|
},
|
|
{
|
|
n: ["man pouting", "man-pouting"],
|
|
u: "1f64e-200d-2642-fe0f",
|
|
v: [
|
|
"1f64e-1f3fb-200d-2642-fe0f",
|
|
"1f64e-1f3fc-200d-2642-fe0f",
|
|
"1f64e-1f3fd-200d-2642-fe0f",
|
|
"1f64e-1f3fe-200d-2642-fe0f",
|
|
"1f64e-1f3ff-200d-2642-fe0f"
|
|
]
|
|
},
|
|
{
|
|
n: ["woman pouting", "woman-pouting"],
|
|
u: "1f64e-200d-2640-fe0f",
|
|
v: [
|
|
"1f64e-1f3fb-200d-2640-fe0f",
|
|
"1f64e-1f3fc-200d-2640-fe0f",
|
|
"1f64e-1f3fd-200d-2640-fe0f",
|
|
"1f64e-1f3fe-200d-2640-fe0f",
|
|
"1f64e-1f3ff-200d-2640-fe0f"
|
|
]
|
|
},
|
|
{
|
|
n: ["no good", "face with no good gesture"],
|
|
u: "1f645",
|
|
v: [
|
|
"1f645-1f3fb",
|
|
"1f645-1f3fc",
|
|
"1f645-1f3fd",
|
|
"1f645-1f3fe",
|
|
"1f645-1f3ff"
|
|
]
|
|
},
|
|
{
|
|
n: ["man gesturing no", "man-gesturing-no"],
|
|
u: "1f645-200d-2642-fe0f",
|
|
v: [
|
|
"1f645-1f3fb-200d-2642-fe0f",
|
|
"1f645-1f3fc-200d-2642-fe0f",
|
|
"1f645-1f3fd-200d-2642-fe0f",
|
|
"1f645-1f3fe-200d-2642-fe0f",
|
|
"1f645-1f3ff-200d-2642-fe0f"
|
|
]
|
|
},
|
|
{
|
|
n: ["woman gesturing no", "woman-gesturing-no"],
|
|
u: "1f645-200d-2640-fe0f",
|
|
v: [
|
|
"1f645-1f3fb-200d-2640-fe0f",
|
|
"1f645-1f3fc-200d-2640-fe0f",
|
|
"1f645-1f3fd-200d-2640-fe0f",
|
|
"1f645-1f3fe-200d-2640-fe0f",
|
|
"1f645-1f3ff-200d-2640-fe0f"
|
|
]
|
|
},
|
|
{
|
|
n: ["ok woman", "face with ok gesture"],
|
|
u: "1f646",
|
|
v: [
|
|
"1f646-1f3fb",
|
|
"1f646-1f3fc",
|
|
"1f646-1f3fd",
|
|
"1f646-1f3fe",
|
|
"1f646-1f3ff"
|
|
]
|
|
},
|
|
{
|
|
n: ["man gesturing ok", "man-gesturing-ok"],
|
|
u: "1f646-200d-2642-fe0f",
|
|
v: [
|
|
"1f646-1f3fb-200d-2642-fe0f",
|
|
"1f646-1f3fc-200d-2642-fe0f",
|
|
"1f646-1f3fd-200d-2642-fe0f",
|
|
"1f646-1f3fe-200d-2642-fe0f",
|
|
"1f646-1f3ff-200d-2642-fe0f"
|
|
]
|
|
},
|
|
{
|
|
n: ["woman gesturing ok", "woman-gesturing-ok"],
|
|
u: "1f646-200d-2640-fe0f",
|
|
v: [
|
|
"1f646-1f3fb-200d-2640-fe0f",
|
|
"1f646-1f3fc-200d-2640-fe0f",
|
|
"1f646-1f3fd-200d-2640-fe0f",
|
|
"1f646-1f3fe-200d-2640-fe0f",
|
|
"1f646-1f3ff-200d-2640-fe0f"
|
|
]
|
|
},
|
|
{
|
|
n: ["information desk person"],
|
|
u: "1f481",
|
|
v: [
|
|
"1f481-1f3fb",
|
|
"1f481-1f3fc",
|
|
"1f481-1f3fd",
|
|
"1f481-1f3fe",
|
|
"1f481-1f3ff"
|
|
]
|
|
},
|
|
{
|
|
n: ["man tipping hand", "man-tipping-hand"],
|
|
u: "1f481-200d-2642-fe0f",
|
|
v: [
|
|
"1f481-1f3fb-200d-2642-fe0f",
|
|
"1f481-1f3fc-200d-2642-fe0f",
|
|
"1f481-1f3fd-200d-2642-fe0f",
|
|
"1f481-1f3fe-200d-2642-fe0f",
|
|
"1f481-1f3ff-200d-2642-fe0f"
|
|
]
|
|
},
|
|
{
|
|
n: ["woman tipping hand", "woman-tipping-hand"],
|
|
u: "1f481-200d-2640-fe0f",
|
|
v: [
|
|
"1f481-1f3fb-200d-2640-fe0f",
|
|
"1f481-1f3fc-200d-2640-fe0f",
|
|
"1f481-1f3fd-200d-2640-fe0f",
|
|
"1f481-1f3fe-200d-2640-fe0f",
|
|
"1f481-1f3ff-200d-2640-fe0f"
|
|
]
|
|
},
|
|
{
|
|
n: ["raising hand", "happy person raising one hand"],
|
|
u: "1f64b",
|
|
v: [
|
|
"1f64b-1f3fb",
|
|
"1f64b-1f3fc",
|
|
"1f64b-1f3fd",
|
|
"1f64b-1f3fe",
|
|
"1f64b-1f3ff"
|
|
]
|
|
},
|
|
{
|
|
n: ["man raising hand", "man-raising-hand"],
|
|
u: "1f64b-200d-2642-fe0f",
|
|
v: [
|
|
"1f64b-1f3fb-200d-2642-fe0f",
|
|
"1f64b-1f3fc-200d-2642-fe0f",
|
|
"1f64b-1f3fd-200d-2642-fe0f",
|
|
"1f64b-1f3fe-200d-2642-fe0f",
|
|
"1f64b-1f3ff-200d-2642-fe0f"
|
|
]
|
|
},
|
|
{
|
|
n: ["woman raising hand", "woman-raising-hand"],
|
|
u: "1f64b-200d-2640-fe0f",
|
|
v: [
|
|
"1f64b-1f3fb-200d-2640-fe0f",
|
|
"1f64b-1f3fc-200d-2640-fe0f",
|
|
"1f64b-1f3fd-200d-2640-fe0f",
|
|
"1f64b-1f3fe-200d-2640-fe0f",
|
|
"1f64b-1f3ff-200d-2640-fe0f"
|
|
]
|
|
},
|
|
{
|
|
n: ["deaf person"],
|
|
u: "1f9cf",
|
|
v: [
|
|
"1f9cf-1f3fb",
|
|
"1f9cf-1f3fc",
|
|
"1f9cf-1f3fd",
|
|
"1f9cf-1f3fe",
|
|
"1f9cf-1f3ff"
|
|
]
|
|
},
|
|
{
|
|
n: ["deaf man"],
|
|
u: "1f9cf-200d-2642-fe0f",
|
|
v: [
|
|
"1f9cf-1f3fb-200d-2642-fe0f",
|
|
"1f9cf-1f3fc-200d-2642-fe0f",
|
|
"1f9cf-1f3fd-200d-2642-fe0f",
|
|
"1f9cf-1f3fe-200d-2642-fe0f",
|
|
"1f9cf-1f3ff-200d-2642-fe0f"
|
|
]
|
|
},
|
|
{
|
|
n: ["deaf woman"],
|
|
u: "1f9cf-200d-2640-fe0f",
|
|
v: [
|
|
"1f9cf-1f3fb-200d-2640-fe0f",
|
|
"1f9cf-1f3fc-200d-2640-fe0f",
|
|
"1f9cf-1f3fd-200d-2640-fe0f",
|
|
"1f9cf-1f3fe-200d-2640-fe0f",
|
|
"1f9cf-1f3ff-200d-2640-fe0f"
|
|
]
|
|
},
|
|
{
|
|
n: ["bow", "person bowing deeply"],
|
|
u: "1f647",
|
|
v: [
|
|
"1f647-1f3fb",
|
|
"1f647-1f3fc",
|
|
"1f647-1f3fd",
|
|
"1f647-1f3fe",
|
|
"1f647-1f3ff"
|
|
]
|
|
},
|
|
{
|
|
n: ["man bowing", "man-bowing"],
|
|
u: "1f647-200d-2642-fe0f",
|
|
v: [
|
|
"1f647-1f3fb-200d-2642-fe0f",
|
|
"1f647-1f3fc-200d-2642-fe0f",
|
|
"1f647-1f3fd-200d-2642-fe0f",
|
|
"1f647-1f3fe-200d-2642-fe0f",
|
|
"1f647-1f3ff-200d-2642-fe0f"
|
|
]
|
|
},
|
|
{
|
|
n: ["woman bowing", "woman-bowing"],
|
|
u: "1f647-200d-2640-fe0f",
|
|
v: [
|
|
"1f647-1f3fb-200d-2640-fe0f",
|
|
"1f647-1f3fc-200d-2640-fe0f",
|
|
"1f647-1f3fd-200d-2640-fe0f",
|
|
"1f647-1f3fe-200d-2640-fe0f",
|
|
"1f647-1f3ff-200d-2640-fe0f"
|
|
]
|
|
},
|
|
{
|
|
n: ["face palm"],
|
|
u: "1f926",
|
|
v: [
|
|
"1f926-1f3fb",
|
|
"1f926-1f3fc",
|
|
"1f926-1f3fd",
|
|
"1f926-1f3fe",
|
|
"1f926-1f3ff"
|
|
]
|
|
},
|
|
{
|
|
n: ["man facepalming", "man-facepalming"],
|
|
u: "1f926-200d-2642-fe0f",
|
|
v: [
|
|
"1f926-1f3fb-200d-2642-fe0f",
|
|
"1f926-1f3fc-200d-2642-fe0f",
|
|
"1f926-1f3fd-200d-2642-fe0f",
|
|
"1f926-1f3fe-200d-2642-fe0f",
|
|
"1f926-1f3ff-200d-2642-fe0f"
|
|
]
|
|
},
|
|
{
|
|
n: ["woman facepalming", "woman-facepalming"],
|
|
u: "1f926-200d-2640-fe0f",
|
|
v: [
|
|
"1f926-1f3fb-200d-2640-fe0f",
|
|
"1f926-1f3fc-200d-2640-fe0f",
|
|
"1f926-1f3fd-200d-2640-fe0f",
|
|
"1f926-1f3fe-200d-2640-fe0f",
|
|
"1f926-1f3ff-200d-2640-fe0f"
|
|
]
|
|
},
|
|
{
|
|
n: ["shrug"],
|
|
u: "1f937",
|
|
v: [
|
|
"1f937-1f3fb",
|
|
"1f937-1f3fc",
|
|
"1f937-1f3fd",
|
|
"1f937-1f3fe",
|
|
"1f937-1f3ff"
|
|
]
|
|
},
|
|
{
|
|
n: ["man shrugging", "man-shrugging"],
|
|
u: "1f937-200d-2642-fe0f",
|
|
v: [
|
|
"1f937-1f3fb-200d-2642-fe0f",
|
|
"1f937-1f3fc-200d-2642-fe0f",
|
|
"1f937-1f3fd-200d-2642-fe0f",
|
|
"1f937-1f3fe-200d-2642-fe0f",
|
|
"1f937-1f3ff-200d-2642-fe0f"
|
|
]
|
|
},
|
|
{
|
|
n: ["woman shrugging", "woman-shrugging"],
|
|
u: "1f937-200d-2640-fe0f",
|
|
v: [
|
|
"1f937-1f3fb-200d-2640-fe0f",
|
|
"1f937-1f3fc-200d-2640-fe0f",
|
|
"1f937-1f3fd-200d-2640-fe0f",
|
|
"1f937-1f3fe-200d-2640-fe0f",
|
|
"1f937-1f3ff-200d-2640-fe0f"
|
|
]
|
|
},
|
|
{
|
|
n: ["health worker"],
|
|
u: "1f9d1-200d-2695-fe0f",
|
|
v: [
|
|
"1f9d1-1f3fb-200d-2695-fe0f",
|
|
"1f9d1-1f3fc-200d-2695-fe0f",
|
|
"1f9d1-1f3fd-200d-2695-fe0f",
|
|
"1f9d1-1f3fe-200d-2695-fe0f",
|
|
"1f9d1-1f3ff-200d-2695-fe0f"
|
|
]
|
|
},
|
|
{
|
|
n: ["male-doctor", "man health worker"],
|
|
u: "1f468-200d-2695-fe0f",
|
|
v: [
|
|
"1f468-1f3fb-200d-2695-fe0f",
|
|
"1f468-1f3fc-200d-2695-fe0f",
|
|
"1f468-1f3fd-200d-2695-fe0f",
|
|
"1f468-1f3fe-200d-2695-fe0f",
|
|
"1f468-1f3ff-200d-2695-fe0f"
|
|
]
|
|
},
|
|
{
|
|
n: ["female-doctor", "woman health worker"],
|
|
u: "1f469-200d-2695-fe0f",
|
|
v: [
|
|
"1f469-1f3fb-200d-2695-fe0f",
|
|
"1f469-1f3fc-200d-2695-fe0f",
|
|
"1f469-1f3fd-200d-2695-fe0f",
|
|
"1f469-1f3fe-200d-2695-fe0f",
|
|
"1f469-1f3ff-200d-2695-fe0f"
|
|
]
|
|
},
|
|
{
|
|
n: ["student"],
|
|
u: "1f9d1-200d-1f393",
|
|
v: [
|
|
"1f9d1-1f3fb-200d-1f393",
|
|
"1f9d1-1f3fc-200d-1f393",
|
|
"1f9d1-1f3fd-200d-1f393",
|
|
"1f9d1-1f3fe-200d-1f393",
|
|
"1f9d1-1f3ff-200d-1f393"
|
|
]
|
|
},
|
|
{
|
|
n: ["man student", "male-student"],
|
|
u: "1f468-200d-1f393",
|
|
v: [
|
|
"1f468-1f3fb-200d-1f393",
|
|
"1f468-1f3fc-200d-1f393",
|
|
"1f468-1f3fd-200d-1f393",
|
|
"1f468-1f3fe-200d-1f393",
|
|
"1f468-1f3ff-200d-1f393"
|
|
]
|
|
},
|
|
{
|
|
n: ["woman student", "female-student"],
|
|
u: "1f469-200d-1f393",
|
|
v: [
|
|
"1f469-1f3fb-200d-1f393",
|
|
"1f469-1f3fc-200d-1f393",
|
|
"1f469-1f3fd-200d-1f393",
|
|
"1f469-1f3fe-200d-1f393",
|
|
"1f469-1f3ff-200d-1f393"
|
|
]
|
|
},
|
|
{
|
|
n: ["teacher"],
|
|
u: "1f9d1-200d-1f3eb",
|
|
v: [
|
|
"1f9d1-1f3fb-200d-1f3eb",
|
|
"1f9d1-1f3fc-200d-1f3eb",
|
|
"1f9d1-1f3fd-200d-1f3eb",
|
|
"1f9d1-1f3fe-200d-1f3eb",
|
|
"1f9d1-1f3ff-200d-1f3eb"
|
|
]
|
|
},
|
|
{
|
|
n: ["man teacher", "male-teacher"],
|
|
u: "1f468-200d-1f3eb",
|
|
v: [
|
|
"1f468-1f3fb-200d-1f3eb",
|
|
"1f468-1f3fc-200d-1f3eb",
|
|
"1f468-1f3fd-200d-1f3eb",
|
|
"1f468-1f3fe-200d-1f3eb",
|
|
"1f468-1f3ff-200d-1f3eb"
|
|
]
|
|
},
|
|
{
|
|
n: ["woman teacher", "female-teacher"],
|
|
u: "1f469-200d-1f3eb",
|
|
v: [
|
|
"1f469-1f3fb-200d-1f3eb",
|
|
"1f469-1f3fc-200d-1f3eb",
|
|
"1f469-1f3fd-200d-1f3eb",
|
|
"1f469-1f3fe-200d-1f3eb",
|
|
"1f469-1f3ff-200d-1f3eb"
|
|
]
|
|
},
|
|
{
|
|
n: ["judge"],
|
|
u: "1f9d1-200d-2696-fe0f",
|
|
v: [
|
|
"1f9d1-1f3fb-200d-2696-fe0f",
|
|
"1f9d1-1f3fc-200d-2696-fe0f",
|
|
"1f9d1-1f3fd-200d-2696-fe0f",
|
|
"1f9d1-1f3fe-200d-2696-fe0f",
|
|
"1f9d1-1f3ff-200d-2696-fe0f"
|
|
]
|
|
},
|
|
{
|
|
n: ["man judge", "male-judge"],
|
|
u: "1f468-200d-2696-fe0f",
|
|
v: [
|
|
"1f468-1f3fb-200d-2696-fe0f",
|
|
"1f468-1f3fc-200d-2696-fe0f",
|
|
"1f468-1f3fd-200d-2696-fe0f",
|
|
"1f468-1f3fe-200d-2696-fe0f",
|
|
"1f468-1f3ff-200d-2696-fe0f"
|
|
]
|
|
},
|
|
{
|
|
n: ["woman judge", "female-judge"],
|
|
u: "1f469-200d-2696-fe0f",
|
|
v: [
|
|
"1f469-1f3fb-200d-2696-fe0f",
|
|
"1f469-1f3fc-200d-2696-fe0f",
|
|
"1f469-1f3fd-200d-2696-fe0f",
|
|
"1f469-1f3fe-200d-2696-fe0f",
|
|
"1f469-1f3ff-200d-2696-fe0f"
|
|
]
|
|
},
|
|
{
|
|
n: ["farmer"],
|
|
u: "1f9d1-200d-1f33e",
|
|
v: [
|
|
"1f9d1-1f3fb-200d-1f33e",
|
|
"1f9d1-1f3fc-200d-1f33e",
|
|
"1f9d1-1f3fd-200d-1f33e",
|
|
"1f9d1-1f3fe-200d-1f33e",
|
|
"1f9d1-1f3ff-200d-1f33e"
|
|
]
|
|
},
|
|
{
|
|
n: ["man farmer", "male-farmer"],
|
|
u: "1f468-200d-1f33e",
|
|
v: [
|
|
"1f468-1f3fb-200d-1f33e",
|
|
"1f468-1f3fc-200d-1f33e",
|
|
"1f468-1f3fd-200d-1f33e",
|
|
"1f468-1f3fe-200d-1f33e",
|
|
"1f468-1f3ff-200d-1f33e"
|
|
]
|
|
},
|
|
{
|
|
n: ["woman farmer", "female-farmer"],
|
|
u: "1f469-200d-1f33e",
|
|
v: [
|
|
"1f469-1f3fb-200d-1f33e",
|
|
"1f469-1f3fc-200d-1f33e",
|
|
"1f469-1f3fd-200d-1f33e",
|
|
"1f469-1f3fe-200d-1f33e",
|
|
"1f469-1f3ff-200d-1f33e"
|
|
]
|
|
},
|
|
{
|
|
n: ["cook"],
|
|
u: "1f9d1-200d-1f373",
|
|
v: [
|
|
"1f9d1-1f3fb-200d-1f373",
|
|
"1f9d1-1f3fc-200d-1f373",
|
|
"1f9d1-1f3fd-200d-1f373",
|
|
"1f9d1-1f3fe-200d-1f373",
|
|
"1f9d1-1f3ff-200d-1f373"
|
|
]
|
|
},
|
|
{
|
|
n: ["man cook", "male-cook"],
|
|
u: "1f468-200d-1f373",
|
|
v: [
|
|
"1f468-1f3fb-200d-1f373",
|
|
"1f468-1f3fc-200d-1f373",
|
|
"1f468-1f3fd-200d-1f373",
|
|
"1f468-1f3fe-200d-1f373",
|
|
"1f468-1f3ff-200d-1f373"
|
|
]
|
|
},
|
|
{
|
|
n: ["woman cook", "female-cook"],
|
|
u: "1f469-200d-1f373",
|
|
v: [
|
|
"1f469-1f3fb-200d-1f373",
|
|
"1f469-1f3fc-200d-1f373",
|
|
"1f469-1f3fd-200d-1f373",
|
|
"1f469-1f3fe-200d-1f373",
|
|
"1f469-1f3ff-200d-1f373"
|
|
]
|
|
},
|
|
{
|
|
n: ["mechanic"],
|
|
u: "1f9d1-200d-1f527",
|
|
v: [
|
|
"1f9d1-1f3fb-200d-1f527",
|
|
"1f9d1-1f3fc-200d-1f527",
|
|
"1f9d1-1f3fd-200d-1f527",
|
|
"1f9d1-1f3fe-200d-1f527",
|
|
"1f9d1-1f3ff-200d-1f527"
|
|
]
|
|
},
|
|
{
|
|
n: ["man mechanic", "male-mechanic"],
|
|
u: "1f468-200d-1f527",
|
|
v: [
|
|
"1f468-1f3fb-200d-1f527",
|
|
"1f468-1f3fc-200d-1f527",
|
|
"1f468-1f3fd-200d-1f527",
|
|
"1f468-1f3fe-200d-1f527",
|
|
"1f468-1f3ff-200d-1f527"
|
|
]
|
|
},
|
|
{
|
|
n: ["woman mechanic", "female-mechanic"],
|
|
u: "1f469-200d-1f527",
|
|
v: [
|
|
"1f469-1f3fb-200d-1f527",
|
|
"1f469-1f3fc-200d-1f527",
|
|
"1f469-1f3fd-200d-1f527",
|
|
"1f469-1f3fe-200d-1f527",
|
|
"1f469-1f3ff-200d-1f527"
|
|
]
|
|
},
|
|
{
|
|
n: ["factory worker"],
|
|
u: "1f9d1-200d-1f3ed",
|
|
v: [
|
|
"1f9d1-1f3fb-200d-1f3ed",
|
|
"1f9d1-1f3fc-200d-1f3ed",
|
|
"1f9d1-1f3fd-200d-1f3ed",
|
|
"1f9d1-1f3fe-200d-1f3ed",
|
|
"1f9d1-1f3ff-200d-1f3ed"
|
|
]
|
|
},
|
|
{
|
|
n: ["man factory worker", "male-factory-worker"],
|
|
u: "1f468-200d-1f3ed",
|
|
v: [
|
|
"1f468-1f3fb-200d-1f3ed",
|
|
"1f468-1f3fc-200d-1f3ed",
|
|
"1f468-1f3fd-200d-1f3ed",
|
|
"1f468-1f3fe-200d-1f3ed",
|
|
"1f468-1f3ff-200d-1f3ed"
|
|
]
|
|
},
|
|
{
|
|
n: ["woman factory worker", "female-factory-worker"],
|
|
u: "1f469-200d-1f3ed",
|
|
v: [
|
|
"1f469-1f3fb-200d-1f3ed",
|
|
"1f469-1f3fc-200d-1f3ed",
|
|
"1f469-1f3fd-200d-1f3ed",
|
|
"1f469-1f3fe-200d-1f3ed",
|
|
"1f469-1f3ff-200d-1f3ed"
|
|
]
|
|
},
|
|
{
|
|
n: ["office worker"],
|
|
u: "1f9d1-200d-1f4bc",
|
|
v: [
|
|
"1f9d1-1f3fb-200d-1f4bc",
|
|
"1f9d1-1f3fc-200d-1f4bc",
|
|
"1f9d1-1f3fd-200d-1f4bc",
|
|
"1f9d1-1f3fe-200d-1f4bc",
|
|
"1f9d1-1f3ff-200d-1f4bc"
|
|
]
|
|
},
|
|
{
|
|
n: ["man office worker", "male-office-worker"],
|
|
u: "1f468-200d-1f4bc",
|
|
v: [
|
|
"1f468-1f3fb-200d-1f4bc",
|
|
"1f468-1f3fc-200d-1f4bc",
|
|
"1f468-1f3fd-200d-1f4bc",
|
|
"1f468-1f3fe-200d-1f4bc",
|
|
"1f468-1f3ff-200d-1f4bc"
|
|
]
|
|
},
|
|
{
|
|
n: ["woman office worker", "female-office-worker"],
|
|
u: "1f469-200d-1f4bc",
|
|
v: [
|
|
"1f469-1f3fb-200d-1f4bc",
|
|
"1f469-1f3fc-200d-1f4bc",
|
|
"1f469-1f3fd-200d-1f4bc",
|
|
"1f469-1f3fe-200d-1f4bc",
|
|
"1f469-1f3ff-200d-1f4bc"
|
|
]
|
|
},
|
|
{
|
|
n: ["scientist"],
|
|
u: "1f9d1-200d-1f52c",
|
|
v: [
|
|
"1f9d1-1f3fb-200d-1f52c",
|
|
"1f9d1-1f3fc-200d-1f52c",
|
|
"1f9d1-1f3fd-200d-1f52c",
|
|
"1f9d1-1f3fe-200d-1f52c",
|
|
"1f9d1-1f3ff-200d-1f52c"
|
|
]
|
|
},
|
|
{
|
|
n: ["man scientist", "male-scientist"],
|
|
u: "1f468-200d-1f52c",
|
|
v: [
|
|
"1f468-1f3fb-200d-1f52c",
|
|
"1f468-1f3fc-200d-1f52c",
|
|
"1f468-1f3fd-200d-1f52c",
|
|
"1f468-1f3fe-200d-1f52c",
|
|
"1f468-1f3ff-200d-1f52c"
|
|
]
|
|
},
|
|
{
|
|
n: ["woman scientist", "female-scientist"],
|
|
u: "1f469-200d-1f52c",
|
|
v: [
|
|
"1f469-1f3fb-200d-1f52c",
|
|
"1f469-1f3fc-200d-1f52c",
|
|
"1f469-1f3fd-200d-1f52c",
|
|
"1f469-1f3fe-200d-1f52c",
|
|
"1f469-1f3ff-200d-1f52c"
|
|
]
|
|
},
|
|
{
|
|
n: ["technologist"],
|
|
u: "1f9d1-200d-1f4bb",
|
|
v: [
|
|
"1f9d1-1f3fb-200d-1f4bb",
|
|
"1f9d1-1f3fc-200d-1f4bb",
|
|
"1f9d1-1f3fd-200d-1f4bb",
|
|
"1f9d1-1f3fe-200d-1f4bb",
|
|
"1f9d1-1f3ff-200d-1f4bb"
|
|
]
|
|
},
|
|
{
|
|
n: ["man technologist", "male-technologist"],
|
|
u: "1f468-200d-1f4bb",
|
|
v: [
|
|
"1f468-1f3fb-200d-1f4bb",
|
|
"1f468-1f3fc-200d-1f4bb",
|
|
"1f468-1f3fd-200d-1f4bb",
|
|
"1f468-1f3fe-200d-1f4bb",
|
|
"1f468-1f3ff-200d-1f4bb"
|
|
]
|
|
},
|
|
{
|
|
n: ["woman technologist", "female-technologist"],
|
|
u: "1f469-200d-1f4bb",
|
|
v: [
|
|
"1f469-1f3fb-200d-1f4bb",
|
|
"1f469-1f3fc-200d-1f4bb",
|
|
"1f469-1f3fd-200d-1f4bb",
|
|
"1f469-1f3fe-200d-1f4bb",
|
|
"1f469-1f3ff-200d-1f4bb"
|
|
]
|
|
},
|
|
{
|
|
n: ["singer"],
|
|
u: "1f9d1-200d-1f3a4",
|
|
v: [
|
|
"1f9d1-1f3fb-200d-1f3a4",
|
|
"1f9d1-1f3fc-200d-1f3a4",
|
|
"1f9d1-1f3fd-200d-1f3a4",
|
|
"1f9d1-1f3fe-200d-1f3a4",
|
|
"1f9d1-1f3ff-200d-1f3a4"
|
|
]
|
|
},
|
|
{
|
|
n: ["man singer", "male-singer"],
|
|
u: "1f468-200d-1f3a4",
|
|
v: [
|
|
"1f468-1f3fb-200d-1f3a4",
|
|
"1f468-1f3fc-200d-1f3a4",
|
|
"1f468-1f3fd-200d-1f3a4",
|
|
"1f468-1f3fe-200d-1f3a4",
|
|
"1f468-1f3ff-200d-1f3a4"
|
|
]
|
|
},
|
|
{
|
|
n: ["woman singer", "female-singer"],
|
|
u: "1f469-200d-1f3a4",
|
|
v: [
|
|
"1f469-1f3fb-200d-1f3a4",
|
|
"1f469-1f3fc-200d-1f3a4",
|
|
"1f469-1f3fd-200d-1f3a4",
|
|
"1f469-1f3fe-200d-1f3a4",
|
|
"1f469-1f3ff-200d-1f3a4"
|
|
]
|
|
},
|
|
{
|
|
n: ["artist"],
|
|
u: "1f9d1-200d-1f3a8",
|
|
v: [
|
|
"1f9d1-1f3fb-200d-1f3a8",
|
|
"1f9d1-1f3fc-200d-1f3a8",
|
|
"1f9d1-1f3fd-200d-1f3a8",
|
|
"1f9d1-1f3fe-200d-1f3a8",
|
|
"1f9d1-1f3ff-200d-1f3a8"
|
|
]
|
|
},
|
|
{
|
|
n: ["man artist", "male-artist"],
|
|
u: "1f468-200d-1f3a8",
|
|
v: [
|
|
"1f468-1f3fb-200d-1f3a8",
|
|
"1f468-1f3fc-200d-1f3a8",
|
|
"1f468-1f3fd-200d-1f3a8",
|
|
"1f468-1f3fe-200d-1f3a8",
|
|
"1f468-1f3ff-200d-1f3a8"
|
|
]
|
|
},
|
|
{
|
|
n: ["woman artist", "female-artist"],
|
|
u: "1f469-200d-1f3a8",
|
|
v: [
|
|
"1f469-1f3fb-200d-1f3a8",
|
|
"1f469-1f3fc-200d-1f3a8",
|
|
"1f469-1f3fd-200d-1f3a8",
|
|
"1f469-1f3fe-200d-1f3a8",
|
|
"1f469-1f3ff-200d-1f3a8"
|
|
]
|
|
},
|
|
{
|
|
n: ["pilot"],
|
|
u: "1f9d1-200d-2708-fe0f",
|
|
v: [
|
|
"1f9d1-1f3fb-200d-2708-fe0f",
|
|
"1f9d1-1f3fc-200d-2708-fe0f",
|
|
"1f9d1-1f3fd-200d-2708-fe0f",
|
|
"1f9d1-1f3fe-200d-2708-fe0f",
|
|
"1f9d1-1f3ff-200d-2708-fe0f"
|
|
]
|
|
},
|
|
{
|
|
n: ["man pilot", "male-pilot"],
|
|
u: "1f468-200d-2708-fe0f",
|
|
v: [
|
|
"1f468-1f3fb-200d-2708-fe0f",
|
|
"1f468-1f3fc-200d-2708-fe0f",
|
|
"1f468-1f3fd-200d-2708-fe0f",
|
|
"1f468-1f3fe-200d-2708-fe0f",
|
|
"1f468-1f3ff-200d-2708-fe0f"
|
|
]
|
|
},
|
|
{
|
|
n: ["woman pilot", "female-pilot"],
|
|
u: "1f469-200d-2708-fe0f",
|
|
v: [
|
|
"1f469-1f3fb-200d-2708-fe0f",
|
|
"1f469-1f3fc-200d-2708-fe0f",
|
|
"1f469-1f3fd-200d-2708-fe0f",
|
|
"1f469-1f3fe-200d-2708-fe0f",
|
|
"1f469-1f3ff-200d-2708-fe0f"
|
|
]
|
|
},
|
|
{
|
|
n: ["astronaut"],
|
|
u: "1f9d1-200d-1f680",
|
|
v: [
|
|
"1f9d1-1f3fb-200d-1f680",
|
|
"1f9d1-1f3fc-200d-1f680",
|
|
"1f9d1-1f3fd-200d-1f680",
|
|
"1f9d1-1f3fe-200d-1f680",
|
|
"1f9d1-1f3ff-200d-1f680"
|
|
]
|
|
},
|
|
{
|
|
n: ["man astronaut", "male-astronaut"],
|
|
u: "1f468-200d-1f680",
|
|
v: [
|
|
"1f468-1f3fb-200d-1f680",
|
|
"1f468-1f3fc-200d-1f680",
|
|
"1f468-1f3fd-200d-1f680",
|
|
"1f468-1f3fe-200d-1f680",
|
|
"1f468-1f3ff-200d-1f680"
|
|
]
|
|
},
|
|
{
|
|
n: ["woman astronaut", "female-astronaut"],
|
|
u: "1f469-200d-1f680",
|
|
v: [
|
|
"1f469-1f3fb-200d-1f680",
|
|
"1f469-1f3fc-200d-1f680",
|
|
"1f469-1f3fd-200d-1f680",
|
|
"1f469-1f3fe-200d-1f680",
|
|
"1f469-1f3ff-200d-1f680"
|
|
]
|
|
},
|
|
{
|
|
n: ["firefighter"],
|
|
u: "1f9d1-200d-1f692",
|
|
v: [
|
|
"1f9d1-1f3fb-200d-1f692",
|
|
"1f9d1-1f3fc-200d-1f692",
|
|
"1f9d1-1f3fd-200d-1f692",
|
|
"1f9d1-1f3fe-200d-1f692",
|
|
"1f9d1-1f3ff-200d-1f692"
|
|
]
|
|
},
|
|
{
|
|
n: ["man firefighter", "male-firefighter"],
|
|
u: "1f468-200d-1f692",
|
|
v: [
|
|
"1f468-1f3fb-200d-1f692",
|
|
"1f468-1f3fc-200d-1f692",
|
|
"1f468-1f3fd-200d-1f692",
|
|
"1f468-1f3fe-200d-1f692",
|
|
"1f468-1f3ff-200d-1f692"
|
|
]
|
|
},
|
|
{
|
|
n: ["woman firefighter", "female-firefighter"],
|
|
u: "1f469-200d-1f692",
|
|
v: [
|
|
"1f469-1f3fb-200d-1f692",
|
|
"1f469-1f3fc-200d-1f692",
|
|
"1f469-1f3fd-200d-1f692",
|
|
"1f469-1f3fe-200d-1f692",
|
|
"1f469-1f3ff-200d-1f692"
|
|
]
|
|
},
|
|
{
|
|
n: ["cop", "police officer"],
|
|
u: "1f46e",
|
|
v: [
|
|
"1f46e-1f3fb",
|
|
"1f46e-1f3fc",
|
|
"1f46e-1f3fd",
|
|
"1f46e-1f3fe",
|
|
"1f46e-1f3ff"
|
|
]
|
|
},
|
|
{
|
|
n: ["man police officer", "male-police-officer"],
|
|
u: "1f46e-200d-2642-fe0f",
|
|
v: [
|
|
"1f46e-1f3fb-200d-2642-fe0f",
|
|
"1f46e-1f3fc-200d-2642-fe0f",
|
|
"1f46e-1f3fd-200d-2642-fe0f",
|
|
"1f46e-1f3fe-200d-2642-fe0f",
|
|
"1f46e-1f3ff-200d-2642-fe0f"
|
|
]
|
|
},
|
|
{
|
|
n: ["woman police officer", "female-police-officer"],
|
|
u: "1f46e-200d-2640-fe0f",
|
|
v: [
|
|
"1f46e-1f3fb-200d-2640-fe0f",
|
|
"1f46e-1f3fc-200d-2640-fe0f",
|
|
"1f46e-1f3fd-200d-2640-fe0f",
|
|
"1f46e-1f3fe-200d-2640-fe0f",
|
|
"1f46e-1f3ff-200d-2640-fe0f"
|
|
]
|
|
},
|
|
{
|
|
n: ["detective", "sleuth or spy"],
|
|
u: "1f575-fe0f",
|
|
v: [
|
|
"1f575-1f3fb",
|
|
"1f575-1f3fc",
|
|
"1f575-1f3fd",
|
|
"1f575-1f3fe",
|
|
"1f575-1f3ff"
|
|
]
|
|
},
|
|
{
|
|
n: ["man detective", "male-detective"],
|
|
u: "1f575-fe0f-200d-2642-fe0f",
|
|
v: [
|
|
"1f575-1f3fb-200d-2642-fe0f",
|
|
"1f575-1f3fc-200d-2642-fe0f",
|
|
"1f575-1f3fd-200d-2642-fe0f",
|
|
"1f575-1f3fe-200d-2642-fe0f",
|
|
"1f575-1f3ff-200d-2642-fe0f"
|
|
]
|
|
},
|
|
{
|
|
n: ["woman detective", "female-detective"],
|
|
u: "1f575-fe0f-200d-2640-fe0f",
|
|
v: [
|
|
"1f575-1f3fb-200d-2640-fe0f",
|
|
"1f575-1f3fc-200d-2640-fe0f",
|
|
"1f575-1f3fd-200d-2640-fe0f",
|
|
"1f575-1f3fe-200d-2640-fe0f",
|
|
"1f575-1f3ff-200d-2640-fe0f"
|
|
]
|
|
},
|
|
{
|
|
n: ["guardsman"],
|
|
u: "1f482",
|
|
v: [
|
|
"1f482-1f3fb",
|
|
"1f482-1f3fc",
|
|
"1f482-1f3fd",
|
|
"1f482-1f3fe",
|
|
"1f482-1f3ff"
|
|
]
|
|
},
|
|
{
|
|
n: ["man guard", "male-guard"],
|
|
u: "1f482-200d-2642-fe0f",
|
|
v: [
|
|
"1f482-1f3fb-200d-2642-fe0f",
|
|
"1f482-1f3fc-200d-2642-fe0f",
|
|
"1f482-1f3fd-200d-2642-fe0f",
|
|
"1f482-1f3fe-200d-2642-fe0f",
|
|
"1f482-1f3ff-200d-2642-fe0f"
|
|
]
|
|
},
|
|
{
|
|
n: ["woman guard", "female-guard"],
|
|
u: "1f482-200d-2640-fe0f",
|
|
v: [
|
|
"1f482-1f3fb-200d-2640-fe0f",
|
|
"1f482-1f3fc-200d-2640-fe0f",
|
|
"1f482-1f3fd-200d-2640-fe0f",
|
|
"1f482-1f3fe-200d-2640-fe0f",
|
|
"1f482-1f3ff-200d-2640-fe0f"
|
|
]
|
|
},
|
|
{
|
|
n: ["ninja"],
|
|
u: "1f977",
|
|
v: [
|
|
"1f977-1f3fb",
|
|
"1f977-1f3fc",
|
|
"1f977-1f3fd",
|
|
"1f977-1f3fe",
|
|
"1f977-1f3ff"
|
|
]
|
|
},
|
|
{
|
|
n: ["construction worker"],
|
|
u: "1f477",
|
|
v: [
|
|
"1f477-1f3fb",
|
|
"1f477-1f3fc",
|
|
"1f477-1f3fd",
|
|
"1f477-1f3fe",
|
|
"1f477-1f3ff"
|
|
]
|
|
},
|
|
{
|
|
n: ["man construction worker", "male-construction-worker"],
|
|
u: "1f477-200d-2642-fe0f",
|
|
v: [
|
|
"1f477-1f3fb-200d-2642-fe0f",
|
|
"1f477-1f3fc-200d-2642-fe0f",
|
|
"1f477-1f3fd-200d-2642-fe0f",
|
|
"1f477-1f3fe-200d-2642-fe0f",
|
|
"1f477-1f3ff-200d-2642-fe0f"
|
|
]
|
|
},
|
|
{
|
|
n: ["woman construction worker", "female-construction-worker"],
|
|
u: "1f477-200d-2640-fe0f",
|
|
v: [
|
|
"1f477-1f3fb-200d-2640-fe0f",
|
|
"1f477-1f3fc-200d-2640-fe0f",
|
|
"1f477-1f3fd-200d-2640-fe0f",
|
|
"1f477-1f3fe-200d-2640-fe0f",
|
|
"1f477-1f3ff-200d-2640-fe0f"
|
|
]
|
|
},
|
|
{
|
|
n: ["person with crown"],
|
|
u: "1fac5",
|
|
v: [
|
|
"1fac5-1f3fb",
|
|
"1fac5-1f3fc",
|
|
"1fac5-1f3fd",
|
|
"1fac5-1f3fe",
|
|
"1fac5-1f3ff"
|
|
]
|
|
},
|
|
{
|
|
n: ["prince"],
|
|
u: "1f934",
|
|
v: [
|
|
"1f934-1f3fb",
|
|
"1f934-1f3fc",
|
|
"1f934-1f3fd",
|
|
"1f934-1f3fe",
|
|
"1f934-1f3ff"
|
|
]
|
|
},
|
|
{
|
|
n: ["princess"],
|
|
u: "1f478",
|
|
v: [
|
|
"1f478-1f3fb",
|
|
"1f478-1f3fc",
|
|
"1f478-1f3fd",
|
|
"1f478-1f3fe",
|
|
"1f478-1f3ff"
|
|
]
|
|
},
|
|
{
|
|
n: ["man with turban"],
|
|
u: "1f473",
|
|
v: [
|
|
"1f473-1f3fb",
|
|
"1f473-1f3fc",
|
|
"1f473-1f3fd",
|
|
"1f473-1f3fe",
|
|
"1f473-1f3ff"
|
|
]
|
|
},
|
|
{
|
|
n: ["man wearing turban", "man-wearing-turban"],
|
|
u: "1f473-200d-2642-fe0f",
|
|
v: [
|
|
"1f473-1f3fb-200d-2642-fe0f",
|
|
"1f473-1f3fc-200d-2642-fe0f",
|
|
"1f473-1f3fd-200d-2642-fe0f",
|
|
"1f473-1f3fe-200d-2642-fe0f",
|
|
"1f473-1f3ff-200d-2642-fe0f"
|
|
]
|
|
},
|
|
{
|
|
n: ["woman wearing turban", "woman-wearing-turban"],
|
|
u: "1f473-200d-2640-fe0f",
|
|
v: [
|
|
"1f473-1f3fb-200d-2640-fe0f",
|
|
"1f473-1f3fc-200d-2640-fe0f",
|
|
"1f473-1f3fd-200d-2640-fe0f",
|
|
"1f473-1f3fe-200d-2640-fe0f",
|
|
"1f473-1f3ff-200d-2640-fe0f"
|
|
]
|
|
},
|
|
{
|
|
n: ["man with gua pi mao"],
|
|
u: "1f472",
|
|
v: [
|
|
"1f472-1f3fb",
|
|
"1f472-1f3fc",
|
|
"1f472-1f3fd",
|
|
"1f472-1f3fe",
|
|
"1f472-1f3ff"
|
|
]
|
|
},
|
|
{
|
|
n: ["person with headscarf"],
|
|
u: "1f9d5",
|
|
v: [
|
|
"1f9d5-1f3fb",
|
|
"1f9d5-1f3fc",
|
|
"1f9d5-1f3fd",
|
|
"1f9d5-1f3fe",
|
|
"1f9d5-1f3ff"
|
|
]
|
|
},
|
|
{
|
|
n: ["man in tuxedo", "person in tuxedo"],
|
|
u: "1f935",
|
|
v: [
|
|
"1f935-1f3fb",
|
|
"1f935-1f3fc",
|
|
"1f935-1f3fd",
|
|
"1f935-1f3fe",
|
|
"1f935-1f3ff"
|
|
]
|
|
},
|
|
{
|
|
n: ["man in tuxedo"],
|
|
u: "1f935-200d-2642-fe0f",
|
|
v: [
|
|
"1f935-1f3fb-200d-2642-fe0f",
|
|
"1f935-1f3fc-200d-2642-fe0f",
|
|
"1f935-1f3fd-200d-2642-fe0f",
|
|
"1f935-1f3fe-200d-2642-fe0f",
|
|
"1f935-1f3ff-200d-2642-fe0f"
|
|
]
|
|
},
|
|
{
|
|
n: ["woman in tuxedo"],
|
|
u: "1f935-200d-2640-fe0f",
|
|
v: [
|
|
"1f935-1f3fb-200d-2640-fe0f",
|
|
"1f935-1f3fc-200d-2640-fe0f",
|
|
"1f935-1f3fd-200d-2640-fe0f",
|
|
"1f935-1f3fe-200d-2640-fe0f",
|
|
"1f935-1f3ff-200d-2640-fe0f"
|
|
]
|
|
},
|
|
{
|
|
n: ["bride with veil"],
|
|
u: "1f470",
|
|
v: [
|
|
"1f470-1f3fb",
|
|
"1f470-1f3fc",
|
|
"1f470-1f3fd",
|
|
"1f470-1f3fe",
|
|
"1f470-1f3ff"
|
|
]
|
|
},
|
|
{
|
|
n: ["man with veil"],
|
|
u: "1f470-200d-2642-fe0f",
|
|
v: [
|
|
"1f470-1f3fb-200d-2642-fe0f",
|
|
"1f470-1f3fc-200d-2642-fe0f",
|
|
"1f470-1f3fd-200d-2642-fe0f",
|
|
"1f470-1f3fe-200d-2642-fe0f",
|
|
"1f470-1f3ff-200d-2642-fe0f"
|
|
]
|
|
},
|
|
{
|
|
n: ["woman with veil"],
|
|
u: "1f470-200d-2640-fe0f",
|
|
v: [
|
|
"1f470-1f3fb-200d-2640-fe0f",
|
|
"1f470-1f3fc-200d-2640-fe0f",
|
|
"1f470-1f3fd-200d-2640-fe0f",
|
|
"1f470-1f3fe-200d-2640-fe0f",
|
|
"1f470-1f3ff-200d-2640-fe0f"
|
|
]
|
|
},
|
|
{
|
|
n: ["pregnant woman"],
|
|
u: "1f930",
|
|
v: [
|
|
"1f930-1f3fb",
|
|
"1f930-1f3fc",
|
|
"1f930-1f3fd",
|
|
"1f930-1f3fe",
|
|
"1f930-1f3ff"
|
|
]
|
|
},
|
|
{
|
|
n: ["pregnant man"],
|
|
u: "1fac3",
|
|
v: [
|
|
"1fac3-1f3fb",
|
|
"1fac3-1f3fc",
|
|
"1fac3-1f3fd",
|
|
"1fac3-1f3fe",
|
|
"1fac3-1f3ff"
|
|
]
|
|
},
|
|
{
|
|
n: ["pregnant person"],
|
|
u: "1fac4",
|
|
v: [
|
|
"1fac4-1f3fb",
|
|
"1fac4-1f3fc",
|
|
"1fac4-1f3fd",
|
|
"1fac4-1f3fe",
|
|
"1fac4-1f3ff"
|
|
]
|
|
},
|
|
{
|
|
n: ["breast-feeding"],
|
|
u: "1f931",
|
|
v: [
|
|
"1f931-1f3fb",
|
|
"1f931-1f3fc",
|
|
"1f931-1f3fd",
|
|
"1f931-1f3fe",
|
|
"1f931-1f3ff"
|
|
]
|
|
},
|
|
{
|
|
n: ["woman feeding baby"],
|
|
u: "1f469-200d-1f37c",
|
|
v: [
|
|
"1f469-1f3fb-200d-1f37c",
|
|
"1f469-1f3fc-200d-1f37c",
|
|
"1f469-1f3fd-200d-1f37c",
|
|
"1f469-1f3fe-200d-1f37c",
|
|
"1f469-1f3ff-200d-1f37c"
|
|
]
|
|
},
|
|
{
|
|
n: ["man feeding baby"],
|
|
u: "1f468-200d-1f37c",
|
|
v: [
|
|
"1f468-1f3fb-200d-1f37c",
|
|
"1f468-1f3fc-200d-1f37c",
|
|
"1f468-1f3fd-200d-1f37c",
|
|
"1f468-1f3fe-200d-1f37c",
|
|
"1f468-1f3ff-200d-1f37c"
|
|
]
|
|
},
|
|
{
|
|
n: ["person feeding baby"],
|
|
u: "1f9d1-200d-1f37c",
|
|
v: [
|
|
"1f9d1-1f3fb-200d-1f37c",
|
|
"1f9d1-1f3fc-200d-1f37c",
|
|
"1f9d1-1f3fd-200d-1f37c",
|
|
"1f9d1-1f3fe-200d-1f37c",
|
|
"1f9d1-1f3ff-200d-1f37c"
|
|
]
|
|
},
|
|
{
|
|
n: ["angel", "baby angel"],
|
|
u: "1f47c",
|
|
v: [
|
|
"1f47c-1f3fb",
|
|
"1f47c-1f3fc",
|
|
"1f47c-1f3fd",
|
|
"1f47c-1f3fe",
|
|
"1f47c-1f3ff"
|
|
]
|
|
},
|
|
{
|
|
n: ["santa", "father christmas"],
|
|
u: "1f385",
|
|
v: [
|
|
"1f385-1f3fb",
|
|
"1f385-1f3fc",
|
|
"1f385-1f3fd",
|
|
"1f385-1f3fe",
|
|
"1f385-1f3ff"
|
|
]
|
|
},
|
|
{
|
|
n: ["mrs claus", "mother christmas"],
|
|
u: "1f936",
|
|
v: [
|
|
"1f936-1f3fb",
|
|
"1f936-1f3fc",
|
|
"1f936-1f3fd",
|
|
"1f936-1f3fe",
|
|
"1f936-1f3ff"
|
|
]
|
|
},
|
|
{
|
|
n: ["mx claus"],
|
|
u: "1f9d1-200d-1f384",
|
|
v: [
|
|
"1f9d1-1f3fb-200d-1f384",
|
|
"1f9d1-1f3fc-200d-1f384",
|
|
"1f9d1-1f3fd-200d-1f384",
|
|
"1f9d1-1f3fe-200d-1f384",
|
|
"1f9d1-1f3ff-200d-1f384"
|
|
]
|
|
},
|
|
{
|
|
n: ["superhero"],
|
|
u: "1f9b8",
|
|
v: [
|
|
"1f9b8-1f3fb",
|
|
"1f9b8-1f3fc",
|
|
"1f9b8-1f3fd",
|
|
"1f9b8-1f3fe",
|
|
"1f9b8-1f3ff"
|
|
]
|
|
},
|
|
{
|
|
n: ["man superhero", "male superhero"],
|
|
u: "1f9b8-200d-2642-fe0f",
|
|
v: [
|
|
"1f9b8-1f3fb-200d-2642-fe0f",
|
|
"1f9b8-1f3fc-200d-2642-fe0f",
|
|
"1f9b8-1f3fd-200d-2642-fe0f",
|
|
"1f9b8-1f3fe-200d-2642-fe0f",
|
|
"1f9b8-1f3ff-200d-2642-fe0f"
|
|
]
|
|
},
|
|
{
|
|
n: ["woman superhero", "female superhero"],
|
|
u: "1f9b8-200d-2640-fe0f",
|
|
v: [
|
|
"1f9b8-1f3fb-200d-2640-fe0f",
|
|
"1f9b8-1f3fc-200d-2640-fe0f",
|
|
"1f9b8-1f3fd-200d-2640-fe0f",
|
|
"1f9b8-1f3fe-200d-2640-fe0f",
|
|
"1f9b8-1f3ff-200d-2640-fe0f"
|
|
]
|
|
},
|
|
{
|
|
n: ["supervillain"],
|
|
u: "1f9b9",
|
|
v: [
|
|
"1f9b9-1f3fb",
|
|
"1f9b9-1f3fc",
|
|
"1f9b9-1f3fd",
|
|
"1f9b9-1f3fe",
|
|
"1f9b9-1f3ff"
|
|
]
|
|
},
|
|
{
|
|
n: ["man supervillain", "male supervillain"],
|
|
u: "1f9b9-200d-2642-fe0f",
|
|
v: [
|
|
"1f9b9-1f3fb-200d-2642-fe0f",
|
|
"1f9b9-1f3fc-200d-2642-fe0f",
|
|
"1f9b9-1f3fd-200d-2642-fe0f",
|
|
"1f9b9-1f3fe-200d-2642-fe0f",
|
|
"1f9b9-1f3ff-200d-2642-fe0f"
|
|
]
|
|
},
|
|
{
|
|
n: ["woman supervillain", "female supervillain"],
|
|
u: "1f9b9-200d-2640-fe0f",
|
|
v: [
|
|
"1f9b9-1f3fb-200d-2640-fe0f",
|
|
"1f9b9-1f3fc-200d-2640-fe0f",
|
|
"1f9b9-1f3fd-200d-2640-fe0f",
|
|
"1f9b9-1f3fe-200d-2640-fe0f",
|
|
"1f9b9-1f3ff-200d-2640-fe0f"
|
|
]
|
|
},
|
|
{
|
|
n: ["mage"],
|
|
u: "1f9d9",
|
|
v: [
|
|
"1f9d9-1f3fb",
|
|
"1f9d9-1f3fc",
|
|
"1f9d9-1f3fd",
|
|
"1f9d9-1f3fe",
|
|
"1f9d9-1f3ff"
|
|
]
|
|
},
|
|
{
|
|
n: ["man mage", "male mage"],
|
|
u: "1f9d9-200d-2642-fe0f",
|
|
v: [
|
|
"1f9d9-1f3fb-200d-2642-fe0f",
|
|
"1f9d9-1f3fc-200d-2642-fe0f",
|
|
"1f9d9-1f3fd-200d-2642-fe0f",
|
|
"1f9d9-1f3fe-200d-2642-fe0f",
|
|
"1f9d9-1f3ff-200d-2642-fe0f"
|
|
]
|
|
},
|
|
{
|
|
n: ["woman mage", "female mage"],
|
|
u: "1f9d9-200d-2640-fe0f",
|
|
v: [
|
|
"1f9d9-1f3fb-200d-2640-fe0f",
|
|
"1f9d9-1f3fc-200d-2640-fe0f",
|
|
"1f9d9-1f3fd-200d-2640-fe0f",
|
|
"1f9d9-1f3fe-200d-2640-fe0f",
|
|
"1f9d9-1f3ff-200d-2640-fe0f"
|
|
]
|
|
},
|
|
{
|
|
n: ["fairy"],
|
|
u: "1f9da",
|
|
v: [
|
|
"1f9da-1f3fb",
|
|
"1f9da-1f3fc",
|
|
"1f9da-1f3fd",
|
|
"1f9da-1f3fe",
|
|
"1f9da-1f3ff"
|
|
]
|
|
},
|
|
{
|
|
n: ["man fairy", "male fairy"],
|
|
u: "1f9da-200d-2642-fe0f",
|
|
v: [
|
|
"1f9da-1f3fb-200d-2642-fe0f",
|
|
"1f9da-1f3fc-200d-2642-fe0f",
|
|
"1f9da-1f3fd-200d-2642-fe0f",
|
|
"1f9da-1f3fe-200d-2642-fe0f",
|
|
"1f9da-1f3ff-200d-2642-fe0f"
|
|
]
|
|
},
|
|
{
|
|
n: ["woman fairy", "female fairy"],
|
|
u: "1f9da-200d-2640-fe0f",
|
|
v: [
|
|
"1f9da-1f3fb-200d-2640-fe0f",
|
|
"1f9da-1f3fc-200d-2640-fe0f",
|
|
"1f9da-1f3fd-200d-2640-fe0f",
|
|
"1f9da-1f3fe-200d-2640-fe0f",
|
|
"1f9da-1f3ff-200d-2640-fe0f"
|
|
]
|
|
},
|
|
{
|
|
n: ["vampire"],
|
|
u: "1f9db",
|
|
v: [
|
|
"1f9db-1f3fb",
|
|
"1f9db-1f3fc",
|
|
"1f9db-1f3fd",
|
|
"1f9db-1f3fe",
|
|
"1f9db-1f3ff"
|
|
]
|
|
},
|
|
{
|
|
n: ["man vampire", "male vampire"],
|
|
u: "1f9db-200d-2642-fe0f",
|
|
v: [
|
|
"1f9db-1f3fb-200d-2642-fe0f",
|
|
"1f9db-1f3fc-200d-2642-fe0f",
|
|
"1f9db-1f3fd-200d-2642-fe0f",
|
|
"1f9db-1f3fe-200d-2642-fe0f",
|
|
"1f9db-1f3ff-200d-2642-fe0f"
|
|
]
|
|
},
|
|
{
|
|
n: ["woman vampire", "female vampire"],
|
|
u: "1f9db-200d-2640-fe0f",
|
|
v: [
|
|
"1f9db-1f3fb-200d-2640-fe0f",
|
|
"1f9db-1f3fc-200d-2640-fe0f",
|
|
"1f9db-1f3fd-200d-2640-fe0f",
|
|
"1f9db-1f3fe-200d-2640-fe0f",
|
|
"1f9db-1f3ff-200d-2640-fe0f"
|
|
]
|
|
},
|
|
{
|
|
n: ["merperson"],
|
|
u: "1f9dc",
|
|
v: [
|
|
"1f9dc-1f3fb",
|
|
"1f9dc-1f3fc",
|
|
"1f9dc-1f3fd",
|
|
"1f9dc-1f3fe",
|
|
"1f9dc-1f3ff"
|
|
]
|
|
},
|
|
{
|
|
n: ["merman"],
|
|
u: "1f9dc-200d-2642-fe0f",
|
|
v: [
|
|
"1f9dc-1f3fb-200d-2642-fe0f",
|
|
"1f9dc-1f3fc-200d-2642-fe0f",
|
|
"1f9dc-1f3fd-200d-2642-fe0f",
|
|
"1f9dc-1f3fe-200d-2642-fe0f",
|
|
"1f9dc-1f3ff-200d-2642-fe0f"
|
|
]
|
|
},
|
|
{
|
|
n: ["mermaid"],
|
|
u: "1f9dc-200d-2640-fe0f",
|
|
v: [
|
|
"1f9dc-1f3fb-200d-2640-fe0f",
|
|
"1f9dc-1f3fc-200d-2640-fe0f",
|
|
"1f9dc-1f3fd-200d-2640-fe0f",
|
|
"1f9dc-1f3fe-200d-2640-fe0f",
|
|
"1f9dc-1f3ff-200d-2640-fe0f"
|
|
]
|
|
},
|
|
{
|
|
n: ["elf"],
|
|
u: "1f9dd",
|
|
v: [
|
|
"1f9dd-1f3fb",
|
|
"1f9dd-1f3fc",
|
|
"1f9dd-1f3fd",
|
|
"1f9dd-1f3fe",
|
|
"1f9dd-1f3ff"
|
|
]
|
|
},
|
|
{
|
|
n: ["man elf", "male elf"],
|
|
u: "1f9dd-200d-2642-fe0f",
|
|
v: [
|
|
"1f9dd-1f3fb-200d-2642-fe0f",
|
|
"1f9dd-1f3fc-200d-2642-fe0f",
|
|
"1f9dd-1f3fd-200d-2642-fe0f",
|
|
"1f9dd-1f3fe-200d-2642-fe0f",
|
|
"1f9dd-1f3ff-200d-2642-fe0f"
|
|
]
|
|
},
|
|
{
|
|
n: ["woman elf", "female elf"],
|
|
u: "1f9dd-200d-2640-fe0f",
|
|
v: [
|
|
"1f9dd-1f3fb-200d-2640-fe0f",
|
|
"1f9dd-1f3fc-200d-2640-fe0f",
|
|
"1f9dd-1f3fd-200d-2640-fe0f",
|
|
"1f9dd-1f3fe-200d-2640-fe0f",
|
|
"1f9dd-1f3ff-200d-2640-fe0f"
|
|
]
|
|
},
|
|
{ n: ["genie"], u: "1f9de" },
|
|
{ n: ["man genie", "male genie"], u: "1f9de-200d-2642-fe0f" },
|
|
{ n: ["woman genie", "female genie"], u: "1f9de-200d-2640-fe0f" },
|
|
{ n: ["zombie"], u: "1f9df" },
|
|
{ n: ["man zombie", "male zombie"], u: "1f9df-200d-2642-fe0f" },
|
|
{ n: ["woman zombie", "female zombie"], u: "1f9df-200d-2640-fe0f" },
|
|
{ n: ["troll"], u: "1f9cc" },
|
|
{
|
|
n: ["massage", "face massage"],
|
|
u: "1f486",
|
|
v: [
|
|
"1f486-1f3fb",
|
|
"1f486-1f3fc",
|
|
"1f486-1f3fd",
|
|
"1f486-1f3fe",
|
|
"1f486-1f3ff"
|
|
]
|
|
},
|
|
{
|
|
n: ["man getting massage", "man-getting-massage"],
|
|
u: "1f486-200d-2642-fe0f",
|
|
v: [
|
|
"1f486-1f3fb-200d-2642-fe0f",
|
|
"1f486-1f3fc-200d-2642-fe0f",
|
|
"1f486-1f3fd-200d-2642-fe0f",
|
|
"1f486-1f3fe-200d-2642-fe0f",
|
|
"1f486-1f3ff-200d-2642-fe0f"
|
|
]
|
|
},
|
|
{
|
|
n: ["woman getting massage", "woman-getting-massage"],
|
|
u: "1f486-200d-2640-fe0f",
|
|
v: [
|
|
"1f486-1f3fb-200d-2640-fe0f",
|
|
"1f486-1f3fc-200d-2640-fe0f",
|
|
"1f486-1f3fd-200d-2640-fe0f",
|
|
"1f486-1f3fe-200d-2640-fe0f",
|
|
"1f486-1f3ff-200d-2640-fe0f"
|
|
]
|
|
},
|
|
{
|
|
n: ["haircut"],
|
|
u: "1f487",
|
|
v: [
|
|
"1f487-1f3fb",
|
|
"1f487-1f3fc",
|
|
"1f487-1f3fd",
|
|
"1f487-1f3fe",
|
|
"1f487-1f3ff"
|
|
]
|
|
},
|
|
{
|
|
n: ["man getting haircut", "man-getting-haircut"],
|
|
u: "1f487-200d-2642-fe0f",
|
|
v: [
|
|
"1f487-1f3fb-200d-2642-fe0f",
|
|
"1f487-1f3fc-200d-2642-fe0f",
|
|
"1f487-1f3fd-200d-2642-fe0f",
|
|
"1f487-1f3fe-200d-2642-fe0f",
|
|
"1f487-1f3ff-200d-2642-fe0f"
|
|
]
|
|
},
|
|
{
|
|
n: ["woman getting haircut", "woman-getting-haircut"],
|
|
u: "1f487-200d-2640-fe0f",
|
|
v: [
|
|
"1f487-1f3fb-200d-2640-fe0f",
|
|
"1f487-1f3fc-200d-2640-fe0f",
|
|
"1f487-1f3fd-200d-2640-fe0f",
|
|
"1f487-1f3fe-200d-2640-fe0f",
|
|
"1f487-1f3ff-200d-2640-fe0f"
|
|
]
|
|
},
|
|
{
|
|
n: ["walking", "pedestrian"],
|
|
u: "1f6b6",
|
|
v: [
|
|
"1f6b6-1f3fb",
|
|
"1f6b6-1f3fc",
|
|
"1f6b6-1f3fd",
|
|
"1f6b6-1f3fe",
|
|
"1f6b6-1f3ff"
|
|
]
|
|
},
|
|
{
|
|
n: ["man walking", "man-walking"],
|
|
u: "1f6b6-200d-2642-fe0f",
|
|
v: [
|
|
"1f6b6-1f3fb-200d-2642-fe0f",
|
|
"1f6b6-1f3fc-200d-2642-fe0f",
|
|
"1f6b6-1f3fd-200d-2642-fe0f",
|
|
"1f6b6-1f3fe-200d-2642-fe0f",
|
|
"1f6b6-1f3ff-200d-2642-fe0f"
|
|
]
|
|
},
|
|
{
|
|
n: ["woman walking", "woman-walking"],
|
|
u: "1f6b6-200d-2640-fe0f",
|
|
v: [
|
|
"1f6b6-1f3fb-200d-2640-fe0f",
|
|
"1f6b6-1f3fc-200d-2640-fe0f",
|
|
"1f6b6-1f3fd-200d-2640-fe0f",
|
|
"1f6b6-1f3fe-200d-2640-fe0f",
|
|
"1f6b6-1f3ff-200d-2640-fe0f"
|
|
]
|
|
},
|
|
{
|
|
n: ["standing person"],
|
|
u: "1f9cd",
|
|
v: [
|
|
"1f9cd-1f3fb",
|
|
"1f9cd-1f3fc",
|
|
"1f9cd-1f3fd",
|
|
"1f9cd-1f3fe",
|
|
"1f9cd-1f3ff"
|
|
]
|
|
},
|
|
{
|
|
n: ["man standing"],
|
|
u: "1f9cd-200d-2642-fe0f",
|
|
v: [
|
|
"1f9cd-1f3fb-200d-2642-fe0f",
|
|
"1f9cd-1f3fc-200d-2642-fe0f",
|
|
"1f9cd-1f3fd-200d-2642-fe0f",
|
|
"1f9cd-1f3fe-200d-2642-fe0f",
|
|
"1f9cd-1f3ff-200d-2642-fe0f"
|
|
]
|
|
},
|
|
{
|
|
n: ["woman standing"],
|
|
u: "1f9cd-200d-2640-fe0f",
|
|
v: [
|
|
"1f9cd-1f3fb-200d-2640-fe0f",
|
|
"1f9cd-1f3fc-200d-2640-fe0f",
|
|
"1f9cd-1f3fd-200d-2640-fe0f",
|
|
"1f9cd-1f3fe-200d-2640-fe0f",
|
|
"1f9cd-1f3ff-200d-2640-fe0f"
|
|
]
|
|
},
|
|
{
|
|
n: ["kneeling person"],
|
|
u: "1f9ce",
|
|
v: [
|
|
"1f9ce-1f3fb",
|
|
"1f9ce-1f3fc",
|
|
"1f9ce-1f3fd",
|
|
"1f9ce-1f3fe",
|
|
"1f9ce-1f3ff"
|
|
]
|
|
},
|
|
{
|
|
n: ["man kneeling"],
|
|
u: "1f9ce-200d-2642-fe0f",
|
|
v: [
|
|
"1f9ce-1f3fb-200d-2642-fe0f",
|
|
"1f9ce-1f3fc-200d-2642-fe0f",
|
|
"1f9ce-1f3fd-200d-2642-fe0f",
|
|
"1f9ce-1f3fe-200d-2642-fe0f",
|
|
"1f9ce-1f3ff-200d-2642-fe0f"
|
|
]
|
|
},
|
|
{
|
|
n: ["woman kneeling"],
|
|
u: "1f9ce-200d-2640-fe0f",
|
|
v: [
|
|
"1f9ce-1f3fb-200d-2640-fe0f",
|
|
"1f9ce-1f3fc-200d-2640-fe0f",
|
|
"1f9ce-1f3fd-200d-2640-fe0f",
|
|
"1f9ce-1f3fe-200d-2640-fe0f",
|
|
"1f9ce-1f3ff-200d-2640-fe0f"
|
|
]
|
|
},
|
|
{
|
|
n: ["person with white cane", "person with probing cane"],
|
|
u: "1f9d1-200d-1f9af",
|
|
v: [
|
|
"1f9d1-1f3fb-200d-1f9af",
|
|
"1f9d1-1f3fc-200d-1f9af",
|
|
"1f9d1-1f3fd-200d-1f9af",
|
|
"1f9d1-1f3fe-200d-1f9af",
|
|
"1f9d1-1f3ff-200d-1f9af"
|
|
]
|
|
},
|
|
{
|
|
n: ["man with white cane", "man with probing cane"],
|
|
u: "1f468-200d-1f9af",
|
|
v: [
|
|
"1f468-1f3fb-200d-1f9af",
|
|
"1f468-1f3fc-200d-1f9af",
|
|
"1f468-1f3fd-200d-1f9af",
|
|
"1f468-1f3fe-200d-1f9af",
|
|
"1f468-1f3ff-200d-1f9af"
|
|
]
|
|
},
|
|
{
|
|
n: ["woman with white cane", "woman with probing cane"],
|
|
u: "1f469-200d-1f9af",
|
|
v: [
|
|
"1f469-1f3fb-200d-1f9af",
|
|
"1f469-1f3fc-200d-1f9af",
|
|
"1f469-1f3fd-200d-1f9af",
|
|
"1f469-1f3fe-200d-1f9af",
|
|
"1f469-1f3ff-200d-1f9af"
|
|
]
|
|
},
|
|
{
|
|
n: ["person in motorized wheelchair"],
|
|
u: "1f9d1-200d-1f9bc",
|
|
v: [
|
|
"1f9d1-1f3fb-200d-1f9bc",
|
|
"1f9d1-1f3fc-200d-1f9bc",
|
|
"1f9d1-1f3fd-200d-1f9bc",
|
|
"1f9d1-1f3fe-200d-1f9bc",
|
|
"1f9d1-1f3ff-200d-1f9bc"
|
|
]
|
|
},
|
|
{
|
|
n: ["man in motorized wheelchair"],
|
|
u: "1f468-200d-1f9bc",
|
|
v: [
|
|
"1f468-1f3fb-200d-1f9bc",
|
|
"1f468-1f3fc-200d-1f9bc",
|
|
"1f468-1f3fd-200d-1f9bc",
|
|
"1f468-1f3fe-200d-1f9bc",
|
|
"1f468-1f3ff-200d-1f9bc"
|
|
]
|
|
},
|
|
{
|
|
n: ["woman in motorized wheelchair"],
|
|
u: "1f469-200d-1f9bc",
|
|
v: [
|
|
"1f469-1f3fb-200d-1f9bc",
|
|
"1f469-1f3fc-200d-1f9bc",
|
|
"1f469-1f3fd-200d-1f9bc",
|
|
"1f469-1f3fe-200d-1f9bc",
|
|
"1f469-1f3ff-200d-1f9bc"
|
|
]
|
|
},
|
|
{
|
|
n: ["person in manual wheelchair"],
|
|
u: "1f9d1-200d-1f9bd",
|
|
v: [
|
|
"1f9d1-1f3fb-200d-1f9bd",
|
|
"1f9d1-1f3fc-200d-1f9bd",
|
|
"1f9d1-1f3fd-200d-1f9bd",
|
|
"1f9d1-1f3fe-200d-1f9bd",
|
|
"1f9d1-1f3ff-200d-1f9bd"
|
|
]
|
|
},
|
|
{
|
|
n: ["man in manual wheelchair"],
|
|
u: "1f468-200d-1f9bd",
|
|
v: [
|
|
"1f468-1f3fb-200d-1f9bd",
|
|
"1f468-1f3fc-200d-1f9bd",
|
|
"1f468-1f3fd-200d-1f9bd",
|
|
"1f468-1f3fe-200d-1f9bd",
|
|
"1f468-1f3ff-200d-1f9bd"
|
|
]
|
|
},
|
|
{
|
|
n: ["woman in manual wheelchair"],
|
|
u: "1f469-200d-1f9bd",
|
|
v: [
|
|
"1f469-1f3fb-200d-1f9bd",
|
|
"1f469-1f3fc-200d-1f9bd",
|
|
"1f469-1f3fd-200d-1f9bd",
|
|
"1f469-1f3fe-200d-1f9bd",
|
|
"1f469-1f3ff-200d-1f9bd"
|
|
]
|
|
},
|
|
{
|
|
n: ["runner", "running"],
|
|
u: "1f3c3",
|
|
v: [
|
|
"1f3c3-1f3fb",
|
|
"1f3c3-1f3fc",
|
|
"1f3c3-1f3fd",
|
|
"1f3c3-1f3fe",
|
|
"1f3c3-1f3ff"
|
|
]
|
|
},
|
|
{
|
|
n: ["man running", "man-running"],
|
|
u: "1f3c3-200d-2642-fe0f",
|
|
v: [
|
|
"1f3c3-1f3fb-200d-2642-fe0f",
|
|
"1f3c3-1f3fc-200d-2642-fe0f",
|
|
"1f3c3-1f3fd-200d-2642-fe0f",
|
|
"1f3c3-1f3fe-200d-2642-fe0f",
|
|
"1f3c3-1f3ff-200d-2642-fe0f"
|
|
]
|
|
},
|
|
{
|
|
n: ["woman running", "woman-running"],
|
|
u: "1f3c3-200d-2640-fe0f",
|
|
v: [
|
|
"1f3c3-1f3fb-200d-2640-fe0f",
|
|
"1f3c3-1f3fc-200d-2640-fe0f",
|
|
"1f3c3-1f3fd-200d-2640-fe0f",
|
|
"1f3c3-1f3fe-200d-2640-fe0f",
|
|
"1f3c3-1f3ff-200d-2640-fe0f"
|
|
]
|
|
},
|
|
{
|
|
n: ["dancer"],
|
|
u: "1f483",
|
|
v: [
|
|
"1f483-1f3fb",
|
|
"1f483-1f3fc",
|
|
"1f483-1f3fd",
|
|
"1f483-1f3fe",
|
|
"1f483-1f3ff"
|
|
]
|
|
},
|
|
{
|
|
n: ["man dancing"],
|
|
u: "1f57a",
|
|
v: [
|
|
"1f57a-1f3fb",
|
|
"1f57a-1f3fc",
|
|
"1f57a-1f3fd",
|
|
"1f57a-1f3fe",
|
|
"1f57a-1f3ff"
|
|
]
|
|
},
|
|
{
|
|
n: ["person in suit levitating", "man in business suit levitating"],
|
|
u: "1f574-fe0f",
|
|
v: [
|
|
"1f574-1f3fb",
|
|
"1f574-1f3fc",
|
|
"1f574-1f3fd",
|
|
"1f574-1f3fe",
|
|
"1f574-1f3ff"
|
|
]
|
|
},
|
|
{ n: ["dancers", "woman with bunny ears"], u: "1f46f" },
|
|
{
|
|
n: [
|
|
"men with bunny ears",
|
|
"men-with-bunny-ears-partying",
|
|
"man-with-bunny-ears-partying"
|
|
],
|
|
u: "1f46f-200d-2642-fe0f"
|
|
},
|
|
{
|
|
n: [
|
|
"women with bunny ears",
|
|
"women-with-bunny-ears-partying",
|
|
"woman-with-bunny-ears-partying"
|
|
],
|
|
u: "1f46f-200d-2640-fe0f"
|
|
},
|
|
{
|
|
n: ["person in steamy room"],
|
|
u: "1f9d6",
|
|
v: [
|
|
"1f9d6-1f3fb",
|
|
"1f9d6-1f3fc",
|
|
"1f9d6-1f3fd",
|
|
"1f9d6-1f3fe",
|
|
"1f9d6-1f3ff"
|
|
]
|
|
},
|
|
{
|
|
n: ["man in steamy room"],
|
|
u: "1f9d6-200d-2642-fe0f",
|
|
v: [
|
|
"1f9d6-1f3fb-200d-2642-fe0f",
|
|
"1f9d6-1f3fc-200d-2642-fe0f",
|
|
"1f9d6-1f3fd-200d-2642-fe0f",
|
|
"1f9d6-1f3fe-200d-2642-fe0f",
|
|
"1f9d6-1f3ff-200d-2642-fe0f"
|
|
]
|
|
},
|
|
{
|
|
n: ["woman in steamy room"],
|
|
u: "1f9d6-200d-2640-fe0f",
|
|
v: [
|
|
"1f9d6-1f3fb-200d-2640-fe0f",
|
|
"1f9d6-1f3fc-200d-2640-fe0f",
|
|
"1f9d6-1f3fd-200d-2640-fe0f",
|
|
"1f9d6-1f3fe-200d-2640-fe0f",
|
|
"1f9d6-1f3ff-200d-2640-fe0f"
|
|
]
|
|
},
|
|
{
|
|
n: ["person climbing"],
|
|
u: "1f9d7",
|
|
v: [
|
|
"1f9d7-1f3fb",
|
|
"1f9d7-1f3fc",
|
|
"1f9d7-1f3fd",
|
|
"1f9d7-1f3fe",
|
|
"1f9d7-1f3ff"
|
|
]
|
|
},
|
|
{
|
|
n: ["man climbing"],
|
|
u: "1f9d7-200d-2642-fe0f",
|
|
v: [
|
|
"1f9d7-1f3fb-200d-2642-fe0f",
|
|
"1f9d7-1f3fc-200d-2642-fe0f",
|
|
"1f9d7-1f3fd-200d-2642-fe0f",
|
|
"1f9d7-1f3fe-200d-2642-fe0f",
|
|
"1f9d7-1f3ff-200d-2642-fe0f"
|
|
]
|
|
},
|
|
{
|
|
n: ["woman climbing"],
|
|
u: "1f9d7-200d-2640-fe0f",
|
|
v: [
|
|
"1f9d7-1f3fb-200d-2640-fe0f",
|
|
"1f9d7-1f3fc-200d-2640-fe0f",
|
|
"1f9d7-1f3fd-200d-2640-fe0f",
|
|
"1f9d7-1f3fe-200d-2640-fe0f",
|
|
"1f9d7-1f3ff-200d-2640-fe0f"
|
|
]
|
|
},
|
|
{ n: ["fencer"], u: "1f93a" },
|
|
{
|
|
n: ["horse racing"],
|
|
u: "1f3c7",
|
|
v: [
|
|
"1f3c7-1f3fb",
|
|
"1f3c7-1f3fc",
|
|
"1f3c7-1f3fd",
|
|
"1f3c7-1f3fe",
|
|
"1f3c7-1f3ff"
|
|
]
|
|
},
|
|
{ n: ["skier"], u: "26f7-fe0f" },
|
|
{
|
|
n: ["snowboarder"],
|
|
u: "1f3c2",
|
|
v: [
|
|
"1f3c2-1f3fb",
|
|
"1f3c2-1f3fc",
|
|
"1f3c2-1f3fd",
|
|
"1f3c2-1f3fe",
|
|
"1f3c2-1f3ff"
|
|
]
|
|
},
|
|
{
|
|
n: ["golfer", "person golfing"],
|
|
u: "1f3cc-fe0f",
|
|
v: [
|
|
"1f3cc-1f3fb",
|
|
"1f3cc-1f3fc",
|
|
"1f3cc-1f3fd",
|
|
"1f3cc-1f3fe",
|
|
"1f3cc-1f3ff"
|
|
]
|
|
},
|
|
{
|
|
n: ["man golfing", "man-golfing"],
|
|
u: "1f3cc-fe0f-200d-2642-fe0f",
|
|
v: [
|
|
"1f3cc-1f3fb-200d-2642-fe0f",
|
|
"1f3cc-1f3fc-200d-2642-fe0f",
|
|
"1f3cc-1f3fd-200d-2642-fe0f",
|
|
"1f3cc-1f3fe-200d-2642-fe0f",
|
|
"1f3cc-1f3ff-200d-2642-fe0f"
|
|
]
|
|
},
|
|
{
|
|
n: ["woman golfing", "woman-golfing"],
|
|
u: "1f3cc-fe0f-200d-2640-fe0f",
|
|
v: [
|
|
"1f3cc-1f3fb-200d-2640-fe0f",
|
|
"1f3cc-1f3fc-200d-2640-fe0f",
|
|
"1f3cc-1f3fd-200d-2640-fe0f",
|
|
"1f3cc-1f3fe-200d-2640-fe0f",
|
|
"1f3cc-1f3ff-200d-2640-fe0f"
|
|
]
|
|
},
|
|
{
|
|
n: ["surfer"],
|
|
u: "1f3c4",
|
|
v: [
|
|
"1f3c4-1f3fb",
|
|
"1f3c4-1f3fc",
|
|
"1f3c4-1f3fd",
|
|
"1f3c4-1f3fe",
|
|
"1f3c4-1f3ff"
|
|
]
|
|
},
|
|
{
|
|
n: ["man surfing", "man-surfing"],
|
|
u: "1f3c4-200d-2642-fe0f",
|
|
v: [
|
|
"1f3c4-1f3fb-200d-2642-fe0f",
|
|
"1f3c4-1f3fc-200d-2642-fe0f",
|
|
"1f3c4-1f3fd-200d-2642-fe0f",
|
|
"1f3c4-1f3fe-200d-2642-fe0f",
|
|
"1f3c4-1f3ff-200d-2642-fe0f"
|
|
]
|
|
},
|
|
{
|
|
n: ["woman surfing", "woman-surfing"],
|
|
u: "1f3c4-200d-2640-fe0f",
|
|
v: [
|
|
"1f3c4-1f3fb-200d-2640-fe0f",
|
|
"1f3c4-1f3fc-200d-2640-fe0f",
|
|
"1f3c4-1f3fd-200d-2640-fe0f",
|
|
"1f3c4-1f3fe-200d-2640-fe0f",
|
|
"1f3c4-1f3ff-200d-2640-fe0f"
|
|
]
|
|
},
|
|
{
|
|
n: ["rowboat"],
|
|
u: "1f6a3",
|
|
v: [
|
|
"1f6a3-1f3fb",
|
|
"1f6a3-1f3fc",
|
|
"1f6a3-1f3fd",
|
|
"1f6a3-1f3fe",
|
|
"1f6a3-1f3ff"
|
|
]
|
|
},
|
|
{
|
|
n: ["man rowing boat", "man-rowing-boat"],
|
|
u: "1f6a3-200d-2642-fe0f",
|
|
v: [
|
|
"1f6a3-1f3fb-200d-2642-fe0f",
|
|
"1f6a3-1f3fc-200d-2642-fe0f",
|
|
"1f6a3-1f3fd-200d-2642-fe0f",
|
|
"1f6a3-1f3fe-200d-2642-fe0f",
|
|
"1f6a3-1f3ff-200d-2642-fe0f"
|
|
]
|
|
},
|
|
{
|
|
n: ["woman rowing boat", "woman-rowing-boat"],
|
|
u: "1f6a3-200d-2640-fe0f",
|
|
v: [
|
|
"1f6a3-1f3fb-200d-2640-fe0f",
|
|
"1f6a3-1f3fc-200d-2640-fe0f",
|
|
"1f6a3-1f3fd-200d-2640-fe0f",
|
|
"1f6a3-1f3fe-200d-2640-fe0f",
|
|
"1f6a3-1f3ff-200d-2640-fe0f"
|
|
]
|
|
},
|
|
{
|
|
n: ["swimmer"],
|
|
u: "1f3ca",
|
|
v: [
|
|
"1f3ca-1f3fb",
|
|
"1f3ca-1f3fc",
|
|
"1f3ca-1f3fd",
|
|
"1f3ca-1f3fe",
|
|
"1f3ca-1f3ff"
|
|
]
|
|
},
|
|
{
|
|
n: ["man swimming", "man-swimming"],
|
|
u: "1f3ca-200d-2642-fe0f",
|
|
v: [
|
|
"1f3ca-1f3fb-200d-2642-fe0f",
|
|
"1f3ca-1f3fc-200d-2642-fe0f",
|
|
"1f3ca-1f3fd-200d-2642-fe0f",
|
|
"1f3ca-1f3fe-200d-2642-fe0f",
|
|
"1f3ca-1f3ff-200d-2642-fe0f"
|
|
]
|
|
},
|
|
{
|
|
n: ["woman swimming", "woman-swimming"],
|
|
u: "1f3ca-200d-2640-fe0f",
|
|
v: [
|
|
"1f3ca-1f3fb-200d-2640-fe0f",
|
|
"1f3ca-1f3fc-200d-2640-fe0f",
|
|
"1f3ca-1f3fd-200d-2640-fe0f",
|
|
"1f3ca-1f3fe-200d-2640-fe0f",
|
|
"1f3ca-1f3ff-200d-2640-fe0f"
|
|
]
|
|
},
|
|
{
|
|
n: ["person with ball", "person bouncing ball"],
|
|
u: "26f9-fe0f",
|
|
v: ["26f9-1f3fb", "26f9-1f3fc", "26f9-1f3fd", "26f9-1f3fe", "26f9-1f3ff"]
|
|
},
|
|
{
|
|
n: ["man bouncing ball", "man-bouncing-ball"],
|
|
u: "26f9-fe0f-200d-2642-fe0f",
|
|
v: [
|
|
"26f9-1f3fb-200d-2642-fe0f",
|
|
"26f9-1f3fc-200d-2642-fe0f",
|
|
"26f9-1f3fd-200d-2642-fe0f",
|
|
"26f9-1f3fe-200d-2642-fe0f",
|
|
"26f9-1f3ff-200d-2642-fe0f"
|
|
]
|
|
},
|
|
{
|
|
n: ["woman bouncing ball", "woman-bouncing-ball"],
|
|
u: "26f9-fe0f-200d-2640-fe0f",
|
|
v: [
|
|
"26f9-1f3fb-200d-2640-fe0f",
|
|
"26f9-1f3fc-200d-2640-fe0f",
|
|
"26f9-1f3fd-200d-2640-fe0f",
|
|
"26f9-1f3fe-200d-2640-fe0f",
|
|
"26f9-1f3ff-200d-2640-fe0f"
|
|
]
|
|
},
|
|
{
|
|
n: ["weight lifter", "person lifting weights"],
|
|
u: "1f3cb-fe0f",
|
|
v: [
|
|
"1f3cb-1f3fb",
|
|
"1f3cb-1f3fc",
|
|
"1f3cb-1f3fd",
|
|
"1f3cb-1f3fe",
|
|
"1f3cb-1f3ff"
|
|
]
|
|
},
|
|
{
|
|
n: ["man lifting weights", "man-lifting-weights"],
|
|
u: "1f3cb-fe0f-200d-2642-fe0f",
|
|
v: [
|
|
"1f3cb-1f3fb-200d-2642-fe0f",
|
|
"1f3cb-1f3fc-200d-2642-fe0f",
|
|
"1f3cb-1f3fd-200d-2642-fe0f",
|
|
"1f3cb-1f3fe-200d-2642-fe0f",
|
|
"1f3cb-1f3ff-200d-2642-fe0f"
|
|
]
|
|
},
|
|
{
|
|
n: ["woman lifting weights", "woman-lifting-weights"],
|
|
u: "1f3cb-fe0f-200d-2640-fe0f",
|
|
v: [
|
|
"1f3cb-1f3fb-200d-2640-fe0f",
|
|
"1f3cb-1f3fc-200d-2640-fe0f",
|
|
"1f3cb-1f3fd-200d-2640-fe0f",
|
|
"1f3cb-1f3fe-200d-2640-fe0f",
|
|
"1f3cb-1f3ff-200d-2640-fe0f"
|
|
]
|
|
},
|
|
{
|
|
n: ["bicyclist"],
|
|
u: "1f6b4",
|
|
v: [
|
|
"1f6b4-1f3fb",
|
|
"1f6b4-1f3fc",
|
|
"1f6b4-1f3fd",
|
|
"1f6b4-1f3fe",
|
|
"1f6b4-1f3ff"
|
|
]
|
|
},
|
|
{
|
|
n: ["man biking", "man-biking"],
|
|
u: "1f6b4-200d-2642-fe0f",
|
|
v: [
|
|
"1f6b4-1f3fb-200d-2642-fe0f",
|
|
"1f6b4-1f3fc-200d-2642-fe0f",
|
|
"1f6b4-1f3fd-200d-2642-fe0f",
|
|
"1f6b4-1f3fe-200d-2642-fe0f",
|
|
"1f6b4-1f3ff-200d-2642-fe0f"
|
|
]
|
|
},
|
|
{
|
|
n: ["woman biking", "woman-biking"],
|
|
u: "1f6b4-200d-2640-fe0f",
|
|
v: [
|
|
"1f6b4-1f3fb-200d-2640-fe0f",
|
|
"1f6b4-1f3fc-200d-2640-fe0f",
|
|
"1f6b4-1f3fd-200d-2640-fe0f",
|
|
"1f6b4-1f3fe-200d-2640-fe0f",
|
|
"1f6b4-1f3ff-200d-2640-fe0f"
|
|
]
|
|
},
|
|
{
|
|
n: ["mountain bicyclist"],
|
|
u: "1f6b5",
|
|
v: [
|
|
"1f6b5-1f3fb",
|
|
"1f6b5-1f3fc",
|
|
"1f6b5-1f3fd",
|
|
"1f6b5-1f3fe",
|
|
"1f6b5-1f3ff"
|
|
]
|
|
},
|
|
{
|
|
n: ["man mountain biking", "man-mountain-biking"],
|
|
u: "1f6b5-200d-2642-fe0f",
|
|
v: [
|
|
"1f6b5-1f3fb-200d-2642-fe0f",
|
|
"1f6b5-1f3fc-200d-2642-fe0f",
|
|
"1f6b5-1f3fd-200d-2642-fe0f",
|
|
"1f6b5-1f3fe-200d-2642-fe0f",
|
|
"1f6b5-1f3ff-200d-2642-fe0f"
|
|
]
|
|
},
|
|
{
|
|
n: ["woman mountain biking", "woman-mountain-biking"],
|
|
u: "1f6b5-200d-2640-fe0f",
|
|
v: [
|
|
"1f6b5-1f3fb-200d-2640-fe0f",
|
|
"1f6b5-1f3fc-200d-2640-fe0f",
|
|
"1f6b5-1f3fd-200d-2640-fe0f",
|
|
"1f6b5-1f3fe-200d-2640-fe0f",
|
|
"1f6b5-1f3ff-200d-2640-fe0f"
|
|
]
|
|
},
|
|
{
|
|
n: ["person doing cartwheel"],
|
|
u: "1f938",
|
|
v: [
|
|
"1f938-1f3fb",
|
|
"1f938-1f3fc",
|
|
"1f938-1f3fd",
|
|
"1f938-1f3fe",
|
|
"1f938-1f3ff"
|
|
]
|
|
},
|
|
{
|
|
n: ["man cartwheeling", "man-cartwheeling"],
|
|
u: "1f938-200d-2642-fe0f",
|
|
v: [
|
|
"1f938-1f3fb-200d-2642-fe0f",
|
|
"1f938-1f3fc-200d-2642-fe0f",
|
|
"1f938-1f3fd-200d-2642-fe0f",
|
|
"1f938-1f3fe-200d-2642-fe0f",
|
|
"1f938-1f3ff-200d-2642-fe0f"
|
|
]
|
|
},
|
|
{
|
|
n: ["woman cartwheeling", "woman-cartwheeling"],
|
|
u: "1f938-200d-2640-fe0f",
|
|
v: [
|
|
"1f938-1f3fb-200d-2640-fe0f",
|
|
"1f938-1f3fc-200d-2640-fe0f",
|
|
"1f938-1f3fd-200d-2640-fe0f",
|
|
"1f938-1f3fe-200d-2640-fe0f",
|
|
"1f938-1f3ff-200d-2640-fe0f"
|
|
]
|
|
},
|
|
{ n: ["wrestlers"], u: "1f93c" },
|
|
{ n: ["men wrestling", "man-wrestling"], u: "1f93c-200d-2642-fe0f" },
|
|
{ n: ["women wrestling", "woman-wrestling"], u: "1f93c-200d-2640-fe0f" },
|
|
{
|
|
n: ["water polo"],
|
|
u: "1f93d",
|
|
v: [
|
|
"1f93d-1f3fb",
|
|
"1f93d-1f3fc",
|
|
"1f93d-1f3fd",
|
|
"1f93d-1f3fe",
|
|
"1f93d-1f3ff"
|
|
]
|
|
},
|
|
{
|
|
n: ["man playing water polo", "man-playing-water-polo"],
|
|
u: "1f93d-200d-2642-fe0f",
|
|
v: [
|
|
"1f93d-1f3fb-200d-2642-fe0f",
|
|
"1f93d-1f3fc-200d-2642-fe0f",
|
|
"1f93d-1f3fd-200d-2642-fe0f",
|
|
"1f93d-1f3fe-200d-2642-fe0f",
|
|
"1f93d-1f3ff-200d-2642-fe0f"
|
|
]
|
|
},
|
|
{
|
|
n: ["woman playing water polo", "woman-playing-water-polo"],
|
|
u: "1f93d-200d-2640-fe0f",
|
|
v: [
|
|
"1f93d-1f3fb-200d-2640-fe0f",
|
|
"1f93d-1f3fc-200d-2640-fe0f",
|
|
"1f93d-1f3fd-200d-2640-fe0f",
|
|
"1f93d-1f3fe-200d-2640-fe0f",
|
|
"1f93d-1f3ff-200d-2640-fe0f"
|
|
]
|
|
},
|
|
{
|
|
n: ["handball"],
|
|
u: "1f93e",
|
|
v: [
|
|
"1f93e-1f3fb",
|
|
"1f93e-1f3fc",
|
|
"1f93e-1f3fd",
|
|
"1f93e-1f3fe",
|
|
"1f93e-1f3ff"
|
|
]
|
|
},
|
|
{
|
|
n: ["man playing handball", "man-playing-handball"],
|
|
u: "1f93e-200d-2642-fe0f",
|
|
v: [
|
|
"1f93e-1f3fb-200d-2642-fe0f",
|
|
"1f93e-1f3fc-200d-2642-fe0f",
|
|
"1f93e-1f3fd-200d-2642-fe0f",
|
|
"1f93e-1f3fe-200d-2642-fe0f",
|
|
"1f93e-1f3ff-200d-2642-fe0f"
|
|
]
|
|
},
|
|
{
|
|
n: ["woman playing handball", "woman-playing-handball"],
|
|
u: "1f93e-200d-2640-fe0f",
|
|
v: [
|
|
"1f93e-1f3fb-200d-2640-fe0f",
|
|
"1f93e-1f3fc-200d-2640-fe0f",
|
|
"1f93e-1f3fd-200d-2640-fe0f",
|
|
"1f93e-1f3fe-200d-2640-fe0f",
|
|
"1f93e-1f3ff-200d-2640-fe0f"
|
|
]
|
|
},
|
|
{
|
|
n: ["juggling"],
|
|
u: "1f939",
|
|
v: [
|
|
"1f939-1f3fb",
|
|
"1f939-1f3fc",
|
|
"1f939-1f3fd",
|
|
"1f939-1f3fe",
|
|
"1f939-1f3ff"
|
|
]
|
|
},
|
|
{
|
|
n: ["man juggling", "man-juggling"],
|
|
u: "1f939-200d-2642-fe0f",
|
|
v: [
|
|
"1f939-1f3fb-200d-2642-fe0f",
|
|
"1f939-1f3fc-200d-2642-fe0f",
|
|
"1f939-1f3fd-200d-2642-fe0f",
|
|
"1f939-1f3fe-200d-2642-fe0f",
|
|
"1f939-1f3ff-200d-2642-fe0f"
|
|
]
|
|
},
|
|
{
|
|
n: ["woman juggling", "woman-juggling"],
|
|
u: "1f939-200d-2640-fe0f",
|
|
v: [
|
|
"1f939-1f3fb-200d-2640-fe0f",
|
|
"1f939-1f3fc-200d-2640-fe0f",
|
|
"1f939-1f3fd-200d-2640-fe0f",
|
|
"1f939-1f3fe-200d-2640-fe0f",
|
|
"1f939-1f3ff-200d-2640-fe0f"
|
|
]
|
|
},
|
|
{
|
|
n: ["person in lotus position"],
|
|
u: "1f9d8",
|
|
v: [
|
|
"1f9d8-1f3fb",
|
|
"1f9d8-1f3fc",
|
|
"1f9d8-1f3fd",
|
|
"1f9d8-1f3fe",
|
|
"1f9d8-1f3ff"
|
|
]
|
|
},
|
|
{
|
|
n: ["man in lotus position"],
|
|
u: "1f9d8-200d-2642-fe0f",
|
|
v: [
|
|
"1f9d8-1f3fb-200d-2642-fe0f",
|
|
"1f9d8-1f3fc-200d-2642-fe0f",
|
|
"1f9d8-1f3fd-200d-2642-fe0f",
|
|
"1f9d8-1f3fe-200d-2642-fe0f",
|
|
"1f9d8-1f3ff-200d-2642-fe0f"
|
|
]
|
|
},
|
|
{
|
|
n: ["woman in lotus position"],
|
|
u: "1f9d8-200d-2640-fe0f",
|
|
v: [
|
|
"1f9d8-1f3fb-200d-2640-fe0f",
|
|
"1f9d8-1f3fc-200d-2640-fe0f",
|
|
"1f9d8-1f3fd-200d-2640-fe0f",
|
|
"1f9d8-1f3fe-200d-2640-fe0f",
|
|
"1f9d8-1f3ff-200d-2640-fe0f"
|
|
]
|
|
},
|
|
{
|
|
n: ["bath"],
|
|
u: "1f6c0",
|
|
v: [
|
|
"1f6c0-1f3fb",
|
|
"1f6c0-1f3fc",
|
|
"1f6c0-1f3fd",
|
|
"1f6c0-1f3fe",
|
|
"1f6c0-1f3ff"
|
|
]
|
|
},
|
|
{
|
|
n: ["sleeping accommodation"],
|
|
u: "1f6cc",
|
|
v: [
|
|
"1f6cc-1f3fb",
|
|
"1f6cc-1f3fc",
|
|
"1f6cc-1f3fd",
|
|
"1f6cc-1f3fe",
|
|
"1f6cc-1f3ff"
|
|
]
|
|
},
|
|
{
|
|
n: ["people holding hands"],
|
|
u: "1f9d1-200d-1f91d-200d-1f9d1",
|
|
v: [
|
|
"1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fb",
|
|
"1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fc",
|
|
"1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fd",
|
|
"1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fe",
|
|
"1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3ff",
|
|
"1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fb",
|
|
"1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fc",
|
|
"1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fd",
|
|
"1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fe",
|
|
"1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3ff",
|
|
"1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fb",
|
|
"1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fc",
|
|
"1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fd",
|
|
"1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fe",
|
|
"1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3ff",
|
|
"1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fb",
|
|
"1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fc",
|
|
"1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fd",
|
|
"1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fe",
|
|
"1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3ff",
|
|
"1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fb",
|
|
"1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fc",
|
|
"1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fd",
|
|
"1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fe",
|
|
"1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3ff"
|
|
]
|
|
},
|
|
{
|
|
n: ["women holding hands", "two women holding hands"],
|
|
u: "1f46d",
|
|
v: [
|
|
"1f46d-1f3fb",
|
|
"1f46d-1f3fc",
|
|
"1f46d-1f3fd",
|
|
"1f46d-1f3fe",
|
|
"1f46d-1f3ff",
|
|
"1f469-1f3fb-200d-1f91d-200d-1f469-1f3fc",
|
|
"1f469-1f3fb-200d-1f91d-200d-1f469-1f3fd",
|
|
"1f469-1f3fb-200d-1f91d-200d-1f469-1f3fe",
|
|
"1f469-1f3fb-200d-1f91d-200d-1f469-1f3ff",
|
|
"1f469-1f3fc-200d-1f91d-200d-1f469-1f3fb",
|
|
"1f469-1f3fc-200d-1f91d-200d-1f469-1f3fd",
|
|
"1f469-1f3fc-200d-1f91d-200d-1f469-1f3fe",
|
|
"1f469-1f3fc-200d-1f91d-200d-1f469-1f3ff",
|
|
"1f469-1f3fd-200d-1f91d-200d-1f469-1f3fb",
|
|
"1f469-1f3fd-200d-1f91d-200d-1f469-1f3fc",
|
|
"1f469-1f3fd-200d-1f91d-200d-1f469-1f3fe",
|
|
"1f469-1f3fd-200d-1f91d-200d-1f469-1f3ff",
|
|
"1f469-1f3fe-200d-1f91d-200d-1f469-1f3fb",
|
|
"1f469-1f3fe-200d-1f91d-200d-1f469-1f3fc",
|
|
"1f469-1f3fe-200d-1f91d-200d-1f469-1f3fd",
|
|
"1f469-1f3fe-200d-1f91d-200d-1f469-1f3ff",
|
|
"1f469-1f3ff-200d-1f91d-200d-1f469-1f3fb",
|
|
"1f469-1f3ff-200d-1f91d-200d-1f469-1f3fc",
|
|
"1f469-1f3ff-200d-1f91d-200d-1f469-1f3fd",
|
|
"1f469-1f3ff-200d-1f91d-200d-1f469-1f3fe"
|
|
]
|
|
},
|
|
{
|
|
n: [
|
|
"couple",
|
|
"man and woman holding hands",
|
|
"woman and man holding hands"
|
|
],
|
|
u: "1f46b",
|
|
v: [
|
|
"1f46b-1f3fb",
|
|
"1f46b-1f3fc",
|
|
"1f46b-1f3fd",
|
|
"1f46b-1f3fe",
|
|
"1f46b-1f3ff",
|
|
"1f469-1f3fb-200d-1f91d-200d-1f468-1f3fc",
|
|
"1f469-1f3fb-200d-1f91d-200d-1f468-1f3fd",
|
|
"1f469-1f3fb-200d-1f91d-200d-1f468-1f3fe",
|
|
"1f469-1f3fb-200d-1f91d-200d-1f468-1f3ff",
|
|
"1f469-1f3fc-200d-1f91d-200d-1f468-1f3fb",
|
|
"1f469-1f3fc-200d-1f91d-200d-1f468-1f3fd",
|
|
"1f469-1f3fc-200d-1f91d-200d-1f468-1f3fe",
|
|
"1f469-1f3fc-200d-1f91d-200d-1f468-1f3ff",
|
|
"1f469-1f3fd-200d-1f91d-200d-1f468-1f3fb",
|
|
"1f469-1f3fd-200d-1f91d-200d-1f468-1f3fc",
|
|
"1f469-1f3fd-200d-1f91d-200d-1f468-1f3fe",
|
|
"1f469-1f3fd-200d-1f91d-200d-1f468-1f3ff",
|
|
"1f469-1f3fe-200d-1f91d-200d-1f468-1f3fb",
|
|
"1f469-1f3fe-200d-1f91d-200d-1f468-1f3fc",
|
|
"1f469-1f3fe-200d-1f91d-200d-1f468-1f3fd",
|
|
"1f469-1f3fe-200d-1f91d-200d-1f468-1f3ff",
|
|
"1f469-1f3ff-200d-1f91d-200d-1f468-1f3fb",
|
|
"1f469-1f3ff-200d-1f91d-200d-1f468-1f3fc",
|
|
"1f469-1f3ff-200d-1f91d-200d-1f468-1f3fd",
|
|
"1f469-1f3ff-200d-1f91d-200d-1f468-1f3fe"
|
|
]
|
|
},
|
|
{
|
|
n: ["men holding hands", "two men holding hands"],
|
|
u: "1f46c",
|
|
v: [
|
|
"1f46c-1f3fb",
|
|
"1f46c-1f3fc",
|
|
"1f46c-1f3fd",
|
|
"1f46c-1f3fe",
|
|
"1f46c-1f3ff",
|
|
"1f468-1f3fb-200d-1f91d-200d-1f468-1f3fc",
|
|
"1f468-1f3fb-200d-1f91d-200d-1f468-1f3fd",
|
|
"1f468-1f3fb-200d-1f91d-200d-1f468-1f3fe",
|
|
"1f468-1f3fb-200d-1f91d-200d-1f468-1f3ff",
|
|
"1f468-1f3fc-200d-1f91d-200d-1f468-1f3fb",
|
|
"1f468-1f3fc-200d-1f91d-200d-1f468-1f3fd",
|
|
"1f468-1f3fc-200d-1f91d-200d-1f468-1f3fe",
|
|
"1f468-1f3fc-200d-1f91d-200d-1f468-1f3ff",
|
|
"1f468-1f3fd-200d-1f91d-200d-1f468-1f3fb",
|
|
"1f468-1f3fd-200d-1f91d-200d-1f468-1f3fc",
|
|
"1f468-1f3fd-200d-1f91d-200d-1f468-1f3fe",
|
|
"1f468-1f3fd-200d-1f91d-200d-1f468-1f3ff",
|
|
"1f468-1f3fe-200d-1f91d-200d-1f468-1f3fb",
|
|
"1f468-1f3fe-200d-1f91d-200d-1f468-1f3fc",
|
|
"1f468-1f3fe-200d-1f91d-200d-1f468-1f3fd",
|
|
"1f468-1f3fe-200d-1f91d-200d-1f468-1f3ff",
|
|
"1f468-1f3ff-200d-1f91d-200d-1f468-1f3fb",
|
|
"1f468-1f3ff-200d-1f91d-200d-1f468-1f3fc",
|
|
"1f468-1f3ff-200d-1f91d-200d-1f468-1f3fd",
|
|
"1f468-1f3ff-200d-1f91d-200d-1f468-1f3fe"
|
|
]
|
|
},
|
|
{
|
|
n: ["kiss", "couplekiss"],
|
|
u: "1f48f",
|
|
v: [
|
|
"1f48f-1f3fb",
|
|
"1f48f-1f3fc",
|
|
"1f48f-1f3fd",
|
|
"1f48f-1f3fe",
|
|
"1f48f-1f3ff",
|
|
"1f9d1-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fc",
|
|
"1f9d1-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fd",
|
|
"1f9d1-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fe",
|
|
"1f9d1-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3ff",
|
|
"1f9d1-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fb",
|
|
"1f9d1-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fd",
|
|
"1f9d1-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fe",
|
|
"1f9d1-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3ff",
|
|
"1f9d1-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fb",
|
|
"1f9d1-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fc",
|
|
"1f9d1-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fe",
|
|
"1f9d1-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3ff",
|
|
"1f9d1-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fb",
|
|
"1f9d1-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fc",
|
|
"1f9d1-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fd",
|
|
"1f9d1-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3ff",
|
|
"1f9d1-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fb",
|
|
"1f9d1-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fc",
|
|
"1f9d1-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fd",
|
|
"1f9d1-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fe"
|
|
]
|
|
},
|
|
{
|
|
n: ["woman-kiss-man", "kiss: woman, man"],
|
|
u: "1f469-200d-2764-fe0f-200d-1f48b-200d-1f468",
|
|
v: [
|
|
"1f469-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fb",
|
|
"1f469-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fc",
|
|
"1f469-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fd",
|
|
"1f469-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fe",
|
|
"1f469-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3ff",
|
|
"1f469-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fb",
|
|
"1f469-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fc",
|
|
"1f469-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fd",
|
|
"1f469-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fe",
|
|
"1f469-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3ff",
|
|
"1f469-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fb",
|
|
"1f469-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fc",
|
|
"1f469-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fd",
|
|
"1f469-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fe",
|
|
"1f469-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3ff",
|
|
"1f469-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fb",
|
|
"1f469-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fc",
|
|
"1f469-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fd",
|
|
"1f469-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fe",
|
|
"1f469-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3ff",
|
|
"1f469-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fb",
|
|
"1f469-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fc",
|
|
"1f469-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fd",
|
|
"1f469-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fe",
|
|
"1f469-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3ff"
|
|
]
|
|
},
|
|
{
|
|
n: ["man-kiss-man", "kiss: man, man"],
|
|
u: "1f468-200d-2764-fe0f-200d-1f48b-200d-1f468",
|
|
v: [
|
|
"1f468-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fb",
|
|
"1f468-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fc",
|
|
"1f468-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fd",
|
|
"1f468-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fe",
|
|
"1f468-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3ff",
|
|
"1f468-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fb",
|
|
"1f468-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fc",
|
|
"1f468-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fd",
|
|
"1f468-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fe",
|
|
"1f468-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3ff",
|
|
"1f468-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fb",
|
|
"1f468-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fc",
|
|
"1f468-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fd",
|
|
"1f468-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fe",
|
|
"1f468-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3ff",
|
|
"1f468-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fb",
|
|
"1f468-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fc",
|
|
"1f468-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fd",
|
|
"1f468-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fe",
|
|
"1f468-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3ff",
|
|
"1f468-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fb",
|
|
"1f468-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fc",
|
|
"1f468-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fd",
|
|
"1f468-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fe",
|
|
"1f468-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3ff"
|
|
]
|
|
},
|
|
{
|
|
n: ["woman-kiss-woman", "kiss: woman, woman"],
|
|
u: "1f469-200d-2764-fe0f-200d-1f48b-200d-1f469",
|
|
v: [
|
|
"1f469-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fb",
|
|
"1f469-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fc",
|
|
"1f469-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fd",
|
|
"1f469-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fe",
|
|
"1f469-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3ff",
|
|
"1f469-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fb",
|
|
"1f469-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fc",
|
|
"1f469-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fd",
|
|
"1f469-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fe",
|
|
"1f469-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3ff",
|
|
"1f469-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fb",
|
|
"1f469-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fc",
|
|
"1f469-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fd",
|
|
"1f469-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fe",
|
|
"1f469-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3ff",
|
|
"1f469-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fb",
|
|
"1f469-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fc",
|
|
"1f469-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fd",
|
|
"1f469-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fe",
|
|
"1f469-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3ff",
|
|
"1f469-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fb",
|
|
"1f469-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fc",
|
|
"1f469-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fd",
|
|
"1f469-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fe",
|
|
"1f469-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3ff"
|
|
]
|
|
},
|
|
{
|
|
n: ["couple with heart"],
|
|
u: "1f491",
|
|
v: [
|
|
"1f491-1f3fb",
|
|
"1f491-1f3fc",
|
|
"1f491-1f3fd",
|
|
"1f491-1f3fe",
|
|
"1f491-1f3ff",
|
|
"1f9d1-1f3fb-200d-2764-fe0f-200d-1f9d1-1f3fc",
|
|
"1f9d1-1f3fb-200d-2764-fe0f-200d-1f9d1-1f3fd",
|
|
"1f9d1-1f3fb-200d-2764-fe0f-200d-1f9d1-1f3fe",
|
|
"1f9d1-1f3fb-200d-2764-fe0f-200d-1f9d1-1f3ff",
|
|
"1f9d1-1f3fc-200d-2764-fe0f-200d-1f9d1-1f3fb",
|
|
"1f9d1-1f3fc-200d-2764-fe0f-200d-1f9d1-1f3fd",
|
|
"1f9d1-1f3fc-200d-2764-fe0f-200d-1f9d1-1f3fe",
|
|
"1f9d1-1f3fc-200d-2764-fe0f-200d-1f9d1-1f3ff",
|
|
"1f9d1-1f3fd-200d-2764-fe0f-200d-1f9d1-1f3fb",
|
|
"1f9d1-1f3fd-200d-2764-fe0f-200d-1f9d1-1f3fc",
|
|
"1f9d1-1f3fd-200d-2764-fe0f-200d-1f9d1-1f3fe",
|
|
"1f9d1-1f3fd-200d-2764-fe0f-200d-1f9d1-1f3ff",
|
|
"1f9d1-1f3fe-200d-2764-fe0f-200d-1f9d1-1f3fb",
|
|
"1f9d1-1f3fe-200d-2764-fe0f-200d-1f9d1-1f3fc",
|
|
"1f9d1-1f3fe-200d-2764-fe0f-200d-1f9d1-1f3fd",
|
|
"1f9d1-1f3fe-200d-2764-fe0f-200d-1f9d1-1f3ff",
|
|
"1f9d1-1f3ff-200d-2764-fe0f-200d-1f9d1-1f3fb",
|
|
"1f9d1-1f3ff-200d-2764-fe0f-200d-1f9d1-1f3fc",
|
|
"1f9d1-1f3ff-200d-2764-fe0f-200d-1f9d1-1f3fd",
|
|
"1f9d1-1f3ff-200d-2764-fe0f-200d-1f9d1-1f3fe"
|
|
]
|
|
},
|
|
{
|
|
n: ["woman-heart-man", "couple with heart: woman, man"],
|
|
u: "1f469-200d-2764-fe0f-200d-1f468",
|
|
v: [
|
|
"1f469-1f3fb-200d-2764-fe0f-200d-1f468-1f3fb",
|
|
"1f469-1f3fb-200d-2764-fe0f-200d-1f468-1f3fc",
|
|
"1f469-1f3fb-200d-2764-fe0f-200d-1f468-1f3fd",
|
|
"1f469-1f3fb-200d-2764-fe0f-200d-1f468-1f3fe",
|
|
"1f469-1f3fb-200d-2764-fe0f-200d-1f468-1f3ff",
|
|
"1f469-1f3fc-200d-2764-fe0f-200d-1f468-1f3fb",
|
|
"1f469-1f3fc-200d-2764-fe0f-200d-1f468-1f3fc",
|
|
"1f469-1f3fc-200d-2764-fe0f-200d-1f468-1f3fd",
|
|
"1f469-1f3fc-200d-2764-fe0f-200d-1f468-1f3fe",
|
|
"1f469-1f3fc-200d-2764-fe0f-200d-1f468-1f3ff",
|
|
"1f469-1f3fd-200d-2764-fe0f-200d-1f468-1f3fb",
|
|
"1f469-1f3fd-200d-2764-fe0f-200d-1f468-1f3fc",
|
|
"1f469-1f3fd-200d-2764-fe0f-200d-1f468-1f3fd",
|
|
"1f469-1f3fd-200d-2764-fe0f-200d-1f468-1f3fe",
|
|
"1f469-1f3fd-200d-2764-fe0f-200d-1f468-1f3ff",
|
|
"1f469-1f3fe-200d-2764-fe0f-200d-1f468-1f3fb",
|
|
"1f469-1f3fe-200d-2764-fe0f-200d-1f468-1f3fc",
|
|
"1f469-1f3fe-200d-2764-fe0f-200d-1f468-1f3fd",
|
|
"1f469-1f3fe-200d-2764-fe0f-200d-1f468-1f3fe",
|
|
"1f469-1f3fe-200d-2764-fe0f-200d-1f468-1f3ff",
|
|
"1f469-1f3ff-200d-2764-fe0f-200d-1f468-1f3fb",
|
|
"1f469-1f3ff-200d-2764-fe0f-200d-1f468-1f3fc",
|
|
"1f469-1f3ff-200d-2764-fe0f-200d-1f468-1f3fd",
|
|
"1f469-1f3ff-200d-2764-fe0f-200d-1f468-1f3fe",
|
|
"1f469-1f3ff-200d-2764-fe0f-200d-1f468-1f3ff"
|
|
]
|
|
},
|
|
{
|
|
n: ["man-heart-man", "couple with heart: man, man"],
|
|
u: "1f468-200d-2764-fe0f-200d-1f468",
|
|
v: [
|
|
"1f468-1f3fb-200d-2764-fe0f-200d-1f468-1f3fb",
|
|
"1f468-1f3fb-200d-2764-fe0f-200d-1f468-1f3fc",
|
|
"1f468-1f3fb-200d-2764-fe0f-200d-1f468-1f3fd",
|
|
"1f468-1f3fb-200d-2764-fe0f-200d-1f468-1f3fe",
|
|
"1f468-1f3fb-200d-2764-fe0f-200d-1f468-1f3ff",
|
|
"1f468-1f3fc-200d-2764-fe0f-200d-1f468-1f3fb",
|
|
"1f468-1f3fc-200d-2764-fe0f-200d-1f468-1f3fc",
|
|
"1f468-1f3fc-200d-2764-fe0f-200d-1f468-1f3fd",
|
|
"1f468-1f3fc-200d-2764-fe0f-200d-1f468-1f3fe",
|
|
"1f468-1f3fc-200d-2764-fe0f-200d-1f468-1f3ff",
|
|
"1f468-1f3fd-200d-2764-fe0f-200d-1f468-1f3fb",
|
|
"1f468-1f3fd-200d-2764-fe0f-200d-1f468-1f3fc",
|
|
"1f468-1f3fd-200d-2764-fe0f-200d-1f468-1f3fd",
|
|
"1f468-1f3fd-200d-2764-fe0f-200d-1f468-1f3fe",
|
|
"1f468-1f3fd-200d-2764-fe0f-200d-1f468-1f3ff",
|
|
"1f468-1f3fe-200d-2764-fe0f-200d-1f468-1f3fb",
|
|
"1f468-1f3fe-200d-2764-fe0f-200d-1f468-1f3fc",
|
|
"1f468-1f3fe-200d-2764-fe0f-200d-1f468-1f3fd",
|
|
"1f468-1f3fe-200d-2764-fe0f-200d-1f468-1f3fe",
|
|
"1f468-1f3fe-200d-2764-fe0f-200d-1f468-1f3ff",
|
|
"1f468-1f3ff-200d-2764-fe0f-200d-1f468-1f3fb",
|
|
"1f468-1f3ff-200d-2764-fe0f-200d-1f468-1f3fc",
|
|
"1f468-1f3ff-200d-2764-fe0f-200d-1f468-1f3fd",
|
|
"1f468-1f3ff-200d-2764-fe0f-200d-1f468-1f3fe",
|
|
"1f468-1f3ff-200d-2764-fe0f-200d-1f468-1f3ff"
|
|
]
|
|
},
|
|
{
|
|
n: ["woman-heart-woman", "couple with heart: woman, woman"],
|
|
u: "1f469-200d-2764-fe0f-200d-1f469",
|
|
v: [
|
|
"1f469-1f3fb-200d-2764-fe0f-200d-1f469-1f3fb",
|
|
"1f469-1f3fb-200d-2764-fe0f-200d-1f469-1f3fc",
|
|
"1f469-1f3fb-200d-2764-fe0f-200d-1f469-1f3fd",
|
|
"1f469-1f3fb-200d-2764-fe0f-200d-1f469-1f3fe",
|
|
"1f469-1f3fb-200d-2764-fe0f-200d-1f469-1f3ff",
|
|
"1f469-1f3fc-200d-2764-fe0f-200d-1f469-1f3fb",
|
|
"1f469-1f3fc-200d-2764-fe0f-200d-1f469-1f3fc",
|
|
"1f469-1f3fc-200d-2764-fe0f-200d-1f469-1f3fd",
|
|
"1f469-1f3fc-200d-2764-fe0f-200d-1f469-1f3fe",
|
|
"1f469-1f3fc-200d-2764-fe0f-200d-1f469-1f3ff",
|
|
"1f469-1f3fd-200d-2764-fe0f-200d-1f469-1f3fb",
|
|
"1f469-1f3fd-200d-2764-fe0f-200d-1f469-1f3fc",
|
|
"1f469-1f3fd-200d-2764-fe0f-200d-1f469-1f3fd",
|
|
"1f469-1f3fd-200d-2764-fe0f-200d-1f469-1f3fe",
|
|
"1f469-1f3fd-200d-2764-fe0f-200d-1f469-1f3ff",
|
|
"1f469-1f3fe-200d-2764-fe0f-200d-1f469-1f3fb",
|
|
"1f469-1f3fe-200d-2764-fe0f-200d-1f469-1f3fc",
|
|
"1f469-1f3fe-200d-2764-fe0f-200d-1f469-1f3fd",
|
|
"1f469-1f3fe-200d-2764-fe0f-200d-1f469-1f3fe",
|
|
"1f469-1f3fe-200d-2764-fe0f-200d-1f469-1f3ff",
|
|
"1f469-1f3ff-200d-2764-fe0f-200d-1f469-1f3fb",
|
|
"1f469-1f3ff-200d-2764-fe0f-200d-1f469-1f3fc",
|
|
"1f469-1f3ff-200d-2764-fe0f-200d-1f469-1f3fd",
|
|
"1f469-1f3ff-200d-2764-fe0f-200d-1f469-1f3fe",
|
|
"1f469-1f3ff-200d-2764-fe0f-200d-1f469-1f3ff"
|
|
]
|
|
},
|
|
{ n: ["family"], u: "1f46a" },
|
|
{
|
|
n: ["man-woman-boy", "family: man, woman, boy"],
|
|
u: "1f468-200d-1f469-200d-1f466"
|
|
},
|
|
{
|
|
n: ["man-woman-girl", "family: man, woman, girl"],
|
|
u: "1f468-200d-1f469-200d-1f467"
|
|
},
|
|
{
|
|
n: ["man-woman-girl-boy", "family: man, woman, girl, boy"],
|
|
u: "1f468-200d-1f469-200d-1f467-200d-1f466"
|
|
},
|
|
{
|
|
n: ["man-woman-boy-boy", "family: man, woman, boy, boy"],
|
|
u: "1f468-200d-1f469-200d-1f466-200d-1f466"
|
|
},
|
|
{
|
|
n: ["man-woman-girl-girl", "family: man, woman, girl, girl"],
|
|
u: "1f468-200d-1f469-200d-1f467-200d-1f467"
|
|
},
|
|
{
|
|
n: ["man-man-boy", "family: man, man, boy"],
|
|
u: "1f468-200d-1f468-200d-1f466"
|
|
},
|
|
{
|
|
n: ["man-man-girl", "family: man, man, girl"],
|
|
u: "1f468-200d-1f468-200d-1f467"
|
|
},
|
|
{
|
|
n: ["man-man-girl-boy", "family: man, man, girl, boy"],
|
|
u: "1f468-200d-1f468-200d-1f467-200d-1f466"
|
|
},
|
|
{
|
|
n: ["man-man-boy-boy", "family: man, man, boy, boy"],
|
|
u: "1f468-200d-1f468-200d-1f466-200d-1f466"
|
|
},
|
|
{
|
|
n: ["man-man-girl-girl", "family: man, man, girl, girl"],
|
|
u: "1f468-200d-1f468-200d-1f467-200d-1f467"
|
|
},
|
|
{
|
|
n: ["woman-woman-boy", "family: woman, woman, boy"],
|
|
u: "1f469-200d-1f469-200d-1f466"
|
|
},
|
|
{
|
|
n: ["woman-woman-girl", "family: woman, woman, girl"],
|
|
u: "1f469-200d-1f469-200d-1f467"
|
|
},
|
|
{
|
|
n: ["woman-woman-girl-boy", "family: woman, woman, girl, boy"],
|
|
u: "1f469-200d-1f469-200d-1f467-200d-1f466"
|
|
},
|
|
{
|
|
n: ["woman-woman-boy-boy", "family: woman, woman, boy, boy"],
|
|
u: "1f469-200d-1f469-200d-1f466-200d-1f466"
|
|
},
|
|
{
|
|
n: ["woman-woman-girl-girl", "family: woman, woman, girl, girl"],
|
|
u: "1f469-200d-1f469-200d-1f467-200d-1f467"
|
|
},
|
|
{ n: ["man-boy", "family: man, boy"], u: "1f468-200d-1f466" },
|
|
{
|
|
n: ["man-boy-boy", "family: man, boy, boy"],
|
|
u: "1f468-200d-1f466-200d-1f466"
|
|
},
|
|
{ n: ["man-girl", "family: man, girl"], u: "1f468-200d-1f467" },
|
|
{
|
|
n: ["man-girl-boy", "family: man, girl, boy"],
|
|
u: "1f468-200d-1f467-200d-1f466"
|
|
},
|
|
{
|
|
n: ["man-girl-girl", "family: man, girl, girl"],
|
|
u: "1f468-200d-1f467-200d-1f467"
|
|
},
|
|
{ n: ["woman-boy", "family: woman, boy"], u: "1f469-200d-1f466" },
|
|
{
|
|
n: ["woman-boy-boy", "family: woman, boy, boy"],
|
|
u: "1f469-200d-1f466-200d-1f466"
|
|
},
|
|
{ n: ["woman-girl", "family: woman, girl"], u: "1f469-200d-1f467" },
|
|
{
|
|
n: ["woman-girl-boy", "family: woman, girl, boy"],
|
|
u: "1f469-200d-1f467-200d-1f466"
|
|
},
|
|
{
|
|
n: ["woman-girl-girl", "family: woman, girl, girl"],
|
|
u: "1f469-200d-1f467-200d-1f467"
|
|
},
|
|
{ n: ["speaking head", "speaking head in silhouette"], u: "1f5e3-fe0f" },
|
|
{ n: ["bust in silhouette"], u: "1f464" },
|
|
{ n: ["busts in silhouette"], u: "1f465" },
|
|
{ n: ["people hugging"], u: "1fac2" },
|
|
{ n: ["footprints"], u: "1f463" }
|
|
],
|
|
animals_nature: [
|
|
{ n: ["monkey face"], u: "1f435" },
|
|
{ n: ["monkey"], u: "1f412" },
|
|
{ n: ["gorilla"], u: "1f98d" },
|
|
{ n: ["orangutan"], u: "1f9a7" },
|
|
{ n: ["dog", "dog face"], u: "1f436" },
|
|
{ n: ["dog", "dog2"], u: "1f415" },
|
|
{ n: ["guide dog"], u: "1f9ae" },
|
|
{ n: ["service dog"], u: "1f415-200d-1f9ba" },
|
|
{ n: ["poodle"], u: "1f429" },
|
|
{ n: ["wolf", "wolf face"], u: "1f43a" },
|
|
{ n: ["fox face"], u: "1f98a" },
|
|
{ n: ["raccoon"], u: "1f99d" },
|
|
{ n: ["cat", "cat face"], u: "1f431" },
|
|
{ n: ["cat", "cat2"], u: "1f408" },
|
|
{ n: ["black cat"], u: "1f408-200d-2b1b" },
|
|
{ n: ["lion face"], u: "1f981" },
|
|
{ n: ["tiger", "tiger face"], u: "1f42f" },
|
|
{ n: ["tiger", "tiger2"], u: "1f405" },
|
|
{ n: ["leopard"], u: "1f406" },
|
|
{ n: ["horse", "horse face"], u: "1f434" },
|
|
{ n: ["horse", "racehorse"], u: "1f40e" },
|
|
{ n: ["unicorn face"], u: "1f984" },
|
|
{ n: ["zebra face"], u: "1f993" },
|
|
{ n: ["deer"], u: "1f98c" },
|
|
{ n: ["bison"], u: "1f9ac" },
|
|
{ n: ["cow", "cow face"], u: "1f42e" },
|
|
{ n: ["ox"], u: "1f402" },
|
|
{ n: ["water buffalo"], u: "1f403" },
|
|
{ n: ["cow", "cow2"], u: "1f404" },
|
|
{ n: ["pig", "pig face"], u: "1f437" },
|
|
{ n: ["pig", "pig2"], u: "1f416" },
|
|
{ n: ["boar"], u: "1f417" },
|
|
{ n: ["pig nose"], u: "1f43d" },
|
|
{ n: ["ram"], u: "1f40f" },
|
|
{ n: ["sheep"], u: "1f411" },
|
|
{ n: ["goat"], u: "1f410" },
|
|
{ n: ["dromedary camel"], u: "1f42a" },
|
|
{ n: ["camel", "bactrian camel"], u: "1f42b" },
|
|
{ n: ["llama"], u: "1f999" },
|
|
{ n: ["giraffe face"], u: "1f992" },
|
|
{ n: ["elephant"], u: "1f418" },
|
|
{ n: ["mammoth"], u: "1f9a3" },
|
|
{ n: ["rhinoceros"], u: "1f98f" },
|
|
{ n: ["hippopotamus"], u: "1f99b" },
|
|
{ n: ["mouse", "mouse face"], u: "1f42d" },
|
|
{ n: ["mouse", "mouse2"], u: "1f401" },
|
|
{ n: ["rat"], u: "1f400" },
|
|
{ n: ["hamster", "hamster face"], u: "1f439" },
|
|
{ n: ["rabbit", "rabbit face"], u: "1f430" },
|
|
{ n: ["rabbit", "rabbit2"], u: "1f407" },
|
|
{ n: ["chipmunk"], u: "1f43f-fe0f" },
|
|
{ n: ["beaver"], u: "1f9ab" },
|
|
{ n: ["hedgehog"], u: "1f994" },
|
|
{ n: ["bat"], u: "1f987" },
|
|
{ n: ["bear", "bear face"], u: "1f43b" },
|
|
{ n: ["polar bear"], u: "1f43b-200d-2744-fe0f" },
|
|
{ n: ["koala"], u: "1f428" },
|
|
{ n: ["panda face"], u: "1f43c" },
|
|
{ n: ["sloth"], u: "1f9a5" },
|
|
{ n: ["otter"], u: "1f9a6" },
|
|
{ n: ["skunk"], u: "1f9a8" },
|
|
{ n: ["kangaroo"], u: "1f998" },
|
|
{ n: ["badger"], u: "1f9a1" },
|
|
{ n: ["feet", "paw prints"], u: "1f43e" },
|
|
{ n: ["turkey"], u: "1f983" },
|
|
{ n: ["chicken"], u: "1f414" },
|
|
{ n: ["rooster"], u: "1f413" },
|
|
{ n: ["hatching chick"], u: "1f423" },
|
|
{ n: ["baby chick"], u: "1f424" },
|
|
{ n: ["hatched chick", "front-facing baby chick"], u: "1f425" },
|
|
{ n: ["bird"], u: "1f426" },
|
|
{ n: ["penguin"], u: "1f427" },
|
|
{ n: ["dove", "dove of peace"], u: "1f54a-fe0f" },
|
|
{ n: ["eagle"], u: "1f985" },
|
|
{ n: ["duck"], u: "1f986" },
|
|
{ n: ["swan"], u: "1f9a2" },
|
|
{ n: ["owl"], u: "1f989" },
|
|
{ n: ["dodo"], u: "1f9a4" },
|
|
{ n: ["feather"], u: "1fab6" },
|
|
{ n: ["flamingo"], u: "1f9a9" },
|
|
{ n: ["peacock"], u: "1f99a" },
|
|
{ n: ["parrot"], u: "1f99c" },
|
|
{ n: ["frog", "frog face"], u: "1f438" },
|
|
{ n: ["crocodile"], u: "1f40a" },
|
|
{ n: ["turtle"], u: "1f422" },
|
|
{ n: ["lizard"], u: "1f98e" },
|
|
{ n: ["snake"], u: "1f40d" },
|
|
{ n: ["dragon face"], u: "1f432" },
|
|
{ n: ["dragon"], u: "1f409" },
|
|
{ n: ["sauropod"], u: "1f995" },
|
|
{ n: ["t-rex"], u: "1f996" },
|
|
{ n: ["whale", "spouting whale"], u: "1f433" },
|
|
{ n: ["whale", "whale2"], u: "1f40b" },
|
|
{ n: ["dolphin", "flipper"], u: "1f42c" },
|
|
{ n: ["seal"], u: "1f9ad" },
|
|
{ n: ["fish"], u: "1f41f" },
|
|
{ n: ["tropical fish"], u: "1f420" },
|
|
{ n: ["blowfish"], u: "1f421" },
|
|
{ n: ["shark"], u: "1f988" },
|
|
{ n: ["octopus"], u: "1f419" },
|
|
{ n: ["shell", "spiral shell"], u: "1f41a" },
|
|
{ n: ["coral"], u: "1fab8" },
|
|
{ n: ["snail"], u: "1f40c" },
|
|
{ n: ["butterfly"], u: "1f98b" },
|
|
{ n: ["bug"], u: "1f41b" },
|
|
{ n: ["ant"], u: "1f41c" },
|
|
{ n: ["bee", "honeybee"], u: "1f41d" },
|
|
{ n: ["beetle"], u: "1fab2" },
|
|
{ n: ["ladybug", "lady beetle"], u: "1f41e" },
|
|
{ n: ["cricket"], u: "1f997" },
|
|
{ n: ["cockroach"], u: "1fab3" },
|
|
{ n: ["spider"], u: "1f577-fe0f" },
|
|
{ n: ["spider web"], u: "1f578-fe0f" },
|
|
{ n: ["scorpion"], u: "1f982" },
|
|
{ n: ["mosquito"], u: "1f99f" },
|
|
{ n: ["fly"], u: "1fab0" },
|
|
{ n: ["worm"], u: "1fab1" },
|
|
{ n: ["microbe"], u: "1f9a0" },
|
|
{ n: ["bouquet"], u: "1f490" },
|
|
{ n: ["cherry blossom"], u: "1f338" },
|
|
{ n: ["white flower"], u: "1f4ae" },
|
|
{ n: ["lotus"], u: "1fab7" },
|
|
{ n: ["rosette"], u: "1f3f5-fe0f" },
|
|
{ n: ["rose"], u: "1f339" },
|
|
{ n: ["wilted flower"], u: "1f940" },
|
|
{ n: ["hibiscus"], u: "1f33a" },
|
|
{ n: ["sunflower"], u: "1f33b" },
|
|
{ n: ["blossom"], u: "1f33c" },
|
|
{ n: ["tulip"], u: "1f337" },
|
|
{ n: ["seedling"], u: "1f331" },
|
|
{ n: ["potted plant"], u: "1fab4" },
|
|
{ n: ["evergreen tree"], u: "1f332" },
|
|
{ n: ["deciduous tree"], u: "1f333" },
|
|
{ n: ["palm tree"], u: "1f334" },
|
|
{ n: ["cactus"], u: "1f335" },
|
|
{ n: ["ear of rice"], u: "1f33e" },
|
|
{ n: ["herb"], u: "1f33f" },
|
|
{ n: ["shamrock"], u: "2618-fe0f" },
|
|
{ n: ["four leaf clover"], u: "1f340" },
|
|
{ n: ["maple leaf"], u: "1f341" },
|
|
{ n: ["fallen leaf"], u: "1f342" },
|
|
{ n: ["leaves", "leaf fluttering in wind"], u: "1f343" },
|
|
{ n: ["empty nest"], u: "1fab9" },
|
|
{ n: ["nest with eggs"], u: "1faba" }
|
|
],
|
|
food_drink: [
|
|
{ n: ["grapes"], u: "1f347" },
|
|
{ n: ["melon"], u: "1f348" },
|
|
{ n: ["watermelon"], u: "1f349" },
|
|
{ n: ["tangerine"], u: "1f34a" },
|
|
{ n: ["lemon"], u: "1f34b" },
|
|
{ n: ["banana"], u: "1f34c" },
|
|
{ n: ["pineapple"], u: "1f34d" },
|
|
{ n: ["mango"], u: "1f96d" },
|
|
{ n: ["apple", "red apple"], u: "1f34e" },
|
|
{ n: ["green apple"], u: "1f34f" },
|
|
{ n: ["pear"], u: "1f350" },
|
|
{ n: ["peach"], u: "1f351" },
|
|
{ n: ["cherries"], u: "1f352" },
|
|
{ n: ["strawberry"], u: "1f353" },
|
|
{ n: ["blueberries"], u: "1fad0" },
|
|
{ n: ["kiwifruit"], u: "1f95d" },
|
|
{ n: ["tomato"], u: "1f345" },
|
|
{ n: ["olive"], u: "1fad2" },
|
|
{ n: ["coconut"], u: "1f965" },
|
|
{ n: ["avocado"], u: "1f951" },
|
|
{ n: ["eggplant", "aubergine"], u: "1f346" },
|
|
{ n: ["potato"], u: "1f954" },
|
|
{ n: ["carrot"], u: "1f955" },
|
|
{ n: ["corn", "ear of maize"], u: "1f33d" },
|
|
{ n: ["hot pepper"], u: "1f336-fe0f" },
|
|
{ n: ["bell pepper"], u: "1fad1" },
|
|
{ n: ["cucumber"], u: "1f952" },
|
|
{ n: ["leafy green"], u: "1f96c" },
|
|
{ n: ["broccoli"], u: "1f966" },
|
|
{ n: ["garlic"], u: "1f9c4" },
|
|
{ n: ["onion"], u: "1f9c5" },
|
|
{ n: ["mushroom"], u: "1f344" },
|
|
{ n: ["peanuts"], u: "1f95c" },
|
|
{ n: ["beans"], u: "1fad8" },
|
|
{ n: ["chestnut"], u: "1f330" },
|
|
{ n: ["bread"], u: "1f35e" },
|
|
{ n: ["croissant"], u: "1f950" },
|
|
{ n: ["baguette bread"], u: "1f956" },
|
|
{ n: ["flatbread"], u: "1fad3" },
|
|
{ n: ["pretzel"], u: "1f968" },
|
|
{ n: ["bagel"], u: "1f96f" },
|
|
{ n: ["pancakes"], u: "1f95e" },
|
|
{ n: ["waffle"], u: "1f9c7" },
|
|
{ n: ["cheese wedge"], u: "1f9c0" },
|
|
{ n: ["meat on bone"], u: "1f356" },
|
|
{ n: ["poultry leg"], u: "1f357" },
|
|
{ n: ["cut of meat"], u: "1f969" },
|
|
{ n: ["bacon"], u: "1f953" },
|
|
{ n: ["hamburger"], u: "1f354" },
|
|
{ n: ["fries", "french fries"], u: "1f35f" },
|
|
{ n: ["pizza", "slice of pizza"], u: "1f355" },
|
|
{ n: ["hotdog", "hot dog"], u: "1f32d" },
|
|
{ n: ["sandwich"], u: "1f96a" },
|
|
{ n: ["taco"], u: "1f32e" },
|
|
{ n: ["burrito"], u: "1f32f" },
|
|
{ n: ["tamale"], u: "1fad4" },
|
|
{ n: ["stuffed flatbread"], u: "1f959" },
|
|
{ n: ["falafel"], u: "1f9c6" },
|
|
{ n: ["egg"], u: "1f95a" },
|
|
{ n: ["cooking", "fried egg"], u: "1f373" },
|
|
{ n: ["shallow pan of food"], u: "1f958" },
|
|
{ n: ["stew", "pot of food"], u: "1f372" },
|
|
{ n: ["fondue"], u: "1fad5" },
|
|
{ n: ["bowl with spoon"], u: "1f963" },
|
|
{ n: ["green salad"], u: "1f957" },
|
|
{ n: ["popcorn"], u: "1f37f" },
|
|
{ n: ["butter"], u: "1f9c8" },
|
|
{ n: ["salt", "salt shaker"], u: "1f9c2" },
|
|
{ n: ["canned food"], u: "1f96b" },
|
|
{ n: ["bento", "bento box"], u: "1f371" },
|
|
{ n: ["rice cracker"], u: "1f358" },
|
|
{ n: ["rice ball"], u: "1f359" },
|
|
{ n: ["rice", "cooked rice"], u: "1f35a" },
|
|
{ n: ["curry", "curry and rice"], u: "1f35b" },
|
|
{ n: ["ramen", "steaming bowl"], u: "1f35c" },
|
|
{ n: ["spaghetti"], u: "1f35d" },
|
|
{ n: ["sweet potato", "roasted sweet potato"], u: "1f360" },
|
|
{ n: ["oden"], u: "1f362" },
|
|
{ n: ["sushi"], u: "1f363" },
|
|
{ n: ["fried shrimp"], u: "1f364" },
|
|
{ n: ["fish cake", "fish cake with swirl design"], u: "1f365" },
|
|
{ n: ["moon cake"], u: "1f96e" },
|
|
{ n: ["dango"], u: "1f361" },
|
|
{ n: ["dumpling"], u: "1f95f" },
|
|
{ n: ["fortune cookie"], u: "1f960" },
|
|
{ n: ["takeout box"], u: "1f961" },
|
|
{ n: ["crab"], u: "1f980" },
|
|
{ n: ["lobster"], u: "1f99e" },
|
|
{ n: ["shrimp"], u: "1f990" },
|
|
{ n: ["squid"], u: "1f991" },
|
|
{ n: ["oyster"], u: "1f9aa" },
|
|
{ n: ["icecream", "soft ice cream"], u: "1f366" },
|
|
{ n: ["shaved ice"], u: "1f367" },
|
|
{ n: ["ice cream"], u: "1f368" },
|
|
{ n: ["doughnut"], u: "1f369" },
|
|
{ n: ["cookie"], u: "1f36a" },
|
|
{ n: ["birthday", "birthday cake"], u: "1f382" },
|
|
{ n: ["cake", "shortcake"], u: "1f370" },
|
|
{ n: ["cupcake"], u: "1f9c1" },
|
|
{ n: ["pie"], u: "1f967" },
|
|
{ n: ["chocolate bar"], u: "1f36b" },
|
|
{ n: ["candy"], u: "1f36c" },
|
|
{ n: ["lollipop"], u: "1f36d" },
|
|
{ n: ["custard"], u: "1f36e" },
|
|
{ n: ["honey pot"], u: "1f36f" },
|
|
{ n: ["baby bottle"], u: "1f37c" },
|
|
{ n: ["glass of milk"], u: "1f95b" },
|
|
{ n: ["coffee", "hot beverage"], u: "2615" },
|
|
{ n: ["teapot"], u: "1fad6" },
|
|
{ n: ["tea", "teacup without handle"], u: "1f375" },
|
|
{ n: ["sake", "sake bottle and cup"], u: "1f376" },
|
|
{ n: ["champagne", "bottle with popping cork"], u: "1f37e" },
|
|
{ n: ["wine glass"], u: "1f377" },
|
|
{ n: ["cocktail", "cocktail glass"], u: "1f378" },
|
|
{ n: ["tropical drink"], u: "1f379" },
|
|
{ n: ["beer", "beer mug"], u: "1f37a" },
|
|
{ n: ["beers", "clinking beer mugs"], u: "1f37b" },
|
|
{ n: ["clinking glasses"], u: "1f942" },
|
|
{ n: ["tumbler glass"], u: "1f943" },
|
|
{ n: ["pouring liquid"], u: "1fad7" },
|
|
{ n: ["cup with straw"], u: "1f964" },
|
|
{ n: ["bubble tea"], u: "1f9cb" },
|
|
{ n: ["beverage box"], u: "1f9c3" },
|
|
{ n: ["mate drink"], u: "1f9c9" },
|
|
{ n: ["ice cube"], u: "1f9ca" },
|
|
{ n: ["chopsticks"], u: "1f962" },
|
|
{ n: ["knife fork plate", "fork and knife with plate"], u: "1f37d-fe0f" },
|
|
{ n: ["fork and knife"], u: "1f374" },
|
|
{ n: ["spoon"], u: "1f944" },
|
|
{ n: ["hocho", "knife"], u: "1f52a" },
|
|
{ n: ["jar"], u: "1fad9" },
|
|
{ n: ["amphora"], u: "1f3fa" }
|
|
],
|
|
travel_places: [
|
|
{ n: ["earth africa", "earth globe europe-africa"], u: "1f30d" },
|
|
{ n: ["earth americas", "earth globe americas"], u: "1f30e" },
|
|
{ n: ["earth asia", "earth globe asia-australia"], u: "1f30f" },
|
|
{ n: ["globe with meridians"], u: "1f310" },
|
|
{ n: ["world map"], u: "1f5fa-fe0f" },
|
|
{ n: ["japan", "silhouette of japan"], u: "1f5fe" },
|
|
{ n: ["compass"], u: "1f9ed" },
|
|
{ n: ["snow-capped mountain", "snow capped mountain"], u: "1f3d4-fe0f" },
|
|
{ n: ["mountain"], u: "26f0-fe0f" },
|
|
{ n: ["volcano"], u: "1f30b" },
|
|
{ n: ["mount fuji"], u: "1f5fb" },
|
|
{ n: ["camping"], u: "1f3d5-fe0f" },
|
|
{ n: ["beach with umbrella"], u: "1f3d6-fe0f" },
|
|
{ n: ["desert"], u: "1f3dc-fe0f" },
|
|
{ n: ["desert island"], u: "1f3dd-fe0f" },
|
|
{ n: ["national park"], u: "1f3de-fe0f" },
|
|
{ n: ["stadium"], u: "1f3df-fe0f" },
|
|
{ n: ["classical building"], u: "1f3db-fe0f" },
|
|
{ n: ["building construction"], u: "1f3d7-fe0f" },
|
|
{ n: ["brick", "bricks"], u: "1f9f1" },
|
|
{ n: ["rock"], u: "1faa8" },
|
|
{ n: ["wood"], u: "1fab5" },
|
|
{ n: ["hut"], u: "1f6d6" },
|
|
{ n: ["houses", "house buildings"], u: "1f3d8-fe0f" },
|
|
{ n: ["derelict house", "derelict house building"], u: "1f3da-fe0f" },
|
|
{ n: ["house", "house building"], u: "1f3e0" },
|
|
{ n: ["house with garden"], u: "1f3e1" },
|
|
{ n: ["office", "office building"], u: "1f3e2" },
|
|
{ n: ["post office", "japanese post office"], u: "1f3e3" },
|
|
{ n: ["european post office"], u: "1f3e4" },
|
|
{ n: ["hospital"], u: "1f3e5" },
|
|
{ n: ["bank"], u: "1f3e6" },
|
|
{ n: ["hotel"], u: "1f3e8" },
|
|
{ n: ["love hotel"], u: "1f3e9" },
|
|
{ n: ["convenience store"], u: "1f3ea" },
|
|
{ n: ["school"], u: "1f3eb" },
|
|
{ n: ["department store"], u: "1f3ec" },
|
|
{ n: ["factory"], u: "1f3ed" },
|
|
{ n: ["japanese castle"], u: "1f3ef" },
|
|
{ n: ["european castle"], u: "1f3f0" },
|
|
{ n: ["wedding"], u: "1f492" },
|
|
{ n: ["tokyo tower"], u: "1f5fc" },
|
|
{ n: ["statue of liberty"], u: "1f5fd" },
|
|
{ n: ["church"], u: "26ea" },
|
|
{ n: ["mosque"], u: "1f54c" },
|
|
{ n: ["hindu temple"], u: "1f6d5" },
|
|
{ n: ["synagogue"], u: "1f54d" },
|
|
{ n: ["shinto shrine"], u: "26e9-fe0f" },
|
|
{ n: ["kaaba"], u: "1f54b" },
|
|
{ n: ["fountain"], u: "26f2" },
|
|
{ n: ["tent"], u: "26fa" },
|
|
{ n: ["foggy"], u: "1f301" },
|
|
{ n: ["night with stars"], u: "1f303" },
|
|
{ n: ["cityscape"], u: "1f3d9-fe0f" },
|
|
{ n: ["sunrise over mountains"], u: "1f304" },
|
|
{ n: ["sunrise"], u: "1f305" },
|
|
{ n: ["city sunset", "cityscape at dusk"], u: "1f306" },
|
|
{ n: ["city sunrise", "sunset over buildings"], u: "1f307" },
|
|
{ n: ["bridge at night"], u: "1f309" },
|
|
{ n: ["hotsprings", "hot springs"], u: "2668-fe0f" },
|
|
{ n: ["carousel horse"], u: "1f3a0" },
|
|
{ n: ["playground slide"], u: "1f6dd" },
|
|
{ n: ["ferris wheel"], u: "1f3a1" },
|
|
{ n: ["roller coaster"], u: "1f3a2" },
|
|
{ n: ["barber", "barber pole"], u: "1f488" },
|
|
{ n: ["circus tent"], u: "1f3aa" },
|
|
{ n: ["steam locomotive"], u: "1f682" },
|
|
{ n: ["railway car"], u: "1f683" },
|
|
{ n: ["high-speed train", "bullettrain side"], u: "1f684" },
|
|
{
|
|
n: ["bullettrain front", "high-speed train with bullet nose"],
|
|
u: "1f685"
|
|
},
|
|
{ n: ["train", "train2"], u: "1f686" },
|
|
{ n: ["metro"], u: "1f687" },
|
|
{ n: ["light rail"], u: "1f688" },
|
|
{ n: ["station"], u: "1f689" },
|
|
{ n: ["tram"], u: "1f68a" },
|
|
{ n: ["monorail"], u: "1f69d" },
|
|
{ n: ["mountain railway"], u: "1f69e" },
|
|
{ n: ["train", "tram car"], u: "1f68b" },
|
|
{ n: ["bus"], u: "1f68c" },
|
|
{ n: ["oncoming bus"], u: "1f68d" },
|
|
{ n: ["trolleybus"], u: "1f68e" },
|
|
{ n: ["minibus"], u: "1f690" },
|
|
{ n: ["ambulance"], u: "1f691" },
|
|
{ n: ["fire engine"], u: "1f692" },
|
|
{ n: ["police car"], u: "1f693" },
|
|
{ n: ["oncoming police car"], u: "1f694" },
|
|
{ n: ["taxi"], u: "1f695" },
|
|
{ n: ["oncoming taxi"], u: "1f696" },
|
|
{ n: ["car", "red car", "automobile"], u: "1f697" },
|
|
{ n: ["oncoming automobile"], u: "1f698" },
|
|
{ n: ["blue car", "recreational vehicle"], u: "1f699" },
|
|
{ n: ["pickup truck"], u: "1f6fb" },
|
|
{ n: ["truck", "delivery truck"], u: "1f69a" },
|
|
{ n: ["articulated lorry"], u: "1f69b" },
|
|
{ n: ["tractor"], u: "1f69c" },
|
|
{ n: ["racing car"], u: "1f3ce-fe0f" },
|
|
{ n: ["motorcycle", "racing motorcycle"], u: "1f3cd-fe0f" },
|
|
{ n: ["motor scooter"], u: "1f6f5" },
|
|
{ n: ["manual wheelchair"], u: "1f9bd" },
|
|
{ n: ["motorized wheelchair"], u: "1f9bc" },
|
|
{ n: ["auto rickshaw"], u: "1f6fa" },
|
|
{ n: ["bike", "bicycle"], u: "1f6b2" },
|
|
{ n: ["scooter"], u: "1f6f4" },
|
|
{ n: ["skateboard"], u: "1f6f9" },
|
|
{ n: ["roller skate"], u: "1f6fc" },
|
|
{ n: ["busstop", "bus stop"], u: "1f68f" },
|
|
{ n: ["motorway"], u: "1f6e3-fe0f" },
|
|
{ n: ["railway track"], u: "1f6e4-fe0f" },
|
|
{ n: ["oil drum"], u: "1f6e2-fe0f" },
|
|
{ n: ["fuelpump", "fuel pump"], u: "26fd" },
|
|
{ n: ["wheel"], u: "1f6de" },
|
|
{ n: ["rotating light", "police cars revolving light"], u: "1f6a8" },
|
|
{ n: ["traffic light", "horizontal traffic light"], u: "1f6a5" },
|
|
{ n: ["vertical traffic light"], u: "1f6a6" },
|
|
{ n: ["octagonal sign"], u: "1f6d1" },
|
|
{ n: ["construction", "construction sign"], u: "1f6a7" },
|
|
{ n: ["anchor"], u: "2693" },
|
|
{ n: ["ring buoy"], u: "1f6df" },
|
|
{ n: ["boat", "sailboat"], u: "26f5" },
|
|
{ n: ["canoe"], u: "1f6f6" },
|
|
{ n: ["speedboat"], u: "1f6a4" },
|
|
{ n: ["passenger ship"], u: "1f6f3-fe0f" },
|
|
{ n: ["ferry"], u: "26f4-fe0f" },
|
|
{ n: ["motor boat"], u: "1f6e5-fe0f" },
|
|
{ n: ["ship"], u: "1f6a2" },
|
|
{ n: ["airplane"], u: "2708-fe0f" },
|
|
{ n: ["small airplane"], u: "1f6e9-fe0f" },
|
|
{ n: ["airplane departure"], u: "1f6eb" },
|
|
{ n: ["airplane arriving"], u: "1f6ec" },
|
|
{ n: ["parachute"], u: "1fa82" },
|
|
{ n: ["seat"], u: "1f4ba" },
|
|
{ n: ["helicopter"], u: "1f681" },
|
|
{ n: ["suspension railway"], u: "1f69f" },
|
|
{ n: ["mountain cableway"], u: "1f6a0" },
|
|
{ n: ["aerial tramway"], u: "1f6a1" },
|
|
{ n: ["satellite"], u: "1f6f0-fe0f" },
|
|
{ n: ["rocket"], u: "1f680" },
|
|
{ n: ["flying saucer"], u: "1f6f8" },
|
|
{ n: ["bellhop bell"], u: "1f6ce-fe0f" },
|
|
{ n: ["luggage"], u: "1f9f3" },
|
|
{ n: ["hourglass"], u: "231b" },
|
|
{ n: ["hourglass flowing sand", "hourglass with flowing sand"], u: "23f3" },
|
|
{ n: ["watch"], u: "231a" },
|
|
{ n: ["alarm clock"], u: "23f0" },
|
|
{ n: ["stopwatch"], u: "23f1-fe0f" },
|
|
{ n: ["timer clock"], u: "23f2-fe0f" },
|
|
{ n: ["mantelpiece clock"], u: "1f570-fe0f" },
|
|
{ n: ["clock12", "clock face twelve oclock"], u: "1f55b" },
|
|
{ n: ["clock1230", "clock face twelve-thirty"], u: "1f567" },
|
|
{ n: ["clock1", "clock face one oclock"], u: "1f550" },
|
|
{ n: ["clock130", "clock face one-thirty"], u: "1f55c" },
|
|
{ n: ["clock2", "clock face two oclock"], u: "1f551" },
|
|
{ n: ["clock230", "clock face two-thirty"], u: "1f55d" },
|
|
{ n: ["clock3", "clock face three oclock"], u: "1f552" },
|
|
{ n: ["clock330", "clock face three-thirty"], u: "1f55e" },
|
|
{ n: ["clock4", "clock face four oclock"], u: "1f553" },
|
|
{ n: ["clock430", "clock face four-thirty"], u: "1f55f" },
|
|
{ n: ["clock5", "clock face five oclock"], u: "1f554" },
|
|
{ n: ["clock530", "clock face five-thirty"], u: "1f560" },
|
|
{ n: ["clock6", "clock face six oclock"], u: "1f555" },
|
|
{ n: ["clock630", "clock face six-thirty"], u: "1f561" },
|
|
{ n: ["clock7", "clock face seven oclock"], u: "1f556" },
|
|
{ n: ["clock730", "clock face seven-thirty"], u: "1f562" },
|
|
{ n: ["clock8", "clock face eight oclock"], u: "1f557" },
|
|
{ n: ["clock830", "clock face eight-thirty"], u: "1f563" },
|
|
{ n: ["clock9", "clock face nine oclock"], u: "1f558" },
|
|
{ n: ["clock930", "clock face nine-thirty"], u: "1f564" },
|
|
{ n: ["clock10", "clock face ten oclock"], u: "1f559" },
|
|
{ n: ["clock1030", "clock face ten-thirty"], u: "1f565" },
|
|
{ n: ["clock11", "clock face eleven oclock"], u: "1f55a" },
|
|
{ n: ["clock1130", "clock face eleven-thirty"], u: "1f566" },
|
|
{ n: ["new moon", "new moon symbol"], u: "1f311" },
|
|
{ n: ["waxing crescent moon", "waxing crescent moon symbol"], u: "1f312" },
|
|
{ n: ["first quarter moon", "first quarter moon symbol"], u: "1f313" },
|
|
{
|
|
n: ["moon", "waxing gibbous moon", "waxing gibbous moon symbol"],
|
|
u: "1f314"
|
|
},
|
|
{ n: ["full moon", "full moon symbol"], u: "1f315" },
|
|
{ n: ["waning gibbous moon", "waning gibbous moon symbol"], u: "1f316" },
|
|
{ n: ["last quarter moon", "last quarter moon symbol"], u: "1f317" },
|
|
{ n: ["waning crescent moon", "waning crescent moon symbol"], u: "1f318" },
|
|
{ n: ["crescent moon"], u: "1f319" },
|
|
{ n: ["new moon with face"], u: "1f31a" },
|
|
{ n: ["first quarter moon with face"], u: "1f31b" },
|
|
{ n: ["last quarter moon with face"], u: "1f31c" },
|
|
{ n: ["thermometer"], u: "1f321-fe0f" },
|
|
{ n: ["sunny", "black sun with rays"], u: "2600-fe0f" },
|
|
{ n: ["full moon with face"], u: "1f31d" },
|
|
{ n: ["sun with face"], u: "1f31e" },
|
|
{ n: ["ringed planet"], u: "1fa90" },
|
|
{ n: ["star", "white medium star"], u: "2b50" },
|
|
{ n: ["star2", "glowing star"], u: "1f31f" },
|
|
{ n: ["stars", "shooting star"], u: "1f320" },
|
|
{ n: ["milky way"], u: "1f30c" },
|
|
{ n: ["cloud"], u: "2601-fe0f" },
|
|
{ n: ["partly sunny", "sun behind cloud"], u: "26c5" },
|
|
{
|
|
n: ["thunder cloud and rain", "cloud with lightning and rain"],
|
|
u: "26c8-fe0f"
|
|
},
|
|
{
|
|
n: ["mostly sunny", "sun small cloud", "sun behind small cloud"],
|
|
u: "1f324-fe0f"
|
|
},
|
|
{
|
|
n: ["barely sunny", "sun behind cloud", "sun behind large cloud"],
|
|
u: "1f325-fe0f"
|
|
},
|
|
{ n: ["partly sunny rain", "sun behind rain cloud"], u: "1f326-fe0f" },
|
|
{ n: ["rain cloud", "cloud with rain"], u: "1f327-fe0f" },
|
|
{ n: ["snow cloud", "cloud with snow"], u: "1f328-fe0f" },
|
|
{
|
|
n: ["lightning", "lightning cloud", "cloud with lightning"],
|
|
u: "1f329-fe0f"
|
|
},
|
|
{ n: ["tornado", "tornado cloud"], u: "1f32a-fe0f" },
|
|
{ n: ["fog"], u: "1f32b-fe0f" },
|
|
{ n: ["wind face", "wind blowing face"], u: "1f32c-fe0f" },
|
|
{ n: ["cyclone"], u: "1f300" },
|
|
{ n: ["rainbow"], u: "1f308" },
|
|
{ n: ["closed umbrella"], u: "1f302" },
|
|
{ n: ["umbrella"], u: "2602-fe0f" },
|
|
{ n: ["umbrella with rain drops"], u: "2614" },
|
|
{ n: ["umbrella on ground"], u: "26f1-fe0f" },
|
|
{ n: ["zap", "high voltage sign"], u: "26a1" },
|
|
{ n: ["snowflake"], u: "2744-fe0f" },
|
|
{ n: ["snowman"], u: "2603-fe0f" },
|
|
{ n: ["snowman without snow"], u: "26c4" },
|
|
{ n: ["comet"], u: "2604-fe0f" },
|
|
{ n: ["fire"], u: "1f525" },
|
|
{ n: ["droplet"], u: "1f4a7" },
|
|
{ n: ["ocean", "water wave"], u: "1f30a" }
|
|
],
|
|
activities: [
|
|
{ n: ["jack-o-lantern", "jack o lantern"], u: "1f383" },
|
|
{ n: ["christmas tree"], u: "1f384" },
|
|
{ n: ["fireworks"], u: "1f386" },
|
|
{ n: ["sparkler", "firework sparkler"], u: "1f387" },
|
|
{ n: ["firecracker"], u: "1f9e8" },
|
|
{ n: ["sparkles"], u: "2728" },
|
|
{ n: ["balloon"], u: "1f388" },
|
|
{ n: ["tada", "party popper"], u: "1f389" },
|
|
{ n: ["confetti ball"], u: "1f38a" },
|
|
{ n: ["tanabata tree"], u: "1f38b" },
|
|
{ n: ["bamboo", "pine decoration"], u: "1f38d" },
|
|
{ n: ["dolls", "japanese dolls"], u: "1f38e" },
|
|
{ n: ["flags", "carp streamer"], u: "1f38f" },
|
|
{ n: ["wind chime"], u: "1f390" },
|
|
{ n: ["rice scene", "moon viewing ceremony"], u: "1f391" },
|
|
{ n: ["red envelope", "red gift envelope"], u: "1f9e7" },
|
|
{ n: ["ribbon"], u: "1f380" },
|
|
{ n: ["gift", "wrapped present"], u: "1f381" },
|
|
{ n: ["reminder ribbon"], u: "1f397-fe0f" },
|
|
{ n: ["admission tickets"], u: "1f39f-fe0f" },
|
|
{ n: ["ticket"], u: "1f3ab" },
|
|
{ n: ["medal", "military medal"], u: "1f396-fe0f" },
|
|
{ n: ["trophy"], u: "1f3c6" },
|
|
{ n: ["sports medal"], u: "1f3c5" },
|
|
{ n: ["first place medal"], u: "1f947" },
|
|
{ n: ["second place medal"], u: "1f948" },
|
|
{ n: ["third place medal"], u: "1f949" },
|
|
{ n: ["soccer", "soccer ball"], u: "26bd" },
|
|
{ n: ["baseball"], u: "26be" },
|
|
{ n: ["softball"], u: "1f94e" },
|
|
{ n: ["basketball", "basketball and hoop"], u: "1f3c0" },
|
|
{ n: ["volleyball"], u: "1f3d0" },
|
|
{ n: ["football", "american football"], u: "1f3c8" },
|
|
{ n: ["rugby football"], u: "1f3c9" },
|
|
{ n: ["tennis", "tennis racquet and ball"], u: "1f3be" },
|
|
{ n: ["flying disc"], u: "1f94f" },
|
|
{ n: ["bowling"], u: "1f3b3" },
|
|
{ n: ["cricket bat and ball"], u: "1f3cf" },
|
|
{ n: ["field hockey stick and ball"], u: "1f3d1" },
|
|
{ n: ["ice hockey stick and puck"], u: "1f3d2" },
|
|
{ n: ["lacrosse", "lacrosse stick and ball"], u: "1f94d" },
|
|
{ n: ["table tennis paddle and ball"], u: "1f3d3" },
|
|
{ n: ["badminton racquet and shuttlecock"], u: "1f3f8" },
|
|
{ n: ["boxing glove"], u: "1f94a" },
|
|
{ n: ["martial arts uniform"], u: "1f94b" },
|
|
{ n: ["goal net"], u: "1f945" },
|
|
{ n: ["golf", "flag in hole"], u: "26f3" },
|
|
{ n: ["ice skate"], u: "26f8-fe0f" },
|
|
{ n: ["fishing pole and fish"], u: "1f3a3" },
|
|
{ n: ["diving mask"], u: "1f93f" },
|
|
{ n: ["running shirt with sash"], u: "1f3bd" },
|
|
{ n: ["ski", "ski and ski boot"], u: "1f3bf" },
|
|
{ n: ["sled"], u: "1f6f7" },
|
|
{ n: ["curling stone"], u: "1f94c" },
|
|
{ n: ["dart", "direct hit"], u: "1f3af" },
|
|
{ n: ["yo-yo"], u: "1fa80" },
|
|
{ n: ["kite"], u: "1fa81" },
|
|
{ n: ["8ball", "billiards"], u: "1f3b1" },
|
|
{ n: ["crystal ball"], u: "1f52e" },
|
|
{ n: ["magic wand"], u: "1fa84" },
|
|
{ n: ["nazar amulet"], u: "1f9ff" },
|
|
{ n: ["hamsa"], u: "1faac" },
|
|
{ n: ["video game"], u: "1f3ae" },
|
|
{ n: ["joystick"], u: "1f579-fe0f" },
|
|
{ n: ["slot machine"], u: "1f3b0" },
|
|
{ n: ["game die"], u: "1f3b2" },
|
|
{ n: ["jigsaw", "jigsaw puzzle piece"], u: "1f9e9" },
|
|
{ n: ["teddy bear"], u: "1f9f8" },
|
|
{ n: ["pinata"], u: "1fa85" },
|
|
{ n: ["mirror ball"], u: "1faa9" },
|
|
{ n: ["nesting dolls"], u: "1fa86" },
|
|
{ n: ["spades", "black spade suit"], u: "2660-fe0f" },
|
|
{ n: ["hearts", "black heart suit"], u: "2665-fe0f" },
|
|
{ n: ["diamonds", "black diamond suit"], u: "2666-fe0f" },
|
|
{ n: ["clubs", "black club suit"], u: "2663-fe0f" },
|
|
{ n: ["chess pawn"], u: "265f-fe0f" },
|
|
{ n: ["black joker", "playing card black joker"], u: "1f0cf" },
|
|
{ n: ["mahjong", "mahjong tile red dragon"], u: "1f004" },
|
|
{ n: ["flower playing cards"], u: "1f3b4" },
|
|
{ n: ["performing arts"], u: "1f3ad" },
|
|
{ n: ["framed picture", "frame with picture"], u: "1f5bc-fe0f" },
|
|
{ n: ["art", "artist palette"], u: "1f3a8" },
|
|
{ n: ["thread", "spool of thread"], u: "1f9f5" },
|
|
{ n: ["sewing needle"], u: "1faa1" },
|
|
{ n: ["yarn", "ball of yarn"], u: "1f9f6" },
|
|
{ n: ["knot"], u: "1faa2" }
|
|
],
|
|
objects: [
|
|
{ n: ["eyeglasses"], u: "1f453" },
|
|
{ n: ["sunglasses", "dark sunglasses"], u: "1f576-fe0f" },
|
|
{ n: ["goggles"], u: "1f97d" },
|
|
{ n: ["lab coat"], u: "1f97c" },
|
|
{ n: ["safety vest"], u: "1f9ba" },
|
|
{ n: ["necktie"], u: "1f454" },
|
|
{ n: ["shirt", "tshirt", "t-shirt"], u: "1f455" },
|
|
{ n: ["jeans"], u: "1f456" },
|
|
{ n: ["scarf"], u: "1f9e3" },
|
|
{ n: ["gloves"], u: "1f9e4" },
|
|
{ n: ["coat"], u: "1f9e5" },
|
|
{ n: ["socks"], u: "1f9e6" },
|
|
{ n: ["dress"], u: "1f457" },
|
|
{ n: ["kimono"], u: "1f458" },
|
|
{ n: ["sari"], u: "1f97b" },
|
|
{ n: ["one-piece swimsuit"], u: "1fa71" },
|
|
{ n: ["briefs"], u: "1fa72" },
|
|
{ n: ["shorts"], u: "1fa73" },
|
|
{ n: ["bikini"], u: "1f459" },
|
|
{ n: ["womans clothes"], u: "1f45a" },
|
|
{ n: ["purse"], u: "1f45b" },
|
|
{ n: ["handbag"], u: "1f45c" },
|
|
{ n: ["pouch"], u: "1f45d" },
|
|
{ n: ["shopping bags"], u: "1f6cd-fe0f" },
|
|
{ n: ["school satchel"], u: "1f392" },
|
|
{ n: ["thong sandal"], u: "1fa74" },
|
|
{ n: ["shoe", "mans shoe"], u: "1f45e" },
|
|
{ n: ["athletic shoe"], u: "1f45f" },
|
|
{ n: ["hiking boot"], u: "1f97e" },
|
|
{ n: ["flat shoe", "womans flat shoe"], u: "1f97f" },
|
|
{ n: ["high heel", "high-heeled shoe"], u: "1f460" },
|
|
{ n: ["sandal", "womans sandal"], u: "1f461" },
|
|
{ n: ["ballet shoes"], u: "1fa70" },
|
|
{ n: ["boot", "womans boots"], u: "1f462" },
|
|
{ n: ["crown"], u: "1f451" },
|
|
{ n: ["womans hat"], u: "1f452" },
|
|
{ n: ["tophat", "top hat"], u: "1f3a9" },
|
|
{ n: ["mortar board", "graduation cap"], u: "1f393" },
|
|
{ n: ["billed cap"], u: "1f9e2" },
|
|
{ n: ["military helmet"], u: "1fa96" },
|
|
{
|
|
n: ["rescue worker\u2019s helmet", "helmet with white cross"],
|
|
u: "26d1-fe0f"
|
|
},
|
|
{ n: ["prayer beads"], u: "1f4ff" },
|
|
{ n: ["lipstick"], u: "1f484" },
|
|
{ n: ["ring"], u: "1f48d" },
|
|
{ n: ["gem", "gem stone"], u: "1f48e" },
|
|
{ n: ["mute", "speaker with cancellation stroke"], u: "1f507" },
|
|
{ n: ["speaker"], u: "1f508" },
|
|
{ n: ["sound", "speaker with one sound wave"], u: "1f509" },
|
|
{ n: ["loud sound", "speaker with three sound waves"], u: "1f50a" },
|
|
{ n: ["loudspeaker", "public address loudspeaker"], u: "1f4e2" },
|
|
{ n: ["mega", "cheering megaphone"], u: "1f4e3" },
|
|
{ n: ["postal horn"], u: "1f4ef" },
|
|
{ n: ["bell"], u: "1f514" },
|
|
{ n: ["no bell", "bell with cancellation stroke"], u: "1f515" },
|
|
{ n: ["musical score"], u: "1f3bc" },
|
|
{ n: ["musical note"], u: "1f3b5" },
|
|
{ n: ["notes", "multiple musical notes"], u: "1f3b6" },
|
|
{ n: ["studio microphone"], u: "1f399-fe0f" },
|
|
{ n: ["level slider"], u: "1f39a-fe0f" },
|
|
{ n: ["control knobs"], u: "1f39b-fe0f" },
|
|
{ n: ["microphone"], u: "1f3a4" },
|
|
{ n: ["headphone", "headphones"], u: "1f3a7" },
|
|
{ n: ["radio"], u: "1f4fb" },
|
|
{ n: ["saxophone"], u: "1f3b7" },
|
|
{ n: ["accordion"], u: "1fa97" },
|
|
{ n: ["guitar"], u: "1f3b8" },
|
|
{ n: ["musical keyboard"], u: "1f3b9" },
|
|
{ n: ["trumpet"], u: "1f3ba" },
|
|
{ n: ["violin"], u: "1f3bb" },
|
|
{ n: ["banjo"], u: "1fa95" },
|
|
{ n: ["drum with drumsticks"], u: "1f941" },
|
|
{ n: ["long drum"], u: "1fa98" },
|
|
{ n: ["iphone", "mobile phone"], u: "1f4f1" },
|
|
{
|
|
n: ["calling", "mobile phone with rightwards arrow at left"],
|
|
u: "1f4f2"
|
|
},
|
|
{ n: ["phone", "telephone", "black telephone"], u: "260e-fe0f" },
|
|
{ n: ["telephone receiver"], u: "1f4de" },
|
|
{ n: ["pager"], u: "1f4df" },
|
|
{ n: ["fax", "fax machine"], u: "1f4e0" },
|
|
{ n: ["battery"], u: "1f50b" },
|
|
{ n: ["low battery"], u: "1faab" },
|
|
{ n: ["electric plug"], u: "1f50c" },
|
|
{ n: ["computer", "personal computer"], u: "1f4bb" },
|
|
{ n: ["desktop computer"], u: "1f5a5-fe0f" },
|
|
{ n: ["printer"], u: "1f5a8-fe0f" },
|
|
{ n: ["keyboard"], u: "2328-fe0f" },
|
|
{ n: ["computer mouse", "three button mouse"], u: "1f5b1-fe0f" },
|
|
{ n: ["trackball"], u: "1f5b2-fe0f" },
|
|
{ n: ["minidisc"], u: "1f4bd" },
|
|
{ n: ["floppy disk"], u: "1f4be" },
|
|
{ n: ["cd", "optical disc"], u: "1f4bf" },
|
|
{ n: ["dvd"], u: "1f4c0" },
|
|
{ n: ["abacus"], u: "1f9ee" },
|
|
{ n: ["movie camera"], u: "1f3a5" },
|
|
{ n: ["film frames"], u: "1f39e-fe0f" },
|
|
{ n: ["film projector"], u: "1f4fd-fe0f" },
|
|
{ n: ["clapper", "clapper board"], u: "1f3ac" },
|
|
{ n: ["tv", "television"], u: "1f4fa" },
|
|
{ n: ["camera"], u: "1f4f7" },
|
|
{ n: ["camera with flash"], u: "1f4f8" },
|
|
{ n: ["video camera"], u: "1f4f9" },
|
|
{ n: ["vhs", "videocassette"], u: "1f4fc" },
|
|
{ n: ["mag", "left-pointing magnifying glass"], u: "1f50d" },
|
|
{ n: ["mag right", "right-pointing magnifying glass"], u: "1f50e" },
|
|
{ n: ["candle"], u: "1f56f-fe0f" },
|
|
{ n: ["bulb", "electric light bulb"], u: "1f4a1" },
|
|
{ n: ["flashlight", "electric torch"], u: "1f526" },
|
|
{ n: ["lantern", "izakaya lantern"], u: "1f3ee" },
|
|
{ n: ["diya lamp"], u: "1fa94" },
|
|
{ n: ["notebook with decorative cover"], u: "1f4d4" },
|
|
{ n: ["closed book"], u: "1f4d5" },
|
|
{ n: ["book", "open book"], u: "1f4d6" },
|
|
{ n: ["green book"], u: "1f4d7" },
|
|
{ n: ["blue book"], u: "1f4d8" },
|
|
{ n: ["orange book"], u: "1f4d9" },
|
|
{ n: ["books"], u: "1f4da" },
|
|
{ n: ["notebook"], u: "1f4d3" },
|
|
{ n: ["ledger"], u: "1f4d2" },
|
|
{ n: ["page with curl"], u: "1f4c3" },
|
|
{ n: ["scroll"], u: "1f4dc" },
|
|
{ n: ["page facing up"], u: "1f4c4" },
|
|
{ n: ["newspaper"], u: "1f4f0" },
|
|
{ n: ["rolled-up newspaper", "rolled up newspaper"], u: "1f5de-fe0f" },
|
|
{ n: ["bookmark tabs"], u: "1f4d1" },
|
|
{ n: ["bookmark"], u: "1f516" },
|
|
{ n: ["label"], u: "1f3f7-fe0f" },
|
|
{ n: ["moneybag", "money bag"], u: "1f4b0" },
|
|
{ n: ["coin"], u: "1fa99" },
|
|
{ n: ["yen", "banknote with yen sign"], u: "1f4b4" },
|
|
{ n: ["dollar", "banknote with dollar sign"], u: "1f4b5" },
|
|
{ n: ["euro", "banknote with euro sign"], u: "1f4b6" },
|
|
{ n: ["pound", "banknote with pound sign"], u: "1f4b7" },
|
|
{ n: ["money with wings"], u: "1f4b8" },
|
|
{ n: ["credit card"], u: "1f4b3" },
|
|
{ n: ["receipt"], u: "1f9fe" },
|
|
{ n: ["chart", "chart with upwards trend and yen sign"], u: "1f4b9" },
|
|
{ n: ["email", "envelope"], u: "2709-fe0f" },
|
|
{ n: ["e-mail", "e-mail symbol"], u: "1f4e7" },
|
|
{ n: ["incoming envelope"], u: "1f4e8" },
|
|
{
|
|
n: ["envelope with arrow", "envelope with downwards arrow above"],
|
|
u: "1f4e9"
|
|
},
|
|
{ n: ["outbox tray"], u: "1f4e4" },
|
|
{ n: ["inbox tray"], u: "1f4e5" },
|
|
{ n: ["package"], u: "1f4e6" },
|
|
{ n: ["mailbox", "closed mailbox with raised flag"], u: "1f4eb" },
|
|
{ n: ["mailbox closed", "closed mailbox with lowered flag"], u: "1f4ea" },
|
|
{ n: ["mailbox with mail", "open mailbox with raised flag"], u: "1f4ec" },
|
|
{
|
|
n: ["mailbox with no mail", "open mailbox with lowered flag"],
|
|
u: "1f4ed"
|
|
},
|
|
{ n: ["postbox"], u: "1f4ee" },
|
|
{ n: ["ballot box with ballot"], u: "1f5f3-fe0f" },
|
|
{ n: ["pencil", "pencil2"], u: "270f-fe0f" },
|
|
{ n: ["black nib"], u: "2712-fe0f" },
|
|
{ n: ["fountain pen", "lower left fountain pen"], u: "1f58b-fe0f" },
|
|
{ n: ["pen", "lower left ballpoint pen"], u: "1f58a-fe0f" },
|
|
{ n: ["paintbrush", "lower left paintbrush"], u: "1f58c-fe0f" },
|
|
{ n: ["crayon", "lower left crayon"], u: "1f58d-fe0f" },
|
|
{ n: ["memo", "pencil"], u: "1f4dd" },
|
|
{ n: ["briefcase"], u: "1f4bc" },
|
|
{ n: ["file folder"], u: "1f4c1" },
|
|
{ n: ["open file folder"], u: "1f4c2" },
|
|
{ n: ["card index dividers"], u: "1f5c2-fe0f" },
|
|
{ n: ["date", "calendar"], u: "1f4c5" },
|
|
{ n: ["calendar", "tear-off calendar"], u: "1f4c6" },
|
|
{ n: ["spiral notepad", "spiral note pad"], u: "1f5d2-fe0f" },
|
|
{ n: ["spiral calendar", "spiral calendar pad"], u: "1f5d3-fe0f" },
|
|
{ n: ["card index"], u: "1f4c7" },
|
|
{ n: ["chart with upwards trend"], u: "1f4c8" },
|
|
{ n: ["chart with downwards trend"], u: "1f4c9" },
|
|
{ n: ["bar chart"], u: "1f4ca" },
|
|
{ n: ["clipboard"], u: "1f4cb" },
|
|
{ n: ["pushpin"], u: "1f4cc" },
|
|
{ n: ["round pushpin"], u: "1f4cd" },
|
|
{ n: ["paperclip"], u: "1f4ce" },
|
|
{ n: ["linked paperclips"], u: "1f587-fe0f" },
|
|
{ n: ["straight ruler"], u: "1f4cf" },
|
|
{ n: ["triangular ruler"], u: "1f4d0" },
|
|
{ n: ["scissors", "black scissors"], u: "2702-fe0f" },
|
|
{ n: ["card file box"], u: "1f5c3-fe0f" },
|
|
{ n: ["file cabinet"], u: "1f5c4-fe0f" },
|
|
{ n: ["wastebasket"], u: "1f5d1-fe0f" },
|
|
{ n: ["lock"], u: "1f512" },
|
|
{ n: ["unlock", "open lock"], u: "1f513" },
|
|
{ n: ["lock with ink pen"], u: "1f50f" },
|
|
{ n: ["closed lock with key"], u: "1f510" },
|
|
{ n: ["key"], u: "1f511" },
|
|
{ n: ["old key"], u: "1f5dd-fe0f" },
|
|
{ n: ["hammer"], u: "1f528" },
|
|
{ n: ["axe"], u: "1fa93" },
|
|
{ n: ["pick"], u: "26cf-fe0f" },
|
|
{ n: ["hammer and pick"], u: "2692-fe0f" },
|
|
{ n: ["hammer and wrench"], u: "1f6e0-fe0f" },
|
|
{ n: ["dagger", "dagger knife"], u: "1f5e1-fe0f" },
|
|
{ n: ["crossed swords"], u: "2694-fe0f" },
|
|
{ n: ["gun", "pistol"], u: "1f52b" },
|
|
{ n: ["boomerang"], u: "1fa83" },
|
|
{ n: ["bow and arrow"], u: "1f3f9" },
|
|
{ n: ["shield"], u: "1f6e1-fe0f" },
|
|
{ n: ["carpentry saw"], u: "1fa9a" },
|
|
{ n: ["wrench"], u: "1f527" },
|
|
{ n: ["screwdriver"], u: "1fa9b" },
|
|
{ n: ["nut and bolt"], u: "1f529" },
|
|
{ n: ["gear"], u: "2699-fe0f" },
|
|
{ n: ["clamp", "compression"], u: "1f5dc-fe0f" },
|
|
{ n: ["scales", "balance scale"], u: "2696-fe0f" },
|
|
{ n: ["probing cane"], u: "1f9af" },
|
|
{ n: ["link", "link symbol"], u: "1f517" },
|
|
{ n: ["chains"], u: "26d3-fe0f" },
|
|
{ n: ["hook"], u: "1fa9d" },
|
|
{ n: ["toolbox"], u: "1f9f0" },
|
|
{ n: ["magnet"], u: "1f9f2" },
|
|
{ n: ["ladder"], u: "1fa9c" },
|
|
{ n: ["alembic"], u: "2697-fe0f" },
|
|
{ n: ["test tube"], u: "1f9ea" },
|
|
{ n: ["petri dish"], u: "1f9eb" },
|
|
{ n: ["dna", "dna double helix"], u: "1f9ec" },
|
|
{ n: ["microscope"], u: "1f52c" },
|
|
{ n: ["telescope"], u: "1f52d" },
|
|
{ n: ["satellite antenna"], u: "1f4e1" },
|
|
{ n: ["syringe"], u: "1f489" },
|
|
{ n: ["drop of blood"], u: "1fa78" },
|
|
{ n: ["pill"], u: "1f48a" },
|
|
{ n: ["adhesive bandage"], u: "1fa79" },
|
|
{ n: ["crutch"], u: "1fa7c" },
|
|
{ n: ["stethoscope"], u: "1fa7a" },
|
|
{ n: ["x-ray"], u: "1fa7b" },
|
|
{ n: ["door"], u: "1f6aa" },
|
|
{ n: ["elevator"], u: "1f6d7" },
|
|
{ n: ["mirror"], u: "1fa9e" },
|
|
{ n: ["window"], u: "1fa9f" },
|
|
{ n: ["bed"], u: "1f6cf-fe0f" },
|
|
{ n: ["couch and lamp"], u: "1f6cb-fe0f" },
|
|
{ n: ["chair"], u: "1fa91" },
|
|
{ n: ["toilet"], u: "1f6bd" },
|
|
{ n: ["plunger"], u: "1faa0" },
|
|
{ n: ["shower"], u: "1f6bf" },
|
|
{ n: ["bathtub"], u: "1f6c1" },
|
|
{ n: ["mouse trap"], u: "1faa4" },
|
|
{ n: ["razor"], u: "1fa92" },
|
|
{ n: ["lotion bottle"], u: "1f9f4" },
|
|
{ n: ["safety pin"], u: "1f9f7" },
|
|
{ n: ["broom"], u: "1f9f9" },
|
|
{ n: ["basket"], u: "1f9fa" },
|
|
{ n: ["roll of paper"], u: "1f9fb" },
|
|
{ n: ["bucket"], u: "1faa3" },
|
|
{ n: ["soap", "bar of soap"], u: "1f9fc" },
|
|
{ n: ["bubbles"], u: "1fae7" },
|
|
{ n: ["toothbrush"], u: "1faa5" },
|
|
{ n: ["sponge"], u: "1f9fd" },
|
|
{ n: ["fire extinguisher"], u: "1f9ef" },
|
|
{ n: ["shopping trolley"], u: "1f6d2" },
|
|
{ n: ["smoking", "smoking symbol"], u: "1f6ac" },
|
|
{ n: ["coffin"], u: "26b0-fe0f" },
|
|
{ n: ["headstone"], u: "1faa6" },
|
|
{ n: ["funeral urn"], u: "26b1-fe0f" },
|
|
{ n: ["moyai"], u: "1f5ff" },
|
|
{ n: ["placard"], u: "1faa7" },
|
|
{ n: ["identification card"], u: "1faaa" }
|
|
],
|
|
symbols: [
|
|
{ n: ["atm", "automated teller machine"], u: "1f3e7" },
|
|
{
|
|
n: ["put litter in its place", "put litter in its place symbol"],
|
|
u: "1f6ae"
|
|
},
|
|
{ n: ["potable water", "potable water symbol"], u: "1f6b0" },
|
|
{ n: ["wheelchair", "wheelchair symbol"], u: "267f" },
|
|
{ n: ["mens", "mens symbol"], u: "1f6b9" },
|
|
{ n: ["womens", "womens symbol"], u: "1f6ba" },
|
|
{ n: ["restroom"], u: "1f6bb" },
|
|
{ n: ["baby symbol"], u: "1f6bc" },
|
|
{ n: ["wc", "water closet"], u: "1f6be" },
|
|
{ n: ["passport control"], u: "1f6c2" },
|
|
{ n: ["customs"], u: "1f6c3" },
|
|
{ n: ["baggage claim"], u: "1f6c4" },
|
|
{ n: ["left luggage"], u: "1f6c5" },
|
|
{ n: ["warning", "warning sign"], u: "26a0-fe0f" },
|
|
{ n: ["children crossing"], u: "1f6b8" },
|
|
{ n: ["no entry"], u: "26d4" },
|
|
{ n: ["no entry sign"], u: "1f6ab" },
|
|
{ n: ["no bicycles"], u: "1f6b3" },
|
|
{ n: ["no smoking", "no smoking symbol"], u: "1f6ad" },
|
|
{ n: ["do not litter", "do not litter symbol"], u: "1f6af" },
|
|
{ n: ["non-potable water", "non-potable water symbol"], u: "1f6b1" },
|
|
{ n: ["no pedestrians"], u: "1f6b7" },
|
|
{ n: ["no mobile phones"], u: "1f4f5" },
|
|
{ n: ["underage", "no one under eighteen symbol"], u: "1f51e" },
|
|
{ n: ["radioactive", "radioactive sign"], u: "2622-fe0f" },
|
|
{ n: ["biohazard", "biohazard sign"], u: "2623-fe0f" },
|
|
{ n: ["arrow up", "upwards black arrow"], u: "2b06-fe0f" },
|
|
{ n: ["north east arrow", "arrow upper right"], u: "2197-fe0f" },
|
|
{ n: ["arrow right", "black rightwards arrow"], u: "27a1-fe0f" },
|
|
{ n: ["south east arrow", "arrow lower right"], u: "2198-fe0f" },
|
|
{ n: ["arrow down", "downwards black arrow"], u: "2b07-fe0f" },
|
|
{ n: ["south west arrow", "arrow lower left"], u: "2199-fe0f" },
|
|
{ n: ["arrow left", "leftwards black arrow"], u: "2b05-fe0f" },
|
|
{ n: ["north west arrow", "arrow upper left"], u: "2196-fe0f" },
|
|
{ n: ["up down arrow", "arrow up down"], u: "2195-fe0f" },
|
|
{ n: ["left right arrow"], u: "2194-fe0f" },
|
|
{ n: ["leftwards arrow with hook"], u: "21a9-fe0f" },
|
|
{ n: ["arrow right hook", "rightwards arrow with hook"], u: "21aa-fe0f" },
|
|
{
|
|
n: ["arrow heading up", "arrow pointing rightwards then curving upwards"],
|
|
u: "2934-fe0f"
|
|
},
|
|
{
|
|
n: [
|
|
"arrow heading down",
|
|
"arrow pointing rightwards then curving downwards"
|
|
],
|
|
u: "2935-fe0f"
|
|
},
|
|
{
|
|
n: [
|
|
"arrows clockwise",
|
|
"clockwise downwards and upwards open circle arrows"
|
|
],
|
|
u: "1f503"
|
|
},
|
|
{
|
|
n: [
|
|
"arrows counterclockwise",
|
|
"anticlockwise downwards and upwards open circle arrows"
|
|
],
|
|
u: "1f504"
|
|
},
|
|
{ n: ["back", "back with leftwards arrow above"], u: "1f519" },
|
|
{ n: ["end", "end with leftwards arrow above"], u: "1f51a" },
|
|
{
|
|
n: ["on", "on with exclamation mark with left right arrow above"],
|
|
u: "1f51b"
|
|
},
|
|
{ n: ["soon", "soon with rightwards arrow above"], u: "1f51c" },
|
|
{ n: ["top", "top with upwards arrow above"], u: "1f51d" },
|
|
{ n: ["place of worship"], u: "1f6d0" },
|
|
{ n: ["atom symbol"], u: "269b-fe0f" },
|
|
{ n: ["om", "om symbol"], u: "1f549-fe0f" },
|
|
{ n: ["star of david"], u: "2721-fe0f" },
|
|
{ n: ["wheel of dharma"], u: "2638-fe0f" },
|
|
{ n: ["yin yang"], u: "262f-fe0f" },
|
|
{ n: ["latin cross"], u: "271d-fe0f" },
|
|
{ n: ["orthodox cross"], u: "2626-fe0f" },
|
|
{ n: ["star and crescent"], u: "262a-fe0f" },
|
|
{ n: ["peace symbol"], u: "262e-fe0f" },
|
|
{ n: ["menorah with nine branches"], u: "1f54e" },
|
|
{ n: ["six pointed star", "six pointed star with middle dot"], u: "1f52f" },
|
|
{ n: ["aries"], u: "2648" },
|
|
{ n: ["taurus"], u: "2649" },
|
|
{ n: ["gemini"], u: "264a" },
|
|
{ n: ["cancer"], u: "264b" },
|
|
{ n: ["leo"], u: "264c" },
|
|
{ n: ["virgo"], u: "264d" },
|
|
{ n: ["libra"], u: "264e" },
|
|
{ n: ["scorpius"], u: "264f" },
|
|
{ n: ["sagittarius"], u: "2650" },
|
|
{ n: ["capricorn"], u: "2651" },
|
|
{ n: ["aquarius"], u: "2652" },
|
|
{ n: ["pisces"], u: "2653" },
|
|
{ n: ["ophiuchus"], u: "26ce" },
|
|
{ n: ["twisted rightwards arrows"], u: "1f500" },
|
|
{
|
|
n: ["repeat", "clockwise rightwards and leftwards open circle arrows"],
|
|
u: "1f501"
|
|
},
|
|
{
|
|
n: [
|
|
"repeat one",
|
|
"clockwise rightwards and leftwards open circle arrows with circled one overlay"
|
|
],
|
|
u: "1f502"
|
|
},
|
|
{ n: ["arrow forward", "black right-pointing triangle"], u: "25b6-fe0f" },
|
|
{ n: ["fast forward", "black right-pointing double triangle"], u: "23e9" },
|
|
{
|
|
n: [
|
|
"next track button",
|
|
"black right pointing double triangle with vertical bar"
|
|
],
|
|
u: "23ed-fe0f"
|
|
},
|
|
{
|
|
n: [
|
|
"play or pause button",
|
|
"black right pointing triangle with double vertical bar"
|
|
],
|
|
u: "23ef-fe0f"
|
|
},
|
|
{ n: ["arrow backward", "black left-pointing triangle"], u: "25c0-fe0f" },
|
|
{ n: ["rewind", "black left-pointing double triangle"], u: "23ea" },
|
|
{
|
|
n: [
|
|
"last track button",
|
|
"black left pointing double triangle with vertical bar"
|
|
],
|
|
u: "23ee-fe0f"
|
|
},
|
|
{ n: ["arrow up small", "up-pointing small red triangle"], u: "1f53c" },
|
|
{ n: ["arrow double up", "black up-pointing double triangle"], u: "23eb" },
|
|
{ n: ["arrow down small", "down-pointing small red triangle"], u: "1f53d" },
|
|
{
|
|
n: ["arrow double down", "black down-pointing double triangle"],
|
|
u: "23ec"
|
|
},
|
|
{ n: ["pause button", "double vertical bar"], u: "23f8-fe0f" },
|
|
{ n: ["stop button", "black square for stop"], u: "23f9-fe0f" },
|
|
{ n: ["record button", "black circle for record"], u: "23fa-fe0f" },
|
|
{ n: ["eject", "eject button"], u: "23cf-fe0f" },
|
|
{ n: ["cinema"], u: "1f3a6" },
|
|
{ n: ["low brightness", "low brightness symbol"], u: "1f505" },
|
|
{ n: ["high brightness", "high brightness symbol"], u: "1f506" },
|
|
{ n: ["signal strength", "antenna with bars"], u: "1f4f6" },
|
|
{ n: ["vibration mode"], u: "1f4f3" },
|
|
{ n: ["mobile phone off"], u: "1f4f4" },
|
|
{ n: ["female sign"], u: "2640-fe0f" },
|
|
{ n: ["male sign"], u: "2642-fe0f" },
|
|
{ n: ["transgender symbol"], u: "26a7-fe0f" },
|
|
{ n: ["heavy multiplication x"], u: "2716-fe0f" },
|
|
{ n: ["heavy plus sign"], u: "2795" },
|
|
{ n: ["heavy minus sign"], u: "2796" },
|
|
{ n: ["heavy division sign"], u: "2797" },
|
|
{ n: ["heavy equals sign"], u: "1f7f0" },
|
|
{ n: ["infinity"], u: "267e-fe0f" },
|
|
{ n: ["bangbang", "double exclamation mark"], u: "203c-fe0f" },
|
|
{ n: ["interrobang", "exclamation question mark"], u: "2049-fe0f" },
|
|
{ n: ["question", "black question mark ornament"], u: "2753" },
|
|
{ n: ["grey question", "white question mark ornament"], u: "2754" },
|
|
{ n: ["grey exclamation", "white exclamation mark ornament"], u: "2755" },
|
|
{
|
|
n: [
|
|
"exclamation",
|
|
"heavy exclamation mark",
|
|
"heavy exclamation mark symbol"
|
|
],
|
|
u: "2757"
|
|
},
|
|
{ n: ["wavy dash"], u: "3030-fe0f" },
|
|
{ n: ["currency exchange"], u: "1f4b1" },
|
|
{ n: ["heavy dollar sign"], u: "1f4b2" },
|
|
{ n: ["medical symbol", "staff of aesculapius"], u: "2695-fe0f" },
|
|
{ n: ["recycle", "black universal recycling symbol"], u: "267b-fe0f" },
|
|
{ n: ["fleur-de-lis", "fleur de lis"], u: "269c-fe0f" },
|
|
{ n: ["trident", "trident emblem"], u: "1f531" },
|
|
{ n: ["name badge"], u: "1f4db" },
|
|
{ n: ["beginner", "japanese symbol for beginner"], u: "1f530" },
|
|
{ n: ["o", "heavy large circle"], u: "2b55" },
|
|
{ n: ["white check mark", "white heavy check mark"], u: "2705" },
|
|
{ n: ["ballot box with check"], u: "2611-fe0f" },
|
|
{ n: ["heavy check mark"], u: "2714-fe0f" },
|
|
{ n: ["x", "cross mark"], u: "274c" },
|
|
{ n: ["negative squared cross mark"], u: "274e" },
|
|
{ n: ["curly loop"], u: "27b0" },
|
|
{ n: ["loop", "double curly loop"], u: "27bf" },
|
|
{ n: ["part alternation mark"], u: "303d-fe0f" },
|
|
{ n: ["eight spoked asterisk"], u: "2733-fe0f" },
|
|
{ n: ["eight pointed black star"], u: "2734-fe0f" },
|
|
{ n: ["sparkle"], u: "2747-fe0f" },
|
|
{ n: ["copyright", "copyright sign"], u: "00a9-fe0f" },
|
|
{ n: ["registered", "registered sign"], u: "00ae-fe0f" },
|
|
{ n: ["tm", "trade mark sign"], u: "2122-fe0f" },
|
|
{ n: ["hash", "hash key"], u: "0023-fe0f-20e3" },
|
|
{ n: ["keycap: *", "keycap star"], u: "002a-fe0f-20e3" },
|
|
{ n: ["zero", "keycap 0"], u: "0030-fe0f-20e3" },
|
|
{ n: ["one", "keycap 1"], u: "0031-fe0f-20e3" },
|
|
{ n: ["two", "keycap 2"], u: "0032-fe0f-20e3" },
|
|
{ n: ["three", "keycap 3"], u: "0033-fe0f-20e3" },
|
|
{ n: ["four", "keycap 4"], u: "0034-fe0f-20e3" },
|
|
{ n: ["five", "keycap 5"], u: "0035-fe0f-20e3" },
|
|
{ n: ["six", "keycap 6"], u: "0036-fe0f-20e3" },
|
|
{ n: ["seven", "keycap 7"], u: "0037-fe0f-20e3" },
|
|
{ n: ["eight", "keycap 8"], u: "0038-fe0f-20e3" },
|
|
{ n: ["nine", "keycap 9"], u: "0039-fe0f-20e3" },
|
|
{ n: ["keycap ten"], u: "1f51f" },
|
|
{
|
|
n: ["capital abcd", "input symbol for latin capital letters"],
|
|
u: "1f520"
|
|
},
|
|
{ n: ["abcd", "input symbol for latin small letters"], u: "1f521" },
|
|
{ n: ["1234", "input symbol for numbers"], u: "1f522" },
|
|
{ n: ["symbols", "input symbol for symbols"], u: "1f523" },
|
|
{ n: ["abc", "input symbol for latin letters"], u: "1f524" },
|
|
{ n: ["a", "negative squared latin capital letter a"], u: "1f170-fe0f" },
|
|
{ n: ["ab", "negative squared ab"], u: "1f18e" },
|
|
{ n: ["b", "negative squared latin capital letter b"], u: "1f171-fe0f" },
|
|
{ n: ["cl", "squared cl"], u: "1f191" },
|
|
{ n: ["cool", "squared cool"], u: "1f192" },
|
|
{ n: ["free", "squared free"], u: "1f193" },
|
|
{ n: ["information source"], u: "2139-fe0f" },
|
|
{ n: ["id", "squared id"], u: "1f194" },
|
|
{ n: ["m", "circled latin capital letter m"], u: "24c2-fe0f" },
|
|
{ n: ["new", "squared new"], u: "1f195" },
|
|
{ n: ["ng", "squared ng"], u: "1f196" },
|
|
{ n: ["o2", "negative squared latin capital letter o"], u: "1f17e-fe0f" },
|
|
{ n: ["ok", "squared ok"], u: "1f197" },
|
|
{
|
|
n: ["parking", "negative squared latin capital letter p"],
|
|
u: "1f17f-fe0f"
|
|
},
|
|
{ n: ["sos", "squared sos"], u: "1f198" },
|
|
{ n: ["up", "squared up with exclamation mark"], u: "1f199" },
|
|
{ n: ["vs", "squared vs"], u: "1f19a" },
|
|
{ n: ["koko", "squared katakana koko"], u: "1f201" },
|
|
{ n: ["sa", "squared katakana sa"], u: "1f202-fe0f" },
|
|
{ n: ["u6708", "squared cjk unified ideograph-6708"], u: "1f237-fe0f" },
|
|
{ n: ["u6709", "squared cjk unified ideograph-6709"], u: "1f236" },
|
|
{ n: ["u6307", "squared cjk unified ideograph-6307"], u: "1f22f" },
|
|
{ n: ["ideograph advantage", "circled ideograph advantage"], u: "1f250" },
|
|
{ n: ["u5272", "squared cjk unified ideograph-5272"], u: "1f239" },
|
|
{ n: ["u7121", "squared cjk unified ideograph-7121"], u: "1f21a" },
|
|
{ n: ["u7981", "squared cjk unified ideograph-7981"], u: "1f232" },
|
|
{ n: ["accept", "circled ideograph accept"], u: "1f251" },
|
|
{ n: ["u7533", "squared cjk unified ideograph-7533"], u: "1f238" },
|
|
{ n: ["u5408", "squared cjk unified ideograph-5408"], u: "1f234" },
|
|
{ n: ["u7a7a", "squared cjk unified ideograph-7a7a"], u: "1f233" },
|
|
{
|
|
n: ["congratulations", "circled ideograph congratulation"],
|
|
u: "3297-fe0f"
|
|
},
|
|
{ n: ["secret", "circled ideograph secret"], u: "3299-fe0f" },
|
|
{ n: ["u55b6", "squared cjk unified ideograph-55b6"], u: "1f23a" },
|
|
{ n: ["u6e80", "squared cjk unified ideograph-6e80"], u: "1f235" },
|
|
{ n: ["red circle", "large red circle"], u: "1f534" },
|
|
{ n: ["large orange circle"], u: "1f7e0" },
|
|
{ n: ["large yellow circle"], u: "1f7e1" },
|
|
{ n: ["large green circle"], u: "1f7e2" },
|
|
{ n: ["large blue circle"], u: "1f535" },
|
|
{ n: ["large purple circle"], u: "1f7e3" },
|
|
{ n: ["large brown circle"], u: "1f7e4" },
|
|
{ n: ["black circle", "medium black circle"], u: "26ab" },
|
|
{ n: ["white circle", "medium white circle"], u: "26aa" },
|
|
{ n: ["large red square"], u: "1f7e5" },
|
|
{ n: ["large orange square"], u: "1f7e7" },
|
|
{ n: ["large yellow square"], u: "1f7e8" },
|
|
{ n: ["large green square"], u: "1f7e9" },
|
|
{ n: ["large blue square"], u: "1f7e6" },
|
|
{ n: ["large purple square"], u: "1f7ea" },
|
|
{ n: ["large brown square"], u: "1f7eb" },
|
|
{ n: ["black large square"], u: "2b1b" },
|
|
{ n: ["white large square"], u: "2b1c" },
|
|
{ n: ["black medium square"], u: "25fc-fe0f" },
|
|
{ n: ["white medium square"], u: "25fb-fe0f" },
|
|
{ n: ["black medium small square"], u: "25fe" },
|
|
{ n: ["white medium small square"], u: "25fd" },
|
|
{ n: ["black small square"], u: "25aa-fe0f" },
|
|
{ n: ["white small square"], u: "25ab-fe0f" },
|
|
{ n: ["large orange diamond"], u: "1f536" },
|
|
{ n: ["large blue diamond"], u: "1f537" },
|
|
{ n: ["small orange diamond"], u: "1f538" },
|
|
{ n: ["small blue diamond"], u: "1f539" },
|
|
{ n: ["small red triangle", "up-pointing red triangle"], u: "1f53a" },
|
|
{
|
|
n: ["small red triangle down", "down-pointing red triangle"],
|
|
u: "1f53b"
|
|
},
|
|
{ n: ["diamond shape with a dot inside"], u: "1f4a0" },
|
|
{ n: ["radio button"], u: "1f518" },
|
|
{ n: ["white square button"], u: "1f533" },
|
|
{ n: ["black square button"], u: "1f532" }
|
|
],
|
|
flags: [
|
|
{ n: ["chequered flag", "checkered flag"], u: "1f3c1" },
|
|
{ n: ["triangular flag on post"], u: "1f6a9" },
|
|
{ n: ["crossed flags"], u: "1f38c" },
|
|
{ n: ["waving black flag"], u: "1f3f4" },
|
|
{ n: ["white flag", "waving white flag"], u: "1f3f3-fe0f" },
|
|
{ n: ["rainbow flag", "rainbow-flag"], u: "1f3f3-fe0f-200d-1f308" },
|
|
{ n: ["transgender flag"], u: "1f3f3-fe0f-200d-26a7-fe0f" },
|
|
{ n: ["pirate flag"], u: "1f3f4-200d-2620-fe0f" },
|
|
{ n: ["flag-ac", "ascension island flag"], u: "1f1e6-1f1e8" },
|
|
{ n: ["flag-ad", "andorra flag"], u: "1f1e6-1f1e9" },
|
|
{ n: ["flag-ae", "united arab emirates flag"], u: "1f1e6-1f1ea" },
|
|
{ n: ["flag-af", "afghanistan flag"], u: "1f1e6-1f1eb" },
|
|
{ n: ["flag-ag", "antigua & barbuda flag"], u: "1f1e6-1f1ec" },
|
|
{ n: ["flag-ai", "anguilla flag"], u: "1f1e6-1f1ee" },
|
|
{ n: ["flag-al", "albania flag"], u: "1f1e6-1f1f1" },
|
|
{ n: ["flag-am", "armenia flag"], u: "1f1e6-1f1f2" },
|
|
{ n: ["flag-ao", "angola flag"], u: "1f1e6-1f1f4" },
|
|
{ n: ["flag-aq", "antarctica flag"], u: "1f1e6-1f1f6" },
|
|
{ n: ["flag-ar", "argentina flag"], u: "1f1e6-1f1f7" },
|
|
{ n: ["flag-as", "american samoa flag"], u: "1f1e6-1f1f8" },
|
|
{ n: ["flag-at", "austria flag"], u: "1f1e6-1f1f9" },
|
|
{ n: ["flag-au", "australia flag"], u: "1f1e6-1f1fa" },
|
|
{ n: ["flag-aw", "aruba flag"], u: "1f1e6-1f1fc" },
|
|
{ n: ["flag-ax", "\xE5land islands flag"], u: "1f1e6-1f1fd" },
|
|
{ n: ["flag-az", "azerbaijan flag"], u: "1f1e6-1f1ff" },
|
|
{ n: ["flag-ba", "bosnia & herzegovina flag"], u: "1f1e7-1f1e6" },
|
|
{ n: ["flag-bb", "barbados flag"], u: "1f1e7-1f1e7" },
|
|
{ n: ["flag-bd", "bangladesh flag"], u: "1f1e7-1f1e9" },
|
|
{ n: ["flag-be", "belgium flag"], u: "1f1e7-1f1ea" },
|
|
{ n: ["flag-bf", "burkina faso flag"], u: "1f1e7-1f1eb" },
|
|
{ n: ["flag-bg", "bulgaria flag"], u: "1f1e7-1f1ec" },
|
|
{ n: ["flag-bh", "bahrain flag"], u: "1f1e7-1f1ed" },
|
|
{ n: ["flag-bi", "burundi flag"], u: "1f1e7-1f1ee" },
|
|
{ n: ["flag-bj", "benin flag"], u: "1f1e7-1f1ef" },
|
|
{ n: ["flag-bl", "st. barth\xE9lemy flag"], u: "1f1e7-1f1f1" },
|
|
{ n: ["flag-bm", "bermuda flag"], u: "1f1e7-1f1f2" },
|
|
{ n: ["flag-bn", "brunei flag"], u: "1f1e7-1f1f3" },
|
|
{ n: ["flag-bo", "bolivia flag"], u: "1f1e7-1f1f4" },
|
|
{ n: ["flag-bq", "caribbean netherlands flag"], u: "1f1e7-1f1f6" },
|
|
{ n: ["flag-br", "brazil flag"], u: "1f1e7-1f1f7" },
|
|
{ n: ["flag-bs", "bahamas flag"], u: "1f1e7-1f1f8" },
|
|
{ n: ["flag-bt", "bhutan flag"], u: "1f1e7-1f1f9" },
|
|
{ n: ["flag-bv", "bouvet island flag"], u: "1f1e7-1f1fb" },
|
|
{ n: ["flag-bw", "botswana flag"], u: "1f1e7-1f1fc" },
|
|
{ n: ["flag-by", "belarus flag"], u: "1f1e7-1f1fe" },
|
|
{ n: ["flag-bz", "belize flag"], u: "1f1e7-1f1ff" },
|
|
{ n: ["flag-ca", "canada flag"], u: "1f1e8-1f1e6" },
|
|
{ n: ["flag-cc", "cocos (keeling) islands flag"], u: "1f1e8-1f1e8" },
|
|
{ n: ["flag-cd", "congo - kinshasa flag"], u: "1f1e8-1f1e9" },
|
|
{ n: ["flag-cf", "central african republic flag"], u: "1f1e8-1f1eb" },
|
|
{ n: ["flag-cg", "congo - brazzaville flag"], u: "1f1e8-1f1ec" },
|
|
{ n: ["flag-ch", "switzerland flag"], u: "1f1e8-1f1ed" },
|
|
{ n: ["flag-ci", "c\xF4te d\u2019ivoire flag"], u: "1f1e8-1f1ee" },
|
|
{ n: ["flag-ck", "cook islands flag"], u: "1f1e8-1f1f0" },
|
|
{ n: ["flag-cl", "chile flag"], u: "1f1e8-1f1f1" },
|
|
{ n: ["flag-cm", "cameroon flag"], u: "1f1e8-1f1f2" },
|
|
{ n: ["cn", "flag-cn", "china flag"], u: "1f1e8-1f1f3" },
|
|
{ n: ["flag-co", "colombia flag"], u: "1f1e8-1f1f4" },
|
|
{ n: ["flag-cp", "clipperton island flag"], u: "1f1e8-1f1f5" },
|
|
{ n: ["flag-cr", "costa rica flag"], u: "1f1e8-1f1f7" },
|
|
{ n: ["flag-cu", "cuba flag"], u: "1f1e8-1f1fa" },
|
|
{ n: ["flag-cv", "cape verde flag"], u: "1f1e8-1f1fb" },
|
|
{ n: ["flag-cw", "cura\xE7ao flag"], u: "1f1e8-1f1fc" },
|
|
{ n: ["flag-cx", "christmas island flag"], u: "1f1e8-1f1fd" },
|
|
{ n: ["flag-cy", "cyprus flag"], u: "1f1e8-1f1fe" },
|
|
{ n: ["flag-cz", "czechia flag"], u: "1f1e8-1f1ff" },
|
|
{ n: ["de", "flag-de", "germany flag"], u: "1f1e9-1f1ea" },
|
|
{ n: ["flag-dg", "diego garcia flag"], u: "1f1e9-1f1ec" },
|
|
{ n: ["flag-dj", "djibouti flag"], u: "1f1e9-1f1ef" },
|
|
{ n: ["flag-dk", "denmark flag"], u: "1f1e9-1f1f0" },
|
|
{ n: ["flag-dm", "dominica flag"], u: "1f1e9-1f1f2" },
|
|
{ n: ["flag-do", "dominican republic flag"], u: "1f1e9-1f1f4" },
|
|
{ n: ["flag-dz", "algeria flag"], u: "1f1e9-1f1ff" },
|
|
{ n: ["flag-ea", "ceuta & melilla flag"], u: "1f1ea-1f1e6" },
|
|
{ n: ["flag-ec", "ecuador flag"], u: "1f1ea-1f1e8" },
|
|
{ n: ["flag-ee", "estonia flag"], u: "1f1ea-1f1ea" },
|
|
{ n: ["flag-eg", "egypt flag"], u: "1f1ea-1f1ec" },
|
|
{ n: ["flag-eh", "western sahara flag"], u: "1f1ea-1f1ed" },
|
|
{ n: ["flag-er", "eritrea flag"], u: "1f1ea-1f1f7" },
|
|
{ n: ["es", "flag-es", "spain flag"], u: "1f1ea-1f1f8" },
|
|
{ n: ["flag-et", "ethiopia flag"], u: "1f1ea-1f1f9" },
|
|
{ n: ["flag-eu", "european union flag"], u: "1f1ea-1f1fa" },
|
|
{ n: ["flag-fi", "finland flag"], u: "1f1eb-1f1ee" },
|
|
{ n: ["flag-fj", "fiji flag"], u: "1f1eb-1f1ef" },
|
|
{ n: ["flag-fk", "falkland islands flag"], u: "1f1eb-1f1f0" },
|
|
{ n: ["flag-fm", "micronesia flag"], u: "1f1eb-1f1f2" },
|
|
{ n: ["flag-fo", "faroe islands flag"], u: "1f1eb-1f1f4" },
|
|
{ n: ["fr", "flag-fr", "france flag"], u: "1f1eb-1f1f7" },
|
|
{ n: ["flag-ga", "gabon flag"], u: "1f1ec-1f1e6" },
|
|
{ n: ["gb", "uk", "flag-gb", "united kingdom flag"], u: "1f1ec-1f1e7" },
|
|
{ n: ["flag-gd", "grenada flag"], u: "1f1ec-1f1e9" },
|
|
{ n: ["flag-ge", "georgia flag"], u: "1f1ec-1f1ea" },
|
|
{ n: ["flag-gf", "french guiana flag"], u: "1f1ec-1f1eb" },
|
|
{ n: ["flag-gg", "guernsey flag"], u: "1f1ec-1f1ec" },
|
|
{ n: ["flag-gh", "ghana flag"], u: "1f1ec-1f1ed" },
|
|
{ n: ["flag-gi", "gibraltar flag"], u: "1f1ec-1f1ee" },
|
|
{ n: ["flag-gl", "greenland flag"], u: "1f1ec-1f1f1" },
|
|
{ n: ["flag-gm", "gambia flag"], u: "1f1ec-1f1f2" },
|
|
{ n: ["flag-gn", "guinea flag"], u: "1f1ec-1f1f3" },
|
|
{ n: ["flag-gp", "guadeloupe flag"], u: "1f1ec-1f1f5" },
|
|
{ n: ["flag-gq", "equatorial guinea flag"], u: "1f1ec-1f1f6" },
|
|
{ n: ["flag-gr", "greece flag"], u: "1f1ec-1f1f7" },
|
|
{
|
|
n: ["flag-gs", "south georgia & south sandwich islands flag"],
|
|
u: "1f1ec-1f1f8"
|
|
},
|
|
{ n: ["flag-gt", "guatemala flag"], u: "1f1ec-1f1f9" },
|
|
{ n: ["flag-gu", "guam flag"], u: "1f1ec-1f1fa" },
|
|
{ n: ["flag-gw", "guinea-bissau flag"], u: "1f1ec-1f1fc" },
|
|
{ n: ["flag-gy", "guyana flag"], u: "1f1ec-1f1fe" },
|
|
{ n: ["flag-hk", "hong kong sar china flag"], u: "1f1ed-1f1f0" },
|
|
{ n: ["flag-hm", "heard & mcdonald islands flag"], u: "1f1ed-1f1f2" },
|
|
{ n: ["flag-hn", "honduras flag"], u: "1f1ed-1f1f3" },
|
|
{ n: ["flag-hr", "croatia flag"], u: "1f1ed-1f1f7" },
|
|
{ n: ["flag-ht", "haiti flag"], u: "1f1ed-1f1f9" },
|
|
{ n: ["flag-hu", "hungary flag"], u: "1f1ed-1f1fa" },
|
|
{ n: ["flag-ic", "canary islands flag"], u: "1f1ee-1f1e8" },
|
|
{ n: ["flag-id", "indonesia flag"], u: "1f1ee-1f1e9" },
|
|
{ n: ["flag-ie", "ireland flag"], u: "1f1ee-1f1ea" },
|
|
{ n: ["flag-il", "israel flag"], u: "1f1ee-1f1f1" },
|
|
{ n: ["flag-im", "isle of man flag"], u: "1f1ee-1f1f2" },
|
|
{ n: ["flag-in", "india flag"], u: "1f1ee-1f1f3" },
|
|
{ n: ["flag-io", "british indian ocean territory flag"], u: "1f1ee-1f1f4" },
|
|
{ n: ["flag-iq", "iraq flag"], u: "1f1ee-1f1f6" },
|
|
{ n: ["flag-ir", "iran flag"], u: "1f1ee-1f1f7" },
|
|
{ n: ["flag-is", "iceland flag"], u: "1f1ee-1f1f8" },
|
|
{ n: ["it", "flag-it", "italy flag"], u: "1f1ee-1f1f9" },
|
|
{ n: ["flag-je", "jersey flag"], u: "1f1ef-1f1ea" },
|
|
{ n: ["flag-jm", "jamaica flag"], u: "1f1ef-1f1f2" },
|
|
{ n: ["flag-jo", "jordan flag"], u: "1f1ef-1f1f4" },
|
|
{ n: ["jp", "flag-jp", "japan flag"], u: "1f1ef-1f1f5" },
|
|
{ n: ["flag-ke", "kenya flag"], u: "1f1f0-1f1ea" },
|
|
{ n: ["flag-kg", "kyrgyzstan flag"], u: "1f1f0-1f1ec" },
|
|
{ n: ["flag-kh", "cambodia flag"], u: "1f1f0-1f1ed" },
|
|
{ n: ["flag-ki", "kiribati flag"], u: "1f1f0-1f1ee" },
|
|
{ n: ["flag-km", "comoros flag"], u: "1f1f0-1f1f2" },
|
|
{ n: ["flag-kn", "st. kitts & nevis flag"], u: "1f1f0-1f1f3" },
|
|
{ n: ["flag-kp", "north korea flag"], u: "1f1f0-1f1f5" },
|
|
{ n: ["kr", "flag-kr", "south korea flag"], u: "1f1f0-1f1f7" },
|
|
{ n: ["flag-kw", "kuwait flag"], u: "1f1f0-1f1fc" },
|
|
{ n: ["flag-ky", "cayman islands flag"], u: "1f1f0-1f1fe" },
|
|
{ n: ["flag-kz", "kazakhstan flag"], u: "1f1f0-1f1ff" },
|
|
{ n: ["flag-la", "laos flag"], u: "1f1f1-1f1e6" },
|
|
{ n: ["flag-lb", "lebanon flag"], u: "1f1f1-1f1e7" },
|
|
{ n: ["flag-lc", "st. lucia flag"], u: "1f1f1-1f1e8" },
|
|
{ n: ["flag-li", "liechtenstein flag"], u: "1f1f1-1f1ee" },
|
|
{ n: ["flag-lk", "sri lanka flag"], u: "1f1f1-1f1f0" },
|
|
{ n: ["flag-lr", "liberia flag"], u: "1f1f1-1f1f7" },
|
|
{ n: ["flag-ls", "lesotho flag"], u: "1f1f1-1f1f8" },
|
|
{ n: ["flag-lt", "lithuania flag"], u: "1f1f1-1f1f9" },
|
|
{ n: ["flag-lu", "luxembourg flag"], u: "1f1f1-1f1fa" },
|
|
{ n: ["flag-lv", "latvia flag"], u: "1f1f1-1f1fb" },
|
|
{ n: ["flag-ly", "libya flag"], u: "1f1f1-1f1fe" },
|
|
{ n: ["flag-ma", "morocco flag"], u: "1f1f2-1f1e6" },
|
|
{ n: ["flag-mc", "monaco flag"], u: "1f1f2-1f1e8" },
|
|
{ n: ["flag-md", "moldova flag"], u: "1f1f2-1f1e9" },
|
|
{ n: ["flag-me", "montenegro flag"], u: "1f1f2-1f1ea" },
|
|
{ n: ["flag-mf", "st. martin flag"], u: "1f1f2-1f1eb" },
|
|
{ n: ["flag-mg", "madagascar flag"], u: "1f1f2-1f1ec" },
|
|
{ n: ["flag-mh", "marshall islands flag"], u: "1f1f2-1f1ed" },
|
|
{ n: ["flag-mk", "north macedonia flag"], u: "1f1f2-1f1f0" },
|
|
{ n: ["flag-ml", "mali flag"], u: "1f1f2-1f1f1" },
|
|
{ n: ["flag-mm", "myanmar (burma) flag"], u: "1f1f2-1f1f2" },
|
|
{ n: ["flag-mn", "mongolia flag"], u: "1f1f2-1f1f3" },
|
|
{ n: ["flag-mo", "macao sar china flag"], u: "1f1f2-1f1f4" },
|
|
{ n: ["flag-mp", "northern mariana islands flag"], u: "1f1f2-1f1f5" },
|
|
{ n: ["flag-mq", "martinique flag"], u: "1f1f2-1f1f6" },
|
|
{ n: ["flag-mr", "mauritania flag"], u: "1f1f2-1f1f7" },
|
|
{ n: ["flag-ms", "montserrat flag"], u: "1f1f2-1f1f8" },
|
|
{ n: ["flag-mt", "malta flag"], u: "1f1f2-1f1f9" },
|
|
{ n: ["flag-mu", "mauritius flag"], u: "1f1f2-1f1fa" },
|
|
{ n: ["flag-mv", "maldives flag"], u: "1f1f2-1f1fb" },
|
|
{ n: ["flag-mw", "malawi flag"], u: "1f1f2-1f1fc" },
|
|
{ n: ["flag-mx", "mexico flag"], u: "1f1f2-1f1fd" },
|
|
{ n: ["flag-my", "malaysia flag"], u: "1f1f2-1f1fe" },
|
|
{ n: ["flag-mz", "mozambique flag"], u: "1f1f2-1f1ff" },
|
|
{ n: ["flag-na", "namibia flag"], u: "1f1f3-1f1e6" },
|
|
{ n: ["flag-nc", "new caledonia flag"], u: "1f1f3-1f1e8" },
|
|
{ n: ["flag-ne", "niger flag"], u: "1f1f3-1f1ea" },
|
|
{ n: ["flag-nf", "norfolk island flag"], u: "1f1f3-1f1eb" },
|
|
{ n: ["flag-ng", "nigeria flag"], u: "1f1f3-1f1ec" },
|
|
{ n: ["flag-ni", "nicaragua flag"], u: "1f1f3-1f1ee" },
|
|
{ n: ["flag-nl", "netherlands flag"], u: "1f1f3-1f1f1" },
|
|
{ n: ["flag-no", "norway flag"], u: "1f1f3-1f1f4" },
|
|
{ n: ["flag-np", "nepal flag"], u: "1f1f3-1f1f5" },
|
|
{ n: ["flag-nr", "nauru flag"], u: "1f1f3-1f1f7" },
|
|
{ n: ["flag-nu", "niue flag"], u: "1f1f3-1f1fa" },
|
|
{ n: ["flag-nz", "new zealand flag"], u: "1f1f3-1f1ff" },
|
|
{ n: ["flag-om", "oman flag"], u: "1f1f4-1f1f2" },
|
|
{ n: ["flag-pa", "panama flag"], u: "1f1f5-1f1e6" },
|
|
{ n: ["flag-pe", "peru flag"], u: "1f1f5-1f1ea" },
|
|
{ n: ["flag-pf", "french polynesia flag"], u: "1f1f5-1f1eb" },
|
|
{ n: ["flag-pg", "papua new guinea flag"], u: "1f1f5-1f1ec" },
|
|
{ n: ["flag-ph", "philippines flag"], u: "1f1f5-1f1ed" },
|
|
{ n: ["flag-pk", "pakistan flag"], u: "1f1f5-1f1f0" },
|
|
{ n: ["flag-pl", "poland flag"], u: "1f1f5-1f1f1" },
|
|
{ n: ["flag-pm", "st. pierre & miquelon flag"], u: "1f1f5-1f1f2" },
|
|
{ n: ["flag-pn", "pitcairn islands flag"], u: "1f1f5-1f1f3" },
|
|
{ n: ["flag-pr", "puerto rico flag"], u: "1f1f5-1f1f7" },
|
|
{ n: ["flag-ps", "palestinian territories flag"], u: "1f1f5-1f1f8" },
|
|
{ n: ["flag-pt", "portugal flag"], u: "1f1f5-1f1f9" },
|
|
{ n: ["flag-pw", "palau flag"], u: "1f1f5-1f1fc" },
|
|
{ n: ["flag-py", "paraguay flag"], u: "1f1f5-1f1fe" },
|
|
{ n: ["flag-qa", "qatar flag"], u: "1f1f6-1f1e6" },
|
|
{ n: ["flag-re", "r\xE9union flag"], u: "1f1f7-1f1ea" },
|
|
{ n: ["flag-ro", "romania flag"], u: "1f1f7-1f1f4" },
|
|
{ n: ["flag-rs", "serbia flag"], u: "1f1f7-1f1f8" },
|
|
{ n: ["ru", "flag-ru", "russia flag"], u: "1f1f7-1f1fa" },
|
|
{ n: ["flag-rw", "rwanda flag"], u: "1f1f7-1f1fc" },
|
|
{ n: ["flag-sa", "saudi arabia flag"], u: "1f1f8-1f1e6" },
|
|
{ n: ["flag-sb", "solomon islands flag"], u: "1f1f8-1f1e7" },
|
|
{ n: ["flag-sc", "seychelles flag"], u: "1f1f8-1f1e8" },
|
|
{ n: ["flag-sd", "sudan flag"], u: "1f1f8-1f1e9" },
|
|
{ n: ["flag-se", "sweden flag"], u: "1f1f8-1f1ea" },
|
|
{ n: ["flag-sg", "singapore flag"], u: "1f1f8-1f1ec" },
|
|
{ n: ["flag-sh", "st. helena flag"], u: "1f1f8-1f1ed" },
|
|
{ n: ["flag-si", "slovenia flag"], u: "1f1f8-1f1ee" },
|
|
{ n: ["flag-sj", "svalbard & jan mayen flag"], u: "1f1f8-1f1ef" },
|
|
{ n: ["flag-sk", "slovakia flag"], u: "1f1f8-1f1f0" },
|
|
{ n: ["flag-sl", "sierra leone flag"], u: "1f1f8-1f1f1" },
|
|
{ n: ["flag-sm", "san marino flag"], u: "1f1f8-1f1f2" },
|
|
{ n: ["flag-sn", "senegal flag"], u: "1f1f8-1f1f3" },
|
|
{ n: ["flag-so", "somalia flag"], u: "1f1f8-1f1f4" },
|
|
{ n: ["flag-sr", "suriname flag"], u: "1f1f8-1f1f7" },
|
|
{ n: ["flag-ss", "south sudan flag"], u: "1f1f8-1f1f8" },
|
|
{ n: ["flag-st", "s\xE3o tom\xE9 & pr\xEDncipe flag"], u: "1f1f8-1f1f9" },
|
|
{ n: ["flag-sv", "el salvador flag"], u: "1f1f8-1f1fb" },
|
|
{ n: ["flag-sx", "sint maarten flag"], u: "1f1f8-1f1fd" },
|
|
{ n: ["flag-sy", "syria flag"], u: "1f1f8-1f1fe" },
|
|
{ n: ["flag-sz", "eswatini flag"], u: "1f1f8-1f1ff" },
|
|
{ n: ["flag-ta", "tristan da cunha flag"], u: "1f1f9-1f1e6" },
|
|
{ n: ["flag-tc", "turks & caicos islands flag"], u: "1f1f9-1f1e8" },
|
|
{ n: ["flag-td", "chad flag"], u: "1f1f9-1f1e9" },
|
|
{ n: ["flag-tf", "french southern territories flag"], u: "1f1f9-1f1eb" },
|
|
{ n: ["flag-tg", "togo flag"], u: "1f1f9-1f1ec" },
|
|
{ n: ["flag-th", "thailand flag"], u: "1f1f9-1f1ed" },
|
|
{ n: ["flag-tj", "tajikistan flag"], u: "1f1f9-1f1ef" },
|
|
{ n: ["flag-tk", "tokelau flag"], u: "1f1f9-1f1f0" },
|
|
{ n: ["flag-tl", "timor-leste flag"], u: "1f1f9-1f1f1" },
|
|
{ n: ["flag-tm", "turkmenistan flag"], u: "1f1f9-1f1f2" },
|
|
{ n: ["flag-tn", "tunisia flag"], u: "1f1f9-1f1f3" },
|
|
{ n: ["flag-to", "tonga flag"], u: "1f1f9-1f1f4" },
|
|
{ n: ["flag-tr", "turkey flag"], u: "1f1f9-1f1f7" },
|
|
{ n: ["flag-tt", "trinidad & tobago flag"], u: "1f1f9-1f1f9" },
|
|
{ n: ["flag-tv", "tuvalu flag"], u: "1f1f9-1f1fb" },
|
|
{ n: ["flag-tw", "taiwan flag"], u: "1f1f9-1f1fc" },
|
|
{ n: ["flag-tz", "tanzania flag"], u: "1f1f9-1f1ff" },
|
|
{ n: ["flag-ua", "ukraine flag"], u: "1f1fa-1f1e6" },
|
|
{ n: ["flag-ug", "uganda flag"], u: "1f1fa-1f1ec" },
|
|
{ n: ["flag-um", "u.s. outlying islands flag"], u: "1f1fa-1f1f2" },
|
|
{ n: ["flag-un", "united nations flag"], u: "1f1fa-1f1f3" },
|
|
{ n: ["us", "flag-us", "united states flag"], u: "1f1fa-1f1f8" },
|
|
{ n: ["flag-uy", "uruguay flag"], u: "1f1fa-1f1fe" },
|
|
{ n: ["flag-uz", "uzbekistan flag"], u: "1f1fa-1f1ff" },
|
|
{ n: ["flag-va", "vatican city flag"], u: "1f1fb-1f1e6" },
|
|
{ n: ["flag-vc", "st. vincent & grenadines flag"], u: "1f1fb-1f1e8" },
|
|
{ n: ["flag-ve", "venezuela flag"], u: "1f1fb-1f1ea" },
|
|
{ n: ["flag-vg", "british virgin islands flag"], u: "1f1fb-1f1ec" },
|
|
{ n: ["flag-vi", "u.s. virgin islands flag"], u: "1f1fb-1f1ee" },
|
|
{ n: ["flag-vn", "vietnam flag"], u: "1f1fb-1f1f3" },
|
|
{ n: ["flag-vu", "vanuatu flag"], u: "1f1fb-1f1fa" },
|
|
{ n: ["flag-wf", "wallis & futuna flag"], u: "1f1fc-1f1eb" },
|
|
{ n: ["flag-ws", "samoa flag"], u: "1f1fc-1f1f8" },
|
|
{ n: ["flag-xk", "kosovo flag"], u: "1f1fd-1f1f0" },
|
|
{ n: ["flag-ye", "yemen flag"], u: "1f1fe-1f1ea" },
|
|
{ n: ["flag-yt", "mayotte flag"], u: "1f1fe-1f1f9" },
|
|
{ n: ["flag-za", "south africa flag"], u: "1f1ff-1f1e6" },
|
|
{ n: ["flag-zm", "zambia flag"], u: "1f1ff-1f1f2" },
|
|
{ n: ["flag-zw", "zimbabwe flag"], u: "1f1ff-1f1fc" },
|
|
{
|
|
n: ["england flag", "flag-england"],
|
|
u: "1f3f4-e0067-e0062-e0065-e006e-e0067-e007f"
|
|
},
|
|
{
|
|
n: ["scotland flag", "flag-scotland"],
|
|
u: "1f3f4-e0067-e0062-e0073-e0063-e0074-e007f"
|
|
},
|
|
{
|
|
n: ["wales flag", "flag-wales"],
|
|
u: "1f3f4-e0067-e0062-e0077-e006c-e0073-e007f"
|
|
}
|
|
]
|
|
};
|
|
|
|
// src/components/Spaces/TreeView/FileStickerMenu/FileStickerMenu.tsx
|
|
var import_obsidian10 = require("obsidian");
|
|
|
|
// src/schemas/spaces.ts
|
|
var vaultSchema = {
|
|
uniques: ["path"],
|
|
cols: ["path", "parent", "created", "sticker", "color", "folder", "rank"],
|
|
rows: []
|
|
};
|
|
var spaceSchema = {
|
|
uniques: ["name"],
|
|
cols: ["name", "sticker", "color", "pinned", "sort", "def", "rank"],
|
|
rows: []
|
|
};
|
|
var spaceItemsSchema = {
|
|
uniques: [],
|
|
cols: ["space", "path", "rank"],
|
|
rows: []
|
|
};
|
|
|
|
// src/dispatch/spaces.ts
|
|
var dispatchSpaceDatabaseFileChanged = (type) => {
|
|
let evt = new CustomEvent(eventTypes.spacesChange, {
|
|
detail: {
|
|
changeType: type
|
|
}
|
|
});
|
|
window.dispatchEvent(evt);
|
|
};
|
|
var onFileCreated2 = async (plugin, newPath, folder) => {
|
|
var _a2;
|
|
const parent = (_a2 = getAbstractFileAtPath(app, newPath).parent) == null ? void 0 : _a2.path;
|
|
const db = plugin.spaceDBInstance();
|
|
insertIntoDB(db, {
|
|
vault: {
|
|
...vaultSchema,
|
|
rows: [
|
|
{
|
|
path: newPath,
|
|
parent,
|
|
created: Math.trunc(Date.now() / 1e3).toString(),
|
|
folder: folder ? "true" : "false"
|
|
}
|
|
]
|
|
}
|
|
});
|
|
plugin.saveSpacesDB();
|
|
dispatchSpaceDatabaseFileChanged("vault");
|
|
};
|
|
var onFileDeleted2 = (plugin, oldPath) => {
|
|
const db = plugin.spaceDBInstance();
|
|
deleteFromDB(db, "vault", `path = '${sanitizeSQLStatement(oldPath)}'`);
|
|
deleteFromDB(db, "spaceItems", `path = '${sanitizeSQLStatement(oldPath)}'`);
|
|
plugin.saveSpacesDB();
|
|
dispatchSpaceDatabaseFileChanged("vault");
|
|
};
|
|
var onFileChanged2 = (plugin, oldPath, newPath) => {
|
|
const newFolderPath = getFolderPathFromString(newPath);
|
|
const db = plugin.spaceDBInstance();
|
|
updateDB(
|
|
db,
|
|
{
|
|
vault: {
|
|
uniques: [],
|
|
cols: ["path", "parent"],
|
|
rows: [{ path: newPath, oldPath, parent: newFolderPath }]
|
|
}
|
|
},
|
|
"path",
|
|
"oldPath"
|
|
);
|
|
updateDB(
|
|
db,
|
|
{
|
|
spaceItems: {
|
|
uniques: [],
|
|
cols: ["path"],
|
|
rows: [{ path: newPath, oldPath }]
|
|
}
|
|
},
|
|
"path",
|
|
"oldPath"
|
|
);
|
|
plugin.saveSpacesDB();
|
|
dispatchSpaceDatabaseFileChanged("vault");
|
|
};
|
|
var onFolderChanged2 = (plugin, oldPath, newPath) => {
|
|
const newFolderPath = getFolderFromPath(app, newPath).parent.path;
|
|
const db = plugin.spaceDBInstance();
|
|
updateDB(
|
|
db,
|
|
{
|
|
vault: {
|
|
uniques: [],
|
|
cols: ["path", "parent"],
|
|
rows: [{ path: newPath, oldPath, parent: newFolderPath }]
|
|
}
|
|
},
|
|
"path",
|
|
"oldPath"
|
|
);
|
|
execQuery(
|
|
db,
|
|
`UPDATE vault SET parent=REPLACE(parent,'${sanitizeSQLStatement(
|
|
oldPath
|
|
)}','${sanitizeSQLStatement(
|
|
newPath
|
|
)}') WHERE parent LIKE '${sanitizeSQLStatement(oldPath)}%';`
|
|
);
|
|
execQuery(
|
|
db,
|
|
`UPDATE vault SET path=REPLACE(path,'${sanitizeSQLStatement(
|
|
oldPath
|
|
)}','${sanitizeSQLStatement(
|
|
newPath
|
|
)}') WHERE path LIKE '${sanitizeSQLStatement(oldPath)}%/';`
|
|
);
|
|
updateDB(
|
|
db,
|
|
{
|
|
spaceItems: {
|
|
uniques: [],
|
|
cols: ["path"],
|
|
rows: [{ path: newPath, oldPath }]
|
|
}
|
|
},
|
|
"path",
|
|
"oldPath"
|
|
);
|
|
plugin.saveSpacesDB();
|
|
dispatchSpaceDatabaseFileChanged("vault");
|
|
};
|
|
var onFolderDeleted2 = (plugin, oldPath) => {
|
|
const db = plugin.spaceDBInstance();
|
|
deleteFromDB(
|
|
db,
|
|
"vault",
|
|
`path = '${sanitizeSQLStatement(
|
|
oldPath
|
|
)}' OR parent LIKE '${sanitizeSQLStatement(oldPath)}%'`
|
|
);
|
|
deleteFromDB(db, "spaceItems", `path = '${sanitizeSQLStatement(oldPath)}'`);
|
|
plugin.saveSpacesDB();
|
|
dispatchSpaceDatabaseFileChanged("vault");
|
|
};
|
|
|
|
// src/utils/spaces/spaces.ts
|
|
var import_obsidian9 = require("obsidian");
|
|
var rebuildIndex = async (plugin) => {
|
|
console.time("Reindex Spaces Data");
|
|
const db = plugin.spaceDBInstance();
|
|
indexCurrentFileTree(db);
|
|
plugin.saveSpacesDB();
|
|
dispatchSpaceDatabaseFileChanged("vault");
|
|
console.timeEnd("Reindex Spaces Data");
|
|
};
|
|
var spaceItemToTreeNode = (space, collapsed, sortable) => {
|
|
return {
|
|
id: space.name,
|
|
spaceItem: space,
|
|
parentId: null,
|
|
depth: 0,
|
|
index: 0,
|
|
space: space.name,
|
|
item: null,
|
|
collapsed,
|
|
sortable
|
|
};
|
|
};
|
|
var vaulItemToTreeNode = (item, space, path, depth, i4, collapsed, sortable) => ({
|
|
item,
|
|
file: getAbstractFileAtPath(app, item.path),
|
|
space,
|
|
id: (space == "/" ? "" : space) + "//" + item.path,
|
|
parentId: (space == "/" ? "" : space) + "//" + path,
|
|
depth,
|
|
index: i4,
|
|
collapsed,
|
|
sortable
|
|
});
|
|
var folderSortFn = (sortStrategy, direction) => (a5, b4) => {
|
|
if (sortStrategy == "rank") {
|
|
return a5.rank.localeCompare(b4.rank, void 0, { numeric: true });
|
|
}
|
|
const sortFns = [
|
|
compareByField("folder", false),
|
|
compareByField(sortStrategy, direction)
|
|
];
|
|
return sortFns.reduce((p3, c4) => {
|
|
return p3 == 0 ? c4(a5, b4) : p3;
|
|
}, 0);
|
|
};
|
|
var flattenedTreeFromVaultItems = (root, space, vaultItems, openNodes, depth, sortStrategy, direction) => {
|
|
if (!vaultItems[root]) {
|
|
return [];
|
|
}
|
|
const flattenTree = (path, vaultItems2, openNodes2, depth2, index) => {
|
|
let items = [];
|
|
let i4 = index;
|
|
vaultItems2[path].sort(folderSortFn(sortStrategy, direction)).forEach((item) => {
|
|
const collapsed = !openNodes2.includes(item.path);
|
|
const node = vaulItemToTreeNode(
|
|
item,
|
|
space,
|
|
path,
|
|
depth2,
|
|
i4,
|
|
collapsed,
|
|
sortStrategy == "rank"
|
|
);
|
|
if (node.file)
|
|
items.push(node);
|
|
i4 = i4 + 1;
|
|
if (vaultItems2[item.path] && !collapsed) {
|
|
items.push(
|
|
...flattenTree(item.path, vaultItems2, openNodes2, depth2 + 1, i4)
|
|
);
|
|
}
|
|
});
|
|
return items;
|
|
};
|
|
return flattenTree(root, vaultItems, openNodes, depth, 0);
|
|
};
|
|
var vaultItemForPath = (plugin, path) => {
|
|
var _a2;
|
|
if (!path)
|
|
return null;
|
|
const db = plugin.spaceDBInstance();
|
|
const table = selectDB(db, "vault", `path='${sanitizeSQLStatement(path)}'`);
|
|
return (_a2 = table == null ? void 0 : table.rows) == null ? void 0 : _a2[0];
|
|
};
|
|
var saveFileSticker = (plugin, path, sticker) => {
|
|
const db = plugin.spaceDBInstance();
|
|
updateDB(
|
|
db,
|
|
{
|
|
vault: {
|
|
...vaultSchema,
|
|
cols: ["path", "sticker"],
|
|
rows: [{ path, sticker }]
|
|
}
|
|
},
|
|
"path",
|
|
"path"
|
|
);
|
|
plugin.saveSpacesDB();
|
|
dispatchSpaceDatabaseFileChanged("sticker");
|
|
};
|
|
var saveFileColor = (plugin, path, color) => {
|
|
const db = plugin.spaceDBInstance();
|
|
updateDB(
|
|
db,
|
|
{
|
|
vault: {
|
|
...vaultSchema,
|
|
cols: ["path", "color"],
|
|
rows: [{ path, color }]
|
|
}
|
|
},
|
|
"path",
|
|
"path"
|
|
);
|
|
plugin.saveSpacesDB();
|
|
dispatchSpaceDatabaseFileChanged("sticker");
|
|
};
|
|
var saveSpaceSticker = (plugin, name, sticker) => {
|
|
const db = plugin.spaceDBInstance();
|
|
updateDB(
|
|
db,
|
|
{
|
|
spaces: {
|
|
...spaceSchema,
|
|
cols: ["name", "sticker"],
|
|
rows: [{ name, sticker }]
|
|
}
|
|
},
|
|
"name",
|
|
"name"
|
|
);
|
|
plugin.saveSpacesDB();
|
|
dispatchSpaceDatabaseFileChanged("space");
|
|
};
|
|
var updateFileRank = (plugin, item, vaultTree, rank) => {
|
|
const db = plugin.spaceDBInstance();
|
|
if (Object.keys(vaultTree).includes(item.parent)) {
|
|
let fixedRank = rank;
|
|
if (parseInt(item.rank) > rank)
|
|
fixedRank = rank + 1;
|
|
const newItems = insert(
|
|
vaultTree[item.parent].filter((f4) => f4.path != item.path),
|
|
fixedRank,
|
|
item
|
|
).map((f4, index) => ({ path: f4.path, rank: index.toString() }));
|
|
updateDB(
|
|
db,
|
|
{
|
|
vault: {
|
|
...vaultSchema,
|
|
cols: ["path", "rank"],
|
|
rows: newItems
|
|
}
|
|
},
|
|
"path",
|
|
"path"
|
|
);
|
|
plugin.saveSpacesDB();
|
|
dispatchSpaceDatabaseFileChanged("vault");
|
|
}
|
|
};
|
|
var moveAFileToNewParentAtIndex = (plugin, item, newParent, vaultTree, index) => {
|
|
var _a2;
|
|
const currFile = getAbstractFileAtPath(app, item.path);
|
|
const newPath = newParent == "/" ? currFile.name : newParent + "/" + currFile.name;
|
|
const newItem = {
|
|
...item,
|
|
path: newPath,
|
|
parent: newParent,
|
|
rank: index.toString()
|
|
};
|
|
if (Object.keys(vaultTree).includes(newParent)) {
|
|
vaultTree[newParent] = insert(vaultTree[newParent], index, newItem);
|
|
const db = plugin.spaceDBInstance();
|
|
const table = selectDB(
|
|
db,
|
|
"vault",
|
|
`parent='${sanitizeSQLStatement(newParent)}'`
|
|
);
|
|
const rows = insert(
|
|
(_a2 = table == null ? void 0 : table.rows.sort(
|
|
(a5, b4) => a5.rank.localeCompare(b4.rank, void 0, { numeric: true })
|
|
)) != null ? _a2 : [],
|
|
index,
|
|
newItem
|
|
).map((f4, index2) => ({ ...f4, rank: index2.toString() }));
|
|
insertIntoDB(db, {
|
|
vault: {
|
|
...vaultSchema,
|
|
rows: [newItem]
|
|
}
|
|
});
|
|
deleteFromDB(db, "vault", `path='${sanitizeSQLStatement(item.path)}'`);
|
|
updateDB(
|
|
db,
|
|
{
|
|
vault: {
|
|
...vaultSchema,
|
|
cols: ["path", "rank"],
|
|
rows
|
|
}
|
|
},
|
|
"path",
|
|
"path"
|
|
);
|
|
plugin.saveSpacesDB();
|
|
const afile = getAbstractFileAtPath(app, item.path);
|
|
app.fileManager.renameFile(afile, newPath);
|
|
} else {
|
|
const afile = getAbstractFileAtPath(app, item.path);
|
|
app.fileManager.renameFile(afile, newPath);
|
|
}
|
|
};
|
|
var insertSpaceAtIndex = (plugin, space, pinned, rank, def) => {
|
|
const db = plugin.spaceDBInstance();
|
|
let newSpace = { name: space, pinned: pinned ? "true" : "false", def };
|
|
const spaces2 = retrieveSpaces(plugin);
|
|
const spaceExists = spaces2.find((f4) => f4.name == space);
|
|
let fixedRank = rank;
|
|
if (spaceExists) {
|
|
updateDB(
|
|
db,
|
|
{
|
|
spaces: {
|
|
...spaceSchema,
|
|
rows: [{ ...spaceExists, ...newSpace }]
|
|
}
|
|
},
|
|
"name",
|
|
"name"
|
|
);
|
|
if (parseInt(spaceExists.rank) < rank)
|
|
fixedRank = rank - 1;
|
|
} else {
|
|
insertIntoDB(db, {
|
|
spaces: {
|
|
...spaceSchema,
|
|
rows: [newSpace]
|
|
}
|
|
});
|
|
}
|
|
const newSpaces = insert(
|
|
spaces2.filter((f4) => f4.name != space),
|
|
fixedRank,
|
|
newSpace
|
|
).map((f4, index) => ({ name: f4.name, rank: index.toString() }));
|
|
updateDB(
|
|
db,
|
|
{
|
|
spaces: {
|
|
...spaceSchema,
|
|
cols: ["name", "rank"],
|
|
rows: newSpaces
|
|
}
|
|
},
|
|
"name",
|
|
"name"
|
|
);
|
|
plugin.saveSpacesDB();
|
|
dispatchSpaceDatabaseFileChanged("space");
|
|
};
|
|
var insertSpaceItemAtIndex = (plugin, spaceName, path, rank) => {
|
|
var _a2;
|
|
const db = plugin.spaceDBInstance();
|
|
const space = retrieveSpaces(plugin).find((f4) => f4.name == spaceName);
|
|
if (!space)
|
|
return;
|
|
let newSpace = {
|
|
space: space.name,
|
|
path,
|
|
rank: rank.toString()
|
|
};
|
|
const spaceItems = retrieveSpaceItems(plugin, [space]);
|
|
const spaceExists = (_a2 = spaceItems[space.name]) != null ? _a2 : [];
|
|
const pathExists = spaceExists.find((f4) => f4.path == path);
|
|
let fixedRank = rank;
|
|
if (!pathExists) {
|
|
insertIntoDB(db, {
|
|
spaceItems: {
|
|
...spaceItemsSchema,
|
|
rows: [newSpace]
|
|
}
|
|
});
|
|
fixedRank = rank + 1;
|
|
} else {
|
|
if (parseInt(pathExists.rank) > rank)
|
|
fixedRank = rank + 1;
|
|
}
|
|
const newSpaceItems = insert(
|
|
spaceExists.filter((f4) => f4.path != path),
|
|
fixedRank,
|
|
newSpace
|
|
).map((f4, index) => ({
|
|
space: f4.space,
|
|
path: f4.path,
|
|
rank: index.toString()
|
|
}));
|
|
updateDB(
|
|
db,
|
|
{
|
|
spaceItems: {
|
|
...spaceItemsSchema,
|
|
rows: newSpaceItems
|
|
}
|
|
},
|
|
`space='${space.name}' AND path`,
|
|
"path"
|
|
);
|
|
plugin.saveSpacesDB();
|
|
dispatchSpaceDatabaseFileChanged("space");
|
|
};
|
|
var renameSpace = (plugin, space, newName) => {
|
|
const db = plugin.spaceDBInstance();
|
|
updateDB(
|
|
db,
|
|
{
|
|
spaces: {
|
|
...spaceSchema,
|
|
cols: ["name"],
|
|
rows: [{ oldName: space, name: newName }]
|
|
}
|
|
},
|
|
"name",
|
|
"oldName"
|
|
);
|
|
updateDB(
|
|
db,
|
|
{
|
|
spaceItems: {
|
|
...spaceItemsSchema,
|
|
cols: ["space"],
|
|
rows: [{ oldSpace: space, space: newName }]
|
|
}
|
|
},
|
|
"space",
|
|
"oldSpace"
|
|
);
|
|
plugin.saveSpacesDB();
|
|
plugin.settings.expandedSpaces = plugin.settings.expandedSpaces.map(
|
|
(f4) => f4 == space ? newName : f4
|
|
);
|
|
plugin.saveSettings();
|
|
dispatchSpaceDatabaseFileChanged("space");
|
|
};
|
|
var removeSpace = (plugin, space) => {
|
|
const db = plugin.spaceDBInstance();
|
|
deleteFromDB(db, "spaces", `name='${sanitizeSQLStatement(space)}'`);
|
|
deleteFromDB(db, "spaceItems", `space='${sanitizeSQLStatement(space)}'`);
|
|
plugin.saveSpacesDB();
|
|
dispatchSpaceDatabaseFileChanged("space");
|
|
};
|
|
var updateSpaceSort = (plugin, space, sort) => {
|
|
const db = plugin.spaceDBInstance();
|
|
updateDB(
|
|
db,
|
|
{
|
|
spaces: {
|
|
...spaceSchema,
|
|
cols: ["name", "sort"],
|
|
rows: [{ name: space, sort: JSON.stringify(sort) }]
|
|
}
|
|
},
|
|
"name",
|
|
"name"
|
|
);
|
|
plugin.saveSpacesDB();
|
|
dispatchSpaceDatabaseFileChanged("space");
|
|
};
|
|
var toggleSpacePin = (plugin, space, state) => {
|
|
const db = plugin.spaceDBInstance();
|
|
updateDB(
|
|
db,
|
|
{
|
|
spaces: {
|
|
...spaceSchema,
|
|
cols: ["name", "pinned"],
|
|
rows: [{ name: space, pinned: state ? "true" : "false" }]
|
|
}
|
|
},
|
|
"name",
|
|
"name"
|
|
);
|
|
plugin.saveSpacesDB();
|
|
dispatchSpaceDatabaseFileChanged("space");
|
|
};
|
|
var addPathsToSpace = (plugin, space, paths) => {
|
|
const db = plugin.spaceDBInstance();
|
|
insertIntoDB(db, {
|
|
spaceItems: {
|
|
...spaceItemsSchema,
|
|
rows: [...paths.map((p3) => ({ space, path: p3 }))]
|
|
}
|
|
});
|
|
plugin.saveSpacesDB();
|
|
dispatchSpaceDatabaseFileChanged("space");
|
|
};
|
|
var removePathsFromSpace = (plugin, space, paths) => {
|
|
const db = plugin.spaceDBInstance();
|
|
paths.forEach(
|
|
(path) => deleteFromDB(
|
|
db,
|
|
"spaceItems",
|
|
`space='${sanitizeSQLStatement(space)}' AND path='${sanitizeSQLStatement(
|
|
path
|
|
)}'`
|
|
)
|
|
);
|
|
plugin.saveSpacesDB();
|
|
dispatchSpaceDatabaseFileChanged("space");
|
|
};
|
|
var retrieveSpaces = (plugin) => {
|
|
const db = plugin.spaceDBInstance();
|
|
const table = selectDB(db, "spaces");
|
|
if (table) {
|
|
return table.rows.sort(
|
|
(a5, b4) => a5.rank.localeCompare(b4.rank, void 0, { numeric: true })
|
|
);
|
|
}
|
|
return [];
|
|
};
|
|
var retrieveSpaceItems = (plugin, spaces2) => {
|
|
const db = plugin.spaceDBInstance();
|
|
let retrievedSpaces = {};
|
|
spaces2.forEach((space) => {
|
|
var _a2, _b2, _c2, _d2;
|
|
const table = selectDB(
|
|
db,
|
|
"spaceItems",
|
|
`space='${sanitizeSQLStatement(space.name)}'`
|
|
);
|
|
let rows = (_a2 = table == null ? void 0 : table.rows) != null ? _a2 : [];
|
|
if (((_b2 = space.def) == null ? void 0 : _b2.length) > 0) {
|
|
const spaceItems = ((_d2 = (_c2 = selectDB(db, "vault", `parent='${sanitizeSQLStatement(space.def)}'`)) == null ? void 0 : _c2.rows) != null ? _d2 : []).filter(excludeVaultItemPredicate(plugin));
|
|
const extraItems = rows.filter(
|
|
(f4) => !spaceItems.some((g4) => g4.path == f4.path)
|
|
);
|
|
rows = rows.filter((f4) => !extraItems.some((g4) => f4.path == g4.path));
|
|
extraItems.forEach(
|
|
(row) => deleteFromDB(
|
|
db,
|
|
"spaceItems",
|
|
`space='${sanitizeSQLStatement(
|
|
space.name
|
|
)}' AND path='${sanitizeSQLStatement(row.path)}'`
|
|
)
|
|
);
|
|
spaceItems.forEach((row) => {
|
|
if (!rows.some((f4) => f4.path == row.path)) {
|
|
const newItem = { space: space.name, path: row.path, rank: "0" };
|
|
insertIntoDB(db, {
|
|
spaceItems: {
|
|
...spaceItemsSchema,
|
|
rows: [newItem]
|
|
}
|
|
});
|
|
rows.push(newItem);
|
|
}
|
|
});
|
|
}
|
|
retrievedSpaces[space.name] = rows.sort(
|
|
(a5, b4) => a5.rank.localeCompare(b4.rank, void 0, { numeric: true })
|
|
);
|
|
});
|
|
return retrievedSpaces;
|
|
};
|
|
var retrieveFolders = async (plugin, paths) => {
|
|
const db = plugin.spaceDBInstance();
|
|
let retrievedFolders = {};
|
|
paths.forEach((folder) => {
|
|
const table = selectDB(
|
|
db,
|
|
"vault",
|
|
`parent='${sanitizeSQLStatement(folder)}'`
|
|
);
|
|
if (table) {
|
|
retrievedFolders[folder] = table.rows.filter(
|
|
excludeVaultItemPredicate(plugin)
|
|
);
|
|
}
|
|
});
|
|
return retrievedFolders;
|
|
};
|
|
var migrateIndex = async (plugin) => {
|
|
console.time("Migrate Spaces Data");
|
|
const db = plugin.spaceDBInstance();
|
|
initiateDB(db);
|
|
indexCurrentFileTree(db);
|
|
mergeCurrentRanks(db, plugin.settings.folderRank);
|
|
mergeExistingFileIcons(db, plugin.settings.fileIcons);
|
|
mergeSpaces(db, plugin.settings.spaces);
|
|
plugin.saveSpacesDB();
|
|
dispatchSpaceDatabaseFileChanged("vault");
|
|
plugin.settings.folderRank = null;
|
|
plugin.settings.fileIcons = null;
|
|
plugin.settings.spaces = null;
|
|
plugin.saveSettings();
|
|
console.timeEnd("Migrate Spaces Data");
|
|
};
|
|
var initiateDB = (db) => {
|
|
replaceDB(db, {
|
|
vault: vaultSchema,
|
|
spaces: spaceSchema,
|
|
spaceItems: spaceItemsSchema
|
|
});
|
|
};
|
|
var indexCurrentFileTree = (db) => {
|
|
var _a2, _b2;
|
|
let treeItems = [];
|
|
import_obsidian9.Vault.recurseChildren(app.vault.getRoot(), (file) => {
|
|
var _a3;
|
|
treeItems.push({
|
|
path: file.path,
|
|
parent: (_a3 = file.parent) == null ? void 0 : _a3.path,
|
|
created: file instanceof import_obsidian9.TFile ? file.stat.ctime.toString() : void 0,
|
|
folder: file instanceof import_obsidian9.TFolder ? "true" : "false"
|
|
});
|
|
});
|
|
const currentPaths = (_b2 = (_a2 = selectDB(db, "vault")) == null ? void 0 : _a2.rows) != null ? _b2 : [];
|
|
const deleteRows = currentPaths.filter(
|
|
(item) => !treeItems.some((i4) => i4.path == item.path)
|
|
);
|
|
const fixRows = currentPaths.filter(
|
|
(item) => treeItems.some((i4) => i4.path == item.path && i4.parent != item.parent)
|
|
).map((item) => ({
|
|
...item,
|
|
...treeItems.find((i4) => i4.path == item.path)
|
|
}));
|
|
const newRows = treeItems.filter(
|
|
(item) => !currentPaths.some((i4) => i4.path == item.path)
|
|
);
|
|
fixRows.forEach((row) => {
|
|
updateDB(db, { vault: { ...vaultSchema, rows: [row] } }, "path", "path");
|
|
});
|
|
deleteRows.forEach((path) => {
|
|
deleteFromDB(db, "vault", `path='${sanitizeSQLStatement(path.path)}'`);
|
|
});
|
|
deleteRows.forEach((path) => {
|
|
deleteFromDB(db, "spaceItems", `path='${sanitizeSQLStatement(path.path)}'`);
|
|
});
|
|
const chunkSize = 20;
|
|
for (let i4 = 0; i4 < newRows.length; i4 += chunkSize) {
|
|
const chunk = newRows.slice(i4, i4 + chunkSize);
|
|
insertIntoDB(db, {
|
|
vault: {
|
|
...vaultSchema,
|
|
rows: chunk
|
|
}
|
|
});
|
|
}
|
|
};
|
|
var mergeExistingFileIcons = (db, fileIcons) => {
|
|
const dbRows = fileIcons.map(([path, sticker]) => ({
|
|
path,
|
|
sticker
|
|
}));
|
|
updateDB(
|
|
db,
|
|
{
|
|
vault: {
|
|
uniques: [],
|
|
cols: ["sticker"],
|
|
rows: dbRows
|
|
}
|
|
},
|
|
"path",
|
|
"path"
|
|
);
|
|
};
|
|
var mergeCurrentRanks = (db, ranks) => {
|
|
const flattenStringTreeChildren = (path, children) => {
|
|
const dbRows2 = [];
|
|
children.forEach((item, index) => {
|
|
dbRows2.push({
|
|
path: path + item.node,
|
|
rank: index.toString()
|
|
});
|
|
if (item.children.length > 0) {
|
|
dbRows2.push(
|
|
...flattenStringTreeChildren(path + item.node + "/", item.children)
|
|
);
|
|
}
|
|
});
|
|
return dbRows2;
|
|
};
|
|
const dbRows = flattenStringTreeChildren("", ranks.children);
|
|
updateDB(
|
|
db,
|
|
{
|
|
vault: {
|
|
uniques: [],
|
|
cols: ["rank"],
|
|
rows: dbRows
|
|
}
|
|
},
|
|
"path",
|
|
"path"
|
|
);
|
|
};
|
|
var mergeSpaces = (db, sectionTrees) => {
|
|
let spaces2 = [];
|
|
let spaceItems = [];
|
|
sectionTrees.forEach((space, index) => {
|
|
spaces2.push({ name: space.section, rank: index.toString() });
|
|
spaceItems.push(
|
|
...space.children.map((f4, index2) => ({
|
|
space: space.section,
|
|
path: f4,
|
|
rank: index2.toString()
|
|
}))
|
|
);
|
|
});
|
|
insertIntoDB(db, {
|
|
spaces: {
|
|
...spaceSchema,
|
|
rows: spaces2
|
|
},
|
|
spaceItems: {
|
|
...spaceItemsSchema,
|
|
rows: spaceItems
|
|
}
|
|
});
|
|
};
|
|
|
|
// src/utils/emoji.ts
|
|
var unifiedToNative = (unified) => {
|
|
let unicodes = unified.split("-");
|
|
let codePoints = unicodes.map((u4) => `0x${u4}`);
|
|
return String.fromCodePoint(...codePoints);
|
|
};
|
|
var saveFileIcons = (plugin, files, icon) => {
|
|
files.forEach((file) => {
|
|
saveFileSticker(plugin, file, icon);
|
|
});
|
|
};
|
|
var saveFileColors = (plugin, files, icon) => {
|
|
files.forEach((file) => {
|
|
saveFileColor(plugin, file, icon);
|
|
});
|
|
};
|
|
var saveSpaceIcon = (plugin, space, icon) => {
|
|
saveSpaceSticker(plugin, space, icon);
|
|
};
|
|
var removeSpaceIcon = (plugin, space) => {
|
|
saveSpaceSticker(plugin, space, "");
|
|
};
|
|
var saveFileIcon = (plugin, data, icon) => {
|
|
saveFileSticker(plugin, data.path, icon);
|
|
};
|
|
var removeFileIcons = (plugin, files) => {
|
|
files.forEach((file) => {
|
|
saveFileSticker(plugin, file, "");
|
|
});
|
|
};
|
|
var removeFileIcon = (plugin, data) => {
|
|
saveFileSticker(plugin, data.path, "");
|
|
};
|
|
|
|
// src/components/Spaces/TreeView/FileStickerMenu/FileStickerMenu.tsx
|
|
var StickerModal = class extends import_obsidian10.FuzzySuggestModal {
|
|
constructor(app2, setIcon) {
|
|
super(app2);
|
|
this.setIcon = setIcon;
|
|
this.resultContainerEl.toggleClass("mk-sticker-modal", true);
|
|
this.inputEl.focus();
|
|
this.emptyStateText = i18n_default.labels.findStickers;
|
|
this.limit = 0;
|
|
}
|
|
renderSuggestion(item, el) {
|
|
el.innerHTML = unifiedToNative(item.item.unicode);
|
|
el.setAttr("aria-label", item.item.label);
|
|
}
|
|
getItemText(item) {
|
|
return item.label + item.desc;
|
|
}
|
|
getItems() {
|
|
const allEmojis = Object.keys(emojis).reduce(
|
|
(p3, c4) => [
|
|
...p3,
|
|
...emojis[c4].map((e4) => ({
|
|
label: e4.n[0],
|
|
desc: e4.n[1],
|
|
variants: e4.v,
|
|
unicode: e4.u
|
|
}))
|
|
],
|
|
[]
|
|
);
|
|
return allEmojis;
|
|
}
|
|
onChooseItem(item, evt) {
|
|
this.setIcon(item.unicode);
|
|
}
|
|
};
|
|
|
|
// src/components/FileSticker/FileSticker.tsx
|
|
var FileSticker = (props2) => {
|
|
const [vaultItem, setVaultItem] = p2(
|
|
vaultItemForPath(props2.plugin, props2.filePath)
|
|
);
|
|
const reloadIcon = (e4) => {
|
|
if (e4.detail.changeType == "sticker")
|
|
setVaultItem(vaultItemForPath(props2.plugin, props2.filePath));
|
|
};
|
|
h2(() => {
|
|
if ((vaultItem == null ? void 0 : vaultItem.path) != props2.filePath) {
|
|
setVaultItem(vaultItemForPath(props2.plugin, props2.filePath));
|
|
}
|
|
window.addEventListener(eventTypes.spacesChange, reloadIcon);
|
|
return () => {
|
|
window.removeEventListener(eventTypes.spacesChange, reloadIcon);
|
|
};
|
|
}, [props2.filePath]);
|
|
const triggerStickerMenu = (e4) => {
|
|
e4.stopPropagation();
|
|
let vaultChangeModal = new StickerModal(
|
|
props2.plugin.app,
|
|
(emoji) => saveFileSticker(props2.plugin, props2.filePath, emoji)
|
|
);
|
|
vaultChangeModal.open();
|
|
};
|
|
const color = vaultItem == null ? void 0 : vaultItem.color;
|
|
return /* @__PURE__ */ bn.createElement("div", {
|
|
className: "mk-file-icon"
|
|
}, /* @__PURE__ */ bn.createElement("button", {
|
|
"aria-label": i18n_default.buttons.changeIcon,
|
|
style: (color == null ? void 0 : color.length) > 0 ? {
|
|
"--label-color": `${vaultItem.color}`,
|
|
"--icon-color": `#ffffff`
|
|
} : {
|
|
"--icon-color": `var(--text-muted)`
|
|
},
|
|
dangerouslySetInnerHTML: (vaultItem == null ? void 0 : vaultItem.sticker) ? { __html: unifiedToNative(vaultItem.sticker) } : (vaultItem == null ? void 0 : vaultItem.folder) == "true" ? {
|
|
__html: color ? uiIconSet["mk-ui-folder-solid"] : uiIconSet["mk-ui-folder"]
|
|
} : {
|
|
__html: color ? uiIconSet["mk-ui-file-solid"] : uiIconSet["mk-ui-file"]
|
|
},
|
|
onClick: (e4) => triggerStickerMenu(e4)
|
|
}));
|
|
};
|
|
|
|
// src/components/ui/modals/vaultChangeModals.ts
|
|
var import_obsidian11 = require("obsidian");
|
|
var VaultChangeModal = class extends import_obsidian11.Modal {
|
|
constructor(plugin, file, action, space) {
|
|
super(plugin.app);
|
|
this.file = file;
|
|
this.action = action;
|
|
this.plugin = plugin;
|
|
this.space = space;
|
|
}
|
|
onOpen() {
|
|
let { contentEl } = this;
|
|
let myModal = this;
|
|
let headerText;
|
|
if (this.action === "rename") {
|
|
headerText = i18n_default.labels.rename;
|
|
} else if (this.action === "create folder") {
|
|
headerText = i18n_default.labels.createFolder;
|
|
} else if (this.action === "create note") {
|
|
headerText = i18n_default.labels.createNote;
|
|
}
|
|
const headerEl = contentEl.createEl("div", { text: headerText });
|
|
headerEl.addClass("modal-title");
|
|
const inputEl = contentEl.createEl("input");
|
|
inputEl.style.cssText = "width: 100%; height: 2.5em; margin-bottom: 15px;";
|
|
if (this.action === "rename") {
|
|
if (this.file.name.endsWith(".md")) {
|
|
inputEl.value = this.file.name.substring(
|
|
0,
|
|
this.file.name.lastIndexOf(".")
|
|
);
|
|
} else {
|
|
inputEl.value = this.file.name;
|
|
}
|
|
}
|
|
inputEl.focus();
|
|
let changeButtonText;
|
|
if (this.action === "rename") {
|
|
changeButtonText = i18n_default.buttons.rename;
|
|
} else if (this.action === "create folder") {
|
|
changeButtonText = i18n_default.buttons.createFolder;
|
|
} else if (this.action === "create note") {
|
|
changeButtonText = i18n_default.buttons.createNote;
|
|
}
|
|
const changeButton = contentEl.createEl("button", {
|
|
text: changeButtonText
|
|
});
|
|
const cancelButton = contentEl.createEl("button", {
|
|
text: i18n_default.buttons.cancel
|
|
});
|
|
cancelButton.style.cssText = "float: right;";
|
|
cancelButton.addEventListener("click", () => {
|
|
myModal.close();
|
|
});
|
|
const onClickAction = async () => {
|
|
let newName = inputEl.value;
|
|
if (this.action === "rename") {
|
|
if (this.file.name.endsWith(".md"))
|
|
newName = newName + ".md";
|
|
this.app.fileManager.renameFile(
|
|
this.file,
|
|
this.file.parent.path == "/" ? newName : this.file.parent.path + "/" + newName
|
|
);
|
|
} else if (this.action === "create folder") {
|
|
const path = !this.file || this.file.path == "/" ? newName : this.file.path + "/" + newName;
|
|
if (getAbstractFileAtPath(app, path)) {
|
|
new import_obsidian11.Notice(i18n_default.notice.folderExists);
|
|
return;
|
|
}
|
|
this.app.vault.createFolder(path);
|
|
if (this.space != "/")
|
|
addPathsToSpace(this.plugin, this.space, [path]);
|
|
}
|
|
myModal.close();
|
|
};
|
|
changeButton.addEventListener("click", onClickAction);
|
|
inputEl.addEventListener("keydown", (e4) => {
|
|
if (e4.key === "Enter")
|
|
onClickAction();
|
|
});
|
|
}
|
|
onClose() {
|
|
let { contentEl } = this;
|
|
contentEl.empty();
|
|
}
|
|
};
|
|
var MoveSuggestionModal = class extends import_obsidian11.FuzzySuggestModal {
|
|
constructor(app2, files) {
|
|
super(app2);
|
|
this.files = files;
|
|
}
|
|
getItemText(item) {
|
|
return item.path;
|
|
}
|
|
getItems() {
|
|
return getAllFoldersInVault(this.app);
|
|
}
|
|
onChooseItem(item, evt) {
|
|
this.files.forEach((f4) => {
|
|
const file = getAbstractFileAtPath(app, f4);
|
|
if (file) {
|
|
this.app.vault.rename(file, item.path + "/" + file.name);
|
|
}
|
|
});
|
|
}
|
|
};
|
|
function getAllFoldersInVault(app2) {
|
|
let folders = [];
|
|
let rootFolder = app2.vault.getRoot();
|
|
folders.push(rootFolder);
|
|
function recursiveFx(folder) {
|
|
for (let child of folder.children) {
|
|
if (child instanceof import_obsidian11.TFolder) {
|
|
let childFolder = child;
|
|
folders.push(childFolder);
|
|
if (childFolder.children)
|
|
recursiveFx(childFolder);
|
|
}
|
|
}
|
|
}
|
|
recursiveFx(rootFolder);
|
|
return folders;
|
|
}
|
|
|
|
// src/components/ui/modals/editSpaceModal.ts
|
|
var import_obsidian12 = require("obsidian");
|
|
var EditSpaceModal = class extends import_obsidian12.Modal {
|
|
constructor(plugin, space, action) {
|
|
super(plugin.app);
|
|
this.space = space;
|
|
this.action = action;
|
|
this.plugin = plugin;
|
|
}
|
|
onOpen() {
|
|
let { contentEl } = this;
|
|
let myModal = this;
|
|
let headerText;
|
|
if (this.action === "rename") {
|
|
headerText = i18n_default.labels.renameSection;
|
|
} else if (this.action === "create") {
|
|
headerText = i18n_default.labels.createSection;
|
|
}
|
|
const headerEl = contentEl.createEl("div", { text: headerText });
|
|
headerEl.addClass("modal-title");
|
|
const inputEl = contentEl.createEl("input");
|
|
inputEl.style.cssText = "width: 100%; height: 2.5em; margin-bottom: 15px;";
|
|
if (this.action === "rename") {
|
|
inputEl.value = this.space;
|
|
}
|
|
inputEl.focus();
|
|
let changeButtonText;
|
|
if (this.action === "rename") {
|
|
changeButtonText = i18n_default.buttons.rename;
|
|
} else if (this.action === "create") {
|
|
changeButtonText = i18n_default.buttons.createSection;
|
|
}
|
|
const changeButton = contentEl.createEl("button", {
|
|
text: changeButtonText
|
|
});
|
|
const cancelButton = contentEl.createEl("button", {
|
|
text: i18n_default.buttons.cancel
|
|
});
|
|
cancelButton.style.cssText = "float: right;";
|
|
cancelButton.addEventListener("click", () => {
|
|
myModal.close();
|
|
});
|
|
const onClickAction = async () => {
|
|
let newName = inputEl.value.replace(/\//g, "");
|
|
if (newName.length == 0) {
|
|
new import_obsidian12.Notice(i18n_default.notice.newSpaceName);
|
|
return;
|
|
}
|
|
if (retrieveSpaces(this.plugin).find((f4) => f4.name == newName)) {
|
|
new import_obsidian12.Notice(i18n_default.notice.duplicateSpaceName);
|
|
return;
|
|
}
|
|
if (this.action === "rename") {
|
|
renameSpace(this.plugin, this.space, newName);
|
|
} else if (this.action === "create") {
|
|
insertSpaceAtIndex(this.plugin, newName, false, 0);
|
|
}
|
|
myModal.close();
|
|
};
|
|
changeButton.addEventListener("click", onClickAction);
|
|
inputEl.addEventListener("keydown", (e4) => {
|
|
if (e4.key === "Enter")
|
|
onClickAction();
|
|
});
|
|
}
|
|
onClose() {
|
|
let { contentEl } = this;
|
|
contentEl.empty();
|
|
}
|
|
};
|
|
|
|
// src/hooks/useLongPress.tsx
|
|
function isMouseEvent(e4) {
|
|
return e4 && "screenX" in e4;
|
|
}
|
|
|
|
// src/components/ui/menus/fileMenu.tsx
|
|
var import_obsidian13 = require("obsidian");
|
|
|
|
// src/utils/color.ts
|
|
var colors = [
|
|
["Red", "#eb3b5a"],
|
|
["Orange", "#fa8231"],
|
|
["Yellow", "#f7b731"],
|
|
["Green", "#20bf6b"],
|
|
["Turquoise", "#0fb9b1"],
|
|
["Teal", "#2d98da"],
|
|
["Blue", "#3867d6"],
|
|
["Purple", "#8854d0"],
|
|
["Charcoal", "#4b6584"]
|
|
];
|
|
|
|
// src/components/ui/menus/fileMenu.tsx
|
|
var triggerSectionMenu = (plugin, spaceName, spaces2, e4) => {
|
|
const fileMenu = new import_obsidian13.Menu();
|
|
const space = spaces2.find((f4) => f4.name == spaceName);
|
|
fileMenu.addItem((menuItem) => {
|
|
var _a2;
|
|
const pinned = ((_a2 = spaces2.find((f4) => f4.name == spaceName)) == null ? void 0 : _a2.pinned) == "true";
|
|
if (pinned) {
|
|
menuItem.setTitle(i18n_default.menu.unpinSpace);
|
|
} else {
|
|
menuItem.setTitle(i18n_default.menu.pinSpace);
|
|
}
|
|
menuItem.setIcon("pin");
|
|
menuItem.onClick((ev) => {
|
|
toggleSpacePin(plugin, spaceName, !pinned);
|
|
});
|
|
});
|
|
if (plugin.settings.spacesStickers) {
|
|
fileMenu.addSeparator();
|
|
fileMenu.addItem((menuItem) => {
|
|
menuItem.setTitle(i18n_default.buttons.changeIcon);
|
|
menuItem.setIcon("lucide-sticker");
|
|
menuItem.onClick((ev) => {
|
|
let vaultChangeModal = new StickerModal(
|
|
plugin.app,
|
|
(emoji) => saveSpaceIcon(plugin, spaceName, emoji)
|
|
);
|
|
vaultChangeModal.open();
|
|
});
|
|
});
|
|
fileMenu.addItem((menuItem) => {
|
|
menuItem.setTitle(i18n_default.buttons.removeIcon);
|
|
menuItem.setIcon("lucide-file-minus");
|
|
menuItem.onClick((ev) => {
|
|
removeSpaceIcon(plugin, spaceName);
|
|
});
|
|
});
|
|
}
|
|
fileMenu.addSeparator();
|
|
fileMenu.addItem((menuItem) => {
|
|
menuItem.setTitle(i18n_default.menu.collapseAll);
|
|
menuItem.setIcon("lucide-chevrons-down-up");
|
|
menuItem.onClick((ev) => {
|
|
plugin.settings.expandedFolders = {
|
|
...plugin.settings.expandedFolders,
|
|
[spaceName]: []
|
|
};
|
|
plugin.saveSettings();
|
|
});
|
|
});
|
|
fileMenu.addSeparator();
|
|
fileMenu.addItem((menuItem) => {
|
|
const sortOption = ["rank", true];
|
|
menuItem.setTitle(i18n_default.menu.customSort);
|
|
menuItem.setChecked(
|
|
space.sort == JSON.stringify(sortOption) || space.sort == ""
|
|
);
|
|
menuItem.onClick((ev) => {
|
|
updateSpaceSort(plugin, spaceName, sortOption);
|
|
});
|
|
});
|
|
fileMenu.addSeparator();
|
|
fileMenu.addItem((menuItem) => {
|
|
const sortOption = ["path", true];
|
|
menuItem.setTitle(i18n_default.menu.fileNameSortAlphaAsc);
|
|
menuItem.setChecked(space.sort == JSON.stringify(sortOption));
|
|
menuItem.onClick((ev) => {
|
|
updateSpaceSort(plugin, spaceName, sortOption);
|
|
});
|
|
});
|
|
fileMenu.addItem((menuItem) => {
|
|
const sortOption = ["path", false];
|
|
menuItem.setTitle(i18n_default.menu.fileNameSortAlphaDesc);
|
|
menuItem.setChecked(space.sort == JSON.stringify(sortOption));
|
|
menuItem.onClick((ev) => {
|
|
updateSpaceSort(plugin, spaceName, sortOption);
|
|
});
|
|
});
|
|
fileMenu.addSeparator();
|
|
fileMenu.addItem((menuItem) => {
|
|
const sortOption = ["created", false];
|
|
menuItem.setTitle(i18n_default.menu.createdTimeSortAsc);
|
|
menuItem.setChecked(space.sort == JSON.stringify(sortOption));
|
|
menuItem.onClick((ev) => {
|
|
updateSpaceSort(plugin, spaceName, sortOption);
|
|
});
|
|
});
|
|
fileMenu.addItem((menuItem) => {
|
|
const sortOption = ["created", true];
|
|
menuItem.setTitle(i18n_default.menu.createdTimeSortDesc);
|
|
menuItem.setChecked(space.sort == JSON.stringify(sortOption));
|
|
menuItem.onClick((ev) => {
|
|
updateSpaceSort(plugin, spaceName, sortOption);
|
|
});
|
|
});
|
|
fileMenu.addSeparator();
|
|
fileMenu.addItem((menuItem) => {
|
|
menuItem.setTitle(i18n_default.menu.edit);
|
|
menuItem.setIcon("pencil");
|
|
menuItem.onClick((ev) => {
|
|
let vaultChangeModal = new EditSpaceModal(
|
|
plugin,
|
|
space.name,
|
|
"rename"
|
|
);
|
|
vaultChangeModal.open();
|
|
});
|
|
});
|
|
fileMenu.addItem((menuItem) => {
|
|
menuItem.setTitle(i18n_default.menu.deleteSpace);
|
|
menuItem.setIcon("trash");
|
|
menuItem.onClick((ev) => {
|
|
removeSpace(plugin, space.name);
|
|
});
|
|
});
|
|
if (isMouseEvent(e4)) {
|
|
fileMenu.showAtPosition({ x: e4.pageX, y: e4.pageY });
|
|
} else {
|
|
fileMenu.showAtPosition({
|
|
x: e4.nativeEvent.locationX,
|
|
y: e4.nativeEvent.locationY
|
|
});
|
|
}
|
|
return false;
|
|
};
|
|
var triggerMultiFileMenu = (plugin, selectedFiles2, e4) => {
|
|
const files = selectedFiles2.map((s5) => s5.item.path);
|
|
const spaces2 = retrieveSpaces(plugin);
|
|
const spaceItems = retrieveSpaceItems(plugin, spaces2);
|
|
const fileMenu = new import_obsidian13.Menu();
|
|
fileMenu.addSeparator();
|
|
fileMenu.addItem((menuItem) => {
|
|
menuItem.setTitle(i18n_default.menu.spaceTitle);
|
|
menuItem.setDisabled(true);
|
|
});
|
|
spaces2.map((f4) => {
|
|
fileMenu.addItem((menuItem) => {
|
|
const allIn = files.reduce(
|
|
(p3, c4) => {
|
|
var _a2;
|
|
return p3 ? (_a2 = spaceItems[f4.name]) == null ? void 0 : _a2.some((g4) => g4.path == c4) : p3;
|
|
},
|
|
true
|
|
);
|
|
if (allIn) {
|
|
menuItem.setIcon("checkmark");
|
|
menuItem.setTitle(f4.name);
|
|
} else {
|
|
menuItem.setTitle(f4.name);
|
|
menuItem.setIcon("plus");
|
|
}
|
|
menuItem.onClick((ev) => {
|
|
if (allIn) {
|
|
removePathsFromSpace(plugin, f4.name, files);
|
|
} else {
|
|
addPathsToSpace(plugin, f4.name, files);
|
|
}
|
|
});
|
|
});
|
|
});
|
|
if (plugin.settings.spacesStickers) {
|
|
fileMenu.addSeparator();
|
|
fileMenu.addItem((menuItem) => {
|
|
menuItem.setIcon("palette");
|
|
disclosureMenuItem(
|
|
menuItem,
|
|
false,
|
|
false,
|
|
i18n_default.menu.changeColor,
|
|
"",
|
|
[
|
|
{ name: "None", value: "" },
|
|
...colors.map((f4) => ({ name: f4[0], value: f4[1] }))
|
|
],
|
|
(_5, values) => {
|
|
saveFileColors(plugin, files, values[0]);
|
|
}
|
|
);
|
|
});
|
|
fileMenu.addItem((menuItem) => {
|
|
menuItem.setTitle(i18n_default.buttons.changeIcon);
|
|
menuItem.setIcon("lucide-sticker");
|
|
menuItem.onClick((ev) => {
|
|
let vaultChangeModal = new StickerModal(
|
|
plugin.app,
|
|
(emoji) => saveFileIcons(plugin, files, emoji)
|
|
);
|
|
vaultChangeModal.open();
|
|
});
|
|
});
|
|
fileMenu.addItem((menuItem) => {
|
|
menuItem.setTitle(i18n_default.buttons.removeIcon);
|
|
menuItem.setIcon("lucide-file-minus");
|
|
menuItem.onClick((ev) => {
|
|
removeFileIcons(plugin, files);
|
|
});
|
|
});
|
|
}
|
|
fileMenu.addSeparator();
|
|
fileMenu.addItem((menuItem) => {
|
|
menuItem.setTitle(i18n_default.menu.deleteFiles);
|
|
menuItem.setIcon("trash");
|
|
menuItem.onClick((ev) => {
|
|
deleteFiles(plugin, files);
|
|
});
|
|
});
|
|
fileMenu.addItem((menuItem) => {
|
|
menuItem.setIcon("go-to-file");
|
|
menuItem.setTitle(i18n_default.menu.openFilePane);
|
|
menuItem.onClick((ev) => {
|
|
files.forEach(
|
|
(file) => openAFile(getAbstractFileAtPath(app, file), plugin, true)
|
|
);
|
|
});
|
|
});
|
|
if (!internalPluginLoaded("file-explorer", plugin.app)) {
|
|
fileMenu.addItem((menuItem) => {
|
|
menuItem.setTitle(i18n_default.menu.moveFile);
|
|
menuItem.setIcon("paper-plane");
|
|
menuItem.onClick((ev) => {
|
|
let fileMoveSuggester = new MoveSuggestionModal(plugin.app, files);
|
|
fileMoveSuggester.open();
|
|
});
|
|
});
|
|
}
|
|
if (isMouseEvent(e4)) {
|
|
fileMenu.showAtPosition({ x: e4.pageX, y: e4.pageY });
|
|
} else {
|
|
fileMenu.showAtPosition({
|
|
x: e4.nativeEvent.locationX,
|
|
y: e4.nativeEvent.locationY
|
|
});
|
|
}
|
|
return false;
|
|
};
|
|
var triggerFileMenu = (plugin, file, isFolder, e4) => {
|
|
const spaces2 = retrieveSpaces(plugin);
|
|
const spaceItems = retrieveSpaceItems(plugin, spaces2);
|
|
const fileMenu = new import_obsidian13.Menu();
|
|
if (isFolder) {
|
|
fileMenu.addSeparator();
|
|
fileMenu.addItem((menuItem) => {
|
|
menuItem.setIcon("edit");
|
|
menuItem.setTitle(i18n_default.buttons.createNote);
|
|
menuItem.onClick((ev) => {
|
|
newFileInFolder(plugin, file);
|
|
});
|
|
});
|
|
fileMenu.addItem((menuItem) => {
|
|
menuItem.setIcon("folder-plus");
|
|
menuItem.setTitle(i18n_default.buttons.createFolder);
|
|
menuItem.onClick((ev) => {
|
|
let vaultChangeModal = new VaultChangeModal(
|
|
plugin,
|
|
file,
|
|
"create folder",
|
|
"/"
|
|
);
|
|
vaultChangeModal.open();
|
|
});
|
|
});
|
|
}
|
|
fileMenu.addSeparator();
|
|
fileMenu.addItem((menuItem) => {
|
|
menuItem.setTitle(i18n_default.menu.spaceTitle);
|
|
menuItem.setDisabled(true);
|
|
});
|
|
spaces2.map((f4, i4) => {
|
|
var _a2;
|
|
const itemExists = (_a2 = spaceItems[f4.name]) == null ? void 0 : _a2.some((g4) => g4.path == file.path);
|
|
fileMenu.addItem((menuItem) => {
|
|
var _a3;
|
|
menuItem.setTitle(f4.name);
|
|
if (((_a3 = f4.def) == null ? void 0 : _a3.length) > 0) {
|
|
menuItem.setDisabled(true);
|
|
menuItem.setIcon("folder");
|
|
} else {
|
|
if (itemExists) {
|
|
menuItem.setIcon("checkmark");
|
|
} else {
|
|
menuItem.setIcon("plus");
|
|
}
|
|
menuItem.onClick((ev) => {
|
|
if (!itemExists) {
|
|
insertSpaceItemAtIndex(plugin, f4.name, file.path, 0);
|
|
} else {
|
|
removePathsFromSpace(plugin, f4.name, [file.path]);
|
|
}
|
|
});
|
|
}
|
|
});
|
|
});
|
|
if (isFolder) {
|
|
fileMenu.addSeparator();
|
|
fileMenu.addItem((menuItem) => {
|
|
menuItem.setTitle(i18n_default.menu.createFolderSpace);
|
|
menuItem.setIcon("plus-square");
|
|
menuItem.onClick((ev) => {
|
|
insertSpaceAtIndex(plugin, file.name, false, 0, file.path);
|
|
});
|
|
});
|
|
}
|
|
if (plugin.settings.spacesStickers) {
|
|
fileMenu.addSeparator();
|
|
fileMenu.addItem((menuItem) => {
|
|
menuItem.setIcon("palette");
|
|
disclosureMenuItem(
|
|
menuItem,
|
|
false,
|
|
false,
|
|
i18n_default.menu.changeColor,
|
|
"",
|
|
[
|
|
{ name: "None", value: "" },
|
|
...colors.map((f4) => ({ name: f4[0], value: f4[1] }))
|
|
],
|
|
(_5, values) => {
|
|
saveFileColor(plugin, file.path, values[0]);
|
|
}
|
|
);
|
|
});
|
|
fileMenu.addItem((menuItem) => {
|
|
menuItem.setTitle(i18n_default.buttons.changeIcon);
|
|
menuItem.setIcon("lucide-sticker");
|
|
menuItem.onClick((ev) => {
|
|
let vaultChangeModal = new StickerModal(
|
|
plugin.app,
|
|
(emoji) => saveFileIcon(plugin, file, emoji)
|
|
);
|
|
vaultChangeModal.open();
|
|
});
|
|
});
|
|
fileMenu.addItem((menuItem) => {
|
|
menuItem.setTitle(i18n_default.buttons.removeIcon);
|
|
menuItem.setIcon("lucide-file-minus");
|
|
menuItem.onClick((ev) => {
|
|
removeFileIcon(plugin, file);
|
|
});
|
|
});
|
|
}
|
|
fileMenu.addSeparator();
|
|
fileMenu.addItem((menuItem) => {
|
|
menuItem.setTitle(i18n_default.menu.rename);
|
|
menuItem.setIcon("pencil");
|
|
menuItem.onClick((ev) => {
|
|
let vaultChangeModal = new VaultChangeModal(plugin, file, "rename");
|
|
vaultChangeModal.open();
|
|
});
|
|
});
|
|
fileMenu.addItem((menuItem) => {
|
|
menuItem.setTitle(i18n_default.menu.delete);
|
|
menuItem.setIcon("trash");
|
|
menuItem.onClick((ev) => {
|
|
let deleteOption = plugin.settings.deleteFileOption;
|
|
if (deleteOption === "permanent") {
|
|
plugin.app.vault.delete(file, true);
|
|
} else if (deleteOption === "system-trash") {
|
|
plugin.app.vault.trash(file, true);
|
|
} else if (deleteOption === "trash") {
|
|
plugin.app.vault.trash(file, false);
|
|
}
|
|
});
|
|
});
|
|
fileMenu.addItem((menuItem) => {
|
|
menuItem.setIcon("go-to-file");
|
|
menuItem.setTitle(i18n_default.menu.openFilePane);
|
|
menuItem.onClick((ev) => {
|
|
openFileInNewPane(plugin, { ...file, isFolder });
|
|
});
|
|
});
|
|
fileMenu.addItem((menuItem) => {
|
|
menuItem.setTitle(i18n_default.menu.duplicate);
|
|
menuItem.setIcon("documents");
|
|
menuItem.onClick((ev) => {
|
|
if (file.basename && file.extension)
|
|
plugin.app.vault.copy(
|
|
file,
|
|
`${file.parent.path}/${file.basename} 1.${file.extension}`
|
|
);
|
|
});
|
|
});
|
|
if (!internalPluginLoaded("file-explorer", plugin.app)) {
|
|
fileMenu.addItem((menuItem) => {
|
|
menuItem.setTitle(i18n_default.menu.moveFile);
|
|
menuItem.setIcon("paper-plane");
|
|
menuItem.onClick((ev) => {
|
|
let fileMoveSuggester = new MoveSuggestionModal(plugin.app, [
|
|
file.path
|
|
]);
|
|
fileMoveSuggester.open();
|
|
});
|
|
});
|
|
}
|
|
plugin.app.workspace.trigger("file-menu", fileMenu, file, "file-explorer");
|
|
if (isMouseEvent(e4)) {
|
|
fileMenu.showAtPosition({ x: e4.pageX, y: e4.pageY });
|
|
} else {
|
|
fileMenu.showAtPosition({
|
|
x: e4.nativeEvent.locationX,
|
|
y: e4.nativeEvent.locationY
|
|
});
|
|
}
|
|
return false;
|
|
};
|
|
|
|
// src/components/ContextView/DataTypeView/FileCell.tsx
|
|
var import_obsidian14 = require("obsidian");
|
|
var FileCell = (props2) => {
|
|
var _a2;
|
|
const fileOrCleanPath = (f4) => {
|
|
if (!f4)
|
|
return {
|
|
path: ""
|
|
};
|
|
const isInFolder = !props2.isFolder || f4.includes(props2.folder);
|
|
const fileExists2 = getAbstractFileAtPath(app, f4);
|
|
const cleanPath = (path) => path.replace(props2.folder + "/", "").replace(".md", "");
|
|
return isInFolder ? fileExists2 ? { path: f4, file: fileExists2 } : { path: cleanPath(f4) } : { path: f4 };
|
|
};
|
|
const initialValue = (props2.multi ? (_a2 = splitString(props2.initialValue)) != null ? _a2 : [] : [props2.initialValue]).map((f4) => fileOrCleanPath(f4));
|
|
const [value, setValue] = p2(initialValue);
|
|
const ref = _2(null);
|
|
const onKeyDown = (e4) => {
|
|
e4.stopPropagation();
|
|
e4.key == "Enter" && e4.target.blur();
|
|
};
|
|
const fileExists = (name) => {
|
|
if (!name)
|
|
return false;
|
|
return getAbstractFileAtPath(app, `${props2.folder}/${name}.md`) ? true : false;
|
|
};
|
|
const onBlur = () => {
|
|
var _a3;
|
|
if (!ref.current)
|
|
return;
|
|
if (fileExists((_a3 = ref.current) == null ? void 0 : _a3.value)) {
|
|
new import_obsidian14.Notice(i18n_default.notice.fileExists);
|
|
} else {
|
|
props2.saveValue(ref.current.value);
|
|
props2.setEditMode(null);
|
|
}
|
|
};
|
|
const newFile = async (file) => {
|
|
const filePath = file.path.replace(/\//g, "").replace(/\./g, "");
|
|
const path = `${props2.folder}/${filePath}.md`;
|
|
if (filePath.length == 0) {
|
|
return;
|
|
}
|
|
if (fileExists(path)) {
|
|
new import_obsidian14.Notice(i18n_default.notice.fileExists);
|
|
} else {
|
|
await createNewMarkdownFile(
|
|
props2.plugin,
|
|
getAbstractFileAtPath(app, props2.folder),
|
|
filePath
|
|
);
|
|
}
|
|
};
|
|
const deleteRow = () => {
|
|
props2.deleteRow();
|
|
};
|
|
h2(() => {
|
|
var _a3;
|
|
if (props2.editMode == 2) {
|
|
(_a3 = ref == null ? void 0 : ref.current) == null ? void 0 : _a3.focus();
|
|
}
|
|
}, [props2.editMode]);
|
|
return /* @__PURE__ */ bn.createElement("div", {
|
|
className: "mk-cell-file"
|
|
}, value.map((v3, i4) => {
|
|
var _a3;
|
|
if (props2.editMode == 0) {
|
|
if (v3.file) {
|
|
return /* @__PURE__ */ bn.createElement("div", {
|
|
className: "mk-cell-file-title"
|
|
}, v3 ? v3.file instanceof import_obsidian14.TFile ? fileNameToString(v3.file.name) : v3.file.name : "", (v3 == null ? void 0 : v3.file) instanceof import_obsidian14.TFile && v3.file.extension != "md" && /* @__PURE__ */ bn.createElement("span", {
|
|
className: "nav-file-tag"
|
|
}, (_a3 = v3.file) == null ? void 0 : _a3.extension), /* @__PURE__ */ bn.createElement("button", {
|
|
"aria-label": i18n_default.buttons.toggleFlow,
|
|
className: "mk-cell-file-flow mk-inline-button",
|
|
dangerouslySetInnerHTML: {
|
|
__html: uiIconSet["mk-ui-flow-hover"]
|
|
},
|
|
onClick: () => props2.openFlow && props2.openFlow()
|
|
}));
|
|
} else {
|
|
return /* @__PURE__ */ bn.createElement("div", {
|
|
className: "mk-cell-file-title"
|
|
}, v3.path);
|
|
}
|
|
}
|
|
if (v3.file) {
|
|
return /* @__PURE__ */ bn.createElement(bn.Fragment, null, /* @__PURE__ */ bn.createElement("div", {
|
|
className: "mk-cell-file-item",
|
|
onContextMenu: (e4) => triggerFileMenu(
|
|
props2.plugin,
|
|
v3.file,
|
|
v3.file instanceof import_obsidian14.TFolder,
|
|
e4
|
|
)
|
|
}, /* @__PURE__ */ bn.createElement(FileSticker, {
|
|
plugin: props2.plugin,
|
|
filePath: v3.file.path
|
|
}), /* @__PURE__ */ bn.createElement("div", {
|
|
className: "mk-cell-file-name",
|
|
onClick: (e4) => openFile(
|
|
{ ...v3.file, isFolder: v3.file instanceof import_obsidian14.TFolder },
|
|
props2.plugin,
|
|
e4.ctrlKey || e4.metaKey
|
|
)
|
|
}, v3 ? v3.file instanceof import_obsidian14.TFile ? fileNameToString(v3.file.name) : v3.file.name : "")));
|
|
}
|
|
return /* @__PURE__ */ bn.createElement(bn.Fragment, null, /* @__PURE__ */ bn.createElement("div", {
|
|
className: "mk-cell-file-item"
|
|
}, /* @__PURE__ */ bn.createElement("div", {
|
|
className: "mk-file-icon"
|
|
}, /* @__PURE__ */ bn.createElement("button", {
|
|
onClick: (e4) => newFile(v3),
|
|
dangerouslySetInnerHTML: {
|
|
__html: uiIconSet["mk-ui-new-file"]
|
|
}
|
|
})), props2.editMode > 1 ? /* @__PURE__ */ bn.createElement("input", {
|
|
className: "mk-cell-file-name",
|
|
type: "text",
|
|
placeholder: "Untitled",
|
|
ref,
|
|
value: v3.path,
|
|
onKeyDown,
|
|
onBlur
|
|
}) : /* @__PURE__ */ bn.createElement("div", {
|
|
className: "mk-cell-file-name"
|
|
}, v3.path)));
|
|
}));
|
|
};
|
|
|
|
// src/components/ContextView/DataTypeView/FilePropertyCell.tsx
|
|
var FilePropertyCell = (props2) => {
|
|
const { property } = props2;
|
|
const [cache, setCache] = p2(null);
|
|
const initialValue = props2.initialValue;
|
|
if (property == "folder") {
|
|
return /* @__PURE__ */ bn.createElement("div", {
|
|
className: "mk-cell-fileprop",
|
|
onClick: () => {
|
|
openTFolder(
|
|
getAbstractFileAtPath(app, initialValue),
|
|
props2.plugin,
|
|
false
|
|
);
|
|
}
|
|
}, folderPathToString(initialValue));
|
|
}
|
|
if (property == "extension") {
|
|
return /* @__PURE__ */ bn.createElement("div", {
|
|
className: "mk-cell-fileprop"
|
|
}, initialValue);
|
|
} else if (property == "ctime" || property == "mtime") {
|
|
const date = new Date(parseInt(initialValue)).getTime() ? new Date(parseInt(initialValue)) : null;
|
|
return /* @__PURE__ */ bn.createElement("div", {
|
|
className: "mk-cell-fileprop"
|
|
}, date && formatDistance3(new Date(date), new Date(), { addSuffix: true }));
|
|
} else if (property == "size") {
|
|
return /* @__PURE__ */ bn.createElement("div", {
|
|
className: "mk-cell-fileprop"
|
|
}, initialValue);
|
|
}
|
|
return /* @__PURE__ */ bn.createElement("div", {
|
|
className: "mk-cell-fileprop"
|
|
}, initialValue);
|
|
};
|
|
|
|
// src/components/ContextView/DataTypeView/NumberCell.tsx
|
|
var NumberCell = (props2) => {
|
|
const { initialValue, saveValue } = props2;
|
|
const [value, setValue] = bn.useState(initialValue);
|
|
const ref = _2(null);
|
|
const onBlur = () => {
|
|
if (initialValue != value)
|
|
saveValue(value);
|
|
};
|
|
const onKeyDown = (e4) => {
|
|
e4.stopPropagation();
|
|
if (e4.key == "Enter") {
|
|
e4.target.blur();
|
|
props2.setEditMode(null);
|
|
}
|
|
if (e4.key == "Escape") {
|
|
setValue(initialValue);
|
|
e4.target.blur();
|
|
props2.setEditMode(null);
|
|
}
|
|
};
|
|
bn.useEffect(() => {
|
|
setValue(initialValue);
|
|
}, [initialValue]);
|
|
h2(() => {
|
|
var _a2;
|
|
if (props2.editMode == 2) {
|
|
(_a2 = ref == null ? void 0 : ref.current) == null ? void 0 : _a2.focus();
|
|
}
|
|
}, [props2.editMode]);
|
|
return props2.editMode > 1 ? /* @__PURE__ */ bn.createElement("input", {
|
|
className: "mk-cell-text",
|
|
type: "number",
|
|
step: "any",
|
|
ref,
|
|
value,
|
|
onChange: (e4) => setValue(e4.target.value),
|
|
onKeyDown,
|
|
onBlur
|
|
}) : /* @__PURE__ */ bn.createElement("div", {
|
|
className: "mk-cell-number"
|
|
}, value);
|
|
};
|
|
|
|
// src/components/ContextView/DataTypeView/TextCell.tsx
|
|
var TextCell = (props2) => {
|
|
const { initialValue, saveValue } = props2;
|
|
const [value, setValue] = bn.useState(initialValue);
|
|
const ref = _2(null);
|
|
const onBlur = () => {
|
|
if (initialValue != value)
|
|
saveValue(value);
|
|
};
|
|
const onKeyDown = (e4) => {
|
|
e4.stopPropagation();
|
|
if (e4.key == "Enter") {
|
|
e4.target.blur();
|
|
props2.setEditMode(null);
|
|
}
|
|
if (e4.key == "Escape") {
|
|
setValue(initialValue);
|
|
e4.target.blur();
|
|
props2.setEditMode(null);
|
|
}
|
|
};
|
|
bn.useEffect(() => {
|
|
setValue(initialValue);
|
|
}, [initialValue]);
|
|
h2(() => {
|
|
var _a2;
|
|
if (props2.editMode == 2) {
|
|
(_a2 = ref == null ? void 0 : ref.current) == null ? void 0 : _a2.focus();
|
|
}
|
|
}, [props2.editMode]);
|
|
return props2.editMode > 1 ? /* @__PURE__ */ bn.createElement("input", {
|
|
onClick: (e4) => e4.stopPropagation(),
|
|
className: "mk-cell-text",
|
|
ref,
|
|
type: "text",
|
|
value,
|
|
onChange: (e4) => setValue(e4.target.value),
|
|
onKeyDown,
|
|
onBlur
|
|
}) : /* @__PURE__ */ bn.createElement("div", {
|
|
className: "mk-cell-text"
|
|
}, value);
|
|
};
|
|
|
|
// src/components/ui/menus/propertyMenu.tsx
|
|
var import_obsidian15 = require("obsidian");
|
|
var PropertyMenuComponent = (props2) => {
|
|
var _a2;
|
|
const [field, setField] = p2(props2.field);
|
|
const selectedType = (_5, value) => {
|
|
const newField = { ...field, type: value[0], value: getNewValueForType(field, value) };
|
|
setField(newField);
|
|
props2.saveField(newField);
|
|
};
|
|
const selectedValue = (_5, value) => {
|
|
const newField = { ...field, value: value[0] };
|
|
setField(newField);
|
|
props2.saveField(newField);
|
|
};
|
|
const selectedContext = (_5, value) => {
|
|
const newField = { ...field, value: value[0] };
|
|
setField(newField);
|
|
props2.saveContext(newField, value);
|
|
};
|
|
const toggleMulti = () => {
|
|
const newField = {
|
|
...field,
|
|
type: field.type == fieldType.multiType ? fieldType.type : fieldType.multiType
|
|
};
|
|
setField(newField);
|
|
props2.saveField(newField);
|
|
};
|
|
const fieldType = (_a2 = fieldTypes.find(
|
|
(f4) => f4.type == field.type || f4.multiType == field.type
|
|
)) != null ? _a2 : fieldTypes[0];
|
|
const getNewValueForType = (f4, value) => {
|
|
if (value[0].startsWith("option")) {
|
|
return props2.options.join(",");
|
|
}
|
|
return value[0] == fieldType.type || value[0] == fieldType.multiType ? f4.value : null;
|
|
};
|
|
const selectType = (e4) => {
|
|
showSelectMenu(
|
|
e4.target.getBoundingClientRect(),
|
|
{
|
|
multi: false,
|
|
editable: false,
|
|
searchable: false,
|
|
saveOptions: selectedType,
|
|
value: [],
|
|
showAll: true,
|
|
options: fieldTypes.filter((f4) => !f4.restricted).map((f4, i4) => ({
|
|
id: i4 + 1,
|
|
name: f4.label,
|
|
value: f4.type,
|
|
icon: ""
|
|
}))
|
|
}
|
|
);
|
|
};
|
|
const selectContext = (e4) => {
|
|
var _a3;
|
|
showSelectMenu(
|
|
e4.target.getBoundingClientRect(),
|
|
{
|
|
multi: false,
|
|
editable: true,
|
|
searchable: true,
|
|
saveOptions: selectedContext,
|
|
placeholder: i18n_default.labels.propertyContext,
|
|
value: [(_a3 = field.value) != null ? _a3 : ""],
|
|
options: loadTags(props2.plugin).map((m5) => ({ name: m5, value: m5 }))
|
|
}
|
|
);
|
|
};
|
|
const selectFileProp = (e4) => {
|
|
const properties2 = props2.fields.filter((f4) => f4.type == "file" || f4.type == "context").reduce((p3, c4) => {
|
|
var _a3, _b2;
|
|
return [...p3, ...c4.type == "file" ? filePropTypes.map((f4) => ({
|
|
name: c4.name + "." + f4.name,
|
|
value: c4.name + "." + f4.value
|
|
})) : (_b2 = (_a3 = props2.context[c4.value]) == null ? void 0 : _a3.cols.filter((f4) => f4.hidden != "true").map((f4) => ({
|
|
name: c4.name + "." + f4.name,
|
|
value: c4.name + "." + f4.name
|
|
}))) != null ? _b2 : []];
|
|
}, []);
|
|
showSelectMenu(
|
|
e4.target.getBoundingClientRect(),
|
|
{
|
|
multi: false,
|
|
editable: true,
|
|
searchable: false,
|
|
saveOptions: selectedValue,
|
|
value: [],
|
|
options: properties2,
|
|
showAll: true
|
|
}
|
|
);
|
|
};
|
|
return /* @__PURE__ */ bn.createElement(bn.Fragment, null, /* @__PURE__ */ bn.createElement("div", {
|
|
className: "menu-item",
|
|
onClick: (e4) => selectType(e4)
|
|
}, /* @__PURE__ */ bn.createElement("span", null, i18n_default.labels.propertyType), /* @__PURE__ */ bn.createElement("span", null, fieldType.label)), fieldType.type == "context" ? /* @__PURE__ */ bn.createElement("div", {
|
|
className: "menu-item",
|
|
onClick: (e4) => selectContext(e4)
|
|
}, /* @__PURE__ */ bn.createElement("span", null, i18n_default.labels.propertyContext), /* @__PURE__ */ bn.createElement("span", null, field.value)) : fieldType.type == "fileprop" ? /* @__PURE__ */ bn.createElement("div", {
|
|
className: "menu-item",
|
|
onClick: (e4) => selectFileProp(e4)
|
|
}, /* @__PURE__ */ bn.createElement("span", null, i18n_default.labels.propertyFileProp), /* @__PURE__ */ bn.createElement("span", null, field.value)) : /* @__PURE__ */ bn.createElement(bn.Fragment, null), fieldType.multi ? /* @__PURE__ */ bn.createElement("div", {
|
|
className: "menu-item"
|
|
}, /* @__PURE__ */ bn.createElement("span", null, i18n_default.labels.multiple), /* @__PURE__ */ bn.createElement("input", {
|
|
type: "checkbox",
|
|
checked: field.type == fieldType.multiType,
|
|
onChange: () => toggleMulti()
|
|
})) : /* @__PURE__ */ bn.createElement(bn.Fragment, null));
|
|
};
|
|
var showPropertyMenu = (plugin, position, editable, options, field, fields, contextTables, saveField, saveContext, hide, deleteColumn, sortColumn, hidden) => {
|
|
const menu = new import_obsidian15.Menu();
|
|
menu.setUseNativeMenu(false);
|
|
if (editable) {
|
|
menu.addItem((menuItem) => {
|
|
var _a2;
|
|
inputMenuItem(
|
|
menuItem,
|
|
(_a2 = field == null ? void 0 : field.name) != null ? _a2 : "",
|
|
(value) => saveField({ ...field, name: value })
|
|
);
|
|
menuItem.setIcon("type");
|
|
});
|
|
menu.addSeparator();
|
|
const frag = document.createDocumentFragment();
|
|
const div = frag.createDiv();
|
|
div.addEventListener("click", (e4) => {
|
|
e4.stopImmediatePropagation();
|
|
});
|
|
div.addEventListener("keydown", (e4) => {
|
|
});
|
|
const root = createRoot(div);
|
|
root.render(
|
|
/* @__PURE__ */ bn.createElement(bn.Fragment, null, /* @__PURE__ */ bn.createElement(PropertyMenuComponent, {
|
|
plugin,
|
|
field,
|
|
fields,
|
|
context: contextTables,
|
|
options,
|
|
saveField,
|
|
saveContext
|
|
}))
|
|
);
|
|
menu.addItem((menuItem) => {
|
|
menuItem.setTitle(frag);
|
|
menuItem.dom.toggleClass("mk-properties", true);
|
|
});
|
|
menu.addSeparator();
|
|
if (!hidden) {
|
|
menu.addItem((menuItem) => {
|
|
menuItem.setTitle(i18n_default.menu.hideProperty);
|
|
menuItem.onClick(() => {
|
|
hide(field, true);
|
|
});
|
|
menuItem.setIcon("eye-off");
|
|
});
|
|
} else {
|
|
menu.addItem((menuItem) => {
|
|
menuItem.setTitle(i18n_default.menu.unhideProperty);
|
|
menuItem.onClick(() => {
|
|
hide(field, false);
|
|
});
|
|
menuItem.setIcon("eye");
|
|
});
|
|
}
|
|
menu.addItem((menuItem) => {
|
|
menuItem.setTitle(i18n_default.menu.deleteProperty);
|
|
menuItem.onClick(() => {
|
|
deleteColumn(field);
|
|
});
|
|
menuItem.setIcon("trash-2");
|
|
});
|
|
menu.addSeparator();
|
|
}
|
|
const sortableString = normalizedSortForType(field.type, false);
|
|
if (sortableString) {
|
|
menu.addItem((menuItem) => {
|
|
menuItem.setTitle(i18n_default.menu.sortAscending);
|
|
menuItem.setIcon("sort-asc");
|
|
menuItem.onClick(() => {
|
|
sortColumn(
|
|
{ field: field.name + field.table, type: normalizedSortForType(field.type, false) }
|
|
);
|
|
});
|
|
});
|
|
menu.addItem((menuItem) => {
|
|
menuItem.setTitle(i18n_default.menu.sortDescending);
|
|
menuItem.setIcon("sort-desc");
|
|
menuItem.onClick(() => {
|
|
sortColumn({ field: field.name + field.table, type: normalizedSortForType(field.type, true) });
|
|
});
|
|
});
|
|
}
|
|
menu.showAtPosition(position);
|
|
return menu;
|
|
};
|
|
|
|
// src/hooks/useCombinedRef.tsx
|
|
function useCombinedRefs2(...refs) {
|
|
return F(
|
|
() => (node) => {
|
|
refs.forEach((ref) => ref(node));
|
|
},
|
|
refs
|
|
);
|
|
}
|
|
|
|
// src/components/ContextView/TableView/ColumnHeader.tsx
|
|
var import_obsidian16 = require("obsidian");
|
|
var filePropTypes = [
|
|
{
|
|
name: i18n_default.properties.fileProperty.createdTime,
|
|
value: "ctime"
|
|
},
|
|
{
|
|
name: i18n_default.properties.fileProperty.modifiedTime,
|
|
value: "mtime"
|
|
},
|
|
{
|
|
name: i18n_default.properties.fileProperty.extension,
|
|
value: "extension"
|
|
},
|
|
{
|
|
name: i18n_default.properties.fileProperty.size,
|
|
value: "size"
|
|
},
|
|
{
|
|
name: i18n_default.properties.fileProperty.parentFolder,
|
|
value: "folder"
|
|
}
|
|
];
|
|
var ColumnHeader = (props2) => {
|
|
const [field, setField] = p2(props2.column);
|
|
const menuRef = _2(null);
|
|
const { loadContextFields, predicate, tableData, contextTable, cols, newColumn, saveColumn, hideColumn, sortColumn, delColumn } = q2(MDBContext);
|
|
h2(() => {
|
|
setField(props2.column);
|
|
}, [props2.column]);
|
|
const {
|
|
attributes,
|
|
listeners,
|
|
setNodeRef: setDraggableNodeRef,
|
|
transform
|
|
} = useDraggable({
|
|
id: field.name + field.table,
|
|
data: { name: field.name }
|
|
});
|
|
const { setNodeRef: setDroppableNodeRef } = useDroppable({
|
|
id: field.name + field.table,
|
|
data: { name: field.name }
|
|
});
|
|
const saveField = (field2) => {
|
|
if (field2.name.length > 0) {
|
|
if (field2.name != props2.column.name || field2.type != props2.column.type || field2.value != props2.column.value || field2.attrs != props2.column.attrs) {
|
|
const saveResult = saveColumn(field2, props2.column);
|
|
if (saveResult) {
|
|
if (props2.isNew) {
|
|
setField(props2.column);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
};
|
|
const saveContext = (field2, value) => {
|
|
const newContext = tagFromString(value[0]);
|
|
initiateContextIfNotExists(props2.plugin, newContext).then((f4) => {
|
|
if (f4) {
|
|
return insertContextItems(
|
|
props2.plugin,
|
|
optionValuesForColumn(
|
|
field2.name,
|
|
field2.table == "" ? tableData : contextTable[field2.table]
|
|
),
|
|
newContext
|
|
);
|
|
}
|
|
}).then((f4) => loadContextFields(newContext));
|
|
const newField = {
|
|
...field2,
|
|
value: newContext != null ? newContext : ""
|
|
};
|
|
setField(newField);
|
|
saveColumn(newField, props2.column);
|
|
};
|
|
const showNewMenu = (e4) => {
|
|
const offset = ref.current.getBoundingClientRect();
|
|
const files = tableData.rows.map((f4) => getAbstractFileAtPath(app, f4.File)).filter((f4) => f4 instanceof import_obsidian16.TFile);
|
|
const types = guestimateTypes(
|
|
files.map((f4) => f4.path),
|
|
props2.plugin,
|
|
false
|
|
);
|
|
const fmFields = files.reduce((p3, c4) => {
|
|
const fm = frontMatterForFile(c4);
|
|
const fmKeys = uniqCaseInsensitive(frontMatterKeys(fm));
|
|
return uniq([...p3, ...fmKeys]);
|
|
}, []).filter((f4) => !cols.some((g4) => g4.name == f4));
|
|
const allTypes = [
|
|
...fmFields.map((f4) => ({
|
|
name: f4,
|
|
description: i18n_default.labels.syncFrontmatterProperty,
|
|
value: "fm." + f4 + "." + yamlTypeToMDBType(types[f4])
|
|
})),
|
|
...fieldTypes.filter((f4) => f4.restricted != true).map((f4) => ({
|
|
name: f4.label,
|
|
description: i18n_default.labels.newProperty,
|
|
value: "type." + f4.type + "." + f4.label
|
|
}))
|
|
];
|
|
const saveOptions = (_5, values) => {
|
|
const newValue = values[0];
|
|
const newType = newValue.split(".");
|
|
if (newType[0] == "fm") {
|
|
newColumn({
|
|
name: uniqueNameFromString(
|
|
newType[1],
|
|
tableData.cols.map((f4) => f4.name)
|
|
),
|
|
schemaId: tableData.schema.id,
|
|
table: "",
|
|
type: newType[2]
|
|
});
|
|
} else if (newType[0] == "type") {
|
|
newColumn({
|
|
name: uniqueNameFromString(
|
|
newType[2],
|
|
tableData.cols.map((f4) => f4.name)
|
|
),
|
|
schemaId: tableData.schema.id,
|
|
table: "",
|
|
type: newType[1]
|
|
});
|
|
}
|
|
};
|
|
showSelectMenu(
|
|
{ x: offset.left, y: offset.top + 30 },
|
|
{
|
|
multi: false,
|
|
editable: false,
|
|
value: [],
|
|
saveOptions,
|
|
placeholder: i18n_default.labels.propertyItemSelectPlaceholder,
|
|
searchable: true,
|
|
options: allTypes,
|
|
showAll: true
|
|
}
|
|
);
|
|
};
|
|
const toggleMenu = (e4) => {
|
|
if (props2.isNew) {
|
|
showNewMenu(e4);
|
|
} else {
|
|
const offset = e4.target.getBoundingClientRect();
|
|
const options = optionValuesForColumn(
|
|
field.name,
|
|
field.table == "" ? tableData : contextTable[field.table]
|
|
);
|
|
showPropertyMenu(props2.plugin, { x: offset.left, y: offset.top + 30 }, props2.editable, options, field, cols, contextTable, saveField, saveContext, hideColumn, delColumn, sortColumn, predicate.colsHidden.includes(field.name + field.table));
|
|
}
|
|
};
|
|
const ref = _2(null);
|
|
const setNodeRef = useCombinedRefs2(setDroppableNodeRef, setDraggableNodeRef);
|
|
return /* @__PURE__ */ bn.createElement("div", {
|
|
ref: setNodeRef,
|
|
...listeners,
|
|
...attributes,
|
|
className: "mk-col-header",
|
|
onClick: (e4) => {
|
|
toggleMenu(e4);
|
|
}
|
|
}, /* @__PURE__ */ bn.createElement("div", {
|
|
ref
|
|
}, props2.column.name.length > 0 ? field.name : "+", /* @__PURE__ */ bn.createElement("span", {
|
|
className: "mk-col-header-context",
|
|
"aria-label": props2.column.table.length > 0 ? props2.column.table : ""
|
|
}, props2.column.table.length > 0 ? "#" : "")));
|
|
};
|
|
|
|
// src/components/ContextView/TableView/TableView.tsx
|
|
var import_lodash4 = __toESM(require_lodash());
|
|
var import_obsidian17 = require("obsidian");
|
|
|
|
// src/components/ContextView/DataTypeView/ImageCell.tsx
|
|
var ImageCell = (props2) => {
|
|
const { initialValue, saveValue } = props2;
|
|
const [value, setValue] = bn.useState(initialValue);
|
|
const ref = _2(null);
|
|
h2(() => {
|
|
if (props2.editMode == 2 /* EditModeActive */) {
|
|
ref.current.focus();
|
|
}
|
|
}, []);
|
|
const file = F(() => getAbstractFileAtPath(app, value), [value]);
|
|
const onBlur = (e4) => {
|
|
const newValue = e4.target.value;
|
|
if (initialValue != newValue) {
|
|
setValue(newValue);
|
|
saveValue(newValue);
|
|
}
|
|
};
|
|
const onKeyDown = (e4) => {
|
|
e4.stopPropagation();
|
|
if (e4.key == "Enter" || e4.key == "Escape") {
|
|
e4.target.blur();
|
|
props2.setEditMode(null);
|
|
}
|
|
};
|
|
bn.useEffect(() => {
|
|
setValue(initialValue);
|
|
}, [initialValue]);
|
|
return /* @__PURE__ */ bn.createElement("div", {
|
|
className: "mk-cell-image"
|
|
}, props2.editMode >= 2 && /* @__PURE__ */ bn.createElement("input", {
|
|
className: "mk-cell-text",
|
|
type: "text",
|
|
ref,
|
|
value,
|
|
onKeyDown,
|
|
onBlur
|
|
}), props2.editMode > 0 && /* @__PURE__ */ bn.createElement("img", {
|
|
src: file ? app.vault.getResourcePath(file) : value
|
|
}));
|
|
};
|
|
|
|
// src/utils/strings.ts
|
|
var indexOfCharElseEOS = (char, str) => {
|
|
if (str.indexOf("|") > 0)
|
|
return str.indexOf("|");
|
|
return str.length;
|
|
};
|
|
|
|
// src/components/ContextView/DataTypeView/LinkCell.tsx
|
|
var LinkCell = (props2) => {
|
|
var _a2;
|
|
const initialValue = (props2.multi ? (_a2 = splitString(props2.initialValue)) != null ? _a2 : [] : [props2.initialValue]).filter((f4) => f4);
|
|
const stringValueToLink = (strings) => strings.map((f4) => {
|
|
const match2 = /\[\[(.*?)\]\]/g.exec(f4);
|
|
const stringValue = (match2 == null ? void 0 : match2.length) > 1 ? match2[1].substring(0, indexOfCharElseEOS("|", match2[1])) : f4;
|
|
return {
|
|
label: filePathToString(stringValue),
|
|
value: stringValue
|
|
};
|
|
});
|
|
h2(() => {
|
|
var _a3;
|
|
setValue(resolveLinks(stringValueToLink(props2.multi ? (_a3 = splitString(props2.initialValue)) != null ? _a3 : [] : [props2.initialValue])));
|
|
}, [props2.initialValue]);
|
|
const resolveLinks = (links) => links.map((f4) => ({
|
|
value: f4.value,
|
|
label: filePathToString(f4.value),
|
|
file: getFileFromString2(f4.value, getFolderPathFromString(props2.file))
|
|
}));
|
|
const ref = _2(null);
|
|
const [value, setValue] = p2(
|
|
resolveLinks(stringValueToLink(initialValue))
|
|
);
|
|
const removeValue = (v3) => {
|
|
const newValues = value.filter((f4) => f4.value != v3.value);
|
|
setValue(newValues);
|
|
props2.saveValue(newValues.map((f4) => f4.value).join(","));
|
|
};
|
|
const saveOptions = (_5, _value) => {
|
|
if (!props2.multi) {
|
|
setValue(resolveLinks(stringValueToLink(_value)));
|
|
props2.saveValue(_value.map((f4) => `[[${f4}]]`).join(","));
|
|
} else {
|
|
const newValue = _value[0];
|
|
if (newValue) {
|
|
const newValues = uniq([...value.map((f4) => f4.value), `[[${newValue}]]`]);
|
|
setValue(resolveLinks(stringValueToLink(newValues)));
|
|
props2.saveValue(newValues.join(","));
|
|
}
|
|
}
|
|
};
|
|
const menuProps = () => {
|
|
const options = getAllAbstractFilesInVault(props2.plugin, app).map((f4) => ({
|
|
name: fileNameToString(f4.name),
|
|
value: f4.path
|
|
}));
|
|
const _options = !props2.multi ? [{ name: i18n_default.menu.none, value: "" }, ...options] : options;
|
|
return {
|
|
multi: false,
|
|
editable: true,
|
|
value: value.map((f4) => f4.value),
|
|
options: _options,
|
|
saveOptions,
|
|
placeholder: i18n_default.labels.linkItemSelectPlaceholder,
|
|
detail: true,
|
|
searchable: true
|
|
};
|
|
};
|
|
const openLink = async (o3) => {
|
|
if (o3.file) {
|
|
openTFile(o3.file, props2.plugin, false);
|
|
} else {
|
|
const file = await app.fileManager.createNewMarkdownFile(
|
|
app.vault.getRoot(),
|
|
o3.value
|
|
);
|
|
openTFile(file, props2.plugin, false);
|
|
setValue(resolveLinks(value));
|
|
}
|
|
};
|
|
return /* @__PURE__ */ bn.createElement(OptionCellBase, {
|
|
menuProps,
|
|
getLabelString: (o3) => o3.label,
|
|
valueClass: (o3) => o3.file ? "mk-cell-link-item" : "mk-cell-link-unresolved",
|
|
openItem: openLink,
|
|
value,
|
|
multi: props2.multi,
|
|
editMode: props2.editMode,
|
|
removeValue
|
|
});
|
|
};
|
|
|
|
// src/components/ContextView/DataTypeView/TagCell.tsx
|
|
var TagCell = (props2) => {
|
|
var _a2;
|
|
const initialValue = ((_a2 = splitString(props2.initialValue)) != null ? _a2 : []).filter((f4) => (f4 == null ? void 0 : f4.length) > 0);
|
|
const [value, setValue] = p2(initialValue);
|
|
h2(() => {
|
|
var _a3;
|
|
setValue((_a3 = splitString(props2.initialValue)) != null ? _a3 : []);
|
|
}, [props2.initialValue]);
|
|
const removeValue = (v3) => {
|
|
const newValues = value.filter((f4) => f4 != v3);
|
|
setValue(newValues);
|
|
props2.saveValue(newValues.join(","));
|
|
};
|
|
const saveOptions = (_options, _value) => {
|
|
if (!props2.multi) {
|
|
setValue(_value);
|
|
props2.saveValue(_value.join(","));
|
|
} else {
|
|
const newValue = _value[0];
|
|
if (newValue) {
|
|
const newValues = uniq([...value, newValue]);
|
|
setValue(newValues);
|
|
props2.saveValue(newValues.join(","));
|
|
}
|
|
}
|
|
};
|
|
const menuProps = () => {
|
|
const options = loadTags(props2.plugin).map((f4) => ({
|
|
name: f4,
|
|
value: stringFromTag(f4)
|
|
}));
|
|
const _options = !props2.multi ? [{ name: i18n_default.menu.none, value: "" }, ...options] : options;
|
|
return {
|
|
multi: false,
|
|
editable: true,
|
|
value,
|
|
options: _options,
|
|
saveOptions,
|
|
placeholder: i18n_default.labels.tagItemSelectPlaceholder,
|
|
searchable: true,
|
|
showAll: true,
|
|
onHide: () => props2.setEditMode(null)
|
|
};
|
|
};
|
|
return /* @__PURE__ */ bn.createElement(OptionCellBase, {
|
|
menuProps,
|
|
value,
|
|
multi: props2.multi,
|
|
editMode: props2.editMode,
|
|
removeValue
|
|
});
|
|
};
|
|
|
|
// src/components/ContextView/TableView/TableView.tsx
|
|
var TableView = (props2) => {
|
|
const {
|
|
selectedRows,
|
|
selectRows,
|
|
tableData,
|
|
sortedColumns: cols,
|
|
filteredData: data,
|
|
tagContexts,
|
|
folderPath,
|
|
saveSchema,
|
|
searchString,
|
|
dbSchema,
|
|
contextTable,
|
|
setContextTable,
|
|
predicate,
|
|
savePredicate,
|
|
saveDB: saveDB2,
|
|
saveContextDB,
|
|
updateFieldValue,
|
|
updateValue,
|
|
saveColumn,
|
|
delColumn,
|
|
newColumn,
|
|
isFolderContext
|
|
} = q2(MDBContext);
|
|
const [activeId, setActiveId] = p2(null);
|
|
const [lastSelectedIndex, setLastSelectedIndex] = p2(null);
|
|
const [selectedColumn, setSelectedColumn] = p2(null);
|
|
const [currentEdit, setCurrentEdit] = p2(null);
|
|
const [overId, setOverId] = p2(null);
|
|
const [openFlows, setOpenFlows] = p2([]);
|
|
const [selectNewOnRefresh, setSelectNewOnRefresh] = p2(false);
|
|
const [colsSize, setColsSize] = p2({});
|
|
const ref = _2(null);
|
|
h2(() => {
|
|
setColsSize({ ...predicate.colsSize, "+": 30 });
|
|
}, [predicate]);
|
|
h2(() => {
|
|
setCurrentEdit(null);
|
|
}, [selectedColumn, lastSelectedIndex]);
|
|
h2(() => {
|
|
if (currentEdit == null) {
|
|
ref.current.focus();
|
|
}
|
|
}, [currentEdit]);
|
|
const saveColsSize = (colSize) => {
|
|
const newColSize = colSize(colsSize);
|
|
setColsSize(newColSize);
|
|
debouncedSavePredicate(newColSize);
|
|
};
|
|
const debouncedSavePredicate = T2(
|
|
(0, import_lodash4.debounce)(
|
|
(nextValue) => savePredicate({
|
|
...predicate,
|
|
colsSize: nextValue
|
|
}),
|
|
1e3
|
|
),
|
|
[predicate]
|
|
);
|
|
const newRow = (index, data2) => {
|
|
saveDB2(createNewRow(tableData, { File: "", ...data2 != null ? data2 : {} }, index));
|
|
};
|
|
const deleteRow = (rowIndex) => {
|
|
const row = tableData.rows.find((f4, i4) => i4 == rowIndex);
|
|
if (row._source == "folder") {
|
|
deleteFile(props2.plugin, getAbstractFileAtPath(app, row.File));
|
|
}
|
|
if (row) {
|
|
saveDB2({
|
|
...tableData,
|
|
rows: tableData.rows.filter((f4, i4) => i4 != rowIndex)
|
|
});
|
|
}
|
|
};
|
|
const toggleFlow = (path) => {
|
|
setOpenFlows(
|
|
(f4) => f4.find((p3) => p3 == path) ? f4.filter((p3) => p3 != path) : uniq([...f4, path])
|
|
);
|
|
};
|
|
const selectItem = (modifier, index) => {
|
|
if (modifier == 3) {
|
|
const file = getAbstractFileAtPath(
|
|
app,
|
|
tableData.rows[parseInt(index)].File
|
|
);
|
|
if (file)
|
|
openAFile(file, props2.plugin, false);
|
|
return;
|
|
}
|
|
if (modifier == 2) {
|
|
selectedRows.some((f4) => f4 == index) ? selectRows(
|
|
null,
|
|
selectedRows.filter((f4) => f4 != index)
|
|
) : selectRows(index, uniq([...selectedRows, index]));
|
|
} else if (modifier == 1) {
|
|
selectRows(
|
|
index,
|
|
uniq([
|
|
...selectedRows,
|
|
...selectRange(
|
|
lastSelectedIndex,
|
|
index,
|
|
data.map((f4) => f4._index)
|
|
)
|
|
])
|
|
);
|
|
} else {
|
|
selectRows(index, [index]);
|
|
}
|
|
setLastSelectedIndex(index);
|
|
};
|
|
const onKeyDown = (e4) => {
|
|
const setCellValue = (value) => {
|
|
var _a2;
|
|
const columnTuple = selectedColumn.split("#");
|
|
updateValue(columnTuple[0], value, (_a2 = columnTuple[1]) != null ? _a2 : "", parseInt(lastSelectedIndex), "");
|
|
};
|
|
const clearCell = () => {
|
|
setCellValue("");
|
|
};
|
|
const copyCell = () => {
|
|
navigator.clipboard.writeText(tableData.rows[parseInt(lastSelectedIndex)][selectedColumn]);
|
|
};
|
|
const nextRow = () => {
|
|
const newIndex = selectNextIndex(
|
|
lastSelectedIndex,
|
|
data.map((f4) => f4._index)
|
|
);
|
|
selectRows(newIndex, [newIndex]);
|
|
setLastSelectedIndex(newIndex);
|
|
};
|
|
const lastRow = () => {
|
|
const newIndex = selectPrevIndex(
|
|
lastSelectedIndex,
|
|
data.map((f4) => f4._index)
|
|
);
|
|
selectRows(newIndex, [newIndex]);
|
|
setLastSelectedIndex(newIndex);
|
|
};
|
|
if (e4.key == "c" && e4.metaKey) {
|
|
copyCell();
|
|
}
|
|
if (e4.key == "x" && e4.metaKey) {
|
|
copyCell();
|
|
clearCell();
|
|
}
|
|
if (e4.key == "v" && e4.metaKey) {
|
|
navigator.clipboard.readText().then((f4) => setCellValue(f4));
|
|
}
|
|
if (e4.key == "Escape") {
|
|
selectRows(null, []);
|
|
setLastSelectedIndex(null);
|
|
}
|
|
if (e4.key == "Backspace" || e4.key == "Delete") {
|
|
clearCell();
|
|
}
|
|
if (e4.key == "Enter") {
|
|
if (selectedColumn && lastSelectedIndex) {
|
|
if (e4.shiftKey) {
|
|
newRow(parseInt(lastSelectedIndex) + 1);
|
|
nextRow();
|
|
} else {
|
|
setCurrentEdit([selectedColumn, lastSelectedIndex]);
|
|
}
|
|
}
|
|
return;
|
|
}
|
|
if (e4.key == "ArrowDown") {
|
|
nextRow();
|
|
e4.preventDefault();
|
|
}
|
|
if (e4.key == "ArrowUp") {
|
|
lastRow();
|
|
e4.preventDefault();
|
|
}
|
|
if (e4.key == "ArrowLeft") {
|
|
const newIndex = selectPrevIndex(
|
|
selectedColumn,
|
|
columns.map((f4) => f4.accessorKey).filter((f4) => f4 != "+")
|
|
);
|
|
setSelectedColumn(newIndex);
|
|
}
|
|
if (e4.key == "ArrowRight") {
|
|
const newIndex = selectNextIndex(
|
|
selectedColumn,
|
|
columns.map((f4) => f4.accessorKey).filter((f4) => f4 != "+")
|
|
);
|
|
setSelectedColumn(newIndex);
|
|
}
|
|
};
|
|
const columns = F(
|
|
() => {
|
|
var _a2;
|
|
return [
|
|
...(_a2 = cols == null ? void 0 : cols.filter((f4) => f4.type != "preview").map((f4) => {
|
|
return {
|
|
header: f4.name,
|
|
accessorKey: f4.name + f4.table,
|
|
meta: {
|
|
table: f4.table,
|
|
editable: f4.primary != "true",
|
|
schemaId: dbSchema == null ? void 0 : dbSchema.id
|
|
},
|
|
cell: ({
|
|
getValue,
|
|
row: { index },
|
|
column: { colId },
|
|
cell,
|
|
table: table2
|
|
}) => {
|
|
const initialValue = getValue();
|
|
const rowIndex = parseInt(data[index]["_index" + f4.table]);
|
|
const saveValue = (value) => {
|
|
var _a3;
|
|
if (initialValue != value)
|
|
(_a3 = table2.options.meta) == null ? void 0 : _a3.updateData(
|
|
f4.name,
|
|
value,
|
|
f4.table,
|
|
rowIndex
|
|
);
|
|
};
|
|
const saveFieldValue = (fieldValue, value) => {
|
|
var _a3;
|
|
(_a3 = table2.options.meta) == null ? void 0 : _a3.updateFieldValue(
|
|
f4.name,
|
|
fieldValue,
|
|
value,
|
|
f4.table,
|
|
rowIndex
|
|
);
|
|
};
|
|
const editMode = !cell.getIsGrouped() ? platformIsMobile() ? 3 /* EditModeAlways */ : currentEdit && currentEdit[0] == f4.name + f4.table && currentEdit[1] == rowIndex.toString() ? 2 /* EditModeActive */ : 1 /* EditModeView */ : -1 /* EditModeReadOnly */;
|
|
const cellProps = {
|
|
initialValue,
|
|
saveValue,
|
|
plugin: props2.plugin,
|
|
setEditMode: setCurrentEdit,
|
|
editMode
|
|
};
|
|
const fieldType = fieldTypes.find((t4) => f4.type == t4.type) || fieldTypes.find((t4) => f4.type == t4.multiType);
|
|
if (!fieldType) {
|
|
return /* @__PURE__ */ bn.createElement(bn.Fragment, null, initialValue);
|
|
}
|
|
if (fieldType.type == "file") {
|
|
return /* @__PURE__ */ bn.createElement(FileCell, {
|
|
...cellProps,
|
|
multi: fieldType.multiType == f4.type,
|
|
folder: folderPath,
|
|
isFolder: isFolderContext,
|
|
openFlow: () => toggleFlow(initialValue),
|
|
deleteRow: () => deleteRow(index)
|
|
});
|
|
} else if (fieldType.type == "boolean") {
|
|
return /* @__PURE__ */ bn.createElement(BooleanCell, {
|
|
...cellProps,
|
|
column: f4
|
|
});
|
|
} else if (fieldType.type == "option") {
|
|
return /* @__PURE__ */ bn.createElement(OptionCell, {
|
|
...cellProps,
|
|
options: f4.value,
|
|
multi: fieldType.multiType == f4.type,
|
|
saveOptions: saveFieldValue
|
|
});
|
|
} else if (fieldType.type == "date") {
|
|
return /* @__PURE__ */ bn.createElement(DateCell, {
|
|
...cellProps
|
|
});
|
|
} else if (fieldType.type == "context") {
|
|
return /* @__PURE__ */ bn.createElement(ContextCell, {
|
|
...cellProps,
|
|
multi: fieldType.multiType == f4.type,
|
|
contextTable: contextTable[f4.value],
|
|
contextTag: f4.value
|
|
});
|
|
} else if (fieldType.type == "fileprop") {
|
|
return /* @__PURE__ */ bn.createElement(FilePropertyCell, {
|
|
...cellProps,
|
|
property: f4.value
|
|
});
|
|
} else if (fieldType.type == "tag") {
|
|
return /* @__PURE__ */ bn.createElement(TagCell, {
|
|
...cellProps,
|
|
multi: fieldType.multiType == f4.type
|
|
});
|
|
} else if (fieldType.type == "number") {
|
|
return /* @__PURE__ */ bn.createElement(NumberCell, {
|
|
...cellProps
|
|
});
|
|
} else if (fieldType.type == "link") {
|
|
return /* @__PURE__ */ bn.createElement(LinkCell, {
|
|
...cellProps,
|
|
multi: fieldType.multiType == f4.type,
|
|
file: data[index]["File"]
|
|
});
|
|
} else if (fieldType.type == "image") {
|
|
return /* @__PURE__ */ bn.createElement(ImageCell, {
|
|
...cellProps
|
|
});
|
|
} else {
|
|
return /* @__PURE__ */ bn.createElement(TextCell, {
|
|
...cellProps
|
|
});
|
|
}
|
|
}
|
|
};
|
|
})) != null ? _a2 : [],
|
|
{
|
|
header: "+",
|
|
meta: { schemaId: dbSchema == null ? void 0 : dbSchema.id },
|
|
accessorKey: "+",
|
|
size: 20,
|
|
cell: () => /* @__PURE__ */ bn.createElement(bn.Fragment, null)
|
|
}
|
|
];
|
|
},
|
|
[cols, currentEdit, predicate, contextTable, toggleFlow, openFlows]
|
|
);
|
|
const groupBy2 = F(
|
|
() => {
|
|
var _a2;
|
|
return ((_a2 = predicate.groupBy) == null ? void 0 : _a2.length) > 0 && cols.find((f4) => f4.name + f4.table == predicate.groupBy[0]) ? predicate.groupBy : [];
|
|
},
|
|
[predicate, cols]
|
|
);
|
|
const table = useReactTable({
|
|
data,
|
|
columns,
|
|
columnResizeMode: "onChange",
|
|
state: {
|
|
columnVisibility: predicate.colsHidden.reduce(
|
|
(p3, c4) => ({ ...p3, [c4]: false }),
|
|
{}
|
|
),
|
|
columnOrder: predicate.colsOrder,
|
|
columnSizing: {
|
|
...columns.reduce((p3, c4) => ({ ...p3, [c4.accessorKey]: 150 }), {}),
|
|
...colsSize
|
|
},
|
|
grouping: groupBy2,
|
|
expanded: true
|
|
},
|
|
onColumnSizingChange: saveColsSize,
|
|
getCoreRowModel: getCoreRowModel(),
|
|
getExpandedRowModel: getExpandedRowModel(),
|
|
getGroupedRowModel: getGroupedRowModel(),
|
|
meta: {
|
|
updateData: updateValue,
|
|
updateFieldValue
|
|
}
|
|
});
|
|
const sensors = useSensors(
|
|
useSensor(MouseSensor, {
|
|
activationConstraint: {
|
|
distance: 10
|
|
}
|
|
}),
|
|
useSensor(TouchSensor, {
|
|
activationConstraint: {
|
|
delay: 250,
|
|
tolerance: 5
|
|
}
|
|
})
|
|
);
|
|
const measuring = {
|
|
droppable: {
|
|
strategy: MeasuringStrategy.Always
|
|
}
|
|
};
|
|
function handleDragStart(event) {
|
|
const {
|
|
active: { id: activeId2 }
|
|
} = event;
|
|
setActiveId(activeId2);
|
|
setOverId(overId);
|
|
document.body.style.setProperty("cursor", "grabbing");
|
|
}
|
|
function handleDragOver({ over }) {
|
|
var _a2;
|
|
const overId2 = over == null ? void 0 : over.id;
|
|
if (overId2) {
|
|
setOverId((_a2 = over == null ? void 0 : over.id) != null ? _a2 : null);
|
|
}
|
|
}
|
|
const saveFilter = (filter) => {
|
|
savePredicate({
|
|
...predicate,
|
|
filters: [
|
|
...predicate.filters.filter((s5) => s5.field != filter.field),
|
|
filter
|
|
]
|
|
});
|
|
};
|
|
const selectCell = (e4, index, column) => {
|
|
if (platformIsMobile() || column == "+")
|
|
return;
|
|
selectItem(0, data[index]["_index"]);
|
|
setSelectedColumn(column);
|
|
if (e4.detail === 1) {
|
|
} else if (e4.detail === 2) {
|
|
setCurrentEdit([column, data[index]["_index"]]);
|
|
}
|
|
};
|
|
const showContextMenu = (e4, index) => {
|
|
e4.preventDefault();
|
|
const menu = new import_obsidian17.Menu();
|
|
menu.addItem((item) => {
|
|
item.setIcon("trash");
|
|
item.setTitle(i18n_default.menu.deleteRow);
|
|
item.onClick(() => {
|
|
deleteRow(index);
|
|
});
|
|
});
|
|
if (isMouseEvent(e4)) {
|
|
menu.showAtPosition({ x: e4.pageX, y: e4.pageY });
|
|
} else {
|
|
menu.showAtPosition({
|
|
x: e4.nativeEvent.locationX,
|
|
y: e4.nativeEvent.locationY
|
|
});
|
|
}
|
|
};
|
|
function handleDragEnd({ active, over }) {
|
|
resetState();
|
|
savePredicate({
|
|
...predicate,
|
|
colsOrder: arrayMove(
|
|
predicate.colsOrder,
|
|
predicate.colsOrder.findIndex((f4) => f4 == activeId),
|
|
predicate.colsOrder.findIndex((f4) => f4 == overId)
|
|
)
|
|
});
|
|
}
|
|
function handleDragCancel() {
|
|
resetState();
|
|
}
|
|
function resetState() {
|
|
setOverId(null);
|
|
setActiveId(null);
|
|
document.body.style.setProperty("cursor", "");
|
|
}
|
|
return /* @__PURE__ */ bn.createElement(DndContext, {
|
|
sensors,
|
|
collisionDetection: closestCenter,
|
|
measuring,
|
|
onDragStart: handleDragStart,
|
|
onDragOver: handleDragOver,
|
|
onDragEnd: handleDragEnd,
|
|
onDragCancel: handleDragCancel
|
|
}, /* @__PURE__ */ bn.createElement("div", {
|
|
className: "mk-table",
|
|
ref,
|
|
tabIndex: 1,
|
|
onKeyDown
|
|
}, /* @__PURE__ */ bn.createElement("table", {
|
|
...{}
|
|
}, /* @__PURE__ */ bn.createElement("thead", null, table.getHeaderGroups().map((headerGroup) => /* @__PURE__ */ bn.createElement("tr", {
|
|
key: headerGroup.id
|
|
}, /* @__PURE__ */ bn.createElement("th", null), headerGroup.headers.map((header) => {
|
|
var _a2;
|
|
return /* @__PURE__ */ bn.createElement("th", {
|
|
className: "mk-th",
|
|
key: header.id,
|
|
style: {
|
|
minWidth: header.column.getIsGrouped() ? "0px" : (_a2 = colsSize[header.column.columnDef.accessorKey]) != null ? _a2 : "150px"
|
|
}
|
|
}, header.isPlaceholder ? null : header.column.columnDef.header != "+" ? header.column.getIsGrouped() ? /* @__PURE__ */ bn.createElement(bn.Fragment, null) : /* @__PURE__ */ bn.createElement(ColumnHeader, {
|
|
plugin: props2.plugin,
|
|
editable: header.column.columnDef.meta.editable,
|
|
column: cols.find(
|
|
(f4) => f4.name == header.column.columnDef.header && f4.table == header.column.columnDef.meta.table
|
|
)
|
|
}) : /* @__PURE__ */ bn.createElement(ColumnHeader, {
|
|
plugin: props2.plugin,
|
|
isNew: true,
|
|
editable: true,
|
|
column: {
|
|
name: "",
|
|
schemaId: header.column.columnDef.meta.schemaId,
|
|
type: "text",
|
|
table: ""
|
|
}
|
|
}), /* @__PURE__ */ bn.createElement("div", {
|
|
...{
|
|
onMouseDown: header.getResizeHandler(),
|
|
onTouchStart: header.getResizeHandler(),
|
|
className: `mk-resizer ${header.column.getIsResizing() ? "isResizing" : ""}`
|
|
}
|
|
}));
|
|
})))), /* @__PURE__ */ bn.createElement("tbody", null, table.getRowModel().rows.map((row) => /* @__PURE__ */ bn.createElement(bn.Fragment, null, /* @__PURE__ */ bn.createElement("tr", {
|
|
className: (selectedRows == null ? void 0 : selectedRows.some(
|
|
(f4) => f4 == data[row.index]["_index"]
|
|
)) && "mk-is-active",
|
|
onContextMenu: (e4) => {
|
|
const rowIndex = parseInt(
|
|
data[row.index]["_index"]
|
|
);
|
|
showContextMenu(e4, rowIndex);
|
|
},
|
|
key: row.id
|
|
}, /* @__PURE__ */ bn.createElement("td", null), row.getVisibleCells().map(
|
|
(cell) => {
|
|
var _a2, _b2;
|
|
return cell.getIsGrouped() ? /* @__PURE__ */ bn.createElement("td", {
|
|
className: "mk-td-group",
|
|
colSpan: cols.length + 1
|
|
}, /* @__PURE__ */ bn.createElement("div", {
|
|
...{
|
|
onClick: row.getToggleExpandedHandler(),
|
|
style: {
|
|
display: "flex",
|
|
alignItems: "center",
|
|
cursor: "normal"
|
|
}
|
|
}
|
|
}, flexRender(
|
|
cell.column.columnDef.cell,
|
|
cell.getContext()
|
|
), " ", "(", row.subRows.length, ")")) : cell.getIsAggregated() ? flexRender(
|
|
(_a2 = cell.column.columnDef.aggregatedCell) != null ? _a2 : cell.column.columnDef.cell,
|
|
cell.getContext()
|
|
) : /* @__PURE__ */ bn.createElement("td", {
|
|
onClick: (e4) => selectCell(
|
|
e4,
|
|
cell.row.index,
|
|
cell.column.columnDef.accessorKey
|
|
),
|
|
className: `${cell.column.columnDef.accessorKey == selectedColumn ? "mk-selected-cell " : ""} mk-td ${cell.getIsPlaceholder() ? "mk-td-empty" : ""}`,
|
|
key: cell.id,
|
|
style: {
|
|
minWidth: cell.getIsPlaceholder() ? "0px" : (_b2 = colsSize[cell.column.columnDef.accessorKey]) != null ? _b2 : "50px"
|
|
}
|
|
}, cell.getIsPlaceholder() ? null : flexRender(
|
|
cell.column.columnDef.cell,
|
|
cell.getContext()
|
|
));
|
|
}
|
|
))))), /* @__PURE__ */ bn.createElement("tfoot", null, isFolderContext ? /* @__PURE__ */ bn.createElement("tr", null, /* @__PURE__ */ bn.createElement("th", {
|
|
className: "mk-row-new",
|
|
colSpan: cols.length + 2,
|
|
onClick: () => {
|
|
newRow();
|
|
}
|
|
}, "+ New")) : /* @__PURE__ */ bn.createElement(bn.Fragment, null))), j3(
|
|
/* @__PURE__ */ bn.createElement(DragOverlay, {
|
|
dropAnimation: null,
|
|
zIndex: 1600
|
|
}, activeId ? /* @__PURE__ */ bn.createElement(ColumnHeader, {
|
|
plugin: props2.plugin,
|
|
editable: false,
|
|
column: {
|
|
name: activeId,
|
|
schemaId: tableData.schema.id,
|
|
type: "text",
|
|
table: ""
|
|
}
|
|
}) : null),
|
|
document.body
|
|
)));
|
|
};
|
|
|
|
// src/components/ContextView/DataTypeView/BooleanCell.tsx
|
|
var BooleanCell = (props2) => {
|
|
const { initialValue, saveValue } = props2;
|
|
const [value, setValue] = bn.useState(initialValue == "true");
|
|
const onChange = () => {
|
|
if (props2.editMode == -1 /* EditModeReadOnly */) {
|
|
return;
|
|
}
|
|
setValue(!value);
|
|
saveValue(!value ? "true" : "false");
|
|
};
|
|
h2(() => {
|
|
if (props2.editMode == 2 /* EditModeActive */) {
|
|
setValue(!value);
|
|
saveValue(!value ? "true" : "false");
|
|
props2.setEditMode(null);
|
|
}
|
|
}, [props2.editMode]);
|
|
bn.useEffect(() => {
|
|
setValue(initialValue == "true");
|
|
}, [initialValue]);
|
|
if (props2.editMode < 1 /* EditModeView */) {
|
|
return /* @__PURE__ */ bn.createElement("div", {
|
|
className: "mk-cell-option-item"
|
|
}, /* @__PURE__ */ bn.createElement("input", {
|
|
type: "checkbox",
|
|
checked: value,
|
|
onChange
|
|
}), /* @__PURE__ */ bn.createElement("div", null, props2.column.name));
|
|
}
|
|
return /* @__PURE__ */ bn.createElement("div", {
|
|
className: "mk-cell-text"
|
|
}, /* @__PURE__ */ bn.createElement("input", {
|
|
type: "checkbox",
|
|
checked: value,
|
|
onChange
|
|
}));
|
|
};
|
|
|
|
// src/components/ContextView/DataTypeView/PreviewCell.tsx
|
|
var PreviewCell = (props2) => {
|
|
const [vaultItem, setVaultItem] = p2(null);
|
|
const previewImage = F(() => {
|
|
if (!props2.row || !props2.columns)
|
|
return null;
|
|
const imageCol = props2.columns.find((f4) => f4.type == "image");
|
|
if (!imageCol)
|
|
return null;
|
|
return props2.row[imageCol.name + imageCol.table];
|
|
}, [props2.row, props2.columns]);
|
|
const previewFile = F(() => {
|
|
return getAbstractFileAtPath(app, previewImage);
|
|
}, [previewImage]);
|
|
const loadIcon = () => {
|
|
setVaultItem(vaultItemForPath(props2.plugin, props2.file));
|
|
};
|
|
h2(() => {
|
|
loadIcon();
|
|
window.addEventListener(eventTypes.spacesChange, loadIcon);
|
|
return () => {
|
|
window.removeEventListener(eventTypes.spacesChange, loadIcon);
|
|
};
|
|
}, [props2.file]);
|
|
return previewImage ? /* @__PURE__ */ bn.createElement("div", {
|
|
className: "mk-file-preview",
|
|
style: {
|
|
backgroundSize: "cover",
|
|
backgroundImage: `url(${previewFile ? app.vault.getResourcePath(previewFile) : previewImage})`
|
|
}
|
|
}) : /* @__PURE__ */ bn.createElement("div", {
|
|
className: "mk-file-preview",
|
|
style: (vaultItem == null ? void 0 : vaultItem.color.length) > 0 ? {
|
|
"--label-color": `${vaultItem.color}`,
|
|
"--icon-color": `#ffffff`
|
|
} : {
|
|
"--label-color": `var(--background-secondary-alt)`,
|
|
"--icon-color": `var(--text-muted)`
|
|
}
|
|
}, /* @__PURE__ */ bn.createElement("div", {
|
|
className: "mk-file-icon",
|
|
dangerouslySetInnerHTML: (vaultItem == null ? void 0 : vaultItem.sticker) ? { __html: unifiedToNative(vaultItem.sticker) } : (vaultItem == null ? void 0 : vaultItem.folder) == "true" ? { __html: uiIconSet["mk-ui-folder"] } : { __html: uiIconSet["mk-ui-file"] }
|
|
}));
|
|
};
|
|
|
|
// src/components/ContextView/DataTypeView/DataTypeView.tsx
|
|
var DataTypeView = (props2) => {
|
|
const { initialValue, index, column, file } = props2;
|
|
const saveValue = (value) => {
|
|
props2.updateValue(value);
|
|
};
|
|
const saveFieldValue = (fieldValue, value) => {
|
|
props2.updateFieldValue(fieldValue, value);
|
|
};
|
|
const viewProps = {
|
|
initialValue,
|
|
saveValue,
|
|
editMode: props2.editable == true ? 3 : 0,
|
|
setEditMode: () => {
|
|
},
|
|
plugin: props2.plugin
|
|
};
|
|
const fieldType = fieldTypes.find((t4) => column.type == t4.type) || fieldTypes.find((t4) => column.type == t4.multiType);
|
|
if (!fieldType) {
|
|
return /* @__PURE__ */ bn.createElement(bn.Fragment, null);
|
|
}
|
|
if (fieldType.type == "preview") {
|
|
return /* @__PURE__ */ bn.createElement(PreviewCell, {
|
|
...viewProps,
|
|
file,
|
|
row: props2.row,
|
|
columns: props2.cols
|
|
});
|
|
} else if (fieldType.type == "file") {
|
|
return /* @__PURE__ */ bn.createElement(FileCell, {
|
|
isFolder: false,
|
|
...viewProps,
|
|
multi: fieldType.multiType == column.type,
|
|
openFlow: props2.openFlow
|
|
});
|
|
} else if (fieldType.type == "boolean") {
|
|
return /* @__PURE__ */ bn.createElement(BooleanCell, {
|
|
...viewProps,
|
|
column
|
|
});
|
|
} else if (fieldType.type == "option") {
|
|
return /* @__PURE__ */ bn.createElement(OptionCell, {
|
|
...viewProps,
|
|
options: column.value,
|
|
multi: fieldType.multiType == column.type,
|
|
saveOptions: saveFieldValue
|
|
});
|
|
} else if (fieldType.type == "date") {
|
|
return /* @__PURE__ */ bn.createElement(DateCell, {
|
|
...viewProps
|
|
});
|
|
} else if (fieldType.type == "context") {
|
|
return /* @__PURE__ */ bn.createElement(ContextCell, {
|
|
...viewProps,
|
|
multi: fieldType.multiType == column.type,
|
|
contextTable: props2.contextTable[column.value],
|
|
contextTag: column.value
|
|
});
|
|
} else if (fieldType.type == "fileprop") {
|
|
return /* @__PURE__ */ bn.createElement(FilePropertyCell, {
|
|
...viewProps,
|
|
property: column.value
|
|
});
|
|
} else if (fieldType.type == "number") {
|
|
return /* @__PURE__ */ bn.createElement(NumberCell, {
|
|
...viewProps
|
|
});
|
|
} else if (fieldType.type == "link") {
|
|
return /* @__PURE__ */ bn.createElement(LinkCell, {
|
|
...viewProps,
|
|
multi: fieldType.multiType == column.type,
|
|
file
|
|
});
|
|
} else if (fieldType.type == "tag") {
|
|
return /* @__PURE__ */ bn.createElement(TagCell, {
|
|
...viewProps,
|
|
multi: fieldType.multiType == column.type
|
|
});
|
|
} else if (fieldType.type == "image") {
|
|
return /* @__PURE__ */ bn.createElement(ImageCell, {
|
|
...viewProps
|
|
});
|
|
}
|
|
return /* @__PURE__ */ bn.createElement(TextCell, {
|
|
...viewProps
|
|
});
|
|
};
|
|
|
|
// src/components/ContextView/CardsView/CardView.tsx
|
|
var CardView = bn.memo(
|
|
bn.forwardRef(
|
|
({
|
|
color,
|
|
dragOverlay,
|
|
dragging,
|
|
disabled,
|
|
fadeIn,
|
|
handle,
|
|
height,
|
|
index,
|
|
listeners,
|
|
selected,
|
|
onSelect,
|
|
onRemove,
|
|
renderItem,
|
|
plugin,
|
|
id: id2,
|
|
sorting,
|
|
style,
|
|
transition,
|
|
transform,
|
|
value,
|
|
cols,
|
|
wrapperStyle,
|
|
...props2
|
|
}, ref) => {
|
|
const onClickHandler = (e4) => {
|
|
if (!onSelect) {
|
|
return;
|
|
}
|
|
if (e4.detail === 1) {
|
|
onSelect(e4.shiftKey ? 1 : e4.metaKey ? 2 : 0, value["_index"]);
|
|
} else if (e4.detail === 2) {
|
|
onSelect(3, value["_index"]);
|
|
}
|
|
};
|
|
const { updateValue, updateFieldValue, contextTable } = q2(MDBContext);
|
|
h2(() => {
|
|
if (!dragOverlay) {
|
|
return;
|
|
}
|
|
document.body.style.cursor = "grabbing";
|
|
return () => {
|
|
document.body.style.cursor = "";
|
|
};
|
|
}, [dragOverlay]);
|
|
const [openFlow, setOpenFlow] = p2(false);
|
|
return renderItem ? renderItem({
|
|
dragOverlay: Boolean(dragOverlay),
|
|
dragging: Boolean(dragging),
|
|
sorting: Boolean(sorting),
|
|
index,
|
|
fadeIn: Boolean(fadeIn),
|
|
listeners,
|
|
ref,
|
|
style,
|
|
transform,
|
|
transition,
|
|
value
|
|
}) : /* @__PURE__ */ bn.createElement("li", {
|
|
className: (0, import_classnames.default)(
|
|
"mk-list-item",
|
|
fadeIn && "fadeIn",
|
|
sorting && "sorting",
|
|
dragOverlay && "dragOverlay",
|
|
selected && "mk-is-active"
|
|
),
|
|
onClick: onClickHandler,
|
|
style: {
|
|
...wrapperStyle,
|
|
transition,
|
|
"--translate-x": transform ? `${Math.round(transform.x)}px` : void 0,
|
|
"--translate-y": transform ? `${Math.round(transform.y)}px` : void 0,
|
|
"--scale-x": (transform == null ? void 0 : transform.scaleX) ? `${transform.scaleX}` : void 0,
|
|
"--scale-y": (transform == null ? void 0 : transform.scaleY) ? `${transform.scaleY}` : void 0,
|
|
"--index": index,
|
|
"--color": color
|
|
},
|
|
ref
|
|
}, value && cols.filter((f4) => f4.type == "preview" && f4.table == "").map((f4) => /* @__PURE__ */ bn.createElement(DataTypeView, {
|
|
row: value,
|
|
cols,
|
|
plugin,
|
|
initialValue: value[f4.name + f4.table],
|
|
column: f4,
|
|
index: parseInt(id2),
|
|
file: value["File"],
|
|
editable: false,
|
|
updateValue: (v3) => updateValue(f4.name, v3, f4.table, parseInt(id2), value["File"]),
|
|
updateFieldValue: (v3, fv) => updateFieldValue(f4.name, fv, v3, f4.table, parseInt(id2), value["File"]),
|
|
contextTable
|
|
})), /* @__PURE__ */ bn.createElement("div", {
|
|
className: "mk-list-content"
|
|
}, /* @__PURE__ */ bn.createElement("div", {
|
|
className: (0, import_classnames.default)(
|
|
"mk-list-fields",
|
|
dragging && "dragging",
|
|
handle && "withHandle",
|
|
dragOverlay && "dragOverlay",
|
|
disabled && "disabled",
|
|
color && "color"
|
|
),
|
|
style,
|
|
"data-cypress": "draggable-item",
|
|
...listeners,
|
|
...props2,
|
|
tabIndex: !handle ? 0 : void 0
|
|
}, value && cols.map((f4) => {
|
|
var _a2;
|
|
return ((_a2 = value[f4.name + f4.table]) == null ? void 0 : _a2.length) > 0 || f4.type == "fileprop" ? /* @__PURE__ */ bn.createElement(DataTypeView, {
|
|
openFlow: () => setOpenFlow((o3) => !o3),
|
|
plugin,
|
|
initialValue: value[f4.name + f4.table],
|
|
column: f4,
|
|
index: parseInt(id2),
|
|
file: value["File"],
|
|
editable: false,
|
|
updateValue: (v3) => updateValue(f4.name, v3, f4.table, parseInt(id2), value["File"]),
|
|
updateFieldValue: (v3, fv) => updateFieldValue(f4.name, fv, v3, f4.table, parseInt(id2), value["File"]),
|
|
contextTable
|
|
}) : /* @__PURE__ */ bn.createElement(bn.Fragment, null);
|
|
})), /* @__PURE__ */ bn.createElement(FlowView, {
|
|
plugin,
|
|
path: value.File,
|
|
load: openFlow
|
|
})));
|
|
}
|
|
)
|
|
);
|
|
|
|
// src/components/ContextView/CardsView/CardColumnView.tsx
|
|
var import_classnames2 = __toESM(require_classnames());
|
|
var CardColumnView = k3(
|
|
({
|
|
id: id2,
|
|
children,
|
|
columns = 1,
|
|
handleProps,
|
|
horizontal,
|
|
hover,
|
|
onClick,
|
|
onRemove,
|
|
plugin,
|
|
field,
|
|
label,
|
|
file,
|
|
placeholder: placeholder2,
|
|
style,
|
|
scrollable,
|
|
shadow,
|
|
unstyled,
|
|
...props2
|
|
}, ref) => {
|
|
const Component2 = "div";
|
|
const { updateValue, updateFieldValue, contextTable } = q2(MDBContext);
|
|
return /* @__PURE__ */ bn.createElement(Component2, {
|
|
...props2,
|
|
ref,
|
|
style: {
|
|
...style,
|
|
"--columns": columns
|
|
},
|
|
className: (0, import_classnames2.default)(
|
|
"mk-list-group",
|
|
unstyled && "unstyled",
|
|
horizontal && "horizontal",
|
|
hover && "hover",
|
|
placeholder2 && "placeholder",
|
|
scrollable && "scrollable",
|
|
shadow && "shadow"
|
|
),
|
|
onClick,
|
|
tabIndex: onClick ? 0 : void 0
|
|
}, label != null && field ? /* @__PURE__ */ bn.createElement("div", {
|
|
className: "mk-list-group-header"
|
|
}, /* @__PURE__ */ bn.createElement(DataTypeView, {
|
|
initialValue: label,
|
|
plugin,
|
|
index: parseInt(id2) * -1,
|
|
file,
|
|
column: field,
|
|
editable: false,
|
|
updateValue: (value) => updateValue(field.name, value, field.table, parseInt(id2) * -1, file),
|
|
updateFieldValue: (value, fieldValue) => updateFieldValue(field.name, fieldValue, value, field.table, parseInt(id2) * -1, file),
|
|
contextTable
|
|
}), /* @__PURE__ */ bn.createElement("div", {
|
|
className: "Actions",
|
|
...handleProps
|
|
})) : null, placeholder2 ? children : /* @__PURE__ */ bn.createElement("ul", null, children));
|
|
}
|
|
);
|
|
|
|
// src/components/ContextView/CardsView/CardsView.tsx
|
|
var animateLayoutChanges = (args) => args.isSorting || args.wasDragging ? defaultAnimateLayoutChanges(args) : true;
|
|
function DroppableContainer({
|
|
children,
|
|
columns = 1,
|
|
disabled,
|
|
id: id2,
|
|
items,
|
|
style,
|
|
...props2
|
|
}) {
|
|
var _a2;
|
|
const {
|
|
active,
|
|
attributes,
|
|
isDragging,
|
|
listeners,
|
|
over,
|
|
setNodeRef,
|
|
transition,
|
|
transform
|
|
} = useSortable({
|
|
id: id2,
|
|
data: {
|
|
type: "container"
|
|
},
|
|
animateLayoutChanges
|
|
});
|
|
const isOverContainer = over ? id2 === over.id && ((_a2 = active == null ? void 0 : active.data.current) == null ? void 0 : _a2.type) !== "container" || items.includes(over.id) : false;
|
|
return /* @__PURE__ */ bn.createElement(CardColumnView, {
|
|
id: id2,
|
|
ref: disabled ? void 0 : setNodeRef,
|
|
style: {
|
|
...style,
|
|
transition,
|
|
transform: CSS.Translate.toString(transform),
|
|
opacity: isDragging ? 0.5 : void 0
|
|
},
|
|
hover: isOverContainer,
|
|
handleProps: {
|
|
...attributes,
|
|
...listeners
|
|
},
|
|
columns,
|
|
...props2
|
|
}, children);
|
|
}
|
|
var PLACEHOLDER_ID = "placeholder";
|
|
var CardsView = ({
|
|
adjustScale: adjustScale2 = false,
|
|
itemCount = 3,
|
|
cancelDrop,
|
|
columns,
|
|
handle = false,
|
|
items: initialItems,
|
|
containerStyle,
|
|
getItemStyles = () => ({}),
|
|
wrapperStyle = () => ({}),
|
|
minimal = false,
|
|
modifiers,
|
|
renderItem,
|
|
strategy = verticalListSortingStrategy,
|
|
vertical = false,
|
|
scrollable,
|
|
plugin
|
|
}) => {
|
|
var _a2, _b2;
|
|
const {
|
|
tableData,
|
|
filteredData,
|
|
selectedRows,
|
|
selectRows,
|
|
sortedColumns: cols,
|
|
predicate,
|
|
updateValue,
|
|
contextTable,
|
|
schema,
|
|
saveDB: saveDB2,
|
|
saveContextDB
|
|
} = q2(MDBContext);
|
|
const groupBy2 = ((_a2 = predicate.groupBy) == null ? void 0 : _a2.length) > 0 ? cols.find((f4) => f4.name + f4.table == predicate.groupBy[0]) : null;
|
|
const displayCols = (_b2 = cols == null ? void 0 : cols.filter(
|
|
(f4) => !(f4.name == (groupBy2 == null ? void 0 : groupBy2.name) && f4.table == groupBy2.table)
|
|
)) != null ? _b2 : [];
|
|
const viewType = schema.type;
|
|
const items = F(() => {
|
|
var _a3, _b3;
|
|
if (groupBy2) {
|
|
const options = uniq([
|
|
"",
|
|
...(_a3 = splitString(groupBy2.value)) != null ? _a3 : [],
|
|
...filteredData.reduce(
|
|
(p3, c4) => {
|
|
var _a4;
|
|
return [...p3, (_a4 = c4[groupBy2.name + groupBy2.table]) != null ? _a4 : ""];
|
|
},
|
|
[]
|
|
)
|
|
]);
|
|
return options.reduce(
|
|
(p3, c4) => {
|
|
return {
|
|
...p3,
|
|
[c4]: filteredData.filter((r3) => r3[groupBy2.name + groupBy2.table] == c4).map((r3) => r3._index)
|
|
};
|
|
},
|
|
{ "": [] }
|
|
);
|
|
}
|
|
return {
|
|
"": (_b3 = filteredData == null ? void 0 : filteredData.map((r3) => r3._index)) != null ? _b3 : []
|
|
};
|
|
}, [filteredData, predicate]);
|
|
const containers = F(
|
|
() => Object.keys(items).map((f4, i4) => "-" + i4.toString()),
|
|
[items]
|
|
);
|
|
const [activeId, setActiveId] = p2(null);
|
|
const [overId, setOverId] = p2(null);
|
|
const recentlyMovedToNewContainer = _2(false);
|
|
const isSortingContainer = activeId ? containers.includes(activeId) : false;
|
|
const [lastSelectedIndex, setLastSelectedIndex] = p2(null);
|
|
const sensors = useSensors(
|
|
useSensor(MouseSensor, {
|
|
activationConstraint: {
|
|
distance: 10
|
|
}
|
|
}),
|
|
useSensor(TouchSensor, {
|
|
activationConstraint: {
|
|
delay: 250,
|
|
tolerance: 5
|
|
}
|
|
}),
|
|
useSensor(KeyboardSensor, {
|
|
coordinateGetter: sortableKeyboardCoordinates
|
|
})
|
|
);
|
|
const findContainer = (id2) => {
|
|
if (id2.charAt(0) == "-") {
|
|
return id2;
|
|
}
|
|
return "-" + Object.keys(items).findIndex((key2) => items[key2].includes(id2)).toString();
|
|
};
|
|
const getIndex = (id2) => {
|
|
const container = findContainer(id2);
|
|
if (!container) {
|
|
return -1;
|
|
}
|
|
const index = items[Object.keys(items)[parseInt(container) * -1]].indexOf(id2);
|
|
return index;
|
|
};
|
|
const resetState = () => {
|
|
setActiveId(null);
|
|
setOverId(null);
|
|
};
|
|
const onDragCancel = () => {
|
|
resetState();
|
|
};
|
|
h2(() => {
|
|
requestAnimationFrame(() => {
|
|
recentlyMovedToNewContainer.current = false;
|
|
});
|
|
}, [items]);
|
|
const selectItem = (modifier, index) => {
|
|
if (platformIsMobile()) {
|
|
const file = getAbstractFileAtPath(
|
|
app,
|
|
tableData.rows[parseInt(index)].File
|
|
);
|
|
if (file)
|
|
openAFile(file, plugin, false);
|
|
return;
|
|
}
|
|
if (modifier == 3) {
|
|
const file = getAbstractFileAtPath(
|
|
app,
|
|
tableData.rows[parseInt(index)].File
|
|
);
|
|
if (file)
|
|
openAFile(file, plugin, false);
|
|
return;
|
|
}
|
|
if (modifier == 2) {
|
|
selectedRows.some((f4) => f4 == index) ? selectRows(
|
|
null,
|
|
selectedRows.filter((f4) => f4 != index)
|
|
) : selectRows(index, uniq([...selectedRows, index]));
|
|
} else if (modifier == 1) {
|
|
selectRows(
|
|
index,
|
|
uniq([
|
|
...selectedRows,
|
|
...selectRange(
|
|
lastSelectedIndex,
|
|
index,
|
|
filteredData.map((f4) => f4._index)
|
|
)
|
|
])
|
|
);
|
|
} else {
|
|
selectRows(index, [index]);
|
|
}
|
|
setLastSelectedIndex(index);
|
|
};
|
|
const onKeyDown = (e4) => {
|
|
if (e4.key == "Escape") {
|
|
selectRows(null, []);
|
|
setLastSelectedIndex(null);
|
|
}
|
|
if (e4.key == "Enter") {
|
|
const file = getAbstractFileAtPath(
|
|
app,
|
|
tableData.rows[parseInt(lastSelectedIndex)].File
|
|
);
|
|
if (file)
|
|
openAFile(file, plugin, false);
|
|
return;
|
|
}
|
|
if (e4.key == "ArrowDown") {
|
|
const newIndex = selectNextIndex(
|
|
lastSelectedIndex,
|
|
filteredData.map((f4) => f4._index)
|
|
);
|
|
selectRows(newIndex, [newIndex]);
|
|
setLastSelectedIndex(newIndex);
|
|
}
|
|
if (e4.key == "ArrowUp") {
|
|
const newIndex = selectPrevIndex(
|
|
lastSelectedIndex,
|
|
filteredData.map((f4) => f4._index)
|
|
);
|
|
selectRows(newIndex, [newIndex]);
|
|
setLastSelectedIndex(newIndex);
|
|
}
|
|
};
|
|
return /* @__PURE__ */ bn.createElement(DndContext, {
|
|
sensors,
|
|
collisionDetection: closestCenter,
|
|
measuring: {
|
|
droppable: {
|
|
strategy: MeasuringStrategy.Always
|
|
}
|
|
},
|
|
onDragStart: ({ active }) => {
|
|
setActiveId(active.id);
|
|
},
|
|
onDragOver: ({ active, over }) => {
|
|
const overId2 = over == null ? void 0 : over.id;
|
|
if (overId2)
|
|
setOverId(overId2);
|
|
},
|
|
onDragEnd: ({ active, over }) => {
|
|
if (active.id in items && (over == null ? void 0 : over.id)) {
|
|
return;
|
|
}
|
|
const activeContainer = findContainer(active.id);
|
|
if (!activeContainer) {
|
|
resetState();
|
|
return;
|
|
}
|
|
const overId2 = over == null ? void 0 : over.id;
|
|
if (!overId2) {
|
|
resetState();
|
|
return;
|
|
}
|
|
if (overId2 === PLACEHOLDER_ID) {
|
|
return;
|
|
}
|
|
const overContainer = findContainer(overId2);
|
|
if (overContainer) {
|
|
const activeIndex = items[Object.keys(items)[parseInt(activeContainer) * -1]].indexOf(active.id);
|
|
const overIndex = items[Object.keys(items)[parseInt(overContainer) * -1]].indexOf(overId2);
|
|
if (activeContainer != overContainer) {
|
|
updateValue(groupBy2.name, Object.keys(items)[parseInt(overContainer) * -1], groupBy2.table, groupBy2.table == "" ? parseInt(activeId) : parseInt(
|
|
filteredData.find((f4) => f4._index == activeId)["_index" + groupBy2.table]
|
|
), "");
|
|
}
|
|
}
|
|
resetState();
|
|
},
|
|
cancelDrop,
|
|
onDragCancel,
|
|
modifiers
|
|
}, /* @__PURE__ */ bn.createElement("div", {
|
|
className: (0, import_classnames3.default)(
|
|
viewType == "card" ? "mk-cards-container" : "mk-list-container",
|
|
viewType == "card" && containers.length == 1 && "mk-cards-grid"
|
|
),
|
|
onKeyDown
|
|
}, /* @__PURE__ */ bn.createElement("div", {
|
|
className: "mk-list-view"
|
|
}, /* @__PURE__ */ bn.createElement(SortableContext, {
|
|
items: [...containers, PLACEHOLDER_ID],
|
|
strategy: vertical ? verticalListSortingStrategy : horizontalListSortingStrategy
|
|
}, containers.map((containerId) => /* @__PURE__ */ bn.createElement(DroppableContainer, {
|
|
key: containerId,
|
|
id: containerId,
|
|
plugin,
|
|
label: minimal ? void 0 : `${Object.keys(items)[parseInt(containerId) * -1]}`,
|
|
field: groupBy2,
|
|
columns,
|
|
items: items[Object.keys(items)[parseInt(containerId) * -1]],
|
|
scrollable,
|
|
style: containerStyle,
|
|
unstyled: minimal
|
|
}, /* @__PURE__ */ bn.createElement(SortableContext, {
|
|
items: items[Object.keys(items)[parseInt(containerId) * -1]],
|
|
strategy
|
|
}, items[Object.keys(items)[parseInt(containerId) * -1]].map(
|
|
(value, index) => {
|
|
return /* @__PURE__ */ bn.createElement(SortableItem, {
|
|
disabled: isSortingContainer,
|
|
key: value,
|
|
id: value,
|
|
plugin,
|
|
value: filteredData.find((f4) => f4._index == value),
|
|
cols: displayCols,
|
|
index,
|
|
handle,
|
|
style: getItemStyles,
|
|
wrapperStyle,
|
|
renderItem,
|
|
onSelect: selectItem,
|
|
selected: selectedRows == null ? void 0 : selectedRows.some((f4) => f4 == value),
|
|
containerId,
|
|
getIndex
|
|
});
|
|
}
|
|
))))))), j3(
|
|
/* @__PURE__ */ bn.createElement(DragOverlay, {
|
|
adjustScale: adjustScale2
|
|
}, activeId ? containers.includes(activeId) ? renderContainerDragOverlay(activeId) : renderSortableItemDragOverlay(activeId) : null),
|
|
document.body
|
|
));
|
|
function renderSortableItemDragOverlay(id2) {
|
|
return /* @__PURE__ */ bn.createElement("div", {
|
|
className: viewType == "card" ? "mk-cards-container" : "mk-list-container"
|
|
}, /* @__PURE__ */ bn.createElement(CardView, {
|
|
plugin,
|
|
value: filteredData.find((f4) => f4._index == id2),
|
|
handle,
|
|
id: id2,
|
|
cols: displayCols,
|
|
style: getItemStyles({
|
|
containerId: findContainer(id2),
|
|
overIndex: -1,
|
|
index: getIndex(id2),
|
|
value: id2,
|
|
isSorting: true,
|
|
isDragging: true,
|
|
isDragOverlay: true
|
|
}),
|
|
color: getColor(id2),
|
|
wrapperStyle: wrapperStyle({ index: 0 }),
|
|
renderItem,
|
|
dragOverlay: true
|
|
}));
|
|
}
|
|
function renderContainerDragOverlay(containerId) {
|
|
return /* @__PURE__ */ bn.createElement(CardColumnView, {
|
|
id: containerId,
|
|
plugin,
|
|
label: `Column ${containerId}`,
|
|
field: groupBy2,
|
|
columns,
|
|
style: {
|
|
height: "100%"
|
|
},
|
|
shadow: true,
|
|
unstyled: false
|
|
}, items[Object.keys(items)[parseInt(containerId) * -1]].map(
|
|
(item, index) => /* @__PURE__ */ bn.createElement(CardView, {
|
|
key: item,
|
|
id: item,
|
|
plugin,
|
|
value: filteredData.find((f4) => f4._index == item),
|
|
cols: displayCols,
|
|
handle,
|
|
style: getItemStyles({
|
|
containerId,
|
|
overIndex: -1,
|
|
index: getIndex(item),
|
|
value: item,
|
|
isDragging: false,
|
|
isSorting: false,
|
|
isDragOverlay: false
|
|
}),
|
|
color: getColor(item),
|
|
selected: selectedRows.some((f4) => f4 == item),
|
|
onSelect: selectItem,
|
|
wrapperStyle: wrapperStyle({ index }),
|
|
renderItem
|
|
})
|
|
));
|
|
}
|
|
function getNextContainerId() {
|
|
const containeIds = Object.keys(items);
|
|
const lastContaineId = containeIds[containeIds.length - 1];
|
|
return String.fromCharCode(lastContaineId.charCodeAt(0) + 1);
|
|
}
|
|
};
|
|
function getColor(id2) {
|
|
switch (id2[0]) {
|
|
case "A":
|
|
return "#7193f1";
|
|
case "B":
|
|
return "#ffda6c";
|
|
case "C":
|
|
return "#00bcd4";
|
|
case "D":
|
|
return "#ef769f";
|
|
}
|
|
return void 0;
|
|
}
|
|
function SortableItem({
|
|
disabled,
|
|
id: id2,
|
|
plugin,
|
|
index,
|
|
handle,
|
|
renderItem,
|
|
style,
|
|
containerId,
|
|
onSelect,
|
|
selected,
|
|
getIndex,
|
|
cols,
|
|
value,
|
|
wrapperStyle
|
|
}) {
|
|
const {
|
|
setNodeRef,
|
|
listeners,
|
|
isDragging,
|
|
isSorting,
|
|
over,
|
|
overIndex,
|
|
transform,
|
|
transition
|
|
} = useSortable({
|
|
id: id2
|
|
});
|
|
const mounted = useMountStatus();
|
|
const mountedWhileDragging = isDragging && !mounted;
|
|
return /* @__PURE__ */ bn.createElement(CardView, {
|
|
ref: disabled ? void 0 : setNodeRef,
|
|
value,
|
|
plugin,
|
|
id: id2,
|
|
cols,
|
|
dragging: isDragging,
|
|
sorting: isSorting,
|
|
handle,
|
|
index,
|
|
wrapperStyle: wrapperStyle({ index }),
|
|
style: style({
|
|
index,
|
|
value: id2,
|
|
isDragging,
|
|
isSorting,
|
|
overIndex: over ? getIndex(over.id) : overIndex,
|
|
containerId
|
|
}),
|
|
onSelect,
|
|
selected,
|
|
color: getColor(id2),
|
|
transition,
|
|
transform,
|
|
fadeIn: mountedWhileDragging,
|
|
listeners,
|
|
renderItem
|
|
});
|
|
}
|
|
function useMountStatus() {
|
|
const [isMounted, setIsMounted] = p2(false);
|
|
h2(() => {
|
|
const timeout = setTimeout(() => setIsMounted(true), 500);
|
|
return () => clearTimeout(timeout);
|
|
}, []);
|
|
return isMounted;
|
|
}
|
|
|
|
// src/components/ContextView/FlowListView/FlowListView.tsx
|
|
var import_obsidian18 = require("obsidian");
|
|
var FlowListView = (props2) => {
|
|
const {
|
|
filteredData: data
|
|
} = q2(MDBContext);
|
|
const flowItems = F(() => {
|
|
return data.map((f4) => getAbstractFileAtPath(app, f4.File)).filter((f4) => f4 instanceof import_obsidian18.TFile && f4.extension == "md");
|
|
}, [data]);
|
|
return /* @__PURE__ */ bn.createElement("div", {
|
|
className: "mk-flow-container"
|
|
}, flowItems.map((f4) => /* @__PURE__ */ bn.createElement("div", null, /* @__PURE__ */ bn.createElement("span", null, fileNameToString(f4.name)), /* @__PURE__ */ bn.createElement(FlowView, {
|
|
plugin: props2.plugin,
|
|
path: f4.path,
|
|
load: true
|
|
}))));
|
|
};
|
|
|
|
// src/components/ContextView/ContextListView.tsx
|
|
var ContextListView = (props2) => {
|
|
const { schema } = q2(MDBContext);
|
|
const [error, resetError] = P2();
|
|
if (error)
|
|
console.log(error);
|
|
return schema ? schema.type == "flow" ? /* @__PURE__ */ bn.createElement(FlowListView, {
|
|
plugin: props2.plugin
|
|
}) : schema.type == "table" ? /* @__PURE__ */ bn.createElement(TableView, {
|
|
plugin: props2.plugin
|
|
}) : /* @__PURE__ */ bn.createElement(CardsView, {
|
|
plugin: props2.plugin
|
|
}) : /* @__PURE__ */ bn.createElement(bn.Fragment, null);
|
|
};
|
|
|
|
// src/components/ContextView/InlineContextViewComponent.tsx
|
|
var InlineContextViewComponent = (props2) => {
|
|
const type = viewTypeByString(props2.path);
|
|
const path = type == "tag" ? tagContextFromTag(props2.plugin, props2.path) : folderContextFromFolder(props2.plugin, props2.path);
|
|
const folder = type == "tag" ? null : props2.path;
|
|
const tag = type == "tag" ? props2.path : null;
|
|
return /* @__PURE__ */ bn.createElement(MDBProvider, {
|
|
plugin: props2.plugin,
|
|
dbPath: path,
|
|
folder,
|
|
tag,
|
|
schema: props2.schema
|
|
}, path && /* @__PURE__ */ bn.createElement(ContextListView, {
|
|
plugin: props2.plugin
|
|
}));
|
|
};
|
|
|
|
// src/components/ContextView/InlineContextView.tsx
|
|
var INLINE_CONTEXT_VIEW_TYPE = "make-inline-context";
|
|
var InlineContextView = class extends import_obsidian19.ItemView {
|
|
constructor(leaf, plugin) {
|
|
super(leaf);
|
|
this.navigation = true;
|
|
this.plugin = plugin;
|
|
}
|
|
getViewType() {
|
|
return INLINE_CONTEXT_VIEW_TYPE;
|
|
}
|
|
getDisplayText() {
|
|
return this.file;
|
|
}
|
|
async onClose() {
|
|
this.destroy();
|
|
}
|
|
destroy() {
|
|
if (this.root)
|
|
this.root.unmount();
|
|
}
|
|
async onOpen() {
|
|
this.destroy();
|
|
}
|
|
async setState(state, result) {
|
|
var _a2, _b2;
|
|
this.file = state.file;
|
|
this.ref = state.ref ? state.ref.substring(1, state.ref.length) : null;
|
|
this.constructInlineContext(this.file);
|
|
await super.setState(state, result);
|
|
const type = viewTypeByString(this.file);
|
|
const title = type == "tag" ? this.file : (_b2 = (_a2 = getAbstractFileAtPath(app, this.file)) == null ? void 0 : _a2.name) != null ? _b2 : this.file;
|
|
this.leaf.tabHeaderInnerTitleEl.innerText = title;
|
|
this.leaf.view.titleEl = title;
|
|
const headerEl = this.leaf.view.headerEl;
|
|
if (headerEl) {
|
|
headerEl.querySelector(".view-header-title").innerText = title;
|
|
}
|
|
return;
|
|
}
|
|
getState() {
|
|
let state = super.getState();
|
|
state.file = this.file;
|
|
return state;
|
|
}
|
|
constructInlineContext(file) {
|
|
this.destroy();
|
|
this.root = createRoot(this.contentEl);
|
|
this.root.render(
|
|
/* @__PURE__ */ bn.createElement("div", null, /* @__PURE__ */ bn.createElement(InlineContextViewComponent, {
|
|
plugin: this.plugin,
|
|
path: this.file,
|
|
schema: this.ref
|
|
}))
|
|
);
|
|
}
|
|
};
|
|
|
|
// src/components/FlowEditor/FlowEditor.tsx
|
|
var import_obsidian20 = require("obsidian");
|
|
var popovers = /* @__PURE__ */ new WeakMap();
|
|
var mouseCoords = { x: 0, y: 0 };
|
|
function nosuper(base) {
|
|
const derived = function() {
|
|
return Object.setPrototypeOf(new import_obsidian20.Component(), new.target.prototype);
|
|
};
|
|
derived.prototype = base.prototype;
|
|
return Object.setPrototypeOf(derived, base);
|
|
}
|
|
var _a, _b, _c, _d, _e;
|
|
var FlowEditor = class extends nosuper(import_obsidian20.HoverPopover) {
|
|
constructor(parent, targetEl, plugin, waitTime, onShowCallback) {
|
|
super();
|
|
this.targetEl = targetEl;
|
|
this.plugin = plugin;
|
|
this.onShowCallback = onShowCallback;
|
|
this.abortController = this.addChild(new import_obsidian20.Component());
|
|
this.detaching = false;
|
|
this.opening = false;
|
|
this.rootSplit = new import_obsidian20.WorkspaceSplit(
|
|
window.app.workspace,
|
|
"vertical"
|
|
);
|
|
this.targetRect = (_a = this.targetEl) == null ? void 0 : _a.getBoundingClientRect();
|
|
this.oldPopover = (_b = this.parent) == null ? void 0 : _b.flowEditor;
|
|
this.document = (_e = (_d = (_c = this.targetEl) == null ? void 0 : _c.ownerDocument) != null ? _d : window.activeDocument) != null ? _e : window.document;
|
|
this.id = genId();
|
|
this.hoverEl = this.document.defaultView.createDiv({
|
|
cls: "mk-floweditor mk-hover-popover",
|
|
attr: { id: "he" + this.id }
|
|
});
|
|
if (waitTime === void 0) {
|
|
waitTime = 300;
|
|
}
|
|
this.onTarget = true;
|
|
this.parent = parent;
|
|
this.waitTime = waitTime;
|
|
this.state = import_obsidian20.PopoverState.Showing;
|
|
const { hoverEl } = this;
|
|
this.abortController.load();
|
|
this.timer = window.setTimeout(this.show.bind(this), waitTime);
|
|
this.setActive = this._setActive.bind(this);
|
|
if (hoverEl) {
|
|
hoverEl.addEventListener("mousedown", this.setActive);
|
|
}
|
|
popovers.set(this.hoverEl, this);
|
|
this.hoverEl.addClass("hover-editor");
|
|
this.containerEl = this.hoverEl.createDiv("popover-content");
|
|
this.setTitleBar();
|
|
this.hoverEl.style.height = "auto";
|
|
this.hoverEl.style.width = "100%";
|
|
this.hoverEl.addEventListener("keydown", (e4) => e4.stopPropagation());
|
|
}
|
|
static activeWindows() {
|
|
const windows = [window];
|
|
const { floatingSplit } = app.workspace;
|
|
if (floatingSplit) {
|
|
for (const split of floatingSplit.children) {
|
|
if (split.win)
|
|
windows.push(split.win);
|
|
}
|
|
}
|
|
return windows;
|
|
}
|
|
static containerForDocument(doc) {
|
|
if (doc !== document && app.workspace.floatingSplit)
|
|
for (const container of app.workspace.floatingSplit.children) {
|
|
if (container.doc === doc)
|
|
return container;
|
|
}
|
|
return app.workspace.rootSplit;
|
|
}
|
|
static activePopovers() {
|
|
return this.activeWindows().flatMap(this.popoversForWindow);
|
|
}
|
|
static popoversForWindow(win) {
|
|
var _a2, _b2;
|
|
return Array.prototype.slice.call(
|
|
(_b2 = (_a2 = win == null ? void 0 : win.document) == null ? void 0 : _a2.body.querySelectorAll(".mk-hover-popover")) != null ? _b2 : []
|
|
).map((el) => popovers.get(el)).filter((he) => he);
|
|
}
|
|
static forLeaf(leaf) {
|
|
const el = leaf && document.body.matchParent.call(leaf.containerEl, ".mk-hover-popover");
|
|
return el ? popovers.get(el) : void 0;
|
|
}
|
|
_setActive() {
|
|
this.plugin.app.workspace.setActiveLeaf(this.leaves()[0], { focus: true });
|
|
}
|
|
getDefaultMode() {
|
|
var _a2, _b2;
|
|
return ((_b2 = (_a2 = this.parent) == null ? void 0 : _a2.view) == null ? void 0 : _b2.getMode) ? this.parent.view.getMode() : "preview";
|
|
}
|
|
updateLeaves() {
|
|
if (this.onTarget && this.targetEl && !this.document.contains(this.targetEl)) {
|
|
this.onTarget = false;
|
|
this.transition();
|
|
}
|
|
let leafCount = 0;
|
|
this.plugin.app.workspace.iterateLeaves((leaf) => {
|
|
leafCount++;
|
|
}, this.rootSplit);
|
|
if (leafCount === 0) {
|
|
this.hide();
|
|
} else if (leafCount > 1) {
|
|
}
|
|
this.hoverEl.setAttribute("data-leaf-count", leafCount.toString());
|
|
}
|
|
setTitleBar() {
|
|
this.titleEl = this.document.defaultView.createDiv("mk-flow-titlebar");
|
|
this.containerEl.prepend(this.titleEl);
|
|
}
|
|
attachLeaf() {
|
|
this.rootSplit.getRoot = () => this.plugin.app.workspace[this.document === document ? "rootSplit" : "floatingSplit"];
|
|
this.rootSplit.getContainer = () => FlowEditor.containerForDocument(this.document);
|
|
this.titleEl.insertAdjacentElement("afterend", this.rootSplit.containerEl);
|
|
let leaf = this.plugin.app.workspace.createLeafInParent(
|
|
this.rootSplit,
|
|
0
|
|
);
|
|
this.updateLeaves();
|
|
return leaf;
|
|
}
|
|
onload() {
|
|
super.onload();
|
|
this.registerEvent(
|
|
this.plugin.app.workspace.on("layout-change", this.updateLeaves, this)
|
|
);
|
|
this.registerEvent(
|
|
app.workspace.on("layout-change", () => {
|
|
this.rootSplit.children.forEach((item, index) => {
|
|
if (item instanceof import_obsidian20.WorkspaceTabs) {
|
|
this.rootSplit.replaceChild(index, item.children[0]);
|
|
}
|
|
});
|
|
})
|
|
);
|
|
}
|
|
leaves() {
|
|
const leaves = [];
|
|
this.plugin.app.workspace.iterateLeaves((leaf) => {
|
|
leaves.push(leaf);
|
|
}, this.rootSplit);
|
|
return leaves;
|
|
}
|
|
onShow() {
|
|
var _a2, _b2;
|
|
const closeDelay = 600;
|
|
setTimeout(() => this.waitTime = closeDelay, closeDelay);
|
|
(_a2 = this.oldPopover) == null ? void 0 : _a2.hide();
|
|
this.oldPopover = null;
|
|
this.hoverEl.toggleClass("is-new", true);
|
|
this.document.body.addEventListener(
|
|
"click",
|
|
() => {
|
|
this.hoverEl.toggleClass("is-new", false);
|
|
},
|
|
{ once: true, capture: true }
|
|
);
|
|
if (this.parent) {
|
|
this.parent.flowEditor = this;
|
|
}
|
|
const viewHeaderEl = this.hoverEl.querySelector(".view-header");
|
|
viewHeaderEl == null ? void 0 : viewHeaderEl.remove();
|
|
const sizer = this.hoverEl.querySelector(".workspace-leaf");
|
|
this.hoverEl.appendChild(sizer);
|
|
const inlineTitle = this.hoverEl.querySelector(".inline-title");
|
|
inlineTitle == null ? void 0 : inlineTitle.remove();
|
|
(_b2 = this.onShowCallback) == null ? void 0 : _b2.call(this);
|
|
this.onShowCallback = void 0;
|
|
}
|
|
transition() {
|
|
if (this.shouldShow()) {
|
|
if (this.state === import_obsidian20.PopoverState.Hiding) {
|
|
this.state = import_obsidian20.PopoverState.Shown;
|
|
clearTimeout(this.timer);
|
|
}
|
|
} else {
|
|
if (this.state === import_obsidian20.PopoverState.Showing) {
|
|
this.hide();
|
|
} else {
|
|
if (this.state === import_obsidian20.PopoverState.Shown) {
|
|
this.state = import_obsidian20.PopoverState.Hiding;
|
|
this.timer = window.setTimeout(() => {
|
|
if (this.shouldShow()) {
|
|
this.transition();
|
|
} else {
|
|
this.hide();
|
|
}
|
|
}, this.waitTime);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
shouldShow() {
|
|
return this.shouldShowSelf() || this.shouldShowChild();
|
|
}
|
|
shouldShowChild() {
|
|
return FlowEditor.activePopovers().some((popover) => {
|
|
if (popover !== this && popover.targetEl && this.hoverEl.contains(popover.targetEl)) {
|
|
return popover.shouldShow();
|
|
}
|
|
return false;
|
|
});
|
|
}
|
|
shouldShowSelf() {
|
|
return !this.detaching && !!(this.onTarget || this.state == import_obsidian20.PopoverState.Shown || this.document.querySelector(
|
|
`body>.modal-container, body > #he${this.id} ~ .menu, body > #he${this.id} ~ .suggestion-container`
|
|
));
|
|
}
|
|
show() {
|
|
if (!this.targetEl || this.document.body.contains(this.targetEl)) {
|
|
this.state = import_obsidian20.PopoverState.Shown;
|
|
this.timer = 0;
|
|
this.shownPos = mouseCoords;
|
|
this.targetEl.replaceChildren(this.hoverEl);
|
|
this.onShow();
|
|
app.workspace.onLayoutChange();
|
|
this.load();
|
|
} else {
|
|
this.hide();
|
|
}
|
|
}
|
|
onHide() {
|
|
var _a2;
|
|
this.oldPopover = null;
|
|
if (((_a2 = this.parent) == null ? void 0 : _a2.flowEditor) === this) {
|
|
this.parent.flowEditor = null;
|
|
}
|
|
}
|
|
hide() {
|
|
var _a2;
|
|
this.onTarget = false;
|
|
this.detaching = true;
|
|
if (this.timer) {
|
|
clearTimeout(this.timer);
|
|
this.timer = 0;
|
|
}
|
|
this.hoverEl.hide();
|
|
if (this.opening)
|
|
return;
|
|
const leaves = this.leaves();
|
|
if (leaves.length) {
|
|
leaves.forEach((leaf) => leaf.detach());
|
|
} else {
|
|
this.parent = null;
|
|
(_a2 = this.abortController) == null ? void 0 : _a2.unload();
|
|
this.abortController = void 0;
|
|
return this.nativeHide();
|
|
}
|
|
}
|
|
nativeHide() {
|
|
var _a2;
|
|
const { hoverEl, targetEl } = this;
|
|
this.state = import_obsidian20.PopoverState.Hidden;
|
|
hoverEl.detach();
|
|
if (targetEl) {
|
|
const parent = targetEl.matchParent(".mk-hover-popover");
|
|
if (parent)
|
|
(_a2 = popovers.get(parent)) == null ? void 0 : _a2.transition();
|
|
}
|
|
this.onHide();
|
|
this.unload();
|
|
}
|
|
resolveLink(linkText, sourcePath) {
|
|
const link = (0, import_obsidian20.parseLinktext)(linkText);
|
|
const tFile = link ? this.plugin.app.metadataCache.getFirstLinkpathDest(
|
|
link.path,
|
|
sourcePath != null ? sourcePath : ""
|
|
) : null;
|
|
return tFile;
|
|
}
|
|
async openFile(file, openState, useLeaf) {
|
|
if (this.detaching)
|
|
return;
|
|
const leaf = useLeaf != null ? useLeaf : this.attachLeaf();
|
|
this.opening = true;
|
|
try {
|
|
await leaf.openFile(file, openState);
|
|
} catch (e4) {
|
|
console.error(e4);
|
|
} finally {
|
|
this.opening = false;
|
|
if (this.detaching)
|
|
this.hide();
|
|
}
|
|
this.plugin.app.workspace.setActiveLeaf(leaf);
|
|
return leaf;
|
|
}
|
|
buildState(parentMode, eState) {
|
|
return {
|
|
active: false,
|
|
state: {},
|
|
eState
|
|
};
|
|
}
|
|
buildEphemeralState(file, link) {
|
|
const cache = this.plugin.app.metadataCache.getFileCache(file);
|
|
const subpath = cache ? (0, import_obsidian20.resolveSubpath)(cache, (link == null ? void 0 : link.subpath) || "") : void 0;
|
|
const eState = { subpath: link == null ? void 0 : link.subpath };
|
|
if (subpath) {
|
|
eState.line = subpath.start.line;
|
|
eState.startLoc = subpath.start;
|
|
eState.endLoc = subpath.end || void 0;
|
|
}
|
|
return eState;
|
|
}
|
|
};
|
|
|
|
// src/utils/flow/flowEditor.ts
|
|
var import_obsidian21 = require("obsidian");
|
|
var parseOutReferences = (ostr) => {
|
|
const str = ostr.split("|")[0];
|
|
const refIndex = str.lastIndexOf("#");
|
|
return refIndex != -1 ? [str.substring(0, refIndex), str.substring(refIndex + 1)] : [str, void 0];
|
|
};
|
|
var getFileFromString2 = (url, source) => {
|
|
return app.metadataCache.getFirstLinkpathDest(url, source != null ? source : "");
|
|
};
|
|
var getLineRangeFromRef = (file, ref, plugin) => {
|
|
var _a2;
|
|
if (!ref) {
|
|
return [void 0, void 0];
|
|
}
|
|
const cache = app.metadataCache.getFileCache(file);
|
|
const headings = cache.headings;
|
|
const blocks = cache.blocks;
|
|
const sections = cache.sections;
|
|
if (blocks && ref.charAt(0) == "^" && blocks[ref.substring(1)]) {
|
|
return [
|
|
blocks[ref.substring(1)].position.start.line + 1,
|
|
blocks[ref.substring(1)].position.end.line + 1
|
|
];
|
|
}
|
|
const heading = headings == null ? void 0 : headings.find((f4) => f4.heading.replace("#", " ") == ref);
|
|
if (heading) {
|
|
const index = headings.findIndex((f4) => f4.heading == heading.heading);
|
|
const level = (_a2 = headings[index]) == null ? void 0 : _a2.level;
|
|
const nextIndex2 = headings.findIndex(
|
|
(f4, i4) => i4 > index && f4.level <= level
|
|
);
|
|
const start = plugin.settings.editorFlowStyle == "classic" ? heading.position.start.line + 1 : heading.position.start.line + 2;
|
|
if (index < headings.length - 1 && nextIndex2 != -1) {
|
|
return [start, headings[nextIndex2].position.end.line];
|
|
}
|
|
return [start, sections[sections.length - 1].position.end.line + 1];
|
|
}
|
|
return [void 0, void 0];
|
|
};
|
|
var loadFlowEditorByDOM2 = (make, el, view, id2) => {
|
|
setTimeout(async () => {
|
|
let counter = 0;
|
|
while (!el.parentElement && counter++ <= 50)
|
|
await sleep(50);
|
|
if (!el.parentElement)
|
|
return;
|
|
let dom = el;
|
|
while (!dom.hasClass("mk-floweditor") && !dom.hasClass("workspace") && dom.parentElement) {
|
|
dom = dom.parentElement;
|
|
}
|
|
if (!dom.hasClass("mk-floweditor") && !dom.hasClass("workspace") && !(dom.nodeName == "HTML")) {
|
|
return;
|
|
}
|
|
setTimeout(async () => {
|
|
var _a2;
|
|
let leafFound = false;
|
|
if (app.workspace.activeEditor) {
|
|
if (app.workspace.activeEditor.editMode.cm.dom == view.dom) {
|
|
leafFound = true;
|
|
loadFlowEditorsForLeafForID(
|
|
app.workspace.activeEditor.editMode.cm,
|
|
(_a2 = app.workspace.activeEditor.file) == null ? void 0 : _a2.path,
|
|
make,
|
|
id2
|
|
);
|
|
}
|
|
}
|
|
if (!leafFound) {
|
|
app.workspace.iterateLeaves((leaf) => {
|
|
var _a3, _b2;
|
|
const cm = (_a3 = leaf.view.editor) == null ? void 0 : _a3.cm;
|
|
if (cm && view.dom == cm.dom) {
|
|
leafFound = true;
|
|
loadFlowEditorsForLeafForID(
|
|
cm,
|
|
(_b2 = leaf.view.file) == null ? void 0 : _b2.path,
|
|
make,
|
|
id2
|
|
);
|
|
}
|
|
}, app.workspace["rootSplit"]);
|
|
}
|
|
});
|
|
});
|
|
};
|
|
var loadFlowEditorsForLeafForID = (cm, source, make, id2) => {
|
|
const stateField = cm.state.field(flowEditorInfo, false);
|
|
if (!stateField)
|
|
return;
|
|
const flowInfo = stateField.find((f4) => f4.id == id2);
|
|
if (flowInfo && flowInfo.expandedState == 2) {
|
|
loadFlowEditor(cm, flowInfo, source, make);
|
|
}
|
|
};
|
|
var loadFlowEditor = (cm, flowEditorInfo2, source, make) => {
|
|
const dom = cm.dom.querySelector(
|
|
"#mk-flow-" + flowEditorInfo2.id
|
|
);
|
|
const [link, ref] = parseOutReferences(flowEditorInfo2.link);
|
|
if (dom) {
|
|
if (link.charAt(0) == "#") {
|
|
if (!dom.hasAttribute("ready")) {
|
|
dom.setAttribute("ready", "");
|
|
createFlowEditorInElement(
|
|
flowEditorInfo2.id,
|
|
dom,
|
|
ref ? "block" : "flow",
|
|
link
|
|
);
|
|
}
|
|
return;
|
|
}
|
|
if (link.charAt(link.length - 1) == "/") {
|
|
const folder = getAbstractFileAtPath(
|
|
app,
|
|
link.substring(0, link.length - 1)
|
|
);
|
|
if (!dom.hasAttribute("ready") && folder) {
|
|
dom.setAttribute("ready", "");
|
|
createFlowEditorInElement(
|
|
flowEditorInfo2.id,
|
|
dom,
|
|
"context",
|
|
folder.path,
|
|
ref
|
|
);
|
|
return;
|
|
}
|
|
}
|
|
const file = getFileFromString2(link, source);
|
|
const aFile = getAbstractFileAtPath(app, link);
|
|
if (file) {
|
|
const selectiveRange = getLineRangeFromRef(file, ref, make);
|
|
if (!dom.hasAttribute("ready")) {
|
|
dom.setAttribute("ready", "");
|
|
createFlowEditorInElement(
|
|
flowEditorInfo2.id,
|
|
dom,
|
|
ref ? "block" : "flow",
|
|
file.path,
|
|
ref,
|
|
selectiveRange[0],
|
|
selectiveRange[1]
|
|
);
|
|
}
|
|
} else {
|
|
if (aFile instanceof import_obsidian21.TFolder) {
|
|
if (!dom.hasAttribute("ready")) {
|
|
dom.setAttribute("ready", "");
|
|
createFlowEditorInElement(
|
|
flowEditorInfo2.id,
|
|
dom,
|
|
ref ? "block" : "flow",
|
|
link
|
|
);
|
|
}
|
|
return;
|
|
}
|
|
dom.empty();
|
|
const createDiv = dom.createDiv("file-embed");
|
|
createDiv.toggleClass("mod-empty", true);
|
|
const createFile = async (e4) => {
|
|
e4.stopPropagation();
|
|
e4.stopImmediatePropagation();
|
|
await app.fileManager.createNewMarkdownFile(app.vault.getRoot(), link);
|
|
loadFlowEditor(cm, flowEditorInfo2, source, make);
|
|
};
|
|
createDiv.setText(`"${link}" ` + i18n_default.labels.noFile);
|
|
createDiv.addEventListener("click", createFile);
|
|
}
|
|
}
|
|
};
|
|
var focusPortal = async (plugin, evt) => {
|
|
const { id: id2, parent, top } = evt.detail;
|
|
if (parent) {
|
|
app.workspace.iterateLeaves((leaf) => {
|
|
var _a2;
|
|
const cm = (_a2 = leaf.view.editor) == null ? void 0 : _a2.cm;
|
|
if (cm) {
|
|
const stateField = cm.state.field(flowEditorInfo, false);
|
|
if (stateField) {
|
|
const foundInfo = stateField.find((f4) => f4.id == id2);
|
|
if (foundInfo) {
|
|
cm.focus();
|
|
if (top) {
|
|
cm.dispatch({
|
|
selection: import_state4.EditorSelection.single(foundInfo.from - 4),
|
|
annotations: arrowKeyAnnotation.of(1)
|
|
});
|
|
} else {
|
|
if (foundInfo.to + 2 == cm.state.doc.length) {
|
|
cm.dispatch({
|
|
changes: [
|
|
{
|
|
from: foundInfo.to + 2,
|
|
to: foundInfo.to + 2,
|
|
insert: cm.state.lineBreak
|
|
}
|
|
],
|
|
selection: import_state4.EditorSelection.single(foundInfo.to + 3),
|
|
annotations: arrowKeyAnnotation.of(2)
|
|
});
|
|
} else {
|
|
cm.dispatch({
|
|
selection: import_state4.EditorSelection.single(foundInfo.to + 3),
|
|
annotations: arrowKeyAnnotation.of(2)
|
|
});
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}, app.workspace["rootSplit"]);
|
|
} else {
|
|
app.workspace.iterateLeaves((leaf) => {
|
|
var _a2;
|
|
const cm = (_a2 = leaf.view.editor) == null ? void 0 : _a2.cm;
|
|
if (cm) {
|
|
const stateField = cm.state.field(flowIDStateField, false);
|
|
if (stateField && stateField == id2) {
|
|
cm.focus();
|
|
const lineRange = cm.state.field(selectiveLinesFacet, false);
|
|
const posRange = lineRange && lineRange[0] != void 0 ? lineRangeToPosRange(cm.state, lineRange) : { from: 0, to: cm.state.doc.length };
|
|
if (top) {
|
|
cm.dispatch({
|
|
selection: import_state4.EditorSelection.single(posRange.from)
|
|
});
|
|
} else {
|
|
cm.dispatch({
|
|
selection: import_state4.EditorSelection.single(posRange.to)
|
|
});
|
|
}
|
|
}
|
|
}
|
|
}, app.workspace["rootSplit"]);
|
|
}
|
|
};
|
|
var openFileFromPortal = (plugin, evt) => {
|
|
const { file: fullLink, source } = evt.detail;
|
|
const [link, ref] = parseOutReferences(fullLink);
|
|
const file = getFileFromString2(link, source);
|
|
openAFile(file, plugin, false);
|
|
};
|
|
var spawnLeafFromFile = async (plugin, file, el, type, ref, from, to) => {
|
|
var _a2;
|
|
if (type == "context") {
|
|
const newLeaf2 = spawnPortal(plugin, el);
|
|
newLeaf2.setViewState({
|
|
type: INLINE_CONTEXT_VIEW_TYPE,
|
|
state: { file: removeTrailingSlashFromFolder(file), ref }
|
|
});
|
|
return newLeaf2;
|
|
}
|
|
let portalFile = plugin.app.vault.getAbstractFileByPath(file);
|
|
if (!portalFile || !Object.keys(app.embedRegistry.embedByExtension).some((f4) => f4 == portalFile.extension))
|
|
return;
|
|
const newLeaf = spawnPortal(plugin, el, portalFile.name);
|
|
await newLeaf.openFile(portalFile, { active: false });
|
|
if (newLeaf.view.setMode)
|
|
newLeaf.view.setMode(newLeaf.view.editMode);
|
|
if (from && to) {
|
|
(_a2 = newLeaf.view.editor) == null ? void 0 : _a2.cm.dispatch({
|
|
annotations: [editableRange.of([from, to])]
|
|
});
|
|
}
|
|
return newLeaf;
|
|
};
|
|
var spawnNewPortal = async (plugin, evt) => {
|
|
var _a2, _b2, _c2;
|
|
const { file, el, ref, from, to, type } = evt.detail;
|
|
const newLeaf = await spawnLeafFromFile(plugin, file, el, type, ref);
|
|
if (!((_a2 = newLeaf == null ? void 0 : newLeaf.view) == null ? void 0 : _a2.editor)) {
|
|
return;
|
|
}
|
|
const view = (_b2 = newLeaf.view.editor) == null ? void 0 : _b2.cm;
|
|
view.dispatch({
|
|
annotations: [
|
|
portalTypeAnnotation.of(evt.detail.type),
|
|
flowIDAnnotation.of(evt.detail.id)
|
|
]
|
|
});
|
|
view.dom.addEventListener("keydown", (e4) => {
|
|
if (e4.key == "ArrowUp") {
|
|
if (e4.metaKey == true) {
|
|
view.dispatch({
|
|
annotations: arrowKeyAnnotation.of(3)
|
|
});
|
|
} else {
|
|
view.dispatch({
|
|
annotations: arrowKeyAnnotation.of(1)
|
|
});
|
|
}
|
|
}
|
|
if (e4.key == "ArrowDown") {
|
|
if (e4.metaKey == true) {
|
|
view.dispatch({
|
|
annotations: arrowKeyAnnotation.of(4)
|
|
});
|
|
} else {
|
|
view.dispatch({
|
|
annotations: arrowKeyAnnotation.of(2)
|
|
});
|
|
}
|
|
}
|
|
});
|
|
if (from && to) {
|
|
(_c2 = newLeaf.view.editor) == null ? void 0 : _c2.cm.dispatch({
|
|
annotations: [editableRange.of([from, to])]
|
|
});
|
|
}
|
|
};
|
|
var spawnPortal = (plugin, initiatingEl, fileName, onShowCallback) => {
|
|
const parent = plugin.app.workspace.activeLeaf;
|
|
if (!initiatingEl)
|
|
initiatingEl = parent.containerEl;
|
|
const hoverPopover = new FlowEditor(
|
|
parent,
|
|
initiatingEl,
|
|
plugin,
|
|
void 0,
|
|
onShowCallback
|
|
);
|
|
if (fileName)
|
|
hoverPopover.titleEl.textContent = fileName.substring(
|
|
0,
|
|
fileName.lastIndexOf(".")
|
|
);
|
|
return hoverPopover.attachLeaf();
|
|
};
|
|
|
|
// src/components/ui/modals/mergeColumnModal.ts
|
|
var import_obsidian22 = require("obsidian");
|
|
var MergeColumnModal = class extends import_obsidian22.Modal {
|
|
constructor(columns, mergeColumn) {
|
|
super(app);
|
|
this.columns = columns;
|
|
this.mergeColumn = mergeColumn;
|
|
}
|
|
onOpen() {
|
|
let { contentEl } = this;
|
|
let myModal = this;
|
|
let headerText = i18n_default.labels.mergeProperties;
|
|
const headerEl = contentEl.createEl("div", { text: headerText });
|
|
headerEl.addClass("modal-title");
|
|
const containerEl = contentEl.createEl("div");
|
|
containerEl.style.cssText = "width: 100%; height: 2.5em; margin-bottom: 15px;";
|
|
const select = containerEl.createEl("select");
|
|
for (var i4 = 0; i4 < this.columns.length; i4++) {
|
|
var opt = document.createElement("option");
|
|
opt.value = i4.toString();
|
|
opt.innerHTML = this.columns[i4].name + this.columns[i4].table;
|
|
select.appendChild(opt);
|
|
}
|
|
const select2 = containerEl.createEl("select");
|
|
for (var i4 = 0; i4 < this.columns.length; i4++) {
|
|
var opt = document.createElement("option");
|
|
opt.value = i4.toString();
|
|
opt.innerHTML = this.columns[i4].name + this.columns[i4].table;
|
|
select2.appendChild(opt);
|
|
}
|
|
let changeButtonText = i18n_default.buttons.merge;
|
|
const changeButton = contentEl.createEl("button", {
|
|
text: changeButtonText
|
|
});
|
|
const cancelButton = contentEl.createEl("button", {
|
|
text: i18n_default.buttons.cancel
|
|
});
|
|
cancelButton.style.cssText = "float: right;";
|
|
cancelButton.addEventListener("click", () => {
|
|
myModal.close();
|
|
});
|
|
const onClickAction = async () => {
|
|
this.mergeColumn(
|
|
this.columns[parseInt(select.value)],
|
|
this.columns[parseInt(select2.value)]
|
|
);
|
|
myModal.close();
|
|
};
|
|
changeButton.addEventListener("click", onClickAction);
|
|
}
|
|
onClose() {
|
|
let { contentEl } = this;
|
|
contentEl.empty();
|
|
}
|
|
};
|
|
|
|
// src/components/ui/modals/saveViewModal.ts
|
|
var import_obsidian23 = require("obsidian");
|
|
var SaveViewModal = class extends import_obsidian23.Modal {
|
|
constructor(schema, saveSchema, action) {
|
|
super(app);
|
|
this.schema = schema;
|
|
this.saveSchema = saveSchema;
|
|
this.action = action;
|
|
}
|
|
onOpen() {
|
|
let { contentEl } = this;
|
|
let myModal = this;
|
|
let headerText;
|
|
if (this.action == "new view")
|
|
headerText = i18n_default.labels.saveView;
|
|
if (this.action == "new table")
|
|
headerText = i18n_default.labels.saveTable;
|
|
if (this.action == "rename view")
|
|
headerText = i18n_default.labels.renameView;
|
|
if (this.action == "rename table")
|
|
headerText = i18n_default.labels.renameTable;
|
|
const headerEl = contentEl.createEl("div", { text: headerText });
|
|
headerEl.addClass("modal-title");
|
|
const inputEl = contentEl.createEl("input");
|
|
inputEl.style.cssText = "width: 100%; height: 2.5em; margin-bottom: 15px;";
|
|
inputEl.focus();
|
|
let changeButtonText;
|
|
if (this.action == "new view")
|
|
changeButtonText = i18n_default.buttons.saveView;
|
|
if (this.action == "new table")
|
|
changeButtonText = i18n_default.buttons.saveTable;
|
|
if (this.action == "rename view")
|
|
changeButtonText = i18n_default.buttons.renameView;
|
|
if (this.action == "rename table")
|
|
changeButtonText = i18n_default.buttons.renameTable;
|
|
const changeButton = contentEl.createEl("button", {
|
|
text: changeButtonText
|
|
});
|
|
const cancelButton = contentEl.createEl("button", {
|
|
text: i18n_default.buttons.cancel
|
|
});
|
|
cancelButton.style.cssText = "float: right;";
|
|
cancelButton.addEventListener("click", () => {
|
|
myModal.close();
|
|
});
|
|
const onClickAction = async () => {
|
|
let newName = inputEl.value;
|
|
if (this.action == "new view" || this.action == "new table") {
|
|
this.saveSchema({ ...this.schema, id: newName, name: newName });
|
|
} else {
|
|
this.saveSchema({ ...this.schema, name: newName });
|
|
}
|
|
myModal.close();
|
|
};
|
|
changeButton.addEventListener("click", onClickAction);
|
|
inputEl.addEventListener("keydown", (e4) => {
|
|
if (e4.key === "Enter") {
|
|
e4.preventDefault();
|
|
onClickAction();
|
|
}
|
|
});
|
|
}
|
|
onClose() {
|
|
let { contentEl } = this;
|
|
contentEl.empty();
|
|
}
|
|
};
|
|
|
|
// src/components/ContextView/FilterBar/FilterBar.tsx
|
|
var import_obsidian26 = require("obsidian");
|
|
|
|
// src/components/ContextView/FilterBar/SearchBar.tsx
|
|
var SearchBar = (props2) => {
|
|
const clearSearch = () => {
|
|
props2.setSearchString("");
|
|
};
|
|
return /* @__PURE__ */ bn.createElement("div", {
|
|
className: "mk-view-search"
|
|
}, /* @__PURE__ */ bn.createElement("button", {
|
|
dangerouslySetInnerHTML: { __html: uiIconSet["mk-ui-search"] }
|
|
}), /* @__PURE__ */ bn.createElement(bn.Fragment, null, /* @__PURE__ */ bn.createElement("input", {
|
|
onChange: (e4) => props2.setSearchString(e4.target.value),
|
|
placeholder: i18n_default.labels.searchPlaceholder,
|
|
className: "mk-search-bar"
|
|
}), /* @__PURE__ */ bn.createElement("button", {
|
|
dangerouslySetInnerHTML: { __html: uiIconSet["mk-ui-clear"] },
|
|
onClick: () => clearSearch()
|
|
})));
|
|
};
|
|
|
|
// src/components/ui/modals/syncMetadataModal.tsx
|
|
var import_obsidian24 = require("obsidian");
|
|
var SyncMetadataModal = class extends import_obsidian24.Modal {
|
|
constructor(plugin, files, syncColumns) {
|
|
super(plugin.app);
|
|
this.plugin = plugin;
|
|
this.files = files;
|
|
let closeButton = this.modalEl.querySelector(
|
|
".modal-close-button"
|
|
);
|
|
closeButton.style.display = "none";
|
|
this.syncColumns = syncColumns;
|
|
}
|
|
onOpen() {
|
|
let { contentEl } = this;
|
|
let myModal = this;
|
|
let headerText;
|
|
const headerEl = contentEl.createEl("div", { text: headerText });
|
|
headerEl.addClass("modal-title");
|
|
headerEl.innerHTML = i18n_default.labels.syncMetadata;
|
|
const root = createRoot(contentEl);
|
|
root.render(
|
|
/* @__PURE__ */ bn.createElement(SyncMetadataComponent, {
|
|
plugin: this.plugin,
|
|
files: this.files,
|
|
syncColumns: this.syncColumns,
|
|
close: () => this.close()
|
|
})
|
|
);
|
|
}
|
|
onClose() {
|
|
let { contentEl } = this;
|
|
contentEl.empty();
|
|
}
|
|
};
|
|
var metadatTypeFilterPredicate = (value, index, self2) => {
|
|
return self2.findIndex((v3) => value["type"] == v3["type"] && value["name"] == v3["name"]) === index;
|
|
};
|
|
var SyncMetadataComponent = (props2) => {
|
|
const { plugin } = props2;
|
|
const cols = props2.files.reduce((p3, c4) => {
|
|
const fm = frontMatterForFile(c4);
|
|
const fmKeys = uniqCaseInsensitive(frontMatterKeys(fm));
|
|
if (props2.plugin.dataViewAPI()) {
|
|
const dvValues = props2.plugin.dataViewAPI().page(c4.path);
|
|
const dvKeys = uniqCaseInsensitive(
|
|
Object.keys(dvValues != null ? dvValues : {}).filter(
|
|
(f4, i4, self2) => !self2.find(
|
|
(g4, j4) => g4.toLowerCase().replace(/\s/g, "-") == f4.toLowerCase().replace(/\s/g, "-") && i4 > j4
|
|
) ? true : false
|
|
).filter((f4) => f4 != "file" && !fmKeys.some((g4) => f4 == g4))
|
|
);
|
|
return [...p3, ...fmKeys.map((f4) => ({ name: f4, type: "fm" })), ...dvKeys.map((f4) => ({ name: f4, type: "dv" }))].filter(metadatTypeFilterPredicate);
|
|
}
|
|
return [...p3, ...fmKeys.map((f4) => ({ name: f4, type: "fm" }))].filter(metadatTypeFilterPredicate);
|
|
}, []);
|
|
const [syncColumns, setSyncColumns] = p2(cols);
|
|
const [table, setTable] = p2("");
|
|
const toggleColumn = (column) => {
|
|
if (syncColumns.find((f4) => f4.name == column.name && f4.type == column.type)) {
|
|
setSyncColumns((s5) => s5.filter((f4) => !(f4.name == column.name && f4.type == column.type)));
|
|
} else {
|
|
setSyncColumns((s5) => [...s5, column]);
|
|
}
|
|
};
|
|
const saveContexts = (_5, value) => {
|
|
setTable(tagFromString(value[0]));
|
|
};
|
|
const showContextMenu = (e4) => {
|
|
const offset = e4.target.getBoundingClientRect();
|
|
const f4 = loadTags(props2.plugin);
|
|
showSelectMenu(
|
|
{ x: offset.left, y: offset.top + 30 },
|
|
{
|
|
multi: false,
|
|
editable: true,
|
|
value: [],
|
|
options: [
|
|
{ name: "Folder", value: "" },
|
|
...f4.map((m5) => ({ name: m5, value: m5 }))
|
|
],
|
|
saveOptions: saveContexts,
|
|
placeholder: i18n_default.labels.tagItemSelectPlaceholder,
|
|
searchable: true,
|
|
showAll: true
|
|
}
|
|
);
|
|
};
|
|
const sync = () => {
|
|
props2.syncColumns(syncColumns, table);
|
|
props2.close();
|
|
};
|
|
return /* @__PURE__ */ bn.createElement("div", {
|
|
className: "modal-content"
|
|
}, /* @__PURE__ */ bn.createElement("div", {
|
|
className: "setting-item setting-item-heading"
|
|
}, i18n_default.labels.syncProperties), /* @__PURE__ */ bn.createElement("div", {
|
|
className: "setting-item"
|
|
}, i18n_default.descriptions.syncProperties), /* @__PURE__ */ bn.createElement("div", {
|
|
className: "setting-item"
|
|
}, /* @__PURE__ */ bn.createElement("div", {
|
|
className: "setting-item-info"
|
|
}, /* @__PURE__ */ bn.createElement("div", {
|
|
className: "setting-item-name"
|
|
}, i18n_default.labels.selectContext), /* @__PURE__ */ bn.createElement("div", {
|
|
className: "setting-item-description"
|
|
}, i18n_default.descriptions.selectContext)), /* @__PURE__ */ bn.createElement("div", {
|
|
className: "setting-item-control"
|
|
}, /* @__PURE__ */ bn.createElement("button", {
|
|
onClick: (e4) => showContextMenu(e4)
|
|
}, table == "" ? i18n_default.buttons.currentFolder : table))), /* @__PURE__ */ bn.createElement("div", {
|
|
className: "setting-item"
|
|
}, /* @__PURE__ */ bn.createElement("div", {
|
|
className: "setting-item-info"
|
|
}, /* @__PURE__ */ bn.createElement("div", {
|
|
className: "setting-item-name"
|
|
}, i18n_default.labels.syncProperties), /* @__PURE__ */ bn.createElement("div", {
|
|
className: "setting-item-description"
|
|
}, i18n_default.descriptions.syncMetadata), cols.map((f4, index) => /* @__PURE__ */ bn.createElement("div", {
|
|
className: "mobile-option-setting-item"
|
|
}, /* @__PURE__ */ bn.createElement("input", {
|
|
type: "checkbox",
|
|
checked: syncColumns.some((g4) => g4.name == f4.name && g4.type == f4.type),
|
|
onChange: () => toggleColumn(f4)
|
|
}), /* @__PURE__ */ bn.createElement("span", {
|
|
className: "mobile-option-setting-item-name"
|
|
}, f4.name, /* @__PURE__ */ bn.createElement("span", {
|
|
className: "nav-file-tag"
|
|
}, f4.type)))))), /* @__PURE__ */ bn.createElement("button", {
|
|
style: { marginRight: 8 },
|
|
onClick: () => sync()
|
|
}, i18n_default.buttons.sync), /* @__PURE__ */ bn.createElement("button", {
|
|
onClick: () => props2.close()
|
|
}, i18n_default.buttons.cancel));
|
|
};
|
|
|
|
// src/components/ContextView/FilterBar/TagSelector.tsx
|
|
var import_lodash5 = __toESM(require_lodash());
|
|
var import_obsidian25 = require("obsidian");
|
|
var TagSelector = (props2) => {
|
|
const {
|
|
data,
|
|
tagContexts,
|
|
dbFileExists,
|
|
setContextTable,
|
|
saveDB: saveDB2,
|
|
tableData,
|
|
contextTable,
|
|
dbSchema,
|
|
dbPath,
|
|
saveContextDB,
|
|
saveSchema,
|
|
loadContextFields
|
|
} = q2(MDBContext);
|
|
const removeContext = (value) => {
|
|
const removeTags = value.map((f4) => tagFromString(f4));
|
|
const tags = tagContexts.filter((f4) => !removeTags.some((t4) => t4 == f4));
|
|
removeTags.forEach((t4) => {
|
|
removeSourceFromTag(props2.plugin, t4, dbPath);
|
|
});
|
|
saveSchema({
|
|
...dbSchema,
|
|
def: tags.join("&")
|
|
});
|
|
};
|
|
const saveContexts = async (_5, value) => {
|
|
const tags = (0, import_lodash5.uniq)([...tagContexts, ...value.map((f4) => tagFromString(f4))]);
|
|
tags.forEach((tag) => {
|
|
initiateContextIfNotExists(props2.plugin, tag).then((f4) => {
|
|
if (f4) {
|
|
return consolidateRowsToTag(
|
|
props2.plugin,
|
|
tagContextFromTag(props2.plugin, tag),
|
|
dbSchema.id,
|
|
dbPath,
|
|
tableData.rows
|
|
);
|
|
}
|
|
}).then((f4) => loadContextFields(tag));
|
|
});
|
|
saveSchema({
|
|
...dbSchema,
|
|
def: tags.join("&")
|
|
});
|
|
};
|
|
const showContextMenu = (e4) => {
|
|
const offset = e4.target.getBoundingClientRect();
|
|
const f4 = loadTags(props2.plugin);
|
|
showSelectMenu(
|
|
{ x: offset.left, y: offset.top + 30 },
|
|
{
|
|
multi: false,
|
|
editable: true,
|
|
value: [],
|
|
options: f4.map((m5) => ({ name: m5, value: m5 })),
|
|
saveOptions: saveContexts,
|
|
placeholder: i18n_default.labels.contextItemSelectPlaceholder,
|
|
searchable: true,
|
|
showAll: true
|
|
}
|
|
);
|
|
};
|
|
const showTagMenu = (e4, tag) => {
|
|
const menu = new import_obsidian25.Menu();
|
|
menu.addItem((menuItem) => {
|
|
menuItem.setIcon("hash");
|
|
menuItem.setTitle(i18n_default.menu.openTag);
|
|
menuItem.onClick(() => {
|
|
openTag(tag, props2.plugin, e4.metaKey);
|
|
});
|
|
});
|
|
menu.addItem((menuItem) => {
|
|
menuItem.setIcon("trash");
|
|
menuItem.setTitle(i18n_default.menu.removeTag);
|
|
menuItem.onClick(() => {
|
|
removeContext([tag]);
|
|
});
|
|
});
|
|
const offset = e4.target.getBoundingClientRect();
|
|
menu.showAtPosition({ x: offset.left, y: offset.top + 30 });
|
|
};
|
|
const saveMetadata = (keys, table) => {
|
|
const files = data.map((f4) => f4.File);
|
|
const importDV = (files2, dvKeys) => {
|
|
return files2.reduce(
|
|
(p3, c4) => {
|
|
const dvValues = props2.plugin.dataViewAPI().page(c4);
|
|
if (!dvValues) {
|
|
return p3;
|
|
}
|
|
return {
|
|
uniques: [],
|
|
cols: uniqCaseInsensitive([...p3.cols, ...dvKeys]),
|
|
rows: [
|
|
...p3.rows,
|
|
{
|
|
File: c4,
|
|
...dvKeys.reduce(
|
|
(p4, c5) => ({
|
|
...p4,
|
|
[c5]: parseFrontMatter(c5, dvValues[c5], true)
|
|
}),
|
|
{}
|
|
)
|
|
}
|
|
]
|
|
};
|
|
},
|
|
{ uniques: [], cols: [], rows: [] }
|
|
);
|
|
};
|
|
const importYAML = (files2, fmKeys) => {
|
|
return files2.map((f4) => getAbstractFileAtPath(app, f4)).filter((f4) => f4).reduce(
|
|
(p3, c4) => {
|
|
const fm = frontMatterForFile(c4);
|
|
if (!fm) {
|
|
return p3;
|
|
}
|
|
return {
|
|
uniques: [],
|
|
cols: (0, import_lodash5.uniq)([...p3.cols, ...fmKeys]),
|
|
rows: [
|
|
...p3.rows,
|
|
{
|
|
File: c4.path,
|
|
...fmKeys.reduce(
|
|
(p4, c5) => ({
|
|
...p4,
|
|
[c5]: parseFrontMatter(c5, fm[c5], false)
|
|
}),
|
|
{}
|
|
)
|
|
}
|
|
]
|
|
};
|
|
},
|
|
{ uniques: [], cols: [], rows: [] }
|
|
);
|
|
};
|
|
let yamlTableData = importYAML(files, keys.filter((f4) => f4.type == "fm").map((f4) => f4.name));
|
|
let yamlTypes = guestimateTypes(files, props2.plugin, false);
|
|
if (props2.plugin.dataViewAPI()) {
|
|
const dvTableData = importDV(files, keys.filter((f4) => f4.type == "dv").map((f4) => f4.name));
|
|
const dvTypes = guestimateTypes(files, props2.plugin, true);
|
|
yamlTableData = {
|
|
uniques: (0, import_lodash5.uniq)([...yamlTableData.uniques, ...dvTableData.uniques]),
|
|
cols: (0, import_lodash5.uniq)([...yamlTableData.cols, ...dvTableData.cols]),
|
|
rows: files.map((file) => {
|
|
var _a2, _b2;
|
|
return { ...(_a2 = yamlTableData.rows.find((r3) => r3.File == file)) != null ? _a2 : {}, ...(_b2 = dvTableData.rows.find((r3) => r3.File == file)) != null ? _b2 : {} };
|
|
})
|
|
};
|
|
yamlTypes = { ...yamlTypes, ...dvTypes };
|
|
}
|
|
if (table == "") {
|
|
const newTable = mergeTableData(tableData, yamlTableData, yamlTypes);
|
|
saveDB2(newTable);
|
|
} else {
|
|
if (!dbFileExists) {
|
|
saveDB2(tableData).then(
|
|
() => saveContext(yamlTableData, yamlTypes, table)
|
|
);
|
|
} else {
|
|
saveContext(yamlTableData, yamlTypes, table);
|
|
}
|
|
}
|
|
};
|
|
const saveContext = (yamlTableData, yamlTypes, table) => {
|
|
if (contextTable[table]) {
|
|
const newTable = mergeTableData(
|
|
contextTable[table],
|
|
yamlTableData,
|
|
yamlTypes
|
|
);
|
|
saveContextDB(newTable, table);
|
|
saveSchema({
|
|
...dbSchema,
|
|
def: (0, import_lodash5.uniq)([...tagContexts, table]).join("&")
|
|
});
|
|
} else {
|
|
consolidateRowsToTag(
|
|
props2.plugin,
|
|
tagContextFromTag(props2.plugin, table),
|
|
dbSchema.id,
|
|
dbPath,
|
|
tableData.rows
|
|
).then((f4) => {
|
|
if (f4) {
|
|
const newTable = mergeTableData(f4, yamlTableData, yamlTypes);
|
|
return saveContextDB(newTable, table);
|
|
}
|
|
}).then(() => {
|
|
saveSchema({
|
|
...dbSchema,
|
|
def: (0, import_lodash5.uniq)([...tagContexts, table]).join("&")
|
|
});
|
|
});
|
|
}
|
|
};
|
|
const syncMetadata = () => {
|
|
let vaultChangeModal = new SyncMetadataModal(
|
|
props2.plugin,
|
|
data.map((f4) => getAbstractFileAtPath(app, f4.File)).filter((f4) => f4),
|
|
saveMetadata
|
|
);
|
|
vaultChangeModal.open();
|
|
};
|
|
return /* @__PURE__ */ bn.createElement("div", {
|
|
className: "mk-tag-selector"
|
|
}, tagContexts.map((f4) => /* @__PURE__ */ bn.createElement("button", {
|
|
onContextMenu: (e4) => showTagMenu(e4, f4),
|
|
onClick: (e4) => openTag(f4, props2.plugin, e4.metaKey)
|
|
}, f4)), /* @__PURE__ */ bn.createElement("button", {
|
|
"aria-label": i18n_default.buttons.addTag,
|
|
onClick: (e4) => showContextMenu(e4)
|
|
}, /* @__PURE__ */ bn.createElement("div", {
|
|
className: "mk-icon-xsmall",
|
|
dangerouslySetInnerHTML: { __html: uiIconSet["mk-ui-plus"] }
|
|
}), !dbFileExists ? i18n_default.buttons.tag : ""), /* @__PURE__ */ bn.createElement("button", {
|
|
"aria-label": i18n_default.buttons.syncFields,
|
|
onClick: (e4) => syncMetadata()
|
|
}, /* @__PURE__ */ bn.createElement("div", {
|
|
className: "mk-icon-xsmall",
|
|
dangerouslySetInnerHTML: { __html: uiIconSet["mk-ui-sync"] }
|
|
}), !dbFileExists ? i18n_default.buttons.syncFields : ""));
|
|
};
|
|
|
|
// src/components/ContextView/FilterBar/FilterBar.tsx
|
|
var FilterBar = (props2) => {
|
|
const { folderNoteOpen, viewFolderNote } = props2;
|
|
const ctxRef = _2(null);
|
|
const {
|
|
tables,
|
|
data,
|
|
setDBSchema,
|
|
loadContextFields,
|
|
cols,
|
|
isFolderContext,
|
|
deleteSchema,
|
|
saveSchema,
|
|
saveDB: saveDB2,
|
|
saveContextDB,
|
|
setSchema,
|
|
setSearchString,
|
|
predicate,
|
|
tagContexts,
|
|
savePredicate,
|
|
schema,
|
|
dbSchema,
|
|
dbPath,
|
|
contextTable,
|
|
tableData
|
|
} = q2(MDBContext);
|
|
const filteredCols = cols.filter((f4) => f4.hidden != "true");
|
|
const saveViewType = (type) => {
|
|
saveSchema({
|
|
...schema,
|
|
type
|
|
});
|
|
};
|
|
const selectView = (_dbschema, value) => {
|
|
viewFolderNote && folderNoteOpen && viewFolderNote(false);
|
|
setDBSchema(_dbschema);
|
|
value && setSchema(tables.find((f4) => f4.id == value));
|
|
};
|
|
const openView = (e4, _dbschema) => {
|
|
const views = tables.filter((f4) => f4.type != "db" && f4.def == _dbschema.id);
|
|
if (views.length == 0) {
|
|
selectView(_dbschema);
|
|
return;
|
|
}
|
|
selectView(_dbschema, views[0].id);
|
|
return;
|
|
};
|
|
const showViewMenu = (e4, _dbschema) => {
|
|
const views = tables.filter((f4) => f4.type != "db" && f4.def == _dbschema.id);
|
|
const offset = e4.target.getBoundingClientRect();
|
|
showSelectMenu(
|
|
{ x: offset.left, y: offset.top + 30 },
|
|
{
|
|
multi: false,
|
|
editable: false,
|
|
value: tagContexts,
|
|
options: views.map((m5) => ({ name: m5.name, value: m5.id })),
|
|
saveOptions: (_5, value) => selectView(_dbschema, value[0]),
|
|
placeholder: i18n_default.labels.viewItemSelectPlaceholder,
|
|
searchable: false,
|
|
showAll: true
|
|
}
|
|
);
|
|
};
|
|
const clearFilters = () => {
|
|
savePredicate({
|
|
...predicate,
|
|
filters: [],
|
|
sort: []
|
|
});
|
|
};
|
|
const clearHiddenCols = () => {
|
|
savePredicate({
|
|
...predicate,
|
|
colsHidden: []
|
|
});
|
|
};
|
|
const removeFilter = (filter) => {
|
|
const newFilters = [
|
|
...predicate.filters.filter((f4) => f4.field != filter.field)
|
|
];
|
|
savePredicate({
|
|
...predicate,
|
|
filters: newFilters
|
|
});
|
|
};
|
|
const showFilterMenu = (e4) => {
|
|
const menu = new import_obsidian26.Menu();
|
|
menu.addItem((item) => {
|
|
item.setTitle(i18n_default.menu.tableView);
|
|
item.setIcon("table-2");
|
|
item.onClick(() => {
|
|
saveViewType("table");
|
|
});
|
|
});
|
|
menu.addItem((item) => {
|
|
item.setTitle(i18n_default.menu.cardView);
|
|
item.setIcon("layout-grid");
|
|
item.onClick(() => {
|
|
saveViewType("card");
|
|
});
|
|
});
|
|
menu.addItem((item) => {
|
|
item.setTitle(i18n_default.menu.listView);
|
|
item.setIcon("layout-list");
|
|
item.onClick(() => {
|
|
saveViewType("list");
|
|
});
|
|
});
|
|
menu.addItem((item) => {
|
|
item.setTitle(i18n_default.menu.flowView);
|
|
item.setIcon("infinity");
|
|
item.onClick(() => {
|
|
saveViewType("flow");
|
|
});
|
|
});
|
|
menu.addSeparator();
|
|
menu.addItem((item) => {
|
|
item.setTitle(i18n_default.menu.groupBy);
|
|
item.setIcon("columns");
|
|
item.onClick(() => {
|
|
showGroupByMenu(e4);
|
|
});
|
|
});
|
|
menu.addItem((item) => {
|
|
item.setTitle(i18n_default.menu.sortBy);
|
|
item.setIcon("sort-desc");
|
|
item.onClick(() => {
|
|
showSortMenu(e4);
|
|
});
|
|
});
|
|
menu.addSeparator();
|
|
menu.addItem((item) => {
|
|
item.setTitle(i18n_default.menu.newFilter);
|
|
item.setIcon("filter");
|
|
item.onClick(() => {
|
|
showAddFilterMenu(e4);
|
|
});
|
|
});
|
|
menu.addItem((item) => {
|
|
item.setTitle(i18n_default.menu.clearFilters);
|
|
item.setIcon("x-square");
|
|
item.onClick(() => {
|
|
clearFilters();
|
|
});
|
|
});
|
|
menu.addSeparator();
|
|
menu.addItem((item) => {
|
|
item.setTitle(i18n_default.menu.unhideFields);
|
|
item.setIcon("eye");
|
|
item.onClick(() => {
|
|
clearHiddenCols();
|
|
});
|
|
});
|
|
const offset = e4.target.getBoundingClientRect();
|
|
menu.showAtPosition({ x: offset.left, y: offset.top + 30 });
|
|
};
|
|
const addSort = (_5, sort) => {
|
|
var _a2;
|
|
const field = sort[0];
|
|
const fieldType = (_a2 = filteredCols.find((f4) => f4.name + f4.table == field)) == null ? void 0 : _a2.type;
|
|
if (fieldType) {
|
|
const type = defaultPredicateFnForType(fieldType, sortFnTypes);
|
|
const newSort = {
|
|
field,
|
|
type
|
|
};
|
|
savePredicate({
|
|
...predicate,
|
|
sort: [
|
|
...predicate.sort.filter((s5) => s5.field != newSort.field),
|
|
newSort
|
|
]
|
|
});
|
|
}
|
|
};
|
|
const saveGroupBy = (_5, groupBy2) => {
|
|
savePredicate({
|
|
...predicate,
|
|
groupBy: groupBy2
|
|
});
|
|
};
|
|
const removeSort = (sort) => {
|
|
const newSort = [...predicate.sort.filter((f4) => f4.field != sort.field)];
|
|
savePredicate({
|
|
...predicate,
|
|
sort: newSort
|
|
});
|
|
};
|
|
const addFilter = (_5, filter) => {
|
|
var _a2;
|
|
const field = filter[0];
|
|
const fieldType = (_a2 = filteredCols.find((f4) => f4.name + f4.table == field)) == null ? void 0 : _a2.type;
|
|
if (fieldType) {
|
|
const type = defaultPredicateFnForType(fieldType, filterFnTypes);
|
|
const newFilter = fieldType == "boolean" ? {
|
|
field,
|
|
type,
|
|
value: "true"
|
|
} : {
|
|
field,
|
|
type,
|
|
value: ""
|
|
};
|
|
savePredicate({
|
|
...predicate,
|
|
filters: [
|
|
...predicate.filters.filter((s5) => s5.field != newFilter.field),
|
|
newFilter
|
|
]
|
|
});
|
|
}
|
|
};
|
|
const changeSortMenu = (e4, sort) => {
|
|
var _a2;
|
|
const offset = e4.target.getBoundingClientRect();
|
|
const saveSort = (_5, newType) => {
|
|
const type = newType[0];
|
|
const newSort = {
|
|
...sort,
|
|
type
|
|
};
|
|
savePredicate({
|
|
...predicate,
|
|
sort: [
|
|
...predicate.sort.filter((s5) => s5.field != newSort.field),
|
|
newSort
|
|
]
|
|
});
|
|
};
|
|
const fieldType = (_a2 = filteredCols.find(
|
|
(f4) => f4.name + f4.table == sort.field
|
|
)) == null ? void 0 : _a2.type;
|
|
const sortsForType = predicateFnsForType(fieldType, sortFnTypes);
|
|
showSelectMenu(
|
|
{ x: offset.left, y: offset.top + 30 },
|
|
{
|
|
multi: false,
|
|
editable: false,
|
|
value: [],
|
|
options: sortsForType.map((f4) => ({
|
|
name: sortFnTypes[f4].label,
|
|
value: f4
|
|
})),
|
|
saveOptions: saveSort,
|
|
placeholder: i18n_default.labels.sortItemSelectPlaceholder,
|
|
searchable: false,
|
|
showAll: true
|
|
}
|
|
);
|
|
};
|
|
const showColsMenu = (e4) => {
|
|
const offset = e4.target.getBoundingClientRect();
|
|
showSelectMenu(
|
|
{ x: offset.left, y: offset.top + 30 },
|
|
{
|
|
multi: false,
|
|
editable: false,
|
|
value: [],
|
|
options: filteredCols.map((f4) => ({
|
|
name: f4.name + f4.table,
|
|
value: f4.name + f4.table
|
|
})),
|
|
saveOptions: addFilter,
|
|
placeholder: i18n_default.labels.propertyItemSelectPlaceholder,
|
|
searchable: false,
|
|
showAll: true
|
|
}
|
|
);
|
|
};
|
|
const changeFilterMenu = (e4, filter) => {
|
|
var _a2;
|
|
const offset = e4.target.getBoundingClientRect();
|
|
const saveFilter = (_5, newType) => {
|
|
const type = newType[0];
|
|
const newFilter = {
|
|
...filter,
|
|
type
|
|
};
|
|
savePredicate({
|
|
...predicate,
|
|
filters: [
|
|
...predicate.filters.filter((s5) => s5.field != newFilter.field),
|
|
newFilter
|
|
]
|
|
});
|
|
};
|
|
const fieldType = (_a2 = filteredCols.find(
|
|
(f4) => f4.name + f4.table == filter.field
|
|
)) == null ? void 0 : _a2.type;
|
|
const filtersForType = predicateFnsForType(fieldType, filterFnTypes);
|
|
showSelectMenu(
|
|
{ x: offset.left, y: offset.top + 30 },
|
|
{
|
|
multi: false,
|
|
editable: false,
|
|
value: [],
|
|
options: filtersForType.map((f4) => ({
|
|
name: filterFnTypes[f4].label,
|
|
value: f4
|
|
})),
|
|
saveOptions: saveFilter,
|
|
placeholder: i18n_default.labels.filterItemSelectPlaceholder,
|
|
searchable: false,
|
|
showAll: true
|
|
}
|
|
);
|
|
};
|
|
const showAddFilterMenu = (e4) => {
|
|
const offset = e4.target.getBoundingClientRect();
|
|
showSelectMenu(
|
|
{ x: offset.left, y: offset.top + 30 },
|
|
{
|
|
multi: false,
|
|
editable: false,
|
|
value: [],
|
|
options: filteredCols.filter((f4) => predicateFnsForType(f4.type, filterFnTypes).length > 0).map((f4) => ({
|
|
name: f4.name + f4.table,
|
|
value: f4.name + f4.table
|
|
})),
|
|
saveOptions: addFilter,
|
|
placeholder: i18n_default.labels.propertyItemSelectPlaceholder,
|
|
searchable: false,
|
|
showAll: true
|
|
}
|
|
);
|
|
};
|
|
const showSortMenu = (e4) => {
|
|
const offset = e4.target.getBoundingClientRect();
|
|
showSelectMenu(
|
|
{ x: offset.left, y: offset.top + 30 },
|
|
{
|
|
multi: false,
|
|
editable: false,
|
|
value: [],
|
|
options: filteredCols.map((f4) => ({
|
|
name: f4.name + f4.table,
|
|
value: f4.name + f4.table
|
|
})),
|
|
saveOptions: addSort,
|
|
placeholder: i18n_default.labels.sortItemSelectPlaceholder,
|
|
searchable: false,
|
|
showAll: true
|
|
}
|
|
);
|
|
};
|
|
const showGroupByMenu = (e4) => {
|
|
const offset = e4.target.getBoundingClientRect();
|
|
showSelectMenu(
|
|
{ x: offset.left, y: offset.top + 30 },
|
|
{
|
|
multi: false,
|
|
editable: false,
|
|
value: [],
|
|
options: filteredCols.filter((f4) => f4.primary != "true").map((f4) => ({
|
|
name: f4.name + f4.table,
|
|
value: f4.name + f4.table
|
|
})),
|
|
saveOptions: saveGroupBy,
|
|
placeholder: i18n_default.labels.propertyItemSelectPlaceholder,
|
|
searchable: false,
|
|
showAll: true
|
|
}
|
|
);
|
|
};
|
|
const showFMMenu = (e4) => {
|
|
const menu = new import_obsidian26.Menu();
|
|
menu.addItem((menuItem) => {
|
|
menuItem.setIcon("log-in");
|
|
menuItem.setTitle(i18n_default.menu.mergeProperties);
|
|
menuItem.onClick(() => {
|
|
showMergeColumnModal();
|
|
});
|
|
});
|
|
const offset = e4.target.getBoundingClientRect();
|
|
menu.showAtPosition({ x: offset.left, y: offset.top + 30 });
|
|
};
|
|
const mergeColumn = (fromCol, toCol) => {
|
|
const fromTable = fromCol.table == "" ? tableData : contextTable[fromCol.table];
|
|
if (toCol.table == "") {
|
|
saveDB2({
|
|
...tableData,
|
|
rows: tableData.rows.map((r3, i4) => {
|
|
const foundRow = fromTable.rows.find((f4) => f4.File == r3.File);
|
|
return foundRow ? { ...r3, [toCol.name]: foundRow[fromCol.name] } : r3;
|
|
})
|
|
});
|
|
} else {
|
|
saveContextDB(
|
|
{
|
|
...contextTable[toCol.table],
|
|
rows: contextTable[toCol.table].rows.map((r3, i4) => {
|
|
const foundRow = fromTable.rows.find((f4) => f4.File == r3.File);
|
|
return foundRow ? { ...r3, [toCol.name]: foundRow[fromCol.name] } : r3;
|
|
})
|
|
},
|
|
toCol.table
|
|
);
|
|
}
|
|
};
|
|
const showMergeColumnModal = () => {
|
|
var _a2;
|
|
let vaultChangeModal = new MergeColumnModal(
|
|
[
|
|
...(_a2 = filteredCols == null ? void 0 : filteredCols.map((f4) => ({ ...f4, table: "" }))) != null ? _a2 : [],
|
|
...tagContexts.reduce(
|
|
(p3, c4) => {
|
|
var _a3, _b2;
|
|
return [
|
|
...p3,
|
|
...(_b2 = (_a3 = contextTable[c4]) == null ? void 0 : _a3.cols.filter(
|
|
(f4) => f4.name != "File" && f4.hidden != "true" && f4.type != "fileprop"
|
|
).map((f4) => ({ ...f4, table: c4 }))) != null ? _b2 : []
|
|
];
|
|
},
|
|
[]
|
|
)
|
|
],
|
|
mergeColumn
|
|
);
|
|
vaultChangeModal.open();
|
|
};
|
|
const showSaveViewModal = () => {
|
|
let vaultChangeModal = new SaveViewModal(schema, saveSchema, "new view");
|
|
vaultChangeModal.open();
|
|
};
|
|
const selectFilterValue = (e4, filter) => {
|
|
var _a2, _b2, _c2;
|
|
switch (filterFnTypes[filter.type].valueType) {
|
|
case "text":
|
|
case "number":
|
|
{
|
|
const menu = new import_obsidian26.Menu();
|
|
menu.setUseNativeMenu(false);
|
|
const saveFilterValue = (value) => {
|
|
const newFilter = {
|
|
...filter,
|
|
value
|
|
};
|
|
savePredicate({
|
|
...predicate,
|
|
filters: [
|
|
...predicate.filters.filter((s5) => s5.field != newFilter.field),
|
|
newFilter
|
|
]
|
|
});
|
|
};
|
|
menu.addItem((menuItem) => {
|
|
inputMenuItem(
|
|
menuItem,
|
|
filter.value,
|
|
(value) => saveFilterValue(value)
|
|
);
|
|
menuItem.setIcon("type");
|
|
});
|
|
const offset = e4.target.getBoundingClientRect();
|
|
menu.showAtPosition({ x: offset.left, y: offset.top + 30 });
|
|
}
|
|
break;
|
|
case "date": {
|
|
const saveValue = (date2) => {
|
|
const newFilter = {
|
|
...filter,
|
|
value: date2.valueOf().toString()
|
|
};
|
|
savePredicate({
|
|
...predicate,
|
|
filters: [
|
|
...predicate.filters.filter((s5) => s5.field != newFilter.field),
|
|
newFilter
|
|
]
|
|
});
|
|
};
|
|
const offset = e4.target.getBoundingClientRect();
|
|
const date = new Date(filter.value);
|
|
showDatePickerMenu(
|
|
{ x: offset.left, y: offset.top + 30 },
|
|
date.getTime() ? date : null,
|
|
saveValue
|
|
);
|
|
break;
|
|
}
|
|
case "list":
|
|
{
|
|
const col = cols.find((f4) => f4.name + f4.table == filter.field);
|
|
const saveOptions = (options, values) => {
|
|
const newFilter = {
|
|
...filter,
|
|
value: values.join(",")
|
|
};
|
|
savePredicate({
|
|
...predicate,
|
|
filters: [
|
|
...predicate.filters.filter((s5) => s5.field != newFilter.field),
|
|
newFilter
|
|
]
|
|
});
|
|
};
|
|
if (col.type.startsWith("option")) {
|
|
const offset = e4.target.getBoundingClientRect();
|
|
showSelectMenu(
|
|
{ x: offset.left, y: offset.top + 30 },
|
|
{
|
|
multi: true,
|
|
editable: false,
|
|
value: splitString(filter.value),
|
|
options: splitString(col.value).map((f4) => ({
|
|
name: f4,
|
|
value: f4
|
|
})),
|
|
saveOptions,
|
|
placeholder: i18n_default.labels.optionItemSelectPlaceholder,
|
|
searchable: true,
|
|
showAll: true
|
|
}
|
|
);
|
|
} else if (col.type.startsWith("context")) {
|
|
const contextData = (_b2 = (_a2 = contextTable[col.table]) == null ? void 0 : _a2.rows) != null ? _b2 : [];
|
|
const offset = e4.target.getBoundingClientRect();
|
|
showSelectMenu(
|
|
{ x: offset.left, y: offset.top + 30 },
|
|
{
|
|
multi: true,
|
|
editable: false,
|
|
value: splitString(filter.value),
|
|
options: (_c2 = contextData.map((f4) => ({
|
|
name: filePathToString(f4["File"]),
|
|
value: f4["File"]
|
|
}))) != null ? _c2 : [],
|
|
saveOptions,
|
|
placeholder: i18n_default.labels.optionItemSelectPlaceholder,
|
|
searchable: true,
|
|
showAll: true
|
|
}
|
|
);
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
};
|
|
const saveNewSchemas = (_schema) => {
|
|
const newSchema = {
|
|
..._schema,
|
|
id: uniqueNameFromString(
|
|
sanitizeTableName(_schema.id),
|
|
tables.map((f4) => f4.id)
|
|
)
|
|
};
|
|
saveSchema(newSchema).then(
|
|
(f4) => saveDB2({
|
|
schema: newSchema,
|
|
cols: defaultTableFields.map((f5) => ({ ...f5, schemaId: newSchema.id })),
|
|
rows: []
|
|
})
|
|
);
|
|
};
|
|
const newTable = (e4) => {
|
|
let vaultChangeModal = new SaveViewModal(
|
|
{
|
|
id: "",
|
|
name: "",
|
|
type: "db"
|
|
},
|
|
saveNewSchemas,
|
|
"new table"
|
|
);
|
|
vaultChangeModal.open();
|
|
};
|
|
const viewContextMenu = (e4, _schema) => {
|
|
const fileMenu = new import_obsidian26.Menu();
|
|
fileMenu.addSeparator();
|
|
fileMenu.addItem((menuItem) => {
|
|
menuItem.setTitle("Rename Table");
|
|
menuItem.onClick(() => {
|
|
let vaultChangeModal = new SaveViewModal(
|
|
_schema,
|
|
(s5) => saveSchema(s5),
|
|
"rename table"
|
|
);
|
|
vaultChangeModal.open();
|
|
});
|
|
});
|
|
fileMenu.addItem((menuItem) => {
|
|
menuItem.setTitle("Delete Table");
|
|
menuItem.onClick(() => {
|
|
deleteSchema(_schema);
|
|
});
|
|
});
|
|
if (isMouseEvent(e4)) {
|
|
fileMenu.showAtPosition({ x: e4.pageX, y: e4.pageY });
|
|
} else {
|
|
fileMenu.showAtPosition({
|
|
x: e4.nativeEvent.locationX,
|
|
y: e4.nativeEvent.locationY
|
|
});
|
|
}
|
|
};
|
|
return /* @__PURE__ */ bn.createElement(bn.Fragment, null, isFolderContext && /* @__PURE__ */ bn.createElement(TagSelector, {
|
|
plugin: props2.plugin
|
|
}), /* @__PURE__ */ bn.createElement("div", {
|
|
className: "mk-view-selector"
|
|
}, /* @__PURE__ */ bn.createElement("div", {
|
|
className: "mk-table-selector"
|
|
}, viewFolderNote && /* @__PURE__ */ bn.createElement("button", {
|
|
className: `mk-folder-note ${folderNoteOpen ? "mk-is-active" : ""}`,
|
|
onClick: () => viewFolderNote(true)
|
|
}, props2.folderNoteName), tables.filter((f4) => f4.type == "db").map((f4) => /* @__PURE__ */ bn.createElement("div", {
|
|
className: `${!folderNoteOpen && (dbSchema == null ? void 0 : dbSchema.id) == f4.id ? "mk-is-active" : ""}`,
|
|
onContextMenu: (e4) => !f4.primary && viewContextMenu(e4, f4)
|
|
}, /* @__PURE__ */ bn.createElement("button", {
|
|
onClick: (e4) => openView(e4, f4)
|
|
}, f4.name), tables.filter((g4) => g4.type != "db" && g4.def == f4.id).length > 1 && /* @__PURE__ */ bn.createElement("button", {
|
|
className: "mk-icon-xsmall mk-collapse",
|
|
onClick: (e4) => showViewMenu(e4, f4),
|
|
dangerouslySetInnerHTML: {
|
|
__html: uiIconSet["mk-ui-collapse"]
|
|
}
|
|
}))), isFolderContext && /* @__PURE__ */ bn.createElement("button", {
|
|
onClick: (e4) => newTable(e4)
|
|
}, "+ Table")), /* @__PURE__ */ bn.createElement("span", null), !props2.folderNoteOpen && /* @__PURE__ */ bn.createElement("div", {
|
|
className: "mk-view-options"
|
|
}, /* @__PURE__ */ bn.createElement(SearchBar, {
|
|
setSearchString
|
|
}), /* @__PURE__ */ bn.createElement("button", {
|
|
onClick: (e4) => showFilterMenu(e4),
|
|
dangerouslySetInnerHTML: {
|
|
__html: uiIconSet["mk-ui-view-options"]
|
|
}
|
|
}), /* @__PURE__ */ bn.createElement("button", {
|
|
onClick: (e4) => showFMMenu(e4),
|
|
dangerouslySetInnerHTML: { __html: uiIconSet["mk-ui-options"] }
|
|
}))), (predicate.filters.length > 0 || predicate.sort.length > 0 || predicate.groupBy.length > 0) && !folderNoteOpen && /* @__PURE__ */ bn.createElement("div", {
|
|
className: "mk-filter-bar"
|
|
}, predicate.groupBy.length > 0 && /* @__PURE__ */ bn.createElement("div", {
|
|
className: "mk-filter"
|
|
}, /* @__PURE__ */ bn.createElement("span", null, "Group By"), /* @__PURE__ */ bn.createElement("span", {
|
|
onClick: (e4) => showGroupByMenu(e4)
|
|
}, predicate.groupBy[0]), /* @__PURE__ */ bn.createElement("div", {
|
|
onClick: () => saveGroupBy(null, []),
|
|
dangerouslySetInnerHTML: { __html: uiIconSet["mk-ui-close"] }
|
|
})), predicate.sort.map((f4) => /* @__PURE__ */ bn.createElement("div", {
|
|
className: "mk-filter"
|
|
}, /* @__PURE__ */ bn.createElement("span", null, f4.field), /* @__PURE__ */ bn.createElement("span", {
|
|
onClick: (e4) => changeSortMenu(e4, f4)
|
|
}, sortFnTypes[f4.type].label), /* @__PURE__ */ bn.createElement("div", {
|
|
onClick: () => removeSort(f4),
|
|
dangerouslySetInnerHTML: { __html: uiIconSet["mk-ui-close"] }
|
|
}))), predicate.filters.map((f4) => /* @__PURE__ */ bn.createElement("div", {
|
|
className: "mk-filter"
|
|
}, /* @__PURE__ */ bn.createElement("span", null, f4.field), /* @__PURE__ */ bn.createElement("span", {
|
|
onClick: (e4) => changeFilterMenu(e4, f4)
|
|
}, filterFnTypes[f4.type].label), /* @__PURE__ */ bn.createElement(FilterValueSpan, {
|
|
col: cols.find((c4) => c4.name + c4.table == f4.field),
|
|
filter: f4,
|
|
selectFilterValue
|
|
}), /* @__PURE__ */ bn.createElement("div", {
|
|
onClick: () => removeFilter(f4),
|
|
dangerouslySetInnerHTML: { __html: uiIconSet["mk-ui-close"] }
|
|
}))), /* @__PURE__ */ bn.createElement("span", null), /* @__PURE__ */ bn.createElement("button", {
|
|
className: "mk-filter-add mk-icon-small",
|
|
onClick: () => showSaveViewModal()
|
|
}, /* @__PURE__ */ bn.createElement("div", {
|
|
dangerouslySetInnerHTML: { __html: uiIconSet["mk-ui-stack"] }
|
|
}), "Save View")));
|
|
};
|
|
var FilterValueSpan = (props2) => {
|
|
var _a2;
|
|
const { filter, selectFilterValue } = props2;
|
|
const fieldType = (_a2 = props2.col) == null ? void 0 : _a2.type;
|
|
if (fieldType == "boolean" || !fieldType) {
|
|
return /* @__PURE__ */ bn.createElement(bn.Fragment, null);
|
|
} else if (filter.value.length == 0) {
|
|
return /* @__PURE__ */ bn.createElement("span", {
|
|
onClick: (e4) => selectFilterValue(e4, filter)
|
|
}, "Select");
|
|
} else if (fieldType.startsWith("option") || fieldType.startsWith("context")) {
|
|
const options = splitString(filter.value);
|
|
return /* @__PURE__ */ bn.createElement("span", {
|
|
onClick: (e4) => selectFilterValue(e4, filter)
|
|
}, " ", options.map((f4) => /* @__PURE__ */ bn.createElement("span", null, f4)));
|
|
}
|
|
return /* @__PURE__ */ bn.createElement("span", {
|
|
onClick: (e4) => selectFilterValue(e4, filter)
|
|
}, filter.value);
|
|
};
|
|
|
|
// src/components/ContextView/FolderContextViewComponent.tsx
|
|
var FolderContextViewComponent = (props2) => {
|
|
var _a2;
|
|
const folder = (_a2 = props2.folder) == null ? void 0 : _a2.path;
|
|
const path = folderContextFromFolder(props2.plugin, folder);
|
|
const ref = _2(null);
|
|
const [flowOpen, setFlowOpen] = p2(false);
|
|
const folderNotePath = props2.plugin.settings.folderNoteInsideFolder ? `${props2.folder.path}/${props2.folder.name}.md` : props2.folder && props2.folder.parent.path == "/" ? `${props2.folder.name}.md` : `${props2.folder.parent.path}/${props2.folder.name}.md`;
|
|
const loadFile = async () => {
|
|
const folderNote = getAbstractFileAtPath(app, folderNotePath);
|
|
if (folderNote) {
|
|
const div = ref.current;
|
|
const newLeaf = spawnPortal(props2.plugin, div);
|
|
newLeaf.openFile(folderNote);
|
|
} else {
|
|
const div = ref.current;
|
|
const newFile = await app.fileManager.createNewMarkdownFile(
|
|
app.vault.getRoot(),
|
|
folderNotePath
|
|
);
|
|
const newLeaf = spawnPortal(props2.plugin, div);
|
|
newLeaf.openFile(newFile);
|
|
}
|
|
};
|
|
h2(() => {
|
|
if (flowOpen) {
|
|
loadFile();
|
|
} else {
|
|
if (ref.current)
|
|
ref.current.empty();
|
|
}
|
|
}, [flowOpen]);
|
|
const viewFolderNote = (open) => {
|
|
setFlowOpen(open);
|
|
};
|
|
return /* @__PURE__ */ bn.createElement("div", {
|
|
className: "mk-folder-scroller"
|
|
}, /* @__PURE__ */ bn.createElement("div", {
|
|
className: "mk-folder-header"
|
|
}, /* @__PURE__ */ bn.createElement("div", {
|
|
className: "inline-title"
|
|
}, props2.folder.name)), props2.plugin.settings.enableFolderNote ? /* @__PURE__ */ bn.createElement(MDBProvider, {
|
|
plugin: props2.plugin,
|
|
dbPath: path,
|
|
folder
|
|
}, /* @__PURE__ */ bn.createElement(FilterBar, {
|
|
plugin: props2.plugin,
|
|
folderNoteName: props2.folder.name,
|
|
folderNoteOpen: flowOpen,
|
|
viewFolderNote
|
|
}), path && !flowOpen && /* @__PURE__ */ bn.createElement(ContextListView, {
|
|
plugin: props2.plugin
|
|
}), flowOpen && /* @__PURE__ */ bn.createElement("div", {
|
|
className: "mk-flowspace-editor mk-foldernote",
|
|
ref
|
|
})) : /* @__PURE__ */ bn.createElement(MDBProvider, {
|
|
plugin: props2.plugin,
|
|
dbPath: path,
|
|
folder
|
|
}, /* @__PURE__ */ bn.createElement(FilterBar, {
|
|
plugin: props2.plugin
|
|
}), /* @__PURE__ */ bn.createElement(ContextListView, {
|
|
plugin: props2.plugin
|
|
})));
|
|
};
|
|
|
|
// src/components/ContextView/TagContextViewComponent.tsx
|
|
var TagContextViewComponent = (props2) => {
|
|
const path = tagContextFromTag(props2.plugin, props2.tag);
|
|
return /* @__PURE__ */ bn.createElement("div", {
|
|
className: "mk-folder-scroller"
|
|
}, /* @__PURE__ */ bn.createElement("div", {
|
|
className: "mk-folder-header"
|
|
}, /* @__PURE__ */ bn.createElement("div", {
|
|
className: "inline-title"
|
|
}, props2.tag)), /* @__PURE__ */ bn.createElement(MDBProvider, {
|
|
plugin: props2.plugin,
|
|
dbPath: path,
|
|
tag: props2.tag
|
|
}, /* @__PURE__ */ bn.createElement(FilterBar, {
|
|
plugin: props2.plugin
|
|
}), /* @__PURE__ */ bn.createElement(ContextListView, {
|
|
plugin: props2.plugin
|
|
})));
|
|
};
|
|
|
|
// src/components/ContextView/ContextView.tsx
|
|
var CONTEXT_VIEW_TYPE = "make-folder-view";
|
|
var ContextView = class extends import_obsidian27.ItemView {
|
|
constructor(leaf, plugin, viewType) {
|
|
super(leaf);
|
|
this.navigation = true;
|
|
this.plugin = plugin;
|
|
this.viewType = viewType;
|
|
}
|
|
getViewType() {
|
|
return this.viewType;
|
|
}
|
|
getDisplayText() {
|
|
var _a2;
|
|
if (this.type == "tag") {
|
|
return this.tag;
|
|
}
|
|
return (_a2 = this.folder) == null ? void 0 : _a2.name;
|
|
}
|
|
async onClose() {
|
|
this.destroy();
|
|
}
|
|
destroy() {
|
|
if (this.root)
|
|
this.root.unmount();
|
|
}
|
|
async onOpen() {
|
|
this.destroy();
|
|
}
|
|
async setState(state, result) {
|
|
this.type = state.type;
|
|
if (state.type == "folder") {
|
|
const folder = getAbstractFileAtPath(
|
|
this.plugin.app,
|
|
state.folder
|
|
);
|
|
if (!folder) {
|
|
return;
|
|
}
|
|
this.folder = folder;
|
|
this.constructFolderContext(folder);
|
|
await super.setState(state, result);
|
|
this.leaf.tabHeaderInnerTitleEl.innerText = folder.name;
|
|
this.leaf.view.titleEl = folder.name;
|
|
const headerEl = this.leaf.view.headerEl;
|
|
if (headerEl) {
|
|
headerEl.querySelector(".view-header-title").innerText = folder.name;
|
|
}
|
|
} else if (state.type == "tag") {
|
|
this.tag = state.tag;
|
|
this.constructTagContext(this.tag);
|
|
await super.setState(state, result);
|
|
this.leaf.tabHeaderInnerTitleEl.innerText = this.tag;
|
|
this.leaf.view.titleEl = this.tag;
|
|
const headerEl = this.leaf.view.headerEl;
|
|
if (headerEl) {
|
|
headerEl.querySelector(".view-header-title").innerText = this.tag;
|
|
}
|
|
}
|
|
result.history = true;
|
|
return;
|
|
}
|
|
getState() {
|
|
var _a2;
|
|
let state = super.getState();
|
|
state.type = this.type;
|
|
if (state.type == "folder") {
|
|
state.folder = (_a2 = this.folder) == null ? void 0 : _a2.path;
|
|
} else {
|
|
state.tag = this.tag;
|
|
}
|
|
return state;
|
|
}
|
|
constructTagContext(tag) {
|
|
this.destroy();
|
|
this.root = createRoot(this.contentEl);
|
|
this.root.render(
|
|
/* @__PURE__ */ bn.createElement("div", {
|
|
className: "mk-folder-view"
|
|
}, /* @__PURE__ */ bn.createElement(TagContextViewComponent, {
|
|
type: "tag",
|
|
tag: this.tag,
|
|
plugin: this.plugin
|
|
}))
|
|
);
|
|
}
|
|
constructFolderContext(folder) {
|
|
this.destroy();
|
|
this.root = createRoot(this.contentEl);
|
|
this.root.render(
|
|
/* @__PURE__ */ bn.createElement("div", {
|
|
className: "mk-folder-view"
|
|
}, folder && /* @__PURE__ */ bn.createElement(FolderContextViewComponent, {
|
|
type: "folder",
|
|
folder,
|
|
plugin: this.plugin
|
|
}))
|
|
);
|
|
}
|
|
};
|
|
|
|
// src/utils/file.ts
|
|
var import_obsidian28 = require("obsidian");
|
|
var defaultNoteFolder = (plugin, activeFile2) => {
|
|
var _a2;
|
|
return (_a2 = plugin.settings.newFileLocation == "folder" ? getFolderFromPath(app, plugin.settings.newFileFolderPath) : plugin.settings.newFileLocation == "current" && activeFile2 ? getFolderFromPath(app, activeFile2) : plugin.app.vault.getRoot()) != null ? _a2 : plugin.app.vault.getRoot();
|
|
};
|
|
var defaultConfigFile = async (app2) => {
|
|
return await app2.vault.adapter.read(
|
|
(0, import_obsidian28.normalizePath)(app2.vault.configDir + "/app.json")
|
|
);
|
|
};
|
|
var fileExtensionForFile = (path) => path.split(".").pop();
|
|
var appendFilesMetaData = (propType, filesString) => {
|
|
const files = splitString(filesString).map((f4) => getAbstractFileAtPath(app, f4)).filter((f4) => f4);
|
|
return files.map((f4) => appendFileMetaData3(propType, f4)).join(",");
|
|
};
|
|
var appendFileMetaData3 = (propType, file) => {
|
|
let value = "";
|
|
if (file) {
|
|
if (propType == "folder") {
|
|
value = file.parent.path;
|
|
}
|
|
if (file instanceof import_obsidian28.TFile) {
|
|
if (propType == "ctime") {
|
|
value = file.stat.ctime.toString();
|
|
} else if (propType == "mtime") {
|
|
value = file.stat.mtime.toString();
|
|
} else if (propType == "extension") {
|
|
value = file.extension;
|
|
} else if (propType == "size") {
|
|
value = file.stat.size.toString();
|
|
}
|
|
} else if (propType == "extension") {
|
|
value = i18n_default.menu.folder;
|
|
}
|
|
}
|
|
return value;
|
|
};
|
|
var viewTypeByString = (file) => {
|
|
if (file.charAt(0) == "#") {
|
|
return "tag";
|
|
}
|
|
if (file.charAt(file.length - 1) == "/") {
|
|
return "folder";
|
|
}
|
|
const portalFile = app.vault.getAbstractFileByPath(file);
|
|
if (portalFile instanceof import_obsidian28.TFolder) {
|
|
return "folder";
|
|
}
|
|
if (portalFile instanceof import_obsidian28.TFile) {
|
|
return "file";
|
|
}
|
|
return null;
|
|
};
|
|
function getAllAbstractFilesInVault(plugin, app2) {
|
|
let files = [];
|
|
let rootFolder = app2.vault.getRoot();
|
|
function recursiveFx(folder) {
|
|
for (let child of folderChildren(plugin, folder)) {
|
|
if (child instanceof import_obsidian28.TFolder) {
|
|
let childFolder = child;
|
|
if (childFolder.children)
|
|
recursiveFx(childFolder);
|
|
}
|
|
files.push(child);
|
|
}
|
|
}
|
|
recursiveFx(rootFolder);
|
|
return files;
|
|
}
|
|
var removeTrailingSlashFromFolder = (path) => path.slice(-1) == "/" ? path.substring(0, path.length - 1) : path;
|
|
var getFolderFromPath = (app2, path) => {
|
|
if (!path)
|
|
return null;
|
|
const afile = getAbstractFileAtPath(app2, removeTrailingSlashFromFolder(path));
|
|
if (!afile)
|
|
return null;
|
|
return afile instanceof import_obsidian28.TFolder ? afile : afile.parent;
|
|
};
|
|
var getFolderPathFromString = (file) => {
|
|
var _a2;
|
|
return (_a2 = getFolderFromPath(app, file)) == null ? void 0 : _a2.path;
|
|
};
|
|
var deleteFiles = (plugin, files) => {
|
|
files.forEach((f4) => {
|
|
const file = getAbstractFileAtPath(app, f4);
|
|
deleteFile(plugin, file);
|
|
});
|
|
};
|
|
var deleteFile = (plugin, file) => {
|
|
let deleteOption = plugin.settings.deleteFileOption;
|
|
if (deleteOption === "permanent") {
|
|
plugin.app.vault.delete(file, true);
|
|
} else if (deleteOption === "system-trash") {
|
|
plugin.app.vault.trash(file, true);
|
|
} else if (deleteOption === "trash") {
|
|
plugin.app.vault.trash(file, false);
|
|
}
|
|
};
|
|
var openFile = async (file, plugin, newLeaf) => {
|
|
openAFile(getAbstractFileAtPath(plugin.app, file.path), plugin, newLeaf);
|
|
};
|
|
var openAFile = async (file, plugin, newLeaf) => {
|
|
if (file instanceof import_obsidian28.TFolder) {
|
|
openTFolder(file, plugin, newLeaf);
|
|
} else if (file instanceof import_obsidian28.TFile) {
|
|
openTFile(file, plugin, newLeaf);
|
|
}
|
|
let evt = new CustomEvent(eventTypes.activeFileChange, {
|
|
detail: { filePath: file.path }
|
|
});
|
|
window.dispatchEvent(evt);
|
|
};
|
|
var openTFile = async (file, plugin, newLeaf) => {
|
|
let leaf = app.workspace.getLeaf(newLeaf);
|
|
app.workspace.setActiveLeaf(leaf, { focus: true });
|
|
await leaf.openFile(file, { eState: { focus: true } });
|
|
};
|
|
var openTFolder = async (file, plugin, newLeaf) => {
|
|
let leaf = app.workspace.getLeaf(newLeaf);
|
|
const viewType = CONTEXT_VIEW_TYPE;
|
|
app.workspace.setActiveLeaf(leaf, { focus: true });
|
|
await leaf.setViewState({
|
|
type: viewType,
|
|
state: { type: "folder", folder: file.path }
|
|
});
|
|
await app.workspace.requestSaveLayout();
|
|
if (platformIsMobile()) {
|
|
app.workspace.leftSplit.collapse();
|
|
}
|
|
};
|
|
var openTag = async (tag, plugin, newLeaf) => {
|
|
let leaf = app.workspace.getLeaf(newLeaf);
|
|
const viewType = CONTEXT_VIEW_TYPE;
|
|
app.workspace.setActiveLeaf(leaf, { focus: true });
|
|
await leaf.setViewState({ type: viewType, state: { type: "tag", tag } });
|
|
await app.workspace.requestSaveLayout();
|
|
if (platformIsMobile()) {
|
|
app.workspace.leftSplit.collapse();
|
|
}
|
|
};
|
|
var getAbstractFileAtPath = (app2, path) => {
|
|
return app2.vault.getAbstractFileByPath(path);
|
|
};
|
|
var openFileInNewPane = (plugin, file) => {
|
|
openFile(file, plugin, true);
|
|
};
|
|
var createNewMarkdownFile = async (plugin, folder, newFileName, content) => {
|
|
const newFile = await app.fileManager.createNewMarkdownFile(
|
|
folder,
|
|
newFileName
|
|
);
|
|
if (content && content !== "")
|
|
await app.vault.modify(newFile, content);
|
|
await openFile(newFile, plugin, false);
|
|
const titleEl = app.workspace.activeLeaf.view.containerEl.querySelector(
|
|
".inline-title"
|
|
);
|
|
if (titleEl) {
|
|
titleEl.focus();
|
|
selectElementContents(titleEl);
|
|
}
|
|
let evt = new CustomEvent(eventTypes.activeFileChange, {
|
|
detail: { filePath: newFile.path }
|
|
});
|
|
window.dispatchEvent(evt);
|
|
return newFile;
|
|
};
|
|
var platformIsMobile = () => {
|
|
return import_obsidian28.Platform.isMobile;
|
|
};
|
|
var newFileInFolder = async (plugin, data) => {
|
|
await createNewMarkdownFile(
|
|
plugin,
|
|
data.parent.children.find((f4) => f4.name == data.name),
|
|
"",
|
|
""
|
|
);
|
|
};
|
|
|
|
// src/utils/tree.ts
|
|
var uniq = (a5) => [...new Set(a5)];
|
|
var uniqCaseInsensitive = (a5) => [
|
|
...new Map(a5.map((s5) => [s5.toLowerCase(), s5])).values()
|
|
];
|
|
var uniqueNameFromString = (name, cols) => {
|
|
let newName = name;
|
|
if (cols.includes(newName)) {
|
|
let append = 1;
|
|
while (cols.includes(newName)) {
|
|
newName = name + append.toString();
|
|
append += 1;
|
|
}
|
|
}
|
|
return newName;
|
|
};
|
|
var onlyUniqueProp = (prop) => (value, index, self2) => {
|
|
return self2.findIndex((v3) => value[prop] == v3[prop]) === index;
|
|
};
|
|
var fileNameToString = (filename) => filename.substring(0, filename.lastIndexOf(".")) || filename;
|
|
var removeLeadingSlash = (path) => path.charAt(0) == "/" ? path.substring(1) : path;
|
|
var filePathToString = (filename) => removeLeadingSlash(
|
|
filename.substring(filename.lastIndexOf("/"), filename.lastIndexOf("."))
|
|
) || filename;
|
|
var folderPathToString = (filename) => removeLeadingSlash(filename.substring(filename.lastIndexOf("/"))) || filename;
|
|
var safelyParseJSON = (json) => {
|
|
var parsed;
|
|
try {
|
|
parsed = JSON.parse(json);
|
|
} catch (e4) {
|
|
}
|
|
return parsed;
|
|
};
|
|
var nodeIsAncestorOfTarget = (node, target) => {
|
|
var _a2, _b2, _c2;
|
|
if (((_a2 = node.item) == null ? void 0 : _a2.folder) == "false")
|
|
return false;
|
|
return (_c2 = target.item) == null ? void 0 : _c2.path.contains(((_b2 = node.item) == null ? void 0 : _b2.path) + "/");
|
|
};
|
|
var excludeVaultItemPredicate = (plugin) => (f4, index, folder) => !(f4.folder != "true" && plugin.settings.hiddenExtensions.find(
|
|
(e4) => fileExtensionForFile(f4.path) == e4
|
|
)) && !plugin.settings.hiddenFiles.find((e4) => e4 == f4.path) && (!plugin.settings.enableFolderNote || !plugin.settings.folderNoteInsideFolder && !folder.some((g4) => g4.path + ".md" == f4.path) || plugin.settings.folderNoteInsideFolder && !(f4.parent + "/" + folderPathToString(f4.parent) + ".md" == f4.path));
|
|
var excludeFilePredicate = (plugin) => (f4, index, folder) => !(f4 instanceof import_obsidian29.TFile && plugin.settings.hiddenExtensions.find((e4) => f4.extension == e4)) && !plugin.settings.hiddenFiles.find((e4) => e4 == f4.path) && (!plugin.settings.enableFolderNote || !plugin.settings.folderNoteInsideFolder && !folder.some((g4) => g4.path + ".md" == f4.path) || plugin.settings.folderNoteInsideFolder && !(f4.parent.path + "/" + f4.parent.name + ".md" == f4.path));
|
|
var folderChildren = (plugin, f4, exclusionList) => {
|
|
var _a2, _b2;
|
|
return (_b2 = (_a2 = f4 == null ? void 0 : f4.children) == null ? void 0 : _a2.filter(excludeFilePredicate(plugin))) != null ? _b2 : [];
|
|
};
|
|
var compareByField = (field, dir) => (_a2, _b2) => {
|
|
const a5 = dir ? _a2 : _b2;
|
|
const b4 = dir ? _b2 : _a2;
|
|
if (a5[field] < b4[field]) {
|
|
return -1;
|
|
}
|
|
if (a5[field] > b4[field]) {
|
|
return 1;
|
|
}
|
|
return 0;
|
|
};
|
|
var internalPluginLoaded = (pluginName, app2) => {
|
|
var _a2;
|
|
return (_a2 = app2.internalPlugins.plugins[pluginName]) == null ? void 0 : _a2._loaded;
|
|
};
|
|
function selectElementContents(el) {
|
|
var range = document.createRange();
|
|
range.selectNodeContents(el);
|
|
var sel = window.getSelection();
|
|
sel.removeAllRanges();
|
|
sel.addRange(range);
|
|
}
|
|
|
|
// src/cm-extensions/flowEditor/flowEditor.tsx
|
|
var toggleFlowEditor = import_state5.Annotation.define();
|
|
var cacheFlowEditorHeight = import_state5.Annotation.define();
|
|
var preloadFlowEditor = import_state5.EditorState.transactionFilter.of(
|
|
(tr) => {
|
|
let newTrans = [];
|
|
const value = tr.state.field(flowEditorInfo, false);
|
|
if (value && !tr.annotation(toggleFlowEditor)) {
|
|
newTrans.push(
|
|
...value.filter((f4) => f4.expandedState == 1).map((f4) => {
|
|
if (tr.state.field(flowTypeStateField) == "doc") {
|
|
return {
|
|
annotations: toggleFlowEditor.of([f4.id, 2])
|
|
};
|
|
} else {
|
|
return {
|
|
annotations: toggleFlowEditor.of([f4.id, 0])
|
|
};
|
|
}
|
|
})
|
|
);
|
|
}
|
|
return [tr, ...newTrans];
|
|
}
|
|
);
|
|
var internalLinkToggle = import_view4.ViewPlugin.fromClass(
|
|
class {
|
|
constructor(view) {
|
|
}
|
|
},
|
|
{
|
|
eventHandlers: {
|
|
mousedown: (e4, view) => {
|
|
if (!e4.shiftKey) {
|
|
return;
|
|
}
|
|
let pos = view.posAtDOM(e4.target);
|
|
let { from: lineFrom, to: lineTo, text: text2 } = view.state.doc.lineAt(pos);
|
|
for (let match2 of text2.matchAll(/(?!\!)\[\[([^\]]+)\]\]/g)) {
|
|
const stateField = view.state.field(flowEditorInfo, false);
|
|
const info = stateField.find(
|
|
(f4) => f4.to == lineFrom + match2.index + match2[1].length + 2 && pos >= f4.from && pos <= f4.to
|
|
);
|
|
if (info) {
|
|
e4.preventDefault();
|
|
view.dispatch({
|
|
annotations: toggleFlowEditor.of([info.id, 2])
|
|
});
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
);
|
|
var internalLinkHover = hoverTooltip((view, pos, side) => {
|
|
let { from: lineFrom, to: lineTo, text: text2 } = view.state.doc.lineAt(pos);
|
|
let hovObject = null;
|
|
iterateTreeInSelection({ from: lineFrom, to: lineTo }, view.state, {
|
|
enter: ({ name, from, to }) => {
|
|
if (name.contains("hmd-internal-link") && pos <= to && pos >= from) {
|
|
const stateField = view.state.field(flowEditorInfo, false);
|
|
const info = stateField.find((f4) => f4.to == to);
|
|
if (info) {
|
|
hovObject = {
|
|
pos,
|
|
end: to,
|
|
above: true,
|
|
create(view2) {
|
|
let dom = document.createElement("div");
|
|
dom.toggleClass("mk-flow-hover", true);
|
|
dom.toggleClass("menu", true);
|
|
const openHoverDiv = dom.createDiv();
|
|
openHoverDiv.setAttribute(
|
|
"aria-label",
|
|
info.expandedState == 0 ? i18n_default.buttons.openFlow : i18n_default.buttons.hideFlow
|
|
);
|
|
openHoverDiv.addEventListener("click", () => {
|
|
view2.dispatch({
|
|
annotations: toggleFlowEditor.of([info.id, 2])
|
|
});
|
|
});
|
|
const icon = openHoverDiv.createDiv();
|
|
icon.innerHTML = uiIconSet["mk-ui-flow-hover"];
|
|
openHoverDiv.insertAdjacentText(
|
|
"beforeend",
|
|
info.expandedState == 0 ? i18n_default.buttons.openFlow : i18n_default.buttons.hideFlow
|
|
);
|
|
return { dom };
|
|
}
|
|
};
|
|
return false;
|
|
}
|
|
}
|
|
}
|
|
});
|
|
return hovObject;
|
|
});
|
|
var flowEditorInfo = import_state5.StateField.define({
|
|
create() {
|
|
return [];
|
|
},
|
|
update(value, tr) {
|
|
var _a2, _b2, _c2, _d2, _e2, _f, _g, _h, _i, _j, _k, _l;
|
|
let newValues = [];
|
|
const previous = value;
|
|
let usedContainers = [];
|
|
let str = tr.newDoc.sliceString(0);
|
|
const reverseExpandedState = (state) => {
|
|
const news = state != 2 ? 2 : 0;
|
|
return news;
|
|
};
|
|
for (let match2 of str.matchAll(/(?:!\[!\[|!!\[\[)([^\]]+)\]\]/g)) {
|
|
const link = match2[1];
|
|
const existingLinks = previous.filter((f4) => f4.link == link);
|
|
const offset = usedContainers.filter((f4) => f4 == link).length;
|
|
const existingInfo = existingLinks[offset];
|
|
const id2 = existingInfo ? existingInfo.id : genId();
|
|
usedContainers.push(link);
|
|
const info = {
|
|
id: id2,
|
|
link: match2[1],
|
|
startOfLineFix: false,
|
|
from: match2.index + 4,
|
|
to: match2.index + 4 + match2[1].length,
|
|
embed: 1,
|
|
height: existingInfo ? ((_a2 = tr.annotation(cacheFlowEditorHeight)) == null ? void 0 : _a2[0]) == id2 && ((_b2 = tr.annotation(cacheFlowEditorHeight)) == null ? void 0 : _b2[1]) != 0 ? (_c2 = tr.annotation(cacheFlowEditorHeight)) == null ? void 0 : _c2[1] : existingInfo.height : -1,
|
|
expandedState: existingInfo ? ((_d2 = tr.annotation(toggleFlowEditor)) == null ? void 0 : _d2[0]) == id2 ? reverseExpandedState(existingInfo.expandedState) : existingInfo.expandedState : 1
|
|
};
|
|
newValues.push(info);
|
|
}
|
|
for (let match2 of str.matchAll(/\[\[([^\]]+)\]\]/g)) {
|
|
if (str.charAt(match2.index - 1) != "!") {
|
|
const link = match2[1];
|
|
const existingLinks = previous.filter((f4) => f4.link == link);
|
|
const offset = usedContainers.filter((f4) => f4 == link).length;
|
|
const existingInfo = existingLinks[offset];
|
|
const id2 = existingInfo ? existingInfo.id : genId();
|
|
usedContainers.push(link);
|
|
const info = {
|
|
id: id2,
|
|
link: match2[1],
|
|
startOfLineFix: false,
|
|
from: match2.index + 2,
|
|
to: match2.index + 2 + match2[1].length,
|
|
embed: 0,
|
|
height: existingInfo ? ((_e2 = tr.annotation(cacheFlowEditorHeight)) == null ? void 0 : _e2[0]) == id2 && ((_f = tr.annotation(cacheFlowEditorHeight)) == null ? void 0 : _f[1]) != 0 ? (_g = tr.annotation(cacheFlowEditorHeight)) == null ? void 0 : _g[1] : existingInfo.height : -1,
|
|
expandedState: existingInfo ? ((_h = tr.annotation(toggleFlowEditor)) == null ? void 0 : _h[0]) == id2 ? reverseExpandedState(existingInfo.expandedState) : existingInfo.expandedState : 0
|
|
};
|
|
newValues.push(info);
|
|
} else if (str.charAt(match2.index - 2) != "!") {
|
|
const link = match2[1];
|
|
const existingLinks = previous.filter((f4) => f4.link == link);
|
|
const offset = usedContainers.filter((f4) => f4 == link).length;
|
|
const existingInfo = existingLinks[offset];
|
|
const id2 = existingInfo ? existingInfo.id : genId();
|
|
usedContainers.push(link);
|
|
const info = {
|
|
id: id2,
|
|
link: match2[1],
|
|
startOfLineFix: false,
|
|
from: match2.index + 3,
|
|
to: match2.index + 3 + match2[1].length,
|
|
embed: 2,
|
|
height: existingInfo ? ((_i = tr.annotation(cacheFlowEditorHeight)) == null ? void 0 : _i[0]) == id2 && ((_j = tr.annotation(cacheFlowEditorHeight)) == null ? void 0 : _j[1]) != 0 ? (_k = tr.annotation(cacheFlowEditorHeight)) == null ? void 0 : _k[1] : existingInfo.height : -1,
|
|
expandedState: existingInfo ? ((_l = tr.annotation(toggleFlowEditor)) == null ? void 0 : _l[0]) == id2 ? reverseExpandedState(existingInfo.expandedState) : existingInfo.expandedState : 1
|
|
};
|
|
newValues.push(info);
|
|
}
|
|
}
|
|
newValues.sort(compareByField("from", true));
|
|
return newValues;
|
|
}
|
|
});
|
|
var flowEditorRangeset = (state) => {
|
|
let builder = new import_state5.RangeSetBuilder();
|
|
const infoFields = state.field(flowEditorInfo);
|
|
for (let info of infoFields) {
|
|
const { from, to, embed: embedType, expandedState } = info;
|
|
const lineFix = from - 3 == state.doc.lineAt(from).from && to + 2 == state.doc.lineAt(from).to;
|
|
if (expandedState == 2) {
|
|
if (embedType == 1) {
|
|
if (!(state.selection.main.from == from - 4 && state.selection.main.to == to + 2 || state.selection.main.from >= from - 3 && state.selection.main.to <= to + 1)) {
|
|
builder.add(from - 4, from - 3, flowEditorSelector(info));
|
|
if (lineFix) {
|
|
builder.add(from - 3, to + 2, flowEditorWidgetDecoration(info));
|
|
} else {
|
|
builder.add(from - 3, to + 2, flowEditorDecoration(info));
|
|
}
|
|
}
|
|
} else if (embedType == 0) {
|
|
builder.add(to + 2, to + 2, flowEditorDecoration(info));
|
|
}
|
|
}
|
|
}
|
|
const dec = builder.finish();
|
|
return dec;
|
|
};
|
|
var flowEditorField = import_state5.StateField.define({
|
|
create(state) {
|
|
return flowEditorRangeset(state);
|
|
},
|
|
update(value, tr) {
|
|
return flowEditorRangeset(tr.state);
|
|
},
|
|
provide: (f4) => import_view4.EditorView.decorations.from(f4)
|
|
});
|
|
var FlowEditorWidget = class extends import_view4.WidgetType {
|
|
constructor(info) {
|
|
super();
|
|
this.info = info;
|
|
}
|
|
eq(other) {
|
|
return other.info.id === this.info.id;
|
|
}
|
|
toDOM(view) {
|
|
const div = document.createElement("div");
|
|
div.toggleClass("mk-floweditor-container", true);
|
|
div.toggleClass("mk-floweditor-fix", this.info.startOfLineFix);
|
|
div.setAttribute("id", "mk-flow-" + this.info.id);
|
|
const placeholder2 = div.createDiv("mk-floweditor-placeholder");
|
|
placeholder2.style.setProperty("height", this.info.height + "px");
|
|
loadFlowEditorByDOM(div, view, this.info.id);
|
|
return div;
|
|
}
|
|
get estimatedHeight() {
|
|
return this.info.height;
|
|
}
|
|
};
|
|
var FlowEditorSelector = class extends import_view4.WidgetType {
|
|
constructor(info) {
|
|
super();
|
|
this.info = info;
|
|
this.flowInfo = info;
|
|
}
|
|
eq(other) {
|
|
return false;
|
|
}
|
|
toDOM(view) {
|
|
const div = document.createElement("div");
|
|
div.toggleClass("mk-floweditor-selector", true);
|
|
const reactEl = createRoot(div);
|
|
const type = this.info.link.contains("/#^") ? "table" : "file";
|
|
reactEl.render(
|
|
/* @__PURE__ */ bn.createElement(FlowEditorHover, {
|
|
toggle: true,
|
|
type,
|
|
toggleState: true,
|
|
cutTable: () => {
|
|
navigator.clipboard.writeText(`![![${this.info.link}]]`);
|
|
view.dispatch({
|
|
changes: { from: this.info.from - 4, to: this.info.to + 2 }
|
|
});
|
|
},
|
|
deleteTable: () => {
|
|
view.dispatch({
|
|
changes: { from: this.info.from - 4, to: this.info.to + 2 }
|
|
});
|
|
},
|
|
toggleFlow: () => {
|
|
view.dispatch({
|
|
changes: { from: this.info.from - 4, to: this.info.from - 3 }
|
|
});
|
|
},
|
|
openLink: () => {
|
|
openFileFlowEditor(this.flowInfo.link, "/");
|
|
}
|
|
})
|
|
);
|
|
return div;
|
|
}
|
|
};
|
|
var flowEditorSelector = (info) => import_view4.Decoration.replace({
|
|
widget: new FlowEditorSelector(info),
|
|
inclusive: true,
|
|
block: false
|
|
});
|
|
var flowEditorDecoration = (info) => import_view4.Decoration.replace({
|
|
widget: new FlowEditorWidget(info),
|
|
inclusive: true,
|
|
block: false
|
|
});
|
|
var flowEditorWidgetDecoration = (info) => import_view4.Decoration.widget({
|
|
widget: new FlowEditorWidget(info),
|
|
block: true
|
|
});
|
|
|
|
// src/cm-extensions/flowEditor/atomic.ts
|
|
var arrowKeyAnnotation = import_state6.Annotation.define();
|
|
var atomicSelect = import_state6.EditorState.transactionFilter.of(
|
|
(tr) => {
|
|
if (tr.isUserEvent("delete") || tr.isUserEvent("input")) {
|
|
return tr;
|
|
}
|
|
const flowID = tr.startState.field(flowIDStateField, false);
|
|
if (tr.annotation(arrowKeyAnnotation) && flowID) {
|
|
const oldSel = tr.startState.selection.main;
|
|
const lineRange = tr.state.field(selectiveLinesFacet, false);
|
|
const posRange = lineRange && lineRange[0] != void 0 ? lineRangeToPosRange(tr.startState, lineRange) : { from: 0, to: tr.startState.doc.length };
|
|
if (oldSel.from <= posRange.from && tr.annotation(arrowKeyAnnotation) == 3) {
|
|
focusFlowEditorParent(flowID, true);
|
|
}
|
|
if (oldSel.to >= posRange.to && tr.annotation(arrowKeyAnnotation) == 4) {
|
|
focusFlowEditorParent(flowID, false);
|
|
}
|
|
return tr;
|
|
}
|
|
const selection = tr.newSelection.main;
|
|
if (selection.from == 0 && selection.to == 0 || selection.from != selection.to)
|
|
return tr;
|
|
const flowEditors = tr.state.field(flowEditorInfo, false);
|
|
if (flowEditors) {
|
|
for (let info of flowEditors) {
|
|
if (info.embed == 1) {
|
|
if (info.from - 3 <= selection.from && info.to + 2 >= selection.to && info.expandedState == 2) {
|
|
const top = tr.annotation(arrowKeyAnnotation) == 1 || tr.startState.selection.main.from > selection.from ? false : true;
|
|
focusFlowEditor(info.id, top);
|
|
return {
|
|
selection: import_state6.EditorSelection.single(info.from - 4)
|
|
};
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return tr;
|
|
}
|
|
);
|
|
|
|
// src/cm-extensions/inlineStylerView/marks.ts
|
|
var import_state7 = require("@codemirror/state");
|
|
|
|
// src/cm-extensions/markSans/obsidianSyntax.ts
|
|
var oMarks = [
|
|
{
|
|
mark: "em",
|
|
formatting: "formatting-em",
|
|
altFormatting: "em_formatting_formatting-strong",
|
|
formatChar: "*"
|
|
},
|
|
{
|
|
mark: "strong",
|
|
formatting: "formatting-strong",
|
|
formatChar: "**"
|
|
},
|
|
{
|
|
mark: "strikethrough",
|
|
formatting: "formatting-strikethrough",
|
|
formatChar: "~~"
|
|
},
|
|
{
|
|
mark: "inline-code",
|
|
formatting: "formatting-code",
|
|
formatChar: "`"
|
|
}
|
|
];
|
|
|
|
// src/cm-extensions/inlineStylerView/marks.ts
|
|
var toggleMark = import_state7.Annotation.define();
|
|
var trimSpace = (pos, moveDirLeft, state) => {
|
|
if (moveDirLeft && state.sliceDoc(pos, pos + 1) == " ")
|
|
return pos + 1;
|
|
if (!moveDirLeft && state.sliceDoc(pos - 1, pos) == " ")
|
|
return pos - 1;
|
|
return pos;
|
|
};
|
|
var newPosAfterFormatting = (pos, moveDirLeft, state) => {
|
|
const line = state.doc.lineAt(pos);
|
|
const start = moveDirLeft ? line.from : pos;
|
|
const end = moveDirLeft ? pos : line.to;
|
|
let newPos = start;
|
|
let lastFormatPos = start;
|
|
let exitFormatRange = false;
|
|
iterateTreeInSelection({ from: start, to: end }, state, {
|
|
enter: (node) => {
|
|
if (exitFormatRange)
|
|
return false;
|
|
if (node.name.contains("formatting")) {
|
|
if (!moveDirLeft && node.from > start) {
|
|
return false;
|
|
}
|
|
if (moveDirLeft) {
|
|
newPos = node.from;
|
|
lastFormatPos = node.to;
|
|
} else {
|
|
newPos = node.to;
|
|
}
|
|
}
|
|
}
|
|
});
|
|
if (moveDirLeft && lastFormatPos < pos) {
|
|
newPos = pos;
|
|
}
|
|
return newPos;
|
|
};
|
|
var expandRange = (selection, state) => {
|
|
const from = trimSpace(
|
|
newPosAfterFormatting(selection.from, true, state),
|
|
true,
|
|
state
|
|
);
|
|
const to = trimSpace(
|
|
newPosAfterFormatting(selection.to, false, state),
|
|
false,
|
|
state
|
|
);
|
|
return { from, to };
|
|
};
|
|
var addMarkAtPos = (pos, mark) => ({
|
|
changes: { from: pos, to: pos, insert: mark.formatChar }
|
|
});
|
|
var rangeIsMark = (state, mark, selection) => posIsMark(selection.from, state, mark.mark) && posIsMark(selection.to, state, mark.mark);
|
|
var posIsMark = (pos, state, markString) => {
|
|
let isMark = false;
|
|
iterateTreeAtPos(pos, state, {
|
|
enter: ({ name, from, to }) => {
|
|
if (nodeNameContainsMark(name, markString))
|
|
isMark = true;
|
|
}
|
|
});
|
|
return isMark;
|
|
};
|
|
var nodeNameContainsMark = (name, markString) => {
|
|
return name.contains(markString);
|
|
};
|
|
var edgeIsMark = (pos, state, mark) => posIsMark(pos, state, mark.mark);
|
|
var edgeIsMarkFormat = (pos, state, mark) => posIsMark(pos, state, mark.formatting) ? true : mark.altFormatting ? posIsMark(pos, state, mark.altFormatting) : false;
|
|
var transactionChangesForMark = (range, mark, state) => {
|
|
let newTrans = [];
|
|
if (rangeIsMark(state, mark, range)) {
|
|
if (edgeIsMarkFormat(range.from, state, mark) && !edgeIsMarkFormat(range.to, state, mark)) {
|
|
newTrans.push(addMarkAtPos(range.to, mark));
|
|
}
|
|
if (edgeIsMarkFormat(range.to, state, mark) && !edgeIsMarkFormat(range.from, state, mark)) {
|
|
newTrans.push(addMarkAtPos(range.from, mark));
|
|
}
|
|
} else if (edgeIsMark(range.from, state, mark)) {
|
|
if (edgeIsMarkFormat(range.from, state, mark) && !edgeIsMark(range.from - 1, state, mark)) {
|
|
newTrans.push(addMarkAtPos(range.from, mark));
|
|
}
|
|
newTrans.push(addMarkAtPos(range.to, mark));
|
|
} else if (edgeIsMark(range.to, state, mark)) {
|
|
if (edgeIsMarkFormat(range.to, state, mark) && !edgeIsMark(range.to + 1, state, mark)) {
|
|
newTrans.push(addMarkAtPos(range.to, mark));
|
|
}
|
|
newTrans.push(addMarkAtPos(range.from, mark));
|
|
} else {
|
|
newTrans.push(addMarkAtPos(range.to, mark));
|
|
newTrans.push(addMarkAtPos(range.from, mark));
|
|
}
|
|
return newTrans;
|
|
};
|
|
var removeAllInternalMarks = (sel, state, mark) => {
|
|
let returnTrans = [];
|
|
iterateTreeInSelection({ from: sel.from, to: sel.to }, state, {
|
|
enter: ({ name, from, to }) => {
|
|
if (nodeNameContainsMark(name, mark.formatting) || (mark.altFormatting ? nodeNameContainsMark(name, mark.altFormatting) : false))
|
|
returnTrans.push({
|
|
from,
|
|
to: from + mark.formatChar.length
|
|
});
|
|
}
|
|
});
|
|
return {
|
|
changes: returnTrans
|
|
};
|
|
};
|
|
var toggleMarkExtension = import_state7.EditorState.transactionFilter.of(
|
|
(tr) => {
|
|
if (!tr.annotation(toggleMark))
|
|
return tr;
|
|
const markToggle = tr.annotation(toggleMark);
|
|
const mark = oMarks.find((f4) => f4.mark == markToggle);
|
|
if (!mark) {
|
|
return tr;
|
|
}
|
|
const selection = tr.startState.selection.main;
|
|
let newTrans = [];
|
|
if (selection.head == selection.anchor) {
|
|
if (tr.startState.sliceDoc(
|
|
selection.head - mark.formatChar.length,
|
|
selection.head
|
|
) == mark.formatChar && tr.startState.sliceDoc(
|
|
selection.head,
|
|
selection.head + mark.formatChar.length
|
|
) == mark.formatChar) {
|
|
newTrans.push({
|
|
changes: {
|
|
from: selection.head - mark.formatChar.length,
|
|
to: selection.head + mark.formatChar.length
|
|
}
|
|
});
|
|
} else {
|
|
newTrans.push({
|
|
changes: {
|
|
from: selection.head,
|
|
insert: mark.formatChar + mark.formatChar
|
|
},
|
|
selection: {
|
|
anchor: selection.head + mark.formatChar.length,
|
|
head: selection.head + mark.formatChar.length
|
|
}
|
|
});
|
|
}
|
|
return [tr, ...newTrans];
|
|
}
|
|
const range = expandRange(selection, tr.startState);
|
|
newTrans.push(removeAllInternalMarks(range, tr.startState, mark));
|
|
let newFrom = range.from;
|
|
let newTo = range.to;
|
|
newTrans.push(...transactionChangesForMark(range, mark, tr.startState));
|
|
return [tr, ...newTrans, { selection: { anchor: newFrom, head: newTo } }];
|
|
}
|
|
);
|
|
|
|
// src/cm-extensions/inlineStylerView/inlineStyler.tsx
|
|
var import_state8 = require("@codemirror/state");
|
|
|
|
// src/cm-extensions/inlineStylerView/InlineMenu.tsx
|
|
var import_classnames4 = __toESM(require_classnames());
|
|
|
|
// src/cm-extensions/inlineStylerView/Mark.tsx
|
|
var Mark = (props2) => {
|
|
const { i: i4, style, active, toggleMarkAction } = props2;
|
|
return /* @__PURE__ */ bn.createElement("div", {
|
|
key: i4,
|
|
"aria-label": !platformIsMobile() ? i18n_default.styles[style.label] : void 0,
|
|
className: `mk-mark ${style.mark && active ? "mk-mark-active" : ""}`,
|
|
dangerouslySetInnerHTML: { __html: markIconSet[style.icon] },
|
|
onMouseDown: (e4) => toggleMarkAction(e4, style)
|
|
});
|
|
};
|
|
|
|
// src/cm-extensions/inlineStylerView/styles/default.ts
|
|
var default_default = [
|
|
{
|
|
label: "bold",
|
|
value: `****`,
|
|
insertOffset: 2,
|
|
icon: "mk-mark-strong",
|
|
mark: "strong"
|
|
},
|
|
{
|
|
label: "italics",
|
|
value: "**",
|
|
insertOffset: 1,
|
|
icon: "mk-mark-em",
|
|
mark: "em"
|
|
},
|
|
{
|
|
label: "strikethrough",
|
|
value: "~~~~",
|
|
insertOffset: 2,
|
|
icon: "mk-mark-strikethrough",
|
|
mark: "strikethrough"
|
|
},
|
|
{
|
|
label: "code",
|
|
value: "``",
|
|
insertOffset: 1,
|
|
icon: "mk-mark-code",
|
|
mark: "inline-code"
|
|
},
|
|
{
|
|
label: "link",
|
|
value: "[]()",
|
|
insertOffset: 1,
|
|
cursorOffset: 2,
|
|
icon: "mk-mark-link"
|
|
},
|
|
{
|
|
label: "blocklink",
|
|
value: "[[]]",
|
|
insertOffset: 2,
|
|
icon: "mk-mark-blocklink"
|
|
}
|
|
];
|
|
|
|
// src/cm-extensions/inlineStylerView/styles/index.ts
|
|
function resolveStyles() {
|
|
return default_default;
|
|
}
|
|
|
|
// src/cm-extensions/inlineStylerView/InlineMenu.tsx
|
|
var loadStylerIntoContainer = (el, plugin) => {
|
|
const root = createRoot(el);
|
|
root.render(
|
|
/* @__PURE__ */ bn.createElement(InlineMenuComponent, {
|
|
mobile: true,
|
|
activeMarks: [],
|
|
plugin
|
|
})
|
|
);
|
|
};
|
|
var InlineMenuComponent = (props2) => {
|
|
const [mode, setMode] = p2(props2.mobile ? 0 : 1);
|
|
const [colorMode, setColorMode] = p2(null);
|
|
const makeMenu = (e4) => {
|
|
var _a2;
|
|
e4.preventDefault();
|
|
const cm = (_a2 = props2.cm) != null ? _a2 : getActiveCM();
|
|
if (!cm)
|
|
return;
|
|
const end = cm.state.selection.main.to;
|
|
const insertChars = cm.state.sliceDoc(end - 1, end) == cm.state.lineBreak ? props2.plugin.settings.menuTriggerChar : cm.state.lineBreak + props2.plugin.settings.menuTriggerChar;
|
|
cm.dispatch({
|
|
changes: {
|
|
from: end,
|
|
to: end,
|
|
insert: insertChars
|
|
},
|
|
selection: {
|
|
head: end + insertChars.length,
|
|
anchor: end + insertChars.length
|
|
}
|
|
});
|
|
};
|
|
const toggleMarkAction = (e4, s5) => {
|
|
var _a2;
|
|
e4.preventDefault();
|
|
const cm = (_a2 = props2.cm) != null ? _a2 : getActiveCM();
|
|
if (!cm)
|
|
return;
|
|
if (s5.mark) {
|
|
cm.dispatch({
|
|
annotations: toggleMark.of(s5.mark)
|
|
});
|
|
return;
|
|
}
|
|
const selection = cm.state.selection.main;
|
|
const selectedText = cm.state.sliceDoc(selection.from, selection.to);
|
|
cm.dispatch({
|
|
changes: {
|
|
from: selection.from,
|
|
to: selection.to,
|
|
insert: s5.value.substring(0, s5.insertOffset) + selectedText + s5.value.substring(s5.insertOffset)
|
|
},
|
|
selection: s5.cursorOffset ? {
|
|
anchor: selection.from + s5.value.substring(0, s5.insertOffset).length + selectedText.length + s5.cursorOffset,
|
|
head: selection.from + s5.value.substring(0, s5.insertOffset).length + selectedText.length + s5.cursorOffset
|
|
} : {
|
|
anchor: selection.from + s5.value.substring(0, s5.insertOffset).length,
|
|
head: selection.from + s5.value.substring(0, s5.insertOffset).length + selectedText.length
|
|
}
|
|
});
|
|
};
|
|
const makeMode = () => /* @__PURE__ */ bn.createElement(bn.Fragment, null, /* @__PURE__ */ bn.createElement("div", {
|
|
"aria-label": !platformIsMobile() ? i18n_default.commands.makeMenu : void 0,
|
|
onMouseDown: (e4) => {
|
|
makeMenu(e4);
|
|
},
|
|
className: "mk-mark",
|
|
dangerouslySetInnerHTML: { __html: markIconSet["mk-make-slash"] }
|
|
}), /* @__PURE__ */ bn.createElement("div", {
|
|
"aria-label": !platformIsMobile() ? i18n_default.commands.selectStyle : void 0,
|
|
onMouseDown: () => {
|
|
setMode(1);
|
|
},
|
|
className: "mk-mark",
|
|
dangerouslySetInnerHTML: { __html: markIconSet["mk-make-style"] }
|
|
}), /* @__PURE__ */ bn.createElement("div", {
|
|
"aria-label": !platformIsMobile() ? i18n_default.commands.image : void 0,
|
|
onMouseDown: () => {
|
|
const view = getActiveMarkdownView();
|
|
props2.plugin.app.commands.commands["editor:attach-file"].editorCallback(view.editor, view);
|
|
},
|
|
className: "mk-mark",
|
|
dangerouslySetInnerHTML: { __html: markIconSet["mk-make-attach"] }
|
|
}), /* @__PURE__ */ bn.createElement("div", {
|
|
"aria-label": !platformIsMobile() ? i18n_default.commands.toggleKeyboard : void 0,
|
|
onMouseDown: () => {
|
|
const view = getActiveMarkdownView();
|
|
props2.plugin.app.commands.commands["editor:toggle-keyboard"].editorCallback(view.editor, view);
|
|
},
|
|
className: "mk-mark",
|
|
dangerouslySetInnerHTML: { __html: markIconSet["mk-make-keyboard"] }
|
|
}));
|
|
const colorsMode = () => /* @__PURE__ */ bn.createElement(bn.Fragment, null, /* @__PURE__ */ bn.createElement("div", {
|
|
className: "mk-mark",
|
|
onMouseDown: () => {
|
|
setColorMode(null);
|
|
setMode(1);
|
|
},
|
|
dangerouslySetInnerHTML: { __html: uiIconSet["mk-ui-close"] }
|
|
}), colors.map((c4, i4) => /* @__PURE__ */ bn.createElement("div", {
|
|
key: i4,
|
|
onMouseDown: () => {
|
|
var _a2;
|
|
setMode(1);
|
|
setColorMode(null);
|
|
const cm = (_a2 = props2.cm) != null ? _a2 : getActiveCM();
|
|
if (!cm)
|
|
return;
|
|
const selection = cm.state.selection.main;
|
|
const selectedText = cm.state.sliceDoc(
|
|
selection.from,
|
|
selection.to
|
|
);
|
|
cm.dispatch({
|
|
changes: {
|
|
from: selection.from,
|
|
to: selection.to,
|
|
insert: colorMode.prefix + c4[1] + colorMode.suffix + selectedText + colorMode.closeTag
|
|
}
|
|
});
|
|
},
|
|
className: "mk-color",
|
|
style: { background: c4[1] }
|
|
})));
|
|
const marksMode = () => /* @__PURE__ */ bn.createElement(bn.Fragment, null, props2.mobile ? /* @__PURE__ */ bn.createElement("div", {
|
|
className: "mk-mark",
|
|
onMouseDown: () => {
|
|
setMode(0);
|
|
},
|
|
dangerouslySetInnerHTML: { __html: uiIconSet["mk-ui-close"] }
|
|
}) : /* @__PURE__ */ bn.createElement(bn.Fragment, null), resolveStyles().map((s5, i4) => {
|
|
return /* @__PURE__ */ bn.createElement(Mark, {
|
|
i: i4,
|
|
style: s5,
|
|
active: props2.activeMarks.find((f4) => f4 == s5.mark) ? true : false,
|
|
toggleMarkAction
|
|
});
|
|
}), props2.plugin.settings.inlineStylerColors ? /* @__PURE__ */ bn.createElement(bn.Fragment, null, /* @__PURE__ */ bn.createElement("div", {
|
|
className: "mk-divider"
|
|
}), /* @__PURE__ */ bn.createElement("div", {
|
|
"aria-label": !platformIsMobile() ? i18n_default.styles.textColor : void 0,
|
|
onMouseDown: () => {
|
|
setMode(2);
|
|
setColorMode({
|
|
prefix: `<span style='color:`,
|
|
suffix: `'>`,
|
|
closeTag: "</span>"
|
|
});
|
|
},
|
|
className: "mk-mark",
|
|
dangerouslySetInnerHTML: { __html: markIconSet["mk-mark-color"] }
|
|
}), /* @__PURE__ */ bn.createElement("div", {
|
|
"aria-label": !platformIsMobile() ? i18n_default.styles.highlight : void 0,
|
|
onMouseDown: () => {
|
|
setMode(2);
|
|
setColorMode({
|
|
prefix: `<mark style='background:`,
|
|
suffix: `'>`,
|
|
closeTag: "</mark>"
|
|
});
|
|
},
|
|
className: "mk-mark",
|
|
dangerouslySetInnerHTML: {
|
|
__html: markIconSet["mk-mark-highlight"]
|
|
}
|
|
})) : /* @__PURE__ */ bn.createElement(bn.Fragment, null));
|
|
return /* @__PURE__ */ bn.createElement("div", {
|
|
className: (0, import_classnames4.default)("mk-style-menu", props2.mobile ? "" : "menu"),
|
|
onMouseDown: (e4) => e4.preventDefault()
|
|
}, mode == 0 && props2.mobile ? makeMode() : mode == 2 ? colorsMode() : marksMode());
|
|
};
|
|
|
|
// src/cm-extensions/inlineStylerView/inlineStyler.tsx
|
|
var cursorTooltipField = (plugin) => import_state8.StateField.define({
|
|
create: getCursorTooltips(plugin),
|
|
update(tooltips2, tr) {
|
|
if (!tr.docChanged && !tr.selection)
|
|
return tooltips2;
|
|
return getCursorTooltips(plugin)(tr.state);
|
|
},
|
|
provide: (f4) => showTooltip.computeN([f4], (state) => state.field(f4))
|
|
});
|
|
var getCursorTooltips = (plugin) => (state) => {
|
|
return state.selection.ranges.filter((range) => !range.empty).map((range) => {
|
|
const expandedRange = expandRange(range, state);
|
|
let line = state.doc.lineAt(range.head);
|
|
let activeMarks = oMarks.map((f4) => rangeIsMark(state, f4, expandedRange) ? f4.mark : "").filter((f4) => f4 != "");
|
|
return {
|
|
pos: Math.min(range.head, range.anchor),
|
|
above: true,
|
|
strictSide: true,
|
|
arrow: false,
|
|
create: (view) => {
|
|
let dom = document.createElement("div");
|
|
dom.className = "cm-tooltip-cursor";
|
|
const reactElement = createRoot(dom);
|
|
reactElement.render(
|
|
/* @__PURE__ */ bn.createElement(bn.Fragment, null, /* @__PURE__ */ bn.createElement(InlineMenuComponent, {
|
|
plugin,
|
|
cm: view,
|
|
activeMarks,
|
|
mobile: false
|
|
}))
|
|
);
|
|
return { dom };
|
|
}
|
|
};
|
|
});
|
|
};
|
|
function cursorTooltip(plugin) {
|
|
return cursorTooltipField(plugin);
|
|
}
|
|
|
|
// src/cm-extensions/flowEditor/flowViewUpdates.ts
|
|
var import_view5 = require("@codemirror/view");
|
|
var flowViewUpdates = import_view5.EditorView.updateListener.of((v3) => {
|
|
if (v3.heightChanged) {
|
|
app.workspace.iterateRootLeaves((leaf) => {
|
|
var _a2, _b2;
|
|
const cm = (_a2 = leaf.view.editor) == null ? void 0 : _a2.cm;
|
|
if (cm && v3.view.dom == cm.dom && cm.state.field(flowTypeStateField, false)) {
|
|
if ((_b2 = leaf.containerEl.parentElement) == null ? void 0 : _b2.hasClass("workspace-tab-container")) {
|
|
if (cm.state.field(flowTypeStateField, false) != "doc") {
|
|
cm.dispatch({
|
|
annotations: portalTypeAnnotation.of("doc")
|
|
});
|
|
}
|
|
}
|
|
}
|
|
});
|
|
}
|
|
if (v3.heightChanged) {
|
|
const flowID = v3.state.field(flowIDStateField, false);
|
|
if (flowID) {
|
|
app.workspace.iterateLeaves((leaf) => {
|
|
var _a2;
|
|
const cm = (_a2 = leaf.view.editor) == null ? void 0 : _a2.cm;
|
|
if (cm) {
|
|
const stateField = cm.state.field(flowEditorInfo, false);
|
|
if (stateField) {
|
|
if (stateField.find((f4) => f4.id == flowID)) {
|
|
cm.dispatch({
|
|
annotations: cacheFlowEditorHeight.of([
|
|
flowID,
|
|
v3.view.contentHeight
|
|
])
|
|
});
|
|
}
|
|
}
|
|
}
|
|
}, app.workspace["rootSplit"]);
|
|
}
|
|
}
|
|
});
|
|
|
|
// src/cm-extensions/placeholder.ts
|
|
var import_view6 = require("@codemirror/view");
|
|
var import_state9 = require("@codemirror/state");
|
|
var placeholderLine = import_view6.Decoration.line({
|
|
attributes: { "data-ph": i18n_default.labels.placeholder },
|
|
class: "cm-placeholder"
|
|
});
|
|
var placeholder = import_state9.StateField.define({
|
|
create() {
|
|
return import_view6.Decoration.none;
|
|
},
|
|
update(value, tr) {
|
|
let builder = new import_state9.RangeSetBuilder();
|
|
const currentLine = tr.state.doc.lineAt(tr.state.selection.main.head);
|
|
if ((currentLine == null ? void 0 : currentLine.length) == 0)
|
|
builder.add(currentLine.from, currentLine.from, placeholderLine);
|
|
const dec = builder.finish();
|
|
return dec;
|
|
},
|
|
provide: (f4) => import_view6.EditorView.decorations.from(f4)
|
|
});
|
|
|
|
// src/cm-extensions/cmExtensions.ts
|
|
var cmExtensions = (plugin, mobile) => {
|
|
let extensions = [];
|
|
extensions.push(...[toggleMarkExtension, tooltips({ parent: document.body })]);
|
|
if (!mobile && plugin.settings.inlineStyler) {
|
|
extensions.push(cursorTooltip(plugin));
|
|
}
|
|
if (plugin.settings.makeMenuPlaceholder)
|
|
extensions.push(placeholder);
|
|
if (plugin.settings.editorFlow) {
|
|
extensions.push(
|
|
flowTypeStateField,
|
|
atomicSelect,
|
|
editBlockExtensions(),
|
|
preloadFlowEditor,
|
|
flowEditorField,
|
|
flowEditorInfo,
|
|
flowIDStateField,
|
|
flowViewUpdates
|
|
);
|
|
if (plugin.settings.internalLinkClickFlow) {
|
|
extensions.push(internalLinkToggle);
|
|
} else {
|
|
extensions.push(internalLinkHover);
|
|
}
|
|
}
|
|
return extensions;
|
|
};
|
|
|
|
// src/components/MakeMenu/MakeMenu.tsx
|
|
var import_obsidian30 = require("obsidian");
|
|
|
|
// src/components/MakeMenu/commands/default.ts
|
|
var default_default2 = [
|
|
{
|
|
label: "todo",
|
|
value: "- [ ] ",
|
|
icon: "mk-make-todo"
|
|
},
|
|
{
|
|
label: "list",
|
|
value: `- `,
|
|
icon: "mk-make-list"
|
|
},
|
|
{
|
|
label: "ordered-list",
|
|
value: `1. `,
|
|
icon: "mk-make-ordered"
|
|
},
|
|
{
|
|
label: "h1",
|
|
value: "# ",
|
|
icon: "mk-make-h1"
|
|
},
|
|
{
|
|
label: "h2",
|
|
value: "## ",
|
|
icon: "mk-make-h2"
|
|
},
|
|
{
|
|
label: "h3",
|
|
value: "### ",
|
|
icon: "mk-make-h3"
|
|
},
|
|
{
|
|
label: "quote",
|
|
value: "> ",
|
|
icon: "mk-make-quote"
|
|
},
|
|
{
|
|
label: "divider",
|
|
value: `
|
|
---
|
|
`,
|
|
icon: "mk-make-hr"
|
|
},
|
|
{
|
|
label: "link",
|
|
value: "<Paste Link>",
|
|
offset: [-1, 1],
|
|
icon: "mk-make-link"
|
|
},
|
|
{
|
|
label: "image",
|
|
value: "",
|
|
offset: [-1, 4],
|
|
icon: "mk-make-image"
|
|
},
|
|
{
|
|
label: "codeblock",
|
|
value: `
|
|
\`\`\`
|
|
Type/Paste Your Code
|
|
\`\`\``,
|
|
offset: [-4, 5],
|
|
icon: "mk-make-codeblock"
|
|
},
|
|
{
|
|
label: "callout",
|
|
value: `> [!NOTE]
|
|
> Content`,
|
|
offset: [-7, 12],
|
|
icon: "mk-make-callout"
|
|
},
|
|
{
|
|
label: "note",
|
|
value: "[[Note Name]]",
|
|
offset: [-2, 2],
|
|
icon: "mk-make-note"
|
|
},
|
|
{
|
|
label: "table",
|
|
value: "table",
|
|
icon: "mk-make-table"
|
|
},
|
|
{
|
|
label: "flow",
|
|
value: `!![[Note Name]]`,
|
|
offset: [-2, 4],
|
|
icon: "mk-make-flow"
|
|
},
|
|
{
|
|
label: "tag",
|
|
value: "#tag",
|
|
offset: [0, 1],
|
|
icon: "mk-make-tag"
|
|
}
|
|
];
|
|
|
|
// src/components/MakeMenu/commands/index.ts
|
|
function resolveCommands(plugin) {
|
|
return default_default2;
|
|
}
|
|
|
|
// src/components/MakeMenu/MakeMenu.tsx
|
|
var MakeMenu = class extends import_obsidian30.EditorSuggest {
|
|
constructor(app2, plugin) {
|
|
super(app2);
|
|
this.inCmd = false;
|
|
this.cmdStartCh = 0;
|
|
this.plugin = plugin;
|
|
}
|
|
resetInfos() {
|
|
this.cmdStartCh = 0;
|
|
this.inCmd = false;
|
|
}
|
|
onTrigger(cursor, editor, _file) {
|
|
const currentLine = editor.getLine(cursor.line).slice(0, cursor.ch);
|
|
const triggerCharLength = this.plugin.settings.menuTriggerChar.length;
|
|
this.file = _file;
|
|
if (!this.inCmd && currentLine.slice(0, triggerCharLength) !== this.plugin.settings.menuTriggerChar && currentLine.slice(-2 - triggerCharLength) !== "- " + this.plugin.settings.menuTriggerChar) {
|
|
this.resetInfos();
|
|
return null;
|
|
}
|
|
if (!this.inCmd) {
|
|
this.cmdStartCh = currentLine.length - triggerCharLength;
|
|
this.inCmd = true;
|
|
}
|
|
const currentCmd = currentLine.slice(this.cmdStartCh, cursor.ch);
|
|
if (currentCmd.includes(" ") || !currentCmd.includes(this.plugin.settings.menuTriggerChar)) {
|
|
this.resetInfos();
|
|
return null;
|
|
}
|
|
return {
|
|
start: cursor,
|
|
end: cursor,
|
|
query: currentCmd.slice(triggerCharLength)
|
|
};
|
|
}
|
|
getSuggestions(context) {
|
|
const suggestions = resolveCommands(this.plugin).filter(
|
|
({ label }) => label.toLowerCase().includes(context.query.toLowerCase()) || i18n_default.commands[label] && i18n_default.commands[label].toLowerCase().includes(context.query.toLowerCase())
|
|
);
|
|
return suggestions.length > 0 ? suggestions : [{ label: i18n_default.commandsSuggest.noResult, value: "", icon: "" }];
|
|
}
|
|
renderSuggestion(value, el) {
|
|
if (value.value == "") {
|
|
el.setText(i18n_default.commandsSuggest.noResult);
|
|
return;
|
|
}
|
|
const div = el.createDiv("mk-slash-item");
|
|
const icon = div.createDiv("mk-slash-icon");
|
|
icon.innerHTML = makeIconSet[value.icon];
|
|
const title = div.createDiv();
|
|
title.setText(i18n_default.commands[value.label]);
|
|
}
|
|
selectSuggestion(cmd, _evt) {
|
|
if (cmd.label === i18n_default.commandsSuggest.noResult)
|
|
return;
|
|
if (cmd.value == "table") {
|
|
this.plugin.createTable(this.file.parent.path).then((f4) => {
|
|
this.context.editor.replaceRange(
|
|
`![![${this.file.parent.path}/#^${f4}]]`,
|
|
{ ...this.context.start, ch: this.cmdStartCh },
|
|
this.context.end
|
|
);
|
|
this.context.editor.setSelection({
|
|
line: this.context.start.line,
|
|
ch: 0
|
|
});
|
|
this.resetInfos();
|
|
this.close();
|
|
});
|
|
} else {
|
|
this.context.editor.replaceRange(
|
|
cmd.value,
|
|
{ ...this.context.start, ch: this.cmdStartCh },
|
|
this.context.end
|
|
);
|
|
if (cmd.offset) {
|
|
this.context.editor.setSelection(
|
|
{ ...this.context.start, ch: this.cmdStartCh + cmd.offset[1] },
|
|
{
|
|
...this.context.end,
|
|
ch: this.cmdStartCh + cmd.value.length + cmd.offset[0]
|
|
}
|
|
);
|
|
}
|
|
this.resetInfos();
|
|
this.close();
|
|
}
|
|
}
|
|
};
|
|
|
|
// src/components/StickerMenu/StickerMenu.tsx
|
|
var import_obsidian31 = require("obsidian");
|
|
var StickerMenu = class extends import_obsidian31.EditorSuggest {
|
|
constructor(app2, plugin) {
|
|
super(app2);
|
|
this.inCmd = false;
|
|
this.cmdStartCh = 0;
|
|
this.plugin = plugin;
|
|
this.emojis = Object.keys(emojis).reduce(
|
|
(p3, c4) => [
|
|
...p3,
|
|
...emojis[c4].map((e4) => ({
|
|
label: e4.n[0],
|
|
desc: e4.n[1],
|
|
variants: e4.v,
|
|
unicode: e4.u
|
|
}))
|
|
],
|
|
[]
|
|
);
|
|
}
|
|
resetInfos() {
|
|
this.cmdStartCh = 0;
|
|
this.inCmd = false;
|
|
}
|
|
onTrigger(cursor, editor, _file) {
|
|
const currentLine = editor.getLine(cursor.line).slice(0, cursor.ch);
|
|
if (!this.inCmd && !(currentLine.slice(-2) == " " + this.plugin.settings.emojiTriggerChar || currentLine[0] == this.plugin.settings.emojiTriggerChar)) {
|
|
this.resetInfos();
|
|
return null;
|
|
}
|
|
if (!this.inCmd) {
|
|
this.cmdStartCh = currentLine.length - 1;
|
|
this.inCmd = true;
|
|
}
|
|
const currentCmd = currentLine.slice(this.cmdStartCh, cursor.ch);
|
|
if (currentCmd.includes(" ") || !currentCmd.includes(this.plugin.settings.emojiTriggerChar)) {
|
|
this.resetInfos();
|
|
return null;
|
|
}
|
|
this.suggestEl.classList.toggle("mk-emoji-menu", true);
|
|
return { start: cursor, end: cursor, query: currentCmd.slice(1) };
|
|
}
|
|
getSuggestions(context) {
|
|
const suggestions = this.emojis.filter(
|
|
({ label, desc }) => label.includes(context.query) || (desc == null ? void 0 : desc.includes(context.query))
|
|
);
|
|
return suggestions.length > 0 ? suggestions : [{ label: i18n_default.commandsSuggest.noResult, unicode: "", desc: "" }];
|
|
}
|
|
renderSuggestion(value, el) {
|
|
const div = document.createElement("div");
|
|
div.setAttribute("aria-label", value.label);
|
|
const reactElement = createRoot(div);
|
|
reactElement.render(
|
|
/* @__PURE__ */ bn.createElement(bn.Fragment, null, value.unicode.length > 0 ? unifiedToNative(value.unicode) : i18n_default.commandsSuggest.noResult)
|
|
);
|
|
el.appendChild(div);
|
|
}
|
|
selectSuggestion(cmd, _evt) {
|
|
if (cmd.label === i18n_default.commandsSuggest.noResult)
|
|
return;
|
|
this.context.editor.replaceRange(
|
|
unifiedToNative(cmd.unicode),
|
|
{ ...this.context.start, ch: this.cmdStartCh },
|
|
this.context.end
|
|
);
|
|
this.resetInfos();
|
|
this.close();
|
|
}
|
|
};
|
|
|
|
// src/main.ts
|
|
var import_obsidian46 = require("obsidian");
|
|
|
|
// src/utils/flow/markdownPost.tsx
|
|
var getCMFromElement = (el) => {
|
|
let dom = el;
|
|
while (!dom.hasClass("cm-editor") && dom.parentElement) {
|
|
dom = dom.parentElement;
|
|
}
|
|
if (!dom.hasClass("cm-editor")) {
|
|
return;
|
|
}
|
|
let rcm;
|
|
app.workspace.iterateLeaves((leaf) => {
|
|
var _a2;
|
|
const cm = (_a2 = leaf.view.editor) == null ? void 0 : _a2.cm;
|
|
if (cm && dom == cm.dom) {
|
|
rcm = cm;
|
|
return true;
|
|
}
|
|
}, app.workspace["rootSplit"]);
|
|
return rcm;
|
|
};
|
|
var replaceAllTables = (plugin, el, ctx) => {
|
|
el.querySelectorAll("p").forEach((element) => {
|
|
for (let match2 of element.textContent.matchAll(/(?:!\[!\[|!!\[\[)([^\]]+)\]\]/g)) {
|
|
const link = match2[1];
|
|
const reactEl = createRoot(element.parentElement);
|
|
reactEl.render(
|
|
/* @__PURE__ */ bn.createElement(FlowView, {
|
|
plugin,
|
|
path: link,
|
|
load: true
|
|
})
|
|
);
|
|
}
|
|
});
|
|
};
|
|
var replaceAllEmbed = (el, ctx) => {
|
|
let dom = el;
|
|
setTimeout(async () => {
|
|
let counter = 0;
|
|
while (!el.parentElement && counter++ <= 50)
|
|
await sleep(50);
|
|
if (!el.parentElement)
|
|
return;
|
|
while (!dom.hasClass("markdown-embed") && dom.parentElement) {
|
|
dom = dom.parentElement;
|
|
}
|
|
if (dom) {
|
|
var nodes2 = dom.querySelectorAll(".markdown-embed-link");
|
|
for (var i4 = 0; i4 < nodes2.length; i4++) {
|
|
if (nodes2[i4].parentNode === dom) {
|
|
dom.removeChild(nodes2[i4]);
|
|
const div = dom.createDiv("mk-floweditor-selector");
|
|
const reactEl = createRoot(div);
|
|
reactEl.render(
|
|
/* @__PURE__ */ bn.createElement(FlowEditorHover, {
|
|
toggle: true,
|
|
type: "file",
|
|
toggleState: false,
|
|
toggleFlow: (e4) => {
|
|
const cm = getCMFromElement(dom);
|
|
const pos = cm == null ? void 0 : cm.posAtDOM(dom);
|
|
if (!cm)
|
|
return;
|
|
iterateTreeInSelection(
|
|
{ from: pos - 3, to: pos + 4 },
|
|
cm.state,
|
|
{
|
|
enter: (node) => {
|
|
if (node.name.contains("hmd-internal-link")) {
|
|
if (cm.state.sliceDoc(node.from - 4, node.from - 3) != "!") {
|
|
if (cm.state.sliceDoc(node.to + 2, node.to + 3) != cm.state.lineBreak) {
|
|
cm.dispatch({
|
|
changes: [
|
|
{
|
|
from: node.from - 3,
|
|
to: node.from - 3,
|
|
insert: "!"
|
|
},
|
|
{
|
|
from: node.to + 2,
|
|
to: node.to + 2,
|
|
insert: cm.state.lineBreak
|
|
}
|
|
]
|
|
});
|
|
} else {
|
|
cm.dispatch({
|
|
changes: {
|
|
from: node.from - 3,
|
|
to: node.from - 3,
|
|
insert: "!"
|
|
}
|
|
});
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
);
|
|
e4.stopPropagation();
|
|
},
|
|
openLink: (e4) => {
|
|
e4.stopPropagation();
|
|
openFileFlowEditor(ctx.sourcePath, "/");
|
|
}
|
|
})
|
|
);
|
|
}
|
|
}
|
|
}
|
|
});
|
|
};
|
|
|
|
// src/components/Spaces/FileTreeView.tsx
|
|
var import_obsidian38 = require("obsidian");
|
|
|
|
// node_modules/recoil/es/recoil.js
|
|
function isPromise(p3) {
|
|
return !!p3 && typeof p3.then === "function";
|
|
}
|
|
var Recoil_isPromise = isPromise;
|
|
function nullthrows(x5, message) {
|
|
if (x5 != null) {
|
|
return x5;
|
|
}
|
|
throw new Error(message !== null && message !== void 0 ? message : "Got unexpected null or undefined");
|
|
}
|
|
var Recoil_nullthrows = nullthrows;
|
|
var Canceled = class {
|
|
};
|
|
var CANCELED = new Canceled();
|
|
var loadableAccessors = {
|
|
valueMaybe() {
|
|
return void 0;
|
|
},
|
|
valueOrThrow() {
|
|
const error = new Error(
|
|
`Loadable expected value, but in "${this.state}" state`
|
|
);
|
|
throw error;
|
|
},
|
|
errorMaybe() {
|
|
return void 0;
|
|
},
|
|
errorOrThrow() {
|
|
const error = new Error(
|
|
`Loadable expected error, but in "${this.state}" state`
|
|
);
|
|
throw error;
|
|
},
|
|
promiseMaybe() {
|
|
return void 0;
|
|
},
|
|
promiseOrThrow() {
|
|
const error = new Error(
|
|
`Loadable expected promise, but in "${this.state}" state`
|
|
);
|
|
throw error;
|
|
},
|
|
is(other) {
|
|
return other.state === this.state && other.contents === this.contents;
|
|
},
|
|
map(map) {
|
|
if (this.state === "hasError") {
|
|
return this;
|
|
}
|
|
if (this.state === "hasValue") {
|
|
try {
|
|
const next = map(this.contents);
|
|
return Recoil_isPromise(next) ? loadableWithPromise(next.then((value) => ({
|
|
__value: value
|
|
}))) : loadableWithValue(next);
|
|
} catch (e4) {
|
|
return Recoil_isPromise(e4) ? loadableWithPromise(e4.next(() => map(this.contents))) : loadableWithError(e4);
|
|
}
|
|
}
|
|
if (this.state === "loading") {
|
|
return loadableWithPromise(
|
|
this.contents.then((value) => ({
|
|
__value: map(value.__value)
|
|
})).catch((e4) => {
|
|
if (Recoil_isPromise(e4)) {
|
|
return e4.then(() => map(this.contents));
|
|
}
|
|
throw e4;
|
|
})
|
|
);
|
|
}
|
|
const error = new Error("Invalid Loadable state");
|
|
throw error;
|
|
}
|
|
};
|
|
function loadableWithValue(value) {
|
|
return Object.freeze({
|
|
state: "hasValue",
|
|
contents: value,
|
|
...loadableAccessors,
|
|
getValue() {
|
|
return this.contents;
|
|
},
|
|
toPromise() {
|
|
return Promise.resolve(this.contents);
|
|
},
|
|
valueMaybe() {
|
|
return this.contents;
|
|
},
|
|
valueOrThrow() {
|
|
return this.contents;
|
|
}
|
|
});
|
|
}
|
|
function loadableWithError(error) {
|
|
return Object.freeze({
|
|
state: "hasError",
|
|
contents: error,
|
|
...loadableAccessors,
|
|
getValue() {
|
|
throw this.contents;
|
|
},
|
|
toPromise() {
|
|
return Promise.reject(this.contents);
|
|
},
|
|
errorMaybe() {
|
|
return this.contents;
|
|
},
|
|
errorOrThrow() {
|
|
return this.contents;
|
|
}
|
|
});
|
|
}
|
|
function loadableWithPromise(promise) {
|
|
return Object.freeze({
|
|
state: "loading",
|
|
contents: promise,
|
|
...loadableAccessors,
|
|
getValue() {
|
|
throw this.contents.then(({
|
|
__value
|
|
}) => __value);
|
|
},
|
|
toPromise() {
|
|
return this.contents.then(({
|
|
__value
|
|
}) => __value);
|
|
},
|
|
promiseMaybe() {
|
|
return this.contents.then(({
|
|
__value
|
|
}) => __value);
|
|
},
|
|
promiseOrThrow() {
|
|
return this.contents.then(({
|
|
__value
|
|
}) => __value);
|
|
}
|
|
});
|
|
}
|
|
function loadableLoading() {
|
|
return loadableWithPromise(new Promise(() => {
|
|
}));
|
|
}
|
|
function loadableAll(inputs) {
|
|
return inputs.every((i4) => i4.state === "hasValue") ? loadableWithValue(inputs.map((i4) => i4.contents)) : inputs.some((i4) => i4.state === "hasError") ? loadableWithError(Recoil_nullthrows(inputs.find((i4) => i4.state === "hasError"), "Invalid loadable passed to loadableAll").contents) : loadableWithPromise(Promise.all(inputs.map((i4) => i4.contents)).then((value) => ({
|
|
__value: value
|
|
})));
|
|
}
|
|
var Recoil_Loadable = {
|
|
loadableWithValue,
|
|
loadableWithError,
|
|
loadableWithPromise,
|
|
loadableLoading,
|
|
loadableAll,
|
|
Canceled,
|
|
CANCELED
|
|
};
|
|
var _useMutableSource;
|
|
var useMutableSource = (_useMutableSource = bn.useMutableSource) !== null && _useMutableSource !== void 0 ? _useMutableSource : bn.unstable_useMutableSource;
|
|
function mutableSourceExists() {
|
|
return useMutableSource && !(typeof window !== "undefined" && window.$disableRecoilValueMutableSource_TEMP_HACK_DO_NOT_USE);
|
|
}
|
|
var Recoil_mutableSource = {
|
|
mutableSourceExists,
|
|
useMutableSource
|
|
};
|
|
var {
|
|
mutableSourceExists: mutableSourceExists$1
|
|
} = Recoil_mutableSource;
|
|
var gks = (/* @__PURE__ */ new Map()).set("recoil_hamt_2020", true).set("recoil_memory_managament_2020", true).set("recoil_suppress_rerender_in_callback", true);
|
|
function Recoil_gkx(gk) {
|
|
var _gks$get;
|
|
if (gk === "recoil_early_rendering_2021" && !mutableSourceExists$1()) {
|
|
return false;
|
|
}
|
|
return (_gks$get = gks.get(gk)) !== null && _gks$get !== void 0 ? _gks$get : false;
|
|
}
|
|
Recoil_gkx.setPass = (gk) => {
|
|
gks.set(gk, true);
|
|
};
|
|
Recoil_gkx.setFail = (gk) => {
|
|
gks.set(gk, false);
|
|
};
|
|
var Recoil_gkx_1 = Recoil_gkx;
|
|
function recoverableViolation(message, projectName, {
|
|
error
|
|
} = {}) {
|
|
if (true) {
|
|
console.error(message, error);
|
|
}
|
|
return null;
|
|
}
|
|
var recoverableViolation_1 = recoverableViolation;
|
|
var Recoil_recoverableViolation = recoverableViolation_1;
|
|
function setByAddingToSet(set, v3) {
|
|
const next = new Set(set);
|
|
next.add(v3);
|
|
return next;
|
|
}
|
|
function setByDeletingFromSet(set, v3) {
|
|
const next = new Set(set);
|
|
next.delete(v3);
|
|
return next;
|
|
}
|
|
function mapBySettingInMap(map, k5, v3) {
|
|
const next = new Map(map);
|
|
next.set(k5, v3);
|
|
return next;
|
|
}
|
|
function mapByUpdatingInMap(map, k5, updater) {
|
|
const next = new Map(map);
|
|
next.set(k5, updater(next.get(k5)));
|
|
return next;
|
|
}
|
|
function mapByDeletingFromMap(map, k5) {
|
|
const next = new Map(map);
|
|
next.delete(k5);
|
|
return next;
|
|
}
|
|
function mapByDeletingMultipleFromMap(map, ks) {
|
|
const next = new Map(map);
|
|
ks.forEach((k5) => next.delete(k5));
|
|
return next;
|
|
}
|
|
var Recoil_CopyOnWrite = {
|
|
setByAddingToSet,
|
|
setByDeletingFromSet,
|
|
mapBySettingInMap,
|
|
mapByUpdatingInMap,
|
|
mapByDeletingFromMap,
|
|
mapByDeletingMultipleFromMap
|
|
};
|
|
function* filterIterable(iterable, predicate) {
|
|
let index = 0;
|
|
for (const value of iterable) {
|
|
if (predicate(value, index++)) {
|
|
yield value;
|
|
}
|
|
}
|
|
}
|
|
var Recoil_filterIterable = filterIterable;
|
|
function mapIterable(iterable, callback) {
|
|
return function* () {
|
|
let index = 0;
|
|
for (const value of iterable) {
|
|
yield callback(value, index++);
|
|
}
|
|
}();
|
|
}
|
|
var Recoil_mapIterable = mapIterable;
|
|
function sprintf(format2, ...args) {
|
|
let index = 0;
|
|
return format2.replace(/%s/g, () => String(args[index++]));
|
|
}
|
|
var sprintf_1 = sprintf;
|
|
function expectationViolation(format2, ...args) {
|
|
if (true) {
|
|
const message = sprintf_1.call(null, format2, ...args);
|
|
const error = new Error(message);
|
|
error.name = "Expectation Violation";
|
|
console.error(error);
|
|
}
|
|
}
|
|
var expectationViolation_1 = expectationViolation;
|
|
var Recoil_expectationViolation = expectationViolation_1;
|
|
function _defineProperty(obj, key2, value) {
|
|
if (key2 in obj) {
|
|
Object.defineProperty(obj, key2, {
|
|
value,
|
|
enumerable: true,
|
|
configurable: true,
|
|
writable: true
|
|
});
|
|
} else {
|
|
obj[key2] = value;
|
|
}
|
|
return obj;
|
|
}
|
|
var AbstractRecoilValue = class {
|
|
constructor(newKey) {
|
|
_defineProperty(this, "key", void 0);
|
|
this.key = newKey;
|
|
}
|
|
};
|
|
var RecoilState = class extends AbstractRecoilValue {
|
|
};
|
|
var RecoilValueReadOnly = class extends AbstractRecoilValue {
|
|
};
|
|
function isRecoilValue(x5) {
|
|
return x5 instanceof RecoilState || x5 instanceof RecoilValueReadOnly;
|
|
}
|
|
var Recoil_RecoilValue = {
|
|
AbstractRecoilValue,
|
|
RecoilState,
|
|
RecoilValueReadOnly,
|
|
isRecoilValue
|
|
};
|
|
var Recoil_RecoilValue_1 = Recoil_RecoilValue.AbstractRecoilValue;
|
|
var Recoil_RecoilValue_2 = Recoil_RecoilValue.RecoilState;
|
|
var Recoil_RecoilValue_3 = Recoil_RecoilValue.RecoilValueReadOnly;
|
|
var Recoil_RecoilValue_4 = Recoil_RecoilValue.isRecoilValue;
|
|
var Recoil_RecoilValue$1 = /* @__PURE__ */ Object.freeze({
|
|
__proto__: null,
|
|
AbstractRecoilValue: Recoil_RecoilValue_1,
|
|
RecoilState: Recoil_RecoilValue_2,
|
|
RecoilValueReadOnly: Recoil_RecoilValue_3,
|
|
isRecoilValue: Recoil_RecoilValue_4
|
|
});
|
|
var DefaultValue = class {
|
|
};
|
|
var DEFAULT_VALUE = new DefaultValue();
|
|
var RecoilValueNotReady = class extends Error {
|
|
constructor(key2) {
|
|
super(`Tried to set the value of Recoil selector ${key2} using an updater function, but it is an async selector in a pending or error state; this is not supported.`);
|
|
}
|
|
};
|
|
var nodes = /* @__PURE__ */ new Map();
|
|
var recoilValues = /* @__PURE__ */ new Map();
|
|
function recoilValuesForKeys(keys) {
|
|
return Recoil_mapIterable(keys, (key2) => Recoil_nullthrows(recoilValues.get(key2)));
|
|
}
|
|
function registerNode(node) {
|
|
if (nodes.has(node.key)) {
|
|
const message = `Duplicate atom key "${node.key}". This is a FATAL ERROR in
|
|
production. But it is safe to ignore this warning if it occurred because of
|
|
hot module replacement.`;
|
|
console.warn(message);
|
|
}
|
|
nodes.set(node.key, node);
|
|
const recoilValue = node.set == null ? new Recoil_RecoilValue$1.RecoilValueReadOnly(node.key) : new Recoil_RecoilValue$1.RecoilState(node.key);
|
|
recoilValues.set(node.key, recoilValue);
|
|
return recoilValue;
|
|
}
|
|
var NodeMissingError = class extends Error {
|
|
};
|
|
function getNode(key2) {
|
|
const node = nodes.get(key2);
|
|
if (node == null) {
|
|
throw new NodeMissingError(`Missing definition for RecoilValue: "${key2}""`);
|
|
}
|
|
return node;
|
|
}
|
|
function getNodeMaybe(key2) {
|
|
return nodes.get(key2);
|
|
}
|
|
var configDeletionHandlers = /* @__PURE__ */ new Map();
|
|
function deleteNodeConfigIfPossible(key2) {
|
|
var _node$shouldDeleteCon;
|
|
if (!Recoil_gkx_1("recoil_memory_managament_2020")) {
|
|
return;
|
|
}
|
|
const node = nodes.get(key2);
|
|
if (node === null || node === void 0 ? void 0 : (_node$shouldDeleteCon = node.shouldDeleteConfigOnRelease) === null || _node$shouldDeleteCon === void 0 ? void 0 : _node$shouldDeleteCon.call(node)) {
|
|
var _getConfigDeletionHan;
|
|
nodes.delete(key2);
|
|
(_getConfigDeletionHan = getConfigDeletionHandler(key2)) === null || _getConfigDeletionHan === void 0 ? void 0 : _getConfigDeletionHan();
|
|
configDeletionHandlers.delete(key2);
|
|
}
|
|
}
|
|
function setConfigDeletionHandler(key2, fn2) {
|
|
if (!Recoil_gkx_1("recoil_memory_managament_2020")) {
|
|
return;
|
|
}
|
|
if (fn2 === void 0) {
|
|
configDeletionHandlers.delete(key2);
|
|
} else {
|
|
configDeletionHandlers.set(key2, fn2);
|
|
}
|
|
}
|
|
function getConfigDeletionHandler(key2) {
|
|
return configDeletionHandlers.get(key2);
|
|
}
|
|
var Recoil_Node = {
|
|
nodes,
|
|
recoilValues,
|
|
registerNode,
|
|
getNode,
|
|
getNodeMaybe,
|
|
deleteNodeConfigIfPossible,
|
|
setConfigDeletionHandler,
|
|
getConfigDeletionHandler,
|
|
recoilValuesForKeys,
|
|
NodeMissingError,
|
|
DefaultValue,
|
|
DEFAULT_VALUE,
|
|
RecoilValueNotReady
|
|
};
|
|
var RetentionZone = class {
|
|
};
|
|
function retentionZone() {
|
|
return new RetentionZone();
|
|
}
|
|
var Recoil_RetentionZone = {
|
|
RetentionZone,
|
|
retentionZone
|
|
};
|
|
var {
|
|
setByAddingToSet: setByAddingToSet$1
|
|
} = Recoil_CopyOnWrite;
|
|
var {
|
|
getNode: getNode$1,
|
|
getNodeMaybe: getNodeMaybe$1,
|
|
recoilValuesForKeys: recoilValuesForKeys$1
|
|
} = Recoil_Node;
|
|
var {
|
|
RetentionZone: RetentionZone$1
|
|
} = Recoil_RetentionZone;
|
|
var emptySet = Object.freeze(/* @__PURE__ */ new Set());
|
|
var ReadOnlyRecoilValueError = class extends Error {
|
|
};
|
|
function initializeRetentionForNode(store, nodeKey, retainedBy) {
|
|
if (!Recoil_gkx_1("recoil_memory_managament_2020")) {
|
|
return () => void 0;
|
|
}
|
|
const {
|
|
nodesRetainedByZone: nodesRetainedByZone2
|
|
} = store.getState().retention;
|
|
function addToZone(zone) {
|
|
let set = nodesRetainedByZone2.get(zone);
|
|
if (!set) {
|
|
nodesRetainedByZone2.set(zone, set = /* @__PURE__ */ new Set());
|
|
}
|
|
set.add(nodeKey);
|
|
}
|
|
if (retainedBy instanceof RetentionZone$1) {
|
|
addToZone(retainedBy);
|
|
} else if (Array.isArray(retainedBy)) {
|
|
for (const zone of retainedBy) {
|
|
addToZone(zone);
|
|
}
|
|
}
|
|
return () => {
|
|
if (!Recoil_gkx_1("recoil_memory_managament_2020")) {
|
|
return;
|
|
}
|
|
const nodesRetainedByZone3 = store.getState().retention.nodesRetainedByZone;
|
|
function deleteFromZone(zone) {
|
|
const set = nodesRetainedByZone3.get(zone);
|
|
if (set) {
|
|
set.delete(nodeKey);
|
|
}
|
|
if (set && set.size === 0) {
|
|
nodesRetainedByZone3.delete(zone);
|
|
}
|
|
}
|
|
if (retainedBy instanceof RetentionZone$1) {
|
|
deleteFromZone(retainedBy);
|
|
} else if (Array.isArray(retainedBy)) {
|
|
for (const zone of retainedBy) {
|
|
deleteFromZone(zone);
|
|
}
|
|
}
|
|
};
|
|
}
|
|
function initializeNodeIfNewToStore(store, treeState, key2, trigger) {
|
|
const storeState = store.getState();
|
|
if (storeState.nodeCleanupFunctions.has(key2)) {
|
|
return;
|
|
}
|
|
const config = getNode$1(key2);
|
|
const retentionCleanup = initializeRetentionForNode(store, key2, config.retainedBy);
|
|
const nodeCleanup = config.init(store, treeState, trigger);
|
|
storeState.nodeCleanupFunctions.set(key2, () => {
|
|
nodeCleanup();
|
|
retentionCleanup();
|
|
});
|
|
}
|
|
function cleanUpNode(store, key2) {
|
|
var _state$nodeCleanupFun;
|
|
const state = store.getState();
|
|
(_state$nodeCleanupFun = state.nodeCleanupFunctions.get(key2)) === null || _state$nodeCleanupFun === void 0 ? void 0 : _state$nodeCleanupFun();
|
|
state.nodeCleanupFunctions.delete(key2);
|
|
}
|
|
function getNodeLoadable(store, state, key2) {
|
|
initializeNodeIfNewToStore(store, state, key2, "get");
|
|
return getNode$1(key2).get(store, state);
|
|
}
|
|
function peekNodeLoadable(store, state, key2) {
|
|
return getNode$1(key2).peek(store, state);
|
|
}
|
|
function setUnvalidatedAtomValue_DEPRECATED(state, key2, newValue) {
|
|
var _node$invalidate;
|
|
const node = getNodeMaybe$1(key2);
|
|
node === null || node === void 0 ? void 0 : (_node$invalidate = node.invalidate) === null || _node$invalidate === void 0 ? void 0 : _node$invalidate.call(node, state);
|
|
return {
|
|
...state,
|
|
atomValues: state.atomValues.clone().delete(key2),
|
|
nonvalidatedAtoms: state.nonvalidatedAtoms.clone().set(key2, newValue),
|
|
dirtyAtoms: setByAddingToSet$1(state.dirtyAtoms, key2)
|
|
};
|
|
}
|
|
function setNodeValue(store, state, key2, newValue) {
|
|
const node = getNode$1(key2);
|
|
if (node.set == null) {
|
|
throw new ReadOnlyRecoilValueError(`Attempt to set read-only RecoilValue: ${key2}`);
|
|
}
|
|
const set = node.set;
|
|
initializeNodeIfNewToStore(store, state, key2, "set");
|
|
return set(store, state, newValue);
|
|
}
|
|
function peekNodeInfo(store, state, key2) {
|
|
var _graph$nodeDeps$get, _storeState$nodeToCom, _storeState$nodeToCom2;
|
|
const storeState = store.getState();
|
|
const graph2 = store.getGraph(state.version);
|
|
const type = storeState.knownAtoms.has(key2) ? "atom" : storeState.knownSelectors.has(key2) ? "selector" : void 0;
|
|
const downstreamNodes = Recoil_filterIterable(getDownstreamNodes(store, state, /* @__PURE__ */ new Set([key2])), (nodeKey) => nodeKey !== key2);
|
|
return {
|
|
loadable: peekNodeLoadable(store, state, key2),
|
|
isActive: storeState.knownAtoms.has(key2) || storeState.knownSelectors.has(key2),
|
|
isSet: type === "selector" ? false : state.atomValues.has(key2),
|
|
isModified: state.dirtyAtoms.has(key2),
|
|
type,
|
|
deps: recoilValuesForKeys$1((_graph$nodeDeps$get = graph2.nodeDeps.get(key2)) !== null && _graph$nodeDeps$get !== void 0 ? _graph$nodeDeps$get : []),
|
|
subscribers: {
|
|
nodes: recoilValuesForKeys$1(downstreamNodes),
|
|
components: Recoil_mapIterable((_storeState$nodeToCom = (_storeState$nodeToCom2 = storeState.nodeToComponentSubscriptions.get(key2)) === null || _storeState$nodeToCom2 === void 0 ? void 0 : _storeState$nodeToCom2.values()) !== null && _storeState$nodeToCom !== void 0 ? _storeState$nodeToCom : [], ([name]) => ({
|
|
name
|
|
}))
|
|
}
|
|
};
|
|
}
|
|
function getDownstreamNodes(store, state, keys) {
|
|
const visitedNodes = /* @__PURE__ */ new Set();
|
|
const visitingNodes = Array.from(keys);
|
|
const graph2 = store.getGraph(state.version);
|
|
for (let key2 = visitingNodes.pop(); key2; key2 = visitingNodes.pop()) {
|
|
var _graph$nodeToNodeSubs;
|
|
visitedNodes.add(key2);
|
|
const subscribedNodes = (_graph$nodeToNodeSubs = graph2.nodeToNodeSubscriptions.get(key2)) !== null && _graph$nodeToNodeSubs !== void 0 ? _graph$nodeToNodeSubs : emptySet;
|
|
for (const downstreamNode of subscribedNodes) {
|
|
if (!visitedNodes.has(downstreamNode)) {
|
|
visitingNodes.push(downstreamNode);
|
|
}
|
|
}
|
|
}
|
|
return visitedNodes;
|
|
}
|
|
var Recoil_FunctionalCore = {
|
|
getNodeLoadable,
|
|
peekNodeLoadable,
|
|
setNodeValue,
|
|
cleanUpNode,
|
|
setUnvalidatedAtomValue_DEPRECATED,
|
|
peekNodeInfo,
|
|
getDownstreamNodes,
|
|
initializeNodeIfNewToStore
|
|
};
|
|
var {
|
|
CANCELED: CANCELED$1
|
|
} = Recoil_Loadable;
|
|
var {
|
|
getDownstreamNodes: getDownstreamNodes$1,
|
|
getNodeLoadable: getNodeLoadable$1,
|
|
setNodeValue: setNodeValue$1
|
|
} = Recoil_FunctionalCore;
|
|
var {
|
|
getNodeMaybe: getNodeMaybe$2
|
|
} = Recoil_Node;
|
|
var {
|
|
DefaultValue: DefaultValue$1,
|
|
RecoilValueNotReady: RecoilValueNotReady$1
|
|
} = Recoil_Node;
|
|
var {
|
|
AbstractRecoilValue: AbstractRecoilValue$1,
|
|
RecoilState: RecoilState$1,
|
|
RecoilValueReadOnly: RecoilValueReadOnly$1,
|
|
isRecoilValue: isRecoilValue$1
|
|
} = Recoil_RecoilValue$1;
|
|
function getRecoilValueAsLoadable(store, {
|
|
key: key2
|
|
}, treeState = store.getState().currentTree) {
|
|
var _storeState$nextTree, _storeState$previousT;
|
|
const storeState = store.getState();
|
|
if (!(treeState.version === storeState.currentTree.version || treeState.version === ((_storeState$nextTree = storeState.nextTree) === null || _storeState$nextTree === void 0 ? void 0 : _storeState$nextTree.version) || treeState.version === ((_storeState$previousT = storeState.previousTree) === null || _storeState$previousT === void 0 ? void 0 : _storeState$previousT.version))) {
|
|
Recoil_recoverableViolation("Tried to read from a discarded tree");
|
|
}
|
|
const loadable = getNodeLoadable$1(store, treeState, key2);
|
|
if (loadable.state === "loading") {
|
|
loadable.contents.catch(() => {
|
|
return CANCELED$1;
|
|
});
|
|
}
|
|
return loadable;
|
|
}
|
|
function applyAtomValueWrites(atomValues, writes) {
|
|
const result = atomValues.clone();
|
|
writes.forEach((v3, k5) => {
|
|
if (v3.state === "hasValue" && v3.contents instanceof DefaultValue$1) {
|
|
result.delete(k5);
|
|
} else {
|
|
result.set(k5, v3);
|
|
}
|
|
});
|
|
return result;
|
|
}
|
|
function valueFromValueOrUpdater(store, state, {
|
|
key: key2
|
|
}, valueOrUpdater) {
|
|
if (typeof valueOrUpdater === "function") {
|
|
const current = getNodeLoadable$1(store, state, key2);
|
|
if (current.state === "loading") {
|
|
throw new RecoilValueNotReady$1(key2);
|
|
} else if (current.state === "hasError") {
|
|
throw current.contents;
|
|
}
|
|
return valueOrUpdater(current.contents);
|
|
} else {
|
|
return valueOrUpdater;
|
|
}
|
|
}
|
|
function applyAction(store, state, action) {
|
|
if (action.type === "set") {
|
|
const {
|
|
recoilValue,
|
|
valueOrUpdater
|
|
} = action;
|
|
const newValue = valueFromValueOrUpdater(store, state, recoilValue, valueOrUpdater);
|
|
const writes = setNodeValue$1(store, state, recoilValue.key, newValue);
|
|
for (const [key2, loadable] of writes.entries()) {
|
|
writeLoadableToTreeState(state, key2, loadable);
|
|
}
|
|
} else if (action.type === "setLoadable") {
|
|
const {
|
|
recoilValue: {
|
|
key: key2
|
|
},
|
|
loadable
|
|
} = action;
|
|
writeLoadableToTreeState(state, key2, loadable);
|
|
} else if (action.type === "markModified") {
|
|
const {
|
|
recoilValue: {
|
|
key: key2
|
|
}
|
|
} = action;
|
|
state.dirtyAtoms.add(key2);
|
|
} else if (action.type === "setUnvalidated") {
|
|
var _node$invalidate;
|
|
const {
|
|
recoilValue: {
|
|
key: key2
|
|
},
|
|
unvalidatedValue
|
|
} = action;
|
|
const node = getNodeMaybe$2(key2);
|
|
node === null || node === void 0 ? void 0 : (_node$invalidate = node.invalidate) === null || _node$invalidate === void 0 ? void 0 : _node$invalidate.call(node, state);
|
|
state.atomValues.delete(key2);
|
|
state.nonvalidatedAtoms.set(key2, unvalidatedValue);
|
|
state.dirtyAtoms.add(key2);
|
|
} else {
|
|
Recoil_recoverableViolation(`Unknown action ${action.type}`);
|
|
}
|
|
}
|
|
function writeLoadableToTreeState(state, key2, loadable) {
|
|
if (loadable.state === "hasValue" && loadable.contents instanceof DefaultValue$1) {
|
|
state.atomValues.delete(key2);
|
|
} else {
|
|
state.atomValues.set(key2, loadable);
|
|
}
|
|
state.dirtyAtoms.add(key2);
|
|
state.nonvalidatedAtoms.delete(key2);
|
|
}
|
|
function applyActionsToStore(store, actions) {
|
|
store.replaceState((state) => {
|
|
const newState = copyTreeState(state);
|
|
for (const action of actions) {
|
|
applyAction(store, newState, action);
|
|
}
|
|
invalidateDownstreams(store, newState);
|
|
return newState;
|
|
});
|
|
}
|
|
function queueOrPerformStateUpdate(store, action) {
|
|
if (batchStack.length) {
|
|
const actionsByStore = batchStack[batchStack.length - 1];
|
|
let actions = actionsByStore.get(store);
|
|
if (!actions) {
|
|
actionsByStore.set(store, actions = []);
|
|
}
|
|
actions.push(action);
|
|
} else {
|
|
applyActionsToStore(store, [action]);
|
|
}
|
|
}
|
|
var batchStack = [];
|
|
function batchStart() {
|
|
const actionsByStore = /* @__PURE__ */ new Map();
|
|
batchStack.push(actionsByStore);
|
|
return () => {
|
|
for (const [store, actions] of actionsByStore) {
|
|
applyActionsToStore(store, actions);
|
|
}
|
|
const popped = batchStack.pop();
|
|
if (popped !== actionsByStore) {
|
|
Recoil_recoverableViolation("Incorrect order of batch popping");
|
|
}
|
|
};
|
|
}
|
|
function copyTreeState(state) {
|
|
return {
|
|
...state,
|
|
atomValues: state.atomValues.clone(),
|
|
nonvalidatedAtoms: state.nonvalidatedAtoms.clone(),
|
|
dirtyAtoms: new Set(state.dirtyAtoms)
|
|
};
|
|
}
|
|
function invalidateDownstreams(store, state) {
|
|
const downstreams = getDownstreamNodes$1(store, state, state.dirtyAtoms);
|
|
for (const key2 of downstreams) {
|
|
var _getNodeMaybe, _getNodeMaybe$invalid;
|
|
(_getNodeMaybe = getNodeMaybe$2(key2)) === null || _getNodeMaybe === void 0 ? void 0 : (_getNodeMaybe$invalid = _getNodeMaybe.invalidate) === null || _getNodeMaybe$invalid === void 0 ? void 0 : _getNodeMaybe$invalid.call(_getNodeMaybe, state);
|
|
}
|
|
}
|
|
function setRecoilValue(store, recoilValue, valueOrUpdater) {
|
|
queueOrPerformStateUpdate(store, {
|
|
type: "set",
|
|
recoilValue,
|
|
valueOrUpdater
|
|
});
|
|
}
|
|
function setRecoilValueLoadable(store, recoilValue, loadable) {
|
|
if (loadable instanceof DefaultValue$1) {
|
|
return setRecoilValue(store, recoilValue, loadable);
|
|
}
|
|
queueOrPerformStateUpdate(store, {
|
|
type: "setLoadable",
|
|
recoilValue,
|
|
loadable
|
|
});
|
|
}
|
|
function markRecoilValueModified(store, recoilValue) {
|
|
queueOrPerformStateUpdate(store, {
|
|
type: "markModified",
|
|
recoilValue
|
|
});
|
|
}
|
|
function setUnvalidatedRecoilValue(store, recoilValue, unvalidatedValue) {
|
|
queueOrPerformStateUpdate(store, {
|
|
type: "setUnvalidated",
|
|
recoilValue,
|
|
unvalidatedValue
|
|
});
|
|
}
|
|
var subscriptionID = 0;
|
|
function subscribeToRecoilValue(store, {
|
|
key: key2
|
|
}, callback, componentDebugName = null) {
|
|
const subID = subscriptionID++;
|
|
const storeState = store.getState();
|
|
if (!storeState.nodeToComponentSubscriptions.has(key2)) {
|
|
storeState.nodeToComponentSubscriptions.set(key2, /* @__PURE__ */ new Map());
|
|
}
|
|
Recoil_nullthrows(storeState.nodeToComponentSubscriptions.get(key2)).set(subID, [componentDebugName !== null && componentDebugName !== void 0 ? componentDebugName : "<not captured>", callback]);
|
|
if (Recoil_gkx_1("recoil_early_rendering_2021")) {
|
|
const nextTree = store.getState().nextTree;
|
|
if (nextTree && nextTree.dirtyAtoms.has(key2)) {
|
|
callback(nextTree);
|
|
}
|
|
}
|
|
return {
|
|
release: () => {
|
|
const storeState2 = store.getState();
|
|
const subs = storeState2.nodeToComponentSubscriptions.get(key2);
|
|
if (subs === void 0 || !subs.has(subID)) {
|
|
Recoil_recoverableViolation(`Subscription missing at release time for atom ${key2}. This is a bug in Recoil.`);
|
|
return;
|
|
}
|
|
subs.delete(subID);
|
|
if (subs.size === 0) {
|
|
storeState2.nodeToComponentSubscriptions.delete(key2);
|
|
}
|
|
}
|
|
};
|
|
}
|
|
var Recoil_RecoilValueInterface = {
|
|
RecoilValueReadOnly: RecoilValueReadOnly$1,
|
|
AbstractRecoilValue: AbstractRecoilValue$1,
|
|
RecoilState: RecoilState$1,
|
|
getRecoilValueAsLoadable,
|
|
setRecoilValue,
|
|
setRecoilValueLoadable,
|
|
markRecoilValueModified,
|
|
setUnvalidatedRecoilValue,
|
|
subscribeToRecoilValue,
|
|
isRecoilValue: isRecoilValue$1,
|
|
applyAtomValueWrites,
|
|
batchStart,
|
|
writeLoadableToTreeState,
|
|
invalidateDownstreams,
|
|
copyTreeState,
|
|
invalidateDownstreams_FOR_TESTING: invalidateDownstreams
|
|
};
|
|
var {
|
|
unstable_batchedUpdates
|
|
} = bn;
|
|
var ReactBatchedUpdates = {
|
|
unstable_batchedUpdates
|
|
};
|
|
var {
|
|
unstable_batchedUpdates: unstable_batchedUpdates$1
|
|
} = ReactBatchedUpdates;
|
|
var Recoil_ReactBatchedUpdates = {
|
|
unstable_batchedUpdates: unstable_batchedUpdates$1
|
|
};
|
|
var {
|
|
batchStart: batchStart$1
|
|
} = Recoil_RecoilValueInterface;
|
|
var {
|
|
unstable_batchedUpdates: unstable_batchedUpdates$2
|
|
} = Recoil_ReactBatchedUpdates;
|
|
var batcher = unstable_batchedUpdates$2;
|
|
var setBatcher = (newBatcher) => {
|
|
batcher = newBatcher;
|
|
};
|
|
var getBatcher = () => batcher;
|
|
var batchUpdates = (callback) => {
|
|
batcher(() => {
|
|
let batchEnd = () => void 0;
|
|
try {
|
|
batchEnd = batchStart$1();
|
|
callback();
|
|
} finally {
|
|
batchEnd();
|
|
}
|
|
});
|
|
};
|
|
var Recoil_Batching = {
|
|
getBatcher,
|
|
setBatcher,
|
|
batchUpdates
|
|
};
|
|
function enqueueExecution(s5, f4) {
|
|
f4();
|
|
}
|
|
var Recoil_Queue = {
|
|
enqueueExecution
|
|
};
|
|
function differenceSets(set, ...setsWithValuesToRemove) {
|
|
const ret = /* @__PURE__ */ new Set();
|
|
FIRST:
|
|
for (const value of set) {
|
|
for (const otherSet of setsWithValuesToRemove) {
|
|
if (otherSet.has(value)) {
|
|
continue FIRST;
|
|
}
|
|
}
|
|
ret.add(value);
|
|
}
|
|
return ret;
|
|
}
|
|
var Recoil_differenceSets = differenceSets;
|
|
function mapMap(map, callback) {
|
|
const result = /* @__PURE__ */ new Map();
|
|
map.forEach((value, key2) => {
|
|
result.set(key2, callback(value, key2));
|
|
});
|
|
return result;
|
|
}
|
|
var Recoil_mapMap = mapMap;
|
|
function graph() {
|
|
return {
|
|
nodeDeps: /* @__PURE__ */ new Map(),
|
|
nodeToNodeSubscriptions: /* @__PURE__ */ new Map()
|
|
};
|
|
}
|
|
function cloneGraph(graph2) {
|
|
return {
|
|
nodeDeps: Recoil_mapMap(graph2.nodeDeps, (s5) => new Set(s5)),
|
|
nodeToNodeSubscriptions: Recoil_mapMap(graph2.nodeToNodeSubscriptions, (s5) => new Set(s5))
|
|
};
|
|
}
|
|
function mergeDependencyMapIntoGraph(deps, graph2, olderGraph) {
|
|
const {
|
|
nodeDeps,
|
|
nodeToNodeSubscriptions
|
|
} = graph2;
|
|
deps.forEach((upstreams, downstream) => {
|
|
const existingUpstreams = nodeDeps.get(downstream);
|
|
if (existingUpstreams && olderGraph && existingUpstreams !== olderGraph.nodeDeps.get(downstream)) {
|
|
return;
|
|
}
|
|
nodeDeps.set(downstream, new Set(upstreams));
|
|
const addedUpstreams = existingUpstreams == null ? upstreams : Recoil_differenceSets(upstreams, existingUpstreams);
|
|
addedUpstreams.forEach((upstream) => {
|
|
if (!nodeToNodeSubscriptions.has(upstream)) {
|
|
nodeToNodeSubscriptions.set(upstream, /* @__PURE__ */ new Set());
|
|
}
|
|
const existing = Recoil_nullthrows(nodeToNodeSubscriptions.get(upstream));
|
|
existing.add(downstream);
|
|
});
|
|
if (existingUpstreams) {
|
|
const removedUpstreams = Recoil_differenceSets(existingUpstreams, upstreams);
|
|
removedUpstreams.forEach((upstream) => {
|
|
if (!nodeToNodeSubscriptions.has(upstream)) {
|
|
return;
|
|
}
|
|
const existing = Recoil_nullthrows(nodeToNodeSubscriptions.get(upstream));
|
|
existing.delete(downstream);
|
|
if (existing.size === 0) {
|
|
nodeToNodeSubscriptions.delete(upstream);
|
|
}
|
|
});
|
|
}
|
|
});
|
|
}
|
|
function saveDependencyMapToStore(dependencyMap, store, version) {
|
|
var _storeState$nextTree, _storeState$previousT, _storeState$previousT2, _storeState$previousT3;
|
|
const storeState = store.getState();
|
|
if (!(version === storeState.currentTree.version || version === ((_storeState$nextTree = storeState.nextTree) === null || _storeState$nextTree === void 0 ? void 0 : _storeState$nextTree.version) || version === ((_storeState$previousT = storeState.previousTree) === null || _storeState$previousT === void 0 ? void 0 : _storeState$previousT.version))) {
|
|
Recoil_recoverableViolation("Tried to save dependencies to a discarded tree");
|
|
}
|
|
const graph2 = store.getGraph(version);
|
|
mergeDependencyMapIntoGraph(dependencyMap, graph2);
|
|
if (version === ((_storeState$previousT2 = storeState.previousTree) === null || _storeState$previousT2 === void 0 ? void 0 : _storeState$previousT2.version)) {
|
|
const currentGraph = store.getGraph(storeState.currentTree.version);
|
|
mergeDependencyMapIntoGraph(dependencyMap, currentGraph, graph2);
|
|
}
|
|
if (version === ((_storeState$previousT3 = storeState.previousTree) === null || _storeState$previousT3 === void 0 ? void 0 : _storeState$previousT3.version) || version === storeState.currentTree.version) {
|
|
var _storeState$nextTree2;
|
|
const nextVersion = (_storeState$nextTree2 = storeState.nextTree) === null || _storeState$nextTree2 === void 0 ? void 0 : _storeState$nextTree2.version;
|
|
if (nextVersion !== void 0) {
|
|
const nextGraph = store.getGraph(nextVersion);
|
|
mergeDependencyMapIntoGraph(dependencyMap, nextGraph, graph2);
|
|
}
|
|
}
|
|
}
|
|
function mergeDepsIntoDependencyMap(from, into) {
|
|
from.forEach((upstreamDeps, downstreamNode) => {
|
|
if (!into.has(downstreamNode)) {
|
|
into.set(downstreamNode, /* @__PURE__ */ new Set());
|
|
}
|
|
const deps = Recoil_nullthrows(into.get(downstreamNode));
|
|
upstreamDeps.forEach((dep) => deps.add(dep));
|
|
});
|
|
}
|
|
function addToDependencyMap(downstream, upstream, dependencyMap) {
|
|
if (!dependencyMap.has(downstream)) {
|
|
dependencyMap.set(downstream, /* @__PURE__ */ new Set());
|
|
}
|
|
Recoil_nullthrows(dependencyMap.get(downstream)).add(upstream);
|
|
}
|
|
var Recoil_Graph = {
|
|
addToDependencyMap,
|
|
cloneGraph,
|
|
graph,
|
|
mergeDepsIntoDependencyMap,
|
|
saveDependencyMapToStore
|
|
};
|
|
function createCommonjsModule(fn2, module2) {
|
|
return module2 = { exports: {} }, fn2(module2, module2.exports), module2.exports;
|
|
}
|
|
var hamt_1 = createCommonjsModule(function(module2) {
|
|
var _typeof5 = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function(obj) {
|
|
return typeof obj;
|
|
} : function(obj) {
|
|
return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj;
|
|
};
|
|
var hamt = {};
|
|
var SIZE = 5;
|
|
var BUCKET_SIZE = Math.pow(2, SIZE);
|
|
var MASK = BUCKET_SIZE - 1;
|
|
var MAX_INDEX_NODE = BUCKET_SIZE / 2;
|
|
var MIN_ARRAY_NODE = BUCKET_SIZE / 4;
|
|
var nothing = {};
|
|
var constant = function constant2(x5) {
|
|
return function() {
|
|
return x5;
|
|
};
|
|
};
|
|
var hash = hamt.hash = function(str) {
|
|
var type = typeof str === "undefined" ? "undefined" : _typeof5(str);
|
|
if (type === "number")
|
|
return str;
|
|
if (type !== "string")
|
|
str += "";
|
|
var hash2 = 0;
|
|
for (var i4 = 0, len = str.length; i4 < len; ++i4) {
|
|
var c4 = str.charCodeAt(i4);
|
|
hash2 = (hash2 << 5) - hash2 + c4 | 0;
|
|
}
|
|
return hash2;
|
|
};
|
|
var popcount = function popcount2(x5) {
|
|
x5 -= x5 >> 1 & 1431655765;
|
|
x5 = (x5 & 858993459) + (x5 >> 2 & 858993459);
|
|
x5 = x5 + (x5 >> 4) & 252645135;
|
|
x5 += x5 >> 8;
|
|
x5 += x5 >> 16;
|
|
return x5 & 127;
|
|
};
|
|
var hashFragment = function hashFragment2(shift, h5) {
|
|
return h5 >>> shift & MASK;
|
|
};
|
|
var toBitmap = function toBitmap2(x5) {
|
|
return 1 << x5;
|
|
};
|
|
var fromBitmap = function fromBitmap2(bitmap, bit) {
|
|
return popcount(bitmap & bit - 1);
|
|
};
|
|
var arrayUpdate = function arrayUpdate2(mutate2, at, v3, arr) {
|
|
var out = arr;
|
|
if (!mutate2) {
|
|
var len = arr.length;
|
|
out = new Array(len);
|
|
for (var i4 = 0; i4 < len; ++i4) {
|
|
out[i4] = arr[i4];
|
|
}
|
|
}
|
|
out[at] = v3;
|
|
return out;
|
|
};
|
|
var arraySpliceOut = function arraySpliceOut2(mutate2, at, arr) {
|
|
var newLen = arr.length - 1;
|
|
var i4 = 0;
|
|
var g4 = 0;
|
|
var out = arr;
|
|
if (mutate2) {
|
|
i4 = g4 = at;
|
|
} else {
|
|
out = new Array(newLen);
|
|
while (i4 < at) {
|
|
out[g4++] = arr[i4++];
|
|
}
|
|
}
|
|
++i4;
|
|
while (i4 <= newLen) {
|
|
out[g4++] = arr[i4++];
|
|
}
|
|
if (mutate2) {
|
|
out.length = newLen;
|
|
}
|
|
return out;
|
|
};
|
|
var arraySpliceIn = function arraySpliceIn2(mutate2, at, v3, arr) {
|
|
var len = arr.length;
|
|
if (mutate2) {
|
|
var _i = len;
|
|
while (_i >= at) {
|
|
arr[_i--] = arr[_i];
|
|
}
|
|
arr[at] = v3;
|
|
return arr;
|
|
}
|
|
var i4 = 0, g4 = 0;
|
|
var out = new Array(len + 1);
|
|
while (i4 < at) {
|
|
out[g4++] = arr[i4++];
|
|
}
|
|
out[at] = v3;
|
|
while (i4 < len) {
|
|
out[++g4] = arr[i4++];
|
|
}
|
|
return out;
|
|
};
|
|
var LEAF = 1;
|
|
var COLLISION = 2;
|
|
var INDEX = 3;
|
|
var ARRAY = 4;
|
|
var empty = {
|
|
__hamt_isEmpty: true
|
|
};
|
|
var isEmptyNode = function isEmptyNode2(x5) {
|
|
return x5 === empty || x5 && x5.__hamt_isEmpty;
|
|
};
|
|
var Leaf = function Leaf2(edit, hash2, key2, value) {
|
|
return {
|
|
type: LEAF,
|
|
edit,
|
|
hash: hash2,
|
|
key: key2,
|
|
value,
|
|
_modify: Leaf__modify
|
|
};
|
|
};
|
|
var Collision = function Collision2(edit, hash2, children) {
|
|
return {
|
|
type: COLLISION,
|
|
edit,
|
|
hash: hash2,
|
|
children,
|
|
_modify: Collision__modify
|
|
};
|
|
};
|
|
var IndexedNode = function IndexedNode2(edit, mask, children) {
|
|
return {
|
|
type: INDEX,
|
|
edit,
|
|
mask,
|
|
children,
|
|
_modify: IndexedNode__modify
|
|
};
|
|
};
|
|
var ArrayNode = function ArrayNode2(edit, size, children) {
|
|
return {
|
|
type: ARRAY,
|
|
edit,
|
|
size,
|
|
children,
|
|
_modify: ArrayNode__modify
|
|
};
|
|
};
|
|
var isLeaf = function isLeaf2(node) {
|
|
return node === empty || node.type === LEAF || node.type === COLLISION;
|
|
};
|
|
var expand = function expand2(edit, frag, child, bitmap, subNodes) {
|
|
var arr = [];
|
|
var bit = bitmap;
|
|
var count3 = 0;
|
|
for (var i4 = 0; bit; ++i4) {
|
|
if (bit & 1)
|
|
arr[i4] = subNodes[count3++];
|
|
bit >>>= 1;
|
|
}
|
|
arr[frag] = child;
|
|
return ArrayNode(edit, count3 + 1, arr);
|
|
};
|
|
var pack = function pack2(edit, count3, removed, elements) {
|
|
var children = new Array(count3 - 1);
|
|
var g4 = 0;
|
|
var bitmap = 0;
|
|
for (var i4 = 0, len = elements.length; i4 < len; ++i4) {
|
|
if (i4 !== removed) {
|
|
var elem = elements[i4];
|
|
if (elem && !isEmptyNode(elem)) {
|
|
children[g4++] = elem;
|
|
bitmap |= 1 << i4;
|
|
}
|
|
}
|
|
}
|
|
return IndexedNode(edit, bitmap, children);
|
|
};
|
|
var mergeLeaves = function mergeLeaves2(edit, shift, h1, n1, h22, n2) {
|
|
if (h1 === h22)
|
|
return Collision(edit, h1, [n2, n1]);
|
|
var subH1 = hashFragment(shift, h1);
|
|
var subH2 = hashFragment(shift, h22);
|
|
return IndexedNode(edit, toBitmap(subH1) | toBitmap(subH2), subH1 === subH2 ? [mergeLeaves2(edit, shift + SIZE, h1, n1, h22, n2)] : subH1 < subH2 ? [n1, n2] : [n2, n1]);
|
|
};
|
|
var updateCollisionList = function updateCollisionList2(mutate2, edit, keyEq, h5, list, f4, k5, size) {
|
|
var len = list.length;
|
|
for (var i4 = 0; i4 < len; ++i4) {
|
|
var child = list[i4];
|
|
if (keyEq(k5, child.key)) {
|
|
var value = child.value;
|
|
var _newValue = f4(value);
|
|
if (_newValue === value)
|
|
return list;
|
|
if (_newValue === nothing) {
|
|
--size.value;
|
|
return arraySpliceOut(mutate2, i4, list);
|
|
}
|
|
return arrayUpdate(mutate2, i4, Leaf(edit, h5, k5, _newValue), list);
|
|
}
|
|
}
|
|
var newValue = f4();
|
|
if (newValue === nothing)
|
|
return list;
|
|
++size.value;
|
|
return arrayUpdate(mutate2, len, Leaf(edit, h5, k5, newValue), list);
|
|
};
|
|
var canEditNode = function canEditNode2(edit, node) {
|
|
return edit === node.edit;
|
|
};
|
|
var Leaf__modify = function Leaf__modify2(edit, keyEq, shift, f4, h5, k5, size) {
|
|
if (keyEq(k5, this.key)) {
|
|
var _v = f4(this.value);
|
|
if (_v === this.value)
|
|
return this;
|
|
else if (_v === nothing) {
|
|
--size.value;
|
|
return empty;
|
|
}
|
|
if (canEditNode(edit, this)) {
|
|
this.value = _v;
|
|
return this;
|
|
}
|
|
return Leaf(edit, h5, k5, _v);
|
|
}
|
|
var v3 = f4();
|
|
if (v3 === nothing)
|
|
return this;
|
|
++size.value;
|
|
return mergeLeaves(edit, shift, this.hash, this, h5, Leaf(edit, h5, k5, v3));
|
|
};
|
|
var Collision__modify = function Collision__modify2(edit, keyEq, shift, f4, h5, k5, size) {
|
|
if (h5 === this.hash) {
|
|
var canEdit = canEditNode(edit, this);
|
|
var list = updateCollisionList(canEdit, edit, keyEq, this.hash, this.children, f4, k5, size);
|
|
if (list === this.children)
|
|
return this;
|
|
return list.length > 1 ? Collision(edit, this.hash, list) : list[0];
|
|
}
|
|
var v3 = f4();
|
|
if (v3 === nothing)
|
|
return this;
|
|
++size.value;
|
|
return mergeLeaves(edit, shift, this.hash, this, h5, Leaf(edit, h5, k5, v3));
|
|
};
|
|
var IndexedNode__modify = function IndexedNode__modify2(edit, keyEq, shift, f4, h5, k5, size) {
|
|
var mask = this.mask;
|
|
var children = this.children;
|
|
var frag = hashFragment(shift, h5);
|
|
var bit = toBitmap(frag);
|
|
var indx = fromBitmap(mask, bit);
|
|
var exists = mask & bit;
|
|
var current = exists ? children[indx] : empty;
|
|
var child = current._modify(edit, keyEq, shift + SIZE, f4, h5, k5, size);
|
|
if (current === child)
|
|
return this;
|
|
var canEdit = canEditNode(edit, this);
|
|
var bitmap = mask;
|
|
var newChildren = void 0;
|
|
if (exists && isEmptyNode(child)) {
|
|
bitmap &= ~bit;
|
|
if (!bitmap)
|
|
return empty;
|
|
if (children.length <= 2 && isLeaf(children[indx ^ 1]))
|
|
return children[indx ^ 1];
|
|
newChildren = arraySpliceOut(canEdit, indx, children);
|
|
} else if (!exists && !isEmptyNode(child)) {
|
|
if (children.length >= MAX_INDEX_NODE)
|
|
return expand(edit, frag, child, mask, children);
|
|
bitmap |= bit;
|
|
newChildren = arraySpliceIn(canEdit, indx, child, children);
|
|
} else {
|
|
newChildren = arrayUpdate(canEdit, indx, child, children);
|
|
}
|
|
if (canEdit) {
|
|
this.mask = bitmap;
|
|
this.children = newChildren;
|
|
return this;
|
|
}
|
|
return IndexedNode(edit, bitmap, newChildren);
|
|
};
|
|
var ArrayNode__modify = function ArrayNode__modify2(edit, keyEq, shift, f4, h5, k5, size) {
|
|
var count3 = this.size;
|
|
var children = this.children;
|
|
var frag = hashFragment(shift, h5);
|
|
var child = children[frag];
|
|
var newChild = (child || empty)._modify(edit, keyEq, shift + SIZE, f4, h5, k5, size);
|
|
if (child === newChild)
|
|
return this;
|
|
var canEdit = canEditNode(edit, this);
|
|
var newChildren = void 0;
|
|
if (isEmptyNode(child) && !isEmptyNode(newChild)) {
|
|
++count3;
|
|
newChildren = arrayUpdate(canEdit, frag, newChild, children);
|
|
} else if (!isEmptyNode(child) && isEmptyNode(newChild)) {
|
|
--count3;
|
|
if (count3 <= MIN_ARRAY_NODE)
|
|
return pack(edit, count3, frag, children);
|
|
newChildren = arrayUpdate(canEdit, frag, empty, children);
|
|
} else {
|
|
newChildren = arrayUpdate(canEdit, frag, newChild, children);
|
|
}
|
|
if (canEdit) {
|
|
this.size = count3;
|
|
this.children = newChildren;
|
|
return this;
|
|
}
|
|
return ArrayNode(edit, count3, newChildren);
|
|
};
|
|
empty._modify = function(edit, keyEq, shift, f4, h5, k5, size) {
|
|
var v3 = f4();
|
|
if (v3 === nothing)
|
|
return empty;
|
|
++size.value;
|
|
return Leaf(edit, h5, k5, v3);
|
|
};
|
|
function Map2(editable, edit, config, root, size) {
|
|
this._editable = editable;
|
|
this._edit = edit;
|
|
this._config = config;
|
|
this._root = root;
|
|
this._size = size;
|
|
}
|
|
Map2.prototype.setTree = function(newRoot, newSize) {
|
|
if (this._editable) {
|
|
this._root = newRoot;
|
|
this._size = newSize;
|
|
return this;
|
|
}
|
|
return newRoot === this._root ? this : new Map2(this._editable, this._edit, this._config, newRoot, newSize);
|
|
};
|
|
var tryGetHash = hamt.tryGetHash = function(alt, hash2, key2, map) {
|
|
var node = map._root;
|
|
var shift = 0;
|
|
var keyEq = map._config.keyEq;
|
|
while (true) {
|
|
switch (node.type) {
|
|
case LEAF: {
|
|
return keyEq(key2, node.key) ? node.value : alt;
|
|
}
|
|
case COLLISION: {
|
|
if (hash2 === node.hash) {
|
|
var children = node.children;
|
|
for (var i4 = 0, len = children.length; i4 < len; ++i4) {
|
|
var child = children[i4];
|
|
if (keyEq(key2, child.key))
|
|
return child.value;
|
|
}
|
|
}
|
|
return alt;
|
|
}
|
|
case INDEX: {
|
|
var frag = hashFragment(shift, hash2);
|
|
var bit = toBitmap(frag);
|
|
if (node.mask & bit) {
|
|
node = node.children[fromBitmap(node.mask, bit)];
|
|
shift += SIZE;
|
|
break;
|
|
}
|
|
return alt;
|
|
}
|
|
case ARRAY: {
|
|
node = node.children[hashFragment(shift, hash2)];
|
|
if (node) {
|
|
shift += SIZE;
|
|
break;
|
|
}
|
|
return alt;
|
|
}
|
|
default:
|
|
return alt;
|
|
}
|
|
}
|
|
};
|
|
Map2.prototype.tryGetHash = function(alt, hash2, key2) {
|
|
return tryGetHash(alt, hash2, key2, this);
|
|
};
|
|
var tryGet = hamt.tryGet = function(alt, key2, map) {
|
|
return tryGetHash(alt, map._config.hash(key2), key2, map);
|
|
};
|
|
Map2.prototype.tryGet = function(alt, key2) {
|
|
return tryGet(alt, key2, this);
|
|
};
|
|
var getHash = hamt.getHash = function(hash2, key2, map) {
|
|
return tryGetHash(void 0, hash2, key2, map);
|
|
};
|
|
Map2.prototype.getHash = function(hash2, key2) {
|
|
return getHash(hash2, key2, this);
|
|
};
|
|
var get = hamt.get = function(key2, map) {
|
|
return tryGetHash(void 0, map._config.hash(key2), key2, map);
|
|
};
|
|
Map2.prototype.get = function(key2, alt) {
|
|
return tryGet(alt, key2, this);
|
|
};
|
|
var hasHash = hamt.has = function(hash2, key2, map) {
|
|
return tryGetHash(nothing, hash2, key2, map) !== nothing;
|
|
};
|
|
Map2.prototype.hasHash = function(hash2, key2) {
|
|
return hasHash(hash2, key2, this);
|
|
};
|
|
var has = hamt.has = function(key2, map) {
|
|
return hasHash(map._config.hash(key2), key2, map);
|
|
};
|
|
Map2.prototype.has = function(key2) {
|
|
return has(key2, this);
|
|
};
|
|
var defKeyCompare = function defKeyCompare2(x5, y5) {
|
|
return x5 === y5;
|
|
};
|
|
hamt.make = function(config) {
|
|
return new Map2(0, 0, {
|
|
keyEq: config && config.keyEq || defKeyCompare,
|
|
hash: config && config.hash || hash
|
|
}, empty, 0);
|
|
};
|
|
hamt.empty = hamt.make();
|
|
var isEmpty = hamt.isEmpty = function(map) {
|
|
return map && !!isEmptyNode(map._root);
|
|
};
|
|
Map2.prototype.isEmpty = function() {
|
|
return isEmpty(this);
|
|
};
|
|
var modifyHash = hamt.modifyHash = function(f4, hash2, key2, map) {
|
|
var size = {
|
|
value: map._size
|
|
};
|
|
var newRoot = map._root._modify(map._editable ? map._edit : NaN, map._config.keyEq, 0, f4, hash2, key2, size);
|
|
return map.setTree(newRoot, size.value);
|
|
};
|
|
Map2.prototype.modifyHash = function(hash2, key2, f4) {
|
|
return modifyHash(f4, hash2, key2, this);
|
|
};
|
|
var modify = hamt.modify = function(f4, key2, map) {
|
|
return modifyHash(f4, map._config.hash(key2), key2, map);
|
|
};
|
|
Map2.prototype.modify = function(key2, f4) {
|
|
return modify(f4, key2, this);
|
|
};
|
|
var setHash = hamt.setHash = function(hash2, key2, value, map) {
|
|
return modifyHash(constant(value), hash2, key2, map);
|
|
};
|
|
Map2.prototype.setHash = function(hash2, key2, value) {
|
|
return setHash(hash2, key2, value, this);
|
|
};
|
|
var set = hamt.set = function(key2, value, map) {
|
|
return setHash(map._config.hash(key2), key2, value, map);
|
|
};
|
|
Map2.prototype.set = function(key2, value) {
|
|
return set(key2, value, this);
|
|
};
|
|
var del = constant(nothing);
|
|
var removeHash = hamt.removeHash = function(hash2, key2, map) {
|
|
return modifyHash(del, hash2, key2, map);
|
|
};
|
|
Map2.prototype.removeHash = Map2.prototype.deleteHash = function(hash2, key2) {
|
|
return removeHash(hash2, key2, this);
|
|
};
|
|
var remove = hamt.remove = function(key2, map) {
|
|
return removeHash(map._config.hash(key2), key2, map);
|
|
};
|
|
Map2.prototype.remove = Map2.prototype.delete = function(key2) {
|
|
return remove(key2, this);
|
|
};
|
|
var beginMutation = hamt.beginMutation = function(map) {
|
|
return new Map2(map._editable + 1, map._edit + 1, map._config, map._root, map._size);
|
|
};
|
|
Map2.prototype.beginMutation = function() {
|
|
return beginMutation(this);
|
|
};
|
|
var endMutation = hamt.endMutation = function(map) {
|
|
map._editable = map._editable && map._editable - 1;
|
|
return map;
|
|
};
|
|
Map2.prototype.endMutation = function() {
|
|
return endMutation(this);
|
|
};
|
|
var mutate = hamt.mutate = function(f4, map) {
|
|
var transient = beginMutation(map);
|
|
f4(transient);
|
|
return endMutation(transient);
|
|
};
|
|
Map2.prototype.mutate = function(f4) {
|
|
return mutate(f4, this);
|
|
};
|
|
var appk = function appk2(k5) {
|
|
return k5 && lazyVisitChildren(k5[0], k5[1], k5[2], k5[3], k5[4]);
|
|
};
|
|
var lazyVisitChildren = function lazyVisitChildren2(len, children, i4, f4, k5) {
|
|
while (i4 < len) {
|
|
var child = children[i4++];
|
|
if (child && !isEmptyNode(child))
|
|
return lazyVisit(child, f4, [len, children, i4, f4, k5]);
|
|
}
|
|
return appk(k5);
|
|
};
|
|
var lazyVisit = function lazyVisit2(node, f4, k5) {
|
|
switch (node.type) {
|
|
case LEAF:
|
|
return {
|
|
value: f4(node),
|
|
rest: k5
|
|
};
|
|
case COLLISION:
|
|
case ARRAY:
|
|
case INDEX:
|
|
var children = node.children;
|
|
return lazyVisitChildren(children.length, children, 0, f4, k5);
|
|
default:
|
|
return appk(k5);
|
|
}
|
|
};
|
|
var DONE = {
|
|
done: true
|
|
};
|
|
function MapIterator(v3) {
|
|
this.v = v3;
|
|
}
|
|
MapIterator.prototype.next = function() {
|
|
if (!this.v)
|
|
return DONE;
|
|
var v0 = this.v;
|
|
this.v = appk(v0.rest);
|
|
return v0;
|
|
};
|
|
MapIterator.prototype[Symbol.iterator] = function() {
|
|
return this;
|
|
};
|
|
var visit = function visit2(map, f4) {
|
|
return new MapIterator(lazyVisit(map._root, f4));
|
|
};
|
|
var buildPairs = function buildPairs2(x5) {
|
|
return [x5.key, x5.value];
|
|
};
|
|
var entries = hamt.entries = function(map) {
|
|
return visit(map, buildPairs);
|
|
};
|
|
Map2.prototype.entries = Map2.prototype[Symbol.iterator] = function() {
|
|
return entries(this);
|
|
};
|
|
var buildKeys = function buildKeys2(x5) {
|
|
return x5.key;
|
|
};
|
|
var keys = hamt.keys = function(map) {
|
|
return visit(map, buildKeys);
|
|
};
|
|
Map2.prototype.keys = function() {
|
|
return keys(this);
|
|
};
|
|
var buildValues = function buildValues2(x5) {
|
|
return x5.value;
|
|
};
|
|
var values = hamt.values = Map2.prototype.values = function(map) {
|
|
return visit(map, buildValues);
|
|
};
|
|
Map2.prototype.values = function() {
|
|
return values(this);
|
|
};
|
|
var fold = hamt.fold = function(f4, z5, m5) {
|
|
var root = m5._root;
|
|
if (root.type === LEAF)
|
|
return f4(z5, root.value, root.key);
|
|
var toVisit = [root.children];
|
|
var children = void 0;
|
|
while (children = toVisit.pop()) {
|
|
for (var i4 = 0, len = children.length; i4 < len; ) {
|
|
var child = children[i4++];
|
|
if (child && child.type) {
|
|
if (child.type === LEAF)
|
|
z5 = f4(z5, child.value, child.key);
|
|
else
|
|
toVisit.push(child.children);
|
|
}
|
|
}
|
|
}
|
|
return z5;
|
|
};
|
|
Map2.prototype.fold = function(f4, z5) {
|
|
return fold(f4, z5, this);
|
|
};
|
|
var forEach = hamt.forEach = function(f4, map) {
|
|
return fold(function(_5, value, key2) {
|
|
return f4(value, key2, map);
|
|
}, null, map);
|
|
};
|
|
Map2.prototype.forEach = function(f4) {
|
|
return forEach(f4, this);
|
|
};
|
|
var count2 = hamt.count = function(map) {
|
|
return map._size;
|
|
};
|
|
Map2.prototype.count = function() {
|
|
return count2(this);
|
|
};
|
|
Object.defineProperty(Map2.prototype, "size", {
|
|
get: Map2.prototype.count
|
|
});
|
|
if (module2.exports) {
|
|
module2.exports = hamt;
|
|
} else {
|
|
(void 0).hamt = hamt;
|
|
}
|
|
});
|
|
var BuiltInMap = class {
|
|
constructor(existing) {
|
|
_defineProperty(this, "_map", void 0);
|
|
this._map = new Map(existing === null || existing === void 0 ? void 0 : existing.entries());
|
|
}
|
|
keys() {
|
|
return this._map.keys();
|
|
}
|
|
entries() {
|
|
return this._map.entries();
|
|
}
|
|
get(k5) {
|
|
return this._map.get(k5);
|
|
}
|
|
has(k5) {
|
|
return this._map.has(k5);
|
|
}
|
|
set(k5, v3) {
|
|
this._map.set(k5, v3);
|
|
return this;
|
|
}
|
|
delete(k5) {
|
|
this._map.delete(k5);
|
|
return this;
|
|
}
|
|
clone() {
|
|
return persistentMap(this);
|
|
}
|
|
toMap() {
|
|
return new Map(this._map);
|
|
}
|
|
};
|
|
var HashArrayMappedTrieMap = class {
|
|
constructor(existing) {
|
|
_defineProperty(this, "_hamt", hamt_1.empty.beginMutation());
|
|
if (existing instanceof HashArrayMappedTrieMap) {
|
|
const h5 = existing._hamt.endMutation();
|
|
existing._hamt = h5.beginMutation();
|
|
this._hamt = h5.beginMutation();
|
|
} else if (existing) {
|
|
for (const [k5, v3] of existing.entries()) {
|
|
this._hamt.set(k5, v3);
|
|
}
|
|
}
|
|
}
|
|
keys() {
|
|
return this._hamt.keys();
|
|
}
|
|
entries() {
|
|
return this._hamt.entries();
|
|
}
|
|
get(k5) {
|
|
return this._hamt.get(k5);
|
|
}
|
|
has(k5) {
|
|
return this._hamt.has(k5);
|
|
}
|
|
set(k5, v3) {
|
|
this._hamt.set(k5, v3);
|
|
return this;
|
|
}
|
|
delete(k5) {
|
|
this._hamt.delete(k5);
|
|
return this;
|
|
}
|
|
clone() {
|
|
return persistentMap(this);
|
|
}
|
|
toMap() {
|
|
return new Map(this._hamt);
|
|
}
|
|
};
|
|
function persistentMap(existing) {
|
|
if (Recoil_gkx_1("recoil_hamt_2020")) {
|
|
return new HashArrayMappedTrieMap(existing);
|
|
} else {
|
|
return new BuiltInMap(existing);
|
|
}
|
|
}
|
|
var Recoil_PersistentMap = {
|
|
persistentMap
|
|
};
|
|
var Recoil_PersistentMap_1 = Recoil_PersistentMap.persistentMap;
|
|
var Recoil_PersistentMap$1 = /* @__PURE__ */ Object.freeze({
|
|
__proto__: null,
|
|
persistentMap: Recoil_PersistentMap_1
|
|
});
|
|
var {
|
|
graph: graph$1
|
|
} = Recoil_Graph;
|
|
var {
|
|
persistentMap: persistentMap$1
|
|
} = Recoil_PersistentMap$1;
|
|
var nextTreeStateVersion = 0;
|
|
var getNextTreeStateVersion = () => nextTreeStateVersion++;
|
|
function makeEmptyTreeState() {
|
|
const version = getNextTreeStateVersion();
|
|
return {
|
|
version,
|
|
stateID: version,
|
|
transactionMetadata: {},
|
|
dirtyAtoms: /* @__PURE__ */ new Set(),
|
|
atomValues: persistentMap$1(),
|
|
nonvalidatedAtoms: persistentMap$1()
|
|
};
|
|
}
|
|
function makeEmptyStoreState() {
|
|
const currentTree = makeEmptyTreeState();
|
|
return {
|
|
currentTree,
|
|
nextTree: null,
|
|
previousTree: null,
|
|
commitDepth: 0,
|
|
knownAtoms: /* @__PURE__ */ new Set(),
|
|
knownSelectors: /* @__PURE__ */ new Set(),
|
|
transactionSubscriptions: /* @__PURE__ */ new Map(),
|
|
nodeTransactionSubscriptions: /* @__PURE__ */ new Map(),
|
|
nodeToComponentSubscriptions: /* @__PURE__ */ new Map(),
|
|
queuedComponentCallbacks_DEPRECATED: [],
|
|
suspendedComponentResolvers: /* @__PURE__ */ new Set(),
|
|
graphsByVersion: (/* @__PURE__ */ new Map()).set(currentTree.version, graph$1()),
|
|
versionsUsedByComponent: /* @__PURE__ */ new Map(),
|
|
retention: {
|
|
referenceCounts: /* @__PURE__ */ new Map(),
|
|
nodesRetainedByZone: /* @__PURE__ */ new Map(),
|
|
retainablesToCheckForRelease: /* @__PURE__ */ new Set()
|
|
},
|
|
nodeCleanupFunctions: /* @__PURE__ */ new Map()
|
|
};
|
|
}
|
|
var Recoil_State = {
|
|
makeEmptyTreeState,
|
|
makeEmptyStoreState,
|
|
getNextTreeStateVersion
|
|
};
|
|
function unionSets(...sets) {
|
|
const result = /* @__PURE__ */ new Set();
|
|
for (const set of sets) {
|
|
for (const value of set) {
|
|
result.add(value);
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
var Recoil_unionSets = unionSets;
|
|
function someSet(set, callback, context) {
|
|
const iterator = set.entries();
|
|
let current = iterator.next();
|
|
while (!current.done) {
|
|
const entry = current.value;
|
|
if (callback.call(context, entry[1], entry[0], set)) {
|
|
return true;
|
|
}
|
|
current = iterator.next();
|
|
}
|
|
return false;
|
|
}
|
|
var Recoil_someSet = someSet;
|
|
var {
|
|
cleanUpNode: cleanUpNode$1
|
|
} = Recoil_FunctionalCore;
|
|
var {
|
|
deleteNodeConfigIfPossible: deleteNodeConfigIfPossible$1,
|
|
getNode: getNode$2
|
|
} = Recoil_Node;
|
|
var {
|
|
RetentionZone: RetentionZone$2
|
|
} = Recoil_RetentionZone;
|
|
var emptySet$1 = /* @__PURE__ */ new Set();
|
|
function releaseRetainablesNowOnCurrentTree(store, retainables) {
|
|
const storeState = store.getState();
|
|
const treeState = storeState.currentTree;
|
|
if (storeState.nextTree) {
|
|
Recoil_recoverableViolation("releaseNodesNowOnCurrentTree should only be called at the end of a batch");
|
|
return;
|
|
}
|
|
const nodes2 = /* @__PURE__ */ new Set();
|
|
for (const r3 of retainables) {
|
|
if (r3 instanceof RetentionZone$2) {
|
|
for (const n2 of nodesRetainedByZone(storeState, r3)) {
|
|
nodes2.add(n2);
|
|
}
|
|
} else {
|
|
nodes2.add(r3);
|
|
}
|
|
}
|
|
const releasableNodes = findReleasableNodes(store, nodes2);
|
|
for (const node of releasableNodes) {
|
|
releaseNode(store, treeState, node);
|
|
}
|
|
}
|
|
function findReleasableNodes(store, searchFromNodes) {
|
|
const storeState = store.getState();
|
|
const treeState = storeState.currentTree;
|
|
const graph2 = store.getGraph(treeState.version);
|
|
const releasableNodes = /* @__PURE__ */ new Set();
|
|
const nonReleasableNodes = /* @__PURE__ */ new Set();
|
|
findReleasableNodesInner(searchFromNodes);
|
|
return releasableNodes;
|
|
function findReleasableNodesInner(searchFromNodes2) {
|
|
const releasableNodesFoundThisIteration = /* @__PURE__ */ new Set();
|
|
const downstreams = getDownstreamNodesInTopologicalOrder(
|
|
store,
|
|
treeState,
|
|
searchFromNodes2,
|
|
releasableNodes,
|
|
nonReleasableNodes
|
|
);
|
|
for (const node of downstreams) {
|
|
var _storeState$retention;
|
|
if (getNode$2(node).retainedBy === "recoilRoot") {
|
|
nonReleasableNodes.add(node);
|
|
continue;
|
|
}
|
|
if (((_storeState$retention = storeState.retention.referenceCounts.get(node)) !== null && _storeState$retention !== void 0 ? _storeState$retention : 0) > 0) {
|
|
nonReleasableNodes.add(node);
|
|
continue;
|
|
}
|
|
if (zonesThatCouldRetainNode(node).some((z5) => storeState.retention.referenceCounts.get(z5))) {
|
|
nonReleasableNodes.add(node);
|
|
continue;
|
|
}
|
|
const nodeChildren = graph2.nodeToNodeSubscriptions.get(node);
|
|
if (nodeChildren && Recoil_someSet(nodeChildren, (child) => nonReleasableNodes.has(child))) {
|
|
nonReleasableNodes.add(node);
|
|
continue;
|
|
}
|
|
releasableNodes.add(node);
|
|
releasableNodesFoundThisIteration.add(node);
|
|
}
|
|
const parents = /* @__PURE__ */ new Set();
|
|
for (const node of releasableNodesFoundThisIteration) {
|
|
for (const parent of (_graph$nodeDeps$get = graph2.nodeDeps.get(node)) !== null && _graph$nodeDeps$get !== void 0 ? _graph$nodeDeps$get : emptySet$1) {
|
|
var _graph$nodeDeps$get;
|
|
if (!releasableNodes.has(parent)) {
|
|
parents.add(parent);
|
|
}
|
|
}
|
|
}
|
|
if (parents.size) {
|
|
findReleasableNodesInner(parents);
|
|
}
|
|
}
|
|
}
|
|
function getDownstreamNodesInTopologicalOrder(store, treeState, nodes2, doNotDescendInto1, doNotDescendInto2) {
|
|
const graph2 = store.getGraph(treeState.version);
|
|
const answer = [];
|
|
const visited = /* @__PURE__ */ new Set();
|
|
while (nodes2.size > 0) {
|
|
visit(Recoil_nullthrows(nodes2.values().next().value));
|
|
}
|
|
return answer;
|
|
function visit(node) {
|
|
if (doNotDescendInto1.has(node) || doNotDescendInto2.has(node)) {
|
|
nodes2.delete(node);
|
|
return;
|
|
}
|
|
if (visited.has(node)) {
|
|
return;
|
|
}
|
|
const children = graph2.nodeToNodeSubscriptions.get(node);
|
|
if (children) {
|
|
for (const child of children) {
|
|
visit(child);
|
|
}
|
|
}
|
|
visited.add(node);
|
|
nodes2.delete(node);
|
|
answer.push(node);
|
|
}
|
|
}
|
|
function releaseNode(store, treeState, node) {
|
|
if (!Recoil_gkx_1("recoil_memory_managament_2020")) {
|
|
return;
|
|
}
|
|
cleanUpNode$1(store, node);
|
|
const storeState = store.getState();
|
|
storeState.knownAtoms.delete(node);
|
|
storeState.knownSelectors.delete(node);
|
|
storeState.nodeTransactionSubscriptions.delete(node);
|
|
storeState.retention.referenceCounts.delete(node);
|
|
const zones = zonesThatCouldRetainNode(node);
|
|
for (const zone of zones) {
|
|
var _storeState$retention2;
|
|
(_storeState$retention2 = storeState.retention.nodesRetainedByZone.get(zone)) === null || _storeState$retention2 === void 0 ? void 0 : _storeState$retention2.delete(node);
|
|
}
|
|
treeState.atomValues.delete(node);
|
|
treeState.dirtyAtoms.delete(node);
|
|
treeState.nonvalidatedAtoms.delete(node);
|
|
const graph2 = storeState.graphsByVersion.get(treeState.version);
|
|
if (graph2) {
|
|
const deps = graph2.nodeDeps.get(node);
|
|
if (deps !== void 0) {
|
|
graph2.nodeDeps.delete(node);
|
|
for (const dep of deps) {
|
|
var _graph$nodeToNodeSubs;
|
|
(_graph$nodeToNodeSubs = graph2.nodeToNodeSubscriptions.get(dep)) === null || _graph$nodeToNodeSubs === void 0 ? void 0 : _graph$nodeToNodeSubs.delete(node);
|
|
}
|
|
}
|
|
graph2.nodeToNodeSubscriptions.delete(node);
|
|
}
|
|
deleteNodeConfigIfPossible$1(node);
|
|
}
|
|
function nodesRetainedByZone(storeState, zone) {
|
|
var _storeState$retention3;
|
|
return (_storeState$retention3 = storeState.retention.nodesRetainedByZone.get(zone)) !== null && _storeState$retention3 !== void 0 ? _storeState$retention3 : emptySet$1;
|
|
}
|
|
function zonesThatCouldRetainNode(node) {
|
|
const retainedBy = getNode$2(node).retainedBy;
|
|
if (retainedBy === void 0 || retainedBy === "components" || retainedBy === "recoilRoot") {
|
|
return [];
|
|
} else if (retainedBy instanceof RetentionZone$2) {
|
|
return [retainedBy];
|
|
} else {
|
|
return retainedBy;
|
|
}
|
|
}
|
|
function scheduleOrPerformPossibleReleaseOfRetainable(store, retainable) {
|
|
const state = store.getState();
|
|
if (state.nextTree) {
|
|
state.retention.retainablesToCheckForRelease.add(retainable);
|
|
} else {
|
|
releaseRetainablesNowOnCurrentTree(store, /* @__PURE__ */ new Set([retainable]));
|
|
}
|
|
}
|
|
function updateRetainCount(store, retainable, delta) {
|
|
var _map$get;
|
|
if (!Recoil_gkx_1("recoil_memory_managament_2020")) {
|
|
return;
|
|
}
|
|
const map = store.getState().retention.referenceCounts;
|
|
const newCount = ((_map$get = map.get(retainable)) !== null && _map$get !== void 0 ? _map$get : 0) + delta;
|
|
if (newCount === 0) {
|
|
updateRetainCountToZero(store, retainable);
|
|
} else {
|
|
map.set(retainable, newCount);
|
|
}
|
|
}
|
|
function updateRetainCountToZero(store, retainable) {
|
|
if (!Recoil_gkx_1("recoil_memory_managament_2020")) {
|
|
return;
|
|
}
|
|
const map = store.getState().retention.referenceCounts;
|
|
map.delete(retainable);
|
|
scheduleOrPerformPossibleReleaseOfRetainable(store, retainable);
|
|
}
|
|
function releaseScheduledRetainablesNow(store) {
|
|
if (!Recoil_gkx_1("recoil_memory_managament_2020")) {
|
|
return;
|
|
}
|
|
const state = store.getState();
|
|
releaseRetainablesNowOnCurrentTree(store, state.retention.retainablesToCheckForRelease);
|
|
state.retention.retainablesToCheckForRelease.clear();
|
|
}
|
|
function retainedByOptionWithDefault(r3) {
|
|
return r3 === void 0 ? "recoilRoot" : r3;
|
|
}
|
|
var Recoil_Retention = {
|
|
updateRetainCount,
|
|
updateRetainCountToZero,
|
|
releaseScheduledRetainablesNow,
|
|
retainedByOptionWithDefault
|
|
};
|
|
function* concatIterables(iters) {
|
|
for (const iter of iters) {
|
|
for (const val of iter) {
|
|
yield val;
|
|
}
|
|
}
|
|
}
|
|
var Recoil_concatIterables = concatIterables;
|
|
var isSSR = typeof window === "undefined";
|
|
var isReactNative = typeof navigator !== "undefined" && navigator.product === "ReactNative";
|
|
var Recoil_Environment = {
|
|
isSSR,
|
|
isReactNative
|
|
};
|
|
var {
|
|
isSSR: isSSR$1
|
|
} = Recoil_Environment;
|
|
var {
|
|
batchUpdates: batchUpdates$1
|
|
} = Recoil_Batching;
|
|
var {
|
|
initializeNodeIfNewToStore: initializeNodeIfNewToStore$1,
|
|
peekNodeInfo: peekNodeInfo$1
|
|
} = Recoil_FunctionalCore;
|
|
var {
|
|
graph: graph$2
|
|
} = Recoil_Graph;
|
|
var {
|
|
DEFAULT_VALUE: DEFAULT_VALUE$1,
|
|
recoilValues: recoilValues$1,
|
|
recoilValuesForKeys: recoilValuesForKeys$2
|
|
} = Recoil_Node;
|
|
var {
|
|
AbstractRecoilValue: AbstractRecoilValue$2,
|
|
getRecoilValueAsLoadable: getRecoilValueAsLoadable$1,
|
|
setRecoilValue: setRecoilValue$1,
|
|
setUnvalidatedRecoilValue: setUnvalidatedRecoilValue$1
|
|
} = Recoil_RecoilValueInterface;
|
|
var {
|
|
updateRetainCount: updateRetainCount$1
|
|
} = Recoil_Retention;
|
|
var {
|
|
getNextTreeStateVersion: getNextTreeStateVersion$1,
|
|
makeEmptyStoreState: makeEmptyStoreState$1
|
|
} = Recoil_State;
|
|
var retainWarning = `
|
|
Recoil Snapshots only last for the duration of the callback they are provided to. To keep a Snapshot longer, do this:
|
|
|
|
const release = snapshot.retain();
|
|
try {
|
|
await useTheSnapshotAsynchronously(snapshot);
|
|
} finally {
|
|
release();
|
|
}
|
|
|
|
This is currently a DEV-only warning but will become a thrown exception in the next release of Recoil.
|
|
`;
|
|
var Snapshot = class {
|
|
constructor(storeState) {
|
|
_defineProperty(this, "_store", void 0);
|
|
_defineProperty(this, "_refCount", 0);
|
|
_defineProperty(this, "getLoadable", (recoilValue) => {
|
|
this.checkRefCount_INTERNAL();
|
|
return getRecoilValueAsLoadable$1(this._store, recoilValue);
|
|
});
|
|
_defineProperty(this, "getPromise", (recoilValue) => {
|
|
this.checkRefCount_INTERNAL();
|
|
return this.getLoadable(recoilValue).toPromise();
|
|
});
|
|
_defineProperty(this, "getNodes_UNSTABLE", (opt) => {
|
|
this.checkRefCount_INTERNAL();
|
|
if ((opt === null || opt === void 0 ? void 0 : opt.isModified) === true) {
|
|
if ((opt === null || opt === void 0 ? void 0 : opt.isInitialized) === false) {
|
|
return [];
|
|
}
|
|
const state = this._store.getState().currentTree;
|
|
return recoilValuesForKeys$2(state.dirtyAtoms);
|
|
}
|
|
const knownAtoms = this._store.getState().knownAtoms;
|
|
const knownSelectors = this._store.getState().knownSelectors;
|
|
return (opt === null || opt === void 0 ? void 0 : opt.isInitialized) == null ? recoilValues$1.values() : opt.isInitialized === true ? recoilValuesForKeys$2(Recoil_concatIterables([this._store.getState().knownAtoms, this._store.getState().knownSelectors])) : Recoil_filterIterable(recoilValues$1.values(), ({
|
|
key: key2
|
|
}) => !knownAtoms.has(key2) && !knownSelectors.has(key2));
|
|
});
|
|
_defineProperty(this, "getInfo_UNSTABLE", ({
|
|
key: key2
|
|
}) => {
|
|
this.checkRefCount_INTERNAL();
|
|
return peekNodeInfo$1(this._store, this._store.getState().currentTree, key2);
|
|
});
|
|
_defineProperty(this, "map", (mapper) => {
|
|
this.checkRefCount_INTERNAL();
|
|
const mutableSnapshot = new MutableSnapshot(this, batchUpdates$1);
|
|
mapper(mutableSnapshot);
|
|
return cloneSnapshot(mutableSnapshot.getStore_INTERNAL());
|
|
});
|
|
_defineProperty(this, "asyncMap", async (mapper) => {
|
|
this.checkRefCount_INTERNAL();
|
|
const mutableSnapshot = new MutableSnapshot(this, batchUpdates$1);
|
|
await mapper(mutableSnapshot);
|
|
return cloneSnapshot(mutableSnapshot.getStore_INTERNAL());
|
|
});
|
|
this._store = {
|
|
getState: () => storeState,
|
|
replaceState: (replacer) => {
|
|
storeState.currentTree = replacer(storeState.currentTree);
|
|
},
|
|
getGraph: (version) => {
|
|
const graphs = storeState.graphsByVersion;
|
|
if (graphs.has(version)) {
|
|
return Recoil_nullthrows(graphs.get(version));
|
|
}
|
|
const newGraph = graph$2();
|
|
graphs.set(version, newGraph);
|
|
return newGraph;
|
|
},
|
|
subscribeToTransactions: () => ({
|
|
release: () => {
|
|
}
|
|
}),
|
|
addTransactionMetadata: () => {
|
|
throw new Error("Cannot subscribe to Snapshots");
|
|
}
|
|
};
|
|
for (const nodeKey of this._store.getState().nodeCleanupFunctions.keys()) {
|
|
initializeNodeIfNewToStore$1(this._store, storeState.currentTree, nodeKey, "get");
|
|
updateRetainCount$1(this._store, nodeKey, 1);
|
|
}
|
|
this.retain();
|
|
this.autorelease_INTERNAL();
|
|
}
|
|
retain() {
|
|
if (!Recoil_gkx_1("recoil_memory_managament_2020")) {
|
|
return () => void 0;
|
|
}
|
|
this._refCount++;
|
|
let released = false;
|
|
return () => {
|
|
if (!released) {
|
|
released = true;
|
|
this.release_INTERNAL();
|
|
}
|
|
};
|
|
}
|
|
autorelease_INTERNAL() {
|
|
if (!Recoil_gkx_1("recoil_memory_managament_2020")) {
|
|
return;
|
|
}
|
|
if (!isSSR$1) {
|
|
window.setTimeout(() => this.release_INTERNAL(), 0);
|
|
}
|
|
}
|
|
release_INTERNAL() {
|
|
if (!Recoil_gkx_1("recoil_memory_managament_2020")) {
|
|
return;
|
|
}
|
|
this._refCount--;
|
|
if (this._refCount === 0)
|
|
;
|
|
}
|
|
checkRefCount_INTERNAL() {
|
|
if (Recoil_gkx_1("recoil_memory_managament_2020") && this._refCount <= 0) {
|
|
if (true) {
|
|
Recoil_recoverableViolation(retainWarning);
|
|
}
|
|
}
|
|
}
|
|
getStore_INTERNAL() {
|
|
this.checkRefCount_INTERNAL();
|
|
return this._store;
|
|
}
|
|
getID() {
|
|
this.checkRefCount_INTERNAL();
|
|
return this.getID_INTERNAL();
|
|
}
|
|
getID_INTERNAL() {
|
|
this.checkRefCount_INTERNAL();
|
|
return this._store.getState().currentTree.stateID;
|
|
}
|
|
};
|
|
function cloneStoreState(store, treeState, bumpVersion = false) {
|
|
const storeState = store.getState();
|
|
const version = bumpVersion ? getNextTreeStateVersion$1() : treeState.version;
|
|
return {
|
|
currentTree: bumpVersion ? {
|
|
version,
|
|
stateID: version,
|
|
transactionMetadata: {
|
|
...treeState.transactionMetadata
|
|
},
|
|
dirtyAtoms: new Set(treeState.dirtyAtoms),
|
|
atomValues: treeState.atomValues.clone(),
|
|
nonvalidatedAtoms: treeState.nonvalidatedAtoms.clone()
|
|
} : treeState,
|
|
commitDepth: 0,
|
|
nextTree: null,
|
|
previousTree: null,
|
|
knownAtoms: new Set(storeState.knownAtoms),
|
|
knownSelectors: new Set(storeState.knownSelectors),
|
|
transactionSubscriptions: /* @__PURE__ */ new Map(),
|
|
nodeTransactionSubscriptions: /* @__PURE__ */ new Map(),
|
|
nodeToComponentSubscriptions: /* @__PURE__ */ new Map(),
|
|
queuedComponentCallbacks_DEPRECATED: [],
|
|
suspendedComponentResolvers: /* @__PURE__ */ new Set(),
|
|
graphsByVersion: (/* @__PURE__ */ new Map()).set(version, store.getGraph(treeState.version)),
|
|
versionsUsedByComponent: /* @__PURE__ */ new Map(),
|
|
retention: {
|
|
referenceCounts: /* @__PURE__ */ new Map(),
|
|
nodesRetainedByZone: /* @__PURE__ */ new Map(),
|
|
retainablesToCheckForRelease: /* @__PURE__ */ new Set()
|
|
},
|
|
nodeCleanupFunctions: /* @__PURE__ */ new Map()
|
|
};
|
|
}
|
|
function freshSnapshot(initializeState) {
|
|
const snapshot = new Snapshot(makeEmptyStoreState$1());
|
|
return initializeState != null ? snapshot.map(initializeState) : snapshot;
|
|
}
|
|
function cloneSnapshot(store, version = "current") {
|
|
const storeState = store.getState();
|
|
const treeState = version === "current" ? storeState.currentTree : Recoil_nullthrows(storeState.previousTree);
|
|
return new Snapshot(cloneStoreState(store, treeState));
|
|
}
|
|
var MutableSnapshot = class extends Snapshot {
|
|
constructor(snapshot, batch) {
|
|
super(cloneStoreState(snapshot.getStore_INTERNAL(), snapshot.getStore_INTERNAL().getState().currentTree, true));
|
|
_defineProperty(this, "_batch", void 0);
|
|
_defineProperty(this, "set", (recoilState, newValueOrUpdater) => {
|
|
this.checkRefCount_INTERNAL();
|
|
const store = this.getStore_INTERNAL();
|
|
this._batch(() => {
|
|
updateRetainCount$1(store, recoilState.key, 1);
|
|
setRecoilValue$1(this.getStore_INTERNAL(), recoilState, newValueOrUpdater);
|
|
});
|
|
});
|
|
_defineProperty(this, "reset", (recoilState) => {
|
|
this.checkRefCount_INTERNAL();
|
|
const store = this.getStore_INTERNAL();
|
|
this._batch(() => {
|
|
updateRetainCount$1(store, recoilState.key, 1);
|
|
setRecoilValue$1(this.getStore_INTERNAL(), recoilState, DEFAULT_VALUE$1);
|
|
});
|
|
});
|
|
_defineProperty(this, "setUnvalidatedAtomValues_DEPRECATED", (values) => {
|
|
this.checkRefCount_INTERNAL();
|
|
const store = this.getStore_INTERNAL();
|
|
batchUpdates$1(() => {
|
|
for (const [k5, v3] of values.entries()) {
|
|
updateRetainCount$1(store, k5, 1);
|
|
setUnvalidatedRecoilValue$1(store, new AbstractRecoilValue$2(k5), v3);
|
|
}
|
|
});
|
|
});
|
|
this._batch = batch;
|
|
}
|
|
};
|
|
var Recoil_Snapshot = {
|
|
Snapshot,
|
|
MutableSnapshot,
|
|
freshSnapshot,
|
|
cloneSnapshot
|
|
};
|
|
var Recoil_Snapshot_1 = Recoil_Snapshot.Snapshot;
|
|
var Recoil_Snapshot_2 = Recoil_Snapshot.MutableSnapshot;
|
|
var Recoil_Snapshot_3 = Recoil_Snapshot.freshSnapshot;
|
|
var Recoil_Snapshot_4 = Recoil_Snapshot.cloneSnapshot;
|
|
var Recoil_Snapshot$1 = /* @__PURE__ */ Object.freeze({
|
|
__proto__: null,
|
|
Snapshot: Recoil_Snapshot_1,
|
|
MutableSnapshot: Recoil_Snapshot_2,
|
|
freshSnapshot: Recoil_Snapshot_3,
|
|
cloneSnapshot: Recoil_Snapshot_4
|
|
});
|
|
var {
|
|
getNextTreeStateVersion: getNextTreeStateVersion$2,
|
|
makeEmptyStoreState: makeEmptyStoreState$2
|
|
} = Recoil_State;
|
|
var {
|
|
cleanUpNode: cleanUpNode$2,
|
|
getDownstreamNodes: getDownstreamNodes$2,
|
|
setNodeValue: setNodeValue$2,
|
|
setUnvalidatedAtomValue_DEPRECATED: setUnvalidatedAtomValue_DEPRECATED$1
|
|
} = Recoil_FunctionalCore;
|
|
var {
|
|
graph: graph$3
|
|
} = Recoil_Graph;
|
|
var {
|
|
cloneGraph: cloneGraph$1
|
|
} = Recoil_Graph;
|
|
var {
|
|
applyAtomValueWrites: applyAtomValueWrites$1
|
|
} = Recoil_RecoilValueInterface;
|
|
var {
|
|
releaseScheduledRetainablesNow: releaseScheduledRetainablesNow$1
|
|
} = Recoil_Retention;
|
|
var {
|
|
freshSnapshot: freshSnapshot$1
|
|
} = Recoil_Snapshot$1;
|
|
var {
|
|
useCallback,
|
|
useContext: useContext2,
|
|
useEffect,
|
|
useMemo,
|
|
useRef: useRef3,
|
|
useState
|
|
} = bn;
|
|
function notInAContext() {
|
|
throw new Error("This component must be used inside a <RecoilRoot> component.");
|
|
}
|
|
var defaultStore = Object.freeze({
|
|
getState: notInAContext,
|
|
replaceState: notInAContext,
|
|
getGraph: notInAContext,
|
|
subscribeToTransactions: notInAContext,
|
|
addTransactionMetadata: notInAContext
|
|
});
|
|
var stateReplacerIsBeingExecuted = false;
|
|
function startNextTreeIfNeeded(store) {
|
|
if (stateReplacerIsBeingExecuted) {
|
|
throw new Error("An atom update was triggered within the execution of a state updater function. State updater functions provided to Recoil must be pure functions.");
|
|
}
|
|
const storeState = store.getState();
|
|
if (storeState.nextTree === null) {
|
|
if (Recoil_gkx_1("recoil_memory_managament_2020") && Recoil_gkx_1("recoil_release_on_cascading_update_killswitch_2021")) {
|
|
if (storeState.commitDepth > 0) {
|
|
releaseScheduledRetainablesNow$1(store);
|
|
}
|
|
}
|
|
const version = storeState.currentTree.version;
|
|
const nextVersion = getNextTreeStateVersion$2();
|
|
storeState.nextTree = {
|
|
...storeState.currentTree,
|
|
version: nextVersion,
|
|
stateID: nextVersion,
|
|
dirtyAtoms: /* @__PURE__ */ new Set(),
|
|
transactionMetadata: {}
|
|
};
|
|
storeState.graphsByVersion.set(nextVersion, cloneGraph$1(Recoil_nullthrows(storeState.graphsByVersion.get(version))));
|
|
}
|
|
}
|
|
var AppContext = bn.createContext({
|
|
current: defaultStore
|
|
});
|
|
var useStoreRef = () => useContext2(AppContext);
|
|
var MutableSourceContext = bn.createContext(null);
|
|
function useRecoilMutableSource() {
|
|
const mutableSource = useContext2(MutableSourceContext);
|
|
if (mutableSource == null) {
|
|
Recoil_expectationViolation("Attempted to use a Recoil hook outside of a <RecoilRoot>. <RecoilRoot> must be an ancestor of any component that uses Recoil hooks.");
|
|
}
|
|
return mutableSource;
|
|
}
|
|
function notifyComponents(store, storeState, treeState) {
|
|
const dependentNodes = getDownstreamNodes$2(store, treeState, treeState.dirtyAtoms);
|
|
for (const key2 of dependentNodes) {
|
|
const comps = storeState.nodeToComponentSubscriptions.get(key2);
|
|
if (comps) {
|
|
for (const [_subID, [_debugName, callback]] of comps) {
|
|
callback(treeState);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
function sendEndOfBatchNotifications(store) {
|
|
const storeState = store.getState();
|
|
const treeState = storeState.currentTree;
|
|
const dirtyAtoms = treeState.dirtyAtoms;
|
|
if (dirtyAtoms.size) {
|
|
for (const [key2, subscriptions] of storeState.nodeTransactionSubscriptions) {
|
|
if (dirtyAtoms.has(key2)) {
|
|
for (const [_5, subscription] of subscriptions) {
|
|
subscription(store);
|
|
}
|
|
}
|
|
}
|
|
for (const [_5, subscription] of storeState.transactionSubscriptions) {
|
|
subscription(store);
|
|
}
|
|
if (!Recoil_gkx_1("recoil_early_rendering_2021") || storeState.suspendedComponentResolvers.size) {
|
|
notifyComponents(store, storeState, treeState);
|
|
storeState.suspendedComponentResolvers.forEach((cb) => cb());
|
|
storeState.suspendedComponentResolvers.clear();
|
|
}
|
|
}
|
|
storeState.queuedComponentCallbacks_DEPRECATED.forEach((cb) => cb(treeState));
|
|
storeState.queuedComponentCallbacks_DEPRECATED.splice(0, storeState.queuedComponentCallbacks_DEPRECATED.length);
|
|
}
|
|
function endBatch(storeRef) {
|
|
const storeState = storeRef.current.getState();
|
|
storeState.commitDepth++;
|
|
try {
|
|
const {
|
|
nextTree
|
|
} = storeState;
|
|
if (nextTree === null) {
|
|
return;
|
|
}
|
|
storeState.previousTree = storeState.currentTree;
|
|
storeState.currentTree = nextTree;
|
|
storeState.nextTree = null;
|
|
sendEndOfBatchNotifications(storeRef.current);
|
|
if (storeState.previousTree != null) {
|
|
storeState.graphsByVersion.delete(storeState.previousTree.version);
|
|
} else {
|
|
Recoil_recoverableViolation("Ended batch with no previous state, which is unexpected", "recoil");
|
|
}
|
|
storeState.previousTree = null;
|
|
if (Recoil_gkx_1("recoil_memory_managament_2020")) {
|
|
releaseScheduledRetainablesNow$1(storeRef.current);
|
|
}
|
|
} finally {
|
|
storeState.commitDepth--;
|
|
}
|
|
}
|
|
function Batcher({
|
|
setNotifyBatcherOfChange
|
|
}) {
|
|
const storeRef = useStoreRef();
|
|
const [_5, setState] = useState([]);
|
|
setNotifyBatcherOfChange(() => setState({}));
|
|
useEffect(() => {
|
|
Recoil_Queue.enqueueExecution("Batcher", () => {
|
|
endBatch(storeRef);
|
|
});
|
|
});
|
|
useEffect(() => {
|
|
return () => {
|
|
setNotifyBatcherOfChange(() => {
|
|
});
|
|
};
|
|
}, [setNotifyBatcherOfChange]);
|
|
return null;
|
|
}
|
|
if (true) {
|
|
if (typeof window !== "undefined" && !window.$recoilDebugStates) {
|
|
window.$recoilDebugStates = [];
|
|
}
|
|
}
|
|
function initialStoreState_DEPRECATED(store, initializeState) {
|
|
const initial = makeEmptyStoreState$2();
|
|
initializeState({
|
|
set: (atom2, value) => {
|
|
const state = initial.currentTree;
|
|
const writes = setNodeValue$2(store, state, atom2.key, value);
|
|
const writtenNodes = new Set(writes.keys());
|
|
const nonvalidatedAtoms = state.nonvalidatedAtoms.clone();
|
|
for (const n2 of writtenNodes) {
|
|
nonvalidatedAtoms.delete(n2);
|
|
}
|
|
initial.currentTree = {
|
|
...state,
|
|
dirtyAtoms: Recoil_unionSets(state.dirtyAtoms, writtenNodes),
|
|
atomValues: applyAtomValueWrites$1(state.atomValues, writes),
|
|
nonvalidatedAtoms
|
|
};
|
|
},
|
|
setUnvalidatedAtomValues: (atomValues) => {
|
|
atomValues.forEach((v3, k5) => {
|
|
initial.currentTree = setUnvalidatedAtomValue_DEPRECATED$1(initial.currentTree, k5, v3);
|
|
});
|
|
}
|
|
});
|
|
return initial;
|
|
}
|
|
function initialStoreState(initializeState) {
|
|
const snapshot = freshSnapshot$1().map(initializeState);
|
|
return snapshot.getStore_INTERNAL().getState();
|
|
}
|
|
var nextID = 0;
|
|
function RecoilRoot_INTERNAL({
|
|
initializeState_DEPRECATED,
|
|
initializeState,
|
|
store_INTERNAL: storeProp,
|
|
children
|
|
}) {
|
|
var _createMutableSource;
|
|
let storeState;
|
|
const getGraph = (version) => {
|
|
const graphs = storeState.current.graphsByVersion;
|
|
if (graphs.has(version)) {
|
|
return Recoil_nullthrows(graphs.get(version));
|
|
}
|
|
const newGraph = graph$3();
|
|
graphs.set(version, newGraph);
|
|
return newGraph;
|
|
};
|
|
const subscribeToTransactions = (callback, key2) => {
|
|
if (key2 == null) {
|
|
const {
|
|
transactionSubscriptions
|
|
} = storeRef.current.getState();
|
|
const id2 = nextID++;
|
|
transactionSubscriptions.set(id2, callback);
|
|
return {
|
|
release: () => {
|
|
transactionSubscriptions.delete(id2);
|
|
}
|
|
};
|
|
} else {
|
|
const {
|
|
nodeTransactionSubscriptions
|
|
} = storeRef.current.getState();
|
|
if (!nodeTransactionSubscriptions.has(key2)) {
|
|
nodeTransactionSubscriptions.set(key2, /* @__PURE__ */ new Map());
|
|
}
|
|
const id2 = nextID++;
|
|
Recoil_nullthrows(nodeTransactionSubscriptions.get(key2)).set(id2, callback);
|
|
return {
|
|
release: () => {
|
|
const subs = nodeTransactionSubscriptions.get(key2);
|
|
if (subs) {
|
|
subs.delete(id2);
|
|
if (subs.size === 0) {
|
|
nodeTransactionSubscriptions.delete(key2);
|
|
}
|
|
}
|
|
}
|
|
};
|
|
}
|
|
};
|
|
const addTransactionMetadata = (metadata) => {
|
|
startNextTreeIfNeeded(storeRef.current);
|
|
for (const k5 of Object.keys(metadata)) {
|
|
Recoil_nullthrows(storeRef.current.getState().nextTree).transactionMetadata[k5] = metadata[k5];
|
|
}
|
|
};
|
|
const replaceState = (replacer) => {
|
|
const storeState2 = storeRef.current.getState();
|
|
startNextTreeIfNeeded(storeRef.current);
|
|
const nextTree = Recoil_nullthrows(storeState2.nextTree);
|
|
let replaced;
|
|
try {
|
|
stateReplacerIsBeingExecuted = true;
|
|
replaced = replacer(nextTree);
|
|
} finally {
|
|
stateReplacerIsBeingExecuted = false;
|
|
}
|
|
if (replaced === nextTree) {
|
|
return;
|
|
}
|
|
if (true) {
|
|
if (typeof window !== "undefined") {
|
|
window.$recoilDebugStates.push(replaced);
|
|
}
|
|
}
|
|
storeState2.nextTree = replaced;
|
|
if (Recoil_gkx_1("recoil_early_rendering_2021")) {
|
|
notifyComponents(store, storeState2, replaced);
|
|
}
|
|
Recoil_nullthrows(notifyBatcherOfChange.current)();
|
|
};
|
|
const notifyBatcherOfChange = useRef3(null);
|
|
const setNotifyBatcherOfChange = useCallback((x5) => {
|
|
notifyBatcherOfChange.current = x5;
|
|
}, [notifyBatcherOfChange]);
|
|
const createMutableSource = (_createMutableSource = bn.createMutableSource) !== null && _createMutableSource !== void 0 ? _createMutableSource : bn.unstable_createMutableSource;
|
|
const store = storeProp !== null && storeProp !== void 0 ? storeProp : {
|
|
getState: () => storeState.current,
|
|
replaceState,
|
|
getGraph,
|
|
subscribeToTransactions,
|
|
addTransactionMetadata
|
|
};
|
|
const storeRef = useRef3(store);
|
|
storeState = useRef3(initializeState_DEPRECATED != null ? initialStoreState_DEPRECATED(store, initializeState_DEPRECATED) : initializeState != null ? initialStoreState(initializeState) : makeEmptyStoreState$2());
|
|
const mutableSource = useMemo(() => createMutableSource ? createMutableSource(storeState, () => storeState.current.currentTree.version) : null, [createMutableSource, storeState]);
|
|
useEffect(() => () => {
|
|
for (const atomKey of storeRef.current.getState().knownAtoms) {
|
|
cleanUpNode$2(storeRef.current, atomKey);
|
|
}
|
|
}, []);
|
|
return /* @__PURE__ */ bn.createElement(AppContext.Provider, {
|
|
value: storeRef
|
|
}, /* @__PURE__ */ bn.createElement(MutableSourceContext.Provider, {
|
|
value: mutableSource
|
|
}, /* @__PURE__ */ bn.createElement(Batcher, {
|
|
setNotifyBatcherOfChange
|
|
}), children));
|
|
}
|
|
function RecoilRoot(props2) {
|
|
const {
|
|
override,
|
|
...propsExceptOverride
|
|
} = props2;
|
|
const ancestorStoreRef = useStoreRef();
|
|
if (override === false && ancestorStoreRef.current !== defaultStore) {
|
|
return props2.children;
|
|
}
|
|
return /* @__PURE__ */ bn.createElement(RecoilRoot_INTERNAL, propsExceptOverride);
|
|
}
|
|
var Recoil_RecoilRoot_react = {
|
|
useStoreRef,
|
|
useRecoilMutableSource,
|
|
RecoilRoot,
|
|
notifyComponents_FOR_TESTING: notifyComponents,
|
|
sendEndOfBatchNotifications_FOR_TESTING: sendEndOfBatchNotifications
|
|
};
|
|
var {
|
|
loadableWithValue: loadableWithValue$1
|
|
} = Recoil_Loadable;
|
|
var {
|
|
DEFAULT_VALUE: DEFAULT_VALUE$2,
|
|
getNode: getNode$3
|
|
} = Recoil_Node;
|
|
var {
|
|
copyTreeState: copyTreeState$1,
|
|
getRecoilValueAsLoadable: getRecoilValueAsLoadable$2,
|
|
invalidateDownstreams: invalidateDownstreams$1,
|
|
writeLoadableToTreeState: writeLoadableToTreeState$1
|
|
} = Recoil_RecoilValueInterface;
|
|
function isAtom(recoilValue) {
|
|
return getNode$3(recoilValue.key).nodeType === "atom";
|
|
}
|
|
var TransactionInterfaceImpl = class {
|
|
constructor(store, treeState) {
|
|
_defineProperty(this, "_store", void 0);
|
|
_defineProperty(this, "_treeState", void 0);
|
|
_defineProperty(this, "_changes", void 0);
|
|
_defineProperty(this, "get", (recoilValue) => {
|
|
if (this._changes.has(recoilValue.key)) {
|
|
return this._changes.get(recoilValue.key);
|
|
}
|
|
if (!isAtom(recoilValue)) {
|
|
throw new Error("Reading selectors within atomicUpdate is not supported");
|
|
}
|
|
const loadable = getRecoilValueAsLoadable$2(this._store, recoilValue, this._treeState);
|
|
if (loadable.state === "hasValue") {
|
|
return loadable.contents;
|
|
} else if (loadable.state === "hasError") {
|
|
throw loadable.contents;
|
|
} else {
|
|
throw new Error(`Expected Recoil atom ${recoilValue.key} to have a value, but it is in a loading state.`);
|
|
}
|
|
});
|
|
_defineProperty(this, "set", (recoilState, valueOrUpdater) => {
|
|
if (!isAtom(recoilState)) {
|
|
throw new Error("Setting selectors within atomicUpdate is not supported");
|
|
}
|
|
if (typeof valueOrUpdater === "function") {
|
|
const current = this.get(recoilState);
|
|
this._changes.set(recoilState.key, valueOrUpdater(current));
|
|
} else {
|
|
this._changes.set(recoilState.key, valueOrUpdater);
|
|
}
|
|
});
|
|
_defineProperty(this, "reset", (recoilState) => {
|
|
this.set(recoilState, DEFAULT_VALUE$2);
|
|
});
|
|
this._store = store;
|
|
this._treeState = treeState;
|
|
this._changes = /* @__PURE__ */ new Map();
|
|
}
|
|
newTreeState_INTERNAL() {
|
|
if (this._changes.size === 0) {
|
|
return this._treeState;
|
|
}
|
|
const newState = copyTreeState$1(this._treeState);
|
|
for (const [k5, v3] of this._changes) {
|
|
writeLoadableToTreeState$1(newState, k5, loadableWithValue$1(v3));
|
|
}
|
|
invalidateDownstreams$1(this._store, newState);
|
|
return newState;
|
|
}
|
|
};
|
|
function atomicUpdater(store) {
|
|
return (fn2) => {
|
|
store.replaceState((treeState) => {
|
|
const changeset = new TransactionInterfaceImpl(store, treeState);
|
|
fn2(changeset);
|
|
return changeset.newTreeState_INTERNAL();
|
|
});
|
|
};
|
|
}
|
|
var Recoil_AtomicUpdates = {
|
|
atomicUpdater
|
|
};
|
|
var Recoil_AtomicUpdates_1 = Recoil_AtomicUpdates.atomicUpdater;
|
|
var Recoil_AtomicUpdates$1 = /* @__PURE__ */ Object.freeze({
|
|
__proto__: null,
|
|
atomicUpdater: Recoil_AtomicUpdates_1
|
|
});
|
|
function filterMap(map, callback) {
|
|
const result = /* @__PURE__ */ new Map();
|
|
for (const [key2, value] of map) {
|
|
if (callback(value, key2)) {
|
|
result.set(key2, value);
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
var Recoil_filterMap = filterMap;
|
|
function filterSet(set, callback) {
|
|
const result = /* @__PURE__ */ new Set();
|
|
for (const value of set) {
|
|
if (callback(value)) {
|
|
result.add(value);
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
var Recoil_filterSet = filterSet;
|
|
function invariant(condition, message) {
|
|
if (!condition) {
|
|
throw new Error(message);
|
|
}
|
|
}
|
|
var invariant_1 = invariant;
|
|
var Recoil_invariant = invariant_1;
|
|
function mergeMaps(...maps) {
|
|
const result = /* @__PURE__ */ new Map();
|
|
for (let i4 = 0; i4 < maps.length; i4++) {
|
|
const iterator = maps[i4].keys();
|
|
let nextKey;
|
|
while (!(nextKey = iterator.next()).done) {
|
|
result.set(nextKey.value, maps[i4].get(nextKey.value));
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
var Recoil_mergeMaps = mergeMaps;
|
|
function shallowArrayEqual(a5, b4) {
|
|
if (a5 === b4) {
|
|
return true;
|
|
}
|
|
if (a5.length !== b4.length) {
|
|
return false;
|
|
}
|
|
for (let i4 = 0, l3 = a5.length; i4 < l3; i4++) {
|
|
if (a5[i4] !== b4[i4]) {
|
|
return false;
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
var Recoil_shallowArrayEqual = shallowArrayEqual;
|
|
var UNKNOWN_FUNCTION = "<unknown>";
|
|
function stackTraceParser(stackString) {
|
|
const lines = stackString.split("\n");
|
|
return lines.reduce((stack, line) => {
|
|
const parseResult = parseChrome(line) || parseWinjs(line) || parseGecko(line) || parseNode(line) || parseJSC(line);
|
|
if (parseResult) {
|
|
stack.push(parseResult);
|
|
}
|
|
return stack;
|
|
}, []);
|
|
}
|
|
var chromeRe = /^\s*at (.*?) ?\(((?:file|https?|blob|chrome-extension|native|eval|webpack|<anonymous>|\/|[a-z]:\\|\\\\).*?)(?::(\d+))?(?::(\d+))?\)?\s*$/i;
|
|
var chromeEvalRe = /\((\S*)(?::(\d+))(?::(\d+))\)/;
|
|
function parseChrome(line) {
|
|
const parts = chromeRe.exec(line);
|
|
if (!parts) {
|
|
return null;
|
|
}
|
|
const isNative = parts[2] && parts[2].indexOf("native") === 0;
|
|
const isEval = parts[2] && parts[2].indexOf("eval") === 0;
|
|
const submatch = chromeEvalRe.exec(parts[2]);
|
|
if (isEval && submatch != null) {
|
|
parts[2] = submatch[1];
|
|
parts[3] = submatch[2];
|
|
parts[4] = submatch[3];
|
|
}
|
|
return {
|
|
file: !isNative ? parts[2] : null,
|
|
methodName: parts[1] || UNKNOWN_FUNCTION,
|
|
arguments: isNative ? [parts[2]] : [],
|
|
lineNumber: parts[3] ? +parts[3] : null,
|
|
column: parts[4] ? +parts[4] : null
|
|
};
|
|
}
|
|
var winjsRe = /^\s*at (?:((?:\[object object\])?.+) )?\(?((?:file|ms-appx|https?|webpack|blob):.*?):(\d+)(?::(\d+))?\)?\s*$/i;
|
|
function parseWinjs(line) {
|
|
const parts = winjsRe.exec(line);
|
|
if (!parts) {
|
|
return null;
|
|
}
|
|
return {
|
|
file: parts[2],
|
|
methodName: parts[1] || UNKNOWN_FUNCTION,
|
|
arguments: [],
|
|
lineNumber: +parts[3],
|
|
column: parts[4] ? +parts[4] : null
|
|
};
|
|
}
|
|
var geckoRe = /^\s*(.*?)(?:\((.*?)\))?(?:^|@)((?:file|https?|blob|chrome|webpack|resource|\[native).*?|[^@]*bundle)(?::(\d+))?(?::(\d+))?\s*$/i;
|
|
var geckoEvalRe = /(\S+) line (\d+)(?: > eval line \d+)* > eval/i;
|
|
function parseGecko(line) {
|
|
const parts = geckoRe.exec(line);
|
|
if (!parts) {
|
|
return null;
|
|
}
|
|
const isEval = parts[3] && parts[3].indexOf(" > eval") > -1;
|
|
const submatch = geckoEvalRe.exec(parts[3]);
|
|
if (isEval && submatch != null) {
|
|
parts[3] = submatch[1];
|
|
parts[4] = submatch[2];
|
|
parts[5] = null;
|
|
}
|
|
return {
|
|
file: parts[3],
|
|
methodName: parts[1] || UNKNOWN_FUNCTION,
|
|
arguments: parts[2] ? parts[2].split(",") : [],
|
|
lineNumber: parts[4] ? +parts[4] : null,
|
|
column: parts[5] ? +parts[5] : null
|
|
};
|
|
}
|
|
var javaScriptCoreRe = /^\s*(?:([^@]*)(?:\((.*?)\))?@)?(\S.*?):(\d+)(?::(\d+))?\s*$/i;
|
|
function parseJSC(line) {
|
|
const parts = javaScriptCoreRe.exec(line);
|
|
if (!parts) {
|
|
return null;
|
|
}
|
|
return {
|
|
file: parts[3],
|
|
methodName: parts[1] || UNKNOWN_FUNCTION,
|
|
arguments: [],
|
|
lineNumber: +parts[4],
|
|
column: parts[5] ? +parts[5] : null
|
|
};
|
|
}
|
|
var nodeRe = /^\s*at (?:((?:\[object object\])?[^\\/]+(?: \[as \S+\])?) )?\(?(.*?):(\d+)(?::(\d+))?\)?\s*$/i;
|
|
function parseNode(line) {
|
|
const parts = nodeRe.exec(line);
|
|
if (!parts) {
|
|
return null;
|
|
}
|
|
return {
|
|
file: parts[2],
|
|
methodName: parts[1] || UNKNOWN_FUNCTION,
|
|
arguments: [],
|
|
lineNumber: +parts[3],
|
|
column: parts[4] ? +parts[4] : null
|
|
};
|
|
}
|
|
var Recoil_stackTraceParser = stackTraceParser;
|
|
var {
|
|
useRef: useRef$1
|
|
} = bn;
|
|
function useComponentName() {
|
|
const nameRef = useRef$1();
|
|
if (true) {
|
|
if (Recoil_gkx_1("recoil_infer_component_names")) {
|
|
var _nameRef$current;
|
|
if (nameRef.current === void 0) {
|
|
const frames = Recoil_stackTraceParser(new Error().stack);
|
|
for (const {
|
|
methodName
|
|
} of frames) {
|
|
if (!methodName.match(/\buse[^\b]+$/)) {
|
|
return nameRef.current = methodName;
|
|
}
|
|
}
|
|
nameRef.current = null;
|
|
}
|
|
return (_nameRef$current = nameRef.current) !== null && _nameRef$current !== void 0 ? _nameRef$current : "<unable to determine component name>";
|
|
}
|
|
}
|
|
return "<component name not available>";
|
|
}
|
|
var Recoil_useComponentName = useComponentName;
|
|
var {
|
|
atomicUpdater: atomicUpdater$1
|
|
} = Recoil_AtomicUpdates$1;
|
|
var {
|
|
batchUpdates: batchUpdates$2
|
|
} = Recoil_Batching;
|
|
var {
|
|
DEFAULT_VALUE: DEFAULT_VALUE$3,
|
|
getNode: getNode$4,
|
|
nodes: nodes$1
|
|
} = Recoil_Node;
|
|
var {
|
|
useRecoilMutableSource: useRecoilMutableSource$1,
|
|
useStoreRef: useStoreRef$1
|
|
} = Recoil_RecoilRoot_react;
|
|
var {
|
|
isRecoilValue: isRecoilValue$2
|
|
} = Recoil_RecoilValue$1;
|
|
var {
|
|
AbstractRecoilValue: AbstractRecoilValue$3,
|
|
getRecoilValueAsLoadable: getRecoilValueAsLoadable$3,
|
|
setRecoilValue: setRecoilValue$2,
|
|
setRecoilValueLoadable: setRecoilValueLoadable$1,
|
|
setUnvalidatedRecoilValue: setUnvalidatedRecoilValue$2,
|
|
subscribeToRecoilValue: subscribeToRecoilValue$1
|
|
} = Recoil_RecoilValueInterface;
|
|
var {
|
|
updateRetainCount: updateRetainCount$2
|
|
} = Recoil_Retention;
|
|
var {
|
|
RetentionZone: RetentionZone$3
|
|
} = Recoil_RetentionZone;
|
|
var {
|
|
Snapshot: Snapshot$1,
|
|
cloneSnapshot: cloneSnapshot$1
|
|
} = Recoil_Snapshot$1;
|
|
var {
|
|
setByAddingToSet: setByAddingToSet$2
|
|
} = Recoil_CopyOnWrite;
|
|
var {
|
|
isSSR: isSSR$2
|
|
} = Recoil_Environment;
|
|
var {
|
|
mutableSourceExists: mutableSourceExists$2,
|
|
useMutableSource: useMutableSource$1
|
|
} = Recoil_mutableSource;
|
|
var {
|
|
useCallback: useCallback$1,
|
|
useEffect: useEffect$1,
|
|
useMemo: useMemo$1,
|
|
useRef: useRef$2,
|
|
useState: useState$1
|
|
} = bn;
|
|
var SUSPENSE_TIMEOUT_MS = 12e4;
|
|
function handleLoadable(loadable, recoilValue, storeRef) {
|
|
if (loadable.state === "hasValue") {
|
|
return loadable.contents;
|
|
} else if (loadable.state === "loading") {
|
|
const promise = new Promise((resolve) => {
|
|
storeRef.current.getState().suspendedComponentResolvers.add(resolve);
|
|
});
|
|
throw promise;
|
|
} else if (loadable.state === "hasError") {
|
|
throw loadable.contents;
|
|
} else {
|
|
const err = new Error(`Invalid value of loadable atom "${recoilValue.key}"`);
|
|
throw err;
|
|
}
|
|
}
|
|
function validateRecoilValue(recoilValue, hookName) {
|
|
if (!isRecoilValue$2(recoilValue)) {
|
|
throw new Error(`Invalid argument to ${hookName}: expected an atom or selector but got ${String(recoilValue)}`);
|
|
}
|
|
}
|
|
function useRecoilInterface_DEPRECATED() {
|
|
const storeRef = useStoreRef$1();
|
|
const [_5, forceUpdate] = useState$1([]);
|
|
const recoilValuesUsed = useRef$2(/* @__PURE__ */ new Set());
|
|
recoilValuesUsed.current = /* @__PURE__ */ new Set();
|
|
const previousSubscriptions = useRef$2(/* @__PURE__ */ new Set());
|
|
const subscriptions = useRef$2(/* @__PURE__ */ new Map());
|
|
const unsubscribeFrom = useCallback$1((key2) => {
|
|
const sub = subscriptions.current.get(key2);
|
|
if (sub) {
|
|
sub.release();
|
|
subscriptions.current.delete(key2);
|
|
}
|
|
}, [subscriptions]);
|
|
const componentName = Recoil_useComponentName();
|
|
useEffect$1(() => {
|
|
const store = storeRef.current;
|
|
function updateState(_state, key2) {
|
|
if (!subscriptions.current.has(key2)) {
|
|
return;
|
|
}
|
|
forceUpdate([]);
|
|
}
|
|
Recoil_differenceSets(recoilValuesUsed.current, previousSubscriptions.current).forEach((key2) => {
|
|
if (subscriptions.current.has(key2)) {
|
|
Recoil_expectationViolation(`Double subscription to RecoilValue "${key2}"`);
|
|
return;
|
|
}
|
|
const sub = subscribeToRecoilValue$1(store, new AbstractRecoilValue$3(key2), (state2) => {
|
|
updateState(state2, key2);
|
|
}, componentName);
|
|
subscriptions.current.set(key2, sub);
|
|
const state = store.getState();
|
|
if (state.nextTree) {
|
|
store.getState().queuedComponentCallbacks_DEPRECATED.push(() => {
|
|
updateState(store.getState(), key2);
|
|
});
|
|
} else {
|
|
updateState(store.getState(), key2);
|
|
}
|
|
});
|
|
Recoil_differenceSets(previousSubscriptions.current, recoilValuesUsed.current).forEach((key2) => {
|
|
unsubscribeFrom(key2);
|
|
});
|
|
previousSubscriptions.current = recoilValuesUsed.current;
|
|
});
|
|
useEffect$1(() => {
|
|
const subs = subscriptions.current;
|
|
return () => subs.forEach((_6, key2) => unsubscribeFrom(key2));
|
|
}, [unsubscribeFrom]);
|
|
return useMemo$1(() => {
|
|
function useSetRecoilState2(recoilState) {
|
|
if (true) {
|
|
validateRecoilValue(recoilState, "useSetRecoilState");
|
|
}
|
|
return (newValueOrUpdater) => {
|
|
setRecoilValue$2(storeRef.current, recoilState, newValueOrUpdater);
|
|
};
|
|
}
|
|
function useResetRecoilState2(recoilState) {
|
|
if (true) {
|
|
validateRecoilValue(recoilState, "useResetRecoilState");
|
|
}
|
|
return () => setRecoilValue$2(storeRef.current, recoilState, DEFAULT_VALUE$3);
|
|
}
|
|
function useRecoilValueLoadable2(recoilValue) {
|
|
var _storeState$nextTree;
|
|
if (true) {
|
|
validateRecoilValue(recoilValue, "useRecoilValueLoadable");
|
|
}
|
|
if (!recoilValuesUsed.current.has(recoilValue.key)) {
|
|
recoilValuesUsed.current = setByAddingToSet$2(recoilValuesUsed.current, recoilValue.key);
|
|
}
|
|
const storeState = storeRef.current.getState();
|
|
return getRecoilValueAsLoadable$3(storeRef.current, recoilValue, Recoil_gkx_1("recoil_early_rendering_2021") ? (_storeState$nextTree = storeState.nextTree) !== null && _storeState$nextTree !== void 0 ? _storeState$nextTree : storeState.currentTree : storeState.currentTree);
|
|
}
|
|
function useRecoilValue2(recoilValue) {
|
|
if (true) {
|
|
validateRecoilValue(recoilValue, "useRecoilValue");
|
|
}
|
|
const loadable = useRecoilValueLoadable2(recoilValue);
|
|
return handleLoadable(loadable, recoilValue, storeRef);
|
|
}
|
|
function useRecoilState2(recoilState) {
|
|
if (true) {
|
|
validateRecoilValue(recoilState, "useRecoilState");
|
|
}
|
|
return [useRecoilValue2(recoilState), useSetRecoilState2(recoilState)];
|
|
}
|
|
function useRecoilStateLoadable2(recoilState) {
|
|
if (true) {
|
|
validateRecoilValue(recoilState, "useRecoilStateLoadable");
|
|
}
|
|
return [useRecoilValueLoadable2(recoilState), useSetRecoilState2(recoilState)];
|
|
}
|
|
return {
|
|
getRecoilValue: useRecoilValue2,
|
|
getRecoilValueLoadable: useRecoilValueLoadable2,
|
|
getRecoilState: useRecoilState2,
|
|
getRecoilStateLoadable: useRecoilStateLoadable2,
|
|
getSetRecoilState: useSetRecoilState2,
|
|
getResetRecoilState: useResetRecoilState2
|
|
};
|
|
}, [recoilValuesUsed, storeRef]);
|
|
}
|
|
var recoilComponentGetRecoilValueCount_FOR_TESTING = {
|
|
current: 0
|
|
};
|
|
function useRecoilValueLoadable_MUTABLESOURCE(recoilValue) {
|
|
if (true) {
|
|
validateRecoilValue(recoilValue, "useRecoilValueLoadable");
|
|
}
|
|
const storeRef = useStoreRef$1();
|
|
const getLoadable = useCallback$1(() => {
|
|
var _storeState$nextTree2;
|
|
const store = storeRef.current;
|
|
const storeState = store.getState();
|
|
const treeState = Recoil_gkx_1("recoil_early_rendering_2021") ? (_storeState$nextTree2 = storeState.nextTree) !== null && _storeState$nextTree2 !== void 0 ? _storeState$nextTree2 : storeState.currentTree : storeState.currentTree;
|
|
return getRecoilValueAsLoadable$3(store, recoilValue, treeState);
|
|
}, [storeRef, recoilValue]);
|
|
const getLoadableWithTesting = useCallback$1(() => {
|
|
if (true) {
|
|
recoilComponentGetRecoilValueCount_FOR_TESTING.current++;
|
|
}
|
|
return getLoadable();
|
|
}, [getLoadable]);
|
|
const componentName = Recoil_useComponentName();
|
|
const subscribe = useCallback$1((_storeState, callback) => {
|
|
const store = storeRef.current;
|
|
const subscription = subscribeToRecoilValue$1(store, recoilValue, () => {
|
|
if (!Recoil_gkx_1("recoil_suppress_rerender_in_callback")) {
|
|
return callback();
|
|
}
|
|
const newLoadable = getLoadable();
|
|
if (!prevLoadableRef.current.is(newLoadable)) {
|
|
callback();
|
|
}
|
|
prevLoadableRef.current = newLoadable;
|
|
}, componentName);
|
|
return subscription.release;
|
|
}, [storeRef, recoilValue, componentName, getLoadable]);
|
|
const source = useRecoilMutableSource$1();
|
|
const loadable = useMutableSource$1(source, getLoadableWithTesting, subscribe);
|
|
const prevLoadableRef = useRef$2(loadable);
|
|
useEffect$1(() => {
|
|
prevLoadableRef.current = loadable;
|
|
});
|
|
return loadable;
|
|
}
|
|
function useRecoilValueLoadable_LEGACY(recoilValue) {
|
|
if (true) {
|
|
validateRecoilValue(recoilValue, "useRecoilValueLoadable");
|
|
}
|
|
const storeRef = useStoreRef$1();
|
|
const [_5, forceUpdate] = useState$1([]);
|
|
const componentName = Recoil_useComponentName();
|
|
useEffect$1(() => {
|
|
const store = storeRef.current;
|
|
const storeState = store.getState();
|
|
const subscription = subscribeToRecoilValue$1(store, recoilValue, (_state) => {
|
|
var _prevLoadableRef$curr;
|
|
if (!Recoil_gkx_1("recoil_suppress_rerender_in_callback")) {
|
|
return forceUpdate([]);
|
|
}
|
|
const newLoadable = getRecoilValueAsLoadable$3(store, recoilValue, store.getState().currentTree);
|
|
if (!((_prevLoadableRef$curr = prevLoadableRef.current) === null || _prevLoadableRef$curr === void 0 ? void 0 : _prevLoadableRef$curr.is(newLoadable))) {
|
|
forceUpdate(newLoadable);
|
|
}
|
|
prevLoadableRef.current = newLoadable;
|
|
}, componentName);
|
|
if (storeState.nextTree) {
|
|
store.getState().queuedComponentCallbacks_DEPRECATED.push(() => {
|
|
prevLoadableRef.current = null;
|
|
forceUpdate([]);
|
|
});
|
|
} else {
|
|
var _prevLoadableRef$curr2;
|
|
if (!Recoil_gkx_1("recoil_suppress_rerender_in_callback")) {
|
|
return forceUpdate([]);
|
|
}
|
|
const newLoadable = getRecoilValueAsLoadable$3(store, recoilValue, store.getState().currentTree);
|
|
if (!((_prevLoadableRef$curr2 = prevLoadableRef.current) === null || _prevLoadableRef$curr2 === void 0 ? void 0 : _prevLoadableRef$curr2.is(newLoadable))) {
|
|
forceUpdate(newLoadable);
|
|
}
|
|
prevLoadableRef.current = newLoadable;
|
|
}
|
|
return subscription.release;
|
|
}, [componentName, recoilValue, storeRef]);
|
|
const loadable = getRecoilValueAsLoadable$3(storeRef.current, recoilValue);
|
|
const prevLoadableRef = useRef$2(loadable);
|
|
useEffect$1(() => {
|
|
prevLoadableRef.current = loadable;
|
|
});
|
|
return loadable;
|
|
}
|
|
function useRecoilValueLoadable(recoilValue) {
|
|
if (Recoil_gkx_1("recoil_memory_managament_2020")) {
|
|
useRetain(recoilValue);
|
|
}
|
|
if (mutableSourceExists$2()) {
|
|
return useRecoilValueLoadable_MUTABLESOURCE(recoilValue);
|
|
} else {
|
|
return useRecoilValueLoadable_LEGACY(recoilValue);
|
|
}
|
|
}
|
|
function useRecoilValue(recoilValue) {
|
|
if (true) {
|
|
validateRecoilValue(recoilValue, "useRecoilValue");
|
|
}
|
|
const storeRef = useStoreRef$1();
|
|
const loadable = useRecoilValueLoadable(recoilValue);
|
|
return handleLoadable(loadable, recoilValue, storeRef);
|
|
}
|
|
function useSetRecoilState(recoilState) {
|
|
if (true) {
|
|
validateRecoilValue(recoilState, "useSetRecoilState");
|
|
}
|
|
const storeRef = useStoreRef$1();
|
|
return useCallback$1((newValueOrUpdater) => {
|
|
setRecoilValue$2(storeRef.current, recoilState, newValueOrUpdater);
|
|
}, [storeRef, recoilState]);
|
|
}
|
|
function useResetRecoilState(recoilState) {
|
|
if (true) {
|
|
validateRecoilValue(recoilState, "useResetRecoilState");
|
|
}
|
|
const storeRef = useStoreRef$1();
|
|
return useCallback$1(() => {
|
|
setRecoilValue$2(storeRef.current, recoilState, DEFAULT_VALUE$3);
|
|
}, [storeRef, recoilState]);
|
|
}
|
|
function useRecoilState(recoilState) {
|
|
if (true) {
|
|
validateRecoilValue(recoilState, "useRecoilState");
|
|
}
|
|
return [useRecoilValue(recoilState), useSetRecoilState(recoilState)];
|
|
}
|
|
function useRecoilStateLoadable(recoilState) {
|
|
if (true) {
|
|
validateRecoilValue(recoilState, "useRecoilStateLoadable");
|
|
}
|
|
return [useRecoilValueLoadable(recoilState), useSetRecoilState(recoilState)];
|
|
}
|
|
function useTransactionSubscription(callback) {
|
|
const storeRef = useStoreRef$1();
|
|
useEffect$1(() => {
|
|
const sub = storeRef.current.subscribeToTransactions(callback);
|
|
return sub.release;
|
|
}, [callback, storeRef]);
|
|
}
|
|
function externallyVisibleAtomValuesInState(state) {
|
|
const atomValues = state.atomValues.toMap();
|
|
const persistedAtomContentsValues = Recoil_mapMap(Recoil_filterMap(atomValues, (v3, k5) => {
|
|
const node = getNode$4(k5);
|
|
const persistence = node.persistence_UNSTABLE;
|
|
return persistence != null && persistence.type !== "none" && v3.state === "hasValue";
|
|
}), (v3) => v3.contents);
|
|
return Recoil_mergeMaps(state.nonvalidatedAtoms.toMap(), persistedAtomContentsValues);
|
|
}
|
|
function useTransactionObservation_DEPRECATED(callback) {
|
|
useTransactionSubscription(useCallback$1((store) => {
|
|
let previousTree = store.getState().previousTree;
|
|
const currentTree = store.getState().currentTree;
|
|
if (!previousTree) {
|
|
Recoil_recoverableViolation("Transaction subscribers notified without a previous tree being present -- this is a bug in Recoil");
|
|
previousTree = store.getState().currentTree;
|
|
}
|
|
const atomValues = externallyVisibleAtomValuesInState(currentTree);
|
|
const previousAtomValues = externallyVisibleAtomValuesInState(previousTree);
|
|
const atomInfo = Recoil_mapMap(nodes$1, (node) => {
|
|
var _node$persistence_UNS, _node$persistence_UNS2, _node$persistence_UNS3, _node$persistence_UNS4;
|
|
return {
|
|
persistence_UNSTABLE: {
|
|
type: (_node$persistence_UNS = (_node$persistence_UNS2 = node.persistence_UNSTABLE) === null || _node$persistence_UNS2 === void 0 ? void 0 : _node$persistence_UNS2.type) !== null && _node$persistence_UNS !== void 0 ? _node$persistence_UNS : "none",
|
|
backButton: (_node$persistence_UNS3 = (_node$persistence_UNS4 = node.persistence_UNSTABLE) === null || _node$persistence_UNS4 === void 0 ? void 0 : _node$persistence_UNS4.backButton) !== null && _node$persistence_UNS3 !== void 0 ? _node$persistence_UNS3 : false
|
|
}
|
|
};
|
|
});
|
|
const modifiedAtoms = Recoil_filterSet(currentTree.dirtyAtoms, (k5) => atomValues.has(k5) || previousAtomValues.has(k5));
|
|
callback({
|
|
atomValues,
|
|
previousAtomValues,
|
|
atomInfo,
|
|
modifiedAtoms,
|
|
transactionMetadata: {
|
|
...currentTree.transactionMetadata
|
|
}
|
|
});
|
|
}, [callback]));
|
|
}
|
|
function useRecoilTransactionObserver(callback) {
|
|
useTransactionSubscription(useCallback$1((store) => {
|
|
const snapshot = cloneSnapshot$1(store, "current");
|
|
const previousSnapshot = cloneSnapshot$1(store, "previous");
|
|
callback({
|
|
snapshot,
|
|
previousSnapshot
|
|
});
|
|
}, [callback]));
|
|
}
|
|
function usePrevious2(value) {
|
|
const ref = useRef$2();
|
|
useEffect$1(() => {
|
|
ref.current = value;
|
|
});
|
|
return ref.current;
|
|
}
|
|
function useRecoilSnapshot() {
|
|
const storeRef = useStoreRef$1();
|
|
const [snapshot, setSnapshot] = useState$1(() => cloneSnapshot$1(storeRef.current));
|
|
const previousSnapshot = usePrevious2(snapshot);
|
|
const timeoutID = useRef$2();
|
|
useEffect$1(() => {
|
|
if (timeoutID.current && !isSSR$2) {
|
|
window.clearTimeout(timeoutID.current);
|
|
}
|
|
return snapshot.retain();
|
|
}, [snapshot]);
|
|
useTransactionSubscription(useCallback$1((store) => setSnapshot(cloneSnapshot$1(store)), []));
|
|
if (previousSnapshot !== snapshot && !isSSR$2) {
|
|
if (timeoutID.current) {
|
|
previousSnapshot === null || previousSnapshot === void 0 ? void 0 : previousSnapshot.release_INTERNAL();
|
|
window.clearTimeout(timeoutID.current);
|
|
}
|
|
snapshot.retain();
|
|
timeoutID.current = window.setTimeout(() => {
|
|
snapshot.release_INTERNAL();
|
|
timeoutID.current = null;
|
|
}, SUSPENSE_TIMEOUT_MS);
|
|
}
|
|
return snapshot;
|
|
}
|
|
function useGotoRecoilSnapshot() {
|
|
const storeRef = useStoreRef$1();
|
|
return useCallback$1((snapshot) => {
|
|
var _storeState$nextTree3;
|
|
const storeState = storeRef.current.getState();
|
|
const prev = (_storeState$nextTree3 = storeState.nextTree) !== null && _storeState$nextTree3 !== void 0 ? _storeState$nextTree3 : storeState.currentTree;
|
|
const next = snapshot.getStore_INTERNAL().getState().currentTree;
|
|
batchUpdates$2(() => {
|
|
const keysToUpdate = /* @__PURE__ */ new Set();
|
|
for (const keys of [prev.atomValues.keys(), next.atomValues.keys()]) {
|
|
for (const key2 of keys) {
|
|
var _prev$atomValues$get, _next$atomValues$get;
|
|
if (((_prev$atomValues$get = prev.atomValues.get(key2)) === null || _prev$atomValues$get === void 0 ? void 0 : _prev$atomValues$get.contents) !== ((_next$atomValues$get = next.atomValues.get(key2)) === null || _next$atomValues$get === void 0 ? void 0 : _next$atomValues$get.contents) && getNode$4(key2).shouldRestoreFromSnapshots) {
|
|
keysToUpdate.add(key2);
|
|
}
|
|
}
|
|
}
|
|
keysToUpdate.forEach((key2) => {
|
|
setRecoilValueLoadable$1(storeRef.current, new AbstractRecoilValue$3(key2), next.atomValues.has(key2) ? Recoil_nullthrows(next.atomValues.get(key2)) : DEFAULT_VALUE$3);
|
|
});
|
|
storeRef.current.replaceState((state) => {
|
|
return {
|
|
...state,
|
|
stateID: snapshot.getID_INTERNAL()
|
|
};
|
|
});
|
|
});
|
|
}, [storeRef]);
|
|
}
|
|
function useSetUnvalidatedAtomValues() {
|
|
const storeRef = useStoreRef$1();
|
|
return (values, transactionMetadata = {}) => {
|
|
batchUpdates$2(() => {
|
|
storeRef.current.addTransactionMetadata(transactionMetadata);
|
|
values.forEach((value, key2) => setUnvalidatedRecoilValue$2(storeRef.current, new AbstractRecoilValue$3(key2), value));
|
|
});
|
|
};
|
|
}
|
|
var Sentinel = class {
|
|
};
|
|
var SENTINEL = new Sentinel();
|
|
function useRecoilCallback(fn2, deps) {
|
|
const storeRef = useStoreRef$1();
|
|
const gotoSnapshot = useGotoRecoilSnapshot();
|
|
return useCallback$1(
|
|
(...args) => {
|
|
function set(recoilState, newValueOrUpdater) {
|
|
setRecoilValue$2(storeRef.current, recoilState, newValueOrUpdater);
|
|
}
|
|
function reset(recoilState) {
|
|
setRecoilValue$2(storeRef.current, recoilState, DEFAULT_VALUE$3);
|
|
}
|
|
const snapshot = cloneSnapshot$1(storeRef.current);
|
|
const atomicUpdate = atomicUpdater$1(storeRef.current);
|
|
let ret = SENTINEL;
|
|
batchUpdates$2(() => {
|
|
const errMsg = "useRecoilCallback expects a function that returns a function: it accepts a function of the type (RecoilInterface) => T = R and returns a callback function T => R, where RecoilInterface is an object {snapshot, set, ...} and T and R are the argument and return types of the callback you want to create. Please see the docs at recoiljs.org for details.";
|
|
if (typeof fn2 !== "function") {
|
|
throw new Error(errMsg);
|
|
}
|
|
const cb = fn2({
|
|
set,
|
|
reset,
|
|
snapshot,
|
|
gotoSnapshot,
|
|
transact_UNSTABLE: atomicUpdate
|
|
});
|
|
if (typeof cb !== "function") {
|
|
throw new Error(errMsg);
|
|
}
|
|
ret = cb(...args);
|
|
});
|
|
!!(ret instanceof Sentinel) ? true ? Recoil_invariant(false, "batchUpdates should return immediately") : Recoil_invariant(false) : void 0;
|
|
return ret;
|
|
},
|
|
deps != null ? [...deps, storeRef] : void 0
|
|
);
|
|
}
|
|
function useRetain(toRetain) {
|
|
if (!Recoil_gkx_1("recoil_memory_managament_2020")) {
|
|
return;
|
|
}
|
|
return useRetain_ACTUAL(toRetain);
|
|
}
|
|
function useRetain_ACTUAL(toRetain) {
|
|
const array = Array.isArray(toRetain) ? toRetain : [toRetain];
|
|
const retainables = array.map((a5) => a5 instanceof RetentionZone$3 ? a5 : a5.key);
|
|
const storeRef = useStoreRef$1();
|
|
useEffect$1(() => {
|
|
if (!Recoil_gkx_1("recoil_memory_managament_2020")) {
|
|
return;
|
|
}
|
|
const store = storeRef.current;
|
|
if (timeoutID.current && !isSSR$2) {
|
|
window.clearTimeout(timeoutID.current);
|
|
timeoutID.current = null;
|
|
} else {
|
|
for (const r3 of retainables) {
|
|
updateRetainCount$2(store, r3, 1);
|
|
}
|
|
}
|
|
return () => {
|
|
for (const r3 of retainables) {
|
|
updateRetainCount$2(store, r3, -1);
|
|
}
|
|
};
|
|
}, [storeRef, ...retainables]);
|
|
const timeoutID = useRef$2();
|
|
const previousRetainables = usePrevious2(retainables);
|
|
if (!isSSR$2 && (previousRetainables === void 0 || !Recoil_shallowArrayEqual(previousRetainables, retainables))) {
|
|
const store = storeRef.current;
|
|
for (const r3 of retainables) {
|
|
updateRetainCount$2(store, r3, 1);
|
|
}
|
|
if (previousRetainables) {
|
|
for (const r3 of previousRetainables) {
|
|
updateRetainCount$2(store, r3, -1);
|
|
}
|
|
}
|
|
if (timeoutID.current) {
|
|
window.clearTimeout(timeoutID.current);
|
|
}
|
|
timeoutID.current = window.setTimeout(() => {
|
|
timeoutID.current = null;
|
|
for (const r3 of retainables) {
|
|
updateRetainCount$2(store, r3, -1);
|
|
}
|
|
}, SUSPENSE_TIMEOUT_MS);
|
|
}
|
|
}
|
|
function useRecoilTransaction(fn2, deps) {
|
|
const storeRef = useStoreRef$1();
|
|
return useMemo$1(
|
|
() => (...args) => {
|
|
const atomicUpdate = atomicUpdater$1(storeRef.current);
|
|
atomicUpdate((transactionInterface) => {
|
|
fn2(transactionInterface)(...args);
|
|
});
|
|
},
|
|
deps != null ? [...deps, storeRef] : void 0
|
|
);
|
|
}
|
|
var Recoil_Hooks = {
|
|
recoilComponentGetRecoilValueCount_FOR_TESTING,
|
|
useGotoRecoilSnapshot,
|
|
useRecoilCallback,
|
|
useRecoilInterface: useRecoilInterface_DEPRECATED,
|
|
useRecoilSnapshot,
|
|
useRecoilState,
|
|
useRecoilStateLoadable,
|
|
useRecoilTransaction,
|
|
useRecoilTransactionObserver,
|
|
useRecoilValue,
|
|
useRecoilValueLoadable,
|
|
useRetain,
|
|
useResetRecoilState,
|
|
useSetRecoilState,
|
|
useSetUnvalidatedAtomValues,
|
|
useTransactionObservation_DEPRECATED,
|
|
useTransactionSubscription_DEPRECATED: useTransactionSubscription
|
|
};
|
|
var {
|
|
peekNodeInfo: peekNodeInfo$2
|
|
} = Recoil_FunctionalCore;
|
|
var {
|
|
useStoreRef: useStoreRef$2
|
|
} = Recoil_RecoilRoot_react;
|
|
function useGetRecoilValueInfo() {
|
|
const storeRef = useStoreRef$2();
|
|
return ({
|
|
key: key2
|
|
}) => peekNodeInfo$2(storeRef.current, storeRef.current.getState().currentTree, key2);
|
|
}
|
|
var Recoil_useGetRecoilValueInfo = useGetRecoilValueInfo;
|
|
var {
|
|
RecoilRoot: RecoilRoot$1,
|
|
useStoreRef: useStoreRef$3
|
|
} = Recoil_RecoilRoot_react;
|
|
var {
|
|
useMemo: useMemo$2
|
|
} = bn;
|
|
function useRecoilBridgeAcrossReactRoots() {
|
|
const store = useStoreRef$3().current;
|
|
return useMemo$2(() => {
|
|
function RecoilBridge({
|
|
children
|
|
}) {
|
|
return /* @__PURE__ */ bn.createElement(RecoilRoot$1, {
|
|
store_INTERNAL: store
|
|
}, children);
|
|
}
|
|
return RecoilBridge;
|
|
}, [store]);
|
|
}
|
|
var Recoil_useRecoilBridgeAcrossReactRoots = useRecoilBridgeAcrossReactRoots;
|
|
function isNode2(object) {
|
|
var _ownerDocument, _doc$defaultView;
|
|
if (typeof window === "undefined") {
|
|
return false;
|
|
}
|
|
const doc = object != null ? (_ownerDocument = object.ownerDocument) !== null && _ownerDocument !== void 0 ? _ownerDocument : object : document;
|
|
const defaultView = (_doc$defaultView = doc.defaultView) !== null && _doc$defaultView !== void 0 ? _doc$defaultView : window;
|
|
return !!(object != null && (typeof defaultView.Node === "function" ? object instanceof defaultView.Node : typeof object === "object" && typeof object.nodeType === "number" && typeof object.nodeName === "string"));
|
|
}
|
|
var Recoil_isNode = isNode2;
|
|
var {
|
|
isReactNative: isReactNative$1,
|
|
isSSR: isSSR$3
|
|
} = Recoil_Environment;
|
|
function shouldNotBeFrozen(value) {
|
|
if (value === null || typeof value !== "object") {
|
|
return true;
|
|
}
|
|
switch (typeof value.$$typeof) {
|
|
case "symbol":
|
|
return true;
|
|
case "number":
|
|
return true;
|
|
}
|
|
if (value["@@__IMMUTABLE_ITERABLE__@@"] != null || value["@@__IMMUTABLE_KEYED__@@"] != null || value["@@__IMMUTABLE_INDEXED__@@"] != null || value["@@__IMMUTABLE_ORDERED__@@"] != null || value["@@__IMMUTABLE_RECORD__@@"] != null) {
|
|
return true;
|
|
}
|
|
if (Recoil_isNode(value)) {
|
|
return true;
|
|
}
|
|
if (Recoil_isPromise(value)) {
|
|
return true;
|
|
}
|
|
if (value instanceof Error) {
|
|
return true;
|
|
}
|
|
if (ArrayBuffer.isView(value)) {
|
|
return true;
|
|
}
|
|
if (!isSSR$3 && !isReactNative$1 && (value === window || value instanceof Window)) {
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
function deepFreezeValue(value) {
|
|
if (typeof value !== "object" || shouldNotBeFrozen(value)) {
|
|
return;
|
|
}
|
|
Object.freeze(value);
|
|
for (const key2 in value) {
|
|
if (Object.prototype.hasOwnProperty.call(value, key2)) {
|
|
const prop = value[key2];
|
|
if (typeof prop === "object" && prop != null && !Object.isFrozen(prop)) {
|
|
deepFreezeValue(prop);
|
|
}
|
|
}
|
|
}
|
|
Object.seal(value);
|
|
}
|
|
var Recoil_deepFreezeValue = deepFreezeValue;
|
|
var TIME_WARNING_THRESHOLD_MS = 15;
|
|
function stringify(x5, opt, key2) {
|
|
if (typeof x5 === "string" && !x5.includes('"') && !x5.includes("\\")) {
|
|
return `"${x5}"`;
|
|
}
|
|
switch (typeof x5) {
|
|
case "undefined":
|
|
return "";
|
|
case "boolean":
|
|
return x5 ? "true" : "false";
|
|
case "number":
|
|
case "symbol":
|
|
return String(x5);
|
|
case "string":
|
|
return JSON.stringify(x5);
|
|
case "function":
|
|
if ((opt === null || opt === void 0 ? void 0 : opt.allowFunctions) !== true) {
|
|
throw new Error("Attempt to serialize function in a Recoil cache key");
|
|
}
|
|
return `__FUNCTION(${x5.name})__`;
|
|
}
|
|
if (x5 === null) {
|
|
return "null";
|
|
}
|
|
if (typeof x5 !== "object") {
|
|
var _JSON$stringify;
|
|
return (_JSON$stringify = JSON.stringify(x5)) !== null && _JSON$stringify !== void 0 ? _JSON$stringify : "";
|
|
}
|
|
if (Recoil_isPromise(x5)) {
|
|
return "__PROMISE__";
|
|
}
|
|
if (Array.isArray(x5)) {
|
|
return `[${x5.map((v3, i4) => stringify(v3, opt, i4.toString()))}]`;
|
|
}
|
|
if (typeof x5.toJSON === "function") {
|
|
return stringify(x5.toJSON(key2), opt, key2);
|
|
}
|
|
if (x5 instanceof Map) {
|
|
const obj = {};
|
|
for (const [k5, v3] of x5) {
|
|
obj[typeof k5 === "string" ? k5 : stringify(k5, opt)] = v3;
|
|
}
|
|
return stringify(obj, opt, key2);
|
|
}
|
|
if (x5 instanceof Set) {
|
|
return stringify(Array.from(x5).sort((a5, b4) => stringify(a5, opt).localeCompare(stringify(b4, opt))), opt, key2);
|
|
}
|
|
if (Symbol !== void 0 && x5[Symbol.iterator] != null && typeof x5[Symbol.iterator] === "function") {
|
|
return stringify(Array.from(x5), opt, key2);
|
|
}
|
|
return `{${Object.keys(x5).filter((key3) => x5[key3] !== void 0).sort().map((key3) => `${stringify(key3, opt)}:${stringify(x5[key3], opt, key3)}`).join(",")}}`;
|
|
}
|
|
function stableStringify(x5, opt = {
|
|
allowFunctions: false
|
|
}) {
|
|
if (true) {
|
|
if (typeof window !== "undefined") {
|
|
const startTime = window.performance ? window.performance.now() : 0;
|
|
const str = stringify(x5, opt);
|
|
const endTime = window.performance ? window.performance.now() : 0;
|
|
if (endTime - startTime > TIME_WARNING_THRESHOLD_MS) {
|
|
console.groupCollapsed(`Recoil: Spent ${endTime - startTime}ms computing a cache key`);
|
|
console.warn(x5, str);
|
|
console.groupEnd();
|
|
}
|
|
return str;
|
|
}
|
|
}
|
|
return stringify(x5, opt);
|
|
}
|
|
var Recoil_stableStringify = stableStringify;
|
|
var TreeCache = class {
|
|
constructor(options) {
|
|
var _options$onHit, _options$onSet, _options$mapNodeValue;
|
|
_defineProperty(this, "_numLeafs", void 0);
|
|
_defineProperty(this, "_root", void 0);
|
|
_defineProperty(this, "_onHit", void 0);
|
|
_defineProperty(this, "_onSet", void 0);
|
|
_defineProperty(this, "_mapNodeValue", void 0);
|
|
this._numLeafs = 0;
|
|
this._root = null;
|
|
this._onHit = (_options$onHit = options === null || options === void 0 ? void 0 : options.onHit) !== null && _options$onHit !== void 0 ? _options$onHit : () => {
|
|
};
|
|
this._onSet = (_options$onSet = options === null || options === void 0 ? void 0 : options.onSet) !== null && _options$onSet !== void 0 ? _options$onSet : () => {
|
|
};
|
|
this._mapNodeValue = (_options$mapNodeValue = options === null || options === void 0 ? void 0 : options.mapNodeValue) !== null && _options$mapNodeValue !== void 0 ? _options$mapNodeValue : (val) => val;
|
|
}
|
|
size() {
|
|
return this._numLeafs;
|
|
}
|
|
root() {
|
|
return this._root;
|
|
}
|
|
get(getNodeValue, handlers) {
|
|
var _this$getLeafNode;
|
|
return (_this$getLeafNode = this.getLeafNode(getNodeValue, handlers)) === null || _this$getLeafNode === void 0 ? void 0 : _this$getLeafNode.value;
|
|
}
|
|
getLeafNode(getNodeValue, handlers) {
|
|
return findLeaf(this.root(), (nodeKey) => this._mapNodeValue(getNodeValue(nodeKey)), {
|
|
onNodeVisit: (node) => {
|
|
handlers === null || handlers === void 0 ? void 0 : handlers.onNodeVisit(node);
|
|
if (node.type === "leaf") {
|
|
this._onHit(node);
|
|
}
|
|
}
|
|
});
|
|
}
|
|
set(route, value, handlers) {
|
|
let leafNode;
|
|
const newRoot = addLeaf(this.root(), route.map(([nodeKey, nodeValue]) => [nodeKey, this._mapNodeValue(nodeValue)]), null, value, null, {
|
|
onNodeVisit: (node) => {
|
|
handlers === null || handlers === void 0 ? void 0 : handlers.onNodeVisit(node);
|
|
if (node.type === "leaf") {
|
|
leafNode = node;
|
|
}
|
|
}
|
|
});
|
|
if (!this.root()) {
|
|
this._root = newRoot;
|
|
}
|
|
this._numLeafs++;
|
|
this._onSet(Recoil_nullthrows(leafNode));
|
|
}
|
|
delete(node) {
|
|
if (!this.root()) {
|
|
return false;
|
|
}
|
|
const root = Recoil_nullthrows(this.root());
|
|
const existsInTree = pruneNodeFromTree(root, node, node.parent);
|
|
if (!existsInTree) {
|
|
return false;
|
|
}
|
|
if (node === root || root.type === "branch" && !root.branches.size) {
|
|
this._root = null;
|
|
this._numLeafs = 0;
|
|
return true;
|
|
}
|
|
this._numLeafs -= countDownstreamLeaves(node);
|
|
return true;
|
|
}
|
|
clear() {
|
|
this._numLeafs = 0;
|
|
this._root = null;
|
|
}
|
|
};
|
|
var findLeaf = (root, getNodeValue, handlers) => {
|
|
var _handlers$onNodeVisit;
|
|
if (root == null) {
|
|
return void 0;
|
|
}
|
|
handlers === null || handlers === void 0 ? void 0 : (_handlers$onNodeVisit = handlers.onNodeVisit) === null || _handlers$onNodeVisit === void 0 ? void 0 : _handlers$onNodeVisit.call(handlers, root);
|
|
if (root.type === "leaf") {
|
|
return root;
|
|
}
|
|
const nodeValue = getNodeValue(root.nodeKey);
|
|
return findLeaf(root.branches.get(nodeValue), getNodeValue, handlers);
|
|
};
|
|
var addLeaf = (root, route, parent, value, branchKey, handlers) => {
|
|
var _handlers$onNodeVisit2;
|
|
let node;
|
|
if (root == null) {
|
|
if (route.length === 0) {
|
|
node = {
|
|
type: "leaf",
|
|
value,
|
|
parent,
|
|
branchKey
|
|
};
|
|
} else {
|
|
const [path, ...rest] = route;
|
|
const [nodeKey, nodeValue] = path;
|
|
node = {
|
|
type: "branch",
|
|
nodeKey,
|
|
parent,
|
|
branches: /* @__PURE__ */ new Map(),
|
|
branchKey
|
|
};
|
|
node.branches.set(nodeValue, addLeaf(null, rest, node, value, nodeValue, handlers));
|
|
}
|
|
} else {
|
|
node = root;
|
|
if (route.length) {
|
|
const [path, ...rest] = route;
|
|
const [nodeKey, nodeValue] = path;
|
|
!(root.type === "branch" && root.nodeKey === nodeKey) ? true ? Recoil_invariant(false, "Existing cache must have a branch midway through the route with matching node key") : Recoil_invariant(false) : void 0;
|
|
root.branches.set(nodeValue, addLeaf(root.branches.get(nodeValue), rest, root, value, nodeValue, handlers));
|
|
}
|
|
}
|
|
handlers === null || handlers === void 0 ? void 0 : (_handlers$onNodeVisit2 = handlers.onNodeVisit) === null || _handlers$onNodeVisit2 === void 0 ? void 0 : _handlers$onNodeVisit2.call(handlers, node);
|
|
return node;
|
|
};
|
|
var pruneNodeFromTree = (root, node, parent) => {
|
|
if (!parent) {
|
|
return root === node;
|
|
}
|
|
parent.branches.delete(node.branchKey);
|
|
return pruneUpstreamBranches(root, parent, parent.parent);
|
|
};
|
|
var pruneUpstreamBranches = (root, branchNode, parent) => {
|
|
if (!parent) {
|
|
return root === branchNode;
|
|
}
|
|
if (branchNode.branches.size === 0) {
|
|
parent.branches.delete(branchNode.branchKey);
|
|
}
|
|
return pruneUpstreamBranches(root, parent, parent.parent);
|
|
};
|
|
var countDownstreamLeaves = (node) => node.type === "leaf" ? 1 : Array.from(node.branches.values()).reduce((sum2, currNode) => sum2 + countDownstreamLeaves(currNode), 0);
|
|
var Recoil_TreeCache = {
|
|
TreeCache
|
|
};
|
|
var Recoil_TreeCache_1 = Recoil_TreeCache.TreeCache;
|
|
var Recoil_TreeCache$1 = /* @__PURE__ */ Object.freeze({
|
|
__proto__: null,
|
|
TreeCache: Recoil_TreeCache_1
|
|
});
|
|
var LRUCache = class {
|
|
constructor(options) {
|
|
var _options$mapKey;
|
|
_defineProperty(this, "_maxSize", void 0);
|
|
_defineProperty(this, "_size", void 0);
|
|
_defineProperty(this, "_head", void 0);
|
|
_defineProperty(this, "_tail", void 0);
|
|
_defineProperty(this, "_map", void 0);
|
|
_defineProperty(this, "_keyMapper", void 0);
|
|
this._maxSize = options.maxSize;
|
|
this._size = 0;
|
|
this._head = null;
|
|
this._tail = null;
|
|
this._map = /* @__PURE__ */ new Map();
|
|
this._keyMapper = (_options$mapKey = options.mapKey) !== null && _options$mapKey !== void 0 ? _options$mapKey : (v3) => v3;
|
|
}
|
|
head() {
|
|
return this._head;
|
|
}
|
|
tail() {
|
|
return this._tail;
|
|
}
|
|
size() {
|
|
return this._size;
|
|
}
|
|
maxSize() {
|
|
return this._maxSize;
|
|
}
|
|
has(key2) {
|
|
return this._map.has(this._keyMapper(key2));
|
|
}
|
|
get(key2) {
|
|
const mappedKey = this._keyMapper(key2);
|
|
const node = this._map.get(mappedKey);
|
|
if (!node) {
|
|
return void 0;
|
|
}
|
|
this.set(key2, node.value);
|
|
return node.value;
|
|
}
|
|
set(key2, val) {
|
|
const mappedKey = this._keyMapper(key2);
|
|
const existingNode = this._map.get(mappedKey);
|
|
if (existingNode) {
|
|
this.delete(key2);
|
|
}
|
|
const head = this.head();
|
|
const node = {
|
|
key: key2,
|
|
right: head,
|
|
left: null,
|
|
value: val
|
|
};
|
|
if (head) {
|
|
head.left = node;
|
|
} else {
|
|
this._tail = node;
|
|
}
|
|
this._map.set(mappedKey, node);
|
|
this._head = node;
|
|
this._size++;
|
|
this._maybeDeleteLRU();
|
|
}
|
|
_maybeDeleteLRU() {
|
|
if (this.size() > this.maxSize()) {
|
|
this.deleteLru();
|
|
}
|
|
}
|
|
deleteLru() {
|
|
const tail = this.tail();
|
|
if (tail) {
|
|
this.delete(tail.key);
|
|
}
|
|
}
|
|
delete(key2) {
|
|
const mappedKey = this._keyMapper(key2);
|
|
if (!this._size || !this._map.has(mappedKey)) {
|
|
return;
|
|
}
|
|
const node = Recoil_nullthrows(this._map.get(mappedKey));
|
|
const right = node.right;
|
|
const left = node.left;
|
|
if (right) {
|
|
right.left = node.left;
|
|
}
|
|
if (left) {
|
|
left.right = node.right;
|
|
}
|
|
if (node === this.head()) {
|
|
this._head = right;
|
|
}
|
|
if (node === this.tail()) {
|
|
this._tail = left;
|
|
}
|
|
this._map.delete(mappedKey);
|
|
this._size--;
|
|
}
|
|
clear() {
|
|
this._size = 0;
|
|
this._head = null;
|
|
this._tail = null;
|
|
this._map = /* @__PURE__ */ new Map();
|
|
}
|
|
};
|
|
var Recoil_LRUCache = {
|
|
LRUCache
|
|
};
|
|
var Recoil_LRUCache_1 = Recoil_LRUCache.LRUCache;
|
|
var Recoil_LRUCache$1 = /* @__PURE__ */ Object.freeze({
|
|
__proto__: null,
|
|
LRUCache: Recoil_LRUCache_1
|
|
});
|
|
var {
|
|
LRUCache: LRUCache$1
|
|
} = Recoil_LRUCache$1;
|
|
var {
|
|
TreeCache: TreeCache$1
|
|
} = Recoil_TreeCache$1;
|
|
function treeCacheLRU(maxSize, mapNodeValue = (v3) => v3) {
|
|
const lruCache = new LRUCache$1({
|
|
maxSize
|
|
});
|
|
const cache = new TreeCache$1({
|
|
mapNodeValue,
|
|
onHit: (node) => {
|
|
lruCache.set(node, true);
|
|
},
|
|
onSet: (node) => {
|
|
const lruNode = lruCache.tail();
|
|
lruCache.set(node, true);
|
|
if (lruNode && cache.size() > maxSize) {
|
|
cache.delete(lruNode.key);
|
|
}
|
|
}
|
|
});
|
|
return cache;
|
|
}
|
|
var Recoil_treeCacheLRU = treeCacheLRU;
|
|
var {
|
|
TreeCache: TreeCache$2
|
|
} = Recoil_TreeCache$1;
|
|
var defaultPolicy = {
|
|
equality: "reference",
|
|
eviction: "keep-all",
|
|
maxSize: Infinity
|
|
};
|
|
function treeCacheFromPolicy({
|
|
equality = defaultPolicy.equality,
|
|
eviction = defaultPolicy.eviction,
|
|
maxSize = defaultPolicy.maxSize
|
|
} = defaultPolicy) {
|
|
const valueMapper = getValueMapper(equality);
|
|
const treeCache = getTreeCache(eviction, maxSize, valueMapper);
|
|
return treeCache;
|
|
}
|
|
function getValueMapper(equality) {
|
|
switch (equality) {
|
|
case "reference":
|
|
return (val) => val;
|
|
case "value":
|
|
return (val) => Recoil_stableStringify(val);
|
|
}
|
|
throw new Error(`Unrecognized equality policy ${equality}`);
|
|
}
|
|
function getTreeCache(eviction, maxSize, mapNodeValue) {
|
|
switch (eviction) {
|
|
case "keep-all":
|
|
return new TreeCache$2({
|
|
mapNodeValue
|
|
});
|
|
case "lru":
|
|
return Recoil_treeCacheLRU(Recoil_nullthrows(maxSize), mapNodeValue);
|
|
case "most-recent":
|
|
return Recoil_treeCacheLRU(1, mapNodeValue);
|
|
}
|
|
throw new Error(`Unrecognized eviction policy ${eviction}`);
|
|
}
|
|
var Recoil_treeCacheFromPolicy = treeCacheFromPolicy;
|
|
function startPerfBlock(_id) {
|
|
return () => null;
|
|
}
|
|
var Recoil_PerformanceTimings = {
|
|
startPerfBlock
|
|
};
|
|
var {
|
|
CANCELED: CANCELED$2,
|
|
Canceled: Canceled$1,
|
|
loadableWithError: loadableWithError$1,
|
|
loadableWithPromise: loadableWithPromise$1,
|
|
loadableWithValue: loadableWithValue$2
|
|
} = Recoil_Loadable;
|
|
var {
|
|
getNodeLoadable: getNodeLoadable$2,
|
|
peekNodeLoadable: peekNodeLoadable$1,
|
|
setNodeValue: setNodeValue$3
|
|
} = Recoil_FunctionalCore;
|
|
var {
|
|
saveDependencyMapToStore: saveDependencyMapToStore$1
|
|
} = Recoil_Graph;
|
|
var {
|
|
DEFAULT_VALUE: DEFAULT_VALUE$4,
|
|
RecoilValueNotReady: RecoilValueNotReady$2,
|
|
getConfigDeletionHandler: getConfigDeletionHandler$1,
|
|
registerNode: registerNode$1
|
|
} = Recoil_Node;
|
|
var {
|
|
isRecoilValue: isRecoilValue$3
|
|
} = Recoil_RecoilValue$1;
|
|
var {
|
|
AbstractRecoilValue: AbstractRecoilValue$4
|
|
} = Recoil_RecoilValue$1;
|
|
var {
|
|
setRecoilValueLoadable: setRecoilValueLoadable$2
|
|
} = Recoil_RecoilValueInterface;
|
|
var {
|
|
retainedByOptionWithDefault: retainedByOptionWithDefault$1
|
|
} = Recoil_Retention;
|
|
var {
|
|
cloneSnapshot: cloneSnapshot$2
|
|
} = Recoil_Snapshot$1;
|
|
var {
|
|
startPerfBlock: startPerfBlock$1
|
|
} = Recoil_PerformanceTimings;
|
|
var dependencyStack = [];
|
|
var waitingStores = /* @__PURE__ */ new Map();
|
|
var getNewExecutionId = (() => {
|
|
let executionId = 0;
|
|
return () => executionId++;
|
|
})();
|
|
function getInitialExecutionInfo() {
|
|
return {
|
|
depValuesDiscoveredSoFarDuringAsyncWork: null,
|
|
latestLoadable: null,
|
|
latestExecutionId: null,
|
|
stateVersion: null
|
|
};
|
|
}
|
|
function selector(options) {
|
|
const {
|
|
key: key2,
|
|
get,
|
|
cachePolicy_UNSTABLE: cachePolicy
|
|
} = options;
|
|
const set = options.set != null ? options.set : void 0;
|
|
const cache = Recoil_treeCacheFromPolicy(cachePolicy !== null && cachePolicy !== void 0 ? cachePolicy : {
|
|
equality: "reference",
|
|
eviction: "keep-all"
|
|
});
|
|
const retainedBy = retainedByOptionWithDefault$1(options.retainedBy_UNSTABLE);
|
|
const executionInfoMap = /* @__PURE__ */ new Map();
|
|
let liveStoresCount = 0;
|
|
function selectorIsLive() {
|
|
return !Recoil_gkx_1("recoil_memory_managament_2020") || liveStoresCount > 0;
|
|
}
|
|
function getExecutionInfo(store) {
|
|
if (!executionInfoMap.has(store)) {
|
|
executionInfoMap.set(store, getInitialExecutionInfo());
|
|
}
|
|
return Recoil_nullthrows(executionInfoMap.get(store));
|
|
}
|
|
function selectorInit(store) {
|
|
liveStoresCount++;
|
|
store.getState().knownSelectors.add(key2);
|
|
return () => {
|
|
liveStoresCount--;
|
|
store.getState().knownSelectors.delete(key2);
|
|
executionInfoMap.delete(store);
|
|
};
|
|
}
|
|
function selectorShouldDeleteConfigOnRelease() {
|
|
return getConfigDeletionHandler$1(key2) !== void 0 && !selectorIsLive();
|
|
}
|
|
function notifyStoreWhenAsyncSettles(store, loadable, executionId) {
|
|
if (loadable.state === "loading") {
|
|
let stores = waitingStores.get(executionId);
|
|
if (stores == null) {
|
|
waitingStores.set(executionId, stores = /* @__PURE__ */ new Set());
|
|
}
|
|
stores.add(store);
|
|
}
|
|
}
|
|
function notifyStoresOfSettledAsync(newLoadable, executionId) {
|
|
const stores = waitingStores.get(executionId);
|
|
if (stores !== void 0) {
|
|
for (const store of stores) {
|
|
setRecoilValueLoadable$2(store, new AbstractRecoilValue$4(key2), newLoadable);
|
|
}
|
|
waitingStores.delete(executionId);
|
|
}
|
|
}
|
|
function getCachedNodeLoadable(store, state, key3) {
|
|
const isKeyPointingToSelector = store.getState().knownSelectors.has(key3);
|
|
if (isKeyPointingToSelector && state.atomValues.has(key3)) {
|
|
return Recoil_nullthrows(state.atomValues.get(key3));
|
|
}
|
|
const loadable = getNodeLoadable$2(store, state, key3);
|
|
if (loadable.state !== "loading" && isKeyPointingToSelector) {
|
|
state.atomValues.set(key3, loadable);
|
|
}
|
|
return loadable;
|
|
}
|
|
function wrapPendingPromise(store, promise, state, depValues, executionId) {
|
|
return promise.then((value) => {
|
|
if (!selectorIsLive()) {
|
|
clearExecutionInfo(store, executionId);
|
|
return CANCELED$2;
|
|
}
|
|
const loadable = loadableWithValue$2(value);
|
|
maybeFreezeValue(value);
|
|
setCache(state, depValuesToDepRoute(depValues), loadable);
|
|
setDepsInStore(store, state, new Set(depValues.keys()), executionId);
|
|
setLoadableInStoreToNotifyDeps(store, loadable, executionId);
|
|
return {
|
|
__value: value,
|
|
__key: key2
|
|
};
|
|
}).catch((errorOrPromise) => {
|
|
if (!selectorIsLive()) {
|
|
clearExecutionInfo(store, executionId);
|
|
return CANCELED$2;
|
|
}
|
|
if (isLatestExecution(store, executionId)) {
|
|
updateExecutionInfoDepValues(depValues, store, executionId);
|
|
}
|
|
if (Recoil_isPromise(errorOrPromise)) {
|
|
return wrapPendingDependencyPromise(store, errorOrPromise, state, depValues, executionId);
|
|
}
|
|
const loadable = loadableWithError$1(errorOrPromise);
|
|
maybeFreezeValue(errorOrPromise);
|
|
setCache(state, depValuesToDepRoute(depValues), loadable);
|
|
setDepsInStore(store, state, new Set(depValues.keys()), executionId);
|
|
setLoadableInStoreToNotifyDeps(store, loadable, executionId);
|
|
throw errorOrPromise;
|
|
});
|
|
}
|
|
function wrapPendingDependencyPromise(store, promise, state, existingDeps, executionId) {
|
|
return promise.then((resolvedDep) => {
|
|
if (!selectorIsLive()) {
|
|
clearExecutionInfo(store, executionId);
|
|
return CANCELED$2;
|
|
}
|
|
if (resolvedDep instanceof Canceled$1) {
|
|
Recoil_recoverableViolation("Selector was released while it had dependencies");
|
|
return CANCELED$2;
|
|
}
|
|
const {
|
|
__key: resolvedDepKey,
|
|
__value: depValue
|
|
} = resolvedDep !== null && resolvedDep !== void 0 ? resolvedDep : {};
|
|
let bypassSelectorDepCacheOnReevaluation = true;
|
|
if (resolvedDepKey != null) {
|
|
state.atomValues.set(resolvedDepKey, loadableWithValue$2(depValue));
|
|
bypassSelectorDepCacheOnReevaluation = false;
|
|
}
|
|
const cachedLoadable = getValFromCacheAndUpdatedDownstreamDeps(store, state);
|
|
if (cachedLoadable && cachedLoadable.state === "hasValue") {
|
|
setExecutionInfo(cachedLoadable, store);
|
|
return {
|
|
__value: cachedLoadable.contents,
|
|
__key: key2
|
|
};
|
|
}
|
|
if (!isLatestExecution(store, executionId)) {
|
|
var _executionInfo$latest;
|
|
const executionInfo = getExecutionInfoOfInProgressExecution(state);
|
|
if ((executionInfo === null || executionInfo === void 0 ? void 0 : (_executionInfo$latest = executionInfo.latestLoadable) === null || _executionInfo$latest === void 0 ? void 0 : _executionInfo$latest.state) === "loading") {
|
|
return executionInfo.latestLoadable.contents;
|
|
}
|
|
}
|
|
const [loadable, depValues] = evaluateSelectorGetter(store, state, executionId, bypassSelectorDepCacheOnReevaluation);
|
|
if (isLatestExecution(store, executionId)) {
|
|
updateExecutionInfoDepValues(depValues, store, executionId);
|
|
}
|
|
maybeFreezeLoadableContents(loadable);
|
|
if (loadable.state !== "loading") {
|
|
setCache(state, depValuesToDepRoute(depValues), loadable);
|
|
setDepsInStore(store, state, new Set(depValues.keys()), executionId);
|
|
setLoadableInStoreToNotifyDeps(store, loadable, executionId);
|
|
}
|
|
if (loadable.state === "hasError") {
|
|
throw loadable.contents;
|
|
}
|
|
if (loadable.state === "hasValue") {
|
|
return {
|
|
__value: loadable.contents,
|
|
__key: key2
|
|
};
|
|
}
|
|
return loadable.contents;
|
|
}).catch((error) => {
|
|
if (!selectorIsLive()) {
|
|
clearExecutionInfo(store, executionId);
|
|
return CANCELED$2;
|
|
}
|
|
const loadable = loadableWithError$1(error);
|
|
maybeFreezeValue(error);
|
|
setCache(state, depValuesToDepRoute(existingDeps), loadableWithError$1(error));
|
|
setDepsInStore(store, state, new Set(existingDeps.keys()), executionId);
|
|
setLoadableInStoreToNotifyDeps(store, loadable, executionId);
|
|
throw error;
|
|
});
|
|
}
|
|
function setLoadableInStoreToNotifyDeps(store, loadable, executionId) {
|
|
if (isLatestExecution(store, executionId)) {
|
|
setExecutionInfo(loadable, store);
|
|
notifyStoresOfSettledAsync(loadable, executionId);
|
|
}
|
|
}
|
|
function setDepsInStore(store, state, deps, executionId) {
|
|
var _store$getState, _store$getState$curre, _store$getState2, _store$getState2$next;
|
|
if (isLatestExecution(store, executionId) || state.version === ((_store$getState = store.getState()) === null || _store$getState === void 0 ? void 0 : (_store$getState$curre = _store$getState.currentTree) === null || _store$getState$curre === void 0 ? void 0 : _store$getState$curre.version) || state.version === ((_store$getState2 = store.getState()) === null || _store$getState2 === void 0 ? void 0 : (_store$getState2$next = _store$getState2.nextTree) === null || _store$getState2$next === void 0 ? void 0 : _store$getState2$next.version)) {
|
|
var _store$getState$nextT, _store$getState3, _store$getState3$next;
|
|
saveDependencyMapToStore$1(/* @__PURE__ */ new Map([[key2, deps]]), store, (_store$getState$nextT = (_store$getState3 = store.getState()) === null || _store$getState3 === void 0 ? void 0 : (_store$getState3$next = _store$getState3.nextTree) === null || _store$getState3$next === void 0 ? void 0 : _store$getState3$next.version) !== null && _store$getState$nextT !== void 0 ? _store$getState$nextT : store.getState().currentTree.version);
|
|
}
|
|
}
|
|
function setNewDepInStore(store, state, deps, newDepKey, executionId) {
|
|
deps.add(newDepKey);
|
|
setDepsInStore(store, state, deps, executionId);
|
|
}
|
|
function evaluateSelectorGetter(store, state, executionId, bypassSelectorDepCache = false) {
|
|
const endPerfBlock = startPerfBlock$1(key2);
|
|
let result;
|
|
let resultIsError = false;
|
|
let loadable;
|
|
const depValues = /* @__PURE__ */ new Map();
|
|
const deps = /* @__PURE__ */ new Set();
|
|
setDepsInStore(store, state, deps, executionId);
|
|
function getRecoilValue(recoilValue) {
|
|
const {
|
|
key: depKey
|
|
} = recoilValue;
|
|
setNewDepInStore(store, state, deps, depKey, executionId);
|
|
const depLoadable = bypassSelectorDepCache ? getNodeLoadable$2(store, state, depKey) : getCachedNodeLoadable(store, state, depKey);
|
|
maybeFreezeLoadableContents(depLoadable);
|
|
depValues.set(depKey, depLoadable);
|
|
if (depLoadable.state === "hasValue") {
|
|
return depLoadable.contents;
|
|
}
|
|
throw depLoadable.contents;
|
|
}
|
|
let gateCallback = false;
|
|
const getCallback = (fn2) => {
|
|
return (...args) => {
|
|
if (!gateCallback) {
|
|
throw new Error("getCallback() should only be called asynchronously after the selector is evalutated. It can be used for selectors to return objects with callbacks that can obtain the current Recoil state without a subscription.");
|
|
}
|
|
const snapshot = cloneSnapshot$2(store);
|
|
const cb = fn2({
|
|
snapshot
|
|
});
|
|
if (typeof cb !== "function") {
|
|
throw new Error("getCallback() expects a function that returns a function.");
|
|
}
|
|
return cb(...args);
|
|
};
|
|
};
|
|
try {
|
|
result = get({
|
|
get: getRecoilValue,
|
|
getCallback
|
|
});
|
|
result = isRecoilValue$3(result) ? getRecoilValue(result) : result;
|
|
gateCallback = true;
|
|
if (Recoil_isPromise(result)) {
|
|
result = wrapPendingPromise(store, result, state, depValues, executionId).finally(endPerfBlock);
|
|
} else {
|
|
endPerfBlock();
|
|
}
|
|
} catch (errorOrDepPromise) {
|
|
result = errorOrDepPromise;
|
|
if (Recoil_isPromise(result)) {
|
|
result = wrapPendingDependencyPromise(store, result, state, depValues, executionId).finally(endPerfBlock);
|
|
} else {
|
|
resultIsError = true;
|
|
endPerfBlock();
|
|
}
|
|
}
|
|
if (resultIsError) {
|
|
loadable = loadableWithError$1(result);
|
|
} else if (Recoil_isPromise(result)) {
|
|
loadable = loadableWithPromise$1(result);
|
|
} else {
|
|
loadable = loadableWithValue$2(result);
|
|
}
|
|
maybeFreezeLoadableContents(loadable);
|
|
return [loadable, depValues];
|
|
}
|
|
function getValFromCacheAndUpdatedDownstreamDeps(store, state) {
|
|
const depsAfterCacheDone = /* @__PURE__ */ new Set();
|
|
const executionInfo = getExecutionInfo(store);
|
|
const cachedVal = cache.get((nodeKey) => {
|
|
!(typeof nodeKey === "string") ? true ? Recoil_invariant(false, "Cache nodeKey is type string") : Recoil_invariant(false) : void 0;
|
|
const loadable = getCachedNodeLoadable(store, state, nodeKey);
|
|
return loadable.contents;
|
|
}, {
|
|
onNodeVisit: (node) => {
|
|
if (node.type === "branch" && node.nodeKey !== key2 && typeof node.nodeKey === "string") {
|
|
depsAfterCacheDone.add(node.nodeKey);
|
|
}
|
|
}
|
|
});
|
|
if (cachedVal) {
|
|
setDepsInStore(store, state, depsAfterCacheDone, executionInfo.latestExecutionId);
|
|
}
|
|
return cachedVal;
|
|
}
|
|
function depValuesToDepRoute(depValues) {
|
|
return Array.from(depValues.entries()).map(([key3, valLoadable]) => [key3, valLoadable.contents]);
|
|
}
|
|
function getValFromRunningNewExecutionAndUpdatedDeps(store, state) {
|
|
const newExecutionId = getNewExecutionId();
|
|
const [loadable, newDepValues] = evaluateSelectorGetter(store, state, newExecutionId);
|
|
setExecutionInfo(loadable, store, newDepValues, newExecutionId, state);
|
|
maybeSetCacheWithLoadable(state, depValuesToDepRoute(newDepValues), loadable);
|
|
notifyStoreWhenAsyncSettles(store, loadable, newExecutionId);
|
|
return loadable;
|
|
}
|
|
function getSelectorValAndUpdatedDeps(store, state) {
|
|
const cachedVal = getValFromCacheAndUpdatedDownstreamDeps(store, state);
|
|
if (cachedVal != null) {
|
|
setExecutionInfo(cachedVal, store);
|
|
return cachedVal;
|
|
}
|
|
const inProgressExecutionInfo = getExecutionInfoOfInProgressExecution(state);
|
|
if (inProgressExecutionInfo) {
|
|
const executionInfo = inProgressExecutionInfo;
|
|
notifyStoreWhenAsyncSettles(store, Recoil_nullthrows(executionInfo.latestLoadable), Recoil_nullthrows(executionInfo.latestExecutionId));
|
|
return Recoil_nullthrows(executionInfo.latestLoadable);
|
|
}
|
|
return getValFromRunningNewExecutionAndUpdatedDeps(store, state);
|
|
}
|
|
function getExecutionInfoOfInProgressExecution(state) {
|
|
var _Array$from$find;
|
|
const [, executionInfo] = (_Array$from$find = Array.from(executionInfoMap.entries()).find(([store, executionInfo2]) => {
|
|
return executionInfo2.latestLoadable != null && executionInfo2.latestExecutionId != null && !haveAsyncDepsChanged(store, state);
|
|
})) !== null && _Array$from$find !== void 0 ? _Array$from$find : [];
|
|
return executionInfo;
|
|
}
|
|
const mapOfCheckedVersions = /* @__PURE__ */ new Map();
|
|
function haveAsyncDepsChanged(store, state) {
|
|
var _executionInfo$depVal, _mapOfCheckedVersions;
|
|
const executionInfo = getExecutionInfo(store);
|
|
const oldDepValues = (_executionInfo$depVal = executionInfo.depValuesDiscoveredSoFarDuringAsyncWork) !== null && _executionInfo$depVal !== void 0 ? _executionInfo$depVal : /* @__PURE__ */ new Map();
|
|
const cachedDepValuesCheckedForThisVersion = Array(((_mapOfCheckedVersions = mapOfCheckedVersions.get(state.version)) !== null && _mapOfCheckedVersions !== void 0 ? _mapOfCheckedVersions : /* @__PURE__ */ new Map()).entries());
|
|
const isCachedVersionSame = mapOfCheckedVersions.has(state.version) && cachedDepValuesCheckedForThisVersion.length === oldDepValues.size && cachedDepValuesCheckedForThisVersion.every(([nodeKey, nodeVal]) => {
|
|
return oldDepValues.get(nodeKey) === nodeVal;
|
|
});
|
|
if (oldDepValues == null || state.version === executionInfo.stateVersion || isCachedVersionSame) {
|
|
return false;
|
|
}
|
|
mapOfCheckedVersions.set(state.version, new Map(oldDepValues));
|
|
return Array.from(oldDepValues).some(([nodeKey, oldVal]) => {
|
|
const loadable = getCachedNodeLoadable(store, state, nodeKey);
|
|
return loadable.contents !== oldVal.contents;
|
|
});
|
|
}
|
|
function setExecutionInfo(loadable, store, depValues, newExecutionId, state) {
|
|
const executionInfo = getExecutionInfo(store);
|
|
if (loadable.state === "loading") {
|
|
executionInfo.depValuesDiscoveredSoFarDuringAsyncWork = depValues;
|
|
executionInfo.latestExecutionId = newExecutionId;
|
|
executionInfo.latestLoadable = loadable;
|
|
executionInfo.stateVersion = state === null || state === void 0 ? void 0 : state.version;
|
|
} else {
|
|
executionInfo.depValuesDiscoveredSoFarDuringAsyncWork = null;
|
|
executionInfo.latestExecutionId = null;
|
|
executionInfo.latestLoadable = null;
|
|
executionInfo.stateVersion = null;
|
|
}
|
|
}
|
|
function maybeSetCacheWithLoadable(state, depRoute, loadable) {
|
|
if (loadable.state !== "loading") {
|
|
setCache(state, depRoute, loadable);
|
|
}
|
|
}
|
|
function updateExecutionInfoDepValues(depValues, store, executionId) {
|
|
const executionInfo = getExecutionInfo(store);
|
|
if (isLatestExecution(store, executionId)) {
|
|
executionInfo.depValuesDiscoveredSoFarDuringAsyncWork = depValues;
|
|
}
|
|
}
|
|
function clearExecutionInfo(store, executionId) {
|
|
if (isLatestExecution(store, executionId)) {
|
|
executionInfoMap.delete(store);
|
|
}
|
|
}
|
|
function isLatestExecution(store, executionId) {
|
|
const executionInfo = getExecutionInfo(store);
|
|
return executionId === executionInfo.latestExecutionId;
|
|
}
|
|
function maybeFreezeLoadableContents(loadable) {
|
|
if (loadable.state !== "loading") {
|
|
maybeFreezeValue(loadable.contents);
|
|
}
|
|
}
|
|
function maybeFreezeValue(val) {
|
|
if (true) {
|
|
if (Boolean(options.dangerouslyAllowMutability) === false) {
|
|
Recoil_deepFreezeValue(val);
|
|
}
|
|
}
|
|
}
|
|
function setCache(state, cacheRoute, loadable) {
|
|
state.atomValues.set(key2, loadable);
|
|
cache.set(cacheRoute, loadable);
|
|
}
|
|
function detectCircularDependencies(fn2) {
|
|
if (dependencyStack.includes(key2)) {
|
|
const message = `Recoil selector has circular dependencies: ${dependencyStack.slice(dependencyStack.indexOf(key2)).join(" \u2192 ")}`;
|
|
return loadableWithError$1(new Error(message));
|
|
}
|
|
dependencyStack.push(key2);
|
|
try {
|
|
return fn2();
|
|
} finally {
|
|
dependencyStack.pop();
|
|
}
|
|
}
|
|
function selectorPeek(store, state) {
|
|
const cacheVal = cache.get((nodeKey) => {
|
|
!(typeof nodeKey === "string") ? true ? Recoil_invariant(false, "Cache nodeKey is type string") : Recoil_invariant(false) : void 0;
|
|
const peek = peekNodeLoadable$1(store, state, nodeKey);
|
|
return peek === null || peek === void 0 ? void 0 : peek.contents;
|
|
});
|
|
return cacheVal;
|
|
}
|
|
function selectorGet(store, state) {
|
|
return detectCircularDependencies(() => getSelectorValAndUpdatedDeps(store, state));
|
|
}
|
|
function invalidateSelector(state) {
|
|
state.atomValues.delete(key2);
|
|
}
|
|
if (set != null) {
|
|
const selectorSet = (store, state, newValue) => {
|
|
let syncSelectorSetFinished = false;
|
|
const writes = /* @__PURE__ */ new Map();
|
|
function getRecoilValue({
|
|
key: key3
|
|
}) {
|
|
if (syncSelectorSetFinished) {
|
|
throw new Error("Recoil: Async selector sets are not currently supported.");
|
|
}
|
|
const loadable = getCachedNodeLoadable(store, state, key3);
|
|
maybeFreezeLoadableContents(loadable);
|
|
if (loadable.state === "hasValue") {
|
|
return loadable.contents;
|
|
} else if (loadable.state === "loading") {
|
|
throw new RecoilValueNotReady$2(key3);
|
|
} else {
|
|
throw loadable.contents;
|
|
}
|
|
}
|
|
function setRecoilState(recoilState, valueOrUpdater) {
|
|
if (syncSelectorSetFinished) {
|
|
throw new Error("Recoil: Async selector sets are not currently supported.");
|
|
}
|
|
const newValue2 = typeof valueOrUpdater === "function" ? valueOrUpdater(getRecoilValue(recoilState)) : valueOrUpdater;
|
|
const upstreamWrites = setNodeValue$3(store, state, recoilState.key, newValue2);
|
|
upstreamWrites.forEach((v3, k5) => writes.set(k5, v3));
|
|
}
|
|
function resetRecoilState(recoilState) {
|
|
setRecoilState(recoilState, DEFAULT_VALUE$4);
|
|
}
|
|
const ret = set({
|
|
set: setRecoilState,
|
|
get: getRecoilValue,
|
|
reset: resetRecoilState
|
|
}, newValue);
|
|
if (ret !== void 0) {
|
|
throw Recoil_isPromise(ret) ? new Error("Recoil: Async selector sets are not currently supported.") : new Error("Recoil: selector set should be a void function.");
|
|
}
|
|
syncSelectorSetFinished = true;
|
|
return writes;
|
|
};
|
|
return registerNode$1({
|
|
key: key2,
|
|
nodeType: "selector",
|
|
peek: selectorPeek,
|
|
get: selectorGet,
|
|
set: selectorSet,
|
|
init: selectorInit,
|
|
invalidate: invalidateSelector,
|
|
shouldDeleteConfigOnRelease: selectorShouldDeleteConfigOnRelease,
|
|
dangerouslyAllowMutability: options.dangerouslyAllowMutability,
|
|
shouldRestoreFromSnapshots: false,
|
|
retainedBy
|
|
});
|
|
} else {
|
|
return registerNode$1({
|
|
key: key2,
|
|
nodeType: "selector",
|
|
peek: selectorPeek,
|
|
get: selectorGet,
|
|
init: selectorInit,
|
|
invalidate: invalidateSelector,
|
|
shouldDeleteConfigOnRelease: selectorShouldDeleteConfigOnRelease,
|
|
dangerouslyAllowMutability: options.dangerouslyAllowMutability,
|
|
shouldRestoreFromSnapshots: false,
|
|
retainedBy
|
|
});
|
|
}
|
|
}
|
|
var Recoil_selector = selector;
|
|
var {
|
|
loadableWithError: loadableWithError$2,
|
|
loadableWithPromise: loadableWithPromise$2,
|
|
loadableWithValue: loadableWithValue$3
|
|
} = Recoil_Loadable;
|
|
var {
|
|
DEFAULT_VALUE: DEFAULT_VALUE$5,
|
|
DefaultValue: DefaultValue$2,
|
|
getConfigDeletionHandler: getConfigDeletionHandler$2,
|
|
registerNode: registerNode$2,
|
|
setConfigDeletionHandler: setConfigDeletionHandler$1
|
|
} = Recoil_Node;
|
|
var {
|
|
isRecoilValue: isRecoilValue$4
|
|
} = Recoil_RecoilValue$1;
|
|
var {
|
|
markRecoilValueModified: markRecoilValueModified$1,
|
|
setRecoilValue: setRecoilValue$3,
|
|
setRecoilValueLoadable: setRecoilValueLoadable$3
|
|
} = Recoil_RecoilValueInterface;
|
|
var {
|
|
retainedByOptionWithDefault: retainedByOptionWithDefault$2
|
|
} = Recoil_Retention;
|
|
function baseAtom(options) {
|
|
const {
|
|
key: key2,
|
|
persistence_UNSTABLE: persistence
|
|
} = options;
|
|
const retainedBy = retainedByOptionWithDefault$2(options.retainedBy_UNSTABLE);
|
|
let liveStoresCount = 0;
|
|
let defaultLoadable = Recoil_isPromise(options.default) ? loadableWithPromise$2(options.default.then((value) => {
|
|
defaultLoadable = loadableWithValue$3(value);
|
|
const promiseInfo = {
|
|
__key: key2,
|
|
__value: value
|
|
};
|
|
return promiseInfo;
|
|
}).catch((error) => {
|
|
defaultLoadable = loadableWithError$2(error);
|
|
throw error;
|
|
})) : loadableWithValue$3(options.default);
|
|
let cachedAnswerForUnvalidatedValue = void 0;
|
|
const cleanupEffectsByStore = /* @__PURE__ */ new Map();
|
|
function wrapPendingPromise(store, promise) {
|
|
const wrappedPromise = promise.then((value) => {
|
|
var _store$getState$nextT, _state$atomValues$get;
|
|
const state = (_store$getState$nextT = store.getState().nextTree) !== null && _store$getState$nextT !== void 0 ? _store$getState$nextT : store.getState().currentTree;
|
|
if (((_state$atomValues$get = state.atomValues.get(key2)) === null || _state$atomValues$get === void 0 ? void 0 : _state$atomValues$get.contents) === wrappedPromise) {
|
|
setRecoilValue$3(store, node, value);
|
|
}
|
|
return {
|
|
__key: key2,
|
|
__value: value
|
|
};
|
|
}).catch((error) => {
|
|
var _store$getState$nextT2, _state$atomValues$get2;
|
|
const state = (_store$getState$nextT2 = store.getState().nextTree) !== null && _store$getState$nextT2 !== void 0 ? _store$getState$nextT2 : store.getState().currentTree;
|
|
if (((_state$atomValues$get2 = state.atomValues.get(key2)) === null || _state$atomValues$get2 === void 0 ? void 0 : _state$atomValues$get2.contents) === wrappedPromise) {
|
|
setRecoilValueLoadable$3(store, node, loadableWithError$2(error));
|
|
}
|
|
throw error;
|
|
});
|
|
return wrappedPromise;
|
|
}
|
|
function initAtom(store, initState, trigger) {
|
|
liveStoresCount++;
|
|
const alreadyKnown = store.getState().knownAtoms.has(key2);
|
|
store.getState().knownAtoms.add(key2);
|
|
if (defaultLoadable.state === "loading") {
|
|
const notifyDefaultSubscribers = () => {
|
|
var _store$getState$nextT3;
|
|
const state = (_store$getState$nextT3 = store.getState().nextTree) !== null && _store$getState$nextT3 !== void 0 ? _store$getState$nextT3 : store.getState().currentTree;
|
|
if (!state.atomValues.has(key2)) {
|
|
markRecoilValueModified$1(store, node);
|
|
}
|
|
};
|
|
defaultLoadable.contents.then(notifyDefaultSubscribers).catch(notifyDefaultSubscribers);
|
|
}
|
|
let initValue = DEFAULT_VALUE$5;
|
|
let pendingSetSelf = null;
|
|
if (options.effects_UNSTABLE != null && !alreadyKnown) {
|
|
let duringInit = true;
|
|
const setSelf = (effect) => (valueOrUpdater) => {
|
|
if (duringInit) {
|
|
const currentValue = initValue instanceof DefaultValue$2 || Recoil_isPromise(initValue) ? defaultLoadable.state === "hasValue" ? defaultLoadable.contents : DEFAULT_VALUE$5 : initValue;
|
|
initValue = typeof valueOrUpdater === "function" ? valueOrUpdater(currentValue) : valueOrUpdater;
|
|
if (Recoil_isPromise(initValue)) {
|
|
initValue = initValue.then((value) => {
|
|
pendingSetSelf = {
|
|
effect,
|
|
value
|
|
};
|
|
return value;
|
|
});
|
|
}
|
|
} else {
|
|
if (Recoil_isPromise(valueOrUpdater)) {
|
|
throw new Error("Setting atoms to async values is not implemented.");
|
|
}
|
|
if (typeof valueOrUpdater !== "function") {
|
|
pendingSetSelf = {
|
|
effect,
|
|
value: valueOrUpdater
|
|
};
|
|
}
|
|
setRecoilValue$3(store, node, typeof valueOrUpdater === "function" ? (currentValue) => {
|
|
const newValue = valueOrUpdater(currentValue);
|
|
pendingSetSelf = {
|
|
effect,
|
|
value: newValue
|
|
};
|
|
return newValue;
|
|
} : valueOrUpdater);
|
|
}
|
|
};
|
|
const resetSelf = (effect) => () => setSelf(effect)(DEFAULT_VALUE$5);
|
|
const onSet = (effect) => (handler) => {
|
|
store.subscribeToTransactions((currentStore) => {
|
|
var _currentTree$atomValu;
|
|
let {
|
|
currentTree,
|
|
previousTree
|
|
} = currentStore.getState();
|
|
if (!previousTree) {
|
|
Recoil_recoverableViolation("Transaction subscribers notified without a next tree being present -- this is a bug in Recoil");
|
|
previousTree = currentTree;
|
|
}
|
|
const newLoadable = (_currentTree$atomValu = currentTree.atomValues.get(key2)) !== null && _currentTree$atomValu !== void 0 ? _currentTree$atomValu : defaultLoadable;
|
|
if (newLoadable.state === "hasValue") {
|
|
var _previousTree$atomVal, _pendingSetSelf, _pendingSetSelf2, _pendingSetSelf3;
|
|
const newValue = newLoadable.contents;
|
|
const oldLoadable = (_previousTree$atomVal = previousTree.atomValues.get(key2)) !== null && _previousTree$atomVal !== void 0 ? _previousTree$atomVal : defaultLoadable;
|
|
const oldValue = oldLoadable.state === "hasValue" ? oldLoadable.contents : DEFAULT_VALUE$5;
|
|
if (((_pendingSetSelf = pendingSetSelf) === null || _pendingSetSelf === void 0 ? void 0 : _pendingSetSelf.effect) !== effect || ((_pendingSetSelf2 = pendingSetSelf) === null || _pendingSetSelf2 === void 0 ? void 0 : _pendingSetSelf2.value) !== newValue) {
|
|
handler(newValue, oldValue);
|
|
} else if (((_pendingSetSelf3 = pendingSetSelf) === null || _pendingSetSelf3 === void 0 ? void 0 : _pendingSetSelf3.effect) === effect) {
|
|
pendingSetSelf = null;
|
|
}
|
|
}
|
|
}, key2);
|
|
};
|
|
for (const effect of (_options$effects_UNST = options.effects_UNSTABLE) !== null && _options$effects_UNST !== void 0 ? _options$effects_UNST : []) {
|
|
var _options$effects_UNST;
|
|
const cleanup = effect({
|
|
node,
|
|
trigger,
|
|
setSelf: setSelf(effect),
|
|
resetSelf: resetSelf(effect),
|
|
onSet: onSet(effect)
|
|
});
|
|
if (cleanup != null) {
|
|
var _cleanupEffectsByStor;
|
|
cleanupEffectsByStore.set(store, [...(_cleanupEffectsByStor = cleanupEffectsByStore.get(store)) !== null && _cleanupEffectsByStor !== void 0 ? _cleanupEffectsByStor : [], cleanup]);
|
|
}
|
|
}
|
|
duringInit = false;
|
|
}
|
|
if (!(initValue instanceof DefaultValue$2)) {
|
|
var _store$getState$nextT4;
|
|
const initLoadable = Recoil_isPromise(initValue) ? loadableWithPromise$2(wrapPendingPromise(store, initValue)) : loadableWithValue$3(initValue);
|
|
initState.atomValues.set(key2, initLoadable);
|
|
(_store$getState$nextT4 = store.getState().nextTree) === null || _store$getState$nextT4 === void 0 ? void 0 : _store$getState$nextT4.atomValues.set(key2, initLoadable);
|
|
}
|
|
return () => {
|
|
var _cleanupEffectsByStor2;
|
|
liveStoresCount--;
|
|
(_cleanupEffectsByStor2 = cleanupEffectsByStore.get(store)) === null || _cleanupEffectsByStor2 === void 0 ? void 0 : _cleanupEffectsByStor2.forEach((cleanup) => cleanup());
|
|
cleanupEffectsByStore.delete(store);
|
|
store.getState().knownAtoms.delete(key2);
|
|
};
|
|
}
|
|
function peekAtom(_store, state) {
|
|
var _ref, _state$atomValues$get3, _cachedAnswerForUnval;
|
|
return (_ref = (_state$atomValues$get3 = state.atomValues.get(key2)) !== null && _state$atomValues$get3 !== void 0 ? _state$atomValues$get3 : (_cachedAnswerForUnval = cachedAnswerForUnvalidatedValue) === null || _cachedAnswerForUnval === void 0 ? void 0 : _cachedAnswerForUnval[1]) !== null && _ref !== void 0 ? _ref : defaultLoadable;
|
|
}
|
|
function getAtom(_store, state) {
|
|
if (state.atomValues.has(key2)) {
|
|
return Recoil_nullthrows(state.atomValues.get(key2));
|
|
} else if (state.nonvalidatedAtoms.has(key2)) {
|
|
if (cachedAnswerForUnvalidatedValue != null) {
|
|
return cachedAnswerForUnvalidatedValue;
|
|
}
|
|
if (persistence == null) {
|
|
Recoil_expectationViolation(`Tried to restore a persisted value for atom ${key2} but it has no persistence settings.`);
|
|
return defaultLoadable;
|
|
}
|
|
const nonvalidatedValue = state.nonvalidatedAtoms.get(key2);
|
|
const validatorResult = persistence.validator(nonvalidatedValue, DEFAULT_VALUE$5);
|
|
const validatedValueLoadable = validatorResult instanceof DefaultValue$2 ? defaultLoadable : loadableWithValue$3(validatorResult);
|
|
cachedAnswerForUnvalidatedValue = validatedValueLoadable;
|
|
return cachedAnswerForUnvalidatedValue;
|
|
} else {
|
|
return defaultLoadable;
|
|
}
|
|
}
|
|
function invalidateAtom() {
|
|
cachedAnswerForUnvalidatedValue = void 0;
|
|
}
|
|
function setAtom(_store, state, newValue) {
|
|
if (state.atomValues.has(key2)) {
|
|
const existing = Recoil_nullthrows(state.atomValues.get(key2));
|
|
if (existing.state === "hasValue" && newValue === existing.contents) {
|
|
return /* @__PURE__ */ new Map();
|
|
}
|
|
} else if (!state.nonvalidatedAtoms.has(key2) && newValue instanceof DefaultValue$2) {
|
|
return /* @__PURE__ */ new Map();
|
|
}
|
|
if (true) {
|
|
if (options.dangerouslyAllowMutability !== true) {
|
|
Recoil_deepFreezeValue(newValue);
|
|
}
|
|
}
|
|
cachedAnswerForUnvalidatedValue = void 0;
|
|
return (/* @__PURE__ */ new Map()).set(key2, loadableWithValue$3(newValue));
|
|
}
|
|
function shouldDeleteConfigOnReleaseAtom() {
|
|
return getConfigDeletionHandler$2(key2) !== void 0 && liveStoresCount <= 0;
|
|
}
|
|
const node = registerNode$2({
|
|
key: key2,
|
|
nodeType: "atom",
|
|
peek: peekAtom,
|
|
get: getAtom,
|
|
set: setAtom,
|
|
init: initAtom,
|
|
invalidate: invalidateAtom,
|
|
shouldDeleteConfigOnRelease: shouldDeleteConfigOnReleaseAtom,
|
|
dangerouslyAllowMutability: options.dangerouslyAllowMutability,
|
|
persistence_UNSTABLE: options.persistence_UNSTABLE ? {
|
|
type: options.persistence_UNSTABLE.type,
|
|
backButton: options.persistence_UNSTABLE.backButton
|
|
} : void 0,
|
|
shouldRestoreFromSnapshots: true,
|
|
retainedBy
|
|
});
|
|
return node;
|
|
}
|
|
function atom(options) {
|
|
const {
|
|
default: optionsDefault,
|
|
...restOptions
|
|
} = options;
|
|
if (isRecoilValue$4(optionsDefault)) {
|
|
return atomWithFallback({
|
|
...restOptions,
|
|
default: optionsDefault
|
|
});
|
|
} else {
|
|
return baseAtom({
|
|
...restOptions,
|
|
default: optionsDefault
|
|
});
|
|
}
|
|
}
|
|
function atomWithFallback(options) {
|
|
const base = atom({
|
|
...options,
|
|
default: DEFAULT_VALUE$5,
|
|
persistence_UNSTABLE: options.persistence_UNSTABLE === void 0 ? void 0 : {
|
|
...options.persistence_UNSTABLE,
|
|
validator: (storedValue) => storedValue instanceof DefaultValue$2 ? storedValue : Recoil_nullthrows(options.persistence_UNSTABLE).validator(storedValue, DEFAULT_VALUE$5)
|
|
},
|
|
effects_UNSTABLE: options.effects_UNSTABLE
|
|
});
|
|
const sel = Recoil_selector({
|
|
key: `${options.key}__withFallback`,
|
|
get: ({
|
|
get
|
|
}) => {
|
|
const baseValue = get(base);
|
|
return baseValue instanceof DefaultValue$2 ? options.default : baseValue;
|
|
},
|
|
set: ({
|
|
set
|
|
}, newValue) => set(base, newValue),
|
|
dangerouslyAllowMutability: options.dangerouslyAllowMutability
|
|
});
|
|
setConfigDeletionHandler$1(sel.key, getConfigDeletionHandler$2(options.key));
|
|
return sel;
|
|
}
|
|
var Recoil_atom = atom;
|
|
var MapCache = class {
|
|
constructor(options) {
|
|
var _options$mapKey;
|
|
_defineProperty(this, "_map", void 0);
|
|
_defineProperty(this, "_keyMapper", void 0);
|
|
this._map = /* @__PURE__ */ new Map();
|
|
this._keyMapper = (_options$mapKey = options === null || options === void 0 ? void 0 : options.mapKey) !== null && _options$mapKey !== void 0 ? _options$mapKey : (v3) => v3;
|
|
}
|
|
size() {
|
|
return this._map.size;
|
|
}
|
|
has(key2) {
|
|
return this._map.has(this._keyMapper(key2));
|
|
}
|
|
get(key2) {
|
|
return this._map.get(this._keyMapper(key2));
|
|
}
|
|
set(key2, val) {
|
|
this._map.set(this._keyMapper(key2), val);
|
|
}
|
|
delete(key2) {
|
|
this._map.delete(this._keyMapper(key2));
|
|
}
|
|
clear() {
|
|
this._map.clear();
|
|
}
|
|
};
|
|
var Recoil_MapCache = {
|
|
MapCache
|
|
};
|
|
var Recoil_MapCache_1 = Recoil_MapCache.MapCache;
|
|
var Recoil_MapCache$1 = /* @__PURE__ */ Object.freeze({
|
|
__proto__: null,
|
|
MapCache: Recoil_MapCache_1
|
|
});
|
|
var {
|
|
LRUCache: LRUCache$2
|
|
} = Recoil_LRUCache$1;
|
|
var {
|
|
MapCache: MapCache$1
|
|
} = Recoil_MapCache$1;
|
|
var defaultPolicy$1 = {
|
|
equality: "reference",
|
|
eviction: "none",
|
|
maxSize: Infinity
|
|
};
|
|
function cacheFromPolicy({
|
|
equality = defaultPolicy$1.equality,
|
|
eviction = defaultPolicy$1.eviction,
|
|
maxSize = defaultPolicy$1.maxSize
|
|
} = defaultPolicy$1) {
|
|
const valueMapper = getValueMapper$1(equality);
|
|
const cache = getCache(eviction, maxSize, valueMapper);
|
|
return cache;
|
|
}
|
|
function getValueMapper$1(equality) {
|
|
switch (equality) {
|
|
case "reference":
|
|
return (val) => val;
|
|
case "value":
|
|
return (val) => Recoil_stableStringify(val);
|
|
}
|
|
throw new Error(`Unrecognized equality policy ${equality}`);
|
|
}
|
|
function getCache(eviction, maxSize, mapKey) {
|
|
switch (eviction) {
|
|
case "keep-all":
|
|
return new MapCache$1({
|
|
mapKey
|
|
});
|
|
case "lru":
|
|
return new LRUCache$2({
|
|
mapKey,
|
|
maxSize: Recoil_nullthrows(maxSize)
|
|
});
|
|
case "most-recent":
|
|
return new LRUCache$2({
|
|
mapKey,
|
|
maxSize: 1
|
|
});
|
|
}
|
|
throw new Error(`Unrecognized eviction policy ${eviction}`);
|
|
}
|
|
var Recoil_cacheFromPolicy = cacheFromPolicy;
|
|
var {
|
|
setConfigDeletionHandler: setConfigDeletionHandler$2
|
|
} = Recoil_Node;
|
|
function atomFamily(options) {
|
|
var _options$cachePolicyF, _options$cachePolicyF2;
|
|
const atomCache = Recoil_cacheFromPolicy({
|
|
equality: (_options$cachePolicyF = (_options$cachePolicyF2 = options.cachePolicyForParams_UNSTABLE) === null || _options$cachePolicyF2 === void 0 ? void 0 : _options$cachePolicyF2.equality) !== null && _options$cachePolicyF !== void 0 ? _options$cachePolicyF : "value",
|
|
eviction: "keep-all"
|
|
});
|
|
return (params) => {
|
|
var _stableStringify;
|
|
const cachedAtom = atomCache.get(params);
|
|
if (cachedAtom != null) {
|
|
return cachedAtom;
|
|
}
|
|
const {
|
|
cachePolicyForParams_UNSTABLE,
|
|
...atomOptions
|
|
} = options;
|
|
const newAtom = Recoil_atom({
|
|
...atomOptions,
|
|
key: `${options.key}__${(_stableStringify = Recoil_stableStringify(params)) !== null && _stableStringify !== void 0 ? _stableStringify : "void"}`,
|
|
default: typeof options.default === "function" ? options.default(params) : options.default,
|
|
retainedBy_UNSTABLE: typeof options.retainedBy_UNSTABLE === "function" ? options.retainedBy_UNSTABLE(params) : options.retainedBy_UNSTABLE,
|
|
effects_UNSTABLE: typeof options.effects_UNSTABLE === "function" ? options.effects_UNSTABLE(params) : options.effects_UNSTABLE
|
|
});
|
|
atomCache.set(params, newAtom);
|
|
setConfigDeletionHandler$2(newAtom.key, () => {
|
|
atomCache.delete(params);
|
|
});
|
|
return newAtom;
|
|
};
|
|
}
|
|
var Recoil_atomFamily = atomFamily;
|
|
var {
|
|
setConfigDeletionHandler: setConfigDeletionHandler$3
|
|
} = Recoil_Node;
|
|
var nextIndex = 0;
|
|
function selectorFamily(options) {
|
|
var _options$cachePolicyF, _options$cachePolicyF2;
|
|
const selectorCache = Recoil_cacheFromPolicy({
|
|
equality: (_options$cachePolicyF = (_options$cachePolicyF2 = options.cachePolicyForParams_UNSTABLE) === null || _options$cachePolicyF2 === void 0 ? void 0 : _options$cachePolicyF2.equality) !== null && _options$cachePolicyF !== void 0 ? _options$cachePolicyF : "value",
|
|
eviction: "keep-all"
|
|
});
|
|
return (params) => {
|
|
var _stableStringify;
|
|
const cachedSelector = selectorCache.get(params);
|
|
if (cachedSelector != null) {
|
|
return cachedSelector;
|
|
}
|
|
const myKey = `${options.key}__selectorFamily/${(_stableStringify = Recoil_stableStringify(params, {
|
|
allowFunctions: true
|
|
})) !== null && _stableStringify !== void 0 ? _stableStringify : "void"}/${nextIndex++}`;
|
|
const myGet = (callbacks) => options.get(params)(callbacks);
|
|
const myCachePolicy = options.cachePolicy_UNSTABLE;
|
|
const retainedBy = typeof options.retainedBy_UNSTABLE === "function" ? options.retainedBy_UNSTABLE(params) : options.retainedBy_UNSTABLE;
|
|
let newSelector;
|
|
if (options.set != null) {
|
|
const set = options.set;
|
|
const mySet = (callbacks, newValue) => set(params)(callbacks, newValue);
|
|
newSelector = Recoil_selector({
|
|
key: myKey,
|
|
get: myGet,
|
|
set: mySet,
|
|
cachePolicy_UNSTABLE: myCachePolicy,
|
|
dangerouslyAllowMutability: options.dangerouslyAllowMutability,
|
|
retainedBy_UNSTABLE: retainedBy
|
|
});
|
|
} else {
|
|
newSelector = Recoil_selector({
|
|
key: myKey,
|
|
get: myGet,
|
|
cachePolicy_UNSTABLE: myCachePolicy,
|
|
dangerouslyAllowMutability: options.dangerouslyAllowMutability,
|
|
retainedBy_UNSTABLE: retainedBy
|
|
});
|
|
}
|
|
selectorCache.set(params, newSelector);
|
|
setConfigDeletionHandler$3(newSelector.key, () => {
|
|
selectorCache.delete(params);
|
|
});
|
|
return newSelector;
|
|
};
|
|
}
|
|
var Recoil_selectorFamily = selectorFamily;
|
|
var constantSelector = Recoil_selectorFamily({
|
|
key: "__constant",
|
|
get: (constant) => () => constant,
|
|
cachePolicyForParams_UNSTABLE: {
|
|
equality: "reference"
|
|
}
|
|
});
|
|
function constSelector(constant) {
|
|
return constantSelector(constant);
|
|
}
|
|
var Recoil_constSelector = constSelector;
|
|
var throwingSelector = Recoil_selectorFamily({
|
|
key: "__error",
|
|
get: (message) => () => {
|
|
throw new Error(message);
|
|
},
|
|
cachePolicyForParams_UNSTABLE: {
|
|
equality: "reference"
|
|
}
|
|
});
|
|
function errorSelector(message) {
|
|
return throwingSelector(message);
|
|
}
|
|
var Recoil_errorSelector = errorSelector;
|
|
function readOnlySelector(atom2) {
|
|
return atom2;
|
|
}
|
|
var Recoil_readOnlySelector = readOnlySelector;
|
|
var {
|
|
loadableWithError: loadableWithError$3,
|
|
loadableWithPromise: loadableWithPromise$3,
|
|
loadableWithValue: loadableWithValue$4
|
|
} = Recoil_Loadable;
|
|
function concurrentRequests(getRecoilValue, deps) {
|
|
const results = Array(deps.length).fill(void 0);
|
|
const exceptions = Array(deps.length).fill(void 0);
|
|
for (const [i4, dep] of deps.entries()) {
|
|
try {
|
|
results[i4] = getRecoilValue(dep);
|
|
} catch (e4) {
|
|
exceptions[i4] = e4;
|
|
}
|
|
}
|
|
return [results, exceptions];
|
|
}
|
|
function isError(exp) {
|
|
return exp != null && !Recoil_isPromise(exp);
|
|
}
|
|
function unwrapDependencies(dependencies) {
|
|
return Array.isArray(dependencies) ? dependencies : Object.getOwnPropertyNames(dependencies).map((key2) => dependencies[key2]);
|
|
}
|
|
function getValueFromLoadablePromiseResult(result) {
|
|
if (result != null && typeof result === "object" && result.hasOwnProperty("__value")) {
|
|
return result.__value;
|
|
}
|
|
return result;
|
|
}
|
|
function wrapResults(dependencies, results) {
|
|
return Array.isArray(dependencies) ? results : Object.getOwnPropertyNames(dependencies).reduce((out, key2, idx) => ({
|
|
...out,
|
|
[key2]: results[idx]
|
|
}), {});
|
|
}
|
|
function wrapLoadables(dependencies, results, exceptions) {
|
|
const output = exceptions.map((exception, idx) => exception == null ? loadableWithValue$4(results[idx]) : Recoil_isPromise(exception) ? loadableWithPromise$3(exception) : loadableWithError$3(exception));
|
|
return wrapResults(dependencies, output);
|
|
}
|
|
function combineAsyncResultsWithSyncResults(syncResults, asyncResults) {
|
|
return asyncResults.map((result, idx) => result === void 0 ? syncResults[idx] : result);
|
|
}
|
|
var waitForNone = Recoil_selectorFamily({
|
|
key: "__waitForNone",
|
|
get: (dependencies) => ({
|
|
get
|
|
}) => {
|
|
const deps = unwrapDependencies(dependencies);
|
|
const [results, exceptions] = concurrentRequests(get, deps);
|
|
return wrapLoadables(dependencies, results, exceptions);
|
|
},
|
|
dangerouslyAllowMutability: true
|
|
});
|
|
var waitForAny = Recoil_selectorFamily({
|
|
key: "__waitForAny",
|
|
get: (dependencies) => ({
|
|
get
|
|
}) => {
|
|
const deps = unwrapDependencies(dependencies);
|
|
const [results, exceptions] = concurrentRequests(get, deps);
|
|
if (exceptions.some((exp) => !Recoil_isPromise(exp))) {
|
|
return wrapLoadables(dependencies, results, exceptions);
|
|
}
|
|
return new Promise((resolve) => {
|
|
for (const [i4, exp] of exceptions.entries()) {
|
|
if (Recoil_isPromise(exp)) {
|
|
exp.then((result) => {
|
|
results[i4] = getValueFromLoadablePromiseResult(result);
|
|
exceptions[i4] = void 0;
|
|
resolve(wrapLoadables(dependencies, results, exceptions));
|
|
}).catch((error) => {
|
|
exceptions[i4] = error;
|
|
resolve(wrapLoadables(dependencies, results, exceptions));
|
|
});
|
|
}
|
|
}
|
|
});
|
|
},
|
|
dangerouslyAllowMutability: true
|
|
});
|
|
var waitForAll = Recoil_selectorFamily({
|
|
key: "__waitForAll",
|
|
get: (dependencies) => ({
|
|
get
|
|
}) => {
|
|
const deps = unwrapDependencies(dependencies);
|
|
const [results, exceptions] = concurrentRequests(get, deps);
|
|
if (exceptions.every((exp) => exp == null)) {
|
|
return wrapResults(dependencies, results);
|
|
}
|
|
const error = exceptions.find(isError);
|
|
if (error != null) {
|
|
throw error;
|
|
}
|
|
return Promise.all(exceptions).then((exceptionResults) => wrapResults(dependencies, combineAsyncResultsWithSyncResults(results, exceptionResults).map(getValueFromLoadablePromiseResult)));
|
|
},
|
|
dangerouslyAllowMutability: true
|
|
});
|
|
var waitForAllSettled = Recoil_selectorFamily({
|
|
key: "__waitForAllSettled",
|
|
get: (dependencies) => ({
|
|
get
|
|
}) => {
|
|
const deps = unwrapDependencies(dependencies);
|
|
const [results, exceptions] = concurrentRequests(get, deps);
|
|
if (exceptions.every((exp) => !Recoil_isPromise(exp))) {
|
|
return wrapLoadables(dependencies, results, exceptions);
|
|
}
|
|
return Promise.all(exceptions.map((exp, i4) => Recoil_isPromise(exp) ? exp.then((result) => {
|
|
results[i4] = getValueFromLoadablePromiseResult(result);
|
|
exceptions[i4] = void 0;
|
|
}).catch((error) => {
|
|
results[i4] = void 0;
|
|
exceptions[i4] = error;
|
|
}) : null)).then(() => wrapLoadables(dependencies, results, exceptions));
|
|
},
|
|
dangerouslyAllowMutability: true
|
|
});
|
|
var noWait = Recoil_selectorFamily({
|
|
key: "__noWait",
|
|
get: (dependency) => ({
|
|
get
|
|
}) => {
|
|
try {
|
|
return loadableWithValue$4(get(dependency));
|
|
} catch (exception) {
|
|
return Recoil_isPromise(exception) ? loadableWithPromise$3(exception) : loadableWithError$3(exception);
|
|
}
|
|
},
|
|
dangerouslyAllowMutability: true
|
|
});
|
|
var Recoil_WaitFor = {
|
|
waitForNone,
|
|
waitForAny,
|
|
waitForAll,
|
|
waitForAllSettled,
|
|
noWait
|
|
};
|
|
var {
|
|
batchUpdates: batchUpdates$3,
|
|
setBatcher: setBatcher$1
|
|
} = Recoil_Batching;
|
|
var {
|
|
DefaultValue: DefaultValue$3
|
|
} = Recoil_Node;
|
|
var {
|
|
RecoilRoot: RecoilRoot$2
|
|
} = Recoil_RecoilRoot_react;
|
|
var {
|
|
isRecoilValue: isRecoilValue$5
|
|
} = Recoil_RecoilValue$1;
|
|
var {
|
|
retentionZone: retentionZone$1
|
|
} = Recoil_RetentionZone;
|
|
var {
|
|
freshSnapshot: freshSnapshot$2
|
|
} = Recoil_Snapshot$1;
|
|
var {
|
|
useGotoRecoilSnapshot: useGotoRecoilSnapshot$1,
|
|
useRecoilCallback: useRecoilCallback$1,
|
|
useRecoilSnapshot: useRecoilSnapshot$1,
|
|
useRecoilState: useRecoilState$1,
|
|
useRecoilStateLoadable: useRecoilStateLoadable$1,
|
|
useRecoilTransaction: useRecoilTransaction$1,
|
|
useRecoilTransactionObserver: useRecoilTransactionObserver$1,
|
|
useRecoilValue: useRecoilValue$1,
|
|
useRecoilValueLoadable: useRecoilValueLoadable$1,
|
|
useResetRecoilState: useResetRecoilState$1,
|
|
useRetain: useRetain$1,
|
|
useSetRecoilState: useSetRecoilState$1,
|
|
useSetUnvalidatedAtomValues: useSetUnvalidatedAtomValues$1,
|
|
useTransactionObservation_DEPRECATED: useTransactionObservation_DEPRECATED$1
|
|
} = Recoil_Hooks;
|
|
var {
|
|
noWait: noWait$1,
|
|
waitForAll: waitForAll$1,
|
|
waitForAllSettled: waitForAllSettled$1,
|
|
waitForAny: waitForAny$1,
|
|
waitForNone: waitForNone$1
|
|
} = Recoil_WaitFor;
|
|
var Recoil_index = {
|
|
DefaultValue: DefaultValue$3,
|
|
RecoilRoot: RecoilRoot$2,
|
|
useRecoilBridgeAcrossReactRoots_UNSTABLE: Recoil_useRecoilBridgeAcrossReactRoots,
|
|
atom: Recoil_atom,
|
|
selector: Recoil_selector,
|
|
retentionZone: retentionZone$1,
|
|
atomFamily: Recoil_atomFamily,
|
|
selectorFamily: Recoil_selectorFamily,
|
|
constSelector: Recoil_constSelector,
|
|
errorSelector: Recoil_errorSelector,
|
|
readOnlySelector: Recoil_readOnlySelector,
|
|
useRecoilValue: useRecoilValue$1,
|
|
useRecoilValueLoadable: useRecoilValueLoadable$1,
|
|
useRecoilState: useRecoilState$1,
|
|
useRecoilStateLoadable: useRecoilStateLoadable$1,
|
|
useSetRecoilState: useSetRecoilState$1,
|
|
useResetRecoilState: useResetRecoilState$1,
|
|
useGetRecoilValueInfo_UNSTABLE: Recoil_useGetRecoilValueInfo,
|
|
useRetain: useRetain$1,
|
|
useRecoilCallback: useRecoilCallback$1,
|
|
useRecoilTransaction_UNSTABLE: useRecoilTransaction$1,
|
|
useGotoRecoilSnapshot: useGotoRecoilSnapshot$1,
|
|
useRecoilSnapshot: useRecoilSnapshot$1,
|
|
useRecoilTransactionObserver_UNSTABLE: useRecoilTransactionObserver$1,
|
|
useTransactionObservation_UNSTABLE: useTransactionObservation_DEPRECATED$1,
|
|
useSetUnvalidatedAtomValues_UNSTABLE: useSetUnvalidatedAtomValues$1,
|
|
noWait: noWait$1,
|
|
waitForNone: waitForNone$1,
|
|
waitForAny: waitForAny$1,
|
|
waitForAll: waitForAll$1,
|
|
waitForAllSettled: waitForAllSettled$1,
|
|
isRecoilValue: isRecoilValue$5,
|
|
batchUpdates: batchUpdates$3,
|
|
setBatcher: setBatcher$1,
|
|
snapshot_UNSTABLE: freshSnapshot$2
|
|
};
|
|
var Recoil_index_1 = Recoil_index.DefaultValue;
|
|
var Recoil_index_2 = Recoil_index.RecoilRoot;
|
|
var Recoil_index_3 = Recoil_index.useRecoilBridgeAcrossReactRoots_UNSTABLE;
|
|
var Recoil_index_4 = Recoil_index.atom;
|
|
var Recoil_index_5 = Recoil_index.selector;
|
|
var Recoil_index_6 = Recoil_index.retentionZone;
|
|
var Recoil_index_7 = Recoil_index.atomFamily;
|
|
var Recoil_index_8 = Recoil_index.selectorFamily;
|
|
var Recoil_index_9 = Recoil_index.constSelector;
|
|
var Recoil_index_10 = Recoil_index.errorSelector;
|
|
var Recoil_index_11 = Recoil_index.readOnlySelector;
|
|
var Recoil_index_12 = Recoil_index.useRecoilValue;
|
|
var Recoil_index_13 = Recoil_index.useRecoilValueLoadable;
|
|
var Recoil_index_14 = Recoil_index.useRecoilState;
|
|
var Recoil_index_15 = Recoil_index.useRecoilStateLoadable;
|
|
var Recoil_index_16 = Recoil_index.useSetRecoilState;
|
|
var Recoil_index_17 = Recoil_index.useResetRecoilState;
|
|
var Recoil_index_18 = Recoil_index.useGetRecoilValueInfo_UNSTABLE;
|
|
var Recoil_index_19 = Recoil_index.useRetain;
|
|
var Recoil_index_20 = Recoil_index.useRecoilCallback;
|
|
var Recoil_index_21 = Recoil_index.useRecoilTransaction_UNSTABLE;
|
|
var Recoil_index_22 = Recoil_index.useGotoRecoilSnapshot;
|
|
var Recoil_index_23 = Recoil_index.useRecoilSnapshot;
|
|
var Recoil_index_24 = Recoil_index.useRecoilTransactionObserver_UNSTABLE;
|
|
var Recoil_index_25 = Recoil_index.useTransactionObservation_UNSTABLE;
|
|
var Recoil_index_26 = Recoil_index.useSetUnvalidatedAtomValues_UNSTABLE;
|
|
var Recoil_index_27 = Recoil_index.noWait;
|
|
var Recoil_index_28 = Recoil_index.waitForNone;
|
|
var Recoil_index_29 = Recoil_index.waitForAny;
|
|
var Recoil_index_30 = Recoil_index.waitForAll;
|
|
var Recoil_index_31 = Recoil_index.waitForAllSettled;
|
|
var Recoil_index_32 = Recoil_index.isRecoilValue;
|
|
var Recoil_index_33 = Recoil_index.batchUpdates;
|
|
var Recoil_index_34 = Recoil_index.setBatcher;
|
|
var Recoil_index_35 = Recoil_index.snapshot_UNSTABLE;
|
|
|
|
// src/components/ui/modals/hiddenFilesModal.tsx
|
|
var import_obsidian32 = require("obsidian");
|
|
var HiddenItemsModal = class extends import_obsidian32.Modal {
|
|
constructor(plugin) {
|
|
super(plugin.app);
|
|
this.plugin = plugin;
|
|
}
|
|
onOpen() {
|
|
let { contentEl } = this;
|
|
let myModal = this;
|
|
let headerText;
|
|
const headerEl = contentEl.createEl("div", { text: headerText });
|
|
headerEl.addClass("modal-title");
|
|
headerEl.innerHTML = i18n_default.labels.hiddenFiles;
|
|
const listEl = contentEl.createEl("div");
|
|
const root = createRoot(listEl);
|
|
root.render(/* @__PURE__ */ bn.createElement(HiddenFiles, {
|
|
plugin: this.plugin
|
|
}));
|
|
const cancelButton = contentEl.createEl("button", {
|
|
text: i18n_default.buttons.cancel
|
|
});
|
|
cancelButton.style.cssText = "float: right;";
|
|
cancelButton.addEventListener("click", () => {
|
|
myModal.close();
|
|
});
|
|
const onClickAction = async () => {
|
|
myModal.close();
|
|
};
|
|
}
|
|
onClose() {
|
|
let { contentEl } = this;
|
|
let event = new CustomEvent(eventTypes.vaultChange);
|
|
window.dispatchEvent(event);
|
|
contentEl.empty();
|
|
}
|
|
};
|
|
var HiddenFiles = (props2) => {
|
|
const { plugin } = props2;
|
|
const ref = _2(null);
|
|
const [hiddenFiles, setHiddenFiles] = p2(plugin.settings.hiddenFiles);
|
|
const [hiddenExtensions, setHiddenExtensions] = p2(
|
|
plugin.settings.hiddenExtensions
|
|
);
|
|
const saveExtension = (value) => {
|
|
plugin.settings.hiddenExtensions = [
|
|
...plugin.settings.hiddenExtensions,
|
|
value
|
|
];
|
|
plugin.saveSettings();
|
|
};
|
|
const saveFile = (_5, value) => {
|
|
plugin.settings.hiddenFiles = [...plugin.settings.hiddenFiles, ...value];
|
|
plugin.saveSettings();
|
|
};
|
|
const removeExtension = (index) => {
|
|
plugin.settings.hiddenExtensions = plugin.settings.hiddenExtensions.filter(
|
|
(f4, i4) => i4 != index
|
|
);
|
|
plugin.saveSettings();
|
|
};
|
|
const removeItem = (index) => {
|
|
plugin.settings.hiddenFiles = plugin.settings.hiddenFiles.filter(
|
|
(f4, i4) => i4 != index
|
|
);
|
|
plugin.saveSettings();
|
|
};
|
|
const addExtension = () => {
|
|
if ((ref == null ? void 0 : ref.current.value.length) > 0) {
|
|
saveExtension(ref.current.value);
|
|
ref.current.empty();
|
|
}
|
|
};
|
|
const settingsChanged = () => {
|
|
setHiddenFiles(plugin.settings.hiddenFiles);
|
|
setHiddenExtensions(plugin.settings.hiddenExtensions);
|
|
};
|
|
h2(() => {
|
|
window.addEventListener(eventTypes.settingsChanged, settingsChanged);
|
|
return () => {
|
|
window.removeEventListener(eventTypes.settingsChanged, settingsChanged);
|
|
};
|
|
}, []);
|
|
const addMenu = (e4) => {
|
|
const offset = e4.target.getBoundingClientRect();
|
|
const options = getAllAbstractFilesInVault(props2.plugin, app).map((f4) => ({
|
|
name: fileNameToString(f4.name),
|
|
value: f4.path
|
|
}));
|
|
showSelectMenu(
|
|
{ x: offset.left, y: offset.top + 30 },
|
|
{
|
|
multi: false,
|
|
editable: false,
|
|
value: [],
|
|
options,
|
|
saveOptions: saveFile,
|
|
placeholder: i18n_default.labels.linkItemSelectPlaceholder,
|
|
detail: true,
|
|
searchable: true
|
|
}
|
|
);
|
|
};
|
|
return /* @__PURE__ */ bn.createElement("div", {
|
|
className: "modal-content"
|
|
}, /* @__PURE__ */ bn.createElement("div", {
|
|
className: "setting-item setting-item-heading"
|
|
}, "Extensions"), /* @__PURE__ */ bn.createElement("div", null, hiddenExtensions.map((f4, index) => /* @__PURE__ */ bn.createElement("div", {
|
|
className: "mobile-option-setting-item"
|
|
}, /* @__PURE__ */ bn.createElement("span", {
|
|
className: "mobile-option-setting-item-name"
|
|
}, f4), /* @__PURE__ */ bn.createElement("div", {
|
|
className: "clickable-icon mobile-option-setting-item-option-icon",
|
|
"aria-label": i18n_default.buttons.delete,
|
|
dangerouslySetInnerHTML: { __html: uiIconSet["mk-ui-close"] },
|
|
onClick: () => removeExtension(index)
|
|
})))), /* @__PURE__ */ bn.createElement("div", {
|
|
className: "setting-item"
|
|
}, /* @__PURE__ */ bn.createElement("input", {
|
|
placeholder: i18n_default.labels.addExtension,
|
|
type: "text",
|
|
ref
|
|
}), /* @__PURE__ */ bn.createElement("button", {
|
|
onClick: (e4) => addExtension()
|
|
}, "+ Add")), /* @__PURE__ */ bn.createElement("div", {
|
|
className: "setting-item setting-item-heading"
|
|
}, "Files"), /* @__PURE__ */ bn.createElement("div", null, hiddenFiles.map((f4, index) => /* @__PURE__ */ bn.createElement("div", {
|
|
className: "mobile-option-setting-item"
|
|
}, /* @__PURE__ */ bn.createElement("span", {
|
|
className: "mobile-option-setting-item-name"
|
|
}, f4), /* @__PURE__ */ bn.createElement("div", {
|
|
className: "clickable-icon mobile-option-setting-item-option-icon",
|
|
"aria-label": i18n_default.buttons.delete,
|
|
dangerouslySetInnerHTML: { __html: uiIconSet["mk-ui-close"] },
|
|
onClick: () => removeItem(index)
|
|
})))), /* @__PURE__ */ bn.createElement("div", {
|
|
className: "setting-item"
|
|
}, /* @__PURE__ */ bn.createElement("button", {
|
|
onClick: (e4) => addMenu(e4)
|
|
}, "+ ", i18n_default.buttons.addFile)));
|
|
};
|
|
|
|
// src/components/Spaces/MainMenu.tsx
|
|
var import_obsidian33 = require("obsidian");
|
|
|
|
// src/recoil/pluginState.ts
|
|
var activeFile = Recoil_index_4({
|
|
key: "spacesActiveFile",
|
|
default: null,
|
|
dangerouslyAllowMutability: true
|
|
});
|
|
var selectedFiles = Recoil_index_4({
|
|
key: "spacesSelectedFiles",
|
|
default: [],
|
|
dangerouslyAllowMutability: true
|
|
});
|
|
var activeView = Recoil_index_4({
|
|
key: "spacesActiveView",
|
|
default: "root",
|
|
dangerouslyAllowMutability: true
|
|
});
|
|
var activeViewSpace = Recoil_index_4({
|
|
key: "spacesActiveSpace",
|
|
default: "",
|
|
dangerouslyAllowMutability: true
|
|
});
|
|
var spaces = Recoil_index_4({
|
|
key: "spaces",
|
|
default: [],
|
|
dangerouslyAllowMutability: true
|
|
});
|
|
var expandedFolders = Recoil_index_4({
|
|
key: "expandedFolders",
|
|
default: {}
|
|
});
|
|
|
|
// src/components/Spaces/MainMenu.tsx
|
|
var replaceMobileMainMenu = (plugin) => {
|
|
if (platformIsMobile()) {
|
|
const header = app.workspace.containerEl.querySelector(
|
|
".workspace-drawer.mod-left .workspace-drawer-header-left"
|
|
);
|
|
header.empty();
|
|
if (!plugin.settings.spacesCompactMode) {
|
|
const reactEl = createRoot(header);
|
|
reactEl.render(
|
|
/* @__PURE__ */ bn.createElement(Recoil_index_2, null, /* @__PURE__ */ bn.createElement(MainMenu, {
|
|
plugin
|
|
}))
|
|
);
|
|
}
|
|
}
|
|
};
|
|
var MainMenu = (props2) => {
|
|
var _a2;
|
|
const { plugin } = props2;
|
|
const [activeView2, setActiveView] = Recoil_index_14(activeView);
|
|
const [spaces2, setSpaces] = Recoil_index_14(spaces);
|
|
const [activeViewSpace2, setActiveViewSpace] = Recoil_index_14(
|
|
activeViewSpace
|
|
);
|
|
const activeSpace = spaces2.find((f4) => f4.name == activeViewSpace2);
|
|
const ref = _2();
|
|
const toggleSections = (collapse) => {
|
|
const newSections = collapse ? [] : ["/", ...spaces2.map((f4) => f4.name)];
|
|
plugin.settings.expandedSpaces = newSections;
|
|
plugin.saveSettings();
|
|
};
|
|
const newSection = () => {
|
|
let vaultChangeModal = new EditSpaceModal(plugin, "", "create");
|
|
vaultChangeModal.open();
|
|
};
|
|
h2(() => {
|
|
refreshLeafs();
|
|
}, []);
|
|
const refreshLeafs = () => {
|
|
let leafs = [];
|
|
let spaceActive = true;
|
|
if (plugin.app.workspace.leftSplit && platformIsMobile()) {
|
|
const mobileDrawer = plugin.app.workspace.leftSplit;
|
|
const leaves = mobileDrawer.children;
|
|
const index = leaves.reduce((p3, c4, i4) => {
|
|
return c4.getViewState().type == FILE_TREE_VIEW_TYPE ? i4 : p3;
|
|
}, -1);
|
|
spaceActive = index == mobileDrawer.currentTab;
|
|
leafs.push(...leaves.filter((l3, i4) => i4 != index));
|
|
}
|
|
return { leafs, spaceActive };
|
|
};
|
|
const showMenu = (e4) => {
|
|
const { spaceActive, leafs } = refreshLeafs();
|
|
const menu = new import_obsidian33.Menu();
|
|
!spaceActive && menu.addItem((menuItem) => {
|
|
menuItem.setIcon("lucide-arrow-left");
|
|
menuItem.setTitle(i18n_default.menu.backToSpace);
|
|
menuItem.onClick((ev) => {
|
|
const leaves = plugin.app.workspace.getLeavesOfType(FILE_TREE_VIEW_TYPE);
|
|
if (leaves.length > 0) {
|
|
plugin.app.workspace.revealLeaf(leaves[0]);
|
|
}
|
|
});
|
|
});
|
|
if (plugin.settings.spacesCompactMode) {
|
|
menu.addItem((menuItem) => {
|
|
menuItem.setTitle(i18n_default.menu.spaces);
|
|
menuItem.onClick((ev) => {
|
|
setActiveView("root");
|
|
});
|
|
});
|
|
menu.addItem((menuItem) => {
|
|
menuItem.setTitle(i18n_default.menu.tags);
|
|
menuItem.onClick((ev) => {
|
|
setActiveView("tags");
|
|
});
|
|
});
|
|
menu.addSeparator();
|
|
spaces2.filter((f4) => f4.pinned == "true").forEach((space) => {
|
|
menu.addItem((menuItem) => {
|
|
menuItem.setTitle(space.name);
|
|
menuItem.onClick((ev) => {
|
|
setActiveView("space");
|
|
setActiveViewSpace(space.name);
|
|
});
|
|
});
|
|
});
|
|
menu.addSeparator();
|
|
}
|
|
menu.addItem((menuItem) => {
|
|
menuItem.setIcon("plus");
|
|
menuItem.setTitle(i18n_default.menu.newSpace);
|
|
menuItem.onClick((ev) => {
|
|
newSection();
|
|
});
|
|
});
|
|
menu.addItem((menuItem) => {
|
|
menuItem.setIcon("lucide-chevrons-down-up");
|
|
menuItem.setTitle(i18n_default.menu.collapseAllSections);
|
|
menuItem.onClick((ev) => {
|
|
toggleSections(true);
|
|
});
|
|
});
|
|
menu.addItem((menuItem) => {
|
|
menuItem.setIcon("lucide-chevrons-up-down");
|
|
menuItem.setTitle(i18n_default.menu.expandAllSections);
|
|
menuItem.onClick((ev) => {
|
|
toggleSections(false);
|
|
});
|
|
});
|
|
menu.addSeparator();
|
|
menu.addItem((menuItem) => {
|
|
menuItem.setIcon("eye-off");
|
|
menuItem.setTitle(i18n_default.menu.manageHiddenFiles);
|
|
menuItem.onClick((ev) => {
|
|
let vaultChangeModal = new HiddenItemsModal(plugin);
|
|
vaultChangeModal.open();
|
|
});
|
|
});
|
|
menu.addSeparator();
|
|
leafs.map(
|
|
(l3) => menu.addItem((menuItem) => {
|
|
menuItem.setIcon(l3.view.icon);
|
|
menuItem.setTitle(l3.getDisplayText());
|
|
menuItem.onClick((ev) => {
|
|
plugin.app.workspace.revealLeaf(l3);
|
|
});
|
|
})
|
|
);
|
|
menu.addItem((menuItem) => {
|
|
menuItem.setIcon("lucide-settings");
|
|
menuItem.setTitle(i18n_default.menu.obSettings);
|
|
menuItem.onClick((ev) => {
|
|
plugin.app.commands.commands["app:open-settings"].callback();
|
|
});
|
|
});
|
|
menu.addItem((menuItem) => {
|
|
menuItem.setIcon("vault");
|
|
menuItem.setTitle(i18n_default.menu.openVault);
|
|
menuItem.onClick((ev) => {
|
|
plugin.app.commands.commands["app:open-vault"].callback();
|
|
});
|
|
});
|
|
menu.addSeparator();
|
|
menu.addItem((menuItem) => {
|
|
menuItem.setIcon("mk-logo");
|
|
menuItem.setTitle(i18n_default.menu.getHelp);
|
|
menuItem.onClick((ev) => {
|
|
window.open("https://make.md/community");
|
|
});
|
|
});
|
|
const offset = ref.current.getBoundingClientRect();
|
|
menu.showAtPosition({ x: offset.left, y: offset.top + 30 });
|
|
};
|
|
const currentViewName = activeView2 == "root" ? "Spaces" : activeView2 == "tags" ? "Tags" : activeViewSpace2;
|
|
const currentViewIcon = activeView2 == "root" ? uiIconSet["mk-ui-spaces"] : activeView2 == "tags" ? uiIconSet["mk-ui-tags"] : ((_a2 = activeSpace == null ? void 0 : activeSpace.sticker) == null ? void 0 : _a2.length) > 0 ? unifiedToNative(activeSpace.sticker) : activeSpace == null ? void 0 : activeSpace.name.charAt(0);
|
|
return /* @__PURE__ */ bn.createElement("div", {
|
|
className: "mk-main-menu-container"
|
|
}, /* @__PURE__ */ bn.createElement("div", {
|
|
className: "mk-main-menu-button",
|
|
ref,
|
|
onClick: (e4) => showMenu(e4)
|
|
}, plugin.settings.spacesCompactMode ? /* @__PURE__ */ bn.createElement(bn.Fragment, null, /* @__PURE__ */ bn.createElement("div", {
|
|
className: "mk-main-menu-icon",
|
|
dangerouslySetInnerHTML: { __html: currentViewIcon }
|
|
}), currentViewName) : plugin.app.vault.getName(), /* @__PURE__ */ bn.createElement("div", {
|
|
dangerouslySetInnerHTML: { __html: uiIconSet["mk-ui-expand"] }
|
|
})));
|
|
};
|
|
|
|
// node_modules/@tanstack/react-virtual/build/esm/index.js
|
|
function _extends() {
|
|
_extends = Object.assign || function(target) {
|
|
for (var i4 = 1; i4 < arguments.length; i4++) {
|
|
var source = arguments[i4];
|
|
for (var key2 in source) {
|
|
if (Object.prototype.hasOwnProperty.call(source, key2)) {
|
|
target[key2] = source[key2];
|
|
}
|
|
}
|
|
}
|
|
return target;
|
|
};
|
|
return _extends.apply(this, arguments);
|
|
}
|
|
function _objectWithoutPropertiesLoose(source, excluded) {
|
|
if (source == null)
|
|
return {};
|
|
var target = {};
|
|
var sourceKeys = Object.keys(source);
|
|
var key2, i4;
|
|
for (i4 = 0; i4 < sourceKeys.length; i4++) {
|
|
key2 = sourceKeys[i4];
|
|
if (excluded.indexOf(key2) >= 0)
|
|
continue;
|
|
target[key2] = source[key2];
|
|
}
|
|
return target;
|
|
}
|
|
var props = ["bottom", "height", "left", "right", "top", "width"];
|
|
var rectChanged = function rectChanged2(a5, b4) {
|
|
if (a5 === void 0) {
|
|
a5 = {};
|
|
}
|
|
if (b4 === void 0) {
|
|
b4 = {};
|
|
}
|
|
return props.some(function(prop) {
|
|
return a5[prop] !== b4[prop];
|
|
});
|
|
};
|
|
var observedNodes = /* @__PURE__ */ new Map();
|
|
var rafId;
|
|
var run = function run2() {
|
|
var changedStates = [];
|
|
observedNodes.forEach(function(state, node) {
|
|
var newRect = node.getBoundingClientRect();
|
|
if (rectChanged(newRect, state.rect)) {
|
|
state.rect = newRect;
|
|
changedStates.push(state);
|
|
}
|
|
});
|
|
changedStates.forEach(function(state) {
|
|
state.callbacks.forEach(function(cb) {
|
|
return cb(state.rect);
|
|
});
|
|
});
|
|
rafId = window.requestAnimationFrame(run2);
|
|
};
|
|
function observeRect(node, cb) {
|
|
return {
|
|
observe: function observe() {
|
|
var wasEmpty = observedNodes.size === 0;
|
|
if (observedNodes.has(node)) {
|
|
observedNodes.get(node).callbacks.push(cb);
|
|
} else {
|
|
observedNodes.set(node, {
|
|
rect: void 0,
|
|
hasRectChanged: false,
|
|
callbacks: [cb]
|
|
});
|
|
}
|
|
if (wasEmpty)
|
|
run();
|
|
},
|
|
unobserve: function unobserve() {
|
|
var state = observedNodes.get(node);
|
|
if (state) {
|
|
var index = state.callbacks.indexOf(cb);
|
|
if (index >= 0)
|
|
state.callbacks.splice(index, 1);
|
|
if (!state.callbacks.length)
|
|
observedNodes["delete"](node);
|
|
if (!observedNodes.size)
|
|
cancelAnimationFrame(rafId);
|
|
}
|
|
}
|
|
};
|
|
}
|
|
var useIsomorphicLayoutEffect3 = typeof window !== "undefined" ? s2 : h2;
|
|
function rectReducer(state, action) {
|
|
var rect = action.rect;
|
|
if (state.height !== rect.height || state.width !== rect.width) {
|
|
return rect;
|
|
}
|
|
return state;
|
|
}
|
|
var useRect2 = function useRect3(nodeRef, initialRect) {
|
|
if (initialRect === void 0) {
|
|
initialRect = {
|
|
width: 0,
|
|
height: 0
|
|
};
|
|
}
|
|
var _React$useState = bn.useState(nodeRef.current), element = _React$useState[0], setElement = _React$useState[1];
|
|
var _React$useReducer = bn.useReducer(rectReducer, initialRect), rect = _React$useReducer[0], dispatch = _React$useReducer[1];
|
|
var initialRectSet = bn.useRef(false);
|
|
useIsomorphicLayoutEffect3(function() {
|
|
if (nodeRef.current !== element) {
|
|
setElement(nodeRef.current);
|
|
}
|
|
});
|
|
useIsomorphicLayoutEffect3(function() {
|
|
if (element && !initialRectSet.current) {
|
|
initialRectSet.current = true;
|
|
var _rect = element.getBoundingClientRect();
|
|
dispatch({
|
|
rect: _rect
|
|
});
|
|
}
|
|
}, [element]);
|
|
bn.useEffect(function() {
|
|
if (!element) {
|
|
return;
|
|
}
|
|
var observer = observeRect(element, function(rect2) {
|
|
dispatch({
|
|
rect: rect2
|
|
});
|
|
});
|
|
observer.observe();
|
|
return function() {
|
|
observer.unobserve();
|
|
};
|
|
}, [element]);
|
|
return rect;
|
|
};
|
|
var _excluded = ["align"];
|
|
var defaultEstimateSize = function defaultEstimateSize2() {
|
|
return 50;
|
|
};
|
|
var defaultKeyExtractor = function defaultKeyExtractor2(index) {
|
|
return index;
|
|
};
|
|
var defaultMeasureSize = function defaultMeasureSize2(el, horizontal) {
|
|
var key2 = horizontal ? "offsetWidth" : "offsetHeight";
|
|
return el[key2];
|
|
};
|
|
var defaultRangeExtractor = function defaultRangeExtractor2(range) {
|
|
var start = Math.max(range.start - range.overscan, 0);
|
|
var end = Math.min(range.end + range.overscan, range.size - 1);
|
|
var arr = [];
|
|
for (var _i = start; _i <= end; _i++) {
|
|
arr.push(_i);
|
|
}
|
|
return arr;
|
|
};
|
|
var useVirtual = function useVirtual2(_ref) {
|
|
var _measurements;
|
|
var _ref$size = _ref.size, size = _ref$size === void 0 ? 0 : _ref$size, _ref$estimateSize = _ref.estimateSize, estimateSize = _ref$estimateSize === void 0 ? defaultEstimateSize : _ref$estimateSize, _ref$overscan = _ref.overscan, overscan = _ref$overscan === void 0 ? 1 : _ref$overscan, _ref$paddingStart = _ref.paddingStart, paddingStart = _ref$paddingStart === void 0 ? 0 : _ref$paddingStart, _ref$paddingEnd = _ref.paddingEnd, paddingEnd = _ref$paddingEnd === void 0 ? 0 : _ref$paddingEnd, parentRef = _ref.parentRef, _ref$horizontal = _ref.horizontal, horizontal = _ref$horizontal === void 0 ? false : _ref$horizontal, scrollToFn = _ref.scrollToFn, useObserver = _ref.useObserver, initialRect = _ref.initialRect, onScrollElement = _ref.onScrollElement, scrollOffsetFn = _ref.scrollOffsetFn, _ref$keyExtractor = _ref.keyExtractor, keyExtractor = _ref$keyExtractor === void 0 ? defaultKeyExtractor : _ref$keyExtractor, _ref$measureSize = _ref.measureSize, measureSize = _ref$measureSize === void 0 ? defaultMeasureSize : _ref$measureSize, _ref$rangeExtractor = _ref.rangeExtractor, rangeExtractor = _ref$rangeExtractor === void 0 ? defaultRangeExtractor : _ref$rangeExtractor;
|
|
var sizeKey = horizontal ? "width" : "height";
|
|
var scrollKey = horizontal ? "scrollLeft" : "scrollTop";
|
|
var latestRef = _2({
|
|
outerSize: 0,
|
|
scrollOffset: 0,
|
|
measurements: [],
|
|
totalSize: 0
|
|
});
|
|
var _React$useState = p2(0), scrollOffset = _React$useState[0], setScrollOffset = _React$useState[1];
|
|
latestRef.current.scrollOffset = scrollOffset;
|
|
var useMeasureParent = useObserver || useRect2;
|
|
var _useMeasureParent = useMeasureParent(parentRef, initialRect), outerSize = _useMeasureParent[sizeKey];
|
|
latestRef.current.outerSize = outerSize;
|
|
var defaultScrollToFn = T2(function(offset) {
|
|
if (parentRef.current) {
|
|
parentRef.current[scrollKey] = offset;
|
|
}
|
|
}, [parentRef, scrollKey]);
|
|
var resolvedScrollToFn = scrollToFn || defaultScrollToFn;
|
|
var scrollTo = T2(function(offset) {
|
|
resolvedScrollToFn(offset, defaultScrollToFn);
|
|
}, [defaultScrollToFn, resolvedScrollToFn]);
|
|
var _React$useState2 = p2({}), measuredCache = _React$useState2[0], setMeasuredCache = _React$useState2[1];
|
|
var measure = T2(function() {
|
|
return setMeasuredCache({});
|
|
}, []);
|
|
var pendingMeasuredCacheIndexesRef = _2([]);
|
|
var measurements = F(function() {
|
|
var min3 = pendingMeasuredCacheIndexesRef.current.length > 0 ? Math.min.apply(Math, pendingMeasuredCacheIndexesRef.current) : 0;
|
|
pendingMeasuredCacheIndexesRef.current = [];
|
|
var measurements2 = latestRef.current.measurements.slice(0, min3);
|
|
for (var _i2 = min3; _i2 < size; _i2++) {
|
|
var key2 = keyExtractor(_i2);
|
|
var measuredSize = measuredCache[key2];
|
|
var _start = measurements2[_i2 - 1] ? measurements2[_i2 - 1].end : paddingStart;
|
|
var _size = typeof measuredSize === "number" ? measuredSize : estimateSize(_i2);
|
|
var _end = _start + _size;
|
|
measurements2[_i2] = {
|
|
index: _i2,
|
|
start: _start,
|
|
size: _size,
|
|
end: _end,
|
|
key: key2
|
|
};
|
|
}
|
|
return measurements2;
|
|
}, [estimateSize, measuredCache, paddingStart, size, keyExtractor]);
|
|
var totalSize = (((_measurements = measurements[size - 1]) == null ? void 0 : _measurements.end) || paddingStart) + paddingEnd;
|
|
latestRef.current.measurements = measurements;
|
|
latestRef.current.totalSize = totalSize;
|
|
var element = onScrollElement ? onScrollElement.current : parentRef.current;
|
|
var scrollOffsetFnRef = _2(scrollOffsetFn);
|
|
scrollOffsetFnRef.current = scrollOffsetFn;
|
|
useIsomorphicLayoutEffect3(function() {
|
|
if (!element) {
|
|
setScrollOffset(0);
|
|
return;
|
|
}
|
|
var onScroll = function onScroll2(event) {
|
|
var offset = scrollOffsetFnRef.current ? scrollOffsetFnRef.current(event) : element[scrollKey];
|
|
setScrollOffset(offset);
|
|
};
|
|
onScroll();
|
|
element.addEventListener("scroll", onScroll, {
|
|
capture: false,
|
|
passive: true
|
|
});
|
|
return function() {
|
|
element.removeEventListener("scroll", onScroll);
|
|
};
|
|
}, [element, scrollKey]);
|
|
var _calculateRange = calculateRange(latestRef.current), start = _calculateRange.start, end = _calculateRange.end;
|
|
var indexes = F(function() {
|
|
return rangeExtractor({
|
|
start,
|
|
end,
|
|
overscan,
|
|
size: measurements.length
|
|
});
|
|
}, [start, end, overscan, measurements.length, rangeExtractor]);
|
|
var measureSizeRef = _2(measureSize);
|
|
measureSizeRef.current = measureSize;
|
|
var virtualItems = F(function() {
|
|
var virtualItems2 = [];
|
|
var _loop = function _loop2(k6, len2) {
|
|
var i4 = indexes[k6];
|
|
var measurement = measurements[i4];
|
|
var item = _extends({}, measurement, {
|
|
measureRef: function measureRef(el) {
|
|
if (el) {
|
|
var measuredSize = measureSizeRef.current(el, horizontal);
|
|
if (measuredSize !== item.size) {
|
|
var _scrollOffset = latestRef.current.scrollOffset;
|
|
if (item.start < _scrollOffset) {
|
|
defaultScrollToFn(_scrollOffset + (measuredSize - item.size));
|
|
}
|
|
pendingMeasuredCacheIndexesRef.current.push(i4);
|
|
setMeasuredCache(function(old) {
|
|
var _extends2;
|
|
return _extends({}, old, (_extends2 = {}, _extends2[item.key] = measuredSize, _extends2));
|
|
});
|
|
}
|
|
}
|
|
}
|
|
});
|
|
virtualItems2.push(item);
|
|
};
|
|
for (var k5 = 0, len = indexes.length; k5 < len; k5++) {
|
|
_loop(k5);
|
|
}
|
|
return virtualItems2;
|
|
}, [indexes, defaultScrollToFn, horizontal, measurements]);
|
|
var mountedRef = _2(false);
|
|
useIsomorphicLayoutEffect3(function() {
|
|
if (mountedRef.current) {
|
|
setMeasuredCache({});
|
|
}
|
|
mountedRef.current = true;
|
|
}, [estimateSize]);
|
|
var scrollToOffset = T2(function(toOffset, _temp) {
|
|
var _ref2 = _temp === void 0 ? {
|
|
align: "start"
|
|
} : _temp, align = _ref2.align;
|
|
var _latestRef$current = latestRef.current, scrollOffset2 = _latestRef$current.scrollOffset, outerSize2 = _latestRef$current.outerSize;
|
|
if (align === "auto") {
|
|
if (toOffset <= scrollOffset2) {
|
|
align = "start";
|
|
} else if (toOffset >= scrollOffset2 + outerSize2) {
|
|
align = "end";
|
|
} else {
|
|
align = "start";
|
|
}
|
|
}
|
|
if (align === "start") {
|
|
scrollTo(toOffset);
|
|
} else if (align === "end") {
|
|
scrollTo(toOffset - outerSize2);
|
|
} else if (align === "center") {
|
|
scrollTo(toOffset - outerSize2 / 2);
|
|
}
|
|
}, [scrollTo]);
|
|
var tryScrollToIndex = T2(function(index, _temp2) {
|
|
var _ref3 = _temp2 === void 0 ? {
|
|
align: "auto"
|
|
} : _temp2, align = _ref3.align, rest = _objectWithoutPropertiesLoose(_ref3, _excluded);
|
|
var _latestRef$current2 = latestRef.current, measurements2 = _latestRef$current2.measurements, scrollOffset2 = _latestRef$current2.scrollOffset, outerSize2 = _latestRef$current2.outerSize;
|
|
var measurement = measurements2[Math.max(0, Math.min(index, size - 1))];
|
|
if (!measurement) {
|
|
return;
|
|
}
|
|
if (align === "auto") {
|
|
if (measurement.end >= scrollOffset2 + outerSize2) {
|
|
align = "end";
|
|
} else if (measurement.start <= scrollOffset2) {
|
|
align = "start";
|
|
} else {
|
|
return;
|
|
}
|
|
}
|
|
var toOffset = align === "center" ? measurement.start + measurement.size / 2 : align === "end" ? measurement.end : measurement.start;
|
|
scrollToOffset(toOffset, _extends({
|
|
align
|
|
}, rest));
|
|
}, [scrollToOffset, size]);
|
|
var scrollToIndex = T2(function(index, options) {
|
|
tryScrollToIndex(index, options);
|
|
requestAnimationFrame(function() {
|
|
tryScrollToIndex(index, options);
|
|
});
|
|
}, [tryScrollToIndex]);
|
|
return {
|
|
virtualItems,
|
|
totalSize,
|
|
scrollToOffset,
|
|
scrollToIndex,
|
|
measure
|
|
};
|
|
};
|
|
var findNearestBinarySearch = function findNearestBinarySearch2(low, high, getCurrentValue, value) {
|
|
while (low <= high) {
|
|
var middle = (low + high) / 2 | 0;
|
|
var currentValue = getCurrentValue(middle);
|
|
if (currentValue < value) {
|
|
low = middle + 1;
|
|
} else if (currentValue > value) {
|
|
high = middle - 1;
|
|
} else {
|
|
return middle;
|
|
}
|
|
}
|
|
if (low > 0) {
|
|
return low - 1;
|
|
} else {
|
|
return 0;
|
|
}
|
|
};
|
|
function calculateRange(_ref4) {
|
|
var measurements = _ref4.measurements, outerSize = _ref4.outerSize, scrollOffset = _ref4.scrollOffset;
|
|
var size = measurements.length - 1;
|
|
var getOffset = function getOffset2(index) {
|
|
return measurements[index].start;
|
|
};
|
|
var start = findNearestBinarySearch(0, size, getOffset, scrollOffset);
|
|
var end = start;
|
|
while (end < size && measurements[end].end < scrollOffset + outerSize) {
|
|
end++;
|
|
}
|
|
return {
|
|
start,
|
|
end
|
|
};
|
|
}
|
|
|
|
// src/components/Spaces/TreeView/FolderTreeView.tsx
|
|
var import_obsidian35 = require("obsidian");
|
|
var import_classnames6 = __toESM(require_classnames());
|
|
|
|
// src/components/Spaces/TreeView/SectionView.tsx
|
|
var import_classnames5 = __toESM(require_classnames());
|
|
var import_obsidian34 = require("obsidian");
|
|
var SectionItem = k3(
|
|
({
|
|
childCount,
|
|
clone,
|
|
data,
|
|
depth,
|
|
disableSelection,
|
|
disableInteraction,
|
|
ghost,
|
|
handleProps,
|
|
indentationWidth,
|
|
indicator,
|
|
collapsed,
|
|
style,
|
|
onCollapse,
|
|
wrapperRef,
|
|
plugin,
|
|
disabled
|
|
}, ref) => {
|
|
var _a2, _b2;
|
|
const [activeFile2, setActiveFile] = Recoil_index_14(activeFile);
|
|
const [spaces2, setSpaces] = Recoil_index_14(spaces);
|
|
const space = spaces2.find((f4) => f4.name == data.space);
|
|
const newFolderInSection = () => {
|
|
var _a3;
|
|
let vaultChangeModal = new VaultChangeModal(
|
|
plugin,
|
|
((_a3 = space == null ? void 0 : space.def) == null ? void 0 : _a3.length) > 0 ? getFolderFromPath(app, space.def) : defaultNoteFolder(plugin, activeFile2),
|
|
"create folder",
|
|
data.space
|
|
);
|
|
vaultChangeModal.open();
|
|
};
|
|
const newFileInSection = async () => {
|
|
var _a3;
|
|
const newFile = await createNewMarkdownFile(
|
|
plugin,
|
|
((_a3 = space == null ? void 0 : space.def) == null ? void 0 : _a3.length) > 0 ? getFolderFromPath(app, space.def) : defaultNoteFolder(plugin, activeFile2),
|
|
""
|
|
);
|
|
if (data.space != "/")
|
|
addPathsToSpace(plugin, data.space, [newFile.path]);
|
|
};
|
|
const triggerMenu = (e4) => {
|
|
data.space == "/" ? triggerVaultMenu(e4) : triggerSectionMenu(plugin, data.space, spaces2, e4);
|
|
};
|
|
const triggerVaultMenu = (e4) => {
|
|
const refreshFileList = () => {
|
|
let event = new CustomEvent(eventTypes.vaultChange);
|
|
window.dispatchEvent(event);
|
|
};
|
|
const fileMenu = new import_obsidian34.Menu();
|
|
fileMenu.addItem((menuItem) => {
|
|
menuItem.setTitle(i18n_default.menu.collapseAll);
|
|
menuItem.setIcon("lucide-chevrons-down-up");
|
|
menuItem.onClick((ev) => {
|
|
plugin.settings.expandedFolders = {
|
|
...plugin.settings.expandedFolders,
|
|
"/": []
|
|
};
|
|
plugin.saveSettings();
|
|
});
|
|
});
|
|
fileMenu.addSeparator();
|
|
fileMenu.addItem((menuItem) => {
|
|
menuItem.setTitle(i18n_default.menu.customSort);
|
|
menuItem.setChecked(plugin.settings.vaultSort[0] == "rank");
|
|
menuItem.onClick((ev) => {
|
|
plugin.settings.vaultSort = ["rank", true];
|
|
plugin.saveSettings();
|
|
refreshFileList();
|
|
});
|
|
});
|
|
fileMenu.addSeparator();
|
|
fileMenu.addItem((menuItem) => {
|
|
menuItem.setTitle(i18n_default.menu.fileNameSortAlphaAsc);
|
|
menuItem.setChecked(
|
|
plugin.settings.vaultSort[0] == "path" && plugin.settings.vaultSort[1] == true
|
|
);
|
|
menuItem.onClick((ev) => {
|
|
plugin.settings.vaultSort = ["path", true];
|
|
plugin.saveSettings();
|
|
refreshFileList();
|
|
});
|
|
});
|
|
fileMenu.addItem((menuItem) => {
|
|
menuItem.setTitle(i18n_default.menu.fileNameSortAlphaDesc);
|
|
menuItem.setChecked(
|
|
plugin.settings.vaultSort[0] == "path" && plugin.settings.vaultSort[1] == false
|
|
);
|
|
menuItem.onClick((ev) => {
|
|
plugin.settings.vaultSort = ["path", false];
|
|
plugin.saveSettings();
|
|
refreshFileList();
|
|
});
|
|
});
|
|
fileMenu.addSeparator();
|
|
fileMenu.addItem((menuItem) => {
|
|
menuItem.setTitle(i18n_default.menu.createdTimeSortAsc);
|
|
menuItem.setChecked(
|
|
plugin.settings.vaultSort[0] == "created" && plugin.settings.vaultSort[1] == false
|
|
);
|
|
menuItem.onClick((ev) => {
|
|
plugin.settings.vaultSort = ["created", false];
|
|
plugin.saveSettings();
|
|
refreshFileList();
|
|
});
|
|
});
|
|
fileMenu.addItem((menuItem) => {
|
|
menuItem.setTitle(i18n_default.menu.createdTimeSortDesc);
|
|
menuItem.setChecked(
|
|
plugin.settings.vaultSort[0] == "created" && plugin.settings.vaultSort[1] == true
|
|
);
|
|
menuItem.onClick((ev) => {
|
|
plugin.settings.vaultSort = ["created", true];
|
|
plugin.saveSettings();
|
|
refreshFileList();
|
|
});
|
|
});
|
|
if (isMouseEvent(e4)) {
|
|
fileMenu.showAtPosition({ x: e4.pageX, y: e4.pageY });
|
|
} else {
|
|
fileMenu.showAtPosition({
|
|
x: e4.nativeEvent.locationX,
|
|
y: e4.nativeEvent.locationY
|
|
});
|
|
}
|
|
return false;
|
|
};
|
|
return /* @__PURE__ */ bn.createElement(bn.Fragment, null, /* @__PURE__ */ bn.createElement("div", {
|
|
className: (0, import_classnames5.default)(
|
|
"mk-tree-wrapper",
|
|
"mk-section-wrapper",
|
|
clone && "mk-clone",
|
|
ghost && "mk-ghost",
|
|
disableSelection && "mk-disable-selection",
|
|
disableInteraction && "mk-disable-interaction"
|
|
),
|
|
ref: wrapperRef,
|
|
style: {
|
|
...style,
|
|
...indicator ? { "--spacing": `${indentationWidth * depth}px` } : {}
|
|
}
|
|
}, /* @__PURE__ */ bn.createElement("div", {
|
|
onContextMenu: (e4) => triggerMenu(e4),
|
|
className: (0, import_classnames5.default)(
|
|
"mk-section",
|
|
indicator ? indicator.state == 2 /* Bottom */ ? "mk-indicator-bottom" : indicator.state == 1 /* Top */ ? "mk-indicator-top" : indicator.state == 3 /* Row */ ? "mk-indicator-row" : "" : ""
|
|
)
|
|
}, /* @__PURE__ */ bn.createElement("div", {
|
|
className: "mk-section-title",
|
|
onClick: (e4) => onCollapse(data),
|
|
ref,
|
|
...handleProps
|
|
}, ((_a2 = data.spaceItem) == null ? void 0 : _a2.sticker) ? /* @__PURE__ */ bn.createElement("div", {
|
|
dangerouslySetInnerHTML: {
|
|
__html: unifiedToNative((_b2 = data.spaceItem) == null ? void 0 : _b2.sticker)
|
|
}
|
|
}) : /* @__PURE__ */ bn.createElement(bn.Fragment, null), /* @__PURE__ */ bn.createElement("div", {
|
|
className: "mk-tree-text"
|
|
}, data.id == "/" ? plugin.app.vault.getName() : data.space), /* @__PURE__ */ bn.createElement("div", {
|
|
className: `mk-collapse ${collapsed ? "mk-collapsed" : ""}`,
|
|
dangerouslySetInnerHTML: {
|
|
__html: uiIconSet["mk-ui-collapse-sm"]
|
|
}
|
|
})), /* @__PURE__ */ bn.createElement("div", {
|
|
className: "mk-folder-buttons"
|
|
}, /* @__PURE__ */ bn.createElement("button", {
|
|
"aria-label": i18n_default.buttons.createFolder,
|
|
onClick: () => {
|
|
newFolderInSection();
|
|
},
|
|
dangerouslySetInnerHTML: {
|
|
__html: uiIconSet["mk-ui-new-folder"]
|
|
}
|
|
}), /* @__PURE__ */ bn.createElement("button", {
|
|
"aria-label": i18n_default.buttons.newNote,
|
|
onClick: () => {
|
|
newFileInSection();
|
|
},
|
|
dangerouslySetInnerHTML: {
|
|
__html: uiIconSet["mk-ui-new-note"]
|
|
}
|
|
})))));
|
|
}
|
|
);
|
|
SectionItem.displayName = "SectionItem";
|
|
|
|
// src/components/Spaces/TreeView/FolderTreeView.tsx
|
|
var animateLayoutChanges2 = ({
|
|
isSorting,
|
|
wasDragging
|
|
}) => isSorting || wasDragging ? false : true;
|
|
var SortableTreeItem = ({
|
|
id: id2,
|
|
data,
|
|
depth,
|
|
disabled,
|
|
style,
|
|
...props2
|
|
}) => {
|
|
const {
|
|
attributes,
|
|
isDragging,
|
|
isSorting,
|
|
listeners,
|
|
setDraggableNodeRef,
|
|
setDroppableNodeRef,
|
|
transform,
|
|
transition
|
|
} = useSortable({
|
|
id: id2,
|
|
animateLayoutChanges: animateLayoutChanges2,
|
|
disabled,
|
|
data
|
|
});
|
|
const memoListeners = F(() => {
|
|
return {
|
|
...attributes,
|
|
...listeners
|
|
};
|
|
}, [isSorting]);
|
|
if (data.parentId == null) {
|
|
return /* @__PURE__ */ bn.createElement(SectionItem, {
|
|
ref: setDraggableNodeRef,
|
|
wrapperRef: setDroppableNodeRef,
|
|
data,
|
|
depth,
|
|
ghost: isDragging,
|
|
disableInteraction: isSorting,
|
|
disabled,
|
|
style,
|
|
handleProps: memoListeners,
|
|
...props2
|
|
});
|
|
} else {
|
|
return /* @__PURE__ */ bn.createElement(TreeItem, {
|
|
ref: setDraggableNodeRef,
|
|
wrapperRef: setDroppableNodeRef,
|
|
data,
|
|
depth,
|
|
ghost: isDragging,
|
|
disableInteraction: isSorting,
|
|
disabled,
|
|
style,
|
|
handleProps: memoListeners,
|
|
...props2
|
|
});
|
|
}
|
|
};
|
|
var TreeItem = k3(
|
|
({
|
|
childCount,
|
|
clone,
|
|
data,
|
|
depth,
|
|
disableSelection,
|
|
disableInteraction,
|
|
ghost,
|
|
handleProps,
|
|
active,
|
|
indentationWidth,
|
|
indicator,
|
|
collapsed,
|
|
selected,
|
|
onCollapse,
|
|
onSelectRange,
|
|
wrapperRef,
|
|
style,
|
|
plugin,
|
|
disabled
|
|
}, ref) => {
|
|
var _a2;
|
|
const [activeFile2, setActiveFile] = Recoil_index_14(activeFile);
|
|
const [selectedFiles2, setSelectedFiles] = Recoil_index_14(
|
|
selectedFiles
|
|
);
|
|
const openFileAtTarget = (file, e4) => {
|
|
if (e4.shiftKey) {
|
|
onSelectRange(file.id);
|
|
return;
|
|
}
|
|
openAFile(
|
|
getAbstractFileAtPath(app, file.item.path),
|
|
plugin,
|
|
e4.ctrlKey || e4.metaKey
|
|
);
|
|
setActiveFile(file.item.path);
|
|
setSelectedFiles([file]);
|
|
};
|
|
const dragStarted = (e4) => {
|
|
if (selectedFiles2.length > 1) {
|
|
const files = selectedFiles2.map((f4) => f4.file).filter((f4) => f4);
|
|
app.dragManager.onDragStart(e4, {
|
|
icon: "lucide-files",
|
|
source: void 0,
|
|
title: i18n_default.labels.filesCount.replace("{$1}", files.length.toString()),
|
|
type: "files",
|
|
files
|
|
});
|
|
app.dragManager.dragFiles(e4, files, true);
|
|
return;
|
|
}
|
|
const file = getAbstractFileAtPath(app, data.item.path);
|
|
if (file instanceof import_obsidian35.TFolder) {
|
|
app.dragManager.onDragStart(e4, {
|
|
icon: "lucide-folder",
|
|
source: void 0,
|
|
title: file.name,
|
|
type: "folder",
|
|
file
|
|
});
|
|
app.dragManager.dragFolder(e4, file, true);
|
|
return;
|
|
}
|
|
app.dragManager.onDragStart(e4, {
|
|
icon: "lucide-file",
|
|
source: void 0,
|
|
title: file.name,
|
|
type: "file",
|
|
file
|
|
});
|
|
app.dragManager.dragFile(e4, file, true);
|
|
};
|
|
const innerProps = !platformIsMobile() ? {
|
|
draggable: true,
|
|
onDragStart: dragStarted
|
|
} : handleProps;
|
|
return /* @__PURE__ */ bn.createElement(bn.Fragment, null, /* @__PURE__ */ bn.createElement("div", {
|
|
className: (0, import_classnames6.default)(
|
|
"mk-tree-wrapper",
|
|
clone && "mk-clone",
|
|
ghost && "mk-ghost",
|
|
disableSelection && "mk-disable-selection",
|
|
disableInteraction && "mk-disable-interaction"
|
|
),
|
|
ref: wrapperRef,
|
|
style
|
|
}, /* @__PURE__ */ bn.createElement("div", {
|
|
className: indicator && (0, import_classnames6.default)(
|
|
"nav-file",
|
|
indicator.state == 2 /* Bottom */ ? "mk-indicator-bottom" : indicator.state == 1 /* Top */ ? "mk-indicator-top" : indicator.state == 3 /* Row */ ? "mk-indicator-row" : ""
|
|
),
|
|
style: indicator ? {
|
|
"--spacing": `${indentationWidth * indicator.depth}px`
|
|
} : {}
|
|
}, !platformIsMobile() && /* @__PURE__ */ bn.createElement("div", {
|
|
className: "mk-drag-handle",
|
|
dangerouslySetInnerHTML: { __html: uiIconSet["mk-ui-handle"] },
|
|
...handleProps
|
|
}), /* @__PURE__ */ bn.createElement("div", {
|
|
className: (0, import_classnames6.default)(
|
|
`mk-tree-item ${data.item.folder == "true" ? "nav-folder-title" : "nav-file-title"} ${active && "is-active"} ${selected && "is-selected"}`
|
|
),
|
|
ref,
|
|
style: {
|
|
"--spacing": `${indentationWidth * depth - 28}px`
|
|
},
|
|
onClick: (e4) => openFileAtTarget(data, e4),
|
|
"data-path": data.item.path,
|
|
onContextMenu: (e4) => selectedFiles2.length > 1 && selectedFiles2.some((f4) => f4.id == data.id) ? triggerMultiFileMenu(plugin, selectedFiles2, e4) : triggerFileMenu(
|
|
plugin,
|
|
data.file,
|
|
data.item.folder == "true",
|
|
e4
|
|
),
|
|
...innerProps
|
|
}, data.item.folder == "true" && /* @__PURE__ */ bn.createElement("button", {
|
|
"aria-label": `${collapsed ? i18n_default.labels.expand : i18n_default.labels.collapse}`,
|
|
className: `mk-collapse ${collapsed ? "mk-collapsed" : ""}`,
|
|
onClick: (e4) => {
|
|
onCollapse(data);
|
|
e4.stopPropagation();
|
|
},
|
|
dangerouslySetInnerHTML: {
|
|
__html: uiIconSet["mk-ui-collapse"]
|
|
}
|
|
}), plugin.settings.spacesStickers && /* @__PURE__ */ bn.createElement(FileSticker, {
|
|
plugin,
|
|
filePath: data.item.path
|
|
}), /* @__PURE__ */ bn.createElement("div", {
|
|
className: `mk-tree-text ${data.item.folder == "true" ? "nav-folder-title-content" : "nav-file-title-content"}`
|
|
}, data.file ? data.item.folder == "true" ? data.file.name : fileNameToString(data.file.name) : "", data.item.folder == "false" && data.file && data.file.extension != "md" && /* @__PURE__ */ bn.createElement("span", {
|
|
className: "nav-file-tag"
|
|
}, (_a2 = data.file) == null ? void 0 : _a2.extension)), !clone ? /* @__PURE__ */ bn.createElement("div", {
|
|
className: "mk-folder-buttons"
|
|
}, /* @__PURE__ */ bn.createElement("button", {
|
|
"aria-label": i18n_default.buttons.moreOptions,
|
|
onClick: (e4) => {
|
|
triggerFileMenu(
|
|
plugin,
|
|
data.file,
|
|
data.item.folder == "true",
|
|
e4
|
|
);
|
|
e4.stopPropagation();
|
|
},
|
|
dangerouslySetInnerHTML: {
|
|
__html: uiIconSet["mk-ui-options"]
|
|
}
|
|
}), data.item.folder == "true" && /* @__PURE__ */ bn.createElement("button", {
|
|
"aria-label": i18n_default.buttons.newNote,
|
|
onClick: (e4) => {
|
|
newFileInFolder(plugin, data.file);
|
|
e4.stopPropagation();
|
|
},
|
|
dangerouslySetInnerHTML: {
|
|
__html: uiIconSet["mk-ui-plus"]
|
|
}
|
|
})) : /* @__PURE__ */ bn.createElement(bn.Fragment, null)))));
|
|
}
|
|
);
|
|
TreeItem.displayName = "TreeItem";
|
|
|
|
// src/hooks/ForceUpdate.tsx
|
|
function useForceUpdate() {
|
|
const [value, setValue] = p2(0);
|
|
return () => setValue((value2) => value2 + 1);
|
|
}
|
|
|
|
// src/components/Spaces/TreeView/FileExplorerVirtualized.tsx
|
|
var import_obsidian36 = require("obsidian");
|
|
|
|
// src/utils/ui/dnd.ts
|
|
function getMaxDepth({ previousItem }) {
|
|
var _a2;
|
|
if (previousItem) {
|
|
if (((_a2 = previousItem.item) == null ? void 0 : _a2.folder) == "true")
|
|
return previousItem.depth + 1;
|
|
return previousItem.depth;
|
|
}
|
|
return 0;
|
|
}
|
|
function getMinDepth({ nextItem }) {
|
|
if (nextItem) {
|
|
return nextItem.depth;
|
|
}
|
|
return 0;
|
|
}
|
|
function getDragDepth(offset, indentationWidth) {
|
|
return Math.round(offset / indentationWidth) + 1;
|
|
}
|
|
function getProjection(items, activeItem, overItemIndex, previousItem, nextItem, dragDepth) {
|
|
const activeIsSection = activeItem.parentId == null;
|
|
const overIsSection = previousItem.parentId == null;
|
|
if (activeIsSection) {
|
|
if (overIsSection) {
|
|
return {
|
|
depth: 0,
|
|
maxDepth: 0,
|
|
minDepth: 0,
|
|
overId: previousItem.id,
|
|
parentId: null
|
|
};
|
|
}
|
|
return null;
|
|
}
|
|
if (nodeIsAncestorOfTarget(activeItem, previousItem)) {
|
|
return null;
|
|
}
|
|
if (activeItem.space != previousItem.space) {
|
|
if (previousItem.space == "/") {
|
|
return null;
|
|
}
|
|
}
|
|
const projectedDepth = dragDepth;
|
|
const maxDepth = getMaxDepth({
|
|
previousItem
|
|
});
|
|
const minDepth = getMinDepth({ nextItem });
|
|
let depth = projectedDepth;
|
|
if (projectedDepth >= maxDepth) {
|
|
depth = maxDepth;
|
|
} else if (projectedDepth < minDepth) {
|
|
depth = minDepth;
|
|
}
|
|
if (previousItem.space != "/" && depth > 1) {
|
|
return null;
|
|
}
|
|
if (depth <= activeItem.depth && activeItem.space == previousItem.space) {
|
|
if (!activeItem.sortable || !previousItem.sortable) {
|
|
return null;
|
|
}
|
|
}
|
|
return {
|
|
depth,
|
|
maxDepth,
|
|
minDepth,
|
|
overId: previousItem.id,
|
|
parentId: getParentId()
|
|
};
|
|
function getParentId() {
|
|
var _a2, _b2;
|
|
if (depth === 0) {
|
|
return previousItem.space == "/" ? "/" : previousItem.space + "//";
|
|
}
|
|
if (!previousItem) {
|
|
return "/";
|
|
}
|
|
if (depth === previousItem.depth || depth > previousItem.depth && ((_a2 = previousItem.item) == null ? void 0 : _a2.folder) != "true") {
|
|
return previousItem.parentId;
|
|
}
|
|
if (depth > previousItem.depth) {
|
|
return previousItem.id;
|
|
}
|
|
const newParent = (_b2 = items.slice(0, overItemIndex).reverse().find((item) => item.depth === depth)) == null ? void 0 : _b2.parentId;
|
|
return newParent != null ? newParent : null;
|
|
}
|
|
}
|
|
|
|
// src/components/Spaces/TreeView/FileExplorerVirtualized.tsx
|
|
var VirtualizedList = bn.memo(
|
|
(props2) => {
|
|
const {
|
|
flattenedTree,
|
|
projected,
|
|
vRef,
|
|
selectedFiles: selectedFiles2,
|
|
activeFile: activeFile2,
|
|
selectRange: selectRange2,
|
|
handleCollapse,
|
|
plugin,
|
|
indentationWidth
|
|
} = props2;
|
|
const parentRef = bn.useRef(null);
|
|
const rowHeight = (index) => platformIsMobile() ? flattenedTree[index].parentId == null ? 52 : 40 : flattenedTree[index].parentId == null ? 40 : 29;
|
|
const rowVirtualizer = useVirtual({
|
|
size: flattenedTree.length,
|
|
paddingEnd: 24,
|
|
parentRef,
|
|
estimateSize: bn.useCallback(
|
|
(index) => rowHeight(index),
|
|
[flattenedTree]
|
|
),
|
|
overscan: plugin.settings.spacesPerformance ? 0 : 20
|
|
});
|
|
vRef.current = rowVirtualizer;
|
|
rowVirtualizer.scrollToIndex;
|
|
return /* @__PURE__ */ bn.createElement("div", {
|
|
ref: parentRef,
|
|
style: {
|
|
width: `100%`,
|
|
height: `100%`,
|
|
overflow: "auto"
|
|
}
|
|
}, /* @__PURE__ */ bn.createElement("div", {
|
|
style: {
|
|
height: `${rowVirtualizer.totalSize}px`,
|
|
width: "100%",
|
|
position: "relative"
|
|
}
|
|
}, rowVirtualizer.virtualItems.map((virtualRow) => {
|
|
var _a2;
|
|
return /* @__PURE__ */ bn.createElement("div", {
|
|
key: virtualRow.index,
|
|
ref: virtualRow.measureRef,
|
|
style: {
|
|
position: "absolute",
|
|
top: 0,
|
|
left: 0,
|
|
width: "100%",
|
|
height: `${rowHeight(virtualRow.index)}px`,
|
|
transform: `translateY(${virtualRow.start}px)`
|
|
}
|
|
}, /* @__PURE__ */ bn.createElement(SortableTreeItem, {
|
|
key: flattenedTree[virtualRow.index].id,
|
|
id: flattenedTree[virtualRow.index].id,
|
|
data: flattenedTree[virtualRow.index],
|
|
disabled: false,
|
|
depth: flattenedTree[virtualRow.index].depth,
|
|
childCount: 0,
|
|
indentationWidth,
|
|
indicator: (projected == null ? void 0 : projected.overId) == flattenedTree[virtualRow.index].id ? flattenedTree[virtualRow.index].parentId == null && projected.parentId == null ? { state: 1 /* Top */, depth: projected.depth } : { state: 2 /* Bottom */, depth: projected.depth } : null,
|
|
plugin,
|
|
style: {},
|
|
onSelectRange: selectRange2,
|
|
active: activeFile2 == ((_a2 = flattenedTree[virtualRow.index].item) == null ? void 0 : _a2.path),
|
|
selected: selectedFiles2.some(
|
|
(g4) => g4.id == flattenedTree[virtualRow.index].id
|
|
),
|
|
collapsed: flattenedTree[virtualRow.index].collapsed,
|
|
onCollapse: handleCollapse
|
|
}));
|
|
})));
|
|
}
|
|
);
|
|
var FileExplorerComponent = (props2) => {
|
|
const { plugin } = props2;
|
|
const indentationWidth = 24;
|
|
const isMobile = platformIsMobile();
|
|
const [vaultItems, setVaultItems] = p2({});
|
|
const [expandedFolders2, setExpandedFolders] = p2(plugin.settings.expandedFolders);
|
|
const [expandedSpaces, setExpandedSpaces] = p2(
|
|
plugin.settings.expandedSpaces
|
|
);
|
|
const [activeFile2, setActiveFile] = Recoil_index_14(activeFile);
|
|
const [spaces2, setSpaces] = Recoil_index_14(spaces);
|
|
const [vaultSort, setVaultSort] = p2(
|
|
plugin.settings.vaultSort.length == 2 ? plugin.settings.vaultSort : ["rank", true]
|
|
);
|
|
const [selectedFiles2, setSelectedFiles] = Recoil_index_14(
|
|
selectedFiles
|
|
);
|
|
const nextTreeScrollPath = _2(null);
|
|
const activeSpaces = F(
|
|
() => props2.activeSpace ? spaces2.filter((f4) => f4.name == props2.activeSpace) : spaces2.filter((f4) => f4.pinned != "true"),
|
|
[spaces2, props2.activeSpace]
|
|
);
|
|
const [offsetLeft, setOffsetLeft] = p2(0);
|
|
const listRef = _2(null);
|
|
const forceUpdate = useForceUpdate();
|
|
const treeForSpace = (space) => {
|
|
var _a2, _b2;
|
|
let tree = [];
|
|
const spaceCollapsed = !expandedSpaces.includes(space.name);
|
|
const spaceSort = (_a2 = safelyParseJSON(space.sort)) != null ? _a2 : ["rank", true];
|
|
tree.push(spaceItemToTreeNode(space, spaceCollapsed, spaceSort));
|
|
if (!spaceCollapsed)
|
|
((_b2 = vaultItems[space.name + "/"]) != null ? _b2 : []).sort(folderSortFn(spaceSort[0], spaceSort[1])).forEach((item) => {
|
|
var _a3, _b3;
|
|
const itemCollapsed = !((_a3 = expandedFolders2[space.name]) == null ? void 0 : _a3.includes(
|
|
item.path
|
|
));
|
|
tree.push(
|
|
vaulItemToTreeNode(
|
|
item,
|
|
space.name,
|
|
"",
|
|
1,
|
|
0,
|
|
itemCollapsed,
|
|
spaceSort[0] == "rank" || spaceSort[0] == ""
|
|
)
|
|
);
|
|
if (!itemCollapsed)
|
|
tree.push(
|
|
...flattenedTreeFromVaultItems(
|
|
item.path,
|
|
space.name,
|
|
vaultItems,
|
|
(_b3 = expandedFolders2[space.name]) != null ? _b3 : [],
|
|
2,
|
|
spaceSort[0],
|
|
spaceSort[1]
|
|
)
|
|
);
|
|
});
|
|
return tree;
|
|
};
|
|
const flattenedTree = F(() => {
|
|
var _a2;
|
|
let tree = [];
|
|
activeSpaces.forEach((space) => {
|
|
tree.push(...treeForSpace(space));
|
|
});
|
|
if (!props2.activeSpace) {
|
|
const vaultCollapsed = !expandedSpaces.includes("/");
|
|
tree.push({
|
|
id: "/",
|
|
parentId: null,
|
|
depth: 0,
|
|
index: 0,
|
|
space: "/",
|
|
item: null,
|
|
collapsed: vaultCollapsed,
|
|
sortable: vaultSort[0] == "rank"
|
|
});
|
|
if (!vaultCollapsed)
|
|
tree.push(
|
|
...flattenedTreeFromVaultItems(
|
|
"/",
|
|
"/",
|
|
vaultItems,
|
|
(_a2 = expandedFolders2["/"]) != null ? _a2 : [],
|
|
1,
|
|
vaultSort[0],
|
|
vaultSort[1]
|
|
)
|
|
);
|
|
}
|
|
if (nextTreeScrollPath.current) {
|
|
const index = tree.findIndex(
|
|
(f4) => {
|
|
var _a3;
|
|
return ((_a3 = f4.item) == null ? void 0 : _a3.path) == nextTreeScrollPath.current;
|
|
}
|
|
);
|
|
if (index != -1) {
|
|
listRef.current.scrollToIndex(index);
|
|
nextTreeScrollPath.current = null;
|
|
}
|
|
}
|
|
return tree;
|
|
}, [
|
|
vaultItems,
|
|
activeSpaces,
|
|
expandedSpaces,
|
|
expandedFolders2,
|
|
vaultSort,
|
|
props2.activeSpace
|
|
]);
|
|
h2(() => {
|
|
if (selectedFiles2.length <= 1) {
|
|
if (!selectedFiles2[0] || selectedFiles2[0].item.path != activeFile2)
|
|
setSelectedFiles([]);
|
|
if (plugin.settings.revealActiveFile)
|
|
revealFile(getAbstractFileAtPath(app, activeFile2));
|
|
}
|
|
window.addEventListener(eventTypes.activeFileChange, changeActiveFile);
|
|
return () => {
|
|
window.removeEventListener(eventTypes.activeFileChange, changeActiveFile);
|
|
};
|
|
}, [activeFile2]);
|
|
h2(() => {
|
|
window.addEventListener(eventTypes.refreshView, forceUpdate);
|
|
window.addEventListener(eventTypes.settingsChanged, settingsChanged);
|
|
window.addEventListener(eventTypes.revealFile, handleRevealFileEvent);
|
|
return () => {
|
|
window.removeEventListener(eventTypes.refreshView, forceUpdate);
|
|
window.removeEventListener(eventTypes.settingsChanged, settingsChanged);
|
|
window.removeEventListener(eventTypes.revealFile, handleRevealFileEvent);
|
|
};
|
|
}, []);
|
|
const revealFile = (file) => {
|
|
var _a2, _b2;
|
|
if (!file)
|
|
return;
|
|
const folders = file.path.split("/");
|
|
const openPaths = folders.reduce(
|
|
(p3, c4, index) => [...p3, index == 0 ? c4 : `${p3[index]}/${c4}`],
|
|
["/"]
|
|
).slice(0, -1);
|
|
const newOpenFolders = [
|
|
...(_b2 = (_a2 = expandedFolders2["/"]) == null ? void 0 : _a2.filter((f4) => !openPaths.find((g4) => g4 == f4))) != null ? _b2 : [],
|
|
...openPaths
|
|
];
|
|
plugin.settings.expandedFolders = {
|
|
...expandedFolders2,
|
|
"/": newOpenFolders
|
|
};
|
|
nextTreeScrollPath.current = file.path;
|
|
plugin.saveSettings();
|
|
};
|
|
const handleRevealFileEvent = (evt) => {
|
|
if (evt.detail)
|
|
revealFile(evt.detail.file);
|
|
};
|
|
h2(() => {
|
|
const spaceItems = retrieveSpaceItems(plugin, spaces2);
|
|
setVaultItems((g4) => ({
|
|
...g4,
|
|
...Object.keys(spaceItems).reduce(
|
|
(p3, c4) => ({
|
|
...p3,
|
|
[c4 + "/"]: spaceItems[c4].map((f4) => {
|
|
var _a2;
|
|
return {
|
|
...(_a2 = vaultItemForPath(plugin, f4.path)) != null ? _a2 : {},
|
|
...f4
|
|
};
|
|
})
|
|
}),
|
|
{}
|
|
)
|
|
}));
|
|
}, [spaces2]);
|
|
const retrieveData = async (folders) => {
|
|
setSpaces(retrieveSpaces(plugin));
|
|
retrieveFolders(plugin, folders).then(
|
|
(f4) => setVaultItems((g4) => ({ ...g4, ...f4 }))
|
|
);
|
|
};
|
|
const flatFolders = F(() => {
|
|
let allFolders = [];
|
|
if (expandedSpaces.includes("/"))
|
|
allFolders.push("/");
|
|
expandedSpaces.forEach((space) => {
|
|
var _a2;
|
|
allFolders.push(...(_a2 = expandedFolders2[space]) != null ? _a2 : []);
|
|
});
|
|
return allFolders;
|
|
}, [expandedSpaces, expandedFolders2]);
|
|
h2(() => {
|
|
const newFolders = flatFolders;
|
|
retrieveData(newFolders);
|
|
window.addEventListener(eventTypes.spacesChange, spaceChangeEvent);
|
|
return () => {
|
|
window.removeEventListener(eventTypes.spacesChange, spaceChangeEvent);
|
|
};
|
|
}, [flatFolders]);
|
|
const spaceChangeEvent = (evt) => {
|
|
if (evt.detail.changeType == "vault" || evt.detail.changeType == "space") {
|
|
retrieveData(flatFolders);
|
|
}
|
|
};
|
|
const changeActiveFile = (evt) => {
|
|
let filePath = evt.detail.filePath;
|
|
setActiveFile(filePath);
|
|
};
|
|
const settingsChanged = () => {
|
|
setVaultSort(plugin.settings.vaultSort);
|
|
setExpandedFolders(plugin.settings.expandedFolders);
|
|
setExpandedSpaces(plugin.settings.expandedSpaces);
|
|
};
|
|
h2(() => {
|
|
settingsChanged();
|
|
}, []);
|
|
const [activeId, setActiveId] = p2(null);
|
|
const [overId, setOverId] = p2(null);
|
|
const [currentPosition, setCurrentPosition] = p2(null);
|
|
h2(() => {
|
|
if (!expandedSpaces.includes(props2.activeSpace)) {
|
|
plugin.settings.expandedSpaces = uniq([
|
|
...plugin.settings.expandedSpaces,
|
|
props2.activeSpace
|
|
]);
|
|
plugin.saveSettings();
|
|
}
|
|
}, [props2.activeSpace]);
|
|
const sortedIds = F(
|
|
() => flattenedTree.map(({ id: id2 }) => id2),
|
|
[flattenedTree]
|
|
);
|
|
const selectRange2 = (fromId) => {
|
|
const startIndex = sortedIds.findIndex((f4) => f4 == fromId);
|
|
const selectedFilesStartIndex = sortedIds.findIndex(
|
|
(f4) => {
|
|
var _a2;
|
|
return f4 == ((_a2 = selectedFiles2[0]) == null ? void 0 : _a2.id);
|
|
}
|
|
);
|
|
const selectedFilesEndIndex = sortedIds.findIndex(
|
|
(f4) => {
|
|
var _a2;
|
|
return f4 == ((_a2 = selectedFiles2[selectedFiles2.length - 1]) == null ? void 0 : _a2.id);
|
|
}
|
|
);
|
|
if (startIndex < selectedFilesStartIndex) {
|
|
setSelectedFiles(
|
|
flattenedTree.slice(startIndex, selectedFilesEndIndex + 1).filter((f4) => f4.item)
|
|
);
|
|
} else {
|
|
setSelectedFiles(
|
|
flattenedTree.slice(selectedFilesStartIndex, startIndex + 1).filter((f4) => f4.item)
|
|
);
|
|
}
|
|
};
|
|
const activeItem = activeId ? flattenedTree.find(({ id: id2 }) => id2 === activeId) : null;
|
|
const overIndex = overId ? flattenedTree.findIndex(({ id: id2 }) => id2 === overId) : null;
|
|
const overItem = flattenedTree[overIndex];
|
|
const nextItem = flattenedTree[overIndex + 1];
|
|
const dragDepth = F(() => {
|
|
return getDragDepth(offsetLeft, indentationWidth);
|
|
}, [offsetLeft]);
|
|
const projected = F(() => {
|
|
return activeId && overId ? getProjection(
|
|
flattenedTree,
|
|
activeItem,
|
|
overIndex,
|
|
overItem,
|
|
nextItem,
|
|
dragDepth
|
|
) : null;
|
|
}, [flattenedTree, activeItem, overItem, nextItem, overIndex, dragDepth]);
|
|
function handleDragStart(event) {
|
|
const {
|
|
active: { id: activeId2 }
|
|
} = event;
|
|
const activeItem2 = flattenedTree.find(({ id: id2 }) => id2 === activeId2);
|
|
if (activeItem2.parentId == null && activeItem2.space == "/")
|
|
return;
|
|
setActiveId(activeId2);
|
|
setOverId(activeId2);
|
|
if (activeItem2) {
|
|
setCurrentPosition({
|
|
parentId: activeItem2.parentId,
|
|
overId: activeId2
|
|
});
|
|
}
|
|
document.body.style.setProperty("cursor", "grabbing");
|
|
}
|
|
function handleDragMove({ delta }) {
|
|
setOffsetLeft(Math.max(1, delta.x));
|
|
}
|
|
function handleDragOver({ over }) {
|
|
var _a2;
|
|
const overId2 = over == null ? void 0 : over.id;
|
|
if (overId2) {
|
|
setOverId((_a2 = over == null ? void 0 : over.id) != null ? _a2 : null);
|
|
}
|
|
}
|
|
function handleDragEnd({ active, over }) {
|
|
resetState();
|
|
moveFile(active, over);
|
|
}
|
|
const moveFile = async (active, over) => {
|
|
var _a2, _b2;
|
|
if (projected) {
|
|
const clonedItems = flattenedTree;
|
|
const overIndex2 = clonedItems.findIndex(({ id: id2 }) => id2 === over.id);
|
|
const overItem2 = clonedItems[overIndex2];
|
|
const activeIndex = clonedItems.findIndex(({ id: id2 }) => id2 === active.id);
|
|
const activeTreeItem = clonedItems[activeIndex];
|
|
const activeIsSection = activeTreeItem.parentId == null;
|
|
const overIsSection = overItem2.parentId == null;
|
|
const overSpace = activeSpaces.find(
|
|
(f4) => f4.name == overItem2.space
|
|
);
|
|
if (activeIsSection) {
|
|
if (overIsSection) {
|
|
insertSpaceAtIndex(
|
|
plugin,
|
|
activeTreeItem.space,
|
|
false,
|
|
overSpace ? parseInt(overSpace.rank) : spaces2.length
|
|
);
|
|
return;
|
|
}
|
|
}
|
|
const { depth, overId: overId2, parentId } = projected;
|
|
const parentItem = clonedItems.find(({ id: id2 }) => id2 === parentId);
|
|
if (overItem2.space != activeItem.space || overItem2.space != "/") {
|
|
if (overItem2.space == "/") {
|
|
return;
|
|
}
|
|
if (parentId != overItem2.space + "//" && parentId != null) {
|
|
return;
|
|
}
|
|
if (activeItem.space != overItem2.space && ((_a2 = overSpace == null ? void 0 : overSpace.def) == null ? void 0 : _a2.length) > 0) {
|
|
moveAFileToNewParentAtIndex(
|
|
plugin,
|
|
activeTreeItem.item,
|
|
overSpace.def,
|
|
vaultItems,
|
|
parseInt(overItem2.item.rank)
|
|
);
|
|
} else {
|
|
insertSpaceItemAtIndex(
|
|
plugin,
|
|
overItem2.space,
|
|
activeItem.item.path,
|
|
parseInt((_b2 = overItem2.item) == null ? void 0 : _b2.rank)
|
|
);
|
|
}
|
|
return;
|
|
}
|
|
if (parentId != activeTreeItem.parentId) {
|
|
if (overIsSection) {
|
|
updateFileRank(
|
|
plugin,
|
|
activeTreeItem.item,
|
|
vaultItems,
|
|
-1
|
|
);
|
|
return;
|
|
}
|
|
const newParent = parentItem ? parentItem.item.folder == "true" ? parentItem.item.path : parentItem.item.parent : "/";
|
|
const newPath = newParent == "/" ? activeItem.file.name : `${newParent}/${activeItem.file.name}`;
|
|
if (plugin.app.vault.getAbstractFileByPath(newPath)) {
|
|
new import_obsidian36.Notice(i18n_default.notice.duplicateFile);
|
|
return;
|
|
}
|
|
moveAFileToNewParentAtIndex(
|
|
plugin,
|
|
activeTreeItem.item,
|
|
newParent,
|
|
vaultItems,
|
|
parseInt(overItem2.item.rank)
|
|
);
|
|
} else {
|
|
updateFileRank(
|
|
plugin,
|
|
activeTreeItem.item,
|
|
vaultItems,
|
|
parseInt(overItem2.item.rank)
|
|
);
|
|
}
|
|
}
|
|
};
|
|
const adjustTranslate = ({ transform }) => {
|
|
return {
|
|
...transform,
|
|
x: transform.x,
|
|
y: transform.y - 10
|
|
};
|
|
};
|
|
function handleDragCancel() {
|
|
resetState();
|
|
}
|
|
const handleCollapse = T2(
|
|
(folder) => {
|
|
var _a2;
|
|
if (folder.parentId == null) {
|
|
if (plugin.settings.expandedSpaces.includes(folder.space))
|
|
plugin.settings.expandedSpaces = plugin.settings.expandedSpaces.filter((f4) => f4 != folder.space);
|
|
else
|
|
plugin.settings.expandedSpaces = [
|
|
...plugin.settings.expandedSpaces,
|
|
folder.space
|
|
];
|
|
plugin.saveSettings();
|
|
} else {
|
|
const openFolders = (_a2 = expandedFolders2[folder.space]) != null ? _a2 : [];
|
|
const folderOpen = openFolders == null ? void 0 : openFolders.includes(folder.item.path);
|
|
const newOpenFolders = !folderOpen ? [...openFolders, folder.item.path] : openFolders.filter(
|
|
(openFolder) => folder.item.path !== openFolder
|
|
);
|
|
plugin.settings.expandedFolders = {
|
|
...expandedFolders2,
|
|
[folder.space]: newOpenFolders
|
|
};
|
|
plugin.saveSettings();
|
|
}
|
|
},
|
|
[plugin, expandedFolders2, expandedSpaces]
|
|
);
|
|
function resetState() {
|
|
setOverId(null);
|
|
setActiveId(null);
|
|
setOffsetLeft(0);
|
|
document.body.style.setProperty("cursor", "");
|
|
}
|
|
useDndMonitor({
|
|
onDragStart: handleDragStart,
|
|
onDragMove: handleDragMove,
|
|
onDragOver: handleDragOver,
|
|
onDragEnd: handleDragEnd,
|
|
onDragCancel: handleDragCancel
|
|
});
|
|
return /* @__PURE__ */ bn.createElement("div", {
|
|
className: "mk-file-tree"
|
|
}, /* @__PURE__ */ bn.createElement(SortableContext, {
|
|
items: sortedIds,
|
|
strategy: verticalListSortingStrategy
|
|
}, /* @__PURE__ */ bn.createElement(VirtualizedList, {
|
|
vRef: listRef,
|
|
flattenedTree,
|
|
projected,
|
|
handleCollapse,
|
|
activeFile: activeFile2,
|
|
plugin,
|
|
selectedFiles: selectedFiles2,
|
|
selectRange: selectRange2,
|
|
indentationWidth
|
|
}), j3(
|
|
/* @__PURE__ */ bn.createElement(DragOverlay, {
|
|
dropAnimation: null,
|
|
modifiers: [adjustTranslate],
|
|
zIndex: 1600
|
|
}, activeId ? /* @__PURE__ */ bn.createElement(SortableTreeItem, {
|
|
id: activeId,
|
|
data: flattenedTree.find((f4) => f4.id == activeId),
|
|
indicator: null,
|
|
depth: 0,
|
|
disabled: false,
|
|
plugin,
|
|
selected: false,
|
|
active: false,
|
|
clone: true,
|
|
childCount: 0,
|
|
style: {},
|
|
indentationWidth
|
|
}) : null),
|
|
document.body
|
|
)));
|
|
};
|
|
|
|
// src/components/Spaces/SpaceSwitcher/SpaceSwitcher.tsx
|
|
var import_classnames7 = __toESM(require_classnames());
|
|
var SpaceSwitcher = (props2) => {
|
|
const [activeView2, setActiveView] = Recoil_index_14(activeView);
|
|
const [spaces2, setSpaces] = Recoil_index_14(spaces);
|
|
const [activeFile2, setActiveFile] = Recoil_index_14(activeFile);
|
|
const folder = defaultNoteFolder(props2.plugin, activeFile2);
|
|
const { plugin } = props2;
|
|
const newFile = async () => {
|
|
await createNewMarkdownFile(props2.plugin, folder, "", "");
|
|
};
|
|
const pinnedSpaces = F(
|
|
() => spaces2.filter((f4) => f4.pinned == "true"),
|
|
[spaces2]
|
|
);
|
|
const [activeViewSpace2, setActiveViewSpace] = Recoil_index_14(
|
|
activeViewSpace
|
|
);
|
|
const newSection = () => {
|
|
let vaultChangeModal = new EditSpaceModal(props2.plugin, "", "create");
|
|
vaultChangeModal.open();
|
|
};
|
|
return props2.plugin.settings.spacesCompactMode ? /* @__PURE__ */ bn.createElement("div", {
|
|
className: "mk-flow-bar-compact"
|
|
}, /* @__PURE__ */ bn.createElement(MainMenu, {
|
|
plugin: props2.plugin
|
|
}), /* @__PURE__ */ bn.createElement("button", {
|
|
"aria-label": i18n_default.buttons.newNote,
|
|
className: "mk-inline-button",
|
|
onClick: () => newFile()
|
|
}, /* @__PURE__ */ bn.createElement("div", {
|
|
className: "mk-icon-small",
|
|
dangerouslySetInnerHTML: { __html: uiIconSet["mk-ui-new-note"] }
|
|
})), /* @__PURE__ */ bn.createElement("button", {
|
|
"aria-label": "Blink",
|
|
className: "mk-inline-button",
|
|
onClick: () => props2.plugin.quickOpen()
|
|
}, /* @__PURE__ */ bn.createElement("div", {
|
|
className: "mk-icon-small",
|
|
dangerouslySetInnerHTML: { __html: uiIconSet["mk-ui-blink"] }
|
|
}))) : /* @__PURE__ */ bn.createElement(bn.Fragment, null, /* @__PURE__ */ bn.createElement("div", {
|
|
className: "mk-flow-bar"
|
|
}, /* @__PURE__ */ bn.createElement("button", {
|
|
"aria-label": i18n_default.buttons.newNote,
|
|
className: "mk-new-note",
|
|
onClick: () => newFile()
|
|
}, /* @__PURE__ */ bn.createElement("div", {
|
|
dangerouslySetInnerHTML: { __html: uiIconSet["mk-ui-new-note"] }
|
|
}), /* @__PURE__ */ bn.createElement("p", null, i18n_default.buttons.newNote)), /* @__PURE__ */ bn.createElement("button", {
|
|
"aria-label": i18n_default.buttons.blink,
|
|
className: "mk-button-blink",
|
|
onClick: () => props2.plugin.quickOpen()
|
|
}, /* @__PURE__ */ bn.createElement("div", {
|
|
dangerouslySetInnerHTML: { __html: uiIconSet["mk-ui-blink"] }
|
|
}))), /* @__PURE__ */ bn.createElement("div", {
|
|
className: "mk-sidebar-switcher"
|
|
}, /* @__PURE__ */ bn.createElement("div", {
|
|
className: (0, import_classnames7.default)(
|
|
"mk-sidebar-item",
|
|
pinnedSpaces.length == 0 && "mk-sidebar-expanded",
|
|
activeView2 == "root" && "mk-sidebar-item-active"
|
|
),
|
|
onClick: () => setActiveView("root")
|
|
}, /* @__PURE__ */ bn.createElement("div", {
|
|
className: "mk-icon-small",
|
|
dangerouslySetInnerHTML: { __html: uiIconSet["mk-ui-spaces"] }
|
|
}, " "), pinnedSpaces.length == 0 && /* @__PURE__ */ bn.createElement("div", null, "Spaces")), /* @__PURE__ */ bn.createElement("div", {
|
|
className: (0, import_classnames7.default)(
|
|
"mk-sidebar-item",
|
|
pinnedSpaces.length == 0 && "mk-sidebar-expanded",
|
|
activeView2 == "tags" && "mk-sidebar-item-active"
|
|
),
|
|
onClick: () => setActiveView("tags")
|
|
}, /* @__PURE__ */ bn.createElement("div", {
|
|
className: "mk-icon-small",
|
|
dangerouslySetInnerHTML: { __html: uiIconSet["mk-ui-tags"] }
|
|
}, " "), " ", pinnedSpaces.length == 0 && /* @__PURE__ */ bn.createElement("div", null, "Contexts")), /* @__PURE__ */ bn.createElement("div", {
|
|
className: "mk-sidebar-spaces"
|
|
}, pinnedSpaces.map((pin) => {
|
|
var _a2;
|
|
return /* @__PURE__ */ bn.createElement("div", {
|
|
onContextMenu: (e4) => triggerSectionMenu(props2.plugin, pin.name, spaces2, e4),
|
|
className: (0, import_classnames7.default)(
|
|
"mk-sidebar-item mk-sidebar-space",
|
|
activeView2 == "space" && activeViewSpace2 == pin.name && "mk-sidebar-item-active"
|
|
),
|
|
onClick: () => (setActiveView("space"), setActiveViewSpace(pin.name)),
|
|
dangerouslySetInnerHTML: ((_a2 = pin.sticker) == null ? void 0 : _a2.length) > 0 ? { __html: unifiedToNative(pin.sticker) } : null
|
|
}, pin.name.substring(0, 1));
|
|
})), /* @__PURE__ */ bn.createElement("div", {
|
|
className: (0, import_classnames7.default)("mk-sidebar-item"),
|
|
onClick: () => newSection()
|
|
}, /* @__PURE__ */ bn.createElement("div", {
|
|
className: "mk-icon-small",
|
|
dangerouslySetInnerHTML: { __html: uiIconSet["mk-ui-new-space"] }
|
|
}, " "))));
|
|
};
|
|
|
|
// src/components/Spaces/TagContextList/TagContextList.tsx
|
|
var import_lodash6 = __toESM(require_lodash());
|
|
var import_obsidian37 = require("obsidian");
|
|
var TagContextList = (props2) => {
|
|
const [tags, setTags] = p2([]);
|
|
const openContext = async (tag) => {
|
|
openTag(tag, props2.plugin, false);
|
|
};
|
|
h2(() => {
|
|
window.addEventListener(eventTypes.tagsChange, refreshTags);
|
|
return () => {
|
|
window.removeEventListener(eventTypes.tagsChange, refreshTags);
|
|
};
|
|
}, []);
|
|
const refreshTags = () => {
|
|
var _a2;
|
|
const folder = props2.plugin.settings.tagContextFolder == "" ? app.vault.getRoot() : getAbstractFileAtPath(
|
|
app,
|
|
getFolderPathFromString(props2.plugin.settings.tagContextFolder)
|
|
);
|
|
const f4 = (_a2 = folder == null ? void 0 : folder.children.filter(
|
|
(f5) => f5 instanceof import_obsidian37.TFile && f5.extension == "mdb" && f5.name.charAt(0) == "#"
|
|
).map((f5) => fileNameToString(f5.name))) != null ? _a2 : [];
|
|
Promise.all(f4.map((t4) => contextShouldExist(props2.plugin, t4).then((g4) => g4 ? t4 : null))).then((f5) => setTags((0, import_lodash6.uniq)([...f5.filter((g4) => g4), ...Object.keys(app.metadataCache.getTags())])));
|
|
};
|
|
h2(() => {
|
|
refreshTags();
|
|
}, []);
|
|
return /* @__PURE__ */ bn.createElement("div", {
|
|
className: "tag-container"
|
|
}, /* @__PURE__ */ bn.createElement("div", {
|
|
className: "tree-item"
|
|
}, tags.map((f4) => /* @__PURE__ */ bn.createElement("div", {
|
|
className: "tree-item-self is-clickable",
|
|
onClick: () => openContext(f4)
|
|
}, f4))));
|
|
};
|
|
|
|
// src/components/Spaces/MainList.tsx
|
|
var MainList = (props2) => {
|
|
const [activeView2, setActiveView] = Recoil_index_14(activeView);
|
|
const [spaces2, setSpaces] = Recoil_index_14(spaces);
|
|
const [activeViewSpace2, setActiveViewSpace] = Recoil_index_14(
|
|
activeViewSpace
|
|
);
|
|
const [error, resetError] = P2();
|
|
if (error)
|
|
console.log(error);
|
|
h2(() => {
|
|
if (activeView2 == "space" && !spaces2.some((f4) => f4.name == activeViewSpace2 && f4.pinned == "true")) {
|
|
setActiveView("root");
|
|
}
|
|
}, [spaces2]);
|
|
const sensors = useSensors(
|
|
useSensor(MouseSensor, {
|
|
activationConstraint: {
|
|
distance: 10
|
|
}
|
|
}),
|
|
useSensor(TouchSensor, {
|
|
activationConstraint: {
|
|
delay: 250,
|
|
tolerance: 5
|
|
}
|
|
})
|
|
);
|
|
const measuring = {
|
|
droppable: {
|
|
strategy: MeasuringStrategy.Always
|
|
}
|
|
};
|
|
const viewForState = (viewType, space) => {
|
|
if (viewType == "root") {
|
|
return /* @__PURE__ */ bn.createElement(FileExplorerComponent, {
|
|
plugin: props2.plugin
|
|
});
|
|
} else if (viewType == "tags") {
|
|
return /* @__PURE__ */ bn.createElement(TagContextList, {
|
|
plugin: props2.plugin
|
|
});
|
|
} else if (viewType == "space") {
|
|
return /* @__PURE__ */ bn.createElement(FileExplorerComponent, {
|
|
plugin: props2.plugin,
|
|
activeSpace: space
|
|
});
|
|
}
|
|
return /* @__PURE__ */ bn.createElement(FileExplorerComponent, {
|
|
plugin: props2.plugin
|
|
});
|
|
};
|
|
return /* @__PURE__ */ bn.createElement(DndContext, {
|
|
sensors,
|
|
collisionDetection: closestCenter,
|
|
measuring
|
|
}, /* @__PURE__ */ bn.createElement(SpaceSwitcher, {
|
|
plugin: props2.plugin
|
|
}), viewForState(activeView2, activeViewSpace2));
|
|
};
|
|
|
|
// src/components/Spaces/FileTreeView.tsx
|
|
var FILE_TREE_VIEW_TYPE = "mk-file-view";
|
|
var VIEW_DISPLAY_TEXT = "Spaces";
|
|
var ICON = "layout-grid";
|
|
var FileTreeView = class extends import_obsidian38.ItemView {
|
|
constructor(leaf, plugin) {
|
|
super(leaf);
|
|
this.navigation = false;
|
|
this.plugin = plugin;
|
|
}
|
|
revealInFolder(file) {
|
|
if (file instanceof import_obsidian38.TFolder) {
|
|
this.plugin.app.workspace.activeLeaf.setViewState({
|
|
type: CONTEXT_VIEW_TYPE,
|
|
state: { type: "folder", folder: file.path }
|
|
});
|
|
this.plugin.app.workspace.requestSaveLayout();
|
|
} else {
|
|
let evt = new CustomEvent(eventTypes.revealFile, {
|
|
detail: { file }
|
|
});
|
|
window.dispatchEvent(evt);
|
|
}
|
|
}
|
|
getViewType() {
|
|
return FILE_TREE_VIEW_TYPE;
|
|
}
|
|
getDisplayText() {
|
|
return VIEW_DISPLAY_TEXT;
|
|
}
|
|
getIcon() {
|
|
return ICON;
|
|
}
|
|
async onClose() {
|
|
let leafs = this.app.workspace.getLeavesOfType(FILE_TREE_VIEW_TYPE);
|
|
if (leafs.length == 0) {
|
|
let leaf = this.app.workspace.getLeftLeaf(false);
|
|
await leaf.setViewState({ type: FILE_TREE_VIEW_TYPE });
|
|
}
|
|
this.destroy();
|
|
}
|
|
destroy() {
|
|
if (this.root)
|
|
this.root.unmount();
|
|
}
|
|
async onOpen() {
|
|
this.destroy();
|
|
this.constructFileTree(this.app.vault.getRoot().path, "");
|
|
}
|
|
constructFileTree(folderPath, vaultChange) {
|
|
this.destroy();
|
|
this.root = createRoot(this.contentEl);
|
|
this.root.render(
|
|
/* @__PURE__ */ bn.createElement("div", {
|
|
className: "mk-sidebar"
|
|
}, /* @__PURE__ */ bn.createElement(Recoil_index_2, null, !platformIsMobile() && !this.plugin.settings.spacesCompactMode ? /* @__PURE__ */ bn.createElement(MainMenu, {
|
|
plugin: this.plugin
|
|
}) : null, /* @__PURE__ */ bn.createElement(MainList, {
|
|
plugin: this.plugin
|
|
})))
|
|
);
|
|
}
|
|
};
|
|
|
|
// src/settings.ts
|
|
var import_obsidian39 = require("obsidian");
|
|
var DEFAULT_SETTINGS = {
|
|
filePreviewOnHover: false,
|
|
markSans: false,
|
|
makeMenuPlaceholder: true,
|
|
mobileMakeBar: true,
|
|
inlineStyler: true,
|
|
makerMode: true,
|
|
inlineStylerColors: false,
|
|
editorFlow: true,
|
|
internalLinkClickFlow: true,
|
|
saveAllContextToFrontmatter: false,
|
|
editorFlowStyle: "seamless",
|
|
autoOpenFileContext: false,
|
|
spacesCompactMode: false,
|
|
spacesEnabled: true,
|
|
spacesPerformance: false,
|
|
enableFolderNote: true,
|
|
revealActiveFile: false,
|
|
spacesStickers: true,
|
|
spacesDisablePatch: false,
|
|
folderNoteInsideFolder: true,
|
|
sidebarTabs: true,
|
|
showRibbon: true,
|
|
deleteFileOption: "trash",
|
|
expandedFolders: {},
|
|
expandedSpaces: ["/"],
|
|
folderRank: {
|
|
node: "root",
|
|
children: [],
|
|
isFolder: true
|
|
},
|
|
openFolders: [],
|
|
fileIcons: [],
|
|
spaces: [],
|
|
pinnedSpaces: [],
|
|
menuTriggerChar: "/",
|
|
emojiTriggerChar: ":",
|
|
folderContextFile: "context",
|
|
tagContextFolder: "Context",
|
|
hiddenFiles: ["Context"],
|
|
hiddenExtensions: ["mdb"],
|
|
vaultSort: ["rank", true],
|
|
newFileLocation: "root",
|
|
newFileFolderPath: ""
|
|
};
|
|
var MakeMDPluginSettingsTab = class extends import_obsidian39.PluginSettingTab {
|
|
constructor(app2, plugin) {
|
|
super(app2, plugin);
|
|
this.plugin = plugin;
|
|
}
|
|
refreshView() {
|
|
let evt = new CustomEvent(eventTypes.refreshView, {});
|
|
window.dispatchEvent(evt);
|
|
}
|
|
display() {
|
|
let { containerEl } = this;
|
|
containerEl.empty();
|
|
containerEl.createEl("h2", { text: i18n_default.settings.sectionAppearance });
|
|
new import_obsidian39.Setting(containerEl).setName(i18n_default.settings.sidebarTabs.name).setDesc(i18n_default.settings.sidebarTabs.desc).addToggle(
|
|
(toggle) => toggle.setValue(this.plugin.settings.sidebarTabs).onChange((value) => {
|
|
this.plugin.settings.sidebarTabs = value;
|
|
this.plugin.saveSettings();
|
|
document.body.classList.toggle("mk-hide-tabs", !value);
|
|
})
|
|
);
|
|
new import_obsidian39.Setting(containerEl).setName(i18n_default.settings.hideRibbon.name).setDesc(i18n_default.settings.hideRibbon.desc).addToggle(
|
|
(toggle) => toggle.setValue(this.plugin.settings.showRibbon).onChange((value) => {
|
|
this.plugin.settings.showRibbon = value;
|
|
this.plugin.saveSettings();
|
|
document.body.classList.toggle("mk-hide-ribbon", !value);
|
|
})
|
|
);
|
|
new import_obsidian39.Setting(containerEl).setName(i18n_default.settings.compactMode.name).setDesc(i18n_default.settings.compactMode.desc).addToggle(
|
|
(toggle) => toggle.setValue(this.plugin.settings.spacesCompactMode).onChange((value) => {
|
|
this.plugin.settings.spacesCompactMode = value;
|
|
this.plugin.detachFileTreeLeafs();
|
|
this.plugin.saveSettings();
|
|
})
|
|
);
|
|
containerEl.createEl("h2", { text: i18n_default.settings.sectionSidebar });
|
|
new import_obsidian39.Setting(containerEl).setName(i18n_default.settings.spaces.name).setDesc(i18n_default.settings.spaces.desc).addToggle(
|
|
(toggle) => toggle.setValue(this.plugin.settings.spacesEnabled).onChange((value) => {
|
|
this.plugin.settings.spacesEnabled = value;
|
|
this.plugin.saveSettings();
|
|
if (value) {
|
|
this.plugin.openFileTreeLeaf(true);
|
|
} else {
|
|
this.plugin.detachFileTreeLeafs();
|
|
}
|
|
this.refreshView();
|
|
})
|
|
);
|
|
new import_obsidian39.Setting(containerEl).setName(i18n_default.settings.spacesStickers.name).setDesc(i18n_default.settings.spacesStickers.desc).addToggle(
|
|
(toggle) => toggle.setValue(this.plugin.settings.spacesStickers).onChange((value) => {
|
|
this.plugin.settings.spacesStickers = value;
|
|
this.plugin.saveSettings();
|
|
this.refreshView();
|
|
})
|
|
);
|
|
new import_obsidian39.Setting(containerEl).setName(i18n_default.settings.folderNote.name).setDesc(i18n_default.settings.folderNote.desc).addToggle(
|
|
(toggle) => toggle.setValue(this.plugin.settings.enableFolderNote).onChange((value) => {
|
|
this.plugin.settings.enableFolderNote = value;
|
|
this.plugin.saveSettings();
|
|
})
|
|
);
|
|
new import_obsidian39.Setting(containerEl).setName(i18n_default.settings.activeFile.name).setDesc(i18n_default.settings.activeFile.desc).addToggle(
|
|
(toggle) => toggle.setValue(this.plugin.settings.revealActiveFile).onChange((value) => {
|
|
this.plugin.settings.revealActiveFile = value;
|
|
this.plugin.saveSettings();
|
|
})
|
|
);
|
|
containerEl.createEl("h2", { text: "Context" });
|
|
new import_obsidian39.Setting(containerEl).setName(i18n_default.settings.openFileContext.name).setDesc(i18n_default.settings.openFileContext.desc).addToggle(
|
|
(toggle) => toggle.setValue(this.plugin.settings.autoOpenFileContext).onChange((value) => {
|
|
this.plugin.settings.autoOpenFileContext = value;
|
|
this.plugin.saveSettings();
|
|
})
|
|
);
|
|
new import_obsidian39.Setting(containerEl).setName(i18n_default.settings.syncContextToFrontmatter.name).setDesc(i18n_default.settings.syncContextToFrontmatter.desc).addToggle(
|
|
(toggle) => toggle.setValue(this.plugin.settings.saveAllContextToFrontmatter).onChange((value) => {
|
|
this.plugin.settings.saveAllContextToFrontmatter = value;
|
|
this.plugin.saveSettings();
|
|
})
|
|
);
|
|
containerEl.createEl("h2", { text: i18n_default.settings.sectionFlow });
|
|
new import_obsidian39.Setting(containerEl).setName(i18n_default.settings.internalLinkFlowEditor.name).setDesc(i18n_default.settings.internalLinkFlowEditor.desc).addToggle(
|
|
(toggle) => toggle.setValue(this.plugin.settings.internalLinkClickFlow).onChange((value) => {
|
|
this.plugin.settings.internalLinkClickFlow = value;
|
|
this.plugin.saveSettings();
|
|
this.refreshView();
|
|
})
|
|
);
|
|
new import_obsidian39.Setting(containerEl).setName(i18n_default.settings.editorFlowReplace.name).setDesc(i18n_default.settings.editorFlowReplace.desc).addToggle(
|
|
(toggle) => toggle.setValue(this.plugin.settings.editorFlow).onChange((value) => {
|
|
this.plugin.settings.editorFlow = value;
|
|
this.plugin.saveSettings();
|
|
this.refreshView();
|
|
})
|
|
);
|
|
new import_obsidian39.Setting(containerEl).setName(i18n_default.settings.editorFlowStyle.name).setDesc(i18n_default.settings.editorFlowStyle.desc).addDropdown((dropdown) => {
|
|
dropdown.addOption("classic", i18n_default.settings.editorFlowStyle.classic);
|
|
dropdown.addOption("seamless", i18n_default.settings.editorFlowStyle.seamless);
|
|
dropdown.addOption("minimal", i18n_default.settings.editorFlowStyle.minimal);
|
|
dropdown.setValue(this.plugin.settings.editorFlowStyle).onChange(async (value) => {
|
|
this.plugin.settings.editorFlowStyle = value;
|
|
document.body.classList.toggle("mk-flow-classic", false);
|
|
document.body.classList.toggle("mk-flow-seamless", false);
|
|
document.body.classList.toggle("mk-flow-minimal", false);
|
|
if (value == "seamless")
|
|
document.body.classList.toggle("mk-flow-seamless", true);
|
|
if (value == "classic")
|
|
document.body.classList.toggle("mk-flow-classic", true);
|
|
if (value == "minimal")
|
|
document.body.classList.toggle("mk-flow-minimal", true);
|
|
});
|
|
});
|
|
containerEl.createEl("h2", { text: i18n_default.settings.sectionEditor });
|
|
new import_obsidian39.Setting(containerEl).setName(i18n_default.settings.editorMakerMode.name).setDesc(i18n_default.settings.editorMakerMode.desc).addToggle(
|
|
(toggle) => toggle.setValue(this.plugin.settings.makerMode).onChange((value) => {
|
|
this.plugin.settings.makerMode = value;
|
|
this.plugin.saveSettings();
|
|
this.refreshView();
|
|
})
|
|
);
|
|
new import_obsidian39.Setting(containerEl).setName(i18n_default.settings.makeChar.name).setDesc(i18n_default.settings.makeChar.desc).addText((text2) => {
|
|
text2.setValue(this.plugin.settings.menuTriggerChar).onChange(async (value) => {
|
|
if (value.trim().length < 1) {
|
|
text2.setValue(this.plugin.settings.menuTriggerChar);
|
|
return;
|
|
}
|
|
let char = value[0];
|
|
if (value.trim().length === 2) {
|
|
char = value.replace(this.plugin.settings.menuTriggerChar, "");
|
|
}
|
|
text2.setValue(char);
|
|
this.plugin.settings.menuTriggerChar = char;
|
|
await this.plugin.saveSettings();
|
|
});
|
|
});
|
|
new import_obsidian39.Setting(containerEl).setName(i18n_default.settings.editorMakePlacholder.name).setDesc(i18n_default.settings.editorMakePlacholder.desc).addToggle(
|
|
(toggle) => toggle.setValue(this.plugin.settings.makeMenuPlaceholder).onChange((value) => {
|
|
this.plugin.settings.makeMenuPlaceholder = value;
|
|
this.plugin.saveSettings();
|
|
this.refreshView();
|
|
})
|
|
);
|
|
new import_obsidian39.Setting(containerEl).setName(i18n_default.settings.mobileMakeBar.name).setDesc(i18n_default.settings.mobileMakeBar.desc).addToggle(
|
|
(toggle) => toggle.setValue(this.plugin.settings.mobileMakeBar).onChange((value) => {
|
|
this.plugin.settings.mobileMakeBar = value;
|
|
this.plugin.saveSettings();
|
|
this.refreshView();
|
|
})
|
|
);
|
|
new import_obsidian39.Setting(containerEl).setName(i18n_default.settings.inlineStyler.name).setDesc(i18n_default.settings.inlineStyler.desc).addToggle(
|
|
(toggle) => toggle.setValue(this.plugin.settings.inlineStyler).onChange((value) => {
|
|
this.plugin.settings.inlineStyler = value;
|
|
this.plugin.saveSettings();
|
|
this.refreshView();
|
|
})
|
|
);
|
|
containerEl.createEl("h2", { text: i18n_default.settings.sectionAdvanced });
|
|
new import_obsidian39.Setting(containerEl).setName(i18n_default.settings.spacesFileExplorerDual.name).setDesc(i18n_default.settings.spacesFileExplorerDual.desc).addToggle(
|
|
(toggle) => toggle.setValue(this.plugin.settings.spacesDisablePatch).onChange((value) => {
|
|
this.plugin.settings.spacesDisablePatch = value;
|
|
this.plugin.saveSettings();
|
|
})
|
|
);
|
|
new import_obsidian39.Setting(containerEl).setName(i18n_default.settings.folderNoteLocation.name).setDesc(i18n_default.settings.folderNoteLocation.desc).addToggle(
|
|
(toggle) => toggle.setValue(this.plugin.settings.folderNoteInsideFolder).onChange((value) => {
|
|
this.plugin.settings.folderNoteInsideFolder = value;
|
|
this.plugin.saveSettings();
|
|
})
|
|
);
|
|
new import_obsidian39.Setting(containerEl).setName(i18n_default.settings.spacesPerformance.name).setDesc(i18n_default.settings.spacesPerformance.desc).addToggle(
|
|
(toggle) => toggle.setValue(this.plugin.settings.spacesPerformance).onChange((value) => {
|
|
this.plugin.settings.spacesPerformance = value;
|
|
this.plugin.saveSettings();
|
|
})
|
|
);
|
|
new import_obsidian39.Setting(containerEl).setName(i18n_default.settings.spacesDeleteOption.name).setDesc(i18n_default.settings.spacesDeleteOption.desc).addDropdown((dropdown) => {
|
|
dropdown.addOption(
|
|
"permanent",
|
|
i18n_default.settings.spacesDeleteOptions.permanant
|
|
);
|
|
dropdown.addOption("trash", i18n_default.settings.spacesDeleteOptions.trash);
|
|
dropdown.addOption(
|
|
"system-trash",
|
|
i18n_default.settings.spacesDeleteOptions["system-trash"]
|
|
);
|
|
dropdown.setValue(this.plugin.settings.deleteFileOption);
|
|
dropdown.onChange((option) => {
|
|
this.plugin.settings.deleteFileOption = option;
|
|
this.plugin.saveSettings();
|
|
});
|
|
});
|
|
new import_obsidian39.Setting(containerEl).setName(i18n_default.settings.inlineStylerColor.name).setDesc(i18n_default.settings.inlineStylerColor.desc).addToggle(
|
|
(toggle) => toggle.setValue(this.plugin.settings.inlineStylerColors).onChange((value) => {
|
|
this.plugin.settings.inlineStylerColors = value;
|
|
this.plugin.saveSettings();
|
|
this.refreshView();
|
|
})
|
|
);
|
|
}
|
|
};
|
|
|
|
// src/components/Blink/Blink.tsx
|
|
var import_obsidian40 = require("obsidian");
|
|
|
|
// src/components/Blink/BlinkComponent.tsx
|
|
var BlinkComponent = bn.forwardRef(
|
|
(props2, ref) => {
|
|
const [previewPath, setPreviewPath] = p2(null);
|
|
const [allItems, setAllItems] = p2([]);
|
|
const defaultOptions3 = F(
|
|
() => app.workspace.getLastOpenFiles().filter((f4) => getAbstractFileAtPath(app, f4)).map((f4) => ({
|
|
description: f4,
|
|
value: f4,
|
|
name: filePathToString(f4)
|
|
})),
|
|
[]
|
|
);
|
|
h2(() => {
|
|
const allTags = loadTags(props2.plugin).map((f4) => ({
|
|
value: f4,
|
|
name: f4
|
|
}));
|
|
const allNotes = getAllAbstractFilesInVault(
|
|
props2.plugin,
|
|
app
|
|
).map((f4) => ({
|
|
name: fileNameToString(f4.name),
|
|
description: f4.path,
|
|
value: f4.path
|
|
}));
|
|
setAllItems([...allNotes, ...allTags]);
|
|
}, []);
|
|
const loadPreview = (path) => {
|
|
if (previewPath != path && getAbstractFileAtPath(app, path)) {
|
|
setPreviewPath(path);
|
|
}
|
|
};
|
|
const hoverItem = (item) => {
|
|
loadPreview(item);
|
|
};
|
|
const selectItem = (item) => {
|
|
if (!item)
|
|
return;
|
|
const type = viewTypeByString(item);
|
|
if (type == "file" || type == "folder") {
|
|
openAFile(getAbstractFileAtPath(app, item), props2.plugin, false);
|
|
return;
|
|
}
|
|
if (type == "tag") {
|
|
openTag(item, props2.plugin, false);
|
|
return;
|
|
}
|
|
createNewMarkdownFile(
|
|
props2.plugin,
|
|
defaultNoteFolder(props2.plugin, null),
|
|
item
|
|
);
|
|
};
|
|
const optionProps = {
|
|
multi: false,
|
|
editable: true,
|
|
onHover: hoverItem,
|
|
value: [],
|
|
options: allItems,
|
|
defaultOptions: defaultOptions3,
|
|
saveOptions: (_5, items) => selectItem(items[0]),
|
|
placeholder: i18n_default.labels.blinkPlaceholder,
|
|
searchable: true,
|
|
showAll: true
|
|
};
|
|
return /* @__PURE__ */ bn.createElement(bn.Fragment, null, /* @__PURE__ */ bn.createElement(SelectMenu, {
|
|
ref,
|
|
...optionProps,
|
|
hide: props2.hide,
|
|
previewComponent: previewPath && /* @__PURE__ */ bn.createElement("div", {
|
|
className: "mk-blink-preview"
|
|
}, /* @__PURE__ */ bn.createElement(FlowView, {
|
|
plugin: props2.plugin,
|
|
path: previewPath,
|
|
load: true
|
|
}))
|
|
}));
|
|
}
|
|
);
|
|
|
|
// src/components/Blink/Blink.tsx
|
|
var Blink = class extends import_obsidian40.Modal {
|
|
constructor(app2, plugin) {
|
|
super(app2);
|
|
this.ref = bn.createRef();
|
|
this.plugin = plugin;
|
|
this.modalEl.toggleClass("mk-blink-modal", true);
|
|
this.modalEl.toggleClass("modal", false);
|
|
this.modalEl.toggleClass("prompt", true);
|
|
const keys = [...this.scope.keys];
|
|
for (let i4 = 0; i4 < keys.length; i4++) {
|
|
if (keys[i4].key == "Escape") {
|
|
this.scope.unregister(keys[i4]);
|
|
this.scope.register([], "Escape", () => {
|
|
var _a2;
|
|
const blurred = (_a2 = this.ref) == null ? void 0 : _a2.current();
|
|
if (blurred) {
|
|
this.close();
|
|
}
|
|
});
|
|
}
|
|
}
|
|
this.root = createRoot(this.modalEl);
|
|
this.root.render(
|
|
/* @__PURE__ */ bn.createElement(BlinkComponent, {
|
|
ref: this.ref,
|
|
plugin,
|
|
hide: () => this.close()
|
|
})
|
|
);
|
|
}
|
|
};
|
|
|
|
// src/components/ContextView/MDBFileViewer.tsx
|
|
var import_obsidian41 = require("obsidian");
|
|
var MDB_FILE_VIEWER_TYPE = "make-mdb-viewer";
|
|
var MDBFileViewer = class extends import_obsidian41.FileView {
|
|
constructor(leaf, plugin) {
|
|
super(leaf);
|
|
this.navigation = true;
|
|
this.plugin = plugin;
|
|
}
|
|
getViewType() {
|
|
return MDB_FILE_VIEWER_TYPE;
|
|
}
|
|
getDisplayText() {
|
|
var _a2;
|
|
return (_a2 = this.file) == null ? void 0 : _a2.name;
|
|
}
|
|
async onClose() {
|
|
this.destroy();
|
|
}
|
|
destroy() {
|
|
if (this.root)
|
|
this.root.unmount();
|
|
}
|
|
async onOpen() {
|
|
this.destroy();
|
|
}
|
|
async setState(state, result) {
|
|
this.file = getAbstractFileAtPath(app, state.file);
|
|
this.constructInlineContext();
|
|
await super.setState(state, result);
|
|
this.leaf.tabHeaderInnerTitleEl.innerText = this.file.name;
|
|
this.leaf.view.titleEl = this.file.name;
|
|
const headerEl = this.leaf.view.headerEl;
|
|
if (headerEl) {
|
|
headerEl.querySelector(".view-header-title").innerText = this.file.name;
|
|
}
|
|
return;
|
|
}
|
|
getState() {
|
|
let state = super.getState();
|
|
state.file = this.file.path;
|
|
return state;
|
|
}
|
|
constructInlineContext() {
|
|
const mdbTypeByDBPath = (dbpath) => {
|
|
var _a2;
|
|
return dbpath.endsWith(((_a2 = this.plugin) == null ? void 0 : _a2.settings.folderContextFile) + ".mdb") ? "folder" : "tag";
|
|
};
|
|
const type = mdbTypeByDBPath(this.file.path);
|
|
const folder = type == "tag" ? null : getFolderFromPath(app, this.file.path);
|
|
const tag = type == "tag" ? filePathToString(this.file.path).replace(".mdb", "") : null;
|
|
this.destroy();
|
|
this.root = createRoot(this.contentEl);
|
|
this.root.render(
|
|
/* @__PURE__ */ bn.createElement("div", {
|
|
className: "mk-folder-view"
|
|
}, tag ? /* @__PURE__ */ bn.createElement(TagContextViewComponent, {
|
|
type: "tag",
|
|
tag,
|
|
plugin: this.plugin
|
|
}) : /* @__PURE__ */ bn.createElement(FolderContextViewComponent, {
|
|
type: "folder",
|
|
folder,
|
|
plugin: this.plugin
|
|
}))
|
|
);
|
|
}
|
|
};
|
|
|
|
// src/components/FileContextView/FileContextView.tsx
|
|
var import_obsidian43 = require("obsidian");
|
|
|
|
// src/components/FileContextView/FileContextList.tsx
|
|
var import_lodash7 = __toESM(require_lodash());
|
|
var import_obsidian42 = require("obsidian");
|
|
var FileContextList = (props2) => {
|
|
const { path } = props2;
|
|
const {
|
|
tableData,
|
|
newColumn,
|
|
cols,
|
|
tagContexts,
|
|
contextTable,
|
|
folderPath,
|
|
isFolderContext,
|
|
saveColumn,
|
|
hideColumn,
|
|
delColumn,
|
|
sortColumn,
|
|
updateFieldValue,
|
|
updateValue,
|
|
loadContextFields,
|
|
predicate
|
|
} = q2(MDBContext);
|
|
const [collapsed, setCollapsed] = p2(true);
|
|
const fileContext = F(() => {
|
|
const td = tableData ? {
|
|
folder: {
|
|
cols: tableData.cols.filter(
|
|
(f4) => f4.name != "File" && f4.type != "fileprop" && f4.hidden != "true" && f4.type != "preview"
|
|
),
|
|
data: tableData.rows.find((r3) => r3.File == path),
|
|
dataIndex: tableData.rows.findIndex((r3) => r3.File == path)
|
|
}
|
|
} : {};
|
|
const tags = tagContexts.reduce(
|
|
(p3, c4) => contextTable[c4] ? {
|
|
...p3,
|
|
[c4]: {
|
|
cols: contextTable[c4].cols.filter(
|
|
(f4) => f4.name != "File" && f4.type != "fileprop" && f4.hidden != "true" && f4.type != "preview"
|
|
),
|
|
data: contextTable[c4].rows.find(
|
|
(r3, index) => index == parseInt(props2.path)
|
|
),
|
|
dataIndex: contextTable[c4].rows.findIndex(
|
|
(r3) => r3.File == path
|
|
)
|
|
}
|
|
} : p3,
|
|
{}
|
|
);
|
|
return {
|
|
...tags,
|
|
...td
|
|
};
|
|
}, [tableData, contextTable, tagContexts, path]);
|
|
const showNewMenu = (e4) => {
|
|
const offset = e4.target.getBoundingClientRect();
|
|
const files = [path].map((f4) => getAbstractFileAtPath(app, f4)).filter((f4) => f4 instanceof import_obsidian42.TFile);
|
|
const types = guestimateTypes(
|
|
files.map((f4) => f4.path),
|
|
props2.plugin,
|
|
false
|
|
);
|
|
const fmFields = files.reduce((p3, c4) => {
|
|
const fm = frontMatterForFile(c4);
|
|
const fmKeys = uniqCaseInsensitive(frontMatterKeys(fm));
|
|
return (0, import_lodash7.uniq)([...p3, ...fmKeys]);
|
|
}, []).filter((f4) => !tableData.cols.some((g4) => g4.name == f4));
|
|
const allTypes = [
|
|
...fmFields.map((f4) => ({
|
|
name: f4,
|
|
description: i18n_default.labels.syncFrontmatterProperty,
|
|
value: "fm." + f4 + "." + yamlTypeToMDBType(types[f4])
|
|
})),
|
|
...fieldTypes.filter((f4) => f4.restricted != true).map((f4) => ({
|
|
name: f4.label,
|
|
description: i18n_default.labels.newProperty,
|
|
value: "type." + f4.type
|
|
}))
|
|
];
|
|
const uniqueNameFromString2 = (name, cols2) => {
|
|
let newName = name;
|
|
if (cols2.includes(newName)) {
|
|
let append = 1;
|
|
while (cols2.includes(newName)) {
|
|
newName = name + append.toString();
|
|
append += 1;
|
|
}
|
|
}
|
|
return newName;
|
|
};
|
|
const saveOptions = (_5, values) => {
|
|
const newValue = values[0];
|
|
const newType = newValue.split(".");
|
|
if (newType[0] == "fm") {
|
|
newColumn({
|
|
name: uniqueNameFromString2(
|
|
newType[1],
|
|
tableData.cols.map((f4) => f4.name)
|
|
),
|
|
schemaId: tableData.schema.id,
|
|
table: "",
|
|
type: newType[2]
|
|
});
|
|
} else if (newType[0] == "type") {
|
|
newColumn({
|
|
name: uniqueNameFromString2(
|
|
newType[1],
|
|
tableData.cols.map((f4) => f4.name)
|
|
),
|
|
schemaId: tableData.schema.id,
|
|
table: "",
|
|
type: newType[1]
|
|
});
|
|
}
|
|
};
|
|
showSelectMenu(
|
|
{ x: offset.left, y: offset.top + 30 },
|
|
{
|
|
multi: false,
|
|
editable: false,
|
|
value: [],
|
|
saveOptions,
|
|
placeholder: i18n_default.labels.propertyItemSelectPlaceholder,
|
|
searchable: true,
|
|
options: allTypes,
|
|
showAll: true
|
|
}
|
|
);
|
|
};
|
|
const saveField = (field, oldField) => {
|
|
if (field.name.length > 0) {
|
|
if (field.name != oldField.name || field.type != oldField.type || field.value != oldField.value || field.attrs != oldField.attrs) {
|
|
const saveResult = saveColumn(field, oldField);
|
|
}
|
|
}
|
|
};
|
|
const saveContext = (field, oldField, value) => {
|
|
const newContext = tagFromString(value[0]);
|
|
initiateContextIfNotExists(props2.plugin, newContext).then((f4) => {
|
|
if (f4) {
|
|
return insertContextItems(
|
|
props2.plugin,
|
|
optionValuesForColumn(
|
|
field.name,
|
|
field.table == "" ? tableData : contextTable[field.table]
|
|
),
|
|
newContext
|
|
);
|
|
}
|
|
}).then((f4) => loadContextFields(newContext));
|
|
const newField = {
|
|
...field,
|
|
value: newContext != null ? newContext : ""
|
|
};
|
|
saveColumn(newField, oldField);
|
|
};
|
|
const showMenu = (e4, field) => {
|
|
const offset = e4.target.getBoundingClientRect();
|
|
const options = optionValuesForColumn(
|
|
field.name,
|
|
field.table == "" ? tableData : contextTable[field.table]
|
|
);
|
|
showPropertyMenu(props2.plugin, { x: offset.left, y: offset.top + 30 }, true, options, field, cols, contextTable, (newField) => saveField(newField, field), (newField, val) => saveContext(newField, field, val), hideColumn, delColumn, sortColumn, predicate.colsHidden.includes(field.name + field.table));
|
|
};
|
|
return /* @__PURE__ */ bn.createElement(bn.Fragment, null, fileContext.folder && fileContext.folder.data && /* @__PURE__ */ bn.createElement("div", {
|
|
className: "mk-file-context-section"
|
|
}, /* @__PURE__ */ bn.createElement("div", {
|
|
className: "mk-file-context-title",
|
|
onClick: (e4) => {
|
|
setCollapsed(!collapsed);
|
|
e4.stopPropagation();
|
|
}
|
|
}, /* @__PURE__ */ bn.createElement("button", {
|
|
className: `mk-collapse mk-inline-button mk-icon-xsmall ${collapsed ? "mk-collapsed" : ""}`,
|
|
dangerouslySetInnerHTML: {
|
|
__html: uiIconSet["mk-ui-collapse"]
|
|
}
|
|
}), isFolderContext ? folderPathToString(folderPath) : folderPath), !collapsed ? /* @__PURE__ */ bn.createElement(bn.Fragment, null, fileContext.folder.cols.map((f4, i4) => /* @__PURE__ */ bn.createElement("div", {
|
|
key: i4,
|
|
className: "mk-file-context-row"
|
|
}, /* @__PURE__ */ bn.createElement("div", {
|
|
className: "mk-bullet"
|
|
}), /* @__PURE__ */ bn.createElement("div", {
|
|
className: "mk-file-context-field",
|
|
onClick: (e4) => showMenu(e4, { ...f4, table: "" })
|
|
}, f4.name), /* @__PURE__ */ bn.createElement("div", {
|
|
className: "mk-file-context-value"
|
|
}, /* @__PURE__ */ bn.createElement(DataTypeView, {
|
|
plugin: props2.plugin,
|
|
initialValue: fileContext.folder.data[f4.name],
|
|
index: fileContext.folder.dataIndex,
|
|
file: fileContext.folder.data["File"],
|
|
column: { ...f4, table: "" },
|
|
editable: true,
|
|
updateValue: (v3) => updateValue(f4.name, v3, "", fileContext.folder.dataIndex, fileContext.folder.data["File"]),
|
|
updateFieldValue: (fv, v3) => updateFieldValue(f4.name, fv, v3, "", fileContext.folder.dataIndex, fileContext.folder.data["File"]),
|
|
contextTable
|
|
})))), /* @__PURE__ */ bn.createElement("div", {
|
|
className: "mk-file-context-field-new",
|
|
onClick: (e4) => showNewMenu(e4)
|
|
}, /* @__PURE__ */ bn.createElement("span", null, "+"), i18n_default.labels.newProperty)) : /* @__PURE__ */ bn.createElement(bn.Fragment, null)));
|
|
};
|
|
|
|
// src/components/FileContextView/FileContextView.tsx
|
|
var import_obsidian44 = require("obsidian");
|
|
|
|
// src/components/FileContextView/Backlinks.tsx
|
|
var BacklinkItem = (props2) => {
|
|
const file = F(() => getAbstractFileAtPath(app, props2.path), [props2.path]);
|
|
const [block, setBlock] = p2([null, null]);
|
|
h2(() => {
|
|
var _a2, _b2;
|
|
const fCache = app.metadataCache.getCache(props2.path);
|
|
const link = [...(_a2 = fCache.links) != null ? _a2 : [], ...(_b2 = fCache.embeds) != null ? _b2 : []].find((f4) => props2.source.includes(f4.displayText));
|
|
if (link) {
|
|
const block2 = fCache.sections.find((f4) => f4.position.start.offset <= link.position.start.offset && f4.position.end.offset >= link.position.end.offset);
|
|
setBlock([Math.max(1, block2.position.start.line), Math.max(block2.position.start.line + 1, block2.position.end.line + 1)]);
|
|
}
|
|
}, [props2.path]);
|
|
const [collapsed, setCollapsed] = p2(false);
|
|
return /* @__PURE__ */ bn.createElement("div", {
|
|
className: "mk-file-context-section"
|
|
}, /* @__PURE__ */ bn.createElement("div", {
|
|
className: "mk-file-context-title",
|
|
onClick: (e4) => {
|
|
setCollapsed(!collapsed);
|
|
e4.stopPropagation();
|
|
}
|
|
}, /* @__PURE__ */ bn.createElement("button", {
|
|
className: `mk-collapse mk-inline-button mk-icon-xsmall ${collapsed ? "mk-collapsed" : ""}`,
|
|
dangerouslySetInnerHTML: {
|
|
__html: uiIconSet["mk-ui-collapse"]
|
|
}
|
|
}), file.name), !collapsed ? /* @__PURE__ */ bn.createElement("div", {
|
|
className: "mk-file-context-backlink"
|
|
}, /* @__PURE__ */ bn.createElement(FlowView, {
|
|
plugin: props2.plugin,
|
|
load: true,
|
|
path: props2.path,
|
|
from: block[0],
|
|
to: block[1]
|
|
})) : /* @__PURE__ */ bn.createElement(bn.Fragment, null));
|
|
};
|
|
var Backlinks = (props2) => {
|
|
const [backlinks, setBacklinks] = p2([]);
|
|
h2(() => {
|
|
if (!props2.path)
|
|
return;
|
|
setBacklinks(
|
|
Object.keys(app.metadataCache.resolvedLinks).filter(
|
|
(f4) => props2.path in app.metadataCache.resolvedLinks[f4]
|
|
)
|
|
);
|
|
}, [props2.path]);
|
|
return /* @__PURE__ */ bn.createElement("div", null, backlinks.map((f4) => /* @__PURE__ */ bn.createElement(BacklinkItem, {
|
|
path: f4,
|
|
plugin: props2.plugin,
|
|
source: props2.path
|
|
})));
|
|
};
|
|
|
|
// src/components/FileContextView/FrontmatterView.tsx
|
|
var FrontmatterView = (props2) => {
|
|
const { path } = props2;
|
|
const [values, setValues] = p2({});
|
|
const [cols, setCols] = p2([]);
|
|
const { cols: columns, dbPath } = q2(MDBContext);
|
|
const refreshData = () => {
|
|
let newCols = [];
|
|
let newValues = {};
|
|
const types = guestimateTypes([path], props2.plugin, false);
|
|
const fm = frontMatterForFile(getAbstractFileAtPath(app, path));
|
|
const fmKeys = uniqCaseInsensitive(frontMatterKeys(fm)).filter((f4) => !columns.some((g4) => g4.name == f4));
|
|
const cols2 = fmKeys.map((f4) => ({
|
|
table: "",
|
|
name: f4,
|
|
schemaId: "",
|
|
type: yamlTypeToMDBType(types[f4])
|
|
}));
|
|
if (fm) {
|
|
newCols.push(...cols2);
|
|
Object.keys(fm).forEach((c4) => {
|
|
newValues[c4] = parseFrontMatter(c4, fm[c4], false);
|
|
});
|
|
}
|
|
if (props2.plugin.dataViewAPI()) {
|
|
const types2 = guestimateTypes([path], props2.plugin, true);
|
|
const fm2 = frontMatterForFile(getAbstractFileAtPath(app, path));
|
|
const fmKeys2 = uniqCaseInsensitive(frontMatterKeys(fm2));
|
|
const dvValues = props2.plugin.dataViewAPI().page(path);
|
|
const dvKeys = uniqCaseInsensitive(
|
|
Object.keys(dvValues != null ? dvValues : {}).filter(
|
|
(f4, i4, self2) => !self2.find(
|
|
(g4, j4) => g4.toLowerCase().replace(/\s/g, "-") == f4.toLowerCase().replace(/\s/g, "-") && i4 > j4
|
|
) ? true : false
|
|
).filter((f4) => f4 != "file").filter((f4) => !fmKeys2.includes(f4)).filter((f4) => !columns.some((g4) => g4.name == f4))
|
|
);
|
|
const dvCols = dvKeys.map((f4) => ({
|
|
table: "",
|
|
name: f4,
|
|
schemaId: "",
|
|
type: yamlTypeToMDBType(types2[f4])
|
|
}));
|
|
const dv = dvKeys.reduce(
|
|
(p3, c4) => ({
|
|
...p3,
|
|
[c4]: parseFrontMatter(c4, dvValues[c4], true)
|
|
}),
|
|
{}
|
|
);
|
|
newCols.push(...dvCols);
|
|
Object.keys(dv).forEach((c4) => {
|
|
newValues[c4] = parseFrontMatter(c4, dvValues[c4], true);
|
|
});
|
|
}
|
|
setCols(newCols);
|
|
setValues(newValues);
|
|
};
|
|
h2(() => {
|
|
refreshData();
|
|
}, [path, columns]);
|
|
const refreshDV = (evt) => {
|
|
if (evt.detail.file.path == path) {
|
|
refreshData();
|
|
}
|
|
};
|
|
const [collapsed, setCollapsed] = p2(true);
|
|
h2(() => {
|
|
window.addEventListener(eventTypes.tagsChange, refreshDV);
|
|
return () => {
|
|
window.removeEventListener(eventTypes.tagsChange, refreshDV);
|
|
};
|
|
}, [path, columns]);
|
|
const saveFMValue = (value, f4) => {
|
|
saveFrontmatterValue(props2.plugin, path, f4.name, value, f4.type);
|
|
};
|
|
return cols.length > 0 ? /* @__PURE__ */ bn.createElement(bn.Fragment, null, /* @__PURE__ */ bn.createElement("div", {
|
|
className: "mk-file-context-section"
|
|
}, /* @__PURE__ */ bn.createElement("div", {
|
|
className: "mk-file-context-title",
|
|
onClick: (e4) => {
|
|
setCollapsed(!collapsed);
|
|
e4.stopPropagation();
|
|
}
|
|
}, /* @__PURE__ */ bn.createElement("button", {
|
|
className: `mk-collapse mk-inline-button mk-icon-xsmall ${collapsed ? "mk-collapsed" : ""}`,
|
|
dangerouslySetInnerHTML: {
|
|
__html: uiIconSet["mk-ui-collapse"]
|
|
}
|
|
}), i18n_default.labels.metadata), !collapsed ? /* @__PURE__ */ bn.createElement(bn.Fragment, null, cols.map((f4, i4) => /* @__PURE__ */ bn.createElement("div", {
|
|
key: i4,
|
|
className: "mk-file-context-row"
|
|
}, /* @__PURE__ */ bn.createElement("div", {
|
|
className: "mk-bullet"
|
|
}), /* @__PURE__ */ bn.createElement("div", {
|
|
className: "mk-file-context-field",
|
|
"aria-label": f4.type
|
|
}, f4.name), /* @__PURE__ */ bn.createElement("div", {
|
|
className: "mk-file-context-value"
|
|
}, /* @__PURE__ */ bn.createElement(DataTypeView, {
|
|
plugin: props2.plugin,
|
|
initialValue: values[f4.name],
|
|
index: 0,
|
|
file: path,
|
|
column: { ...f4, table: "" },
|
|
editable: true,
|
|
updateValue: (value) => saveFMValue(value, f4),
|
|
updateFieldValue: (fieldValue, value) => saveFMValue(value, f4),
|
|
contextTable: {}
|
|
}))))) : /* @__PURE__ */ bn.createElement(bn.Fragment, null))) : /* @__PURE__ */ bn.createElement(bn.Fragment, null);
|
|
};
|
|
|
|
// src/components/FileContextView/FileContextView.tsx
|
|
var FILE_CONTEXT_VIEW_TYPE = "make-context-view";
|
|
var ICON2 = "component";
|
|
var VIEW_DISPLAY_TEXT2 = "Context Explorer";
|
|
var FileContextLeafView = class extends import_obsidian44.ItemView {
|
|
constructor(leaf, plugin) {
|
|
super(leaf);
|
|
this.navigation = false;
|
|
this.plugin = plugin;
|
|
}
|
|
getViewType() {
|
|
return FILE_CONTEXT_VIEW_TYPE;
|
|
}
|
|
getDisplayText() {
|
|
return VIEW_DISPLAY_TEXT2;
|
|
}
|
|
getIcon() {
|
|
return ICON2;
|
|
}
|
|
async onClose() {
|
|
this.destroy();
|
|
}
|
|
destroy() {
|
|
if (this.root)
|
|
this.root.unmount();
|
|
}
|
|
async onOpen() {
|
|
this.destroy();
|
|
this.constructFileContext();
|
|
}
|
|
async setState(state, result) {
|
|
this.constructFileContext();
|
|
await super.setState(state, result);
|
|
return;
|
|
}
|
|
getState() {
|
|
let state = super.getState();
|
|
return state;
|
|
}
|
|
constructFileContext() {
|
|
this.destroy();
|
|
this.root = createRoot(this.contentEl);
|
|
this.root.render(/* @__PURE__ */ bn.createElement(FileContextView, {
|
|
plugin: this.plugin
|
|
}));
|
|
}
|
|
};
|
|
var allTagsForFile = async (plugin, file) => {
|
|
var _a2, _b2, _c2, _d2, _e2, _f, _g, _h, _i, _j;
|
|
let rt = [];
|
|
const dbPath = folderContextFromFolder(plugin, file == null ? void 0 : file.parent.path);
|
|
const dbFileExists = getAbstractFileAtPath(app, dbPath);
|
|
if (dbFileExists) {
|
|
const folderDB = await getMDBTable(plugin, "files", dbPath, false);
|
|
if (folderDB) {
|
|
rt.push(...folderDB.schema.def.split("&").filter((f4) => f4.length > 0));
|
|
}
|
|
}
|
|
if (file instanceof import_obsidian43.TFile) {
|
|
const fCache = app.metadataCache.getCache(file.path);
|
|
if (fCache && fCache.tags)
|
|
rt.push(...(_b2 = (_a2 = fCache.tags) == null ? void 0 : _a2.map((f4) => f4.tag)) != null ? _b2 : []);
|
|
if (fCache && ((_c2 = fCache.frontmatter) == null ? void 0 : _c2.tags))
|
|
rt.push(
|
|
...(typeof ((_d2 = fCache.frontmatter) == null ? void 0 : _d2.tags) === "string" ? splitString(fCache.frontmatter.tags.replace(/ /g, "")) : Array.isArray((_e2 = fCache.frontmatter) == null ? void 0 : _e2.tags) ? (_f = fCache.frontmatter) == null ? void 0 : _f.tags : []).filter((f4) => typeof f4 === "string").map((f4) => "#" + f4)
|
|
);
|
|
if (fCache && ((_g = fCache.frontmatter) == null ? void 0 : _g.tag))
|
|
rt.push(
|
|
...(typeof ((_h = fCache.frontmatter) == null ? void 0 : _h.tag) === "string" ? splitString(fCache.frontmatter.tag.replace(/ /g, "")) : Array.isArray((_i = fCache.frontmatter) == null ? void 0 : _i.tag) ? (_j = fCache.frontmatter) == null ? void 0 : _j.tag : []).filter((f4) => typeof f4 === "string").map((f4) => "#" + f4)
|
|
);
|
|
}
|
|
return uniq(rt);
|
|
};
|
|
var FileContextView = (props2) => {
|
|
const [activeFilePath, setActiveFilePath] = p2(null);
|
|
const [selectedFilePath, setSelectedFilePath] = p2(null);
|
|
const path = F(
|
|
() => selectedFilePath != null ? selectedFilePath : activeFilePath,
|
|
[selectedFilePath, activeFilePath]
|
|
);
|
|
const file = F(() => {
|
|
const afile = getAbstractFileAtPath(app, path);
|
|
return afile;
|
|
}, [path]);
|
|
const folderNoteFile = F(() => {
|
|
if (file instanceof import_obsidian44.TFolder) {
|
|
const afile2 = getAbstractFileAtPath(app, path + ".md");
|
|
return afile2;
|
|
}
|
|
return file;
|
|
}, [file]);
|
|
const folderPath = file == null ? void 0 : file.parent.path;
|
|
const dbPath = folderContextFromFolder(props2.plugin, folderPath);
|
|
const [tags, setTags] = p2([]);
|
|
const [expandedSections, setExpandedSections] = p2({ context: true, backlinks: true });
|
|
h2(() => {
|
|
refreshTags();
|
|
}, [file]);
|
|
const contextExists = getAbstractFileAtPath(app, dbPath);
|
|
const changeActiveFile = (evt) => {
|
|
setActiveFilePath(evt.detail.filePath);
|
|
setSelectedFilePath(null);
|
|
};
|
|
const changeSelectedFile = (evt) => {
|
|
setSelectedFilePath(evt.detail.filePath);
|
|
};
|
|
const refreshTags = () => {
|
|
allTagsForFile(props2.plugin, file).then((t4) => setTags(t4));
|
|
};
|
|
h2(() => {
|
|
props2.plugin.activeFileChange();
|
|
}, []);
|
|
h2(() => {
|
|
window.addEventListener(eventTypes.activeFileChange, changeActiveFile);
|
|
window.addEventListener(eventTypes.selectedFileChange, changeSelectedFile);
|
|
window.addEventListener(eventTypes.tagsChange, refreshTags);
|
|
return () => {
|
|
window.removeEventListener(eventTypes.activeFileChange, changeActiveFile);
|
|
window.removeEventListener(
|
|
eventTypes.selectedFileChange,
|
|
changeSelectedFile
|
|
);
|
|
window.removeEventListener(eventTypes.tagsChange, refreshTags);
|
|
};
|
|
}, [file]);
|
|
const saveTag = (_5, values) => {
|
|
};
|
|
const showContextMenu = (e4) => {
|
|
const offset = e4.target.getBoundingClientRect();
|
|
const f4 = loadTags(props2.plugin);
|
|
showSelectMenu(
|
|
{ x: offset.left, y: offset.top + 30 },
|
|
{
|
|
multi: false,
|
|
editable: true,
|
|
value: [],
|
|
options: f4.map((m5) => ({ name: m5, value: m5 })),
|
|
saveOptions: saveTag,
|
|
placeholder: i18n_default.labels.contextItemSelectPlaceholder,
|
|
searchable: true,
|
|
showAll: true
|
|
}
|
|
);
|
|
};
|
|
return file ? /* @__PURE__ */ bn.createElement("div", {
|
|
className: "mk-file-context"
|
|
}, /* @__PURE__ */ bn.createElement("div", {
|
|
className: "mk-file-context-component"
|
|
}, /* @__PURE__ */ bn.createElement("div", {
|
|
className: "mk-file-context-file"
|
|
}, /* @__PURE__ */ bn.createElement(FileSticker, {
|
|
plugin: props2.plugin,
|
|
filePath: file.path
|
|
}), /* @__PURE__ */ bn.createElement("div", null, fileNameToString(file.name)))), /* @__PURE__ */ bn.createElement("div", {
|
|
onClick: (e4) => {
|
|
setExpandedSections((f4) => ({ ...f4, context: !f4["context"] }));
|
|
e4.stopPropagation();
|
|
},
|
|
className: "mk-section-title"
|
|
}, /* @__PURE__ */ bn.createElement("div", {
|
|
className: "mk-tree-text"
|
|
}, i18n_default.labels.context), /* @__PURE__ */ bn.createElement("button", {
|
|
className: `mk-collapse mk-inline-button ${!expandedSections["context"] ? "mk-collapsed" : ""}`,
|
|
dangerouslySetInnerHTML: { __html: uiIconSet["mk-ui-collapse-sm"] }
|
|
})), expandedSections["context"] && /* @__PURE__ */ bn.createElement("div", {
|
|
className: "mk-file-context-component"
|
|
}, tags.map((tag) => /* @__PURE__ */ bn.createElement(MDBProvider, {
|
|
plugin: props2.plugin,
|
|
dbPath: tagContextFromTag(props2.plugin, tag),
|
|
tag
|
|
}, /* @__PURE__ */ bn.createElement(FileContextList, {
|
|
plugin: props2.plugin,
|
|
path: file.path
|
|
}))), file && folderPath != "/" && /* @__PURE__ */ bn.createElement(MDBProvider, {
|
|
plugin: props2.plugin,
|
|
dbPath,
|
|
folder: folderPath
|
|
}, /* @__PURE__ */ bn.createElement(FileContextList, {
|
|
plugin: props2.plugin,
|
|
path: file.path
|
|
}), /* @__PURE__ */ bn.createElement(FrontmatterView, {
|
|
plugin: props2.plugin,
|
|
path: file.path
|
|
}))), folderNoteFile && /* @__PURE__ */ bn.createElement(bn.Fragment, null, /* @__PURE__ */ bn.createElement("div", {
|
|
onClick: (e4) => {
|
|
setExpandedSections((f4) => ({
|
|
...f4,
|
|
backlinks: !f4["backlinks"]
|
|
}));
|
|
e4.stopPropagation();
|
|
},
|
|
className: "mk-section-title"
|
|
}, /* @__PURE__ */ bn.createElement("div", {
|
|
className: "mk-tree-text"
|
|
}, i18n_default.labels.backlinks), /* @__PURE__ */ bn.createElement("button", {
|
|
className: `mk-collapse mk-inline-button ${!expandedSections["backlinks"] ? "mk-collapsed" : ""}`,
|
|
dangerouslySetInnerHTML: {
|
|
__html: uiIconSet["mk-ui-collapse-sm"]
|
|
}
|
|
})), expandedSections["backlinks"] && /* @__PURE__ */ bn.createElement("div", {
|
|
className: "mk-file-context-component"
|
|
}, /* @__PURE__ */ bn.createElement(Backlinks, {
|
|
plugin: props2.plugin,
|
|
path: folderNoteFile.path
|
|
})))) : /* @__PURE__ */ bn.createElement(bn.Fragment, null);
|
|
};
|
|
|
|
// wasm-binary:/Users/cen/Documents/GitHub/make-md/src/utils/db/sqljs/sql-wasm.wasm
|
|
var sql_wasm_exports = {};
|
|
__export(sql_wasm_exports, {
|
|
default: () => sql_wasm_default
|
|
});
|
|
var sql_wasm_default = __toBinary("AGFzbQEAAAABrQRHYAJ/fwF/YAF/AX9gA39/fwBgAX8AYAN/f38Bf2ACf38AYAR/f39/AX9gBX9/f39/AX9gBH9/f38AYAZ/f39/f38Bf2AFf39/f38AYAJ/fgF/YAR/f39+AX9gBn9/f39/fwBgB39/f39/f38Bf2AAAX9gAXwBfGABfgF/YAJ/fgBgA39/fgF/YAJ/fwF+YAAAYAF/AX5gBH9+f38Bf2AHf39/f39/fwBgCX9/f39/f39/fwF/YAh/f39/f39/fwF/YAN/fn8Bf2ACf3wAYAV/fn5+fgBgCX9/f39/f39/fwBgBX9/f39+AGAFf39+f38Bf2ADf39+AGADf35/AGADf35+AX9gAAF8YAF/AXxgBH9+fn8AYAh/f39/f39/fwBgBH5+fn4Bf2ALf39/f39/f39/f38AYAN8fH8BfGACfHwBfGAEf39+fwBgBn9/f35/fwF/YAF+AX5gBX9+f39/AX9gAn9+AX5gBn9/f39/fgF/YAR/f39/AX5gAn5+AXxgCH9+fn9/f39/AX9gAn58AX9gC39/f39/f39/f39/AX9gAnx/AXxgAXwBf2ACfH8Bf2AHf39/f35/fwF+YAl/fn9+fn5+f38Bf2AEf39/fgBgAnx+AX9gCn9/f39/f39/f38Bf2ADf398AX9gB39/f39/fHwAYAF8AX5gBX9+fn5/AX9gCH9/fn5+f39/AX9gBH9+f38AYA1/f39/f39/f39/f39/AGACf38BfALNASIBYQFhAAgBYQFiAAQBYQFjAAEBYQFkACQBYQFlACQBYQFmAAEBYQFnAAQBYQFoAAABYQFpAAABYQFqAAUBYQFrAAcBYQFsAAQBYQFtAAABYQFuAAIBYQFvAAYBYQFwAAQBYQFxAA8BYQFyAAYBYQFzAAEBYQF0AAYBYQF1AAYBYQF2AAYBYQF3AAkBYQF4AAkBYQF5AAQBYQF6AAABYQFBAAABYQFCAAABYQFDAAEBYQFEAAYBYQFFAAABYQFGAAABYQFHAAABYQFIAAYDkw+RDwYDBwQCBQQBBQEEAQUBAAEBDgUGBAkFBQEEBAECCAULAQECBQEABAMAEQMAAAMlBAYABgALARMDAAAcAQUWAQcDEgIABQMGAQAGAgILCAQEAQAABBEBCAYMAAQAAgEFBQwFAQQAAAIKAwQCCwEAEgUBAgMABAAB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CEUgAXINACAFKAKQAiAFIAUoAhAgA2ooAgAgBCAIEQYAIQELIAJBAWohAgwBCwsgACABNgIkQQFB5QAgARshAgwBCyABIQIgACwAlAFBAE4NACAAEOMGIQILIAUgAjYCQCAAKAIAIAAoAiQQogFBB0cNACAAQQc2AiQgAkEHIAAsAJQBQQBOGyECCyAFKAJIIAJxCyIBQRFHDQEgFUEyRgRAQREPCyAAKAIgIQUjAEEQayIDJAAgABDnCSEBAkAgACgCACICIAFBfyAALQCUASAAIANBDGpBABDJBCIIBEAgCEEHRw0BIAIQTwwBCyADKAIMIQQjAEHwAWsiASQAIAEgBEHwARAlIQkgBCAAQfABECUhAiAAIAlB8AEQJSEBIAIoAgghByACIAEoAgg2AgggASAHNgIIIAIoAgQhByACIAEoAgQ2AgQgASAHNgIEIAIoAsQBIQcgAiABKALEATYCxAEgASAHNgLEASACKALIASEHIAIgASgCyAE2AsgBIAEgBzYCyAEgASACKALgATYC4AEgASACLQCUAToAlAEgAUGgAWogAkGgAWpBJBAlGiABIAEoArQBQQFqNgK0ASAJQfABaiQAQQAhAQNAIAQuARAgAUoEQCABQShsIgIgACgCZGogBCgCZCACahDdCSABQQFqIQEMAQsLIARBADYCJCAEEJgCGgsgA0EQaiQAAkAgCARAIAwoAqACECshASAMIAAoAnwQJyAMLQBXDQEgACAMIAEQWjYCfCAAIAwgCBCiASIANgIkIAAPCyAVQQFqIRUgABA6GiAFQQBIDQEgAEH+AToAkwEMAQsLQQchASAAQQc2AiQgAEEANgJ8CyABC2MBAn8gACgCECIDIAJqIgQgACgCCE8EQCAAIAIQtwYiAkEASgRAIAAoAgQgACgCEGogASACECUaIAAgACgCECACajYCEAsPCyACBEAgACAENgIQIAAoAgQgA2ogASACECUaCwspACAAIAFBCHRBgID8B3EgAUEYdHIgAUEIdkGA/gNxIAFBGHZycjYAAAs9AQF/IAAtABMiAUUEQCAAIAAoAixBAWoiADYCLCAADwsgACABQQFrIgE6ABMgACABQf8BcUECdGooApgBC3EBAX8gACgCCCICLgEQQQBOBEACfyAAKAIIIQIgAUEATARAIAIQYiACQQA2AghBAAwBCyAC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ACgCWCABKAIIQShsaiIALQARQZABcQRAIAAQYiAAQQQ7ARAgAA8LIABBBDsBECAAC3ABA38jAEEQayIEJABB7PUDKAIABEAgBCACNgIMIwBB8AFrIgMkACADQdgBaiIFQQAgA0HSAUEAEJoBIAUgASACELsDQez1AygCACEBQfD1AygCACAAIAUQxQEgARECACADQfABaiQACyAEQRBqJAALCgAgACgCACgCFAsNACAAKAIAIAGsEJABC80BAQN/IAEEQCABQQhqIQIDQCABKAIAIARKBEAgAigCBCIDBEAgACADEF4LIAAgAigCCBAnIAIoAgwiAwRAIAAgAxBeCyACLwAlIgNBAnEEfyAAIAIoAjgQJyACLwAlBSADC0EEcQRAIAAgAigCOBA5CyAAIAIoAhAQ0wEgAigCFCIDBEAgACADEGYLIAIoAiwhAwJAIAItACZBBHEEQCAAIAMQ7QEMAQsgA0UNACAAIAMQLgsgAkFAayECIARBAWohBAwBCwsgACABEF4LCxUAIAAgASACIAMgACgCACgCCBEMAAs/AQF+AkAgACkDECICIAApAwhaBEAgAEEBEMoDDQEgACkDECECCyAAIAJCAXw3AxAgACgCBCACp2ogAToAAAsL4gEBAX8DQAJAIAAoAgRBgMAQcQRAIABBDGohAAwBCwJ/IAAtAAAiAUGwAUYEQCAALQACIQELAkACQAJAAkACQAJAIAFBsQFrDgICAQALIAFBigFHBEACQCABQacBaw4DAAUABAsgACgCLCIBRQ0EIAEgAC4BIBC8BAwGCyAAKAIUKAIcQQhqIQAMBgsgACgCDCgCFCgCHCAALgEgQQR0akEIaiEADAULIAAoAhRBCGohAAwECyABQSRGDQELIAAtAAEMAQsgACgCCEEAENEEC0EYdEEYdQ8LIAAoAgAhAAwACwALZQEBfyABEJ4BIQMCQCAALQAXRSADRXINACADLQAAQbABRg0AIAMQygVFDQAgAkEANgIAIAAgA0F/EMkFDwsgAiAAEEYiASAAIAMgARDvASIDRwR/IAAgARBAQQAFIAELNgIAIAMLNwEBfyABQQBIBEAgACgCbEEBayEBC0HwpwQhAiAAKAIALQBXBH9B8KcEBSAAKAJoIAFBFGxqCwt7AQN/AkAgAUEASA0AIAAoAhxBIHFFDQAgACgCBCEEA0Ag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KAIkIAIQNjYCJCADIAAgASgCKCACEHA2AiggAyAAIAEoAiwgAhA2NgIsIAMgACABKAIwIAIQcDYCMCABLQAAIQUgAyAENgI4IAMgBToAACADQQA2AjQgACABKAI8IAIQNiEEIANCADcCCCADIAQ2AjwgASgCBCEEIANCfzcCFCADIARBX3E2AgQgAyABLwECOwECIAAgASgCQBDnCyEEIANBADYCRCADIAQ2AkAgASgCSCEHIwBBEGsiBSQAIAVBADYCDCAFQQxqIQQDQAJAIAdFDQAgBCAAQQAgBxDlCyIENgIAIARFDQAgBEEkaiEEIAcoAiQhBwwBCwsgBSgCDCEEIAVBEGokACADIAQ2AkgCQCABKAJEBEAgAC0AVwRAIAMgASgCEDYCEAwCCyMAQSBrIgQkACAEQQA2AgwgBEHAADYCCCAEQcEANgIEIAQgAzYCGCAEQQA2AgAgBCADEGoaIARBIGokAAsgAC0AVyEEIAMgASgCEDYCECAERQ0CCyADQQA2AjggACADEGYLIAYoAgwhACAGQRBqJAAgAA8LIAggAzYCACABKAI0IQEgA0E0aiEIIAMhBAwACwALeQEBfyABBH8gAkUEQCABDwsgACgCACEDAkAgASgCBEGBgICAAnFBgICAgAJHBEAgAigCBEGBgICAAnFBgICAgAJHDQELIAAtANABQQFLDQAgACABENcHIAAgAhDXByADQZsBQeK7ARBxDwsgAEEsIAEgAhA1BSACCwu7AwEDfwJAIAFFDQACQCAABEAgACgCkAQNAQsgASABKAIYQQFrIgI2AhggAg0BCyAAIQIgASgCCCEAA0AgAARAIAAoAhQhAwJAIAIEQCACKAKQBA0BCyABLQArQQFGDQAgACgCGEEYaiAAKAIAQQAQqAEaCyACIAAQ2gQgAyEADAELCwJAAkACQAJAIAEtACsOAgABAgsgASgCMCEAA0AgAARAAkAgAgRAIAIoApAEDQELIAAoAgwhAwJAIAAoAhAiBARAIAQgAzYCDAwBCyABKAI8QThqIAMgACADGygCCCADEKgBGgsgACgCDCIDRQ0AIAMgACgCEDYCEAsgAiAAKAIcEPEDIAIgACgCIBDxAyAAKAIEIQMgAiAAECcgAyEADAELCwwCC0EAIQACQCACBEAgAigCkAQNAQtBACABEK8IGgsgASgCMARAA0AgASgCLCAASgRAIABBAUcEQCACIAEoAjAgAEECdGooAgAQJwsgAEEBaiEADAELCyACIAEoAjAQJwsMAQsgAiABKAIsEGYLIAIgARD3BSACIAEoAgAQJyACIAEoAgwQJyACIAEoAhAQOSACIAEQJwsLlgEBAX8CfwJAIABCB1YEQEEoIQEDQCAAQoACVARAA0AgAEIQVA0EIABCAYghACABQQpqIQEMAAsABSAAQgSIIQAgAUEoaiEBDAELAAsAC0EAIABCAlQNARpBKCEBA0AgAEIHVg0BIABCAYYhACABQQprIQEMAAsACyABIACnQQdxQQF0QaCtA2ovAQBqQQprC0EQdEEQdQsMACAAIAEgARAxEEQLjwIBAn8CQCAAKAIAIgQtAFcEQCADQXVGDQEgBCADIAIQjAQPCyABQQBIBEAgACgCbEEBayEBCyAAKAJoIgUgAUEUbGohBAJAIANBAEgEQCAELQABRQ0BCyAELAABIgEEQCAAKAIAIAEgBCgCEBCMBCAEQQA2AhAgBEEAOgABCwJAIANBAEgEQCAAIAQgACgCaGtBFG0gAiADENYBDAELIANFBEAgAhAxIQMLIAAoAgAgAiADrRDXASEAIARB+gE6AAEgBCAANgIQCw8LIANBfUYEQCAFIAFBFGxqIAI2AhAgBEH9AToAAQ8LIAJFDQAgBSABQRRsaiACNgIQIAQgAzoAASADQXVHDQAgAhDKBgsLMQEBfwJAIAFFDQAgACACQgF8EFYiAEUNACAAIAEgAqciABAlIgMgAGpBADoAAAsgAwssACAAIAFBfyABGzYCFCAAKAIALQAQQQFxBEAgACABENMCQX9BAUEAEJQECwvFBAIDfwJ+An8CQCABRQRAIAAQYgwBCyAAKAIUIgcEfiAHNAJ4BUKAlOvcAwshCQJAAkACQCACQgBTBEBBASEFIANBAUYNAQNAQYIEIQYgCCAJVQ0DIAEgCKciBUEBcmotAAAgASAFai0AAHJFDQMgCEICfCEIDAALAAtBAkEQIAMbIQYgA0EBIAMbIQUgAiEIDAILIAEQPa0hCEGCBCEGDAELIAMhBQsgCCAJVQRAAkAgBEEBakECSQ0AIARBAUYEQCAHIAEQJwwBCyABIAQRAwALIAAQYiAAKAIUQRIQ0AZBEg8LAkAgBEF/RgRAQQcgACACQj+HQgFCAiAFQQFGG4MgCHwiAkIgIAJCIFUbpxC9Aw0DGiAAKAIIIAEgAqcQJRoMAQsgABCcASAAIAE2AgggBEEBRgRAIAAgATYCICAAIAAoAhQgARCrAjYCGAwBCyAAIAQ2AiQgBkGAIEGAwAAgBBtyIQYLIAAgBToAEiAAIAY7ARAgACAIp0H/////B3E2AgwgBUECSQ0AQQAhAUECIQMCQCAAKAIMQQJIDQAgACgCCCIFLQABIQQgBS0AACIFQf8BRiAEQf4BRnFFBEAgBUH+AUcNAUEDIQMgBEH/AUcNAQsgABDVAiIBDQAgACAAKAIMQQJrIgE2AgwgACgCCCIEIARBAmogARCqARpBACEBIAAoAgggACgCDGpBADoAACAAKAIMIAAoAghqQQA6AAEgACADOgASIAAgAC8BEEGABHI7ARALQQcgAQ0BGgtBAAsLPQEBfwJAIAIoAgANACAAKAIIIAFODQAgACgCACABEOUBIgMEQCAAIAM2AgAgACABNgIIDwsgAkEHNgIACwt3AQJ/A0AgACIBQQFqIQAgARCDAw0ACwJAIAEtAABFDQADQCABIgBBAWohASAAEJACDQALIAAtAABFDQADQCAAIgFBAWohACABEIMDDQALIAEtAABFDQADQCABIgBBAWohASAAEJACDQALIAAtAABBAEchAgsgAgseAQF/QQEhASAALQAAQQZPBH8gACgCBEEBagVBAQsLhwIBBH8gACgCDCIEIAAoAhAiA04EQCAAKAIYIQQgACgCACIGKAIAKAIAIQUgACAGIANB4ABsrRC4ByIDNgIYIANFBEAgAkEBcQRAIAUgARAuCyAAIAQ2AhhBAA8LIAMgBCAAKAIMQTBsECUaIAAgACgCEEEBdDYCECAAKAIMIQQLQQEhBiAAIARBAWoiBTYCDCAAKAIYIQMgAkECcUUEQCAAIAU2AhQLIAMgBEEwbGohBQJAIAFFDQAgAS0ABkEIcUUNACABNAIcENQBQY4CayEGCyADIARBMGxqIgMgBjsBCCAFIAEQngE2AgAgAyAANgIEIAMgAjsBCiADQQxqQQBBJBAoGiAEC28BAX8jAEEQayIEJAAgACABNgJAIAAgARDSBwJAIAJFBEAgACABEJEBDAELIAAoAqACRQRAIAAgABDjAiIBNgKgAiABRQ0BCyAEIAM2AgwgACACIAMQkQMhASAAKAKgAiABQQEQxgULIARBEGokAAs7AQF/IAAoAgAiAi0AV0UEQCACIAAoAmggAUEUbGoiACwAASAAKAIQEIwEIABBADYCECAAQbgBOwEACwvCAQEBfwJAIAAoAgAtAFcNACABLQAEQYABcQ0AIwBBIGsiAyQAIANBxwA2AgQgAyAANgIAIAAtABYEQCADQQA2AgwgA0HIADYCCCADIAEQahoLIANBADsBFCADQT82AgwgA0HJADYCCCADIAEQahogA0EgaiQAIAAoAiQNACAAIAEgAhDaCyAAKAIkDQAjAEEgayICJAAgAkHKADYCDCACQTI2AgggAkHHADYCBCACIAA2AgAgAiABEGoaIAJBIGokAAsLRQEBfyAAKAIAQgwQjQEiAwRAIAMgACgCgAE2AgAgACADNgKAASADIAE2AgggAyACNgIEIAIPCyAAKAIAIAIgAREFAEEACw8AQQ4gAEGN6AAQiAVBDgsUAQF/EOwBBH9BAAUgACABEMgBCwtIAQF/IABBASABdCICIAAoApgBcjYCmAECQCABQQFGDQAgACgCACgCECABQQR0aigCBC0ACUUNACAAIAAoApwBIAJyNgKcAQsLHQEBfxDsAQR/QQAFIAAgAUEAIAFBAEobrRDIAQsLZQEDfyACRQRAQQAPCwJAIAAtAAAiA0UNAANAAkAgAS0AACIFRQ0AIAJBAWsiAkUgAyAFR3INACABQQFqIQEgAC0AASEDIABBAWohACADDQEMAgsLIAMhBAsgBEH/AXEgAS0AAGsLcgECfwJAIAAoAgAgACgCDGoiAkEATARAQQEhAiAALQAQQRBxRQ0BC0EHIQEgACACQQEQvwMNAEEAIQEgACgCCCAAKAIMakEAIAAoAgAQKBogACAAKAIMIAAoAgBqNgIMIAAgAC8BEEH/8wNxOwEQCyABC8kKAgV/D34jAEHgAGsiBSQAIARC////////P4MhDCACIASFQoCAgICAgICAgH+DIQogAkL///////8/gyINQiCIIQ4gBEIwiKdB//8BcSEHAkACQCACQjCIp0H//wFxIglB//8Ba0GCgH5PBEAgB0H//wFrQYGAfksNAQsgAVAgAkL///////////8AgyILQoCAgICAgMD//wBUIAtCgICAgICAwP//AFEbRQRAIAJCgICAgICAIIQhCgwCCyADUCAEQv///////////wCDIgJCgICAgICAwP//AFQgAkKAgICAgIDA//8AURtFBEAgBEKAgICAgIAghCEKIAMhAQwCCyABIAtCgICAgICAwP//AIWEUARAIAIgA4RQBEBCgICAgICA4P//ACEKQgAhAQwDCyAKQoCAgICAgMD//wCEIQpCACEBDAILIAMgAkKAgICAgIDA//8AhYRQBEAgASALhCECQgAhASACUARAQoCAgICAgOD//wAhCgwDCyAKQoCAgICAgMD//wCEIQoMAgsgASALhFAEQEIAIQEMAgsgAiADhFAEQEIAIQEMAgsgC0L///////8/WARAIAVB0ABqIAEgDSABIA0gDVAiBht5IAZBBnStfKciBkEPaxCpAUEQIAZrIQYgBSkDWCINQiCIIQ4gBSkDUCEBCyACQv///////z9WDQAgBUFAayADIAwgAyAMIAxQIggbeSAIQQZ0rXynIghBD2sQqQEgBiAIa0EQaiEGIAUpA0ghDCAFKQNAIQMLIANCD4YiC0KAgP7/D4MiAiABQiCIIgR+IhAgC0IgiCITIAFC/////w+DIgF+fCIPQiCGIhEgASACfnwiCyARVK0gAiANQv////8PgyINfiIVIAQgE358IhEgDEIPhiISIANCMYiEQv////8PgyIDIAF+fCIUIA8gEFStQiCGIA9CIIiEfCIPIAIgDkKAgASEIgx+IhYgDSATfnwiDiASQiCIQoCAgIAIhCICIAF+fCIQIAMgBH58IhJCIIZ8Ihd8IQEgByAJaiAGakH//wBrIQYCQCACIAR+IhggDCATfnwiBCAYVK0gBCAEIAMgDX58IgRWrXwgAiAMfnwgBCAEIBEgFVStIBEgFFatfHwiBFatfCADIAx+IgMgAiANfnwiAiADVK1CIIYgAkIgiIR8IAQgAkIghnwiAiAEVK18IAIgAiAQIBJWrSAOIBZUrSAOIBBWrXx8QiCGIBJCIIiEfCICVq18IAIgAiAPIBRUrSAPIBdWrXx8IgJWrXwiBEKAgICAgIDAAINQRQRAIAZBAWohBgwBCyALQj+IIQMgBEIBhiACQj+IhCEEIAJCAYYgAUI/iIQhAiALQgGGIQsgAyABQgGGhCEBCyAGQf//AU4EQCAKQoCAgICAgMD//wCEIQpCACEBDAELAn4gBkEATARAQQEgBmsiB0GAAU8EQEIAIQEMAwsgBUEwaiALIAEgBkH/AGoiBhCpASAFQSBqIAIgBCAGEKkBIAVBEGogCyABIAcQ/wIgBSACIAQgBxD/AiAFKQMwIAUpAziEQgBSrSAFKQMgIAUpAxCEhCELIAUpAyggBSkDGIQhASAFKQMAIQIgBSkDCAwBCyAEQv///////z+DIAatQjCGhAsgCoQhCiALUCABQgBZIAFCgICAgICAgICAf1EbRQRAIAogAkIBfCIBIAJUrXwhCgwBCyALIAFCgICAgICAgICAf4WEUEUEQCACIQEMAQsgCiACIAJCAYN8IgEgAlStfCEKCyAAIAE3AwAgACAKNwMIIAVB4ABqJAALXgICfwF+IwBBEGsiBCQAAkAgASAAKAIAIgVNBEAgAEEANgIADAELIAAgBSAEQQhqEIQDIAAoAgBqNgIAIAMgAykDAEIAIAQpAwgiBn0gBiACG3w3AwALIARBEGokAAtcAQR/IAEoAgAiBSECA0AgAkEBaiEDIAIsAAAiAiAEQRh0QRh1cgRAIAJBgAFxIQQgAyECDAELCyAABEAgACAAKAIAIAUgAyAFayIAECUgAGo2AgALIAEgAzYCAAsaACABRQRAQQAPCyAAIAEgACgCACgCFBEAAAuLBgEFfwJAQdD1AygCAA0AQdj1A0EBNgIAQdz1AygCAEUEQEGg9AMoAgBFBEAQywkLQdCjBEEINgIAAkACQEG49QMoAgBFDQBBvPUDKAIAQYAESA0AQcD1AygCAEEASg0BC0G49QNCADcDAAtBvPQDKAIAQbT0AygCABEBACIABEBB6KMEQgA3AwBB4KMEQgA3AwBB2KMEQgA3AwBB0KMEQgA3AwALIAAiAw0BC0Hc9QNBATYCAEHo9QMoAgBFBEBB6PUDQQg2AgALQeT1A0Hk9QMoAgBBAWoiATYCAEEAIQNB0PUDKAIAQdT1AygCAHJFBEBB1PUDQQE2AgBBgKYEQQBB3AAQKBpBwJEEQQUQhQRBkJMEQQ8QhQRB8JcEQQkQhQRB4JoEQRMQhQRBwPwDQcMAEIUEAkBB4PUDKAIARQRAQez0AygCACIBRQRAEMoJQez0AygCACEBC0Ho9AMoAgAgAREBACIDDQELQeD1A0EBNgIAQQoQVyIABH8gABAjQQAhAANAIABBBEcEQCAAQdgAbEGw9gNqIABFEKkKGiAAQQFqIQAMAQsLQYD8A0HykgEQ/gk2AgBBhPwDQfmSARD+CTYCAEEABUEHCyIDDQBBABCkBSIBBH8gASgCBCEAQeygBCABNgIAQdygBCAAQQwgAEEMSxs2AgBB2KAEQQAQqQoFQQELIgMNAEEAIQNBuPUDKAIAIQBBvPUDKAIAIQRBwPUDKAIAIQFBoKcEKAIABEBByKcEIAFBACAAGyICNgIAQbCnBCACNgIAQaynBCAEQXhxQQAgAhtBACAAGyIENgIAQbinBCAANgIAQbSnBCACQQptQQFqQQogAkHaAEwbNgIAQcynBEEANgIAQcSnBEEANgIAQQAhAQNAIAIEQCAAIAE2AgBBxKcEIAA2AgAgAkEBayECIAQgACIBaiEADAELC0G8pwQgADYCAAtB0PUDQQE2AgALQdT1A0EANgIAQeT1AygCACEBC0Hk9QMgAUEBazYCACABQQFKDQBB6PUDQQA2AgALIAMLNgEBfyABBEADQCACIAEoAgBORQRAIAAgASACQQN0aigCCBAnIAJBAWohAgwBCwsgACABEF4LC34AAkAgACABTgRAIAFBMWogAEgNASAAIAFBH2pKBEAgAEEBaiEADAILIAAgAWtBkPwCai0AACAAaiEADAELIAEgAEExakoEQCABIQAMAQsgASAAQR9qSgRAIAFBAWohAAwBCyABIABrQZD8AmotAAAgAWohAAsgAEEQdEEQdQu3IQETfyMAQYABayIHJAAgACgCCCEGIAdBADYCfCAHQQA2AngCQAJAAkACQAJAAkACQAJAA0ACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAn8CQAJAAkACQAJAAkACQAJAAkACQAJAAkACQCABRQ0AAkAgAS0AACIFQeYAaw5QDw8PDw8PDw8PDwEaEQEBBwEBAQEBAQEBAQEBAQEBAQEBAQEBFgEBAQEBAQEBAQEBAQEBBggECSABAQEBAQEBAQEDFAIFDBUQGxIKHhcfARsACwJAIAVBE2sOJxEWAQEBAQEBAQEBAQEBAQEBCwEBAQEBAQ8PDAEBGRgTEw0NDQ0NDQALIAVBxwBGDSAgBUHNAEYNGwsgBkHLAEEAIAIQIhoMIgsgASgCKCIDKAIcIgUgAS4BIiIIQRRsaiEEIAMtAABFBEAgBCgCDCEDDCMLIAMtAAFFDQAgBCgCACEAIAZB3gAgAygCCCAFIAhBFGxqIgEuARIgAhAkGiABLgEQIgFBAEgNISAAKAIEIAFB//8DcUEMbGotAAVBxQBHDSEgBkHXACACECwaDCELIAEtAARBIHEEQCAAIAEoAgwgAhDvASEDAn8gASgCLCIABEAgACABLgEgELwEDAELIAEtAAELIgBBGHRBGHVBwgBIDSIgBkHgACADQQFBACAAQf8BcUEBdEHc+AJqQX8QMxoMIgsgASgCHCIFQQBIBEAgACgCNCIDQQBIBEAgAS8BICIEQRB0QRB1IghBAEgEQCADQX9zIQMMJAsgASgCLCIFIAgQhwEgA2shAyAFKAIEIARBDGxqIgEvAQoiBEHgAHEEQCAEQYACcQRAIAcgASgCADYCACAAQeDcASAHECZBACEDDCULIAEgBEGAAnIiAjsBCiABIARBgAFxBH8gACAFIAEgAxDQByABLwEKBSACC0H//ANxOwEKDCQLIAEtAAVBxQBHDSMgBkHRACADIAIQIhogBkHXACACECwaDCILIANBAWshBQsgAS0AAiEDIAAoAgggASgCLCAFIAEuASAgAhCJAQJAIANFDQAgACgCCEF/EIYBIgAtAABB3gBHDQAgACADOwECCyACIQMgASgCLA0hIAEtAAFBxQBHDSEgBkHXACADECwaDCELIAAgAUEAIAIQ+QsMHwsgBkHHACABELsEIAIQIhoMHgsgBiABKAIIQQAgAhDPBwwdCyAGIAIgASgCCBCwARoMHAsgBkHNACABKAIIQQJqIgAQMUEBayIBQQJtIAJBACAGKAIAIAAgARCTCEF6EDMaDBsLIAZBzgAgAS4BICACECIaIAEoAggtAAFFDRogACgC4AEiACABLgEgEOAJIQEgAEEANgIAIAYgAUF/EIgBDBoLIAEoAhwhAwwaCyACIAAgASgCDCACEO8BIgBHBEAgBkHRACAAIAIQIhoLIAZB2AAgAiABKAIIQQAQ0QQQIhoMGAtBNUE0IAVBLUYbIQVBASEIQYABDAELQQALIQsgASgCDCIDEP4BBEAjAEEQayIDJAAgASgCECEGIAAoAgghBCABKAIMIg0QkgEhCiAAEDIhCAJAIAAoAiQNACABKAIEIQEgBhCSASAKRwRAIABB6vMAQQAQJgwBCyABQQp2QQFxIREgACANEPULIRIgACAGEPULIRMgBEHHAEEBIAIQIhpBNUE2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IQQDQAJAIAAgBEsEQCAELQAAQTBGDQELQQAhAgNAAkAgAiAEaiIIIABPIgkNACAILQAAIghBMGtB/wFxQQlLDQAgAiAFaiECIApCCn4gCK1C/wGDfEIwfSEKDAELCyABQv///////////wBCgICAgICAgICAfyAHGyAKQgAgCn0gBxsgCkIAUxs3AwACfyACRQRAQX8gAyAERg0BGgsgBiAGDQAaIAYgCQ0AGiACIQMDQEEBIAMgBGotAABBwOoBai0AAEEBcUUNARogBCADIAVqIgNqIABJDQALQQALIQMCQCACIAVBE2wiBkkNAEEBIQAgAiAGTQRAQQAhAEEAIQIDQCACIABBEUtyRQRAIAQgACAFbGosAAAgAEHXuAFqLAAAa0EKbCECIABBAWohAAwBCwsgAgR/IAIFIAQgBUESbGosAABBOGsLIgBBAEgNAQsgAUL///////////8AQoCAgICAgICAgH8gBxs3AwBBAkEDIAMgBxsgABshAwsgAw8LIAQgBWohBAwACwALpwECA38BfgJAIAAtAABBMEcNACAALQABQSByQfgARw0AQQIhAgNAIAIiA0EBaiECIAAgA2otAAAiBEEwRg0ACyADIQIDQCAEQcDqAWotAABBCHEEQCAEQRh0QRh1EIcCrSAFQgSGfCEFIAAgAkEBaiICai0AACEEDAELCyABIAU3AwBBAiACIANrQRBKQQF0IAAgAmotAAAbDwsgACABIAAQMUEBEPUCC40DAQR/AkACQCAABEAgAUEBayECAkADQCAAKAIAQaEfTwRAIAAoAggiAUUNAiACIAIgAW4iAyABbGshAiAAIANBAnRqIgNBDGooAgAiAA0BIAMgARCBBCIANgIMIAANAQwFCwsgACACQQN2aiIAQQxqIAAtAAxBASACQQdxdHI6AABBAA8LIAJBAWohBAJAIABBDGoiAyACQf0AcCIBQQJ0aigCACICBEADQCACIARGBEBBAA8LIANBACABQQFqIgEgAUH8AEsbIgFBAnRqKAIAIgINAAsgACgCBCICQT5JDQEMAwsgACgCBCICQfwATw0CCyAAIAJBAWo2AgQgAyABQQJ0aiAENgIAC0EADwtBACEBQQBC9AMQjQEiAkUNACACIANB9AMQJSEFIANBAEH0AxAoGiAAIAAoAgBB/ABqQf0AbjYCCCAAIAQQ9wIhAgNAIAFB/QBGRQRAIAUgAUECdGooAgAiAwRAIAAgAxD3AiACciECCyABQQFqIQEMAQsLQQAgBRAnIAIPC0EHCzoBAX8CQANAIAFFDQECQCABLQAEQQNxRQRAIAEoAiQiAkEASg0BCyABKAIMIQEMAQsLIAAgAjYCRAsLHgEBfyAAEC8iAUEDRgR/IABBABCOBCAAEC8FIAELCwkAIAAgARCQBAsUACAAIAEQugIQLyEBIAAQuAIgAQuMBAIEfgF/AkACQAJAAkACQAJAAkACQAJAAkAgAQ4MAQIDBAUGBwcICAABCQsgAkEANgIMIAJBgQg7ARAgAkEANgIADwsgAkEBOwEQDwsgADAAACEDIAJBBDsBECACIAM3AwAPCyAALQABIQEgACwAACEAIAJBBDsBECACIAEgAEEIdHKsNwMADwsgAC0AAiEBIAAtAAEhByAALAAAIQAgAkEEOwEQIAIgASAHQQh0IABBEHRycqw3AwAPCyAAKAAAIQAgAkEEOwEQIAIgAEEIdEGAgPwHcSAAQRh0ciAAQQh2QYD+A3EgAEEYdnJyrDcDAA8LIAAtAAEhASAALAAAIQcgADEABSEDIAAxAAQhBCAAMQADIQUgADEAAiEGIAJBBDsBECACIAMgBUIQhiAGQhiGhCAEQgiGhIQgASAHQQh0cq1CIIaENwMADwsgAiAAMQAHIAAxAAVCEIYgADEABEIYhoQgADEAAUIQhiAAMQAAQhiGhCIDIAAxAAMgADEAAkIIhoSEQiCGhCAAMQAGQgiGhIQiBDcDACACQQFBCCAEQv////////8Hg0IAUhtBCCADQoCAwP8Hg0KAgMD/B1EbQQQgAUEGRxs7ARAPCyACQQQ7ARAgAiABQQhrrTcDAA8LIAIgADYCCCACIAFBDGtBAXY2AgwgAiABQQFxQQF0QbCCAmovAQA7ARALHAAgAEESNgIUIAAoAgBB9twAQn9BAUEAENkBGgvVAQECfwJAAkAgASAAIgNzQQNxBEAgAS0AACECDAELIAFBA3EEQANAIAMgAS0AACICOgAAIAJFDQMgA0EBaiEDIAFBAWoiAUEDcQ0ACwsgASgCACICQX9zIAJBgYKECGtxQYCBgoR4cQ0AA0AgAyACNgIAIAEoAgQhAiADQQRqIQMgAUEEaiEBIAJBgYKECGsgAkF/c3FBgIGChHhxRQ0ACwsgAyACOgAAIAJB/wFxRQ0AA0AgAyABLQABIgI6AAEgA0EBaiEDIAFBAWohASACDQALCyAAC1ABAX4CQCADQcAAcQRAIAIgA0FAaq2IIQFCACECDAELIANFDQAgAkHAACADa62GIAEgA60iBIiEIQEgAiAEiCECCyAAIAE3AwAgACACNwMICy0BAX8jAEEQayIDJAAgA0EANgIMIAAgA0EMaiABIAIQkAohACADQRBqJAAgAAtFAQF/IwBBEGsiBCQAIAAoAgBFBEAgACABIAIgBEEMaiADEFIiAwR/IAMFIAQoAgwiARBDGiABEDoLNgIACyAEQRBqJAALrwoCC38BfkEBIQMCQCACKAIADQACQAJAAkACQCABKAIAQQFrDgQAAgABAwsCQCAAIAEoAgwgAhCCA0UNACAAIAEoAhAgAhCCA0UNACABIQUjAEEQayIGJABBASEHAkAgAiIKKAIADQAgASgCAEEBRw0AIAEoAggiAgRAIAIoAgBBAUYNAQsgASECA0AgAigCDCIIBEAgDiACKAIQKAIUNAIgfCEOIAghAgwBCwsCQCAOIAIoAhQ0AiB8QgGGEEsiCUUEQCAKQQc2AgBBACEHDAELIAYgAigCFCIIKAIcNgIMIAYgCCgCQDYCCANAAkAgB0UNACACKAIIIgJFDQAgAigCAEEBRw0AIAIoAgQgCSAGQQxqIAZBCGogAigCECgCFBCjCiEHDAELCyAGIAUoAhAoAhQiAigCHDYCDCAGIAIoAkA2AggDQCAFKAIMIgVFIAdFcg0BIAUoAggoAgQgCSAGQQxqIAZBCGogBSgCAEEBRgR/IAUoAhAFIAULKAIUEKMKIQcMAAsACyAJECMLIAZBEGokACAHDQQLQQAhAyABKAIAQQFHDQMgASgCCCICBEAgAigCAEEBRg0ECwNAIAEoAhQiAkUEQCABKAIQIgIpAxggACkDIFEEQCACKAIUEMUDCyABKAIMIQEMAQsLIAEpAxggACkDIFINAyACEMUDQQAPCyAAIAEoAgwgAhCCAyAAIAEoAhAgAhCCA3JBAEcPCyAAIAEoAgwgAhCCA0UEQEEADwsgACABKAIQIAIQggNFDwsCQAJAAkAgACgCHEUNACABLQAiDQEgASkDGCAAKQMgUg0AIAEoAhQiAygCHA0CC0EAIQMgAS0AIA0CIAEpAxggACkDIFINAiABKAIUKAIgQQBKDwsgASgCFCIDEMUDCyACAn8jAEEgayIEJAAgAygCGARAIAMoAhwhCwtBfyEFA0ACQAJAAkAgAygCQCAHSgRAIAMgB0EYbGooAlgiAkUNA0EAIQwjAEEQayINJAAgBEEANgIcIARBADYCGAJAIAIoAgwiCkUNACAKKAIAEFciBkUEQEEHIQwMAQsgAigCDCgCBCANQQhqEKUBIQkgBCACKAIMKAIAIAlrIgo2AhggBCAGNgIcIAYgCSACKAIMKAIEaiAKECUaCyANQRBqJAAgDCIGDQEgBCgCHCICRQRAIAgQIyALECMgA0IANwIcDAILIAhFBEAgBCgCGCEJDAMLIAQgAjYCFCAEIAg2AhAgBCACNgIMIARBFGogByAFa0EAQQEgBEEQaiAEQQxqEMMDGiAIECMgBCgCFCACayIJDQIgAhAjIAsQIyADQgA3AhwMAQtBACEGAkACQCAFQQBIDQAgAygCLCIKQQBIBEAgAyAJNgIgIAMgCDYCHCAAKQMgIQ4gA0EBNgIYIAMgDjcDEAwBCwJ/IAUgCkkEQCAEIAg2AhwgBCADKAIcNgIYIAogBWsMAQsgAygCHCECIAQgCDYCGCAEIAI2AhwgBSAKawshAiAEIAlBCGqsEPwBIgU2AhQgBUUNASADIAU2AhxBACEHAkAgBEEUaiACQQBBASAEQRxqIARBGGoQwwMEQCADQQE2AhggBCgCFCADKAIcayEHDAELIAQoAhQQIyADQQA2AhwLIAMgBzYCICAIECMLIAMoAhwgC0YNASALECMMAQsgCBAjQQchBgsgBEEgaiQAIAYMAwsgByEFIAIhCAsgB0EBaiEHDAALAAs2AgAgAygCHCECIAEgACkDIDcDGCACQQBHIQMLIAMLNgEBfyAALAAAIgFFBEBBAA8LIAFB4QBrIgFBGEcEQEEBIAFB8KkDaiwAAGsPCyAAQQFqEJACC4oCAgN/An4gACwAACICQQBOBEAgASACrUL/AYM3AwBBAQ8LIAJB/wBxIAAsAAEiA0H/AXFBB3RyIQIgA0EATgRAIAEgAq03AwBBAg8LIAJB//8AcSAALAACIgNB/wFxQQ50ciECIANBAE4EQCABIAKtNwMAQQMPCyACQf///wBxIAAsAAMiAkH/AXFBFXRyIQQgAkEATgRAIAEgBK03AwBBBA8LIABBCmohAyAAQQRqIQIgBEH/////AHGtIQZCHCEFA0ACQCAFQj9WBEAgAyECDAELIAIsAAAiBEH/AHGtIAWGIAZ8IQYgBUIHfCEFIAJBAWohAiAEQQBIDQELCyABIAY3AwAgAiAAawvICQEPfyMAQRBrIg0kACAAQfwBaiEMAkACfyAAKAL8ASIFBEAjAEEQayIKJAACfyAFIgBFBEBBsfoFEJ8BDAELIAAoAhQhBQJAIAAoAhAiBEUEQEEEIQAMAQsgBEEANgIkIAAgASAKQQxqENkJIgBFDQAgCiAKKAIMIgQ2AgAgBSAAQfbAAEEAIAQbIAoQ3gEgBSAEECcLIAUgABCiAQshACAKQRBqJAAgAAwBCwJAIAAoAvgBIgUNACANIAAoAhQ2AgAgAEGSHSANEEoiBTYC+AEgBQ0AQQchAAwCCyAAKAIMIQYgACgCECERIAUhCiMAQdACayIEJAAgBEEANgLMAiAMQQA2AgAgBkIgEEEhBwJAAkACQAJAA0ACQCAEQThqIAYQwwUgB0UNACAGIAQoAswCECcgBEEANgLMAiAGEPcBAkAgBEE4akEAIAogERCsAiIIBEACf0GWPSAILQArIgBBAUYNABpByj4gCC0AHEGAAXENABogAEECRw0CQaw3CyEAIAQgCjYCECAEQThqIAAgBEEQahAmC0EBIQsgBCgCPEUNBCAGQQAQJyAEIAQoAjw2AswCIARBADYCPAwECyAHIAg2AhwgByAGKAIQIAYgCCgCPBBOQQR0aigCADYCGEEAIQAgCC4BIiIJQQAgCUEAShshBQNAAkAgACAFRwRAIAgoAgQgAEEMbGooAgBBt9gAEDANASAAIQULAkACQCAFIAlGBEAgBkEAECcgBEG32AA2AiAgBCAGQcffASAEQSBqEDw2AswCDAELDAELQQEhCwwFCyAHIARBOGoQ2wkiCTYCEAJAAkAgCQRAIAlBAiAGIAgoAjwiABBOIg9BACAAKAIAIAAoAgQQNxogCUEBEDggCUEGQaDqARDPAiEAIAkgDxDkASAGLQBXDQEgACAPNgIEIAgoAhQhECAAQQA2AgwgACAQNgIIIAlBAiAIKAIAQQAQ1gEgBi0AVw0BIAgoAhQhECAAIA82AiAgACAQNgIcIABB/QE6ABUgACAILgEiQQFqNgIkIAAgCC4BIjYCRCAEQQA7AYQCIARCgYCAgBA3A2AgCSAEQThqENoJCyAGLQBXIQAgByAGNgIUIAcgBTsBCCAADQEgByABIARBzAJqENkJIgtBEUcgDkEwS3INASAOQQFqIQ4gBEE4ahDVA0ERIQsMBQsgByAGNgIUIAcgBTsBCAsgCw0EDAILIABBAWohAAwACwALC0EAIQsgBi0AVw0AIAwgBzYCAAwDCyAHRQ0BCyAHKAIQIgBFDQAgABCYAhoLIAYgBxAnCyAEIAQoAswCIgA2AgAgBiALQfbAAEEAIAAbIAQQ3gEgBiAAECcgBEE4ahDVAyAGIAsQogEhACAEQdACaiQAIAALIgBFBEAgAyESQQAhAAJAIAwoAgAiA0UNACADKAIQRQ0AIAMoAgAhAAsgEiAAIgM2AgAgAkUEQEEAIQAMAgsCQCADQRRqEFciBUUEQEEAIQVBByEADAELIAwoAgAgBSADQQAQ1gkhACADIAVqIgNBADYAECADQgA3AAggA0IANwAAIABFBEBBACEADAELIAUQI0EAIQULIAIgBTYCAAwBC0GLAiAAIABBAUYbIQALIA1BEGokACAACyABAX8gACgCACIDRQRAQQwPCyAAIAEgAiADKAIoEQQACzgBAX8gACgCACIAKAIMIAEoAgAiASgCDCAAKAIQIgAgASgCECIBIAAgAUgbEFEiAiAAIAFrIAIbC08BAn8gAARAA0AgACgCACECIAEgACgCBE5FBEAgAiABQQJ0aigCABDZCiABQQFqIQEMAQsLIAIQIyAAKAIQECMgAEEANgIQIABCADcCAAsLLAAgAC0AGUUEQCAAKAIAIAAoAgQgACkDEEF/QQMgAC0AGBsQzwYgABCSBwsLnwEBBH8gAEIANwIAIABCADcCGCAAQgA3AhAgAEIANwIIAn9BASACRQ0AGiAAIAI2AgwgAEEAEKUFIQMCQCAALQAUIgUgA0EATHINAANAIAMiBEEBaiEDIAIgBGotAAAiBkGgiwNqLQAADQALIAYNAEEAIARBAEoNARoLAkAgAUUNACAFBEAgARBnDAELIAFB/ZUBQX8QZAsgABDaAkEBCwupAQEBfyAAKAIEIQQgABBMIAQgAjoAFkEIIQACQCAELQAYQQJxDQAgBCgCJCAEKAIoayIAIAIgACACShshAiABQYAEa0GA/ANLIAFpQQFLckUEQCAEQYAIIAEgAkEgShsgASABQYAERhs2AiQgBBC6BgsgBCgCACAEQSRqIAIQtgMhACAEIAQoAiQgAkH//wNxazYCKCADRQ0AIAQgBC8BGEECcjsBGAsgAAuPAQECfwNAAkAgAS8BCiICQQRxDQAgACgCAARAIAEoAgAtAARBAXFFDQELIAEpAyggACkDWINCAFINACABQYAEQQQgAkGACHEbQQQgAxsgAnI7AQogASgCECICQQBIDQAgASgCBCgCGCACQTBsaiIBIAEtAA5BAWsiAjoADiACQf8BcQ0AIANBAWohAwwBCwsLOgECfwJAIAFFDQADQCACIAEoAgBODQEgASACQQR0aiIDIAAgAygCCBCOAzYCCCACQQFqIQIMAAsACwvdBAEEfyMAQUBqIgQkAAJAIAFFBEAMAQsCQCABKAIEIgJBA3FFDQAgASgCJCAAKAIERw0AIAEgACgCCDYCJAsCQAJAIAEtAAAiA0GzAUcEQCADQacBRw0BIAJBIHEgASgCHCAAKAIER3INASAAKAIAIQMgACgCECABLgEgQQR0aigCCCICEP4BBEAgAyACEOsLDAMLIAMoAgAhAwJAIAAoAgxFDQAgAi0AAEGnAUYNACAEQQhqIgVBAEE0ECgaIAQgAjYCFCAEQbMBOgAIIAAoAgghAiAEQYCAEDYCDCAEIAI2AiQgBSECCyADIAJBABA2IQIgAy0AV0UEQCAAKAIMBEAgAiACKAIEQYCAgAFyNgIECyABKAIEQQNxIgUEQCACIAEoAiQgBRDTAwsgAyABEC4CQAJAAkACQCACLQAAIgFBpwFrDgQDAgIBAAsgAUHxAEcNAQwCCyACELsEIQEgAkGbAToAACACIAE2AgggAiACKAIEQYAQcjYCBAsgACgCACACEMEBIQEgACgCACACIAEEfyABKAIABUHw+gELENQDIQILIAIgAigCBEH/e3E2AgQMBAsgAyACEC4MAgsgASgCHCAAKAIERw0AIAEgACgCCDYCHAsgASAAIAEoAgwQjgM2AgwgASAAIAEoAhAQjgM2AhAgASgCFCECAkAgAS0ABUEQcQRAIAAgAkEBELwHDAELIAAgAhCNAwsgAS0AB0EBcUUNACABKAIsIgIgACACKAIoEI4DNgIoIAAgAigCCBCNAyAAIAIoAgwQjQMLIAEhAgsgBEFAayQAIAILEgAgACgCPEE4aiAAKAIAEI8BCwoAIAAoAgQoAjALVwECfyMAQfAAayIDJAAgA0EIaiIEIAAgA0EgakHGACAAKAJ4EJoBIANBAToAHSAEIAEgAhC7AyAEEMUBIQEgAy0AHEEHRgRAIAAQTwsgA0HwAGokACABCyUBAX8gACAAKALcASIBBH8gACgCCCABEIYBKAIIBUEACzYC3AELwgIBC38gA0EBayELIAFBCGohAyAEIARB/QFxIAAtABcbIgVBAnEhDCAFQQhxIQ0gBUEEcSEOIAEoAgAhBSAAKAIIIQdBACEBIARBAXFB0QBzIghB0ABHIQ8DQCABIAVORQRAIAMoAgAhBAJAAkAgDkUNACADLwEMIgZFDQAgDQRAIAVBAWshBSABQQFrIQEMAgsgByAIIAYgC2ogASACahAiGgwBCwJAIAxFDQAgBBDKBUUNACAAIAQgASACahDJBRoMAQsgACAEIAEgAmoiBhDvASIJIAZGDQACQCAPDQAgB0F/EIYBIgQtAABB0ABHDQAgBCgCDEEBaiIKIAQoAgRqIAlHDQAgCiAEKAIIaiAGRw0AIAQvAQINACAEIAo2AgwMAQsgByAIIAkgBhAiGgsgA0EQaiEDIAFBAWohAQwBCwsLEgAgACABNgIAIAAgARAxNgIEC1gBA38gAEEAIAFBCGoiBBCdAiECIAAoAgAgASgCGBDTASABIAI2AhggAgR/IAIgAigCGEEBajYCGCABLQAtQQJxRQRAIAIPC0EAIAIgACAEENELGwVBAAsLRgEBfyAAQZUBIAFBAEEAIAJBehAzGiAAIAMQOANAIAQgACgCACgCFE5FBEAgACAEEOQBIARBAWohBAwBCwsgACgCDBCKAQsUACAAIAEgAkGAAUEAIAMgBBDJBAsfACABKAIARQRAIAEgACgCNCAAIAAoAgQQqQg2AgALC/kBAgN/AX4jAEEwayIDJAACQCAAAn9BByAAKAIAIgUtAFcNABogACgCBCgCAA0BIAAoAhBBA3EiBARAIAEpAgAhBiADIAI2AiwgAyAGNwMgIAMgBEECdEHcggJqKAIANgIoIAVBoDggA0EgahA8IQEgACgCBCABNgIAQQEMAQsgBS0AIEEBcQRAQaebCBApDAELIAMgASgCBCIBQZGkASABGzYCECAFQYS+ASADQRBqEDwhBAJAIAJFDQAgAi0AAEUNACADIAI2AgQgAyAENgIAIAVB0sAAIAMQPCEECyAAKAIEIAQ2AgBBrpsIECkLNgIMCyADQTBqJAALEQAgACABQRh0QRh1IAIQpAMLJwEBf0EBIQEDQCAAQoABVEUEQCABQQFqIQEgAEIHiCEADAELCyABC0IBAX8gACgCBCEDIAAQTCACAn8gAUEPRgRAIAMoAgAoAmwgACgCFGoMAQsgAygCDCgCOCABQQJ0akEkahAtCzYCAAvrBAIMfwF+IwBBEGsiCCQAAkACQCAALQAADQAgAC0AASIEQQJxRQ0AIAEgACkDICIQUQRAQQAhBCADQQA2AgAMAgsgASAQVw0AIARBCHEEQCADQX82AgBBACEEDAILIBBCAXwgAVINACADQQA2AgAgABCSBCIEQeUARg0AIAQNASAAEKoDQQAhBCAAKQMgIAFRDQELIAAQwwIiBEEQRwRAIAQNAUEBIAJrIQwDQCAAKAJ0IgUvARgiDUEBayIJIAx1IQYgBS0AAiEOIAUoAkAhCiAFLwEaIQsgBSgCRCEPQQAhBwJAAkACfwJAA0AgDyAKIAZBAXRqIgItAABBCHQgAi0AAXIgC3FqIQQCQCAORQ0AA0AgBEEBaiECIAQsAABBAE4EQCACIQQMAgsgAiIEIAUoAjxJDQALQbu2BBApIQQMCAsgBCAIQQhqEK4DGgJAAkAgASAIKQMIIhBVBEAgBkEBaiEHIAYgCUgNAUF/DAULIAEgEFkNASAGIAdMDQMgBkEBayEJCyAHIAlqQQF1IQYMAQsLIAAgBjsBRiAFLQAIRQRAIAYhBwwDCyAAIBA3AyBBACEEIABBADsBMiAAIAAtAAFBAnI6AAEgA0EANgIADAYLQQELIQQgBS0ACEUNACAAIAY7AUYgAyAENgIAQQAhBAwBCyAFKAI4IQICfyAHIA1OBEAgBS0ACSACakEIahAtDAELIAIgCiAHQQF0aiIELQAAQQh0IAQtAAFyIAtxahAtCyEEIAAgBzsBRiAAIAQQwgIiBEUNAQsLIABBADsBMgwBCyADQX82AgBBACEECyAIQRBqJAAgBAuGCAIKfwF+An9BGyEEAkAgASgCACIHLwEIQQ1LDQAgASgCBCIDLwEQIQYgAQJ/IAcoAhAtAAAiBUUEQEH/ASEFQQEMAQsgBUECcQ0BQQEhBUH/AQs6ABkgASAFOgAYIAZBBHEEQCABIAMpAwA3AwhBHAwCCyAGQTlxDQAgBygCFA0AIAEgAygCCDYCCCABIAMoAgw2AhBBHSEECyAECyEJIAFBADoAFwJAAkACQCAALQAADQAgACgCdCIHLQAIRQ0AQQAhAyAALABEIgRBACAEQQBKGyEGQQEhBAJAA0AgAyAGRg0BIANBAXQhBSADQQJ0IQggA0EBaiEDIAAgBWovAUggACAIaigCeC8BGE8NAAtBACEECyAERQ0AAkAgAC8BRiIDIAcvARhBAWtHDQAgACADIAEgCRDDCCIDQQBKDQAgAS0AFw0AIAIgAzYCAEEADwsCQCAALABEQQBMDQAgAEEAIAEgCRDDCEEASg0AIAEtABcNACAAIAAtAAFB+wFxOgABIAAoAnQtAAANAkH/twQQKQ8LIAFBADoAFwsgABDDAiIDRQ0AIANBEEcNASACQX82AgBBAA8LIABBIGohCwNAIAAoAnQiBC8BGEEBayIDIQpBACEHAkACQANAIAQoAkQgBC8BGiAEKAJAIANBfnFqIgYtAABBCHQgBi0AAXJxaiIFQQFqIQggA0EBdSEGAkAgBS0AACIDIAQtAAtNBEAgAyAIIAEgCREEACEDDAELAkAgCCwAACIIQQBIDQAgA0EHdEGA/wBxIAhB/wFxaiIDIAQvAQ5LDQAgAyAFQQJqIAEgCREEACEDDAELIAQgBSAELQAKayALIAQoAlARAgACQCALKQMAIg2nIghBAk4EQCAIIAAoAhQiAygCKG4gAygCME0NAQtB1rgEECkhAwwECyANQiCGQoCAgICgAnxCIIcQdiIFRQRAQQchAwwECyAAIAY7AUYgAEEAIAggBRD+BCEDIAUgCGoiDEEAOwAQIAxCADcACCAMQgA3AAAgACAALQABQfsBcToAASADBEAgBRAjDAQLIAggBSABEPADIQMgBRAjCwJAAkAgA0EASARAIAZBAWohBwwBCyADRQ0BIAZBAWshCgsgByAKSg0CIAcgCmohAwwBCwtBACEDIAJBADYCACAAIAY7AUYgAS0AF0UNAUH2uAQQKSEDDAELIAQtAAgEQCAAIAY7AUYgAiADNgIAQQAhAwwBCyAEKAI4IQMCfyAELwEYIAdMBEAgBC0ACSADakEIahAtDAELIAMgBC8BGiAEKAJAIAdBAXRqIgQtAABBCHQgBC0AAXJxahAtCyEDIAAgBzsBRiAAIAMQwgIiA0UNAQsLIABBADsBMgsgAwsPACAAKAIYBEAgABDeBgsL8woDC38CfgJ8IwBBQGoiBSQAIAIoAgQhBwJAAkACQAJAAn8gAwRAIAUgASwAASIDQf8BcSIENgIQQQEhC0ECIQkgB0EoaiEHIANBAEgEfyABQQFqIAVBEGoQygFBAWohCSAFKAIQBSAECxC6AyABLQAAIgxqDAELIAUgASwAACIDQf8BcSIMNgI8QQEhCSADQQBIBEAgASAFQTxqEMoBIQkgBSgCPCEMCyAMCyIIIABNBEAgAkEXaiEOA0ACQAJ/AkACQAJAAkACQAJAIAcvARAiA0EkcQRAQQEhBiABIAlqLQAAIgNBCUsNASADQQdGDQYgA0UNBAJ+IAEgCGohBAJAAkACQAJAAkACQAJAIAMOBwAAAQIDBAUGCyAEMAAADAYLIAQtAAEgBCwAAEEIdHKsDAULIAQtAAIgBC0AAUEIdCAELAAAQRB0cnKsDAQLIAQoAAAiBEEYdCAEQQh0QYCA/AdxciAEQQh2QYD+A3EgBEEYdnJyrAwDCyAEMQAFIAQxAANCEIYgBDEAAkIYhoQgBDEABEIIhoSEIAQtAAEgBCwAAEEIdHKtQiCGhAwCCyAEKQAAIg9COIYgD0IohkKAgICAgIDA/wCDhCAPQhiGQoCAgICA4D+DIA9CCIZCgICAgPAfg4SEIA9CCIhCgICA+A+DIA9CGIhCgID8B4OEIA9CKIhCgP4DgyAPQjiIhISEDAELIANBCGutCyIPIAcpAwAiEFMNBCAPIBBXDQggAyEEDA0LIANBCHEEQEEBIQQgASAJai0AACIDQQlLDQxBfyEGIANFBEBBACEEDA4LIAEgCGogAyAFQRBqEPwCIANBB0YEQCAFKwMQIhEgBysDACISYw0OQQchA0EBIQYgESASZA0ODAkLIAMhBCAFKQMQIAcrAwAQ8gMMBwsgA0ECcQRAIAUgASAJaiIELAAAIgZB/wFxIgM2AgwgBkEASARAIAQgBUEMahDKARogBSgCDCEDCyADQQxJBEBBfyEGIAMhBAwOC0EBIQQgA0EBcUUNDCAFIANBDGtBAXYiCjYCHAJAIAAgCCAKak8EQCALIAIoAgAiBi8BCEkNAQsgDkHJmgUQKToAAAwMCyAGIAtBAnRqKAIUIg0EQCAFIAYtAAQ6ACIgBigCDCEEIAVBAjsBICAFIAQ2AiQgBSABIAhqNgIYIAMhBCAFQRBqIAcgDSAOEMcIDAgLIAEgCGogBygCCCAKIAcoAgwiDSAKIA1IGxBRIgYNDSADIQQgCiANawwHCyABIAlqIgotAAAiBEEYdEEYdSEGIANBEHFFDQIgBSAENgIMIAZBAEgEQCAKIAVBDGoQygEaIAUoAgwhBAtBfyEGIARBAXEgBEEMSXINDCAEQQxrQQF2IgMgCGogAEsNBCAHLQARQQRxBEAgASAIaiADEJEGRQRAQQEhBAwNCyADIAcoAgBrDAcLIAEgCGogBygCCCADIAcoAgwiCiADIApIGxBRIgZFDQELQQEhBAwLCyADIAprDAQLIAZBAEcMAwsgAyEEQX8hBgwICyAOQeeaBRApOgAADAULQQchBCABIAhqQQcgBUEQahD8AkEAIAcpAwAgBSsDEBDyA2sLIQYgBCEDIAYNBQsCQCALQQFqIgsgAi8BFEYNACADELoDIQQgA60QmwMgCWoiCSAMTw0AIAdBKGohByAEIAhqIgggAE0NAQsLIAJBAToAGiACLAAWIQYMBAsgAkH8mQUQKToAFwtBACEGDAILQQEhBgsgAigCACgCECALai0AACIARQ0AAkAgAEECcUUNACAERQRAIABBAXFFDQEMAgsgBy0AECAAQQFxRXNBAXENAQtBACAGayEGCyAFQUBrJAAgBgsXACAAQQA2AhggACABNgIUIAAgAjsBEAszAQF/IAAvARAiAkEkcQRAIAApAwBCAFIPCyACQQFxBH8gAQUgABBQRAAAAAAAAAAAYgsLvgMDA38CfgJ8IAEvARAiBSAALwEQIgRyIgNBAXEEQCAFQQFxIARBAXFrDwsCQCADQSxxBEAgBCAFcSICQSRxBEBBfyEDIAApAwAiBiABKQMAIgdTDQIgBiAHVQ8LIAJBCHEEQEF/IQMgACsDACIIIAErAwAiCWMNAiAIIAlkDwsgBEEkcQRAIAVBCHEEQCAAKQMAIAErAwAQ8gMPC0F/IQMgBUEkcUUNAiAAKQMAIgYgASkDACIHUw0CIAYgB1UPC0EBIQMgBEEIcUUNASAFQSRxRQRAQX8PC0EAIAEpAwAgACsDABDyA2sPCwJAIANBAnFFDQBBASEDIARBAnFFDQFBfyEDIAVBAnFFDQEgAkUNACAAIAEgAkEAEMcIDwsCfyABKAIMIQIgACgCDCEDIAEvARAiBSAALwEQIgRyQYAIcQRAIAUgBEGACHEiBHEEQCAAKAIAIAEoAgBrDAILIAQEQEF/IAEoAgggAhCRBkUNAhogACgCACACawwCC0EBIAAoAgggAxCRBkUNARogAyABKAIAawwBCyAAKAIIIAEoAgggAyACIAIgA0obEFEiACADIAJrIAAbCyEDCyADC3EAAkAgAUHDAE4EQCAALwEQIgFBBHENASABQQhxRQRAIAFBAnFFDQIgAEEBEI4EDwsgABDcCQ8LIAFBwgBHDQAgACAALwEQIgFBAnEgAUEscUVyBH8gAQUgACACQQEQpgMaIAAvARALQdP/A3E7ARALCx0AIAAgABBfNwMAIAAgAC8BEEHA5ANxQQRyOwEQC90CAgZ/A34gAEEgEL0DBEAgAEEAOgASQQcPCyAAKAIIIQcjAEEgayIEJAACQCAALQAQQQRxBEAgACkDACEKIwBBIGsiBSQAIAVBADoAFSAKIApCP4ciC4UgC30hCUEUIQMDQCAFIAMiBmogCSAJQgqAIgtCCn59p0EwcjoAACADQQFrIQMgCUIJViEIIAshCSAIDQALIApCAFMEQCADIAVqQS06AAAgBkECayEDCyAHIAMgBWpBAWpBFSADaxAlGiAFQSBqJAAMAQsgBEEIakEAIAdBIEEAEJoBIAQCfCAALQAQQSBxBEAgACkDALkMAQsgACsDAAs5AwAgBEEIakGe3QAgBBA+IAcgBCgCGGpBADoAAAsgBEEgaiQAIAAoAggQPSEGIABBAToAEiAAIAZB/////wNxNgIMIAAgAC8BEEGCBHIiBkHT/wNxIAYgAhs7ARAgACABEMwBGkEAC+IBAQN/IwBBgAFrIgMkACABQYCAIHIhBCACQaQDIAIbIQUCQAJAA0AgACAEIAVBpPkDKAIAEQQAIgFBAEgEQEGEqAQoAgBBG0YNAQwDCyABQQJLDQEgAUGw+QMoAgARAQAaIAMgATYCBCADIAA2AgBBHEHB/wAgAxB+QYjWAEEAIAJBpPkDKAIAEQQAQQBODQALQX8hAQwBCyACRQ0AIAEgA0EQakHg+QMoAgARAAANACADKQM4QgBSDQAgAygCHEH/A3EgAkYNACABIAJBzPoDKAIAEQAAGgsgA0GAAWokACABCwsAIAAQlAEgABAjC5MBAQF/AkAgAEUgAUVyDQAgACABQShsaiEBIAAoAhQiAigCkARFBEADQAJAAkAgAC0AEUGQAXEEQCAAEJwBDAELIAAoAhhFDQEgAiAAKAIgEF4gAEEANgIYCyAAQQA7ARALIABBKGoiACABSQ0ADAILAAsDQCAAKAIYBEAgAiAAKAIgECcLIABBKGoiACABSQ0ACwsLVgECfyAALwEyRQRAIAAgAC0AAUECcjoAASAAKAJ0IgEgASgCOCABLwEaIAEoAkAgAC8BRkEBdGoiAi0AAEEIdCACLQABcnFqIABBIGogASgCUBECAAsLCgAgACgCSBCZAgtLAQJ/IAAsAEQiAkEATgRAA0AgASACTkUEQCAAIAFBAnRqKAJ4EKsDIAFBAWohASAALABEIQIMAQsLIAAoAnQQqwMgAEH/AToARAsL2gEBBH8gAC0ACSECIAAoAjghAyAAKAI0IgQtABhBDHEEQCACIANqQQAgBCgCKCACaxAoGgsgAiADaiIFIAE6AAAgBUEAOgAHIAVBADYAASAFIAQoAihBCHY6AAUgBSAEKAIoOgAGIAAgBCgCKEEIQQwgAUEIcRsgAmoiAmtB//8DcTYCFCAAIAEQ+ggaIAAgAjsBEiAEKAIkIQEgACACIANqNgJAIAAgAyAALQAKajYCRCAAQQA6AAwgAEEAOwEYIABBAToAACAAIAEgA2o2AjwgACABQQFrOwEaC/gDAgZ/AX4CfyAALQAAIgNBGHRBGHUiBEEATgRAIAOtIQhBAQwBCyAALAABIgJBAE4EQCACrUL/AYMgBK1C/wCDQgeGhCEIQQIMAQsgAkH/AXEhAiAALAACIgRB/wBxIANBDnRyQf+A/wBxIQMgBEEATgRAIAMgAkEHdEGA/wBxcq0hCEEDDAELIAAsAAMiBEH/AHEgAkEOdHJB/4D/AHEhAiAEQQBOBEAgAiADQQd0cq0hCEEEDAELIAAtAAQiBSADQQ50ciEEIAVBGHRBGHUiB0EATgRAIAQgAkEHdHKtIANBEnatQiCGhCEIQQUMAQsgACwABSIGQf8BcSACQQ50ciEFIAIgA0EHdHIhAyAGQQBOBEAgBSAEQQd0QYD/gP8AcXKtIANBEnatQiCGhCEIQQYMAQsgACwABiIGQf8BcSAEQQ50ciECIAZBAE4EQCACQf+A/4B/cSAFQQd0QYD/gP8AcXKtIANBC3atQiCGhCEIQQcMAQsgACwAByIGQf8BcSAFQQ50ciEEIAJB/4D/AHEhAiAGQQBOBEAgBEH/gP+Af3EgAkEHdHKtIANBBHatQiCGhCEIQQgMAQsgBEEIdEGA/oH+AXEgAC0ACCACQQ90cnKtIAdBA3ZBD3EgA0EEdHKtQiCGhCEIQQkLIQAgASAINwMAIAALJgECfyAAKALkASABQQAQhQkiAwR/IAAoAuQBIAEgAxCnBgVBAAsLHQEBfyAALQArBH9BAAUgACgCBCABQQFBBhDtBAsLDgAgACgCICgCAEHgAGoLLQECfyMAQRBrIgMkACADQQxqIgQgAhBFIAAgBEEEIAEQeiEAIANBEGokACAAC0YAAkAgAUUNACABLQAKDQAgACABKAIcEN8HIAAgASgCABAnIAAgASgCBBAnIAAgASgCDBAuIAAgASgCEBDtASAAIAEQJwsL6wIBCH8gACgCNCECIAAgACgCOCAALQAJaiIBLQAAEPoIBEBB4ZoEECkPCyACKAIkIQMgAEEAOgAMIAAgA0EBazsBGiAAIAAoAjgiBSAALQAKIgRqNgJEIAAgAyAFajYCPCAAIAEgBGpBCGo2AkAgACAEIAAtAAlqQQhqOwESIAAgAS8AAyIBQQh0IAFBCHZyIgE7ARggA0EIa0EGbiABQf//A3FJBEBB75oEECkPCyAAQQE6AAAgAEF/NgIUIAIoAgQtACJBIHEEf0EAIQNBACEBIAAoAjQoAigiBUF8QXsgAC0ACBtqIQYgAC8BEiIHIAAvARhBAXRqIQggACgCOCEEAkACfwNAIAMgAC8BGE8NAkG8mgQgBCADQQF0IAdqaiICLQAAQQh0IAItAAFyIgIgCEkgAiAGSnINARogA0EBaiEDIAAgAiAEaiAAKAJMEQAAIAJqIAVMDQALQcGaBAsQKSEBCyABBUEACwsoACAAIAE6ABQgACgCDARAIAAQpwILIAFBEkYEQCAAKAIAQRIQ0AYLC7ICAgR/An4jAEEQayIFJAAgASgCACEDAkACQAJAIAAtAA8EQCAAKAIcDQELIAAoAuQBKAIMIANFcg0AIAMgACgCqAFGDQAgBUIANwMIAkAgAC0AEUUNACAAKAJAIgQoAgBFDQAgBCAFQQhqELwBIgQNAgsgA0EIahD6AyIGRQRAQQAhBkEHIQQMAgsgAyAGakIANwAAIAAQ8AIgACgC5AEgAxCdCSIEDQEgACgC4AEQpgIgACAGNgLgASAFKQMIIQggACADrSIHNwOoASAAIAcgCHxCAX0gB38+AhwgAEGQ+QMoAgAgA25BAWo2AqQBCyABIAApA6gBPgIAIAAgAkEASAR/IAAvAZYBBSACCzsBlgFBACEEDAELIAYQpgIgASAAKQOoAT4CAAsgBUEQaiQAIAQLVwEBfwJAIAA1AgggADUCECABrHxXBEAgACABELcGIgFBAEwNAQsDQCABQQBMDQEgACAAKAIQIgNBAWo2AhAgAyAAKAIEaiACOgAAIAFBAWshAQwACwALCzsBAX8gACABIAJBAUEAEIgCBH9BAAUgAUEAEEoiA0UEQEEHDwsgACABIAJBASADQQhBAEEAQQMQwwkLC98JAQt/IwBBEGsiBCQAIAQgATYCCCAEIAA2AgwgAi0AAyEKIAItAAAhCyACLQABIQgCQAJAAkADQAJAAn8CQAJ/IAQoAgwiACwAACIBQQBOBEAgBCAAQQFqNgIMIAFB/wFxDAELIARBDGoQxgELIgAEQCAAIAtGBEADQEEAIAsCfyAEKAIMIgAsAAAiAUEATgRAIAQgAEEBajYCDCABQf8BcQwBCyAEQQxqEMYBCyIARyAAIAhGIAhBAEdxG0UEQCAAIAhHDQEgBEEIahDGAQ0BDAkLCyAARQRAQQAhBgwJCyAAIANGBEAgAi0AAgRAIAQoAgxBAWshASAEKAIIIQUDQCAFLQAARQRAQQIhBgwKCyABIAUgAiADELkDIgZBAUcNCSAFLQAAIQYgBUEBaiIAIQUgBkHAAUkNAANAIAAtAAAhBiAAIgVBAWohACAGQcABcUGAAUYNAAsMAAsACyAEQQxqEMYBIgBFDQgLIABBgQFJDQQgBCgCDCEBA0ACfyAEKAIIIgUsAAAiBkEATgRAIAQgBUEBajYCCCAGQf8BcQwBCyAEQQhqEMYBCyIFRQ0IIAAgBUcNACABIAQoAgggAiADELkDIgZBAUYNAAsMCAsgACADRgRAAkAgAi0AAkUEQCAEQQxqEMYBIgANAUEBIQYMCgtBASEGIARBCGoQxgEiCUUNCUEAIQBBACEMQQAhByAEQQxqEMYBIgVB3gBGBEBBASEMIARBDGoQxgEhBQsgBUHdAEcNAyAJQd0ARiEHQQAMBAsgBCgCDCENCwJ/IAQoAggiASwAACIFQQBOBEAgBCABQQFqNgIIIAVB/wFxDAELIARBCGoQxgELIgEgAEYNBAJAIApFDQAgAEH/AXFBwOcBai0AACABQf8BcUHA5wFqLQAARyAAQf8AS3INACABQYABSQ0FC0EBIQYgACAIRw0HIAQoAgwgDUYNByABDQQMBwsgBCgCCC0AAEEARyEGDAYLQQELIQEDQAJAAkACQAJAIAFFBEBBACEADAELIAAhAQJAIAUiAEEtRwRAIABB3QBGDQQgAEUNCwwBCyAEKAIMLQAAIg5B3QBGIA5Fcg0AIAENAgtBASAHIAAgCUYbIQcLIARBDGoQxgEhBUEBIQEMAwsgByAHQQEgBEEMahDGASAJSRsgASAJSxshBwwBCyAHIAxHDQMMBgtBACEBDAALAAsLIAQCfyAKBEAgBEEAOgAHIAQgACAAQcDqAWotAABBf3NB3wFycToABSAAQcDnAWotAAAMAQsgBCAAOgAFQQALOgAGIAQoAgwhByAEKAIIIQADQCMAQSBrIgYkAAJAAkAgBEEFaiIBLAAAIgUEQCABLQABDQELIAAgBRD9CSEBDAELIAZBAEEgECgaIAEtAAAiBQRAA0AgBiAFQQN2QRxxaiIIIAgoAgBBASAFdHI2AgAgAS0AASEFIAFBAWohASAFDQALCyAAIgEtAAAiBUUNAANAIAYgBUEDdkEccWooAgAgBXZBAXENASABLQABIQUgAUEBaiEBIAUNAAsLIAZBIGokACAAIAEgAGtqIgAtAABFBEAgBCAANgIIDAMLIAcgAEEBaiIAIAIgAxC5AyIGQQFGDQALIAQgADYCCAwCCyAEIAU2AggMAQtBAiEGCyAEQRBqJAAgBgseACAAQYABTwRAIABBDGtBAXYPCyAAQbCBAmotAAALjCoDE38GfgF8IwBB8AJrIgMkACAALQAVQQJxIg8EfyACKAIAIQ4gAkEEagUgAgshCQNAAkACQAJAAkACQCABLQAAIgdBJUYEQCABIQgMAQsgASECIAdFDQEDQAJAIAJBAWohCCACLQABIgdBJUYNACAIIQIgBw0BCwsgACABIAggAWsQRCABIQUgCC0AAEUNAQsCfwJAAkACQAJAAkACQAJAAkAgCC0AASICBEAgCEEBaiEIQX8hBkEAIQ1BACEQQQAhFEEAIQxBACERQQAhCkEAIRJBACELIAkhBwJAA0BBASEEAkACQAJAAkACQAJ/AkACQAJAAkACQAJAAkACQCACQRh0QRh1IgJBIGsOGgIEDwMPDw8PDw8KAQYNCw8FCQkJCQkJCQkJAAsgAkHsAEcNDiAILQABIgJB7ABGDQZBASENIAhBAWoMBwtBKyEKDAoLQSAhCgwJC0EBIREMCAtBASEMDAcLQQEhFAwGC0EsIRAMBQtBAiENIAgtAAIhAiAIQQJqCyEIIAJBGHRBGHUhAgwGCwNAIAhBAWohASACQTBrIQQgCCwAASICQf8BcSEJIAJBMGtB/wFxQQlNBEAgBEEKbCAJaiECIAEhCAwBCwsgBEH/////B3EhCyAJQS5GIAlB7ABGcg0CIAEhCAwFCwJAIA8EQCAOEP0EpyECDAELIAcoAgAhAiAHQQRqIQcLQQBBACACayACQYCAgIB4RhsgAiACQQBIIgEbIQtBASASIAEbIQQgCC0AASIBQS5GIAFB7ABGcg0CIAFBGHRBGHUhAiAIQQFqIQggBCESDAQLAkACQCAILQABIgRBKkcEQCAIQQFqIQFBACEIA0AgBEEYdEEYdSECIARBMGtB/wFxQQlLDQIgCEEKbCACakEwayEIIAEtAAEhBCABQQFqIQEMAAsACwJAIA8EQCAOEP0EpyECDAELIAcoAgAhAiAHQQRqIQcLQX9BACACayACQYCAgIB4RhsgAiACQQBIGyEGIAhBAmohASAILAACIQIMAQsgCEH/////B3EhBgsgAkHsAEcEQCABIQgMBAsgAUEBayEICyASIQQLIAgtAAEhAiAEIRIgCEEBaiEIIAINAAtBACECC0EAIQQDQCAEQRdGDQsgBEEGbCITQbDlAWosAAAgAkcEQCAEQQFqIQQMAQsLAkACQAJAAkACQAJAAkACQAJAAkACQAJAIBNBs+UBai0AACIJDhEBAwMDBAcHBQYICAkLAAgBAhYLQQEhDQtBACEQCwJ/Qfqf+AEgBHZBAXFFBEACfiAPBEAgByEJIA4Q/QQMAQsgDUECRgRAIAdBB2pBeHEiAUEIaiEJIAEpAwAMAQsgB0EEaiEJIAc0AgALIhZCP4ciGSAWhSAZfSEZQS0gCiAWQgBTGwwBCyAPBEAgDhD9BCEZIAchCUEADAELAn4gDUECRgRAIAdBB2pBeHEiAUEIaiEJIAEpAwAMAQsgB0EEaiEJIAc1AgALIRlBAAshDAJ/IBQEQCAGIAsgDEH/AXFBAEdrIgEgASAGSBshBgsgBkElSARAQQAhCiADQZACaiECQcYADAELIAAgBq1CCnwiFiAGQQNurXwgFiAQGyIWEMUGIgJFDRQgAiEKIBanCyEBIAEgAmpBAWsiByEFIARBFkYEQCAHQQJrIgVBAEEAIBkgGUIKgCIWQgp+faciASAWQgqCQgFRGyABQQNLG0EBdCIBQYzuAGotAAA6AAAgB0EBayABQY3uAGotAAA6AAALIBNBtOUBai0AAEHA5gFqIQEgE0Gx5QFqMQAAIRogGSEXA0AgBUEBayIFIAEgFyAXIBqAIhYgGn59p2otAAA6AAAgFyAaWiECIBYhFyACDQALIAcgBWshAgNAIAIgBkgEQCAFQQFrIgVBMDoAACACQQFqIQIMAQsLAkAgEEUNACACQQFrIgEgAUEDbSIBQQNsa0EBaiEGIAUgAWshBUEAIQIDQCABQQBMDQEgAiAFaiAFIAEgAmpqLQAAOgAAIAZBAWsiBkUEQCAFIAJBAWoiAmogEDoAAEEDIQYgAUEBayEBCyACQQFqIQIMAAsACyAMQf8BcQRAIAVBAWsiBSAMOgAACwJAQf/l3wMgBHZBAXEgEUUgGVBycg0AIBNBteUBai0AAEHh5gFqIQIDQCACLQAAIgFFDQEgBUEBayIFIAE6AAAgAkEBaiECDAALAAsgByAFayEGDBYLIANB4AFqAnwgDwRAIA4oAgQiASAOKAIASAR8IA4gAUEBajYCBCAOKAIIIAFBAnRqKAIAEFAFRAAAAAAAAAAACwwBCyAHQQdqQXhxIgFBCGohByABKwMACyIcEJwEIAMgAykD4AEiFzcD4AIgAyADKQPoASIWQoCAgICAgICAgH+FIBYgHEQAAAAAAAAAAGMiARsiGDcD6AJBBiAGQYDC1y8gBkGAwtcvSBsgBkEASBsiAiAEQQ9GIhAgBEECRnIgAkEASnFrIgZB/x9xIgJBCnBBA3RB8OYBaisDACEcA0AgAkEKTgRAIAJBCmshAiAcRLu919nffNs9oiEcDAELCyAEQQxGBEAgBiAXIBgQwAO9QjSIp0H/D3FB/wdrQQNtQRB0QRB1akEOTARAIANB0AFqIBwQnAQgA0HAAWogFyAYQoCAgICAgICAUEL0zPj4hbzW5T8Q6AEgA0GwAWogAykDwAEgAykDyAEgAykD0AEgAykD2AEQjwUgAykDsAEgAykDuAEQwAMhHAsgA0GgAWogHBCcBCADQZABaiAXIBggAykDoAEgAykDqAEQjwUgAyADKQOYASIYNwPoAiADIAMpA5ABIhc3A+ACCyAXIBgQwAMQwgYEQEH5lQEhBUEDIQYMFAtBLSAKIAEbIQ1CACEaQoCAgICAgMD/PyEbQQAhAQJAIBcgGEIAQgAQwQNBAEwNAANAAkAgASECIANBgAFqIBoiFiAbIhlCgICAgICAgIBQQreY5ZKtk8mlwQAQ6AEgFyAYIAMpA4ABIhogAykDiAEiGxDBA0EASA0AIAJB5ABqIQEgAkHfAkkNAQsLA0ACQCACIQUgA0HwAGogFiIaIBkiG0IAQoCAgJDfwIqQwAAQ6AEgFyAYIAMpA3AiFiADKQN4IhkQwQNBAEgNACAFQQpqIQIgBUHfAkkNAQsLA0ACQCAFIQEgA0HgAGogGiIWIBsiGUIAQoCAgICAgJCBwAAQ6AEgFyAYIAMpA2AiGiADKQNoIhsQwQNBAEgNACABQQFqIQUgAUHfAkkNAQsLIANB0ABqIBcgGCAWIBkQ3AYgAykDWCEYIAMpA1AhFwNAIBcgGEKAgICAgICAgKB/QsORjPGO85XyPxDdBkEASARAIAMgFyAYQgBCgICAgISv34zAABDoASABQQhrIQEgAykDCCEYIAMpAwAhFwwBCwsDQCAXIBhCAEKAgICAgIDA/z8Q3QZBAEgEQCADQRBqIBcgGEIAQoCAgICAgJCBwAAQ6AEgAUEBayEBIAMpAxghGCADKQMQIRcMAQsLIAMgFzcD4AIgAyAYNwPoAiABQd8CSA0AIAMgDToAkAJBACEKIANBkAJqIgUgDUH/AXEiAUEAR3JBydyZAzYAAEEEQQMgARshBgwVCyAEQQxGDRAgA0FAayAcEJwEIANBMGogFyAYIAMpA0AgAykDSBCPBSADIAMpAzgiFjcD6AIgAyADKQMwIhk3A+ACIBkgFkIAQoCAgICAgJCBwAAQwQNBAE4EQCADQSBqIBkgFkKAgICAgICAgKB/Qpmz5syZs+b9PxDoASADIAMpAyg3A+gCIAMgAykDIDcD4AIgAUEBaiEBCyAQRSAEQQJHcQ0QQQJBASABQXxIIAEgBkpyIgIbIQkgBkEAIAEgAhtrIQYgEUUMEQtBACEKIA8EQEEAIQtBACEGDBQLIAcoAgAgACgCEDYCAAwFCyADQSU6AJACIANBkAJqIQVBASEGDBELAkAgDwRAIA4QwQYiAgRAIAMgAi0AACIBOgCQAkEBIQQgAUHAAUkNAgNAIAItAAEiAUHAAXFBgAFHDQMgAkEBaiECIANBkAJqIARqIAE6AAAgBEEBaiIEQQRHDQALQQQhBAwCCyADQQA6AJACQQEhBAwBCyAHQQRqIQECfyAHKAIAIgJB/wBNBEAgAyACOgCQAkEBDAELIAJB/w9NBEAgAyACQT9xQYABcjoAkQIgAyACQQZ2QcABcjoAkAJBAgwBCyACQf//A00EQCADIAJBP3FBgAFyOgCSAiADIAJBDHZB4AFyOgCQAiADIAJBBnZBP3FBgAFyOgCRAkEDDAELIAMgAkE/cUGAAXI6AJMCIAMgAkEGdkE/cUGAAXI6AJICIAMgAkEMdkE/cUGAAXI6AJECIAMgAkESdkEHcUHwAXI6AJACQQQLIQQgASEHCyADQZACaiEFQQEhDEEAIQogBkECSA0LIBJB/wFxIAsgBmtBAWoiC0ECSHJFBEAgACALQQFrQSAQtwNBACELCwNAIAZBAkgNDCAAIANBkAJqIAQQRCAGQQFrIQYMAAsACyAPRQRAIAdBBGohCUEAIQogBygCACIFRQRAQa3lASEFDAoLIARBA0cNCSAAKAIQDQggACgCDEUgC3IgBkEATnINCCAALQAUBEAgBSEKDAsLIAAgBTYCBCAAIAAoAgAgBRCrAjYCCCAAIAUQPUH/////B3E2AhAgACAALQAVQQRyOgAVDAcLIA4QwQYiAUGt5QEgARshBUEAIQogByEJDAgLQSJBJyAEQQZGGyEBAn8gDwRAIAchCSAOEMEGDAELIAdBBGohCSAHKAIACyIHQYKYAUGaxQEgBEEFRiIEGyAHGyECIAasIRhCACEXQgAhFgNAAkAgGFANACACIBenai0AACIFRQ0AIAEgBUatIRkCQCAMIAVBvwFLcUUEQCAXQgF8IRcMAQsDQCACIBdCAXwiF6dqLQAAQcABcUGAAUYNAAsLIBYgGXwhFiAYQgF9IRgMAQsLIANBkAJqIQVBACEKIBYgF3xCA3wiFkLHAFkEQCAAIBYQxQYiCiEFIApFDQ4LQgAhGEIAIRYgB0EARyAEcSIHBEAgBSABOgAAQgEhFgsgF0IAIBdCAFUbIRoDQCAYIBpSBEAgBSAWp2ogAiAYp2otAAAiBDoAACAWQgF8IRkgASAERwR+IBkFIAUgGadqIAE6AAAgFkICfAshFiAYQgF8IRgMAQsLIAUgBwR+IAUgFqdqIAE6AAAgFkIBfAUgFgunIgRqQQA6AAAMCgsgAC0AFUEBcUUNDCAHKAIAIQEgEQRAIAFFDQEgAS0ABUEIcQ0BIAAgASgCCBDVASAAKAIAIAEQ+AIMAQsgAUUNACABKAIEIgJFDQAgACABKAIAIAIQRCABKAIAIQICQCAAKAIAIglFDQAgCSgCREF+Rw0AIAkoAogCIgFFDQAgASgC6AEiAUUgASACS3INACABED0gAWogAk0NACAJIAIgAWs2AkQLCyAHQQRqIQkMAwsgAC0AFUEBcUUNCiAHQQRqIQlBACAHKAIAIgEoAgwiAiAMGw0BIAEoAggiBwRAIAAgASgCBCICBH8gACACENUBIABB+7sBQQEQRCABKAIIBSAHCxDVAQwDCyACDQEgASgCFCICKAIQIQEgAi0ABUEIcQRAIAMgATYCgAIgAEGxvAEgA0GAAmoQPgwDCyADIAE2AvABIABBo7wBIANB8AFqED4MAgsgAEH/2gFBARBEDAkLIAAgAhDVAQtBACEKQQAhC0EAIQYMCgsgBSEKCyAGQQBIDQAgDARAIAUhAgNAAkAgBkEATA0AIAItAAAiAUUNACAGQQFrIQYgAkEBaiECIAFBwAFJDQEDQCACIgFBAWohAiABLQAAQcABcUGAAUYNAAsgASECDAELCyACIAVrIQRBASEMDAMLQQAhAgNAIAIgBkYNCSACIAVqLQAABEAgAkEBaiECDAEFIAIhBgwKCwALAAsgBRA9Qf////8HcSEEDAELIAchCQsCQCAMRQ0AIAQhAiALQQBMDQADQCACQQBMDQEgCyAFIAJBAWsiAmotAABBwAFxQYABRmohCwwACwALIAQhBgwFCyAMCyEQQQAhCiADQZACaiEFQQAgASAJQQJGGyIEQQAgBEEAShutIAasIAusfHwiFkI4WQRAIAAgFkIPfBDFBiIKIQUgCkUNAQsgAyAMQQpsQRBqNgLcAiAFIQIgDUH/AXEiFQRAIAUgDToAACAFQQFqIQILIAwgEXIgBkEASnIhDQJ/IARBAEgEQCACQTA6AAAgAkEBaiECIAEMAQsDQCAEQQBOBEAgAiADQeACaiADQdwCahCwCToAACAEQQFrIQQgAkEBaiECDAELC0F/CyEEIA1B/wFxIg0EQCACQS46AAAgAkEBaiECCyAEQX8gBEEAThshEQNAIAQgEUcEQCACQTA6AAAgBkEBayEGIAJBAWohAiAEQQFqIQQMAQsLA0AgBkEASgRAIAIgA0HgAmogA0HcAmoQsAk6AAAgAkEBaiECIAZBAWshBgwBCwsCQCAQQf8BcUUgDUVyDQADQAJAAkAgAkEBayIELQAAQS5rDgMBAwADCyAEQQA6AAAgBCECDAELCyAMBEAgAkEwOgAAIAJBAWohAgwBCyAEQQA6AAAgBCECCyAJQQJGBEAgAiATQbTlAWotAABBwOYBai0AADoAAAJAIAFBAEgEQCACQS06AAFBACABayEBDAELIAJBKzoAAQsgAUHkAEkEfyACQQJqBSACIAFB5ABuIglBMGo6AAIgASAJQeQAbGshASACQQNqCyICIAFB/wFxQQpuIglBMHI6AAAgAiABIAlBCmxrQTByOgABIAJBAmohAgsgAkEAOgAAIBRFIBJB/wFxciALIAIgBWsiBkxyDQIgCyAGayECIAshBANAIAIgBEwEQCAEIAVqIAUgBCACa2otAAA6AAAgBEEBayEEDAELCyAVQQBHIQQDQCACBEAgBCAFakEwOgAAIARBAWohBCACQQFrIQIMAQUgCyEGDAQLAAsACyADQfACaiQADwtBACEKCyAHIQkLAkACQCALIAZrIgFBAEoEQCASQf8BcQ0BIAAgAUEgELcDCyAAIAUgBhBEDAELIAAgBSAGEEQgACABQSAQtwMLIAoEQCAAKAIAIAoQJwsgCEEBaiEBDAALAAsMACAAEKoDIAAoAiwLMAAgASAAKAIYSgRAIAAgAUEAEL8DDwsgACAAKAIgNgIIIAAgAC8BEEEtcTsBEEEACw8AIAAgASACQQAgAxCUBAumAgICfwF+AkACQCACRSAAKAIYIgRBAExyDQAgACgCCCIDIAAoAiBHDQAgAawhBQJAIAAoAhQiAQRAIAAgASADIAUQ9AMiATYCIAwBCyAAIAMgBRDIASIBNgIgIAENACAAKAIIECMgACgCICEBCyAAIAE2AghBACECDAELIARBAEoEQCAAKAIUIAAoAiAQXgsgACAAKAIUIAGsEI0BIgE2AiALIAFFBEAgABBiIABBADYCGCAAQQA2AghBBw8LIAAgACgCFCABEKsCNgIYAkAgAkUNACAAKAIIIgFFDQAgACgCICABIAAoAgwQJRoLIAAgAC8BECIBQYAgcQR/IAAoAgggACgCJBEDACAALwEQBSABC0H/nwJxOwEQIAAgACgCIDYCCEEAC9MDAgJ+An8jAEEgayIEJAACQCABQv///////////wCDIgNCgICAgICAwIA8fSADQoCAgICAgMD/wwB9VARAIAFCBIYgAEI8iIQhAyAAQv//////////D4MiAEKBgICAgICAgAhaBEAgA0KBgICAgICAgMAAfCECDAILIANCgICAgICAgIBAfSECIABCgICAgICAgIAIUg0BIAIgA0IBg3whAgwBCyAAUCADQoCAgICAgMD//wBUIANCgICAgICAwP//AFEbRQRAIAFCBIYgAEI8iIRC/////////wODQoCAgICAgID8/wCEIQIMAQtCgICAgICAgPj/ACECIANC////////v//DAFYNAEIAIQIgA0IwiKciBUGR9wBJDQAgBEEQaiAAIAFC////////P4NCgICAgICAwACEIgIgBUGB9wBrEKkBIAQgACACQYH4ACAFaxD/AiAEKQMIQgSGIAQpAwAiAEI8iIQhAiAEKQMQIAQpAxiEQgBSrSAAQv//////////D4OEIgBCgYCAgICAgIAIWgRAIAJCAXwhAgwBCyAAQoCAgICAgICACFINACACQgGDIAJ8IQILIARBIGokACACIAFCgICAgICAgICAf4OEvwvTAQIBfwJ+QX8hBAJAIABCAFIgAUL///////////8AgyIFQoCAgICAgMD//wBWIAVCgICAgICAwP//AFEbDQAgAkIAUiADQv///////////wCDIgZCgICAgICAwP//AFYgBkKAgICAgIDA//8AURsNACAAIAKEIAUgBoSEUARAQQAPCyABIAODQgBZBEAgACACVCABIANTIAEgA1EbDQEgACAChSABIAOFhEIAUg8LIAAgAlYgASADVSABIANRGw0AIAAgAoUgASADhYRCAFIhBAsgBAvMAQEGfxC7ASAAEPcBIAAtABhBAXEEQCAALQCxAUUhBAsgBEUhBgNAIAMgACgCFE5FBEAgACgCECAD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AkAgASgCECICBH8gAgUgASgCDCEDIAFBACABMwE0QgF8EI0BIgI2AhAgAkUNAUEAIQIDQCACIAEvATRPRQRAAn8gASgCBCACQQF0ai8BACIAQRB0QRB1IgRBAE4EQCADKAIEIABBDGxqLQAFDAELQcQAIARBf0YNABogASgCKCACQQR0aigCCBCEAQshACABKAIQIAJqIABBGHRBGHUiAEHBACAAQcEAShsiAEHDACAAQcMASRs6AAAgAkEBaiECDAELCyABKAIQIAJqQQA6AAAgASgCEAsPCyAAEE9BAAsOACAAIAEQhgEgAjYCDAvJAQECfwJAAkAgACgCAC0AIUHAAHFFDQAgAS0AKw0AAkAgAkUEQEEBIQQgARCPAw0DIAEoAjBBAEchBQwBCyABQTBqIQBBASEEA0AgACgCACIABEAgASAAIAIgAxCTCwRAQQEhBSAEQQIgASgCACAAKAIIEFMbIQQLIABBBGohAAwBCwsgARCPAyEAA0AgAEUNAQJAIAEgACACIAMQpgdFDQBBASEFIAAtABpFDQBBAg8LIAAoAgwhAAwACwALIAUNAQtBACEECyAEC6UDAQl/An8CQAJAIAEoAjhFBEAgACgCACgCECgCHCIHBH8gBygCMEEARwVBAAtFDQELIAAtAJcBRQ0BC0EAIARFDQEaIARBADYCAEEADwsgAyEJIwBBEGsiCCQAAkACQCAAIgMgASIHEM8LIgFFDQACQCADKAIALQAiQQRxDQAgBygCOCIGRQ0AIAEgBkYNASABIQADQCAAIgUoAiAiAEEAIAAgBkcbDQALIAVBADYCIAtB35gBQeaYASACQYABRhshCkEAIQUgAkH/AEYhCyACQYEBRyEMIAEhAANAAkACQCAALQAIIgYgAkcNACAAKAIQIAkQpQdFDQAgBSAALQAJciEFDAELIAZBlgFGBEAgACACOgAIQQJBASAHLQArQQFHIg0bIQYgCyANckUEQCAIIAo2AgAgA0GZKSAIECZBASEGCyAAIAY6AAkgBSAGciEFDAELIAAtAApFIAxyIAZB/wBHcg0AIAMoAnQNACAFIAAtAAlyIQULIAAoAiAiAA0ACwwBC0EAIQELIAQEQCAEIAU2AgALIAhBEGokACABQQAgBRsLCyoBAX9BqpYBIQEgAEGHAWsiAEECTQR/IABBAnRB1K4DaigC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AiABQQZqNgIMAn8gF0EXRgRAQaYBIAJBDGoQ0ARBFkYNARoLQTsLIQUgAkEQaiQAIAUMAgsgESAaNgIsIBEgATYCKCARIBFBKGo2AiAgAEHx3wEgEUEgahAmDAMLIwBBEGsiAiQAIAIgAUEGajYCDEE7IQUgAkEMahDQBEE7RgRAQaQBQTsgAkEMahDQBEEYRhshBQsgAkEQaiQAIAULIhc2AuwJCyAAIBo2AsgBIAAgATYCxAEgESAAKQLEATcDGCMAQSBrIhQkACARQTBqIhIoAgQhBCASKAIALwEAIQICQANAIBdB//8DcSEFIAJB//8DcSIGQb8ETQR/IAZBAXRBkJwCai8BACEHAn8CQANAIAcgBSICaiIFQQF0QZClAmovAQAgAkYNASACQQF0QfCVAmovAQAiBQ0ACyACQf//A3FFIAdB5QBqIgJBAXRBkKUCai8BAEHlAEdyRQRAIAJBAXRB8MgCagwCCyAGQQF0QeDpAmoMAQsgBUEBdEHwyAJqCy8BAAUgBgtB//8DcSIFQdsJTwRAAkAgBUGVjwJqLQAADQAgEigCACASKAK4CUkNACASEJIIDAMLIBQgESkCGDcDAEEAIQJBACEGQQAhCkEAIQhBACEHQQAhCyMAQbABayINJAAgEigCACEDAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAC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AjYCACACIANBCGsoAgAgAygCBBDwBQybAQsgA0EUayICIARBACACKAIAEDsiAjYCACACIANBCGsoAgAgAygCBBDwBQyaAQsgA0EANgIEDJkBCyADQQE2AgQMmAELIANBfzYCEAyXAQsgA0EIa0EANgIADJYBCyADQQhrQQE2AgAMlQELIANBADYCEAyUAQsgA0EIayADKAIENgIADJMBCyADQQhrIARBlAEgAygCBEEAEDU2AgAMkgELIANBIGsgBEGUASADQRRrKAIAIAMoAgQQNTYCAAyRAQsgA0EgayAEQZQBIAMoAgQgA0EUaygCABA1NgIADJABCyAEIANBFGsiAigCACADQQhrEPIFIAQgAigCACADKAIEEO8FDI8BCyAEIAMoAgQQzQQgA0EIa0EANgIADI4BCyAEIAMoAgQQzQQgA0EgayADQRRrKAIANgIADI0BCyAEIANBOGsiAigCACADQSxrEPIFIAQgA0EUayIGKAIAQaMREIUIAkAgA0EIaygCACIFRQRAIAIoAgAhBQwBCyAFKAIAQQJOBEAgBEEAIAVBAEEAQQBBAEGAEEEAELYBIQUgDUIANwOQASAEQQBBAEEAIA1BkAFqIAVBABCCAiEFCyACIAQgAigCACAFEIQIIgU2AgALIAQgBSAGKAIAIAMoAgQgA0HEAGsoAgBBABDuBQyMAQsgA0EsayICIAQgAigCACADKAIEEDsiAjYCACAEIAIgA0EUa0EBEOYCDIsBCyADQcQAayICIAQgAigCACADQSBrKAIAIAMoAgQQgwg2AgAMigELIAQgBEEAIAMoAgQQOyICIANBFGsiBUEBEOYCIAUgAjYCAAyJAQsgA0EsayAEQQAgA0EgaygCACADKAIEEIMINgIADIgBCyAEIANBIGsoAgAgA0EIaygCACADQRRrKAIAIANBOGsoAgAgAygCBBDtBQyHAQsgBCADQSxrKAIAQQAgA0EgaygCACADQcQAaygCAEEAEO0FDIYBCyADQQA2AhAMhQELIANBCGtBADYCACAEIAMoAgQQzQQMhAELIANBgAFrIAQoAgAgA0HcAGsoAgAgA0HEAGsoAgAgA0EUaygCACADQQhrKAIAIAMoAgQQ6wM2AgAMgwELIANB3ABrIAQoAgAgA0E4aygCACADQSBrKAIAQQBBACADKAIEEOsDNgIADIIBCyADQSxrIAQoAgBBAEEAQQBBAEEAEOsDNgIADIEBCyADQdAAayAEKAIAQQBBACADQRRrKAIAIANBCGsoAgBBABDrAzYCAAyAAQsgBCADKAIEEM0EDH8LIANBADYCEAx+CyADQRRrIANBCGsoAgA2AgAMfQsgA0EUayICIAQgAigCACADQQRqEOwFNgIADHwLIAMgBEEAIANBBGoQ7AU2AgQMewsgA0EUayADQQhrKAIANgIADHoLIA0gAykCBDcDQCADIARBOyANQUBrEIMCNgIEDHkLIA0gA0EUayICKQIANwNQIARBOyANQdAAahCDAiEFIA0gAykCBDcDSCACIARBjQEgBSAEQTsgDUHIAGoQgwIQNTYCAAx4CyANIANBLGsiBSkCADcDaCAEQTsgDUHoAGoQgwIhAiANIANBFGspAgA3A2AgBEE7IA1B4ABqEIMCIQYgDSADKQIENwNYIARBjQEgBiAEQTsgDUHYAGoQgwIQNSEGIAQtANABQQJPBEAgBEEAIAIQowELIAUgBEGNASACIAYQNTYCAAx3CyADLwECIQIgDSADKQIENwNwIAMgBCACIA1B8ABqEIMCNgIEDHYLIAQoAgBBmwEgA0EEakEBEHkiAgRAIAIgAygCBCAEKALoAWs2AiQLIAMgAjYCBAx1CwJAIAMoAgQiAi0AAEEjRgRAIAItAAFBOmtBdUsNAQsgAygCCCEHIA0gAykCBDcDeCADIARBnAEgDUH4AGoQgwIiCTYCBCMAQRBrIgokAAJAIAlFDQAgBCgCACELAkACQCAJKAIIIgIwAAEiJFAEQCAEIAQvAcwBQQFqIgU7AcwBDAELAkACQCACLQAAQT9GBEAgB0ECRgR+ICRCMH0FIAJBAWogCkEIaiAHQQFrQQEQ9QJBAEchBiAKKQMICyIkQgBXIAZyICQgCygCnAEiBaxVcg0EICSnQRB0QRB1IgUgBC4BzAFMDQEgBCAFOwHMASAEKALgASEGDAILIAQoAuABIgYgAiAHEN4JIgVB//8DcQ0CIAQgBC8BzAFBAWoiBTsBzAEMAQsgBCgC4AEiBiAFEOAJDQELIAQCfyACIQggBUEQdEEQdSEQAkAgBiICIAsgAiAHQQRtQQNqIgysIAIEfiACKAIEIg4gDGoiDyACKAIAIgZMBEAgAiEGDAILIAasQgGGBUIKC3wiJEIChhC5ASIGRQ0BGgJ/IAIEQCAGKAIEDAELIAZBAjYCBEECCyEOIAYgJD4CACAMIA5qIQ8LIAYgDkECdGoiAiAQNgIAIAIgDDYCBCAGIA82AgQgAkEIaiAIIAcQJSAHakEAOgAAIAYLNgLgAQsgCSAFOwEgIAsoApwBIAVBEHRBEHVODQEgBEHTKkEAECYgBCgCACAJEPgCDAELIAogBTYCACAEQbf7ACAKECYgBCgCACAJEPgCCyAKQRBqJAAMdQsgDSADKQIEIiQ3A5ABIAQtABJFBEAgDSANQZABajYCgAEgBEGawgAgDUGAAWoQJiADQQA2AgQMdQsgAyAEQbABQQBBABA1IgI2AgQgAkUNdCAkp0EBaiACQRxqENACGgx0CyADQRRrIgIgBCACKAIAIANBBGpBARCCCDYCAAxzCyADQThrIAQoAgBBJCADQQhrQQEQeSICNgIAIAQoAgAgAiADQSBrKAIAQQAQgQgMcgsgA0EsayICIAQgA0EIaygCACACIANBFGsoAgAQngI2AgAMcQsgA0EgayICIARBACACQQAQngI2AgAMcAsgBCAEIANBFGsoAgAgA0E4ayICIANBIGsoAgAQngIiBSADKAIEEIAIIAIgBTYCAAxvCyAEIARBACADQSxrIgJBABCeAiIFIAMoAgQQgAggAiAFNgIADG4LIAMgBEEAIANBBGpBABCeAjYCBAxtCyAEIANBIGsoAgAgA0EIaygCABA7IQIgA0EsayIGIARBsQFBAEEAEDUiBTYCACAFBEAgBSACNgIUIAIoAgBFDW0gBigCACIFIAUoAgQgAigCCCgCBEGIhIACcXI2AgQMbQsgBCgCACACEDkMbAsgA0EUayICIAQgAigCACADKAIEENIBNgIADGsLIANBFGsiAiAEIANBCmsvAQAgAigCACADKAIEEDU2AgAMagsgA0EMayICIAMpAgQiJDcCBCACICRCIIinQYCAgIB4cjYCCAxpCyADQQRrIgIgAigCACIGQf////8HcTYCACADQRRrIgIgBCAEIARBACADKAIEEDsgAigCABA7IANBCGtBABCeAiIFNgIAIAZBAEgEQCACIARBEyAFQQAQNSIFNgIACyAFRQ1oIAUgBSgCBEGAAnI2AgQMaAsgA0EcayICIAIoAgAiBkH/////B3E2AgAgA0EsayICIAQgBCAE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AyAFENQGCyAGQfABaiQAC0gBAn8CfyABQR9NBEAgACgCBCECIAAMAQsgAUEgayEBIABBBGoLKAIAIQMgACACIAF2NgIEIAAgAkEgIAFrdCADIAF2cjYCAAtCAQJ/AkAgAEUNAAJAIAAvARAiA0GCBHFBggRHDQAgAC0AEiABRw0AIAAoAggPCyADQQFxDQAgACABEO4JIQILIAILzAkCBH4EfyMAQfAAayIKJAAgBEL///////////8AgyEFAkACQCABUCIJIAJC////////////AIMiBkKAgICAgIDA//8AfUKAgICAgIDAgIB/VCAGUBtFBEAgA0IAUiAFQoCAgICAgMD//wB9IghCgICAgICAwICAf1YgCEKAgICAgIDAgIB/URsNAQsgCSAGQoCAgICAgMD//wBUIAZCgICAgICAwP//AFEbRQRAIAJCgICAgICAIIQhBCABIQMMAgsgA1AgBUKAgICAgIDA//8AVCAFQoCAgICAgMD//wBRG0UEQCAEQoCAgICAgCCEIQQMAgsgASAGQoCAgICAgMD//wCFhFAEQEKAgICAgIDg//8AIAIgASADhSACIASFQoCAgICAgICAgH+FhFAiCRshBEIAIAEgCRshAwwCCyADIAVCgICAgICAwP//AIWEUA0BIAEgBoRQBEAgAyAFhEIAUg0CIAEgA4MhAyACIASDIQQMAgsgAyAFhFBFDQAgASEDIAIhBAwBCyADIAEgASADVCAFIAZWIAUgBlEbIgwbIQUgBCACIAwbIghC////////P4MhBiACIAQgDBsiB0IwiKdB//8BcSELIAhCMIinQf//AXEiCUUEQCAKQeAAaiAFIAYgBSAGIAZQIgkbeSAJQQZ0rXynIglBD2sQqQEgCikDaCEGIAopA2AhBUEQIAlrIQkLIAEgAyAMGyEDIAdC////////P4MhBCALRQRAIApB0ABqIAMgBCADIAQgBFAiCxt5IAtBBnStfKciC0EPaxCpAUEQIAtrIQsgCikDWCEEIAopA1AhAwsgBEIDhiADQj2IhEKAgICAgICABIQhAiAGQgOGIAVCPYiEIQQgA0IDhiEBIAcgCIUhAwJAIAkgC0YNACAJIAtrIgtB/wBLBEBCACECQgEhAQwBCyAKQUBrIAEgAkGAASALaxCpASAKQTBqIAEgAiALEP8CIAopAzAgCikD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KAIAIgE2AgwgASADNgIIIAIgAzYCCCADIgIoAgghAwsgAkEANgIICyAEQQFqIQQMAAsACwNAIAMEQCADKAIIIQEgAxAjIAEhAwwBCwsgCCECCyAJECMMAwUgBCgCDCEEDAELAAsACyAKQQJHDQIgBiACKAIMIgg2AgggBiACKAIQIgM2AgQgAkIANwIMIAhBADYCCCADQQA2AggCQCAGQQhqIAFBAWsiARCbBSIFBH8gAwUgBkEEaiABEJsFIgVFDQEgBigCBAsQjgIgBigCCBCOAgwBCyACIAYoAggiATYCDCABIAI2AgggAiAGKAIEIgE2AhAgASACNgIIQQAhBQsgBQ0AQQAhBQwBCyACEI4CQQAhAgsgACACNgIAIAZBEGokACAFC+ABAQN/IwBBEGsiAyQAAkACQANAIAENASAAKAKAAiACSgRAQQAgACAAKAKYAiACQX8Q9QYiASABQeUARhshASACQQFqIQIMAQsLIAAQpARBACEBIAAtAO0BRQ0BIAAoAjBB/wFHDQEgACgCNEUNAUEAIQIgA0EANgIMIABBFiADQQxqQQAQUiIBDQEgAygCDCIBQQFBAhB1GgJAAkACQCABEENB5ABrDgIAAQILQQggAUEAEL8BIgIgAkEBRhshAgsgACACNgIwCyABEDohAQwBCyAAEKQECyADQRBqJAAgAQuYAQEDfyABLQAHRQRAQQAPCwJAAkAgARDCCiICDQAgASgCACIDIAMoAjhBAWo2AjggASgCDEEBIAEpAyAQWBogAUEAOgAHIAEoAgwQQyECIAMgAygCOEEBazYCOCACQeQARg0BIAEoAgwQOiICDQAgASgCACgCKA0BIAFBAToABkGLAiECCyAABEAgACACENgBCyACIQQLIAQLGQAgACABIAIQ1AoiAEUEQEEADwsgACgCCAuEBAICfwR+IwBBEGsiByQAIAcgAygCACIINgIMAkAgCEUEQEIBIQlCf0IBIAAbIQsgASACaiECQQAhAANAIAEgAkkEQCAHIAEgBxClASABaiIANgIIIAcpAwAhDEEAIAdBCGoQ6gEgCSAMfiAKfCEKIAcoAgghAQNAAkAgASACTw0AIAEtAAANACABQQFqIQEMAQsLIAcgATYCCCALIQkMAQsLIAUgAiAAazYCACADIAA2AgAgBCAKNwMADAELIwBBEGsiCCQA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hUKAgICAgICAgIB/gyENIARCMIinQf//AXEhCAJAAkAgAkIwiKdB//8BcSIJQf//AWtBgoB+TwRAIAhB//8Ba0GBgH5LDQELIAFQIAJC////////////AIMiDEKAgICAgIDA//8AVCAMQoCAgICAgMD//wBRG0UEQCACQoCAgICAgCCEIQ0MAgsgA1AgBEL///////////8AgyICQoCAgICAgMD//wBUIAJCgICAgICAwP//AFEbRQRAIARCgICAgICAIIQhDSADIQEMAgsgASAMQoCAgICAgMD//wCFhFAEQCADIAJCgICAgICAwP//AIWEUARAQgAhAUKAgICAgIDg//8AIQ0MAwsgDUKAgICAgIDA//8AhCENQgAhAQwCCyADIAJCgICAgICAwP//AIWEUARAQgAhAQwCCyABIAyEUARAQoCAgICAgOD//wAgDSACIAOEUBshDUIAIQEMAgsgAiADhFAEQCANQoCAgICAgMD//wCEIQ1CACEBDAILIAxC////////P1gEQCAFQcACaiABIAogASAKIApQIgYbeSAGQQZ0rXynIgZBD2sQqQFBECAGayEGIAUpA8gCIQogBSkDwAIhAQsgAkL///////8/Vg0AIAVBsAJqIAMgCyADIAsgC1AiBxt5IAdBBnStfKciB0EPaxCpASAGIAdqQRBrIQYgBSkDuAIhCyAFKQOwAiEDCyAFQaACaiALQoCAgICAgMAAhCISQg+GIANCMYiEIgJCAEKAgICAsOa8gvUAIAJ9IgRCABCkASAFQZACakIAIAUpA6gCfUIAIARCABCkASAFQYACaiAFKQOYAkIBhiAFKQOQAkI/iIQiBEIAIAJCABCkASAFQfABaiAEQgBCACAFKQOIAn1CABCkASAFQeABaiAFKQP4AUIBhiAFKQPwAUI/iIQiBEIAIAJCABCkASAFQdABaiAEQgBCACAFKQPoAX1CABCkASAFQcABaiAFKQPYAUIBhiAFKQPQAUI/iIQiBEIAIAJCABCkASAFQbABaiAEQgBCACAFKQPIAX1CABCkASAFQaABaiACQgAgBSkDuAFCAYYgBSkDsAFCP4iEQgF9IgJCABCkASAFQZABaiADQg+GQgAgAkIAEKQBIAVB8ABqIAJCAEIAIAUpA6gBIAUpA6ABIgwgBSkDmAF8IgQgDFStfCAEQgFWrXx9QgAQpAEgBUGAAWpCASAEfUIAIAJCABCkASAGIAkgCGtqIQYCfyAFKQNwIhNCAYYiDiAFKQOIASIPQgGGIAUpA4ABQj+IhHwiEELn7AB9IhRCIIgiAiAKQoCAgICAgMAAhCIVQgGGIhZCIIgiBH4iESABQgGGIgxCIIgiCyAQIBRWrSAOIBBWrSAFKQN4QgGGIBNCP4iEIA9CP4h8fHxCAX0iE0IgiCIQfnwiDiARVK0gDiAOIBNC/////w+DIhMgAUI/iCIXIApCAYaEQv////8PgyIKfnwiDlatfCAEIBB+fCAEIBN+IhEgCiAQfnwiDyARVK1CIIYgD0IgiIR8IA4gDiAPQiCGfCIOVq18IA4gDiAUQv////8PgyIUIAp+IhEgAiALfnwiDyARVK0gDyAPIBMgDEL+////D4MiEX58Ig9WrXx8Ig5WrXwgDiAEIBR+IhggECARfnwiBCACIAp+fCIKIAsgE358IhBCIIggCiAQVq0gBCAYVK0gBCAKVq18fEIghoR8IgQgDlStfCAEIA8gAiARfiICIAsgFH58IgtCIIggAiALVq1CIIaEfCICIA9UrSACIBBCIIZ8IAJUrXx8IgIgBFStfCIEQv////////8AWARAIBYgF4QhFSAFQdAAaiACIAQgAyASEKQBIAFCMYYgBSkDWH0gBSkDUCIBQgBSrX0hCkIAIAF9IQsgBkH+/wBqDAELIAVB4ABqIARCP4YgAkIBiIQiAiAEQgGIIgQgAyASEKQBIAFCMIYgBSkDaH0gBSkDYCIMQgBSrX0hCkIAIAx9IQsgASEMIAZB//8AagsiBkH//wFOBEAgDUKAgICAgIDA//8AhCENQgAhAQwBCwJ+IAZBAEoEQCAKQgGGIAtCP4iEIQogBEL///////8/gyAGrUIwhoQhDCALQgGGDAELIAZBj39MBEBCACEBDAILIAVBQGsgAiAEQQEgBmsQ/wIgBUEwaiAMIBUgBkHwAGoQqQEgBUEgaiADIBIgBSkDQCICIAUpA0giDBCkASAFKQM4IAUpAyhCAYYgBSkDICIBQj+IhH0gBSkDMCIEIAFCAYYiAVStfSEKIAQgAX0LIQQgBUEQaiADIBJCA0IAEKQBIAUgAyASQgVCABCkASAMIAIgAiADIAJCAYMiASAEfCIDVCAKIAEgA1atfCIBIBJWIAEgElEbrXwiAlatfCIEIAIgAiAEQoCAgICAgMD//wBUIAMgBSkDEFYgASAFKQMYIgRWIAEgBFEbca18IgJWrXwiBCACIARCgICAgICAwP//AFQgAyAFKQMAViABIAUpAwgiA1YgASADURtxrXwiASACVK18IA2EIQ0LIAAgATcDACAAIA03AwggBUHQAmokAAvbAQIBfwJ+QQEhBAJAIABCAFIgAUL///////////8AgyIFQoCAgICAgMD//wBWIAVCgICAgICAwP//AFEbDQAgAkIAUiADQv///////////wCDIgZCgICAgICAwP//AFYgBkKAgICAgIDA//8AURsNACAAIAKEIAUgBoSEUARAQQAPCyABIAODQgBZBEBBfyEEIAAgAlQgASADUyABIANRGw0BIAAgAoUgASADhYRCAFIPC0F/IQQgACACViABIANVIAEgA1EbDQAgACAChSABIAOFhEIAUiEECyAECzUAIAAtABFBkAFxBEAgABCHBQsgACgCGARAIAAoAhQgACgCIBBeIABBADYCGAsgAEEANgIIC5gEAwN8An4CfwJ8AkAgAL0iBEI0iKdB/w9xIgZByQdrQT9JBEAgBiEHDAELIAZByAdNBEAgAEQAAAAAAADwP6APCyAGQYkISQ0ARAAAAAAAAAAAIARCgICAgICAgHhRDQEaIAZB/w9GBEAgAEQAAAAAAADwP6APCyAEQgBTBEBEAAAAAAAAABAQ/wkPC0QAAAAAAAAAcBD/CQ8LQYC3AysDACAAokGItwMrAwAiAaAiAiABoSIBQZi3AysDAKIgAUGQtwMrAwCiIACgoCIBIAGiIgAgAKIgAUG4twMrAwCiQbC3AysDAKCiIAAgAUGotwMrAwCiQaC3AysDAKCiIAK9IgWnQQR0QfAPcSIGQfC3A2orAwAgAaCgoCEAIAZB+LcDaikDACAFQi2GfCEEIAdFBEACfCAFQoCAgIAIg1AEQCAEQoCAgICAgICIP32/IgEgAKIgAaBEAAAAAAAAAH+iDAELIwBBEGshByAEQoCAgICAgIDwP3y/IgIgAKIiASACoCIDRAAAAAAAAPA/YwR8IAdCgICAgICAgAg3AwggByAHKwMIRAAAAAAAABAAojkDCEQAAAAAAAAAACADRAAAAAAAAPA/oCIAIAEgAiADoaAgA0QAAAAAAADwPyAAoaCgoEQAAAAA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AEcLC54BAQJ/IAAtABEiAUEGRgRAIAAoAiwaDwsgAUECTwR/AkAgACgC6AEEQCAAQQJBfxCBCSIBIAAgAC0AFEEAEPsDIAEbIQIMAQsgACgCRCgCAEEAIAFBAkcbRQRAIABBAEEAEPsDIQIgAC0ADyABQQNJcg0BIABBBjoAESAAQQQ2AiwgABD1BA8LIABBABCACSECCyAAIAIQ/AMFQQALGguYAQECfyAALQAIBEAgACgCACIBKALcAUUEQCABIAAoAgwiATYC3AEgARA6GiAAQQA2AgwLIABBADoACAsgACgCDBCYARogACICKAIcIQADQCAABEAgACgCCCEBIAAoAgwQIyAAECMgASEADAELCyACQQA2AhwgAigCLBAjIAIoAlwQuQogAigCEBCOAiACQQRqQQBB3AAQKBoLcQEBfyAAKALcARCYARoDQCABQShGRQRAIAAgAUECdGooAjwQmAEaIAFBAWohAQwBCwsgACgC+AEQIyAAKALgARAjIAAoAuQBECMgACgCKBAjIAAoAiwQIyAAKAIkIgEgASgCACgCCBEBABogABAjQQALiwEBAn8jAEEQayIEJAAgACgCBCEDIAAQTAJAIAFFBEBBACECIANBAEEAENkCIgFFDQELIAAgASACEMAKGgsgAC0ACEECRgRAIAMoAgAQgAcgA0EBIARBDGpBABCsAUUEQCADIAQoAgwiARCzCiABEKMECyADQQE6ABQgAxDMCgsgABDJCiAEQRBqJAALKAAgAC0ABUUEQCAAKAIoECMgACgCNBD/BCAAQQA2AjQLIABBADYCKAunBgIKfwJ+IwBBEGsiByQAAn8gAywAACILQQBIBEAgAyAHQQxqEHMaIAcoAgwMAQsgC0H/AXELIQ8gASEOIAIhDSAFIQsgBiEMIwBBEGsiCSQAQYsCIQgCQCADIAlBCGoiARCEAyADaiICIAEQhAMgAmoiCiADIARqIhBLDQBBACECQQAhBEEAIQEDQAJAAkAgCiAQSQRAIAsgDHJFBEBBACEIDAILQQAhCCAJQQA2AgACQAJ/IARBAXEEQAJAIAosAAAiBEEASARAIAogCRBzIQQgCSgCACEIDAELIAkgBEH/AXEiCDYCAEEBIQQLIAEgCEgNAiAEIApqIQoLIAosAAAiAUEASARAIAogCUEEahBzDAELIAkgAUH/AXE2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EWtBFG1BAWo2AiBB5AAhFgyZAQsgDCAFKAIMIgFBKGxqIQsgDCAFKAIEIg5BKGxqIgYvARAiAiAMIAUoAggiCUEobGoiAy8BEHJBAXEEQCALEGIMnQELAkACQCACQRJxRQRAIAYgEkEAEKYDRQ0BDKEBCyACQYAIcUUNASAGEOcBDaABCyAGLwEQQX1xIQILAkACQCADLwEQIg1BEnFFBEAgAyASQQAQpgNFDQEMoQELIA1BgAhxRQ0BIAMQ5wENoAELIAMvARBBfXEhDQsgDCAJQShsaiIPKAIMIAwgDkEobGoiECgCDGoiCiAHKAJ4Sg2NASALIApBAmogASAJRiILEL8DDZ4BIAwgAUEobGoiASABLwEQQcDkA3FBAnI7ARAgC0UEQCABKAIIIAwgCUEobGooAgggDygCDBAlGiADIA07ARALIAEoAgggDygCDGogDCAOQShsaigCCCAQKAIMECUaIAYgAjsBECAKQX5xIAogEkEBSxsiAiABKAIIakEAOgAAIAIgASgCCGpBADoAASABIAEvARBBgARyOwEQIAEgEjoAEiABIAI2AgwMnAELIAwgBSgCBEEobGoiARDcCCEDIAwgBSgCCEEobGoiAhDcCCEKIAwgBSgCDCIJQShsaiEGAkACQCADIApxQQRxBEAgASkDACEqIAggAikDACIrNwOoAgJAAkACQAJAAkACQCAFLQAAQeoAaw4EAAECAwQLIAhBqAJqICoQ4QRFDQQMBgsCfyAIQagCaiEDAn8gKkKAgICAgICAgIB/UQRAQQEgAykDACIqQgBZDQEaIAMgKkKAgICAgICAgIB/hTcDAEEADAILIANCACAqfRDhBAsLRQ0DDAULIAgpA6gCISsCQAJAICpCAFUEQEEBIQMgK0L///////////8AICqAVQ0CICtCAEKAgICAgICAgIB/ICqAfVkNAQwCCyAqQgBZDQAgK0IAVQRAQQEhA0IAQoCAgICAgICAgH8gK4B9ICpYDQEMAgsgK0IAWQ0AQQEhAyAqQoCAgICAgICAgH9RICtCgICAgICAgICAf1FyDQFCACArfUL///////////8AQgAgKn2AVg0BCyAIICogK343A6gCQQAhAwsgA0UNAgwECyAqUA0EICpCf1EgK0KAgICAgICAgIB/UXENAyAIICsgKn83A6gCDAELICpQDQMg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bkEBaiADRwR/IBsgAyAKQQxqQQIQpwEiAkUEQCABIAMgCigCDCgCBEEAEM0LIQIgCigCDBCmAQsgASgCEAUgAwtBAWo2AhAgGUEBaiEZDAELCwJAAkAgAkHlAEYNACACDQEgASANNgIkIAEgDSABKAIQIgJrQQFqNgIgIAIgDUsNAEEAIQIgASgCKA0BIAEgASgCGBCOARCACyIDKAIANgIsIAMgATYCACABQQE2AigMAQsCQCANDQBBASENIAEoAgQiAhBMIAIoAgQiAkEANgIwIAIQoAciAkHlAEYNACACDQELIAEoAgRBASABKAIIQQFqELUEIgINACABKAIAIgIEQCACELICCyAdQQVGBEAgASgCBEECEMILIgINAQsCQCAVIBpIBEBBkPkDKAIAIQIgASgCBCgCBCgCJCEDIBMoAkAhGSATIApBDGoQtQcgDSAaIBVtIh1qQQFrIB1tIh0gHSACIANuQQFqRmshAyANrCEqIAooAgwhDUEAIQIDQCACIAMgDUtyRQRAQQAhAgJAIANBkPkDKAIAIAEoAgQoAgQoAiRuQQFqRg0AIBMgAyAKQQhqQQAQpwEiAg0AIAooAggQXSECIAooAggQpgELIANBAWohAwwBCwsgKiAVrCIsfiErIAJFBEAgE0EAQQEQsQchAgsgK0GQ+QMoAgAiAyAaaqwiKiAqICtVGyEyIAMgFWqsISoDQCACICogMllyRQRAIApBADYCCCAbICogLH+nQQFqIApBCGpBABCnASICRQRAIBkgCigCCCgCBCAVICoQeiECCyAKKAIIEKYBICogLHwhKgwBCwsgAg0BIwBBEGsiAiQAAkAgGSACQQhqELwBIgMNAEEAIQMgAikDCCArVw0AIBkgKxCSAiEDCyACQRBqJAAgAyICDQEgE0EAEK4HIQIMAQsgEyAVIBptIA1sEKYLIBNBAEEAELEHIQILIAINACABKAIEQQAQrwQiAkHlACACGyECCyAcRQRAIAEoAhhBABCxBRogASgCGEEAEK8EGgsgAUEHIAIgAkGKGEYbNgIcCyAKQRBqJAAgAQR/IAEoAhQhAyABKAIYEEwgASgCAARAIAEoAhgiAiACKAIQQQFrNgIQCyABKAIoBEAgASgCGBCOARCACyEKA0AgCiICKAIAIg1BLGohCiABIA1HDQALIAIgASgCLDYCAAsg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QCAGQQFqIANBIGoQcxogAygCIAwBCyAEQf8BcQsiBEUNAQtB/////wchBQJAIAMoAiQiBy0AAA4CAwACCwJ/IAcsAAEiBUEASARAIAdBAWogA0EcahBzGiADKAIcDAELIAVB/wFxCyIFDQILQYsCIQUMBgtBACEFCyAEIAVHDQIgA0IANwMQIANCADcDCCADQgA3AwAgAyAHIANBLGogBBD5BiIEajYCJCADIAQgBmo2AiggA0EoaiADQRBqEMQDIANBJGogA0EIahDEAyADKQMQIghCAlkEQCADKQMIIglCAVUNAgsgAygCJCEEIAMoAighBgsgAyADKAIsIgdBAWo2AixBACEFIAdBADoAACAAIAMoAiw2AgAgASAGQQFqNgIAIAIgBEEBajYCAAwDCwNAIANBLGogAyAIIAkgCCAJUxsQqgogAyADKQMAQgJ9NwMAAkAgCCAJUQRAIANBKGogA0EQahCYBSADQSRqIANBCGoQmAUMAQsgCCAJUwRAIANBKGogA0EQahCYBQwBCyADQSRqIANBCGoQmAULIAMpAxAiCEL///////////8AUiADKQMIIglC////////////AFJyDQALDAELIAQgBUgEQCADIANBLGoiBSAEEPkGIAZqNgIoIAUgA0EoahCwAgwBCyADIANBLGoiBCAFEPkGIAdqNgIkIAQgA0EkahCwAgsgAygCKCEGDAELCyADQTBqJAAgBQvxAwIDfwJ+IwBBMGsiByQAIAdCADcDKCAHQgA3AyAgB0IANwMYIAcgATYCFCAHIAM2AhAgB0EANgIIIAVBADYCACAGQQA2AgACQCACrCAErHxCEXwQSyIIRQRAQQchAQwBCyAHIAg2AgwgB0EUaiABIAJqIgJBACAHQShqEOkBIAdBEGogAyAEaiIDQQAgB0EgahDpAQJAAkADQCAHKAIUIgEgBygCECIEckUNAQJAQQBBAUF/QQAgBykDKCIKIAcpAyAiC1IbIAogC1UbIglrIAkgABsiCSAERSABRXJyRQRAIAdBDGoiASAAIAdBGGogB0EIaiAKEJkFIAEgB0EUaiAHQRBqEKsKIgENASAHQRRqIAIgACAHQShqEOkBIAdBEGogAyAAIAdBIGoQ6QEMAgtBACAEIAFBAEcgCUEASHEbRQRAIAdBDGoiASAAIAdBGGogB0EIaiAKEJkF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AzYCHEEBIQQLIAEgAzYCACACIARB9sAAQQAgAxsgARDeASACIAEoAhwQJyACIAQQogEhAiABQSBqJAAgAiEBIAYQIyAAIAFFOgDtAUEACyEAIAVBEGokACAAC5oBAQV/AkADQCAARQ0BIAAQTCAAKAIEQQhqIQQDQCAEKAIAIgMEQAJAAkAgAkUNACADLQABQQFxDQACQCADLQAADgMAAgACCyADEO4IIgRFDQEgByAEIAUbIQdBACECIAQhAUEBIQUMBAsgAxDkBCADIAE2AgQgA0EEOgAACyADEKwDIANBGGohBAwBCwsLIAdBACAFGyEGCyAGC7ICAgN/AX4gAC8BBEEBTQRAIAAoAgAiASABKAI4QQFqNgI4An8gACgCDBBDQeQARwRAIABBAToABiAAKAIMEDoMAQsgACAAKAIMQQAQmQE3AyBBAAshACABIAEoAjhBAWs2AjggAA8LIwBBEGsiASQAIAFBADYCDAJAAkAgACgCECICBEADQCAALQAHRQRAIAAoAgwQOhoLIAAgAiABQQxqEKsBIAItACAhAyAAQQE2AlggAEEBOgAHIAAgAzoABiAAIAIpAxg3AyAgA0UEQCAAIAFBDGoQ+AYNAQsLIAEoAgwiAg0CDAELIABBAToABgsgACkDICEEAkAgAC0ANEUEQEEAIQIgBCAAKQNQVQ0BDAILQQAhAiAEIAApA0hZDQELIABBAToABgsgAUEQaiQAIAILpwEBBH8jAEEQayIEJAACQCAAKAIMDQAgAEEMaiEBAkAgACgCACICKALcASIDBEAgASADNgIAIAJBADYC3AEMAQsgBCACKALgATYCAEGdowEgBBBKIgNFBEBBByEBDAILIAIgAigCOEEBajYCOCACKAIMIANBASABEMYGIQEgAiACKAI4QQFrNgI4IAMQIyABDQELIABBAToACEEAIQELIARBEGokACABCxwAAkAgAEUNACAAEPkCQQFHDQAgABBfIQELIAELhyECGX8BfiMAQYABayIIJAAgBCgCAC0AAyEXIAhBADYCbCAIQQA2AmggCEEANgJkIAQoAgQQPSEbIAQoAggQPSEMIAggA0ECdEEIayIJrSIgEEsiCjYCcAJAAkAgCkUNACAKQQAgCRAoIRMgIBBLIhVFDQAgG0EBaiEcIAxBAWohGCAVQQAgCRAoIRkgF0E0RyEa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QCACQf8DQfz6AygCABEAACICQQBIBEBBBSECQYSoBCgCACIBQRRGDQEgARD2BCIDQQVGDQEgACABEJsBIAMPCyAAIAE6ABALIAILGAAgAEEAEKIJGiAAKAIYECMgABC4BkEACwsAIAFBADYCAEEACwkAIAAQuAZBAAuPAQECfwJ/QbzwAy4BACIARQRAQYSoBEEcNgIAQX8MAQsCQAJAIABBfkoNAEHpoAwhAQJAAkACQAJAAkACQAJAIABB/wFxQQFrDgsIAAECAwQEBQUGAwcLQYCACAwIC0GAgAIMBwtBgIAEDAYLQf////8HDAULQQEMBAsQEEEQdgwDC0EADAILIAAhAQsgAQsLrwEBA38jAEGgBGsiAyQAIAMgADYCAEGABCADQRBqQfbAACADEMQBIgIQPSEAAkADQCAAQQBKBEAgACACaiEEIABBAWshACAELQAAQS9HDQEMAgsLIAItAABBL0cEQCACQS46AAALIAJBAWohBAtBACEAIARBADoAACABIAJBAEEAEKcDIgE2AgAgAUEASARAQZiyAhDiAUHZCCACQZiyAhDCASEACyADQaAEaiQAIAALdQEBfyMAQRBrIgMkACADIAI2AgAjAEEQayICJAAgAgJ+IAFBwABxRQRAQgAgAUGAgIQCcUGAgIQCRw0BGgsgAiADQQRqNgIMIAM1AgALNwMAQZx/IAAgAUGAgAJyIAIQFRB3IQAgAkEQaiQAIANBEGokACAACwQAQQALCwAgA0EANgIAQQALBgAgABBQC4YBAQV/AkAgACgCJCICRQ0AIAIoAgAiA0EgaiEEA0AgBCIFKAIAIgZBBGohBCACIAZHDQALIAUgAigCBDYCACACECMgAEEANgIkIAMgAygCHEEBayIENgIcIAQNAAJAIAFFDQAgAygCDEEASA0AIAMoAghB5PoDKAIAEQEAGgsgABClCQtBAAuPBAEIf0GKKCEEAkAgACgCJCIFRQ0AIAUoAgAiBkUNAEEBIAEgAmoiBHRBASABdCIKayEHIAZBJGohBgJAIANBAXEEQCAHIAUvAQoiCCAFLwEMIglycUUNASABIAQgASAEShshCyABIQRBASEDA0AgBCALRkUEQEEAIAMgBiAEQQJ0aigCACAIIAR2QQFxShshAyAEQQFqIQQMAQsLAkAgAwRAIABBAiABQfgAaiACEP8D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AwRAIAAtADQNASAAKAIAKAIIECNB/ZUBQQAQSiEBIAAoAgAgATYCCEEBQQcgARshAgwBCyAALQAVBEACfyAFIAUoAgBBAnStEEsiBjYCECAGRQRAIAVBAToAFEEHDAELIAVBAEEAEOQGQQALDQELAkAgAUEDRgRAQQAhAiADQQA2AgwgBCgCBBArIgFFDQMgACAEKAIEEGAiAqxCAXwQSyIENgIcIARFBEBBByECDAQLIAQgASACQQFqECUaAkACQCABLQAAQSRHBEAgAyABNgIMDAELQQAhAiAFQQAgACgCHEEBakEAIANBDGoQkwchBCADKAIMIgFFDQELIAAoAgAoAggQIyABEPAKIQEgACgCACABNgIIIAAQkQVBAUEHIAAoAgAoAggbIQIMBAsgBEUNAyAAKAIoIQIMAQsgACgCKCICIQQLIAAgBCACa0EMbSICNgIIIAAgAjYCDCAAIAQtAAAiAToAFCABQQZPBEBBACECIARBADYCCCAAIAAoAgwiBUEBaiIBIAQoAgRqNgIQIAAtABUEQCAAIAAoAigiBCAAKAIwIAVBAnRqKAIAQQxsai0AADoAFCAFRQ0DIAQgBUEBayIBQQxsai0AAUHAAHFFDQMgACABNgIMDAMLIAAgATYCDAwCCyAAIAJBAWo2AhBBACECDAELIAAQkQULIANBEGokACACCw0AIAAQkQUgABAjQQALkAIBB38jAEEQayIEQn83AgggASgCACIAQQAgAEEAShshByABKAIEIQADQCADIAdGRQRAAkAgACgCACIGQQhIDQBBASAGQQhrIgh0IQYgAC0ABUUEQCACIAZyIQIMAQsgAC0ABEECRw0AIARBCGogCEECdGogAzYCACAFIAZyIQULIABBDGohACADQQFqIQMMAQsLQRMhACACIAVBf3NxRQRAQQAhACABAn9BACAEKAIIIgJBAEgNABogAUKAgICAgICA+D83AyggASgCECIFIAJBA3RqIgJBAToABCACQQE2AgBBASAEKAIMIgRBAEgNABogBSAEQQN0aiIDQQE6AAQgA0ECNgIAQQMLNgIUCyAAC0AAIABBzMMBEIgEIgIEfyACBSAEQQwQVyIBNgIAIAFFBEBBBw8LIAFCADcCACABQQA2AgggAEECQQAQzQlBAAsLDgAgASAANAIMNwMAQQALYgACQAJAAkAC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ACEQDAILIAUgARCEAyAFaiEFIAEpAwAhECAALQDvAQRAIBIgEH0hEkIAIRAMAgsgECASfCESQgAhEAUgASgCQCABKAJEIAkgAyASIAEoAgggECAVfEICfSIQpxDwBiAUhSEUCwwACwALAAsgAUEYahCIAyAEIAU2AiwgAUHgAGokACATIBSFIRMgA0EBaiEDDAALAAsgAhA6IQMgAQRAIAEhAwwDCyADDQIgACgCJCgCACEKIARBADYCJCAEIAAoAuABNgIAAkBBrDUgBBBKIgFFBEBBByEDIARBBzYCLAwBCyAEIAAoAgwgAUF/IARBJGpBABCXAyIDNgIsIAEQIwsDQAJAIAMNACAEKAIkEENB5ABHDQBBACEDIAQoAiRBABCZASEQIAAgBCgCJBD0BiEJQQAhAQNAIAMNAiABIAAoAhhODQIgACgCICABai0AAARAIAFBAWohAUEAIQMMAQsgBCgCJCABQQFqIgIQiwIhAyAEQQA2AiAgACgCJCAJIANBfyAEQSBqENgCIQUgBCgCICEIA0AgBUUEQCAEQQA2AhggBEEANgIUIARBADYCECAEQQA2AgwgCCAEQRxqIARBGGogBEEUaiAEQRBqIARBDGogCigCFBEJACIFDQEgBCgCHCILIAQoAhgiDCAJQQAgECABIAQoAgwiDhDwBiARhSERQQEhAyAAKAKAAiINQQEgDUEBShshDQNAIAMgDUYNAiAMIAAoAoQCIANBGGxqKAIAIg9OBEAgCyAPIAkgAyAQIAEgDhDwBiARhSERCyADQQFqIQMMAAsACwsgCARAIAggCigCEBEBABoLQQAgBSAFQeUARhshAyACIQEMAAsACwsgBCgCJBCYARoMAgsgBCgCLCEBDAALAAsgBiARIBNRNgIMIARBMGokACADIQEgBigCDCECIAZBEGokACABQYsCIAEgAnIbDAILIAJBzKQBQQYQSEUEQCMAQRBrIgMkACADIAJBBmo2AgggA0EIahDzBiEGQQghAQJAIAMoAggiBC0AACIFQSxGBEBBASECIAQtAAFFDQEgAyAEQQFqNgIIIANBCGoQ8wYhASADKAIILQAAIQULQQEhAiAFIAFBAkhyDQAgA0EANgIMAkAgAC0A7QFFBEAgA0EMaiAAEP0GIAMoAgwiAg0BCyAAIAYgARC9CiECCyAAEJMCCyADQRBqJAAgAgwCC0EBIQEgA0ELSQ0AIAJByKQBQQoQSA0AIwBBEGsiASQAIAEgAkEKajYCDCABQQA2AgggAUEANgIEIABBCEEIIAFBDGoQ8wYiAiACQRBKGyACQQFGGzYCMAJAIAAtAO0BRQRAIAFBCGogABD9BiABKAIIIgINAQsgAEEXIAFBBGpBABBSIgINACABKAIEIgJBAUECEHUaIAJBAiAAKAIwEHUaIAIQQxogAhA6IQILIAFBEGokACACIQELIAELNgIMQQAhBQwCCyAEQQJ0IAJqKAIQEGlBAE4NACAHQRM2AgxBACEFDAELIAA0AhhCA4ZCCHwQSyIFRQRAIAdBBzYCDEEAIQUMAQsgBUEAIAAoAhhBAWoiCkEDdBAoIQlBACEEIwBBEGsiBiQAAkAgACgCjAINACAAQRAgBkEMakEAEFIiBA0AIAYoAgwiBEEBEPoCGiAEEEMaIAQQOiEECyAGQRBqJAAgByAENgIMIAQNAAJAIAFBAkgNACAAKAIoDQAgACgCGEECdCACaigCDCIEEC9BBUYEQCACKAIEIQQLIAQQL0EFRg0AIAIoAgAiBhAvQQVHBEAgBhBfIAQQX1ENAQsgBwJ/IAAoAgwtAFxBv+wBai0AAEEFRgRAIAAgBCAHQQhqIAkQogoMAQtBASEIIAAgAiADEKEKCyIENgIMIAQNAQsgCkECdCAJaiEEIAIoAgAiBhAvQQVHBH8gByAAIAYgB0EIaiAJEKIKIgY2AgwgBkUFQQELRSABQQJIckUEQCAAKAIYQQJ0IAJqKAIQEGkhAQJAAkAgCA0AIAcgACACIAMQoQoiBjYCDCAGRQ0AIAZBE0cNASAAKAIoDQEgB0GLAjYCDAwBCyAHIABBACABIAMpAwAQ9wYiAzYCDCADDQBBAiEDA0ACQCAAKAIYQQJqIANMBEBBACEGDAELIANBAmsiBiAAKAIgai0AAEUEQCAAIAEgAiADQQJ0aiIIKAIAECsgBiAEIAZBAnRqEPYGIgYNASAIKAIAEGAhBiAEIAAoAhhBAnRqIgggBiAIKAIAajYCAAsgA0EBaiEDDAELCyAHIAY2AgwLIAAtAO4BBEAgB0EMaiAAIAQQoAoLIAcgBygCCEEBajYCCAsgAC0A7AFFDQAgB0EMaiAAIAQgCSAHKAIIEJ8KCyAFECMgABCTAiAHKAIMIQAgB0EQaiQAIAALDgAgASAAKQMgNwMAQQALsQEBAn8CQAJAAkACQAJAAkAgAiAAKAIAIgQoAhgiA2sOAwABAgMLIAEoAgAiARCcASABQQE7ARAgASAAQY/CAEEAEOkJQQAPCyABIAApAyAQYwwCCyAAKAIQBEAgASAANAIUEGMMAgsgAyECIAQoAiwNACABQQAQgAFBAA8LQQAgABCdBSIDDQEgACgCDCIAEOQJQQFrIAJMDQAgASAAIAJBAWoQ4wkQywELQQAhAwsgAwscACAALQAGRQRAQQAPCyAAEIEHIABBAToABkEBC80JAg5/AX4jAEEwayIIJABBASEDAkAgACgCACIGKAI4DQAgAUH//wNxIgsEfyAEKAIAIQlBAQVBAAshAyABQYCABHEEQCAEIANBAnRqKAIAIQUgA0EBaiEDCyABQYCACHEEQCAEIANBAnRqKAIAIQwgA0EBaiEDCyABQYCAEHEEQCAEIANBAnRqKAIAIQoLIAAQgQcgACAMQoCAgICAgICAgH8Qwwo3A0ggACAKQv///////////wAQwwo3A1ACfyACBEAgAi0AAEHEAEYMAQsgBi0A7wELIQIgACABOwEEIAAgAjoANCALQQJPBEAgCRArIgJFBEBBByEDIAkQL0EFRw0CC0EAIQMgAEEANgIUIAUEQCAAIAUQaSIDNgIUCyAGKAIkIQ8gBigCHCEQIAYtAOwBIREgBigCGCESIAZBCGohDSMAQSBrIgUkACAAQRBqIQcjAEEwayIEJAAgBEEANgIoIARCADcDICAEIAtBAms2AhwgBCASNgIYIAQgEDYCECAEIAM2AgwgBCAPNgIIIAQgETYCFAJAIAJFBEAgB0EANgIADAELIARBCGogAiACED0gByAEQSxqELQKIgNBASADIAQoAigbIAMbIQ4LIARBMGokAAJAAkAgDiIEDQBBACEDIAcoAgBFDQEgB0EMEJsFIgQNACAHKAIAQQwQuAoiBEUNAQsgBygCABCOAiAHQQA2AgBBASEDIARBAUcEQCAEIgNBEkcNASAFQQw2AgAgDUGKwQEgBRDOAUEBIQMMAQsgBSACNgIQIA1B/IkBIAVBEGoQzgELIAVBIGokACADDQEjAEEgayIFJAAgACgCACECIAVBADYCHCAFQQA2AhggBUEANgIUIAAgACgCECAFQRhqIAVBFGogBUEc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BBCjAkUgA0EBR3JFBEAgACACKAIEEMsBDAELIAAgAxDYAQsgAUFAaxCsBAsgBCAHNgLoAiABQdACaiQAC/ECAQZ/IwBBoAJrIgEkACAAEH8hBCACKAIAEGkhAyACKAIEECshBiACKAIIEGkhBSAEKAIQIANBBHRqKAIAIQIgBCgC6AIhCCAEQQA2AugCAkAgAUEQaiACIAQgBiADQQFGEK0EIgINAAJAAkAgASgC/AEiAkUNACACLgEiIgNBAUYNACADIAVKDQELQafsBhApIQIMAQsgAUEQakEAIAVBDGwiByACKAIEaigCABCWASEDAkAgAi4BIkEBayAFSgRAIAFBEGpBACAHIAIoAgRqKAIMEJYBKAIEIQUgAygCBCECDAELIAYgAigCLGohBSADKAIEIQIDQCACLQAAIgdFIAdBLEZyDQEgAyACQQFrIgI2AgQMAAsACyABIAU2AgggASAGNgIEIAEgAiAGazYCACAAIARB4CwgARA8IgJBf0F/ED8gAhAjQQAhAgsgAUEQahCsBCAEIAg2AugCIAIEQCAAIAIQ2AELIAFBoAJqJAALmQMCB38CfiMAQbACayIBJAAgABB/IQMgAigCABArIQUgAigCBBArIQQgAigCEBBpIQcgAykDICELIAIoAhQQKyEGIAIoAhgQaSEIIAMoAugCIQkgA0EANgLoAiAFRSAERXJFBEAgAykDICEKIAgEQCADIApC/////3mDNwMgCyABQSBqIAUgAyAEIAcQrQQhBCADIAMpAyAgCkKAgICABoOENwMgAkACQCAEDQACQCALQoCAgCCDIgpCAFINACABKAKMAiIERQ0AIAQtACtBAkcNACABQQA2AhwgAUIANwIUIAFCADcCDCABQgA3AgQgASABQSBqIgU2AgAgBSAEKAIsIAEQ4AEgASgCLEEAIAEoAkQbIQQMAQsgASgClAIiBEUNASADIApQBH8gAUEgahCuBSIEDQEgASgClAIFIAQLKAIYEE4gAyAFEOcCRw0BIABBARCAAQwBCyAERSAGRXINACADEKMCDQAgACAGIAIoAgggAigCDCABQSBqEJgHCyABQSBqEKwECyADIAk2AugCIAFBsAJqJAALQAEBfwJAIAEtAABBpwFHDQAgAS0AB0EDcQ0AIAAoAhgiAigCDCABKAIsRw0AIAAoAgAgAiABQSxqEJYBGgtBAAt2AQR/QQEhAiABLwEGQaAIcQR/QQEFIAEoAiAiA0UEQEECDwsgACgCGCEEQQAhAgNAIAMoAgAgAkoEQCADIAJBBnRqIgUoAhggBCgCDEYEQCAAKAIAIAQgBSgCEBCWARoLIAJBAWohAgwBCwsgACABEL8HQQALC7kHAgl/AX4jAEHwAmsiASQAIAAQfyEGIAIoAgAQKyEDIAIoAgwQKyEIIAIoAhAQKyEHIAIoAhQQKyEKIAIoAhgQaSEEIApFIAhFIAdFcnJFBEAgBigC6AIhCyAGQQA2AugCIAYQ9wEgAUEANgJYIAFCADcDUCABQgA3A0ggBiAHIAMQfCEFIAFBADYCPCABQgA3AjQgASAFNgJUIAFB2gA2AjAgAUHbADYCLCABIAFByABqNgJAIAEgAUHgAGoiBTYCKAJAIAUgAyAGIAggBBCtBCIDDQAgBikDICIMp0GAgIAgcSEFAkACQCABKALMAiIEBEAgBC0AKyIDQQJGBEAgBQ0DIAQoAiwhAyABQQA2AiQgAUIANwIcIAFCADcCFCABQgA3AgwgASABQeAAaiIFNgIIIAMgAygCBEH///9+cTYCBCAFIAQoAiwgAUEIahDgASABKAKEAQ0CIAFBKGogBCgCLBBqGgwDCwJAIAxCgIABg1AgBUEAR3EgA0EBRnINACAEQTBqIQMDQCADKAIAIgNFDQEgAygCCCIJIAcQU0UEQCABQeAAaiABQcgAaiAJEJYBGgsgA0EEaiEDDAALAAsgByAEKAIAIgMQUw0CIAEgBDYCVCABQeAAaiABQcgAaiAFBH8gAwUgAUEoaiAEKAIQEGUaIAQoAgALEJYBGgwCCyABKALQAiIDBEAgAUHgAGogAUHIAGogAygCABCWARogBQ0CIAFBKGogASgC0AIoAiQQTRoMAgsCQCABKALUAiIEKAIEIgMgBxBTDQAgASgCVCgCPCAEKAIYRw0AIAFB4ABqIAFByABqIAMQlgEaCyAFDQEgAUHgAGoQrgUiAw0CIAFBKGogBBCaByAEQRxqIQMDQCADKAIAIgRFDQICQCAEKAIMIgNFDQAgAyAHEFMNACABQeAAaiABQcgAaiADEJYBGgtBACEDAkAgBCgCECIFRQ0AA0AgAyAFKAIATg0BIAUgA0EGdGooAhAiCSAHEFNFBEAgAUHgAGogAUHIAGogCRCWARogBCgCECEFCyADQQFqIQMMAAsACyAEQShqIQMMAAsACyABKAJsIgMNAQsgACABQcgAaiAIIApBARCZByEDCwJAAkACQCADDgICAAELIAYQowJFDQAgACACKAIMEMsBDAELIAEoAmQEQCAAQa3lASACKAIEIAIoAgggAUHgAGoQmAcMAQsgACADENgBCyABQeAAahCsBCAGIAEoAkgQrQUgBiALNgLoAgsgAUHwAmokAAsHACAAKAIwC4IBAQJ/IAAoAhghAgJAIAEtAAAiA0GnAUcEQCADQc0ARw0BIAIoAgggAS4BIEcNASAAKAIAIgAoAnggAigCDEcNASAAIAIgARCWARoMAQsgAigCCCABLgEgRw0AIAEtAAdBA3ENACACKAIMIAEoAixHDQAgACgCACACIAEQlgEaC0EACyABAX9BASECIAEvAQZBoAhxBH9BAQUgACABEL8HQQALC6EJAQx/IwBB0AJrIgEkACAAEH8hBiACKAIAECshCyACKAIMECshByACKAIQECshCCACKAIUEGkhBSACKAIYECshDCACKAIcEGkhDSACKAIgEGkhBAJAIAtFIAhFciAMRSAFQQBIcnINACAGKALoAiEOIAYQ9wEgBiAIIAcQfCIDRQ0AIAUgAy4BIk4NACADKAIEIAVBDGxqKAIAIQkgAUEANgLIAiABQgA3A8ACIAFCADcDuAIgAUF/IAUgBSADLgEgRhs2AsACIAZBADYC6AIgAUEoaiIKIAcgBiALIAQQrQQhBCABQQA2AhwgAUIANwIUIAFB2AA2AhAgAUHZADYCDCABIAM2AsQCIAEgAUG4Amo2AiAgASAKNgIIAkAgBA0AAkACQCABKAKUAiIEBEACQAJAIAQtACsOAwEEAAQLIAQoAiwiAyADKAIEQf///35xNgIEIAFBADYCNCABQShqIANBABDgAUEHIAEoAjQgBi0AVxsiBA0EIAFBCGogAxBqGgwDCyAIIAQoAgAQUyEHIAEgBDYCxAIgBw0BIAQuASIgBUoEQCABQShqIAFBuAJqIAQoAgQgBUEMbGooAgAQlgEaCyABKALAAkEASARAIAFBKGogAUG4AmogASgClAJBIGoQlgEaCyABQQhqIAEoApQCKAIQEGUaIAEoApQCQQhqIQMDQCADKAIAIgMEQCABQQhqIAMoAigQZRogA0EUaiEDDAELCyABQZgCaiEDA0AgAygCACIDBEAgAUEIaiADKAIoEGUaIANBFGohAwwBBUEAIQMDQCADIAEoApQCIgQuASJODQQgAUEIaiAEIAQoAgQgA0EMbGoQlwEQTRogA0EBaiEDDAALAAsACwALIAEoApgCIgQEQCABQQhqIgMgBCgCKBBlGiADIAEoApgCKAIkEE0aDAILIAFBKGoQrgUiBA0CIAEoApwCQRxqIQQDQCAEKAIAIgQEQAJAIAQoAgwiBUUNACABQShqQQAgBSAHEKwCIANHDQAgBCgCICIFBEAgAUEoaiABQbgCaiAFKAIIIAkQhAsLIAFBKGoiBSABQbgCaiIIIAQoAhwgCRCDCyAFIAggBCgCGCAJEIQLCyAEQShqIQQMAQsLIAMgASgCoAFGBEAgAUEoaiABQbgCaiABKAKcAigCECAJEIMLCyABQQhqIAEoApwCEJoHDAELIARBMGohAwNAIAMoAgAiBEUNAUEAIQMDQCADIAQoAhRORQRAAkAgBw0AIAQgA0EDdGpBJGoiCigCACAFRw0AIAFBKGogAUG4AmogChCWARoLAkAgBCgCCCAIEFMNACAEIANBA3RqKAIoIgogCRBTDQAgAUEoaiABQbgCaiAKEJYBGgsgA0EBaiEDDAELCyAEQQRqIQMMAAsACyAAIAFBuAJqIAsgDCANEJkHIQQLAkACQAJAIAQOAgIAAQsgBhCjAkUNACAAIAIoAgAQywEMAQsgASgCLARAIABBreUBIAIoAgQgAigCCCABQShqEJgHDAELIAAgBBDYAQsgAUEoahCsBCAGIAEoArgCEK0FIAYgDjYC6AILIAFB0AJqJAALPAEBfCACKAIAEPkCQQNrQX5PBEAgAEF/IAIoAgAQUCIDRAAAAAAAAAAAZCADRAAAAAAAAAAAYxsQgAELC9IBAQJ/AkAgAigCABAvQQVGDQAgAEEkEEciAEUNACACKAIAECsaIAIoAgAQYCECIAAgACgCGCIDQQFrNgIYAkAgACgCICIBBEAgA0ECSA0BIAEoAgAhBCABIAFBBGogA0ECdEEIaxCqARogAiAEaiECDAELIAAoAhwgAmohAgsCQCACIAAoAhAiAU4EQCAAQQA2AhAMAQsgACABIAJrIgE2AhAgACgCBCIDIAIgA2ogARCqARogACgCEA0BCyAAQQA2AgwgACgCIBAjIABBADYCIAsLQQECfyAAQQAQRyIBBEACQCABLQAUIgJBB0cEQCACQRJHDQEgABD9Ag8LIAAQZw8LIAAgARCUCSABKAIQQX8QPwsLHQEBfyAAQQAQRyIBBEAgACABEJ0HIAEoAiAQIwsLgQMBBH8CQCACKAIAEC9BBUYNACAAQSQQRyIDRQ0AIAMoAgwhBCADIAAQfygCeDYCDAJAIAFBAUYEQCAEBEAgA0EBQSwQtwMMAgsgA0EBNgIcDAELIAIoAgQhAAJAAkACQCAEBEAgABArIQAgAigCBBBgIQQCQCAARQRAQQAhBAwBCyADIAAgBBBECyADKAIgIQAgAygCHCAERgRAIABFDQUgA0EgaiEFDAILIANBIGohBSAADQEgAygCGEECdEEEaq0QSyIBRQ0DIAMoAhgiAEEBIABBAUobQQFrIQZBACEAA0AgACAGRg0DIAEgAEECdGogAygCHDYCACAAQQFqIQAMAAsACyADIAAQYDYCHAwDCyAAIAMoAhhBAnStEOMBIgFFDQELIAMoAhgiAEEASgRAIABBAnQgAWpBBGsgBDYCAAsgBSABNgIADAELIANBBxC1AwsgAyADKAIYQQFqNgIYIAIoAgAQKyEAIAIoAgAQYCEBIABFDQAgAyAAIAEQRAsLMAAgAEEIEEchAAJAIAEEQCACKAIAEC9BBUYNAQsgAEUNACAAIAApAwBCAX03AwALCxkAIAAgAEEAEEciAAR+IAApAwAFQgALEGMLMAAgAEEIEEchAAJAIAEEQCACKAIAEC9BBUYNAQsgAEUNACAAIAApAwBCAXw3AwALCy0CAX8BfgJAIABBABBHIgFFDQAgASkDECICQgBXDQAgACABKwMAIAK5oxBcCwsgACAAIABBABBHIgAEfCAAKwMABUQAAAAAAAAAAAsQXAt6AgF+AXwgAEEgEEciAEUgAigCABD5AiIBQQVGckUEQCAAIAApAxBCAX03AxACQCABQQFHDQAgAC0AGQ0AIAIoAgAQXyEDIAAgACsDACADuaE5AwAgACAAKQMIIAN9NwMIDwsgAigCABBQIQQgACAAKwMAIAShOQMACwtJAQF/AkAgAEEAEEciAUUNACABKQMQQgBXDQAgAS0AGARAIABB5AxBfxBkDwsgAS0AGQRAIAAgASsDABBcDwsgACABKQMIEGMLC5YBAgF+AX8CQCAAQSAQRyIARSACKAIAEPkCIgRBBUZyDQAgACAAKQMQQgF8NwMQIAIoAgAhAQJ/IARBAUYEQCABEF8hAyAAIAArAwAgA7mgOQMAIAAtABggAC0AGXINAiAAQQhqIAMQ4QRFDQIgAEEBOgAYIABBGWoMAQsgACABEFAgACsDAKA5AwAgAEEZagtBAToAAAsL+gQCBH4HfwJAAkAgAigCBCIHEC9BBUYNACABQQNGBEAgAigCCBAvQQVGDQELIAIoAgAQLyEMIAcQaSEKIAIoAgAhBwJAIAxBBEYEQCAHEGAhCyACKAIAEI0CIghFDQIMAQsgBxArIghFDQEgCkEATg0AIAghBwNAIActAAAiDUUNASAHQQFqIgkhByANQcABTwRAA0AgCSIHQQFqIQkgBy0AAEHAAXFBgAFGDQALCyALQQFqIQsMAAsACwJ/IAFBA0YEQCACKAIIEGkiASABQR91IgJzIAJrrSEDIAFBAE4MAQsgABB/NAJ4IQNBAQshASAKrCEEAkAgCkEASARAIAusIAR8IgRCAFkNASADIAR8IQNCACEEIANCACADQgBVGyEDDAELIAoEQCAEQgF9IQQMAQtCACEEIAMgA0IAVa19IQMLIAQgBCADfSIGQgAgBkIAVRsgARshBSADIAQgAyAGQgBTGyABGyEDIAxBBEcEQANAIAgtAAAiAkUgBVByDQMgCEEBaiIHIQggAkHAAU8EQANAIAciCEEBaiEHIAgtAABBwAFxQYABRg0ACwsgBUIBfSEFDAALAAsgCCAFp2ohAQJAIAusIgQgBX0iBkIAIAZCAFUbIAMgAyAFfCAEVRsiA0KAgICACFoEQCABQX8gABDrCQwBCyAAIAEgA6dBAEF/EJQECwsPCyAIIQkDQCACQf8BcUUgA1ByRQRAIAlBAWohBwJAIAJB/wFxQb8BSwRAA0AgByIJQQFqIQcgCS0AACICQcABcUGAAUYNAAwCCwALIActAAAhAiAHIQkLIANCAX0hAwwBCwsgACAIIAkgCGusQX8QzwYLTAEBfgJ/IAIoAgAQXyIDQgAgA0IAVRshAyADIAAoAgAiASgCFDQCeFYEQCAAEP0CQRIMAQsgASADpxDOBkEACyIBBEAgACABENgBCwuJAwINfwN+IAAQfyELAkAgAigCABArIgpFDQAgAigCABBgIQYgAigCBBArIghFDQAgCC0AAEUEQCAAIAIoAgAQywEPCyACKAIEEGAhBCACKAIIECsiDEUNACACKAIIEGAhByAAIAZBAWqsIhAQzwMiAUUNACAEQQFrIQ0gBiAEayEOIAZBf3OsIREgByAEa6whEkEAIQIDQAJ/AkACQCACIA5MBEACQCACIApqIgUtAAAiDyAILQAARgRAIAUgCCAEEFFFDQELIAEgA2ogDzoAACADQQFqDAQLIAQgB04NASALNAJ4IBAgEnwiEEIBfVMEQCAAEP0CIAEQIw8LIAkgCUEBaiIJcQ0BIAEgECARfCAQQiCGQiCHfBDIASIFDQIgABBnIAEQIw8LIAEgA2ogAiAKaiAGIAJrIgIQJRogASACIANqIgJqQQA6AAAgACABIAJBAxA/DAQLIAEhBQsgAyAFaiAMIAcQJRogAiANaiECIAUhASADIAdqCyEDIAJBAWohAgwACwALCw0AIAAgABB/KQNwEGMLDQAgACAAEH8pA2gQYwsNACAAIAAQfykDKBBjC7sDAgh/AXwjAEEgayIBJAAgAUEIaiIEIAAQfyIDQQBBACADKAJ4EJoBIAIoAgAhAyMAQUBqIgIkAAJAAkACQAJAAkACQCADEC9BAWsOBAEAAwIECyACIAMQUCILOQMQIARBnt0AIAJBEGoQPiAEEJQJIgNFDQQgAyACQThqIAQoAhBBARDHARogCyACKwM4YQ0EIAQQpwIgAiALOQMAIARB8+0AIAIQPgwECyACIAMQXzcDICAEQenuACACQSBqED4MAwsgAxCNAiEHIAQgAxBgIgNBAXQiBkEEahC3BhogBC0AFA0CIANBACADQQBKGyEIIAQoAgQhAwNAIAUgCEcEQCAFQQF0IANqIgkgBSAHaiIKLQAAQQR2QZCKA2otAAA6AAIgCSAKLQAAQQ9xQZCKA2otAAA6AAMgBUEBaiEFDAELCyADIAZqQSc7AAIgA0HYzgA7AAAgBCAGQQNqNgIQDAILIAIgAxArNgIwIARB25UBIAJBMGoQPgwBCyAEQYKYAUEEEEQLIAJBQGskACAAIAQQxQEgASgCGEEBED8gAS0AHARAIAAQWSAAIAEtABwQ2AELIAFBIGokAAsxACMAQRBrIgAkACACKAIAEGkhASAAIAIoAgQQKzYCACABQfbAACAAEH4gAEEQaiQACw4AIABBjK4BQX9BABA/CyEAIAIoAgAgAigCBCAAEJwHEKMDBEAgACACKAIAEMsBCws2AQF+IAAgAigCABBfIgNCASADQgFVGyIDEM8DIgEEQCADpyICIAEQ8wEgACABIAJBAxC+AwsLSQEBfiMAQRBrIgEkAEEIIAFBCGoQ8wEgASkDCCIDQgBTBEAgAUIAIANC////////////AIN9IgM3AwgLIAAgAxBjIAFBEGokAAuYAQEFfyACKAIAEI0CIQMgACACKAIAEGAiBKxCAYZCAYQQzwMiAQRAIARBACAEQQBKGyEGIAEhAgNAIAUgBkZFBEAgAiADLQAAIgdBD3FBkIoDai0AADoAASACIAdBBHZBkIoDai0AADoAACADQQFqIQMgBUEBaiEFIAJBAmohAgwBCwsgAkEAOgAAIAAgASAEQQF0QQMQPwsLdQEDfyACKAIAECshAyACKAIAEGAhAQJAIANFDQAgACABrEIBfBDPAyIERQ0AQQAhAiABQQAgAUEAShshBQNAIAIgBUZFBEAgAiAEaiACIANqLQAAQcDnAWotAAA6AAAgAkEBaiECDAELCyAAIAQgAUEDED8LC4EBAQR/IAIoAgAQKyEDIAIoAgAQYCEBAkAgA0UNACAAIAGsQgF8EM8DIgRFDQBBACECIAFBACABQQBKGyEFA0AgAiAFRkUEQCACIARqIAIgA2otAAAiBiAGQcDqAWotAABBf3NB3wFycToAACACQQFqIQIMAQsLIAAgBCABQQMQPwsLlAICAXwCfyMAQSBrIgQkAAJAIAFBAkYEQCACKAIEIgEQL0EFRg0BIAEQaSIBQR4gAUEeSBsiAUEAIAFBAEobIQULIAIoAgAiARAvQQVGDQAgBCABEFAiAzkDGAJAIANEAAAAAAAAMMNjIANEAAAAAAAAMENkcg0AIAVFBEACfiADRAAAAAAAAOC/RAAAAAAAAOA/IANEAAAAAAAAAABjG6AiA5lEAAAAAAAA4ENjBEAgA7AMAQtCgICAgICAgICAfwu5IQMMAQsgBCADOQMIIAQgBTYCAEGF3gAgBBBKIgFFBEAgABBnDAILIAEgBEEYaiABEDFBARDHARogARAjIAQrAxghAwsgACADEFwLIARBIGokAAt2AgF+AXwCQAJAAkAgAigCACIBEC9BAWsOBQACAgIBAgsgACABEF8iA0IAUwR+IANCgICAgICAgICAf1EEQCAAQeQMQX8QZA8LQgAgA30FIAMLEGMPCyAAEFkPCyAAIAEQUCIEmiAEIAREAAAAAAAAAABjGxBcC7oCAgR/AX4gAUECdEEBcqwQSyIEBEAgAUEAIAFBAEobIQYgBCEBA0AgBSAGRwRAAn9B/f8DIAIgBUECdGooAgAQXyIHp0H///8AcSAHQv//wwBWGyIDQf8ATQRAIAEgAzoAACABQQFqDAELIANB/w9NBEAgASADQT9xQYABcjoAASABIANBBnZBwAFyOgAAIAFBAmoMAQsgA0H//wNNBEAgASADQT9xQYABcjoAAiABIANBDHZB4AFyOgAAIAEgA0EGdkE/cUGAAXI6AAEgAUEDagwBCyABIANBP3FBgAFyOgADIAEgA0ESdkHwAXI6AAAgASADQQZ2QT9xQYABcjoAAiABIANBDHZBP3FBgAFyOgABIAFBBGoLIQEgBUEBaiEFDAELCyAAIAQgASAEa6xBAxDPBg8LIAAQZws9ACMAQRBrIgEkACABIAIoAgAQKyICNgIMAkAgAkUNACACLQAARQ0AIAAgAUEMahDGARCAAQsgAUEQaiQAC40BAQN/IwBBMGsiAyQAIAAQfyEEAkAgAUEATA0AIAIoAgAQKyIFRQ0AIANBADYCJCADIAJBBGo2AiggAyABQQFrNgIgIANBCGoiAiAEQQBBACAEKAJ4EJoBIANBAjoAHSADIANBIGo2AgAgAiAFIAMQPiADKAIYIQEgACACEMUBIAFBARA/CyADQTBqJAAL9AIBB38gAigCACIFEC8iA0EFRiACKAIEEC8iAUEFRnJFBEAgBRBgIQVBASEEAkACQCACKAIEEGAiBkEATARAQQAhA0EAIQIMAQsCQAJAAkACQAJAAkACfyADQQRGIgMgAUEERnEiCARAIAIoAgAQjQIhASACKAIEEI0CDAELIAIoAgAhBCADIAFBBEZyDQEgBBArIQEgAigCBBArCyIHDQNBACEDDAELIAQQlQQiAxArIgENAQtBACECDAMLIAMQYCEFIAIoAgQQlQQiAhArIgdFDQIgAhBgIQYMAQtBACEDIAVFBEBBACECDAELQQAhAiABRQ0BCyAHLQAAIQlBASEEA0AgBSAGSARAQQAhBAwDCwJAIAEtAAAgCUcNACABIAcgBhBRDQAMAwsgBEEBaiEEA0AgAUEBaiEBIAVBAWshBSAIDQEgAS0AAEHAAXFBgAFGDQALDAALAAsgABBnDAELIAAgBBCAAQsgAxCdASACEJ0BCwuIAQEBfwJAAkACQAJAIAIoAgAiARAvQQFrDgQAAAEAAgsgACABEGAQgAEPCyABECsiAUUNASABIQIDQCACLQAAIgMEQCACQQFqIQIgA0HAAUkNAQNAIAItAABBwAFxQYABRw0CIAFBAWohASACQQFqIQIMAAsACwsgACACIAFrEIABDwsgABBZCwsPACAAIAIoAgAQ7wkQgAELHAAgACACKAIAEC9BAnRB7IkDaigCAEF/QQAQPwsJACAAQQEQhwsLCQAgAEEAEIcLC48BAQJ/IAIoAgAhAgJAAkAgAEEoEEciAUUNACABLwEQIQMgAhAvQQVGBEAgA0UNAQwCCyADBEAgABCcByEDIAAQ0gIiBEEAIAEgAiADEKMDIgNBAEgbQQEgBCADQQBMchtFDQIgASACEJMEGg8LIAEgABB/NgIUIAEgAhCTBBoLDwsgAEEBOgAZIABBfzYCFAuVAQEFfyAAENICIQMgABCcByEEAkAgAigCABAvQQVGDQBBf0EAIAMbIQUgAUEBIAFBAUobIQZBACEDQQEhAQNAIAEgBkcEQCACIAFBAnRqKAIAIgcQL0EFRg0CIAMgASACIANBAnRqKAIAIAcgBBCjAyAFc0EASBshAyABQQFqIQEMAQsLIAAgAiADQQJ0aigCABDLAQsLrwQBCH8CQCACKAIAIgMQL0EFRg0AIAMQKyIHRQ0AIAIoAgAQYCEDAkACQAJAIAFBAUYEQEHkiQMhCkHoiQMhBkEBIQUMAQsgAigCBBArIglFDQNBACEBIAkhAgNAIAItAAAiBQRAIAJBAWoiBCECIAVBwAFPBEADQCAEIgJBAWohBCACLQAAQcABcUGAAUYNAAsLIAFBAWohAQwBCwsgAUUNASAAIAGtQgOGEM8DIgZFDQMgBiABQQJ0aiEKQQAhBSAJIQEDQCABLQAABEAgBiAFQQJ0IghqIAE2AgAgAUEBaiIEIQIgAS0AAEHAAU8EQANAIAQiAkEBaiEEIAItAABBwAFxQYABRg0ACwsgCCAKaiACIAFrNgIAIAVBAWohBSACIQEMAQsLIAVFDQELAkAgABDSAiIBQQFxRSADRXINAANAQQAhAkEAIQQDQAJAIAIgBUYNACADIAogAkECdCIIaigCACIETwRAIAcgBiAIaigCACAEEFFFDQELIAJBAWohAgwBCwsgAiAFTw0BIAQgB2ohByADIARrIgMNAAtBACEDCwJAIAFBAnFFIANFckUEQANAIAMhAUEAIQIDQCACIAVGDQMCQCAKIAJBAnQiCGooAgAiBCABTQRAIAcgASAEayIDaiAGIAhqKAIAIAQQUUUNAQsgAkEBaiECDAELC0EAIQEgAw0ADAILAAsgAyEBCyAJRQ0BIAYQIwwBCyADIQELIAAgByABQX8QPwsLFAAgACACKAIAEGkQsQlBf0EAED8LoQEBBH8gAigCABArIgEEQCAAAn8jAEEQayICJAAgAkEMahCyCSABQQBBByABQauJAUEHEEgbaiIEEDEhASACKAIMIgBBACAAQQBKGyEFQQAhAANAAkAgACAFRwRAIAQgAEECdEGwrQNqKAIAIgYgARBIDQEgASAGai0AABCABQ0BQQEhAwsgAkEQaiQAIAMMAgsgAEEBaiEADAALAAsQgAELCw0AIABBgAhBf0EAED8LzgECAn8CfiMAQTBrIgEkACABQRhqIgRBAEEAQQAgAigCABCNAiICKAIUQeQAbEHkAGoQmgEgASACQQRBCCACLQAYG2o1AgA3AxAgBEGjDiABQRBqED4DQCADIAIoAhRORQRAIAEgAigCICADQQJ0aigCAEEBaq0iBSACKAIIIgStfEIBfSAFgCIGQgJRBH5CAkIBIARBCmytIAVCC35WGwUgBgs3AwAgAUEYakGiDiABED4gA0EBaiEDDAELCyAAIAFBGGoQnQcgAUEwaiQAC44CAQN/IAIoAgAQjQIhASACKAIEEGkhAgJAIAEoAggEQCACQQAgAkEAShshBANAIAMgBEYEQANAIAIgASgCEE4NBCACQQJ0IgMgASgCIGoiBCAEKAIAQQFqNgIAIAEoAhwgA2pBATYCACACQQFqIQIMAAsABSABKAIcIANBAnRqIgUgBSgCAEEBajYCACADQQFqIQMMAQsACwALQQAhAgNAIAIgASgCEE4NASABKAIcIAJBAnRqQQE2AgAgAkEBaiECDAALAAsgASABKAIIQQFqIgI2AggCQCABKAIMIgNFDQAgAiADIAEtABgiA0EBamxNDQAgASADQQFqOgAYIAAgASgCICgCAEEA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QCACQacBaw4GAQECAgIAAgsgAS0AB0EBcUUNASADIQIDQCACKAIAIgBFDQEgAEEkaiECQQEhBCABKAIsIABHDQALDAILQQIhBCAFKAIAIgAtAFcNAQJ/AkACQCADKAIIIgIEf0EAIQADQCACKAIAIABKBEBBACACIABBBHRqKAIIIAFBfxBrRQ0EIABBAWohACADKAIIIQIMAQsLIAUoAgAFIAALIAFBABA2IgBFDQAgAC0AAEGoAUcNACAAQawBOgAACyADIAUgAygCCCAAEDsiAjYCCEF/IQBBAQwBCyADKAIIIQJBAAshBiACBEAgASABKAIEIgJBgICAwAByNgIEIAUoAgAgARAuIAFBAEE0ECgiAUGnAToAACABIAYEfyADKAIIKAIAQQFrBSAACzsBICABIAMoAgAoAjA2AhwgAygCDCEAIAEgAkGABHE2AgQgASAANgIsCyAFKAIALQBXDQELQQAhBAsgBAswAQJ/IAEgACgCGCICKAIQIgNGBEBBAA8LIAIgATYCECAAIAEQahogAiADNgIQQQELqgEBA38CQCABKAIEQYCABXENACABKAIoIgJFDQAgAS4BIiEDIAAoAgAiBCgCACEAAkAgAS0AAEGpAUYEQCACKAIcIANBFGxqKAIEIAFHDQIgACABQQAQNiIBRQ0CIAIoAhwgA0EUbGogATYCBAwBCyACKAIoIANBFGxqKAIAIAFHDQEgACABQQAQNiIBRQ0BIAIoAiggA0EUbGogATYCAAsgBCABENcHC0EAC9wGAQh/IAAoAhgiAygCCCEEIAMoAgAhBQJAAkACQAJAIAEtAABBpwFrDgMAAQADCyADKAIEIgBFDQEgACgCACIDQQAgA0EAShshAyAAQQhqIQBBASEGA0AgAiADRg0DIAEoAhwiByAAKAIoRgRAQQAhACAEKAIgIgJBACACQQBKGyEDIAQoAhwhAgJAA0AgACADRwRAIAcgAigCCEYEQCACLwEQIAEvASBGDQMLIAJBFGohAiAAQQFqIQAMAQsLIAUoAgAhAiMAQRBrIgAkACAEIAIgBCgCHCAEQSBqIABBDGoQlAs2AhwgACgCDCECIABBEGokACACIgBBAEgNACAEKAIcIABBFGxqIgMgASgCLDYCACADIAEoAhwiBzYCCCADIAEvASAiCDsBECAFIAUoAixBAWoiAjYC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QQFGDQILIAAtAABBpwFHDQAgACgCLCIARQ0AIAAtACtBAUYNAQtBACECCyACCzIAAkAgACgCACIAKAKIAkUNACABKAI0DQAgARDIBygCQCIBRQ0AIAAgASgCCDYCiAILCwMAAQsLACAAQQA7ARRBAgsmACAAKAIQKAIcQShqQdzcAEEAEKgBGiAAIAEoAgQQOSAAIAEQJwsLloQExwIAQYAIC+feATMuMzkuMwB7fQAlcy4legBhZmZpbml0eQBSZWFsQWZmaW5pdHkAYnVzeQB0ZW1wX3N0b3JlX2RpcmVjdG9yeQBub3QgYSB3cml0YWJsZSBkaXJlY3RvcnkAb3BlbkRpcmVjdG9yeQBzaHJpbmtfbWVtb3J5AG91dCBvZiBtZW1vcnkAZmFpbGVkIHRvIGFsbG9jYXRlICV1IGJ5dGVzIG9mIG1lbW9yeQBIQVZJTkcgY2xhdXNlIG9uIGEgbm9uLWFnZ3JlZ2F0ZSBxdWVyeQBJbnRDb3B5AFNDb3B5AFZEZXN0cm95AE11bHRpcGx5AHF1ZXJ5X29ubHkAdW5saWtlbHkAdGFibGUgIiVzIiBoYXMgbW9yZSB0aGFuIG9uZSBwcmltYXJ5IGtleQBmb3JlaWduIGtleQBqc29uX2dyb3VwX2FycmF5AGpzb25fYXJyYXkAanVsaWFuZGF5AGZ0czRhdXgAdW5peABzcWxpdGVfcmVuYW1lX3F1b3RlZml4AHByZWZpeABMSUtFIG9yIEdMT0IgcGF0dGVybiB0b28gY29tcGxleABoZXgAY2hhcmluZGV4AE9wZW5BdXRvaW5kZXgAYXV0b21hdGljX2luZGV4AGF1dG8taW5kZXgAb3JwaGFuIGluZGV4AERyb3BJbmRleABpZHgAUmVvcGVuSWR4AHBjeABtYXgATWVtTWF4ACUwMngAMHgAIEZST00gJyVxJy4nJXElcycgQVMgeABDUkVBVEUgVEFCTEUgeABydwBwc293AGltcGxpZXNfbm9ubnVsbF9yb3cAbm93AGludGVnZXIgb3ZlcmZsb3cAcGFyc2VyIHN0YWNrIG92ZXJmbG93AHdpbmRvdwBzaGFkb3cAUmVzdWx0Um93AElmTnVsbFJvdwBuZXcAbm8gc3VjaCB2aWV3AGNhbm5vdCBtb2RpZnkgJXMgYmVjYXVzZSBpdCBpcyBhIHZpZXcAQ2Fubm90IGFkZCBhIGNvbHVtbiB0byBhIHZpZXcAY2Fubm90IFVQU0VSVCBhIHZpZXcAUHJldgBzdGRldgAgJWxsdQAlYyV1ACUuKno6JXUARnJhZ21lbnRhdGlvbiBvZiAlZCBieXRlcyByZXBvcnRlZCBhcyAlZCBvbiBwYWdlICV1AE11bHRpcGxlIHVzZXMgZm9yIGJ5dGUgJXUgb2YgcGFnZSAldQB1bmFibGUgdG8gdXNlIGZ1bmN0aW9uICVzIGluIHRoZSByZXF1ZXN0ZWQgY29udGV4dABTb3J0ZXJOZXh0AFZOZXh0AGluY29tcGxldGUgaW5wdXQAYnVzeV90aW1lb3V0AGxvY2FsaG9zdABjYW5ub3QgZHJvcCBjb2x1bW4gIiVzIjogbm8gb3RoZXIgY29sdW1ucyBleGlzdABwZXJzaXN0AGZvcmVpZ25fa2V5X2xpc3QAaW5kZXhfbGlzdABmdW5jdGlvbl9saXN0AGNvbGxhdGlvbl9saXN0AGRhdGFiYXNlX2xpc3QAbW9kdWxlX2xpc3QAUFJBR01BIHRhYmxlX2xpc3QAcHJhZ21hX2xpc3QAc2V0IGxpc3QAVmFsdWVMaXN0AHNxbGl0ZV9yZW5hbWVfdGVzdABSb3dTZXRUZXN0AFNlcXVlbmNlVGVzdABmYXN0AExhc3QAQ2FzdABzcXJ0AFNvcnRlclNvcnQAanNvbl9pbnNlcnQASWR4SW5zZXJ0AFNvcnRlckluc2VydAByZXN0YXJ0AGNvdABCaXROb3QASWZOb3QAUGFnZWNvdW50AGZyZWVsaXN0X2NvdW50AG1heF9wYWdlX2NvdW50AFJlc2V0Q291bnQAd2FsX2F1dG9jaGVja3BvaW50AHdhbF9jaGVja3BvaW50AENoZWNrcG9pbnQAU2F2ZXBvaW50AGEgQ0hFQ0sgY29uc3RyYWludAAlc09OIENPTkZMSUNUIGNsYXVzZSBkb2VzIG5vdCBtYXRjaCBhbnkgUFJJTUFSWSBLRVkgb3IgVU5JUVVFIGNvbnN0cmFpbnQAQ3Vyc29ySGludABfY29udGVudABwYXJlbnQARElTVElOQ1QgYWdncmVnYXRlcyBtdXN0IGhhdmUgZXhhY3RseSBvbmUgYXJndW1lbnQAY29tbWVudABBUEkgY2FsbGVkIHdpdGggZmluYWxpemVkIHByZXBhcmVkIHN0YXRlbWVudABBUEkgY2FsbGVkIHdpdGggTlVMTCBwcmVwYXJlZCBzdGF0ZW1lbnQATWF4UGdjbnQAZGVmYXVsdCB2YWx1ZSBvZiBjb2x1bW4gWyVzXSBpcyBub3QgY29uc3RhbnQATXVzdEJlSW50AENhbm5vdCBhZGQgYSBjb2x1bW4gd2l0aCBub24tY29uc3RhbnQgZGVmYXVsdABIYWx0AGxhbm9pdABzdGF0X2luaXQASW5pdABBdXRvQ29tbWl0AGFuYWx5c2lzX2xpbWl0AHNvZnRfaGVhcF9saW1pdABoYXJkX2hlYXBfbGltaXQAam91cm5hbF9zaXplX2xpbWl0AE9mZnNldExpbWl0AFNlZWtIaXQAT04gY2xhdXNlIHJlZmVyZW5jZXMgdGFibGVzIHRvIGl0cyByaWdodABTaGlmdFJpZ2h0AGhnaHQAU2hpZnRMZWZ0AE9mZnNldAByZXNldABqc29uX3NldAB0b28gbWFueSBjb2x1bW5zIGluIHJlc3VsdCBzZXQAJXIgT1JERVIgQlkgdGVybSBkb2VzIG5vdCBtYXRjaCBhbnkgY29sdW1uIGluIHRoZSByZXN1bHQgc2V0AHNuaXBwZXQAc3RhdF9nZXQAc3FsaXRlX2NvbXBpbGVvcHRpb25fZ2V0AHN0cmljdABOb0NvbmZsaWN0AGpzb25fZ3JvdXBfb2JqZWN0AGpzb25fb2JqZWN0AGpzb25fZXh0cmFjdABTdWJ0cmFjdABsc3RhdABmc3RhdAAlc19zdGF0AHRibCxpZHgsc3RhdAB1bnN1cHBvcnRlZCBmaWxlIGZvcm1hdABncm91cF9jb25jYXQAQ29uY2F0AEx0AEd0AGRlZmVyX2ZvcmVpZ25fa2V5cwBhbHdheXMAcGFyYW1ldGVycyBhcmUgbm90IGFsbG93ZWQgaW4gdmlld3MAc3RhdHVzAHN5bmNocm9ub3VzAGluZGV4ICVzIGFscmVhZHkgZXhpc3RzAG91dHB1dCBmaWxlIGFscmVhZHkgZXhpc3RzACVzICVUIGFscmVhZHkgZXhpc3RzAHRyaWdnZXIgJVQgYWxyZWFkeSBleGlzdHMATm90RXhpc3RzAGlnbm9yZV9jaGVja19jb25zdHJhaW50cwBDSEVDSyBjb25zdHJhaW50cwBleHByZXNzaW9ucyBwcm9oaWJpdGVkIGluIFBSSU1BUlkgS0VZIGFuZCBVTklRVUUgY29uc3RyYWludHMAanNvbl9vYmplY3QoKSByZXF1aXJlcyBhbiBldmVuIG51bWJlciBvZiBhcmd1bWVudHMAanNvbl8lcygpIG5lZWRzIGFuIG9kZCBudW1iZXIgb2YgYXJndW1lbnRzACVzX3NlZ21lbnRzAHVuYWJsZSB0byBkZWxldGUvbW9kaWZ5IHVzZXItZnVuY3Rpb24gZHVlIHRvIGFjdGl2ZSBzdGF0ZW1lbnRzAHVuYWJsZSB0byBkZWxldGUvbW9kaWZ5IGNvbGxhdGlvbiBzZXF1ZW5jZSBkdWUgdG8gYWN0aXZlIHN0YXRlbWVudHMAb2Zmc2V0cwByZXZlcnNlX3Vub3JkZXJlZF9zZWxlY3RzAGlpc3Nzc3NzAGlzcwBzZXNzAHVuY29tcHJlc3MAY2Fubm90IG9wZW4gc2F2ZXBvaW50IC0gU1FMIHN0YXRlbWVudHMgaW4gcHJvZ3Jlc3MAY2Fubm90IHJlbGVhc2Ugc2F2ZXBvaW50IC0gU1FMIHN0YXRlbWVudHMgaW4gcHJvZ3Jlc3MAY2Fubm90IGNvbW1pdCB0cmFuc2FjdGlvbiAtIFNRTCBzdGF0ZW1lbnRzIGluIHByb2dyZXNzAGNhbm5vdCBWQUNVVU0gLSBTUUwgc3RhdGVtZW50cyBpbiBwcm9ncmVzcwBhY2Nlc3MAcGFyYW1ldGVycwByZWN1cnNpdmVfdHJpZ2dlcnMAdGhlIElOREVYRUQgQlkgY2xhdXNlIGlzIG5vdCBhbGxvd2VkIG9uIFVQREFURSBvciBERUxFVEUgc3RhdGVtZW50cyB3aXRoaW4gdHJpZ2dlcnMAdGhlIE5PVCBJTkRFWEVEIGNsYXVzZSBpcyBub3QgYWxsb3dlZCBvbiBVUERBVEUgb3IgREVMRVRFIHN0YXRlbWVudHMgd2l0aGluIHRyaWdnZXJzAHF1YWxpZmllZCB0YWJsZSBuYW1lcyBhcmUgbm90IGFsbG93ZWQgb24gSU5TRVJULCBVUERBVEUsIGFuZCBERUxFVEUgc3RhdGVtZW50cyB3aXRoaW4gdHJpZ2dlcnMAQ2hpbGQgcGFnZSBkZXB0aCBkaWZmZXJzAHVuYWJsZSB0byBjbG9zZSBkdWUgdG8gdW5maW5hbGl6ZWQgc3RhdGVtZW50cyBvciB1bmZpbmlzaGVkIGJhY2t1cHMAYWNvcwBJZlBvcwBjb21waWxlX29wdGlvbnMARElTVElOQ1QgaXMgbm90IHN1cHBvcnRlZCBmb3Igd2luZG93IGZ1bmN0aW9ucwBGSUxURVIgY2xhdXNlIG1heSBvbmx5IGJlIHVzZWQgd2l0aCBhZ2dyZWdhdGUgd2luZG93IGZ1bmN0aW9ucwBub24tZGV0ZXJtaW5pc3RpYyBmdW5jdGlvbnMAaW5kZXggZXhwcmVzc2lvbnMAU0VMRUNUcyB0byB0aGUgbGVmdCBhbmQgcmlnaHQgb2YgJXMgZG8gbm90IGhhdmUgdGhlIHNhbWUgbnVtYmVyIG9mIHJlc3VsdCBjb2x1bW5zAHZpcnR1YWwgdGFibGVzIGNhbm5vdCB1c2UgY29tcHV0ZWQgY29sdW1ucwBnZW5lcmF0ZWQgY29sdW1ucwB0YWJsZSAlcyBoYXMgJWQgdmFsdWVzIGZvciAlZCBjb2x1bW5zAHJhZGlhbnMAYWxsIFZBTFVFUyBtdXN0IGhhdmUgdGhlIHNhbWUgbnVtYmVyIG9mIHRlcm1zAGVtcHR5X3Jlc3VsdF9jYWxsYmFja3MATG9hZEFuYWx5c2lzAGZsZ3MAZmxhZ3MAdmZzACVkIGNvbHVtbnMgYXNzaWduZWQgJWQgdmFsdWVzAEpTT04gY2Fubm90IGhvbGQgQkxPQiB2YWx1ZXMAZmFpbGVkIG1lbW9yeSByZXNpemUgJXUgdG8gJXUgYnl0ZXMAcGFydGlhbCBpbmRleCBXSEVSRSBjbGF1c2VzAHNob3J0X2NvbHVtbl9uYW1lcwBmdWxsX2NvbHVtbl9uYW1lcwB1bmFibGUgdG8gb3BlbiBhIHRlbXBvcmFyeSBkYXRhYmFzZSBmaWxlIGZvciBzdG9yaW5nIHRlbXBvcmFyeSB0YWJsZXMAY2Fubm90IGNyZWF0ZSB0cmlnZ2VycyBvbiB2aXJ0dWFsIHRhYmxlcwAlcyBSRVRVUk5JTkcgaXMgbm90IGF2YWlsYWJsZSBvbiB2aXJ0dWFsIHRhYmxlcwBjYW5ub3Qgam9pbiB1c2luZyBjb2x1bW4gJXMgLSBjb2x1bW4gbm90IHByZXNlbnQgaW4gYm90aCB0YWJsZXMAQVVUT0lOQ1JFTUVOVCBub3QgYWxsb3dlZCBvbiBXSVRIT1VUIFJPV0lEIHRhYmxlcwAlcyBjYW5ub3QgdXNlIHZhcmlhYmxlcwB0b28gbWFueSBTUUwgdmFyaWFibGVzAHN1YnF1ZXJpZXMAY2Fubm90IHVzZSB3aW5kb3cgZnVuY3Rpb25zIGluIHJlY3Vyc2l2ZSBxdWVyaWVzAGNvdW50X2NoYW5nZXMAdG90YWxfY2hhbmdlcwBkZWdyZWVzAFJFVFVSTklORyBtYXkgbm90IHVzZSAiVEFCTEUuKiIgd2lsZGNhcmRzAHRocmVhZHMAYWJzAC4lLipzAENSRUFURSAlcyAlLipzAENSRUFURSVzIElOREVYICUuKnMAaW52YWxpZCB1cmkgYXV0aG9yaXR5OiAlLipzAHVua25vd24gdGFibGUgb3B0aW9uOiAlLipzACUuKnMlcwAsJXMlcyVzAFNDQU4gJXMlcyVzAHNxbGl0ZV9hbHRlcnRhYl8lcwBTQ0FOICVkIENPTlNUQU5UIFJPVyVzACVRJXMAIFZJUlRVQUwgVEFCTEUgSU5ERVggJWQ6JXMAJXM6ICVzLiVzLiVzAG1pc3NpbmcgZGF0YXR5cGUgZm9yICVzLiVzAGNhbm5vdCBzdG9yZSAlcyB2YWx1ZSBpbiAlcyBjb2x1bW4gJXMuJXMAbm9uLSVzIHZhbHVlIGluICVzLiVzAE5VTEwgdmFsdWUgaW4gJXMuJXMAJXM6ICVzLiVzAG5vIHN1Y2ggdGFibGUgY29sdW1uOiAlcy4lcwAuLiVzACUuMThzLSVzACBVU0lORyBJTlRFR0VSIFBSSU1BUlkgS0VZICglcwB1c2UgRFJPUCBWSUVXIHRvIGRlbGV0ZSB2aWV3ICVzAGlsbGVnYWwgZmlyc3QgYXJndW1lbnQgdG8gJXMAbWlzdXNlIG9mIGFsaWFzZWQgd2luZG93IGZ1bmN0aW9uICVzAHRvbyBtYW55IGNvbHVtbnMgb24gJXMAdG9vIG1hbnkgY29sdW1ucyBpbiAlcwAlcyBwcm9oaWJpdGVkIGluICVzAENIRUNLIGNvbnN0cmFpbnQgZmFpbGVkIGluICVzAG5vbi1kZXRlcm1pbmlzdGljIHVzZSBvZiAlcygpIGluICVzAHJlY292ZXJlZCAlZCBwYWdlcyBmcm9tICVzAG1pc3VzZSBvZiBhbGlhc2VkIGFnZ3JlZ2F0ZSAlcwAlcyAlVCBjYW5ub3QgcmVmZXJlbmNlIG9iamVjdHMgaW4gZGF0YWJhc2UgJXMAY2Fubm90IGRldGFjaCBkYXRhYmFzZSAlcwBhIEpPSU4gY2xhdXNlIGlzIHJlcXVpcmVkIGJlZm9yZSAlcwBjYW5ub3Qgb3BlbiB2YWx1ZSBvZiB0eXBlICVzAGNhbm5vdCBmc3RhdCBkYiBmaWxlICVzAHJlY292ZXJlZCAlZCBmcmFtZXMgZnJvbSBXQUwgZmlsZSAlcwBQUklNQVJZIEtFWSBtaXNzaW5nIG9uIHRhYmxlICVzAHVzZSBEUk9QIFRBQkxFIHRvIGRlbGV0ZSB0YWJsZSAlcwBTRUxFQ1QgJXMgT1JERVIgQlkgcm93aWQgJXMAU0VMRUNUICVzIFdIRVJFIHJvd2lkIEJFVFdFRU4gJWxsZCBBTkQgJWxsZCBPUkRFUiBCWSByb3dpZCAlcwB0aGVyZSBpcyBhbHJlYWR5IGFuIGluZGV4IG5hbWVkICVzAHRhYmxlICVTIGhhcyBubyBjb2x1bW4gbmFtZWQgJXMAdGhlcmUgaXMgYWxyZWFkeSBhIHRhYmxlIG5hbWVkICVzAHN0YXRlbWVudCBhYm9ydHMgYXQgJWQ6IFslc10gJXMAQ09WRVJJTkcgSU5ERVggJXMAU0VMRUNUICVzAHVuc3VwcG9ydGVkIHVzZSBvZiBOVUxMUyAlcwBVU0UgVEVNUCBCLVRSRUUgRk9SICVzAC0tIFRSSUdHRVIgJXMAUklHSFQtSk9JTiAlcwA+PyBBTkQgJXMAJXo6ICVzAHJlY3Vyc2l2ZSByZWZlcmVuY2UgaW4gYSBzdWJxdWVyeTogJXMAdnRhYmxlIGNvbnN0cnVjdG9yIGNhbGxlZCByZWN1cnNpdmVseTogJXMAbm8gc3VjaCBpbmRleDogJXMAbm8gc3VjaCB3aW5kb3c6ICVzAGNhbm5vdCBvdmVycmlkZSAlcyBvZiB3aW5kb3c6ICVzAGNhbm5vdCBvcGVuIHZpZXc6ICVzAG5vIHN1Y2ggc2F2ZXBvaW50OiAlcwBubyBzdWNoIHZmczogJXMAbXVsdGlwbGUgcmVjdXJzaXZlIHJlZmVyZW5jZXM6ICVzAGVycm9yIGluICVzICVzJXMlczogJXMAZXJyb3IgaW4gJXMgJXMgYWZ0ZXIgJXM6ICVzAHVua25vd24gdG9rZW5pemVyOiAlcwBlcnJvciBwYXJzaW5nIHByZWZpeCBwYXJhbWV0ZXI6ICVzAHVucmVjb2duaXplZCBwYXJhbWV0ZXI6ICVzAHVucmVjb2duaXplZCBvcmRlcjogJXMAdW5yZWNvZ25pemVkIG1hdGNoaW5mbzogJXMAbm8gc3VjaCBjb2x1bW46ICVzAGZpbGUgcmVuYW1lZCB3aGlsZSBvcGVuOiAlcwBmaWxlIHVubGlua2VkIHdoaWxlIG9wZW46ICVzAHVuc3VwcG9ydGVkIGVuY29kaW5nOiAlcwBjYW5ub3QgbGltaXQgV0FMIHNpemU6ICVzAE1KIGRlbGV0ZTogJXMAdGFyZ2V0IG9iamVjdC9hbGlhcyBtYXkgbm90IGFwcGVhciBpbiBGUk9NIGNsYXVzZTogJXMAb2JqZWN0IG5hbWUgcmVzZXJ2ZWQgZm9yIGludGVybmFsIHVzZTogJXMAdW5rbm93biBkYXRhYmFzZTogJXMAdW5hYmxlIHRvIG9wZW4gZGF0YWJhc2U6ICVzAG5vIHN1Y2ggZGF0YWJhc2U6ICVzAHRoZXJlIGlzIGFscmVhZHkgYW5vdGhlciB0YWJsZSBvciBpbmRleCB3aXRoIHRoaXMgbmFtZTogJXMAZHVwbGljYXRlIGNvbHVtbiBuYW1lOiAlcwBkdXBsaWNhdGUgV0lUSCB0YWJsZSBuYW1lOiAlcwBubyBzdWNoIG1vZHVsZTogJXMAbXVsdGlwbGUgbGlua3MgdG8gZmlsZTogJXMAY2Fubm90IG9wZW4gdmlydHVhbCB0YWJsZTogJXMAbm8gc3VjaCB0YWJsZTogJXMAbXVsdGlwbGUgcmVmZXJlbmNlcyB0byByZWN1cnNpdmUgdGFibGU6ICVzAG5vIHN1Y2ggJXMgbW9kZTogJXMATUogY29sbGlkZTogJXMAbm8gc3VjaCBjb2xsYXRpb24gc2VxdWVuY2U6ICVzAGNpcmN1bGFyIHJlZmVyZW5jZTogJXMAY2Fubm90IG9wZW4gdGFibGUgd2l0aG91dCByb3dpZDogJXMAJXMgbW9kZSBub3QgYWxsb3dlZDogJXMAdnRhYmxlIGNvbnN0cnVjdG9yIGZhaWxlZDogJXMAYXV0b21hdGljIGV4dGVuc2lvbiBsb2FkaW5nIGZhaWxlZDogJXMAZGF0YWJhc2UgdGFibGUgaXMgbG9ja2VkOiAlcwBkYXRhYmFzZSBzY2hlbWEgaXMgbG9ja2VkOiAlcwB2dGFibGUgY29uc3RydWN0b3IgZGlkIG5vdCBkZWNsYXJlIHNjaGVtYTogJXMAYWJvcnQgYXQgJWQgaW4gWyVzXTogJXMALS0gJXMAJXogLSAlcwBvc191bml4LmM6JWQ6ICglZCkgJXMoJXMpIC0gJXMAd3IAcmlnaHRzdHIAbGVmdHN0cgBpbnN0cgBzdWJzdHIAZXhwcl9pbXBsaWVzX2V4cHIAaW52YWxpZCBhcmd1bWVudHMgdG8gZnRzNGF1eCBjb25zdHJ1Y3RvcgBtaXNzaW5nICVzIHBhcmFtZXRlciBpbiBmdHM0IGNvbnN0cnVjdG9yAHRoZSAiLiIgb3BlcmF0b3IAZnRzM2N1cnNvcgBuZWFyICIlVCI6IHN5bnRheCBlcnJvcgB1bmtub3duIGVycm9yAGRvbWFpbiBlcnJvcgBub3QgYW4gZXJyb3IAU1FMIGxvZ2ljIGVycm9yAGRpc2sgSS9PIGVycm9yAGZsb29yAHJtZGlyAG1rZGlyAHNlZ2RpcgBmdHMzX3Rva2VuaXplcgB1bmtub3duIHRva2VuaXplcgBwb3dlcgBsb3dlcgBzcWxpdGVfdGVtcF9tYXN0ZXIAc3FsaXRlX21hc3RlcgBwb3J0ZXIAUmVzZXRTb3J0ZXIARmtDb3VudGVyAEFQSSBjYWxsIHdpdGggJXMgZGF0YWJhc2UgY29ubmVjdGlvbiBwb2ludGVyAHN0cmZpbHRlcgBWRmlsdGVyAEVTQ0FQRSBleHByZXNzaW9uIG11c3QgYmUgYSBzaW5nbGUgY2hhcmFjdGVyAHVwcGVyAHByb3BlcgBJZlNtYWxsZXIAY2Fubm90IHVzZSBSRVRVUk5JTkcgaW4gYSB0cmlnZ2VyAERyb3BUcmlnZ2VyAHNlY29uZCBhcmd1bWVudCB0byBudGhfdmFsdWUgbXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXIAYXJndW1lbnQgb2YgbnRpbGUgbXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXIAZnJhbWUgc3RhcnRpbmcgb2Zmc2V0IG11c3QgYmUgYSBub24tbmVnYXRpdmUgaW50ZWdlcgBmcmFtZSBlbmRpbmcgb2Zmc2V0IG11c3QgYmUgYSBub24tbmVnYXRpdmUgaW50ZWdlcgBJbnRlZ2VyAFJvd2lkICVsbGQgb3V0IG9mIG9yZGVyAFJlbWFpbmRlcgBmcmFtZSBzdGFydGluZyBvZmZzZXQgbXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBudW1iZXIAZnJhbWUgZW5kaW5nIG9mZnNldCBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIG51bWJlcgBhZGRyAHBhZHIAY2hhcgB5ZWFyAENsZWFyAEJpdE9yAHNlcQBDb2xsU2VxAEVsc2VFcQByZWdleHAAT3BlbkR1cABOb29wAEp1bXAAL3Vzci90bXAAL3Zhci90bXAAdGVtcABjdXJyZW50X3RpbWVzdGFtcABBZ2dTdGVwAG1vZGVTdGVwAHZhcmlhbmNlU3RlcABtdW5tYXAAbW1hcABtcmVtYXAAdnRhYjolcABzc2Vuc3VvAGlsc3VvAGF1dG8AR290bwBpbnRvAGluY3JlbWVudGFsX3ZhY3V1bSBlbmFibGVkIHdpdGggYSBtYXggcm9vdHBhZ2Ugb2YgemVybwBJZk5vdFplcm8ARGVjckp1bXBaZXJvAEZrSWZaZXJvAHNlcW5vAGluZGV4X3hpbmZvAHRhYmxlX3hpbmZvAG1hdGNoaW5mbwBpbmRleF9pbmZvAHRhYmxlX2luZm8AT3BlblBzZXVkbwBmY2hvd24AQmVnaW5TdWJydG4AUmV0dXJuAGpzb24Abm8gcXVlcnkgc29sdXRpb24AaW5kZXggY29ycnVwdGlvbgBkYXRhYmFzZSBjb3JydXB0aW9uAGZyZWUgc3BhY2UgY29ycnVwdGlvbgB1bmtub3duIGNvbHVtbiAiJXMiIGluIGZvcmVpZ24ga2V5IGRlZmluaXRpb24AJXMueEJlc3RJbmRleCBtYWxmdW5jdGlvbgBhdXRob3JpemVyIG1hbGZ1bmN0aW9uACUjVCgpIG1heSBub3QgYmUgdXNlZCBhcyBhIHdpbmRvdyBmdW5jdGlvbgAnJXMnIGlzIG5vdCBhIGZ1bmN0aW9uAEZ1bmN0aW9uAGNhbm5vdCBzdGFydCBhIHRyYW5zYWN0aW9uIHdpdGhpbiBhIHRyYW5zYWN0aW9uAGNhbm5vdCBjaGFuZ2UgJXMgd2FsIG1vZGUgZnJvbSB3aXRoaW4gYSB0cmFuc2FjdGlvbgB0ZW1wb3Jhcnkgc3RvcmFnZSBjYW5ub3QgYmUgY2hhbmdlZCBmcm9tIHdpdGhpbiBhIHRyYW5zYWN0aW9uAGNhbm5vdCBWQUNVVU0gZnJvbSB3aXRoaW4gYSB0cmFuc2FjdGlvbgBTYWZldHkgbGV2ZWwgbWF5IG5vdCBiZSBjaGFuZ2VkIGluc2lkZSBhIHRyYW5zYWN0aW9uAFRyYW5zYWN0aW9uAFBlcm11dGF0aW9uAHVua25vd24gb3BlcmF0aW9uAHVuc3VwcG9ydGVkIGZyYW1lIHNwZWNpZmljYXRpb24AUkFOR0Ugd2l0aCBvZmZzZXQgUFJFQ0VESU5HL0ZPTExPV0lORyByZXF1aXJlcyBvbmUgT1JERVIgQlkgZXhwcmVzc2lvbgB0b28gbWFueSBsZXZlbHMgb2YgdHJpZ2dlciByZWN1cnNpb24AdXNlcl92ZXJzaW9uAHNxbGl0ZV92ZXJzaW9uAGRhdGFfdmVyc2lvbgBzY2hlbWFfdmVyc2lvbgBzcWxpdGVfZHJvcF9jb2x1bW4Ac3FsaXRlX3JlbmFtZV9jb2x1bW4AYWZ0ZXIgZHJvcCBjb2x1bW4Abm8gc3VjaCBjb2x1bW4AbXVzdCBoYXZlIGF0IGxlYXN0IG9uZSBub24tZ2VuZXJhdGVkIGNvbHVtbgBjYW5ub3QgdXNlIERFRkFVTFQgb24gYSBnZW5lcmF0ZWQgY29sdW1uAGFkZCBjb2x1bW4AQ2Fubm90IGFkZCBhIFBSSU1BUlkgS0VZIGNvbHVtbgBDYW5ub3QgYWRkIGEgVU5JUVVFIGNvbHVtbgBjYW5ub3QgYWRkIGEgU1RPUkVEIGNvbHVtbgBWQ29sdW1uAGJ1aWx0aW4AYXNpbgBhdCBtb3N0ICVkIHRhYmxlcyBpbiBhIGpvaW4AbWluAG9yaWdpbgBWQmVnaW4AbWFpbgBFeHBsYWluAHNpZ24Ac3NlbgBvcGVuAElmTm90T3BlbgBTb3J0ZXJPcGVuAFZPcGVuAGhpZGRlbgBhdGFuAG1lZGlhbgBTZWVrU2NhbgBWSW5pdEluAGF1dG9fdmFjdXVtAGluY3JlbWVudGFsX3ZhY3V1bQBJbmNyVmFjdXVtAHN1bQBkcm9wIGNvbHVtbiBmcm9tAC9kZXYvdXJhbmRvbQBBZGRJbW0AcnRyaW0AbHRyaW0AcmVhZG9ubHlfc2htACVzLXNobQB0bmVtAFJBSVNFKCkgbWF5IG9ubHkgYmUgdXNlZCB3aXRoaW4gYSB0cmlnZ2VyLXByb2dyYW0AUHJvZ3JhbQBQYXJhbQBmdWwAZmNudGwAaW9jdGwAaWdvbABsb2NraW5nIHByb3RvY29sAG5jb2wAbm90bnVsbABpZm51bGwAL2Rldi9udWxsAGRhdGFiYXNlIG9yIGRpc2sgaXMgZnVsbABOb3ROdWxsAFNvZnROdWxsAElzTnVsbABaZXJvT3JOdWxsAEhhbHRJZk51bGwAY29sbABjYWNoZV9zcGlsbABSb3dDZWxsAGNlaWwAZGV0YWlsAHBhZGwAdW5peC1leGNsAHRibAB3YWwAdmlydHVhbAB0b3RhbABpbmNyZW1lbnRhbABPcGVuRXBoZW1lcmFsAEFnZ0ZpbmFsAG5vcm1hbABJbmRleCBhbHJlYWR5IG9wdGltYWwAcGFydGlhbAByZWFsAFJlYWwAcGsAb2sAdW5saW5rAHJlYWRsaW5rAEZpbmlzaFNlZWsARGVmZXJyZWRTZWVrAG5vbG9jawBDdXJzb3JVbmxvY2sAYmxvY2sAJXMubG9jawBDdXJzb3JMb2NrAFRhYmxlTG9jawBpbnRlZ3JpdHlfY2hlY2sAZm9yZWlnbl9rZXlfY2hlY2sAcXVpY2tfY2hlY2sAY2VsbF9zaXplX2NoZWNrAGludGVncml0eS1jaGVjawBGa0NoZWNrAFR5cGVDaGVjawBJbnRlZ3JpdHlDawByZXppAG5vaXRhemkAaXRpdmkAc3NlbmV2aQBpdGkAaXNzaXNpAGlzaXNpAHBpAG5vaQBnbmkAc2lzc2lpAGlzc2lzaWkAc3NzaWlpAHNlaQBpdGljaQBldGFjaQBsYWNpAGNvdGgAbW9udGgAanNvbl9hcnJheV9sZW5ndGgAb3ZlcmZsb3cgbGlzdCBsZW5ndGgAd2R0aABzdGF0X3B1c2gAYWNvc2gAYXNpbmgAYXRhbmgAanNvbl9wYXRjaABkYXRhdHlwZSBtaXNtYXRjaABhcmd1bWVudCB0eXBlIG1pc21hdGNoAGFiYnJldmlhdGVkIHF1ZXJ5IGFsZ29yaXRobSBzZWFyY2gAdW5peGVwb2NoAHNxbGl0ZV9hdHRhY2gAc3FsaXRlX2RldGFjaABqc29uX2VhY2gAYXZnAG5hcmcAc3FsaXRlX2xvZwBzdGF0ZW1lbnQgdG9vIGxvbmcAY2Fubm90IG9wZW4gJXMgY29sdW1uIGZvciB3cml0aW5nAHN1YnN0cmluZwBTdHJpbmcAc3FsaXRlX3JldHVybmluZwBlbmNvZGluZwBzdHJpbmcgb3IgYmxvYiB0b28gYmlnAFJlbGVhc2VSZWcAJS4xNmcAJSEuMTVnAHNzZW5sdWYAcHJpbnRmAHR5cGVvZgBtb2Rlb2YAb3V0IG9mAHJlbmFtZSBjb2x1bW5zIG9mAG51bGxpZgBpaWYAb2ZmADAxMjM0NTY3ODlhYmNkZWYASWYAJTA2LjNmACUuKmYAZ2V0cGFnZXNpemUAZG9jc2l6ZQBtbWFwX3NpemUAZGVmYXVsdF9jYWNoZV9zaXplAFBSQUdNQSAlUS5wYWdlX3NpemUAZnRzM3Rva2VuaXplAG9wdGltaXplAGpzb25fcmVtb3ZlAE1vdmUAY2Fubm90IGNvbW1pdCAtIG5vIHRyYW5zYWN0aW9uIGlzIGFjdGl2ZQBjYW5ub3Qgcm9sbGJhY2sgLSBubyB0cmFuc2FjdGlvbiBpcyBhY3RpdmUAZXhjbHVzaXZlAHRydWUASXNUcnVlAHVuaXF1ZQBkZmx0X3ZhbHVlAENhbm5vdCBhZGQgYSBSRUZFUkVOQ0VTIGNvbHVtbiB3aXRoIG5vbi1OVUxMIGRlZmF1bHQgdmFsdWUAQWdnVmFsdWUAanNvbl9xdW90ZQBwd3JpdGUAT3BlbldyaXRlAG9uX2RlbGV0ZQBzZWN1cmVfZGVsZXRlAElkeERlbGV0ZQBwcml2YXRlAGFnZ3JlZ2F0ZQBWQ3JlYXRlAG9uX3VwZGF0ZQBWVXBkYXRlAGN1cnJlbnRfZGF0ZQBmYWxsb2NhdGUAZnRydW5jYXRlAHJlcGxpY2F0ZQBiYWQgcGFyYW1ldGVyIG9yIG90aGVyIEFQSSBtaXN1c2UAdG9vIG1hbnkgdGVybXMgaW4gJXMgQlkgY2xhdXNlAHRvbyBtYW55IHRlcm1zIGluIE9SREVSIEJZIGNsYXVzZQBhZ2dyZWdhdGUgZnVuY3Rpb25zIGFyZSBub3QgYWxsb3dlZCBpbiB0aGUgR1JPVVAgQlkgY2xhdXNlAFBBUlRJVElPTiBjbGF1c2UAYSBOQVRVUkFMIGpvaW4gbWF5IG5vdCBoYXZlIGFuIE9OIG9yIFVTSU5HIGNsYXVzZQBkYXRhYmFzZSAlcyBpcyBhbHJlYWR5IGluIHVzZQBBZ2dJbnZlcnNlAHJldmVyc2UAY2xvc2UAQ2xvc2UAZmFsc2UAYXR0ZW1wdCB0byB3cml0ZSBhIHJlYWRvbmx5IGRhdGFiYXNlAGNvcnJ1cHQgZGF0YWJhc2UAYXR0YWNoZWQgZGF0YWJhc2VzIG11c3QgdXNlIHRoZSBzYW1lIHRleHQgZW5jb2RpbmcgYXMgbWFpbiBkYXRhYmFzZQBmaWxlIGlzIG5vdCBhIGRhdGFiYXNlAHRlbXBfc3RvcmUAJXMgY2xhdXNlIHNob3VsZCBjb21lIGFmdGVyICVzIG5vdCBiZWZvcmUARXhwaXJlAHNxdWFyZQBleHByX2NvbXBhcmUAU29ydGVyQ29tcGFyZQBzdWJ0eXBlAENsclN1YnR5cGUAanNvbl90eXBlAElzTnVsbE9yVHlwZQBJZk5vSG9wZQBpbHRuZQB1bml4LW5vbmUASW5pdENvcm91dGluZQBFbmRDb3JvdXRpbmUAaWNuZQBsb2NhbHRpbWUAc3RyZnRpbWUAZGF0ZXRpbWUAY3VycmVudF90aW1lAHRuZW1lAGFmdGVyIHJlbmFtZQBub24tdGV4dCBmaWxlbmFtZQBWUmVuYW1lAGFtYmlndW91cyBjb2x1bW4gbmFtZQB0ZW1wb3JhcnkgdHJpZ2dlciBtYXkgbm90IGhhdmUgcXVhbGlmaWVkIG5hbWUAc2ltcGxlAGxvd2VyX3F1YXJ0aWxlAHVwcGVyX3F1YXJ0aWxlAHVuaXgtZG90ZmlsZQBjYW5ub3Qgb3BlbiBmaWxlAHVuYWJsZSB0byBvcGVuIGRhdGFiYXNlIGZpbGUAaW1tdXRhYmxlAEFib3J0YWJsZQBsZWdhY3lfYWx0ZXJfdGFibGUAc3FsaXRlX3JlbmFtZV90YWJsZQBjYW5ub3QgY3JlYXRlIHRyaWdnZXIgb24gc3lzdGVtIHRhYmxlAHZpcnR1YWwgdGFibGUAbm8gc3VjaCB0YWJsZQBudW1iZXIgb2YgY29sdW1ucyBpbiBmb3JlaWduIGtleSBkb2VzIG5vdCBtYXRjaCB0aGUgbnVtYmVyIG9mIGNvbHVtbnMgaW4gdGhlIHJlZmVyZW5jZWQgdGFibGUAbG9jYWwgdGltZSB1bmF2YWlsYWJsZQBhbm90aGVyIHJvdyBhdmFpbGFibGUAbm8gbW9yZSByb3dzIGF2YWlsYWJsZQBWYXJpYWJsZQBEcm9wVGFibGUAdXRmMTZsZQBVVEYxNmxlAFVURi0xNmxlAGNhc2Vfc2Vuc2l0aXZlX2xpa2UAU2V0Q29va2llAFJlYWRDb29raWUAY2FjaGUAY29sdW1uIGluZGV4IG91dCBvZiByYW5nZQBub3RpZmljYXRpb24gbWVzc2FnZQB3YXJuaW5nIG1lc3NhZ2UAaW52YWxpZCByb290cGFnZQBFeHRlbmRzIG9mZiBlbmQgb2YgcGFnZQBqc29uX3RyZWUAQ3JlYXRlQnRyZWUAZGVlAGpvdXJuYWxfbW9kZQBsb2NraW5nX21vZGUAb3Bjb2RlAHVuaWNvZGUASm91cm5hbE1vZGUARGl2aWRlAGNvYWxlc2NlAHNxbGl0ZV9zZXF1ZW5jZQBTZXF1ZW5jZQBkaWZmZXJlbmNlAHZhcmlhbmNlAE9uY2UAVHJhY2UAanNvbl9yZXBsYWNlAHV0ZjE2YmUAVVRGMTZiZQBVVEYtMTZiZQBOZQBMZQBHZQAyMGM6MjBlADIwYjoyMGUAJSEuMjBlAGdldGN3ZABNYWtlUmVjb3JkAHRoc3RuZHJkAGxpa2VsaWhvb2QAZmNobW9kAHJvdW5kAE5vdEZvdW5kAFJld2luZABTZWVrRW5kAEJpdEFuZABvbGQAJWxsZCAlbGxkAG5vIHN1Y2ggcm93aWQ6ICVsbGQAcmVidWlsZABZaWVsZABsYXN0X2luc2VydF9yb3dpZAAlcy5yb3dpZABTRUxFQ1QqRlJPTSIldyIuJXMgT1JERVIgQlkgcm93aWQAU0VMRUNUKkZST00iJXciLiVzIFdIRVJFICVzIE9SREVSIEJZIHJvd2lkAElkeFJvd2lkAE5ld1Jvd2lkAFNlZWtSb3dpZABnZXRldWlkAGludmFsaWQAanNvbl92YWxpZABma2lkAF9fbGFuZ2lkACV6LCBsYW5naWQAbGFuZ3VhZ2VpZABkb2NpZABhcHBsaWNhdGlvbl9pZABzcWxpdGVfc291cmNlX2lkAG5vdCBhdXRob3JpemVkAEluZGV4IG9wdGltaXplZABub3RpbmRleGVkAHVuYWJsZSB0byBpZGVudGlmeSB0aGUgb2JqZWN0IHRvIGJlIHJlaW5kZXhlZAB2aWV3cyBtYXkgbm90IGJlIGluZGV4ZWQAdmlydHVhbCB0YWJsZXMgbWF5IG5vdCBiZSBpbmRleGVkAHRhYmxlICVzIG1heSBub3QgYmUgaW5kZXhlZAByZWFkX3VuY29tbWl0dGVkAHJlY3Vyc2l2ZSBhZ2dyZWdhdGUgcXVlcmllcyBub3Qgc3VwcG9ydGVkAHF1ZXJ5IGFib3J0ZWQAcm93cyBpbnNlcnRlZABpbnRlcnJ1cHRlZABjaGVja3BvaW50ZWQAYWNjZXNzIHRvICV6IGlzIHByb2hpYml0ZWQAYWNjZXNzIHRvIHZpZXcgIiVzIiBwcm9oaWJpdGVkAHJvd3MgZGVsZXRlZABnZW5lcmF0ZWQAcm93cyB1cGRhdGVkAG5vdHVzZWQAcm93IHZhbHVlIG1pc3VzZWQAc3FsaXRlX2NvbXBpbGVvcHRpb25fdXNlZABQYWdlICVkIGlzIG5ldmVyIHVzZWQAQ29sdW1uc1VzZWQAc3RvcmVkAHZpcnR1YWwgdGFibGVzIG1heSBub3QgYmUgYWx0ZXJlZAB2aWV3ICVzIG1heSBub3QgYmUgYWx0ZXJlZAB0YWJsZSAlcyBtYXkgbm90IGJlIGFsdGVyZWQAc2hhcmVkAGluZGV4IGFzc29jaWF0ZWQgd2l0aCBVTklRVUUgb3IgUFJJTUFSWSBLRVkgY29uc3RyYWludCBjYW5ub3QgYmUgZHJvcHBlZAB0YWJsZSAlcyBtYXkgbm90IGJlIGRyb3BwZWQAdmlldyAlcyBpcyBjaXJjdWxhcmx5IGRlZmluZWQAdW5vcGVuZWQAZGF0YWJhc2UgZGlzayBpbWFnZSBpcyBtYWxmb3JtZWQAJXMgY29uc3RyYWludCBmYWlsZWQARk9SRUlHTiBLRVkgY29uc3RyYWludCBmYWlsZWQAbGFyZ2UgZmlsZSBzdXBwb3J0IGlzIGRpc2FibGVkAGZ0czN0b2tlbml6ZSBkaXNhYmxlZABkYXRhYmFzZSAlcyBpcyBsb2NrZWQAZGF0YWJhc2UgaXMgbG9ja2VkAGRhdGFiYXNlIHRhYmxlIGlzIGxvY2tlZABhdXRob3JpemF0aW9uIGRlbmllZABhY2Nlc3MgcGVybWlzc2lvbiBkZW5pZWQAdGFibGUgJVMgaGFzICVkIGNvbHVtbnMgYnV0ICVkIHZhbHVlcyB3ZXJlIHN1cHBsaWVkAHRlbXBvcmFyeSB0YWJsZSBuYW1lIG11c3QgYmUgdW5xdWFsaWZpZWQAdGFibGUgJXMgbWF5IG5vdCBiZSBtb2RpZmllZABjb25mbGljdGluZyBPTiBDT05GTElDVCBjbGF1c2VzIHNwZWNpZmllZABubyB0YWJsZXMgc3BlY2lmaWVkAGRhdGFiYXNlIGlzIGFscmVhZHkgYXR0YWNoZWQAZGF0YWJhc2Ugc2NoZW1hIGhhcyBjaGFuZ2VkAGV4Y2x1ZGVkAFBvaW50ZXIgbWFwIHBhZ2UgJWQgaXMgcmVmZXJlbmNlZABSb3dTZXRBZGQARmlsdGVyQWRkAHByZWFkAFJvd1NldFJlYWQAT3BlblJlYWQAJTA0ZAAlMDNkACUwMmQANDBmLTIxYS0yMWQAc3FsaXRlX3N0YXQlZABjb2x1bW4lZABzcWxpdGVfYXV0b2luZGV4XyVzXyVkAHZhcmlhYmxlIG51bWJlciBtdXN0IGJlIGJldHdlZW4gPzEgYW5kID8lZABGYWlsZWQgdG8gcmVhZCBwdHJtYXAga2V5PSVkAHVuYWJsZSB0byBnZXQgdGhlIHBhZ2UuIGVycm9yIGNvZGU9JWQAT2Zmc2V0ICVkIG91dCBvZiByYW5nZSAlZC4uJWQAayglZABVUERBVEUgJVEuc3FsaXRlX21hc3RlciBTRVQgcm9vdHBhZ2U9JWQgV0hFUkUgIyVkIEFORCByb290cGFnZT0jJWQAVVBEQVRFICVRLnNxbGl0ZV9tYXN0ZXIgU0VUIHR5cGU9JyVzJywgbmFtZT0lUSwgdGJsX25hbWU9JVEsIHJvb3RwYWdlPSMlZCwgc3FsPSVRIFdIRVJFIHJvd2lkPSMlZABVUERBVEUgJVEuc3FsaXRlX21hc3RlciBTRVQgdHlwZT0ndGFibGUnLCBuYW1lPSVRLCB0YmxfbmFtZT0lUSwgcm9vdHBhZ2U9MCwgc3FsPSVRIFdIRVJFIHJvd2lkPSMlZAB0b28gbWFueSBhdHRhY2hlZCBkYXRhYmFzZXMgLSBtYXggJWQAdG9vIG1hbnkgYXJndW1lbnRzIG9uICVzKCkgLSBtYXggJWQAZXhwZWN0ZWQgJWQgY29sdW1ucyBmb3IgJyVzJyBidXQgZ290ICVkAGF0dGVtcHQgdG8gb3BlbiAiJXMiIGFzIGZpbGUgZGVzY3JpcHRvciAlZABpbnZhbGlkIHBhZ2UgbnVtYmVyICVkAGZhaWxlZCB0byBnZXQgcGFnZSAlZAAybmQgcmVmZXJlbmNlIHRvIHBhZ2UgJWQAZnJlZWxpc3QgbGVhZiBjb3VudCB0b28gYmlnIG9uIHBhZ2UgJWQAYnRyZWVJbml0UGFnZSgpIHJldHVybnMgZXJyb3IgY29kZSAlZAAlcyBpcyAlZCBidXQgc2hvdWxkIGJlICVkACVyICVzIEJZIHRlcm0gb3V0IG9mIHJhbmdlIC0gc2hvdWxkIGJlIGJldHdlZW4gMSBhbmQgJWQAc3ViLXNlbGVjdCByZXR1cm5zICVkIGNvbHVtbnMgLSBleHBlY3RlZCAlZABJTiguLi4pIGVsZW1lbnQgaGFzICVkIHRlcm0lcyAtIGV4cGVjdGVkICVkACVzTElTVCBTVUJRVUVSWSAlZABSRVVTRSBMSVNUIFNVQlFVRVJZICVkACVzU0NBTEFSIFNVQlFVRVJZICVkAFJFVVNFIFNVQlFVRVJZICVkAElOREVYICVkAHRvbyBtYW55IEZST00gY2xhdXNlIHRlcm1zLCBtYXg6ICVkAHJ3YwB1dGMAZGVzYwBhc2MAY2hlY2twb2ludF9mdWxsZnN5bmMAZnVsbF9mc3luYwBjaGFyaW5kZXhGdW5jAHNxcnRGdW5jAGNvdEZ1bmMAcmlnaHRGdW5jAGxlZnRGdW5jAGFjb3NGdW5jAGZsb29yRnVuYwBwb3dlckZ1bmMAc3RyZmlsdGVyRnVuYwBwcm9wZXJGdW5jAHBhZHJGdW5jAGV4cEZ1bmMAYXNpbkZ1bmMAc2lnbkZ1bmMAYXRhbkZ1bmMAY2VpbEZ1bmMAcGFkbEZ1bmMAY290aEZ1bmMAYWNvc2hGdW5jAGFzaW5oRnVuYwBhdGFuaEZ1bmMAbG9nRnVuYwByYWQyZGVnRnVuYwByZXZlcnNlRnVuYwBQdXJlRnVuYwBzcXVhcmVGdW5jAGRpZmZlcmVuY2VGdW5jAGRlZzJyYWRGdW5jAHBhZGNGdW5jAGF0bjJGdW5jAGxvZzEwRnVuYwBlbmMAbnVtZXJpYwAxPT1hcmdjAFNxbEV4ZWMAcGFkYwAlLjRjJXMlLjE2YwBzcWxpdGUtc3JjL3NxbGl0ZS1hbWFsZ2FtYXRpb24tMzM5MDMwMC9leHRlbnNpb24tZnVuY3Rpb25zLmMAJXMvZXRpbHFzXyVsbHglYwB1bnJlY29nbml6ZWQgbWF0Y2hpbmZvIHJlcXVlc3Q6ICVjAEdvc3ViAGdsb2IAemVyb2Jsb2IAcmFuZG9tYmxvYgBCbG9iAGlsYgBpdGlsaWIAbWVtZGIAQVRUQUNIICVRIEFTIHZhY3V1bV9kYgByb3RhAGV2aXRhAGxhbm9pdGEAZXRhAFJvd0RhdGEAU29ydGVyRGF0YQBpY25hAHNxbGl0ZV90ZW1wX3NjaGVtYQBzcWxpdGVfc2NoZW1hAHdyaXRhYmxlX3NjaGVtYQB0cnVzdGVkX3NjaGVtYQBjb3JydXB0IHNjaGVtYQBQYXJzZVNjaGVtYQBpbGxhAGV6aWxhAGl0aWxhAG1zaWxhAHNxbGl0ZV8AcHJhZ21hXwBTUUxJVEVfAF9ST1dJRF8AJXMgYXQgbGluZSAlZCBvZiBbJS4xMHNdAGJpbmQgb24gYSBidXN5IHByZXBhcmVkIHN0YXRlbWVudDogWyVzXQBtYWxmb3JtZWQgTUFUQ0ggZXhwcmVzc2lvbjogWyVzXQBbJWRdAFtdAFswXQAkWwBMRUZULU1PU1QgU1VCUVVFUlkAQ09NUE9VTkQgUVVFUlkAQU5ZAGdlbmVyYXRlZCBjb2x1bW5zIGNhbm5vdCBiZSBwYXJ0IG9mIHRoZSBQUklNQVJZIEtFWQBBVVRPSU5DUkVNRU5UIGlzIG9ubHkgYWxsb3dlZCBvbiBhbiBJTlRFR0VSIFBSSU1BUlkgS0VZAGRvY2lkIElOVEVHRVIgUFJJTUFSWSBLRVkARk9SRUlHTiBLRVkAUklHSFQgUEFSVCBPRiBPUkRFUiBCWQBHUk9VUCBCWQBpaXNYAGlzaVgAQVVUT01BVElDIFBBUlRJQUwgQ09WRVJJTkcgSU5ERVgAQVVUT01BVElDIENPVkVSSU5HIElOREVYAC1taiUwNlg5JTAyWABTQ0FOIENPTlNUQU5UIFJPVwBWSUVXAGpzb25fb2JqZWN0KCkgbGFiZWxzIG11c3QgYmUgVEVYVABGSVJTVABMQVNUAEVYQ0VQVABOT1QAIElOVABJZHhMVABTZWVrTFQAU0VUIERFRkFVTFQATVVURVhfT01JVABDT01NSVQATElNSVQAUklHSFQASWR4R1QAU2Vla0dUAExFRlQARElTVElOQ1QAUkVTVFJJQ1QASU5URVJTRUNUAHRvbyBtYW55IHRlcm1zIGluIGNvbXBvdW5kIFNFTEVDVAB1bmtub3duIGpvaW4gdHlwZTogJVQlcyVUJXMlVAAtJVQAdG9vIG1hbnkgYXJndW1lbnRzIG9uIGZ1bmN0aW9uICVUAHVua25vd24gZGF0YWJhc2UgJVQAZm9yZWlnbiBrZXkgb24gJXMgc2hvdWxkIHJlZmVyZW5jZSBvbmx5IG9uZSBjb2x1bW4gb2YgdGFibGUgJVQAQ1JFQVRFIFZJUlRVQUwgVEFCTEUgJVQAaGV4IGxpdGVyYWwgdG9vIGJpZzogJXMlI1QAbm8gc3VjaCBmdW5jdGlvbjogJSNUAG5vdCBhdXRob3JpemVkIHRvIHVzZSBmdW5jdGlvbjogJSNUAERFRkFVTFRfUkVDVVJTSVZFX1RSSUdHRVJTAElOUwBFTkFCTEVfRlRTM19QQVJFTlRIRVNJUwBESVNBQkxFX0xGUwAlcyAlUwBubyBzdWNoIGluZGV4OiAlUwBjYW5ub3QgY3JlYXRlICVzIHRyaWdnZXIgb24gdmlldzogJVMAbm8gc3VjaCB0cmlnZ2VyOiAlUwBjYW5ub3QgY3JlYXRlIElOU1RFQUQgT0YgdHJpZ2dlciBvbiB0YWJsZTogJVMATUFURVJJQUxJWkUgJSFTAENPLVJPVVRJTkUgJSFTAFVTSU5HIElOREVYICVzIEZPUiBJTi1PUEVSQVRPUgBVU0lORyBST1dJRCBTRUFSQ0ggT04gVEFCTEUgJXMgRk9SIElOLU9QRVJBVE9SAE1VTFRJLUlOREVYIE9SAFNRTElURV9UTVBESVIAQUZURVIASU5URUdFUgBPUkRFUgBORUFSAERFTEVURSBGUk9NICVRLiVzIFdIRVJFICVzPSVRAG5hbWU9JVEgQU5EIHNxbD0lUQBERUxFVEUgRlJPTSAlUS5zcWxpdGVfc2VxdWVuY2UgV0hFUkUgbmFtZT0lUQAsIHguJVEAU0VMRUNUICogRlJPTSAlUS4lUQBVUERBVEUgIiV3Ii5zcWxpdGVfc2VxdWVuY2Ugc2V0IG5hbWUgPSAlUSBXSEVSRSBuYW1lID0gJVEAVVBEQVRFICIldyIuc3FsaXRlX21hc3RlciBTRVQgc3FsID0gcHJpbnRmKCclJS4lZHMsICcsc3FsKSB8fCAlUSB8fCBzdWJzdHIoc3FsLDErbGVuZ3RoKHByaW50ZignJSUuJWRzJyxzcWwpKSkgV0hFUkUgdHlwZSA9ICd0YWJsZScgQU5EIG5hbWUgPSAlUQBTRVRVUABHUk9VUABSRUNVUlNJVkUgU1RFUABOYU4AbWFsZm9ybWVkIEpTT04ATk8gQUNUSU9OAE9NSVRfTE9BRF9FWFRFTlNJT04AVU5JT04AIExFRlQtSk9JTgBCRUdJTgAsYXJnIEhJRERFTgAsc2NoZW1hIEhJRERFTgBTQ0FOAERFRkFVTFRfQVVUT1ZBQ1VVTQAgTlVNAFJUUklNAENhbm5vdCBhZGQgYSBOT1QgTlVMTCBjb2x1bW4gd2l0aCBkZWZhdWx0IHZhbHVlIE5VTEwATk9UIE5VTEwAU0VUIE5VTEwAU0VMRUNUIDEgRlJPTSAlUS4nJXFfc2VnbWVudHMnIFdIRVJFIGJsb2NraWQ9PyBBTkQgYmxvY2sgSVMgTlVMTABVTklPTiBBTEwAIFJFQUwAQ0hFQ0sAYWJvcnQgZHVlIHRvIFJPTExCQUNLAE1BVENIAFNFQVJDSABVU0lORwBFTkFCTEVfTk9STUFMSVpFACBVTklRVUUAREVMRVRFAFVQREFURQBSRUxFQVNFAE5PQ0FTRQBCRUZPUkUAQ1JFAE5PTkUASWR4TEUAU2Vla0xFAFRBQkxFADE2TEUASWR4R0UAU2Vla0dFACVzIFVTSU5HIFRFTVAgQi1UUkVFAENBU0NBREUAMTZCRQBBTkQAUk9XSUQAT0lEAERFU0MAU0VMRUNUIGlkeCwgc3RhcnRfYmxvY2ssIGxlYXZlc19lbmRfYmxvY2ssIGVuZF9ibG9jaywgcm9vdCBGUk9NICVRLiclcV9zZWdkaXInIFdIRVJFIGxldmVsID0gPyBPUkRFUiBCWSBpZHggQVNDAFNFTEVDVCBpZHgsIHN0YXJ0X2Jsb2NrLCBsZWF2ZXNfZW5kX2Jsb2NrLCBlbmRfYmxvY2ssIHJvb3QgRlJPTSAlUS4nJXFfc2VnZGlyJyBXSEVSRSBsZXZlbCBCRVRXRUVOID8gQU5EID9PUkRFUiBCWSBsZXZlbCBERVNDLCBpZHggQVNDAFNFTEVDVCBsZXZlbCwgaWR4LCBlbmRfYmxvY2sgRlJPTSAlUS4nJXFfc2VnZGlyJyBXSEVSRSBsZXZlbCBCRVRXRUVOID8gQU5EID8gT1JERVIgQlkgbGV2ZWwgREVTQywgaWR4IEFTQwBTRUxFQ1QgaWR4IEZST00gJVEuJyVxX3NlZ2RpcicgV0hFUkUgbGV2ZWw9PyBPUkRFUiBCWSAxIEFTQwBTWVNURU1fTUFMTE9DAEJMT0IAQkJCAFVQREFURSBPUiBGQUlMICVRLiclcV9zZWdkaXInIFNFVCBsZXZlbD0tMSxpZHg9PyBXSEVSRSBsZXZlbD0/IEFORCBpZHg9PwBVUERBVEUgJVEuJyVxX3NlZ2RpcicgU0VUIGlkeCA9ID8gV0hFUkUgbGV2ZWw9PyBBTkQgaWR4PT8AJXM9PwBTRUxFQ1QgJXMgV0hFUkUgcm93aWQ9PwBTRUxFQ1Qgc2l6ZSBGUk9NICVRLiclcV9kb2NzaXplJyBXSEVSRSBkb2NpZD0/AFNFTEVDVCB2YWx1ZSBGUk9NICVRLiclcV9zdGF0JyBXSEVSRSBpZD0/AD8sPyw/AERFTEVURSBGUk9NICVRLiclcV9zZWdkaXInIFdIRVJFIGxldmVsIEJFVFdFRU4gPyBBTkQgPwBTRUxFQ1QgbWF4KGxldmVsKSBGUk9NICVRLiclcV9zZWdkaXInIFdIRVJFIGxldmVsIEJFVFdFRU4gPyBBTkQgPwBERUxFVEUgRlJPTSAlUS4nJXFfc2VnbWVudHMnIFdIRVJFIGJsb2NraWQgQkVUV0VFTiA/IEFORCA/AFVQREFURSAlUS4nJXFfc2VnZGlyJyBTRVQgc3RhcnRfYmxvY2sgPSA/LCByb290ID0gP1dIRVJFIGxldmVsID0gPyBBTkQgaWR4ID0gPwBTRUxFQ1QgaWR4LCBzdGFydF9ibG9jaywgbGVhdmVzX2VuZF9ibG9jaywgZW5kX2Jsb2NrLCByb290IEZST00gJVEuJyVxX3NlZ2RpcicgV0hFUkUgbGV2ZWwgPSA/IEFORCBpZHggPSA/AERFTEVURSBGUk9NICVRLiclcV9zZWdkaXInIFdIRVJFIGxldmVsID0gPyBBTkQgaWR4ID0gPwBERUxFVEUgRlJPTSAlUS4nJXFfc2VnZGlyJyBXSEVSRSBsZXZlbCA9ID8AU0VMRUNUIGNvdW50KCopIEZST00gJVEuJyVxX3NlZ2RpcicgV0hFUkUgbGV2ZWwgPSA/AFNFTEVDVCAlcyBXSEVSRSByb3dpZCA9ID8AREVMRVRFIEZST00gJVEuJyVxX2NvbnRlbnQnIFdIRVJFIHJvd2lkID0gPwBERUxFVEUgRlJPTSAlUS4nJXFfZG9jc2l6ZScgV0hFUkUgZG9jaWQgPSA/ACwgPwA8ZXhwcj4APGI+ADxiPi4uLjwvYj4ALT4+AC0+AHNlcGFyYXRvcnM9AHRva2VuY2hhcnM9AGF1dG9tZXJnZT0APABJTlNFUlQgSU5UTyAlUS5zcWxpdGVfbWFzdGVyIFZBTFVFUygnaW5kZXgnLCVRLCVRLCMlZCwlUSk7AENSRUFURSBUQUJMRSAlUS4nJXFfc2VnbWVudHMnKGJsb2NraWQgSU5URUdFUiBQUklNQVJZIEtFWSwgYmxvY2sgQkxPQik7AENSRUFURSBUQUJMRSAlUS4nJXFfZG9jc2l6ZScoZG9jaWQgSU5URUdFUiBQUklNQVJZIEtFWSwgc2l6ZSBCTE9CKTsAQ1JFQVRFIFRBQkxFIElGIE5PVCBFWElTVFMgJVEuJyVxX3N0YXQnKGlkIElOVEVHRVIgUFJJTUFSWSBLRVksIHZhbHVlIEJMT0IpOwBDUkVBVEUgVEFCTEUgJVEuJyVxX3NlZ2RpcicobGV2ZWwgSU5URUdFUixpZHggSU5URUdFUixzdGFydF9ibG9jayBJTlRFR0VSLGxlYXZlc19lbmRfYmxvY2sgSU5URUdFUixlbmRfYmxvY2sgSU5URUdFUixyb290IEJMT0IsUFJJTUFSWSBLRVkobGV2ZWwsIGlkeCkpOwBVUERBVEUgJVEuc3FsaXRlX21hc3RlciBTRVQgdGJsX25hbWUgPSAlUSwgbmFtZSA9IENBU0UgV0hFTiB0eXBlPSd0YWJsZScgVEhFTiAlUSBXSEVOIG5hbWUgTElLRSAnc3FsaXRlWF9hdXRvaW5kZXglJScgRVNDQVBFICdYJyAgICAgIEFORCB0eXBlPSdpbmRleCcgVEhFTiAnc3FsaXRlX2F1dG9pbmRleF8nIHx8ICVRIHx8IHN1YnN0cihuYW1lLCVkKzE4KSBFTFNFIG5hbWUgRU5EIFdIRVJFIHRibF9uYW1lPSVRIENPTExBVEUgbm9jYXNlIEFORCAodHlwZT0ndGFibGUnIE9SIHR5cGU9J2luZGV4JyBPUiB0eXBlPSd0cmlnZ2VyJyk7AERST1AgVEFCTEUgSUYgRVhJU1RTICVRLiclcV9zZWdtZW50cyc7RFJPUCBUQUJMRSBJRiBFWElTVFMgJVEuJyVxX3NlZ2Rpcic7RFJPUCBUQUJMRSBJRiBFWElTVFMgJVEuJyVxX2RvY3NpemUnO0RST1AgVEFCTEUgSUYgRVhJU1RTICVRLiclcV9zdGF0JzslcyBEUk9QIFRBQkxFIElGIEVYSVNUUyAlUS4nJXFfY29udGVudCc7AEFMVEVSIFRBQkxFICVRLiclcV9jb250ZW50JyAgUkVOQU1FIFRPICclcV9jb250ZW50JzsAQUxURVIgVEFCTEUgJVEuJyVxX3N0YXQnICBSRU5BTUUgVE8gJyVxX3N0YXQnOwBBTFRFUiBUQUJMRSAlUS4nJXFfc2VnbWVudHMnIFJFTkFNRSBUTyAnJXFfc2VnbWVudHMnOwBBTFRFUiBUQUJMRSAlUS4nJXFfc2VnZGlyJyAgIFJFTkFNRSBUTyAnJXFfc2VnZGlyJzsAQUxURVIgVEFCTEUgJVEuJyVxX2RvY3NpemUnICBSRU5BTUUgVE8gJyVxX2RvY3NpemUnOwA6bWVtb3J5OgBmaWxlOgBTdHJpbmc4AHV0ZjgAMjAyMi0wOS0wNSAxMTowMjoyMyA0NjM1ZjRhNjljOGMyYThkZjI0MmIzODRhOTkyYWVhNzEyMjRlMzlhMmNjYWI0MmQ4YzBiMDYwMmYxZTgyNmU4AFVURjgAVVRGLTgATUFYX0ZVTkNUSU9OX0FSRz0xMjcAREVGQVVMVF9TRUNUT1JfU0laRT00MDk2AERFRkFVTFRfUEFHRV9TSVpFPTQwOTYATUFYX1ZBUklBQkxFX05VTUJFUj0zMjc2NgBNQVhfUEFHRV9TSVpFPTY1NTM2AFVURjE2AFVURi0xNgBwNQB0b28gbWFueSByZWZlcmVuY2VzIHRvICIlcyI6IG1heCA2NTUzNQBzcWxpdGVfc3RhdDQAZnRzNABwNABERUZBVUxUX0ZJTEVfRk9STUFUPTQASW50NjQAcHdyaXRlNjQAcHJlYWQ2NABNQUxMT0NfU09GVF9MSU1JVD0xMDI0AHNxbGl0ZV9zdGF0MwBTQVZFUE9JTlQgZnRzMwBST0xMQkFDSyBUTyBmdHMzAFJFTEVBU0UgZnRzMwBwMwBFTkFCTEVfRlRTMwBNQVhfUEFHRV9DT1VOVD0xMDczNzQxODIzAHAyAGF0bjIAYXRhbjIAcmVtb3ZlX2RpYWNyaXRpY3M9MgBERUZBVUxUX1NZTkNIUk9OT1VTPTIAREVGQVVMVF9XQUxfU1lOQ0hST05PVVM9MgBhcmdjPT0zIHx8YXJnYz09MgBNQVhfREVGQVVMVF9QQUdFX1NJWkU9ODE5MgBTRUxFQ1QgdGJsLGlkeCxzdGF0IEZST00gJVEuc3FsaXRlX3N0YXQxAEFnZ1N0ZXAxAHJlbW92ZV9kaWFjcml0aWNzPTEAQVRPTUlDX0lOVFJJTlNJQ1M9MQBURU1QX1NUT1JFPTEAYXJnYz09MQB1bmljb2RlNjEAVVBEQVRFIE9SIEZBSUwgJVEuJyVxX3NlZ2RpcicgU0VUIGxldmVsPT8gV0hFUkUgbGV2ZWw9LTEAREVGQVVMVF9KT1VSTkFMX1NJWkVfTElNSVQ9LTEAU0VMRUNUIGxldmVsLCBjb3VudCgqKSBBUyBjbnQgRlJPTSAlUS4nJXFfc2VnZGlyJyAgIEdST1VQIEJZIGxldmVsIEhBVklORyBjbnQ+PT8gIE9SREVSIEJZIChsZXZlbCAlJSAxMDI0KSBBU0MsIDIgREVTQyBMSU1JVCAxAFNFTEVDVCAoU0VMRUNUIG1heChpZHgpIEZST00gJVEuJyVxX3NlZ2RpcicgV0hFUkUgbGV2ZWwgPSA/KSArIDEAU0VMRUNUJ0lOU0VSVCBJTlRPIHZhY3V1bV9kYi4nfHxxdW90ZShuYW1lKXx8JyBTRUxFQ1QqRlJPTSIldyIuJ3x8cXVvdGUobmFtZSlGUk9NIHZhY3V1bV9kYi5zcWxpdGVfc2NoZW1hIFdIRVJFIHR5cGU9J3RhYmxlJ0FORCBjb2FsZXNjZShyb290cGFnZSwxKT4wAFNFTEVDVCBzcWwgRlJPTSAiJXciLnNxbGl0ZV9zY2hlbWEgV0hFUkUgdHlwZT0ndGFibGUnQU5EIG5hbWU8PidzcWxpdGVfc2VxdWVuY2UnIEFORCBjb2FsZXNjZShyb290cGFnZSwxKT4wAHJlbW92ZV9kaWFjcml0aWNzPTAATUFYX1dPUktFUl9USFJFQURTPTAAREVGQVVMVF9XT1JLRVJfVEhSRUFEUz0wAE1BWF9NTUFQX1NJWkU9MABERUZBVUxUX01NQVBfU0laRT0wAFRIUkVBRFNBRkU9MAA5MjIzMzcyMDM2ODU0Nzc1ODAAREVGQVVMVF9QQ0FDSEVfSU5JVFNaPTIwAGxvZzEwAE1BWF9BVFRBQ0hFRD0xMABNQVhfQ09NUE9VTkRfU0VMRUNUPTUwMAA/MDAwAE1BWF9DT0xVTU49MjAwMABERUZBVUxUX0NBQ0hFX1NJWkU9LTIwMDAAREVGQVVMVF9XQUxfQVVUT0NIRUNLUE9JTlQ9MTAwMABNQVhfRVhQUl9ERVBUSD0xMDAwAE1BWF9UUklHR0VSX0RFUFRIPTEwMDAATUFYX0xJS0VfUEFUVEVSTl9MRU5HVEg9NTAwMDAATUFYX1ZEQkVfT1A9MjUwMDAwMDAwAE1BWF9MRU5HVEg9MTAwMDAwMDAwMABNQVhfU1FMX0xFTkdUSD0xMDAwMDAwMDAwAHNlY29uZCBhcmd1bWVudCB0byAlI1QoKSBtdXN0IGJlIGEgY29uc3RhbnQgYmV0d2VlbiAwLjAgYW5kIDEuMABDT01QSUxFUj1jbGFuZy0xNi4wLjAAL3Byb2Mvc2VsZi9mZC8AJVEuAE4uACQuAC0tACwAbm9za2lwc2NhbioAdW5vcmRlcmVkKgBzej1bMC05XSoAKHN1YnF1ZXJ5LSV1KQAoam9pbi0ldSkAQ1JFQVRFIFRBQkxFIHgodHlwZSB0ZXh0LG5hbWUgdGV4dCx0YmxfbmFtZSB0ZXh0LHJvb3RwYWdlIGludCxzcWwgdGV4dCkAQ1JFQVRFIFRBQkxFICVRLiVzKCVzKQBhdXRvbWF0aWMgaW5kZXggb24gJXMoJXMpAEFOWSglcykASU5TRVJUIElOVE8gJVEuJyVxX2NvbnRlbnQnIFZBTFVFUyglcykAQ1JFQVRFIFRBQkxFICVRLiclcV9jb250ZW50JyglcykAbWFsZm9ybWVkIGRhdGFiYXNlIHNjaGVtYSAoJXMpAE1FUkdFICglcykAQ1JFQVRFIFRBQkxFICVRLnNxbGl0ZV9zZXF1ZW5jZShuYW1lLHNlcSkAQ1JFQVRFIFRBQkxFIHgoaW5wdXQsIHRva2VuLCBzdGFydCwgZW5kLCBwb3NpdGlvbikAVVBEQVRFICIldyIuc3FsaXRlX21hc3RlciBTRVQgc3FsID0gc3FsaXRlX2Ryb3BfY29sdW1uKCVkLCBzcWwsICVkKSBXSEVSRSAodHlwZT09J3RhYmxlJyBBTkQgdGJsX25hbWU9JVEgQ09MTEFURSBub2Nhc2UpAG1lbWRiKCVwLCVsbGQpAEJhZCBwdHIgbWFwIGVudHJ5IGtleT0lZCBleHBlY3RlZD0oJWQsJWQpIGdvdD0oJWQsJWQpACVzKCVkKQB6ZXJvYmxvYiglZCkAbWF4IHJvb3RwYWdlICglZCkgZGlzYWdyZWVzIHdpdGggaGVhZGVyICglZCkARlRTIGV4cHJlc3Npb24gdHJlZSBpcyB0b28gbGFyZ2UgKG1heGltdW0gZGVwdGggJWQpAEV4cHJlc3Npb24gdHJlZSBpcyB0b28gbGFyZ2UgKG1heGltdW0gZGVwdGggJWQpAChibG9iKQBVU0UgVEVNUCBCLVRSRUUgRk9SICVzKERJU1RJTkNUKQBVUERBVEUgIiV3Ii5zcWxpdGVfbWFzdGVyIFNFVCBzcWwgPSBzcWxpdGVfcmVuYW1lX2NvbHVtbihzcWwsIHR5cGUsIG5hbWUsICVRLCAlUSwgJWQsICVRLCAlZCwgJWQpIFdIRVJFIG5hbWUgTk9UIExJS0UgJ3NxbGl0ZVhfJSUnIEVTQ0FQRSAnWCcgIEFORCAodHlwZSAhPSAnaW5kZXgnIE9SIHRibF9uYW1lID0gJVEpAENSRUFURSBUQUJMRSB4KGtleSx2YWx1ZSx0eXBlLGF0b20saWQscGFyZW50LGZ1bGxrZXkscGF0aCxqc29uIEhJRERFTixyb290IEhJRERFTikAQ1JFQVRFIFRBQkxFIHgodGVybSwgY29sLCBkb2N1bWVudHMsIG9jY3VycmVuY2VzLCBsYW5ndWFnZWlkIEhJRERFTikAQ1JFQVRFIFRBQkxFIHgoJXMgJVEgSElEREVOLCBkb2NpZCBISURERU4sICVRIEhJRERFTikAKE5VTEwpACVjPykAU0VMRUNUIE5PVCBFWElTVFMoU0VMRUNUIGRvY2lkIEZST00gJVEuJyVxX2NvbnRlbnQnIFdIRVJFIHJvd2lkIT0/KQBSRVBMQUNFIElOVE8gJVEuJyVxX3NlZ2RpcicgVkFMVUVTKD8sPyw/LD8sPyw/KQBSRVBMQUNFIElOVE8gJVEuJyVxX3N0YXQnIFZBTFVFUyg/LD8pAFJFUExBQ0UgSU5UTyAlUS4nJXFfZG9jc2l6ZScgVkFMVUVTKD8sPykALCVzKD8pAFJFUExBQ0UgSU5UTyAlUS4nJXFfc2VnbWVudHMnKGJsb2NraWQsIGJsb2NrKSBWQUxVRVMoPywgPykAU0VMRUNUIGNvYWxlc2NlKChTRUxFQ1QgbWF4KGJsb2NraWQpIEZST00gJVEuJyVxX3NlZ21lbnRzJykgKyAxLCAxKQBJTlNFUlQgSU5UTyB2YWN1dW1fZGIuc3FsaXRlX3NjaGVtYSBTRUxFQ1QqRlJPTSAiJXciLnNxbGl0ZV9zY2hlbWEgV0hFUkUgdHlwZSBJTigndmlldycsJ3RyaWdnZXInKSBPUih0eXBlPSd0YWJsZSdBTkQgcm9vdHBhZ2U9MCkAd3JvbmcgbnVtYmVyIG9mIGFyZ3VtZW50cyB0byBmdW5jdGlvbiBzbmlwcGV0KCkAbWlzdXNlIG9mIGFnZ3JlZ2F0ZTogJXMoKQBtaXN1c2Ugb2YgJXMgZnVuY3Rpb24gJSNUKCkAd3JvbmcgbnVtYmVyIG9mIGFyZ3VtZW50cyB0byBmdW5jdGlvbiAlI1QoKQB1bnNhZmUgdXNlIG9mICUjVCgpAEZJTFRFUiBtYXkgbm90IGJlIHVzZWQgd2l0aCBub24tYWdncmVnYXRlICUjVCgpAHVua25vd24gZnVuY3Rpb246ICUjVCgpAG1pc3VzZSBvZiBhZ2dyZWdhdGU6ICUjVCgpAGFtYmlndW91cyByZWZlcmVuY2UgdG8gJXMgaW4gVVNJTkcoKQBVUERBVEUgdGVtcC5zcWxpdGVfbWFzdGVyIFNFVCBzcWwgPSBzcWxpdGVfcmVuYW1lX2NvbHVtbihzcWwsIHR5cGUsIG5hbWUsICVRLCAlUSwgJWQsICVRLCAlZCwgMSkgV0hFUkUgdHlwZSBJTiAoJ3RyaWdnZXInLCAndmlldycpAFVQREFURSBzcWxpdGVfdGVtcF9zY2hlbWEgU0VUIHNxbCA9IHNxbGl0ZV9yZW5hbWVfdGFibGUoJVEsIHR5cGUsIG5hbWUsIHNxbCwgJVEsICVRLCAxKSwgdGJsX25hbWUgPSBDQVNFIFdIRU4gdGJsX25hbWU9JVEgQ09MTEFURSBub2Nhc2UgQU5EICAgc3FsaXRlX3JlbmFtZV90ZXN0KCVRLCBzcWwsIHR5cGUsIG5hbWUsIDEsICdhZnRlciByZW5hbWUnLCAwKSBUSEVOICVRIEVMU0UgdGJsX25hbWUgRU5EIFdIRVJFIHR5cGUgSU4gKCd2aWV3JywgJ3RyaWdnZXInKQAsJXMoeC4nYyVkJXEnKQBJTlNFUlQgSU5UTyAlUS5zcWxpdGVfbWFzdGVyIFZBTFVFUygndHJpZ2dlcicsJVEsJVEsMCwnQ1JFQVRFIFRSSUdHRVIgJXEnKQBTRUxFQ1QgMiAqIHRvdGFsKDEgKyBsZWF2ZXNfZW5kX2Jsb2NrIC0gc3RhcnRfYmxvY2spICAgRlJPTSAoU0VMRUNUICogRlJPTSAlUS4nJXFfc2VnZGlyJyAgICAgICAgIFdIRVJFIGxldmVsID0gPyBPUkRFUiBCWSBpZHggQVNDIExJTUlUID8gICkACikAQkxPT00gRklMVEVSIE9OICVTICgAU0VMRUNUIHNxbCBGUk9NICIldyIuc3FsaXRlX3NjaGVtYSBXSEVSRSB0eXBlPSdpbmRleCcAREVMRVRFIEZST00gJVEuc3FsaXRlX21hc3RlciBXSEVSRSBuYW1lPSVRIEFORCB0eXBlPSdpbmRleCcAbmFtZT0nJXEnIEFORCB0eXBlPSdpbmRleCcAREVMRVRFIEZST00gJVEuJyVxX2NvbnRlbnQnAERFTEVURSBGUk9NICVRLiclcV9zdGF0JwBERUxFVEUgRlJPTSAlUS4nJXFfc2VnbWVudHMnAERFTEVURSBGUk9NICVRLiclcV9zZWdkaXInAFNFTEVDVCA/IFVOSU9OIFNFTEVDVCBsZXZlbCAvICgxMDI0ICogPykgRlJPTSAlUS4nJXFfc2VnZGlyJwBTRUxFQ1QgbWF4KCBsZXZlbCAlJSAxMDI0ICkgRlJPTSAlUS4nJXFfc2VnZGlyJwBERUxFVEUgRlJPTSAlUS5zcWxpdGVfbWFzdGVyIFdIRVJFIG5hbWU9JVEgQU5EIHR5cGU9J3RyaWdnZXInAERFTEVURSBGUk9NICVRLnNxbGl0ZV9tYXN0ZXIgV0hFUkUgdGJsX25hbWU9JVEgYW5kIHR5cGUhPSd0cmlnZ2VyJwB0YmxfbmFtZT0nJXEnIEFORCB0eXBlIT0ndHJpZ2dlcicAJyUuKnEnACV6LCAnYyVkJXEnAHR5cGU9J3RyaWdnZXInIEFORCBuYW1lPSclcScALCB4LiclcScAaW5kZXggJyVxJwBKU09OIHBhdGggZXJyb3IgbmVhciAnJXEnAERFTEVURSBGUk9NICVRLiclcV9kb2NzaXplJwBVUERBVEUgIiV3Ii5zcWxpdGVfbWFzdGVyIFNFVCBzcWwgPSBzcWxpdGVfcmVuYW1lX3RhYmxlKCVRLCB0eXBlLCBuYW1lLCBzcWwsICVRLCAlUSwgJWQpIFdIRVJFICh0eXBlIT0naW5kZXgnIE9SIHRibF9uYW1lPSVRIENPTExBVEUgbm9jYXNlKUFORCAgIG5hbWUgTk9UIExJS0UgJ3NxbGl0ZVhfJSUnIEVTQ0FQRSAnWCcAU0VMRUNUIENBU0UgV0hFTiBxdWlja19jaGVjayBHTE9CICdDSEVDSyonIFRIRU4gcmFpc2UoQUJPUlQsJ0NIRUNLIGNvbnN0cmFpbnQgZmFpbGVkJykgRUxTRSByYWlzZShBQk9SVCwnTk9UIE5VTEwgY29uc3RyYWludCBmYWlsZWQnKSBFTkQgIEZST00gcHJhZ21hX3F1aWNrX2NoZWNrKCVRLCVRKSBXSEVSRSBxdWlja19jaGVjayBHTE9CICdDSEVDSyonIE9SIHF1aWNrX2NoZWNrIEdMT0IgJ05VTEwqJwBVUERBVEUgIiV3Ii5zcWxpdGVfbWFzdGVyIFNFVCBzcWwgPSBzcWxpdGVfcmVuYW1lX3F1b3RlZml4KCVRLCBzcWwpV0hFUkUgbmFtZSBOT1QgTElLRSAnc3FsaXRlWF8lJScgRVNDQVBFICdYJyBBTkQgc3FsIE5PVCBMSUtFICdjcmVhdGUgdmlydHVhbCUlJwBVUERBVEUgdGVtcC5zcWxpdGVfbWFzdGVyIFNFVCBzcWwgPSBzcWxpdGVfcmVuYW1lX3F1b3RlZml4KCd0ZW1wJywgc3FsKVdIRVJFIG5hbWUgTk9UIExJS0UgJ3NxbGl0ZVhfJSUnIEVTQ0FQRSAnWCcgQU5EIHNxbCBOT1QgTElLRSAnY3JlYXRlIHZpcnR1YWwlJScAc3FsaXRlXF8lACQAU0VMRUNUKkZST00iJXciAFNFTEVDVCByYWlzZShBQk9SVCwlUSkgRlJPTSAiJXciLiIldyIAQU5BTFlaRSAiJXciLiIldyIAZm9yZWlnbiBrZXkgbWlzbWF0Y2ggLSAiJXciIHJlZmVyZW5jaW5nICIldyIAZG91YmxlLXF1b3RlZCBzdHJpbmcgbGl0ZXJhbDogIiV3IgBzeW50YXggZXJyb3IgYWZ0ZXIgY29sdW1uIG5hbWUgIiUuKnMiACVjIiVzIgAoIiVzIgBjYW5ub3QgJXMgJXMgIiVzIgBnZW5lcmF0ZWQgY29sdW1uIGxvb3Agb24gIiVzIgBjYW5ub3QgSU5TRVJUIGludG8gZ2VuZXJhdGVkIGNvbHVtbiAiJXMiAGVycm9yIGluIGdlbmVyYXRlZCBjb2x1bW4gIiVzIgBjYW5ub3QgVVBEQVRFIGdlbmVyYXRlZCBjb2x1bW4gIiVzIgAlcyBpbiAiJXMiAFVQU0VSVCBub3QgaW1wbGVtZW50ZWQgZm9yIHZpcnR1YWwgdGFibGUgIiVzIgB1bnNhZmUgdXNlIG9mIHZpcnR1YWwgdGFibGUgIiVzIgBjYW5ub3QgY3JlYXRlIGEgVEVNUCBpbmRleCBvbiBub24tVEVNUCB0YWJsZSAiJXMiAG5vIHN1Y2ggaW5kZXg6ICIlcyIAdW5rbm93biBkYXRhdHlwZSBmb3IgJXMuJXM6ICIlcyIAY2Fubm90IGRyb3AgJXMgY29sdW1uOiAiJXMiAG5vIHN1Y2ggY29sdW1uOiAiJXMiAG5vIHN1Y2ggY29sdW1uOiAiJVQiAHVucmVjb2duaXplZCB0b2tlbjogIiVUIgB3ZWVrZGF5IABub24tdW5pcXVlIGVudHJ5IGluIGluZGV4IAB3cm9uZyAjIG9mIGVudHJpZXMgaW4gaW5kZXggACBtaXNzaW5nIGZy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KQAAcUQAANYzAAD2MgAA9CoAAHkgAAB2DAAALSUAAEE4AADWMwAAr0EAAFkrAAA1BQAA1jMAAIApAAD2MgAAEEMAAAYuAACAEwAAjSsAAPkFAABaLQAAywsAAHsTAAArJAAA1jMAAOAvAACtKQAA4ysAABA1AADeNwAAFgoAABs4AAArJAAA1jMAADY0AAAmBAAAEi4AAHc5AAB3MgAATQ0AADAvAADoBwAAAwIBAEH0lQILJzsAOwA7ADsAAAA7ADsAOwAAADsAOwA7ADsAAAAAAAAAOwAAAAAAOwBBpJYCCys7ADsAOwA7ADsAOwA7ADsAOwA7ADsAOwA7ADsAOwA7ADsAAAAAAAAAOwA7AEHolgILUTsAOwA7ADsAOwA7ADsAOwA7ADsAOwA7ADsAOwA7ADsAOwA7ADsAOwA7ADsAOwA7ADsAOwA7ADsAOwA7ADsAOwA7ADsAOwA7ADsAOwA7ADsAOwBB8JgCC5QD//3//QD////+/v79+/r/AP3/APv+AP3+//4A/Pr+AAD+/fz8/P39+/78/P/+/fwA/wD+/v39/f7+///+/f4A/v4A//75+/v2AAD9AP7///z+APf8//38//3//v/39vz7//8AAPv9+/4AAP7+APv6+Pr6AP7//f/9+/3//v38/vwAAP3+AP37/f//AP7+AAD9AP4A/vz8+gD+AP7+/Pf7+f37+fgA/vT3+/j+/v8A/f3//f///fv//////fr7/Pr7//v9/f39/f39/f79+/79/fz6+/7+/v3//vv//vv9+/v8+/v8/gD/AAD9/wD99P8AAP37/QD+/P79/gD9+/r7+v7++/X//gD///0A/v3+/f3+9/j6/fz6/////Pr9AP7//f/9+vn6//j//PgA//3//v3//v36//3//fv7+vz7//4A/fr///7//v7+AP7+/v/+/v///P77//7///79AP/+/wD+//z+//////////4A/vz+/v3/AP/////+//8A////////////AP3/AP8AAP///f4A/P4AQZCcAgvWLHAGxQX4BEIBQgEBACcFxgXTBS0HLQctB9cBAAAAANYARQQtBy0HLQctBy0HLQctBy0HLQctBy0HLQctBw8BDwHDBMME2ABYAAEAAQABAAEAAQAoAG8AAgFpAdUBAAJHAm4CtQLcAiMDSgORAzEERQRFBEUERQRFBEUERQRFBEUERQRFBEUERQRFBEUERQRFBEUEWQRFBMAEvQO9A2MGfgbxBi0HLQctBy0HLQctBy0HLQctBy0HLQctBy0HLQctBy0HLQctBy0HLQctBy0HLQctBy0HLQctBy0HLQctBy0HLQctBy0HLQctBy0HLQctBy0HLQctBy0HLQctBy0HLQctBy0HiQC1ALUAtQC1ALUAtQC1AF4ArgFCAEEAcABuARUCFQLkAu0EFQIVAk8ATwAVApwBnAGcAU0AnAF7AHEAcQAWABYAMggyCEgBSAFIAe8A1AHUAdQB1AH3A/cDmQFuAWkEogQVAhUCFQIVAhUCFQIVAhUCFQIVAhUCFQIVAhUCFQIVAhUCFQIVAhUCyQNtAm0CFQKCAhQDFAPMBMwENgM2A0MA+gQyCDIIMggyCDIIMggyCBsFugO6A0kC2AGAAoMBtwIaAh0CvAIVAhUCFQIVAhUCFQIVAhUCFQIVAt4AFQIVAhUCFQIVAhUCFQIVAhUCFQIVAhUCmwSbBJsEFQIVAhUCNQIVAhUCFQKUA3gEFQIVAggFFQIVAhUCFQIVAhUCFQIVAn8CMgXRADQENAQ0BDQERALRANEAIQUAA5UDiQKdBCQFlQEkBdYE+QCdBJ0E+QCdBJUB1gRZBdAB6wT0A/QD9ANYBVgFWAVYBbgAuAAuBYgDBwXIBbAGsAZhBmEG3QbdBmEGbwZzBvcG5Ab/Bv8G/wb/BmEGDgeNBnMGcwaNBvcG5AaNBuQGjQZhBg4HigbzBmEGDgcfB2EGDgdhBg4HHwfEBsQGxAYCBzAHMAcfB8QGygbEBgIHxAbEBqUGNAfeBt4GHwdhBv0G/QYPBw8HzgbYBlUHYQbPBs4G3wblBo0GVwdpB2kHegd6B3oHMggyCDIIMggyCDIIMggyCDIIMggyCDIIMggyCDIIzwBHBEsBbAKHAyYDMgTLBZgFyQUqBVoFcgXrBQsFCgYLBhUGOwY+Bj8GmgWtBVIGtgUfBtEFbAZ2BlAGfAYMBg0GkgaVBj0G5gKVB5kHhwf7BpEHlAeOB5AHHQcSBygHkgeSB5YHHgebByAHnQewByQHMQeSBzIHeAeTB5IHIgeBB4IHhQeGBzoHSQecBzMHvge8B6wHUAcjB4gHsgeJB4MHpgc4B10HuQe/B8EHTwdYB8AHlwfCB8MHxAfGB5oHowfHB3cHxQfKB58HyAfMB1EHzgfQB9EH0gfTB9QHzweNB2IH2QfaB3YH1QfcB2QH2wfWB9cH2AfdB54HqgelB94HsQegB98H5wfqB+sH6QfsB+IHeQd7B+8H2wfxB/QH9Qf2B/cH+Af7BwMI/Af9B/4H/wcBCAIIAAiYB48HoQeiB6QHBAgHCAUIGQgaCMEAwQDBABIBEwEUAcEAEgETARQBwQDfANsA4QDOANIA0wDUAMEAEwDbAOkA2ADYANkA2ADZAMEAJwHYANkAHwDBANgA2QDBAOQA1QDmACcAzgDYANkAKwAsAC0ALgAvADAAMQAyADMANAA1ADYANwA4ADkAwQATALkAugC7ALwAvQC+AP0AEgETARQBwwDBAMUAwQAFARIBEwEUAf0AzADuAMwAUQArACwALQAuAC8AMAAxADIAMwA0ADUANgA3ADgAOQASARMBFAEGAWYAZwBoAGkAagBrAGwAbQBuAG8AcABxAO8A8ADvAPAA0gDTANQAOgE7AToBOwA8AVYA/ABYAPwAEwA6ATsBAAEBAXEAGQBIACgBigCLAAoBZgBnAGgAaQBqAGsAbABtAG4AbwBwAHEAKwAsAC0ALgAvADAAMQAyADMANAA1ADYANwA4ADkAUQAkATsAJAEqAWwAbQBuAG8AcABxAEUAdAB1AHYASABqAGsAwQBvAHAAcQA2ADcAOAA5ADoAZgBnAGgAaQBqAGsAbABtAG4AbwBwAHEAeAAZANgA2QCRAGYAZwBoAGkAagBrAGwAbQBuAG8AcABxAOcAigCLAHQAdQB2AKQAmQATAJsANgA3ADgAOQBmAGcAaABpAGoAawBsAG0AbgBvAHAAcQCAAIEALgAvADAAMQArACwALQAuAC8AMAAxADIAMwA0ADUANgA3ADgAOQDYAMEAGQA7AMEAEwClAKYAwQBDABgAZgBnAGgAaQBqAGsAbABtAG4AbwBwAHEASQDYANkAOwDYANkAKwAsAC0ALgAvADAAMQAyADMANAA1ADYANwA4ADkAZgBnAGgAaQBqAGsAbABtAG4AbwBwAHEAeQCRADsAwQB0AHUAdgB3ABEBzAB6AHsAfAATABQAhgAWAIgAiQATAIQAfwCAAIEAGAAWABcAdAB1AHYAJADBAGYAZwBoAGkAagBrAGwAbQBuAG8AcABxAO8A8AA3ATgB1wBqAGsA8QATADsA2ADZAN8A/ABzAHQAdQB2AJcAeAAaAEcAwQA0ATUBwQCVAIAAOQHYAA0BUQArACwALQAuAC8AMAAxADIAMwA0ADUANgA3ADgAOQD9ANgA2QBkAF8AmQA7AJsABQFqAGsAGQDBAGUAwQDBAOcAcgAZAHQAdQB2AHEAMAF5AMEAzAA7AHcAeAB5AHoAewB8AH0A2ADZAMEA2ADZAIMAigCLAOYAZgBnAGgAaQBqAGsAbABtAG4AbwBwAHEAmQCaAJsAnACdAO8A8AB0AHUAdgBMAMEAFwATABkAFgD9ABcA/AD9AGwAVwDMAFkABQHGAFwABQF0AHUAdgDBADIBMwHYANkAlgArACwALQAuAC8AMAAxADIAMwA0ADUANgA3ADgAOQA7AMEA2ADZABMA7wDwABsBFwBqAGsAbABtAG4AbwBwAHEASQD8AP0AjgA0ATUBigCLAFEAOQGRACsALAAtAC4ALwAwADEAMgAzADQANQA2ADcAOAA5ADMBZgBnAGgAaQBqAGsAbABtAG4AbwBwAHEAGQF0AHUAdgAdARcAwQAZAHcAOwDBAHoAewB8ADsAfwDLADsAzQATAAwBhAAZABcAFgDBAIoAiwD5AMwA+wBmAGcAaABpAGoAawBsAG0AbgBvAHAAcQArACwALQAuAC8AMAAxADIAMwA0ADUANgA3ADgAOQATABYAFwA7ABcAGQDvAPAAdAB1AHYAwQALAHQAdQB2AHQAdQB2APwADQEWAMEADwArACwALQAuAC8AMAAxADIAMwA0ADUANgA3ADgAOQARAY8AwQB2AI8AZgBnAGgAaQBqAGsAbABtAG4AbwBwAHEATAB2ADsA8QB0AHUAdgAwAdgA2QAkAY8APABZAPEAEwBcAMEAwQAXABYANwE4AecAZQAWAI8AZgBnAGgAaQBqAGsAbABtAG4AbwBwAHEAKwAsAC0ALgAvADAAMQAyADMANAA1ADYANwA4ADkAEwDBAMEAOwAXAHQAdQB2ADsAyQAVAPEAMAEWAM4AfwCAAIEAwQCAAIEA6wDsADABKwAsAC0ALgAvADAAMQAyADMANAA1ADYANwA4ADkAFgDBANgA2QDBAGYAZwBoAGkAagBrAGwAbQBuAG8AcABxAOcAwQDBAMEAdAB1AHYA2ADZAHQAdQB2AOIAUADBABMA6wDsADABFwDTANQA5wDMANgA2QDNAGYAZwBoAGkAagBrAGwAbQBuAG8AcABxACsALAAtAC4ALwAwADEAMgAzADQANQA2ADcAOAA5ABMAwQB7AEwA7wDwAMEA/QDvAPAA7wDwAMEAagBrAMEAWQD8AMEAXAA7APwAjQD8ACsALAAtAC4ALwAwADEAMgAzADQANQA2ADcAOAA5ABwBoQDYANkAwQBmAGcAaABpAGoAawBsAG0AbgBvAHAAcQDnAMEAEAC7ALwAvQC+AAcACAAJADUBwwAZAMUAOQETAH8AgACBAAYBzAAWAHUAGADYANkABwFmAGcAaABpAGoAawBsAG0AbgBvAHAAcQArACwALQAuAC8AMAAxADIAMwA0ADUANgA3ADgAOQDBAO8A8ADBADsAEwC8AP0AvgBNAOIATwDBAMMA/ADFAMEAEwAtAS4BwQDBAMwA2ADZAOIA2ADZAAoBzACfAC0ALgAvADAAMQAyADMANAA1ADYANwA4ADkAZgBnAGgAaQBqAGsAbABtAG4AbwBwAHEADADvAPAA6AAqAe4AdQD9AO8A8ADuAAMBBAHBAPwAGwAfAMEAwQCOAMwA/ADBAMEAJwAGAcEAZAAKARYBKgDMAGYAZwBoAGkAagBrAGwAbQBuAG8AcABxAHUAnwDYANkAeQDYANkAPwDBAMEAwQDvAPAAcwB0AMEAKgFJAO4A7gDnABMA7wDwAPwAFgAYANMA1AAYAMEA2ADZANgA2QD8AJkAmgCbAP0AEAATAJAA1QAMASsALAAtAC4ALwAwADEAMgAzADQANQA2ADcAOAA5AO4AEwA7AMEAOwArACwALQAuAC8AMAAxADIAMwA0ADUANgA3ADgAOQAWABcAwQAZAMEAKwAsAC0ALgAvADAAMQAyADMANAA1ADYANwA4ADkAHAFNAMEATwBmAGcAaABpAGoAawBsAG0AbgBvAHAAcQAeAcEAwQDBAHUAIwF1AOgAZgBnAGgAaQBqAGsAbABtAG4AbwBwAHEAzAAWABcAQgAZANgA2QAjAGYAZwBoAGkAagBrAGwAbQBuAG8AcABxAMEADAFVAGUAwQA1ATUB8AATADkBOQFeANAA0QDBAO8A8ADBAEIA/AATAAwB9ADYANkAwQBKANUA/AChABMABwH+ACwALQAuAC8AMAAxADIAMwA0ADUANgA3ADgAOQDBANgA2QAFADsAwQATAPQACgALAAwADQAOAGUANQERAJIA/gA5AcEAwQBMAHMA2ADZADUBDAAHAR4AOQEgAC4AVwAuAFkAggDBAFwAKAAWAAcBGwDYANkAZgBnAGgAaQBqAGsAbABtAG4AbwBwAHEAKgCWACMB2ADZAHQAdQB2ABMAFADBABYARgAEAXQAwQAYAAgBwQAHAU4APwA9AFEAdAAkAMEABAHBAB0AwQAIAcEAIQCRAMEAOwAwANgA2QBiANgA2QDBAHMAwQBzAMEAOwDYANkA2ADZANgA2QDYANkA/wDYANkARwDBAIMAwQAZAEEA2ADZANgA2QDYANkA0ADRAFUAhQDBAGQAwQBaAIoAiwCKAIsA2ADZANgA2QDBAGQAwQBsAIcAdAB1AGoAawCMAHkA2ADZANgA2QByAKIAdAB1AHYAKwEsAXkA2ADZANgA2QDBAPQAwQCHAPQAwQAAAQEBjAD0AMEA/gDBAMEA/gCZAJoAmwCNAP4AlQCWAAIB2ADZANgA2QCZAJoAmwCcAJ0AAAABAAIA2ADZAAUAcwCeAMEAoAAKAAsADAANAA4AwQA7ABEAfgDBABMAFACBABYAwQAWABYAGADBABcAHgAZACAAEwAUAJAAFgAkANgA2QAoAMEA2ADZAMEAmACBANgA2QDBACQA2ADZAMEAYwDBAMEANQDBAMEAOwAXAMEAGQDYANkAwQDYANkAmABGADsARwA7AHUAwQDYANkATgDYANkAUQDYANkAPgFHAFUAwQCFAMEAwQBaABcAFwAZABkAeAB5AGIAVQDBAGQAwQAXAFoAGQB5AGoAawATANgA2QDYANkAZAByAIMAdAB1AHYAagBrAHkA2ADZANgA2QDBAHIAdQB0AHUAdgCFAMEAeQDBAMEAigCLAMEAFwDBABkAFwAXABkAGQAHAAgA2ADZAMEAwQCZAJoAmwCcAJ0A2ADZAMEAogDYANkA2ADZAJkAmgCbAJwAnQABAAIAwQDBAAUAEwAUADsAFgAKAAsADAANAA4AwQBhABEAwQAXAMEAGQAgASQAwQDyANgA2QDsABcAHgAZACAAEwAUABcAFgAZANgA2QAoANgA2QDYANkAwQA7ANgA2QDBACQAUwBUAJkAmQCbAJsAFwBHABkAFwDBABkAwQDBAMEAdQDBAMEAwQBGAMEAwQA7AMEA/wD/AB8BTgD/APMAUQC/AP8AKQFHAA8BZAAlAfUACwHWAPYAagBrAGwA9gAPAWIA9QAlAXIA3AB0AHUAdgALAQ8BeQAPAeEA2wDlANsAZADbAAMBAwEDAQMBagBrAPkAxAA8ABgBjQDzAHIA+QB0AHUAdgCFAPUAeQDIACkBigCLAJkAmgCbAJwAnQApAcgAJgATABQAlwAWAMgAlgCMACYBJgEWABABKwDqABIAogAOAcgAJADtAJkAmgCbAJwAnQDtABsB7QDtABIAxwCVAPYAEAEOARAByACeAPYA9gDqADsA6gD2AMcAIgE+ACEByADHABYA3QBzAEcAyADIAMcAxwDdANoA2gATABQAQAAWANoA4wAWAOAAfgDgAKUA3QAYADEByABxADgBJADaANwA2gBkABoB2gBbANoAPQFqAGsA3QDjABoBPQFSAJQAcgAJAXQAdQB2ADsAkQB5ABYAFQGeAMgACQEZAMoAkwD6AEcAFwENAJIAwgDCAPkA+AD6AIwA9wD2AAYAwADAAMAALwEvAdUAzwAsAdUAmQCaAJsAnACdANUA1QBkANUA3gDPANYA1gBqAGsABADeAM8AAwAWAKMAcgAPAHQAdQB2ABAAFwB5ABcAiwCXAIIAGQCOABAAGAAUAJAAAQCOAIIAggA9ADUANQAlAJcANQA1AIIAdAAiAAEAjQAFABYAcwChAI0AmQCaAJsAnACdABkARABEAEsAKQBzABgAgwAUABMAfQAWAGAAFgAWAEMAFwAWAEMAOwAYABYAHABDABcAFgAWAJUAFwAXABcAdAAXABkAJQBhAI0AFwAXABYAjwAZAEsAWAAiACIAIgAiAFYASwBdABcAIgAWACIAGQAYACIAGQAXAI4AFwCOACwAFwAXABcACwAXABkAFgAWABYADwAXABcAFgAWABkAAQABAI0AGQAXAIcAPwE/AT8BPwE/AT8BPwE/AT8BPwE/AT8BPwE/AY0AjQA/AY0APwE/AT8BPwE/AT8BPwE/AT8BPwE/AT8BPwE/AT8BPwE/AT8BPwE/AT8BPwE/AT8BPwE/AT8BPwE/AT8BPwE/AT8BPwE/AT8BPwE/AT8BPwE/AT8BPwE/AT8BPwE/AT8BPwE/AT8BPwE/AT8BPwE/AT8BPwE/AT8BPwE/AT8BPwE/AT8BPwE/AT8BPwE/AT8BPwE/AT8BPwE/AT8BPwE/AT8BPwE/AT8BPwE/AT8BPwE/AT8BPwE/AT8BPwE/AT8BPwE/AT8BPwE/AT8BPwE/AT8BPwE/AT8BPwE/AT8BPwE/AT8BPwE/AT8BPwE/AT8BPwE/AT8BPwE/AT8BPwE/AT8BPwE/AT8BPwE/AT8BPwE/AT8BPwE/AT8BPwE/AT8BPwE/AT8BPwE/AT8BPwE/AT8BPwE/AT8BPwE/AT8BPwE/AT8BPwE/AT8BPwE/AT8BPwE/AT8BPwE/AT8BPwE/AT8BPwE/AT8BPwE/AT8BPwE/AQBB8MgCC+QgOALQADgCdgBzAOUAOAJ2AHMA5QA4AiIFeQENBZgBMgIyAjICOAKZAXoBIgX8BCkAKQApACkA0AD2BUcARwDLA6MBKQApAOsBLwEXAS8BzAONAUcARwB9AH4AUADBBMEEGgQdBBAEEAR7AHsAfAB8AHwAfADcAZkB2QQBAAEAPwICAN0EJgJ2AHMA5QA9AeABkgDgAQwCdgBzAOUAEQIvBaEBCwKOAH0AfgBQAMEEwQQaBB0EEAQQBHsAewB8AHwAfAB8AHYAcwDlAEcBegB6AHoAegB5AHkAeAB4AHgAdwB0ALwBHAEcARwBHAG6AboBugEfBngBIQaoBHcBiwQ1AosENQKZAR8GGQIDAeIAvAFlAJEAwQE8AS8C8AB6AHoAegB6AHkAeQB4AHgAeAB3AHQAvAF9AH4AUADBBMEEGgQdBBAEEAR7AHsAfAB8AHwAfACOACYBqARTAcABeAB4AHgAdwB0ALwBfwCoBKkEqgSUALkBuAE4AncAdAC8AXwAfAB8AHwAdQB6AHoAegB6AHkAeQB4AHgAeAB3AHQAvAHGAXEADQANACICegB6AHoAegB5AHkAeAB4AHgAdwB0ALwBpgE8AS8CqASpBKoElQDIBJkByAR8AHwAfAB8AHoAegB6AHoAeQB5AHgAeAB4AHcAdAC8AdEBVgENBA0EGwQeBH0AfgBQAMEEwQQaBB0EEAQQBHsAewB8AHwAfAB8AP8ECgLeAKgEOAKZAeAAAgKvAFIAUwB6AHoAegB6AHkAeQB4AHgAeAB3AHQAvAHvAxAAEACoBIUAhQB9AH4AUADBBMEEGgQdBBAEEAR7AHsAfAB8AHwAfAB6AHoAegB6AHkAeQB4AHgAeAB3AHQAvAERBCICqAR1AagEqQSqBPwAmgWPAfgB9QH0AW8AMAI2AgQAngOeA7EB8wFUAcwBSAFoAYoB1QSoBKkEqgQzAjgCegB6AHoAegB5AHkAeAB4AHgAdwB0ALwBHAEcAXEBLAZHBrkBuAGaAJkBvQFHAEcABgU1AsUEqASpBKoEVQDHBA8BLQIfAgMCGQY4AmIAxgQGAP4E2AGOAH0AfgBQAMEEwQQaBB0EEAQQBHsAewB8AHwAfAB8ACYCDQANAAME+wHIBKgEyAQlAm0AbQDeADgC1gSvADgCqwFuAMUAvQE6AjkCrgEQBvkDRQEnAqgEDgEfAXAB/gFrAf0BAQFHAEcAHwJHAEcAZwE8AS8CTQZ6AHoAegB6AHkAeQB4AHgAeAB3AHQAvAH5A/kD+wP8AxsAHAEcAagEqQSqBIYEOAJMBpkBhQO+ACYCZAE1AiYCqQMVAgUChgQEAp0BhgQoAqgEqQSqBDgCIAISBjMAMwDWAH0AfgBQAMEEwQQaBB0EEAQQBHsAewB8AHwAfAB8AKgE2gGHAIcAmQEcARwB0gX5AXkAeQB4AHgAeAB3AHQAvAHvAzUCBgLZAB0CGQY8AS8CjgAGABQCfQB+AFAAwQTBBBoEHQQQBBAEewB7AHwAfAB8AHwAEwZ6AHoAegB6AHkAeQB4AHgAeAB3AHQAvAHlAagEqQSqBOIBGQHzBL0D/ACoBHUB+AH1AfQBqARUATsCqAQ7ApkBJAHzAb0DbAO/AOABPAEvAoABIgF8AXoAegB6AHoAeQB5AHgAeAB4AHcAdAC8AX0AfgBQAMEEwQQaBB0EEAQQBHsAewB8AHwAfAB8AJkBigFwBKgEZQNkABwBHAGoBKkEqgR1AUUEqASpBKoEqASpBKoENQLHASAAdQHpAH0AfgBQAMEEwQQaBB0EEAQQBHsAewB8AHwAfAB8AJkFvwM4AuQAvgN6AHoAegB6AHkAeQB4AHgAeAB3AHQAvAGGBOQAqASdAKgEqQSqBBEGDQANAC0BvQPQBIYEmQCZAYYEdQEvBpgEBQBxASwGrQHWBAMAvQN6AHoAegB6AHkAeQB4AHgAeAB3AHQAvAF9AH4AUADBBMEEGgQdBBAEEAR7AHsAfAB8AHwAfACZAdAANwKoBAQEqASpBKoEqASEAVQDmwAQBh4BkgFKBEoE6AE4AtEBVgEnBScFEAZ9AH4AUADBBMEEGgQdBBAEEAR7AHsAfAB8AHwAfACBADgCDQANAHYBegB6AHoAegB5AHkAeAB4AHgAdwB0ALwBLgE4AsUBEAKoBKkEqgQNAA0AqASpBKoEEQXPAfMEmQElBSUFEAb0A8UBxAHIACsBRwBHAPEEegB6AHoAegB5AHkAeAB4AHgAdwB0ALwBfQB+AFAAwQTBBBoEHQQQBBAEewB7AHwAfAB8AHwAmQHjADEEhgQcARwBowE4ARYBFgEdAR0BiwWWAZUBfgGGBDUCOAKGBKwENQJABjUCfQB+AFAAwQTBBBoEHQQQBBAEewB7AHwAfAB8AHwAxQHKBQ0ADQAABnoAegB6AHoAeQB5AHgAeAB4AHcAdAC8AckAOAJiATIGPwICAN0ESANJA0oDGgY9AbwEkgAGAJkB/wD+AP0AzgAvBQkArAQGAUcARwCoAXoAegB6AHoAeQB5AHgAeAB4AHcAdAC8AX0AfgBQAMEEwQQaBB0EEAQQBHsAewB8AHwAfAB8ADgCHAEcATgCvQSZAT4COQHdBF0BEAVgAaMBPQE1ApIA6wENAmsGiwFzAesBLwVGAEYADwVHAEcA8AAtBWgAUADBBMEEGgQdBBAEEAR7AHsAfAB8AHwAfAB6AHoAegB6AHkAeQB4AHgAeAB3AHQAvAFaBBwBHAGsAcAB9QW9BLcBHAEcAdEFSAU3AdoBNQJbBMsD6wHrAdkA7wQ1AgIGOALMA88AOAIDBPAAfwFcBAcCegB6AHoAegB5AHkAeAB4AHgAdwB0ALwB+gNrAEcARwD5Aw0ADQCQAzgC1wU4AhwBHAFhAA4C6wHAAZEDLgUqBSECmQEcARwBNQKXANEA1wXZBQYBwgE3ADcAOAA4ADUC+QP5A/sDuwFMAZkBDwIMACcBfQB+AFAAwQTBBBoEHQQQBBAEewB7AHwAfAB8AHwAWwGZAWAD/gW9BH0AfgBQAMEEwQQaBB0EEAQQBHsAewB8AHwAfAB8AHEEaQbaAWkGcwF9AHIAUADBBMEEGgQdBBAEEAR7AHsAfAB8AHwAfADXBUkB2gFLAXoAegB6AHoAeQB5AHgAeAB4AHcAdAC8AcsAiwU4Ag4FYAPQAb0EtAF6AHoAegB6AHkAeQB4AHgAeAB3AHQAvAEpAnEEagYbAmoGDwAPAHwDegB6AHoAegB5AHkAeAB4AHgAdwB0ALwBOAIqARoCbwSLBRcGGAYzBZkBBgAGAJEE9ASfAUABHAEcAYsF/AE1Ag0CLAHJASsAKwA4An0DDAA1AkoB3gGpAZcBfgBQAMEEwQQaBB0EEAQQBHsAewB8AHwAfAB8ADgCOQA5ACABqASLBfABygGIAYgBhwERAYUBbwQWBlEDkQSXAQYAOAJBAYYE1gEsACwAFQZaBKoB6gAGAEMBAAEcAgABhgSvATgChgRCAREA5wFbBDoAOgB6AHoAegB6AHkAeQB4AHgAeAB3AHQAvAFcBNgA4QE7ADsAqASpBKoEbwAwAkQBBADsAMgBDgI4Au0AyAE4ArUBqAAsAqQBjQDfATMCOAIlATgCRwQ4AiUBOAJHBBMCOAJoAwgAPAA8AOsAPQA9ADgCngE4Ap4BOAK9AT4APgAtAC0ALgAuAC8ALwDHADEAMQAtAjgCZwE4AmQA5gEyADIAPwA/AEAAQAAxAp8BFwKaATgCAwQ4AhYCPAEvAjwBLwJBAEEADgAOADgCAwQ4AgACpANoA/oDbQBtAKMD+QNCAEIAgwCDAG4AwwG9AToCOQKgAbEA+QOEAIQAQwBDADgC0wE4AqQD1wFUBRsB4gCjAzsBUwWXATgCywGXAfkD+QP7A+8AlwFWANUARgU0ADQARABEAPkD+QP7A/wDGwAxBpwEvwFFAEUAIAFhAGwABQZqAIgBiAGHAREBhQE4Am8DUQNzAzgCbwAwAtIBBAA4ApgAHgAmADgCbATqAIwBQwFvADACDwIEADMCNQA1AEIBOAKjAKMAOAJRAdQBpACkAE0BMwJMAEwAOAIhAeoFOAIfAOkFOAK9AVIB4wFkADYANgBYAUgASAAoAewAOAQtAr0BbwNQBYYAhgCoAEkASQCNAKEAoQAmBi0CFwI4Aj8BOAJcARgC8QPZAQUBBQF7A3oD6wAXAjgCAwQ4AtsBFgIFAW8BbQBtAAkCiACIAIIAggADBG4AbgG9AToCOQJtAG0A+QOiAKIAnACcADgCbgA4BL0BOgI5ApoBXwH5AzgCYQE8AS8COAJXATgCZADxAWUBAgFkAIIDgwOMAIwAYwEeBfkD+QP7A/wDGwCLAIsAagHDAYkAiQCKAIoA+QP5A/sD/AMbAJwEvwE4AnQBIAFvADAC/QMEAIgBiAGHAREBhQE4AnUEUQM4AjQEOAICAewBMwI4AtMASwBLACsCwgPqAAUBQwFvADACoQMEAHEATQBNAEIBSgBKACoAKgBdBb0BMAAwAIoFMwLOA88DRARDBEQEQwReAy0ClgCiA0IFcQBOBSoCkAX9A/sE8gTmBOwA5QTnBL0BOQY/BTQBFAGoADUBCwCNAIkBNgHoAC0CfQUDBE8BIwF4BdsAUAFtAG0AqAMpAYIF6wBVAd0BbgD2Ab0BOgI5AnEFgQX5A5ABDQVtAd8AzgUDBM0FSwVMBUoFSQVtAG0AzAA8BtAELgIJAdoAbgDNAL0BOgI5ApoBgwH5A/0FswA8AS8C+QP5A/sD/AMbAOYA+wXNBE8AMAJVAAQAogHXACQCUQBUALwAfgWtALUAzQHDASMAzgEzArcA+QP5A/sD/AMbALgA0wW5ALoA7wHyAGIAjgGEBSQAgwXkAVsA1QGRAYYFvQHAAMgF9gDeBeoBWgEVAfgAxADtAf8BLQJeAegE+QD6AJMBIQUgBW8AMAKwAQQAHwUYBV0ASwZzA0oG4ACUAbIBCAIHAbMBKwYzAgMFAgVsAQMEMgEBBQgBSQYdBm0AbQByARcFMwEcBrYBgABuAGIFvQE6AjkCvQEiAvkDCgC6BWkAfQFhBSIAPAJjADgFLQI6AaIEEgIQARIBewHSADcFIwKBAYIBEwE9AuME3gSbAZwB7gWlALIA7wX5A/kD+wP8AxsA7QXsBQMETgCTAKYA3ADdAG0AbQBEAzABpwC+AdQAPgFuAOcAvQE6AjkCkABCBPkDQARGAbQAqQC8BLYATgHuAJMD8QBQBLsAqgCrAKUBVwBYAKcBvQBZAFoArABTBPMATwT0AJ4AEgD1AFkB9wD5A/kD+wP8AxsABQFIBMEAygTpAcIAJQBuAVMD7gH7AMMA+gFcABMA8gFmARQA9wFxA2kBXgB+AzEBnwABAicAXwCWBKAAIATGA3cEYACuAHYE4QAYARoBxgDAA3EAjASIBAQBFQAWABcAigSQBI8EfAQYACEAGQDKAB4CGgBkAC8EZgAhBGcABwAfBCMEWQQkBFgECgELARwAKACGAf4DXwNwAB0ANAKeBJ0EDAGwAI8AnQPaBNoE2gTaBNoE2gTaBNoE2gTaBNoE2gTaBNoEDQFCBtoEQQYAQeDpAguBCW8GbwZvBsMF2ARHBdgE2ATYBMMFwwXDBdgEZQVlBfgF+QTYBNgE2ATYBNgE2ATYBNgE2ATYBMIF2ATYBNgE2AQbBhsG2ATYBNgE2ATYBNgE2ATYBG4F2AR1BdgE2ATYBNgE2ATEBcUF2ATYBNgE9wX5BdQFfAV7BXoFeQXmBVkFcwVsBXAFvgW/Bb0FwQXFBcQF2ARvBZ4FrgWdBdgE2ATYBNgE2ATYBNgE2ATYBNgE2ATYBNgE2ATYBNgE2ATYBNgE2ATYBNgE2ATYBNgE2ATYBNgE2ATYBNgE2ATYBNgE2ATYBNgE2ATYBNgE2ATYBNgE2ATYBNgE2ATYBNgE2ATYBNgEpgWtBawFqwW0BaoFpwWgBZ8FoQWiBdgE2ATwBNgE2ATtBCMF2ATYBNgE2ATYBAsGCgbYBKMF2AT5BJgFlwWxBaQFsAWvBf8FPwY+BtUF2ATYBNgE2ATYBNgEGwbYBNgE2ATYBNgE2ATYBNgE2ATYBNgE2ATYBNgE2ATYBNgE2ATYBNgE2ATYBNgEWwUbBhsG2AT5BBsGGwZcBVwF9QT1BF8F2AQGBj4FPgU+BT4FRwU+BdgE2ATYBNgE2ATYBNgE2ATYBNgE2ATYBNgE2ATYBPwF+gXYBNgE2ATYBNgE2ATYBNgE2ATYBNgE2ATYBNgE2ATYBNgE2ATYBNgE2ATYBNgE2ATYBNgE2ARDBdgE2ATYBNgE2ATYBNgE2ATYBNgE2AQ4BtgE4QUxBUMFQwVDBUMFRQUyBTAFPQX6BN8EZwZ/BXQFRAV0BWQGcgV/BX8FcgV/BUQFZAYKBU8GBQVlBWUFZQVbBVsFWwVbBV8FXwXABUQFPQXYBGcGZwZNBU0FZgZmBk0F1QVXBogFJgUsBSwFLAUsBU0F6gRyBVcGVwZyBYgFJgVyBSYFcgVNBeoE5QVhBk0F6gTLBU0F6gRNBeoEywUkBSQFJAUZBdgE2ATLBSQFCgUkBRkFJAUkBS0G2ATPBc8FywVNBSUGJQZoBWgFbQVfBcYFTQXYBG0FawVpBXIFHAU7BjsGNwY3BjcGbAZsBgYGSAb5BPkE+QT5BEgGDAUMBfoE+gT5BEgG2ATYBNgE2ATYBNgEQwbYBAEG1gVRBdgE2ATYBNgE2ATYBNgE2ATYBNgE2ATYBNgE2AQMBtgE2ATYBNgE2ATYBNgE2ATYBNgEjQXYBNsEAwbYBNgE2ATYBNgE2ATYBNgEdgV3BVIF2ATYBNgE2ATYBNgE2ASFBdgE2ATYBIAF2ATYBNgE2ATYBNgE2ATYBGMG2ATYBNgE2ATYBNgE5AXjBdgE2ARPBdgE2ATYBNgE2ATYBNgE2ATYBNgE2ATYBNgECAXYBNgE2ATYBNgE2ATYBNgE2ATYBNgE2ATYBNgE2ATYBNgE2ATYBNgE2ATYBNgEagXYBNgE2ATYBNgE2ATYBNgE2ATYBNgE2ATYBNgEKgZgBdgE2ATYBNgEWgbYBNgE2ATYBNgE2ATYBNgE2ATYBNgE2ATYBNgEUwY0BY8F2ASOBZIF7gTYBOQE2ATYBAkAQYDzAgvnBr0AvQC8AL4AvwC/AL8AvwC+AL4AvgC+AL4AwwDFAMcAxwDGAMYAxADEAMsAywDNAM0AzgDQANAA0ADRANUA1gDXANcA1wDXANcA1wDXANcA1wDXANcA1wDXAOAA4ADcANwA3gDeAOEA4QDhAOEA4gDiAOIA4gDiAN8A3wDjAOMA4wDKAOUA5gDmAOYA5gDmAOkA2gDaAOoA6gDrAOsAvgDtAO0AvgC+AL4AzADMAMwA7wDyAPIA8gDwAPAA/AD8APMA8wDzAP4A9AD0APQA/wD/APUA9QABAQEBAAEAAQABAAEAAcgAyADuAO4ABgEGAQYBBgECAQIBAgECAQMBAwEDAQgBBAEEAfkA+QDnAOcA2wDbANsACQEJAQkB9wD3APgA+AD6APoA+gD6AL4A9gD2AAsBCwELAQsBvgAMAQwBDAEMAb4AvgAPAQ8BDwEPAQ8BDwEQAQ0BDQEOAQ4BBwEHAdkA2QDZANkA2QDYANgA2ADZANkA2QDZANkA2QDZANgA2QDZANkA2QDZANkA2QDZANkAEgHZANkA2QDZANkA2QDZANkA2QDZANkA2QATARMB2QAUARQB2QDZANkA2QDZANkAFwEXARgBGAEWARYBBQH9AP0AFQEVAb4AGQEZAd0A3QDoAOgAGgEaAb4AvgC+ABsBGwG+AL4AvgC+AL4A0wDUAL4AHQEfAR8BHwEgASABIAEiASIBHgEeASQBJQElASMBIwEjASMB2QDZAOwA7ADsAL4AvgC+ACcBJwG+AL4AvgC+AL4AvgC+ACgBvgC+AL4AKgEsAS0BLQEuAQoBCgExATEBMQEwAfEA8QAyATIBMwE0ATQBNAE0ATQBNAE1ATUBNQE5ATsBOwE8ATwBOgE6AT0BPQE+AT4BPgH7ABEBEQERATgBOAE3AbkAugC6ALsAuwC7AMAAwADAAMIAwgC+AMsAyQDJAMEAwQDBANAA0QDSANIAzwDP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IGRhdGEgdHlwZQBObyBzcGFjZSBsZWZ0IG9uIGRldmljZQBPdXQgb2YgbWVtb3J5AFJlc291cmNlIGJ1c3kASW50ZXJydXB0ZWQgc3lzdGVtIGNhbGwAUmVzb3VyY2UgdGVtcG9yYXJpbHkgdW5hdmFpbGFibGUASW52YWxpZCBzZWVrAENyb3NzLWRldmljZSBsaW5rAFJlYWQtb25seSBmaWxlIHN5c3RlbQBEaXJlY3Rvcnkgbm90IGVtcHR5AENvbm5lY3Rpb24gcmVzZXQgYnkgcGVlcgBPcGVyYXRpb24gdGltZWQgb3V0AENvbm5lY3Rpb24gcmVmdXNlZABIb3N0IGlzIGRvd24ASG9zdCBpcyB1bnJlYWNoYWJsZQBBZGRyZXNzIGluIHVzZQBCcm9rZW4gcGlwZQBJL08gZXJyb3IATm8gc3VjaCBkZXZpY2Ugb3IgYWRkcmVzcwBCbG9jayBkZXZpY2UgcmVxdWlyZWQATm8gc3VjaCBkZXZpY2UATm90IGEgZGlyZWN0b3J5AElzIGEgZGlyZWN0b3J5AFRleHQgZmlsZSBidXN5AEV4ZWMgZm9ybWF0IGVycm9yAEludmFsaWQgYXJndW1lbnQAQXJndW1lbnQgbGlzdCB0b28gbG9uZwBTeW1ib2xpYyBsaW5rIGxvb3AARmlsZW5hbWUgdG9vIGxvbmcAVG9vIG1hbnkgb3BlbiBmaWxlcyBpbiBzeXN0ZW0ATm8gZmlsZSBkZXNjcmlwdG9ycyBhdmFpbGFibGUAQmFkIGZpbGUgZGVzY3JpcHRvcgBObyBjaGlsZCBwcm9jZXNzAEJhZCBhZGRyZXNzAEZpbGUgdG9vIGxhcmdlAFRvbyBtYW55IGxpbmtzAE5vIGxvY2tzIGF2YWlsYWJsZQBSZXNvdXJjZSBkZWFkbG9jayB3b3VsZCBvY2N1cgBTdGF0ZSBub3QgcmVjb3ZlcmFibGUAUHJldmlvdXMgb3duZXIgZGllZABPcGVyYXRpb24gY2FuY2VsZWQARnVuY3Rpb24gbm90IGltcGxlbWVudGVkAE5vIG1lc3NhZ2Ugb2YgZGVzaXJlZCB0eXBlAElkZW50aWZpZXIgcmVtb3ZlZABEZXZpY2Ugbm90IGEgc3RyZWFtAE5vIGRhdGEgYXZhaWxhYmxlAERldmljZSB0aW1lb3V0AE91dCBvZiBzdHJlYW1zIHJlc291cmNlcwBMaW5rIGhhcyBiZWVuIHNldmVyZWQAUHJvdG9jb2wgZXJyb3IAQmFkIG1lc3NhZ2UARmlsZSBkZXNjcmlwdG9yIGluIGJhZCBzdGF0ZQBOb3QgYSBzb2NrZXQARGVzdGluYXRpb24gYWRkcmVzcyByZXF1aXJlZABNZXNzYWdlIHRvbyBsYXJnZQBQcm90b2NvbCB3cm9uZyB0eXBlIGZvciBzb2NrZXQAUHJvdG9jb2wgbm90IGF2YWlsYWJsZQBQcm90b2NvbCBub3Qgc3VwcG9ydGVkAFNvY2tldCB0eXBlIG5vdCBzdXBwb3J0ZWQATm90IHN1cHBvcnRlZABQcm90b2NvbCBmYW1pbHkgbm90IHN1cHBvcnRlZABBZGRyZXNzIGZhbWlseSBub3Qgc3VwcG9ydGVkIGJ5IHByb3RvY29sAEFkZHJlc3Mgbm90IGF2YWlsYWJsZQBOZXR3b3JrIGlzIGRvd24ATmV0d29yayB1bnJlYWNoYWJsZQBDb25uZWN0aW9uIHJlc2V0IGJ5IG5ldHdvcmsAQ29ubmVjdGlvbiBhYm9ydGVkAE5vIGJ1ZmZlciBzcGFjZSBhdmFpbGFibGUAU29ja2V0IGlzIGNvbm5lY3RlZABTb2NrZXQgbm90IGNvbm5lY3RlZABDYW5ub3Qgc2VuZCBhZnRlciBzb2NrZXQgc2h1dGRvd24AT3BlcmF0aW9uIGFscmVhZHkgaW4gcHJvZ3Jlc3MAT3BlcmF0aW9uIGluIHByb2dyZXNzAFN0YWxlIGZpbGUgaGFuZGxlAFJlbW90ZSBJL08gZXJyb3IAUXVvdGEgZXhjZWVkZWQATm8gbWVkaXVtIGZvdW5kAFdyb25nIG1lZGl1bSB0eXBlAE11bHRpaG9wIGF0dGVtcHRlZAAAAAAApQJbAPABtQWMBSUBgwYdA5QE/wDHAzEDCwa8AY8BfwPKBCsA2gavAEIDTgPcAQ4EFQChBg0BlAILAjgGZAK8Av8CXQPnBAsHzwLLBe8F2wXhAh4GRQKFAIICbANvBPEA8wMYBdkA2gNMBlQCewGdA70EAABRABUCuwCzA20A/wGFBC8F+QQ4AGUBRgGfALcGqAFzAlMBAEGY7wMLDCEEAAAAAAAAAAAvAgBBuO8DCwY1BEcEVgQAQc7vAwsCoAQAQeLvAwuIAUYFYAVuBWEGAADPAQAAAAAAAAAAyQbpBvkGAAAAAAL/AARkACAAAAT//wYAAQABAAEA//8B/wH//////wH/Af8B/wH/Af8B/wH/Af//////Cv8gAP//A/8B/wT/HgAAAQX//////2MAAAhjAOgDAgAAAP//////AAAAAf8B//////////////8AQfnwAwsBBABBhvEDC0QB/wH//////wABIAAEAIAAAAj//wH/Af////////8B/wb/B/8I/wn//////7wCvAIBAP//AQABAP//AAD//////////wBB2vEDCwEUAEH68QMLHv//AQAK////////////Af8B/wAAAAAAAAH/Af8B/wBBqvIDC0gB/wAAAAAAAAH/Af8BAAAAAQAAAAH//////wAAAAAB////AAAAAP////////////8oAAr//////wEACv////8A//////////8AQdbzAwscAf8B////AQD//////////////////wr//////wBBgPQDCx8BAAAAAQAAAQABAAD+//9/AAAAALAEAAAoAAAAAAABAEHA9QMLARQAQcz1AwsB+gBB+/UDCwFAAEGM9gMLCP7//3////9/AEGs9gMLKQcAAAADAAAANAAAAAACAAAAAAAAZwUAANR0AABzAAAAdAAAAHUAAAB2AEHo9gMLRXcAAAB4AAAAeQAAAHoAAAB7AAAAfAAAAH0AAAB+AAAAAwAAADQAAAAAAgAAAAAAABczAADYdAAAcwAAAHQAAAB1AAAAdgBBwPcDC0V3AAAAeAAAAHkAAAB6AAAAewAAAHwAAAB9AAAAfgAAAAMAAAA0AAAAAAIAAAAAAAAANAAA3HQAAHMAAAB0AAAAdQAAAHYAQZj4AwtFdwAAAHgAAAB5AAAAegAAAHsAAAB8AAAAfQAAAH4AAAADAAAANAAAAAACAAAAAAAAgysAANR0AABzAAAAdAAAAHUAAAB2AEHw+AMLJHcAAAB4AAAAeQAAAHoAAAB7AAAAfAAAAH0AAAB+AAAAAAAAQABBoPkDC27SKQAAlAAAAAAAAADdMQAAlQAAAAAAAAArEAAAlgAAAAAAAAD6NgAAlwAAAAAAAADYDAAAmAAAAAAAAADCDAAAmQAAAAAAAAC3MAAAmgAAAAAAAADSKgAAmwAAAAAAAABVPQAA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");
|
|
|
|
// src/utils/db/sqljs.js
|
|
var import_sql = __toESM(require_sql_wasm());
|
|
var loadSQL = async () => {
|
|
const sql = await (0, import_sql.default)({
|
|
wasmBinary: sql_wasm_default
|
|
});
|
|
return sql;
|
|
};
|
|
|
|
// node_modules/monkey-around/mjs/index.js
|
|
function around(obj, factories) {
|
|
const removers = Object.keys(factories).map((key2) => around1(obj, key2, factories[key2]));
|
|
return removers.length === 1 ? removers[0] : function() {
|
|
removers.forEach((r3) => r3());
|
|
};
|
|
}
|
|
function around1(obj, method, createWrapper) {
|
|
const original = obj[method], hadOwn = obj.hasOwnProperty(method);
|
|
let current = createWrapper(original);
|
|
if (original)
|
|
Object.setPrototypeOf(current, original);
|
|
Object.setPrototypeOf(wrapper, current);
|
|
obj[method] = wrapper;
|
|
return remove;
|
|
function wrapper(...args) {
|
|
if (current === original && obj[method] === wrapper)
|
|
remove();
|
|
return current.apply(this, args);
|
|
}
|
|
function remove() {
|
|
if (obj[method] === wrapper) {
|
|
if (hadOwn)
|
|
obj[method] = original;
|
|
else
|
|
delete obj[method];
|
|
}
|
|
if (current === original)
|
|
return;
|
|
current = original;
|
|
Object.setPrototypeOf(wrapper, original || Function);
|
|
}
|
|
}
|
|
|
|
// src/utils/spaces/patches.ts
|
|
var import_obsidian45 = require("obsidian");
|
|
var patchFileExplorer = (plugin) => {
|
|
plugin.register(
|
|
around(import_obsidian45.Workspace.prototype, {
|
|
getLeavesOfType(old) {
|
|
return function(type) {
|
|
if (type == "file-explorer") {
|
|
return old.call(this, FILE_TREE_VIEW_TYPE);
|
|
}
|
|
return old.call(this, type);
|
|
};
|
|
}
|
|
})
|
|
);
|
|
};
|
|
var patchWorkspace = (plugin) => {
|
|
let layoutChanging = false;
|
|
const uninstaller = around(import_obsidian45.Workspace.prototype, {
|
|
changeLayout(old) {
|
|
return async function(workspace) {
|
|
layoutChanging = true;
|
|
try {
|
|
await old.call(this, workspace);
|
|
} finally {
|
|
layoutChanging = false;
|
|
}
|
|
};
|
|
},
|
|
iterateLeaves(old) {
|
|
return function(arg1, arg2) {
|
|
if (old.call(this, arg1, arg2))
|
|
return true;
|
|
let cb = typeof arg1 === "function" ? arg1 : arg2;
|
|
let parent = typeof arg1 === "function" ? arg2 : arg1;
|
|
if (!parent)
|
|
return false;
|
|
if (layoutChanging)
|
|
return false;
|
|
if (parent === app.workspace.rootSplit || import_obsidian45.WorkspaceContainer && parent instanceof import_obsidian45.WorkspaceContainer) {
|
|
for (const popover of FlowEditor.popoversForWindow(
|
|
parent.win
|
|
)) {
|
|
if (old.call(this, cb, popover.rootSplit))
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
};
|
|
},
|
|
getDropLocation(old) {
|
|
return function getDropLocation(event) {
|
|
for (const popover of FlowEditor.activePopovers()) {
|
|
const dropLoc = this.recursiveGetTarget(event, popover.rootSplit);
|
|
if (dropLoc) {
|
|
return dropLoc;
|
|
}
|
|
}
|
|
return old.call(this, event);
|
|
};
|
|
},
|
|
onDragLeaf(old) {
|
|
return function(event, leaf) {
|
|
const hoverPopover = FlowEditor.forLeaf(leaf);
|
|
return old.call(this, event, leaf);
|
|
};
|
|
}
|
|
});
|
|
plugin.register(uninstaller);
|
|
};
|
|
|
|
// src/main.ts
|
|
var import_obsidian_dataview = __toESM(require_lib());
|
|
var MakeMDPlugin = class extends import_obsidian46.Plugin {
|
|
constructor() {
|
|
super(...arguments);
|
|
this.dataViewAPI = () => (0, import_obsidian_dataview.getAPI)();
|
|
this.saveSpacesDB = (0, import_obsidian46.debounce)(
|
|
() => saveDBAndKeepAlive(this.spaceDBInstance(), this.spacesDBPath),
|
|
1e3,
|
|
true
|
|
);
|
|
this.createTable = async (path) => {
|
|
const dbPath = folderContextFromFolder(this, path);
|
|
const schemas = await getMDBTableSchemas(this, dbPath, false);
|
|
if (schemas)
|
|
return uniqueNameFromString(
|
|
"Table",
|
|
schemas.map((f4) => f4.id)
|
|
);
|
|
return "Table";
|
|
};
|
|
this.triggerVaultChangeEvent = (file, changeType, oldPath) => {
|
|
let event = new CustomEvent(eventTypes.vaultChange, {
|
|
detail: {
|
|
file,
|
|
changeType,
|
|
oldPath: oldPath ? oldPath : ""
|
|
}
|
|
});
|
|
window.dispatchEvent(event);
|
|
};
|
|
this.metadataChange = (file, data, cache) => {
|
|
var _a2, _b2;
|
|
let event = new CustomEvent(eventTypes.tagsChange, {
|
|
detail: { file, tags: (_b2 = (_a2 = cache == null ? void 0 : cache.tags) == null ? void 0 : _a2.map((f4) => f4.tag)) != null ? _b2 : [] }
|
|
});
|
|
window.dispatchEvent(event);
|
|
this.addToQueue(() => onMetadataChange(this, file));
|
|
};
|
|
this.onCreate = (file) => {
|
|
if (!file)
|
|
return;
|
|
this.triggerVaultChangeEvent(file, "create", "");
|
|
this.addToQueue(() => onFileCreated(this, file.path));
|
|
onFileCreated2(this, file.path, file instanceof import_obsidian46.TFolder);
|
|
};
|
|
this.onDelete = (file) => {
|
|
this.triggerVaultChangeEvent(file, "delete", "");
|
|
if (file instanceof import_obsidian46.TFile && file.extension != "mdb") {
|
|
this.addToQueue(() => onFileDeleted(this, file.path));
|
|
onFileDeleted2(this, file.path);
|
|
} else if (file instanceof import_obsidian46.TFolder) {
|
|
this.addToQueue(() => onFolderDeleted(file.path));
|
|
onFolderDeleted2(this, file.path);
|
|
}
|
|
this.activeFileChange();
|
|
};
|
|
this.onRename = (file, oldPath) => {
|
|
this.triggerVaultChangeEvent(file, "rename", oldPath);
|
|
if (file instanceof import_obsidian46.TFile && file.extension != "mdb") {
|
|
this.addToQueue(() => onFileChanged(this, oldPath, file.path));
|
|
onFileChanged2(this, oldPath, file.path);
|
|
} else if (file instanceof import_obsidian46.TFolder) {
|
|
this.addToQueue(() => onFolderChanged(this, oldPath, file.path));
|
|
onFolderChanged2(this, oldPath, file.path);
|
|
}
|
|
this.activeFileChange();
|
|
};
|
|
this.openFileTreeLeaf = async (showAfterAttach) => {
|
|
let leafs = this.app.workspace.getLeavesOfType(FILE_TREE_VIEW_TYPE);
|
|
if (leafs.length == 0) {
|
|
let leaf = this.app.workspace.getLeftLeaf(false);
|
|
await leaf.setViewState({ type: FILE_TREE_VIEW_TYPE });
|
|
if (showAfterAttach)
|
|
this.app.workspace.revealLeaf(leaf);
|
|
} else {
|
|
leafs.forEach((leaf) => this.app.workspace.revealLeaf(leaf));
|
|
}
|
|
if (platformIsMobile()) {
|
|
app.workspace.leftSplit.collapse();
|
|
}
|
|
replaceMobileMainMenu(this);
|
|
};
|
|
this.detachFileTreeLeafs = () => {
|
|
let leafs = this.app.workspace.getLeavesOfType(FILE_TREE_VIEW_TYPE);
|
|
for (let leaf of leafs) {
|
|
if (leaf.view instanceof FileTreeView)
|
|
leaf.view.destroy();
|
|
leaf.detach();
|
|
}
|
|
};
|
|
this.detachFileContextLeafs = () => {
|
|
let leafs = this.app.workspace.getLeavesOfType(FILE_CONTEXT_VIEW_TYPE);
|
|
for (let leaf of leafs) {
|
|
if (leaf.view instanceof FileContextLeafView)
|
|
leaf.view.destroy();
|
|
leaf.detach();
|
|
}
|
|
};
|
|
this.openFileContextLeaf = async () => {
|
|
let leafs = this.app.workspace.getLeavesOfType(FILE_CONTEXT_VIEW_TYPE);
|
|
if (leafs.length == 0) {
|
|
let leaf = this.app.workspace.getRightLeaf(false);
|
|
await leaf.setViewState({ type: FILE_CONTEXT_VIEW_TYPE });
|
|
this.app.workspace.revealLeaf(leaf);
|
|
} else {
|
|
leafs.forEach((leaf) => this.app.workspace.revealLeaf(leaf));
|
|
}
|
|
};
|
|
this.refreshFileContextLeafs = () => {
|
|
this.detachFileContextLeafs();
|
|
this.openFileContextLeaf();
|
|
};
|
|
this.refreshTreeLeafs = () => {
|
|
this.detachFileTreeLeafs();
|
|
this.openFileTreeLeaf(true);
|
|
};
|
|
}
|
|
async sqlJS() {
|
|
const sqljs = await loadSQL();
|
|
return sqljs;
|
|
}
|
|
spaceDBInstance() {
|
|
return this.spaceDB;
|
|
}
|
|
openFlow() {
|
|
const cm = getActiveCM();
|
|
if (cm) {
|
|
const value = cm.state.field(flowEditorInfo, false);
|
|
const currPosition = cm.state.selection.main;
|
|
for (let flowEditor of value) {
|
|
if (flowEditor.from < currPosition.to && flowEditor.to > currPosition.from) {
|
|
cm.dispatch({
|
|
annotations: toggleFlowEditor.of([flowEditor.id, 2])
|
|
});
|
|
}
|
|
}
|
|
}
|
|
}
|
|
closeFlow() {
|
|
const cm = getActiveCM();
|
|
if (cm) {
|
|
const value = cm.state.field(flowEditorInfo, false);
|
|
const currPosition = cm.state.selection.main;
|
|
for (let flowEditor of value) {
|
|
if (flowEditor.from < currPosition.to && flowEditor.to > currPosition.from) {
|
|
cm.dispatch({
|
|
annotations: toggleFlowEditor.of([flowEditor.id, 0])
|
|
});
|
|
}
|
|
}
|
|
}
|
|
}
|
|
quickOpen() {
|
|
let quickOpenModal = new Blink(this.app, this);
|
|
quickOpenModal.open();
|
|
}
|
|
toggleBold() {
|
|
const cm = getActiveCM();
|
|
if (cm) {
|
|
cm.dispatch({
|
|
annotations: toggleMark.of("strong")
|
|
});
|
|
}
|
|
}
|
|
toggleEm() {
|
|
const cm = getActiveCM();
|
|
if (cm) {
|
|
cm.dispatch({
|
|
annotations: toggleMark.of("em")
|
|
});
|
|
}
|
|
}
|
|
async loadSpaces() {
|
|
this.spacesDBPath = (0, import_obsidian46.normalizePath)(
|
|
app.vault.configDir + "/plugins/make-md/Spaces.mdb"
|
|
);
|
|
this.spaceDB = await getDB(await loadSQL(), this.spacesDBPath);
|
|
patchWorkspace(this);
|
|
document.body.classList.toggle("mk-hide-tabs", !this.settings.sidebarTabs);
|
|
document.body.classList.toggle("mk-hide-ribbon", !this.settings.showRibbon);
|
|
this.registerView(CONTEXT_VIEW_TYPE, (leaf) => {
|
|
return new ContextView(leaf, this, CONTEXT_VIEW_TYPE);
|
|
});
|
|
if (this.settings.spacesEnabled) {
|
|
this.addCommand({
|
|
id: "mk-spaces",
|
|
name: i18n_default.commandPalette.openSpaces,
|
|
callback: () => this.openFileTreeLeaf(true)
|
|
});
|
|
if (!this.settings.spacesDisablePatch)
|
|
patchFileExplorer(this);
|
|
this.registerView(FILE_TREE_VIEW_TYPE, (leaf) => {
|
|
return new FileTreeView(leaf, this);
|
|
});
|
|
this.app.workspace.onLayoutReady(async () => {
|
|
const tables = dbResultsToDBTables(
|
|
this.spaceDBInstance().exec(
|
|
"SELECT name FROM sqlite_schema WHERE type ='table' AND name NOT LIKE 'sqlite_%';"
|
|
)
|
|
);
|
|
if (tables.length == 0) {
|
|
initiateDB(this.spaceDBInstance());
|
|
}
|
|
if (this.settings.folderRank && this.settings.folderRank.children.length > 0) {
|
|
migrateIndex(this);
|
|
} else {
|
|
rebuildIndex(this);
|
|
}
|
|
this.registerEvent(this.app.vault.on("create", this.onCreate));
|
|
this.registerEvent(this.app.vault.on("delete", this.onDelete));
|
|
this.registerEvent(this.app.vault.on("rename", this.onRename));
|
|
this.app.metadataCache.on("changed", this.metadataChange);
|
|
if (this.dataViewAPI()) {
|
|
this.registerEvent(this.app.metadataCache.on(
|
|
"dataview:index-ready",
|
|
() => {
|
|
this.dataViewReady = true;
|
|
}
|
|
));
|
|
this.registerEvent(this.app.metadataCache.on(
|
|
"dataview:metadata-change",
|
|
(type, file, oldPath) => {
|
|
if (type === "update" && this.app.metadataCache.fileCache[file.path].mtime >= this.loadTime && this.dataViewAPI().index.revision !== this.dataViewLastIndex && this.dataViewReady) {
|
|
if (file instanceof import_obsidian46.TFile) {
|
|
this.metadataChange(file);
|
|
}
|
|
this.dataViewLastIndex = this.dataViewAPI().index.revision;
|
|
}
|
|
}
|
|
));
|
|
}
|
|
await this.openFileTreeLeaf(true);
|
|
});
|
|
}
|
|
this.registerEvent(
|
|
app.workspace.on("active-leaf-change", () => this.activeFileChange())
|
|
);
|
|
}
|
|
activeFileChange() {
|
|
let filePath = null;
|
|
const activeLeaf = app.workspace.activeLeaf;
|
|
if ((activeLeaf == null ? void 0 : activeLeaf.view.getViewType()) == CONTEXT_VIEW_TYPE && (activeLeaf == null ? void 0 : activeLeaf.view.getState().type) == "folder") {
|
|
let file = getAbstractFileAtPath(app, activeLeaf.view.getState().folder);
|
|
if (file)
|
|
filePath = file.path;
|
|
} else if ((activeLeaf == null ? void 0 : activeLeaf.view.getViewType()) == "markdown") {
|
|
const view = app.workspace.getActiveViewOfType(import_obsidian46.MarkdownView);
|
|
if (view instanceof import_obsidian46.MarkdownView) {
|
|
filePath = view.file.path;
|
|
}
|
|
}
|
|
if (filePath) {
|
|
let evt = new CustomEvent(eventTypes.activeFileChange, {
|
|
detail: { filePath }
|
|
});
|
|
window.dispatchEvent(evt);
|
|
}
|
|
}
|
|
loadContext() {
|
|
this.registerView(FILE_CONTEXT_VIEW_TYPE, (leaf) => {
|
|
return new FileContextLeafView(leaf, this);
|
|
});
|
|
this.registerView(INLINE_CONTEXT_VIEW_TYPE, (leaf) => {
|
|
return new InlineContextView(leaf, this);
|
|
});
|
|
this.registerView(MDB_FILE_VIEWER_TYPE, (leaf) => {
|
|
return new MDBFileViewer(leaf, this);
|
|
});
|
|
this.registerExtensions(["mdb"], MDB_FILE_VIEWER_TYPE);
|
|
this.app.workspace.onLayoutReady(async () => {
|
|
if (this.settings.autoOpenFileContext) {
|
|
await this.openFileContextLeaf();
|
|
}
|
|
setTimeout(() => this.activeFileChange(), 2e3);
|
|
});
|
|
}
|
|
loadFlowEditor() {
|
|
this.addCommand({
|
|
id: "mk-blink",
|
|
name: i18n_default.commandPalette.blink,
|
|
callback: () => this.quickOpen(),
|
|
hotkeys: [
|
|
{
|
|
modifiers: ["Mod"],
|
|
key: "o"
|
|
}
|
|
]
|
|
});
|
|
document.body.classList.toggle("mk-flow-replace", this.settings.editorFlow);
|
|
document.body.classList.toggle(
|
|
"mk-flow-" + this.settings.editorFlowStyle,
|
|
true
|
|
);
|
|
this.addCommand({
|
|
id: "mk-open-file-context",
|
|
name: i18n_default.commandPalette.openFileContext,
|
|
callback: () => this.openFileContextLeaf()
|
|
});
|
|
this.addCommand({
|
|
id: "mk-open-flow",
|
|
name: i18n_default.commandPalette.openFlow,
|
|
callback: () => this.openFlow()
|
|
});
|
|
this.addCommand({
|
|
id: "mk-close-flow",
|
|
name: i18n_default.commandPalette.closeFlow,
|
|
callback: () => this.closeFlow()
|
|
});
|
|
if (this.settings.editorFlow) {
|
|
this.registerMarkdownPostProcessor((element, context) => {
|
|
const removeAllFlowMarks = (el) => {
|
|
const embeds = el.querySelectorAll(".internal-embed");
|
|
for (let index = 0; index < embeds.length; index++) {
|
|
const embed = embeds.item(index);
|
|
if (embed.previousSibling && embed.previousSibling.textContent.slice(-1) == "!")
|
|
embed.previousSibling.textContent = embed.previousSibling.textContent.slice(0, -1);
|
|
}
|
|
};
|
|
removeAllFlowMarks(element);
|
|
replaceAllTables(this, element, context);
|
|
replaceAllEmbed(element, context);
|
|
});
|
|
window.addEventListener(
|
|
eventTypes.spawnPortal,
|
|
this.spawnPortal.bind(this)
|
|
);
|
|
window.addEventListener(
|
|
eventTypes.loadPortal,
|
|
this.loadPortal.bind(this)
|
|
);
|
|
window.addEventListener(
|
|
eventTypes.focusPortal,
|
|
this.focusPortal.bind(this)
|
|
);
|
|
window.addEventListener(
|
|
eventTypes.openFilePortal,
|
|
this.openFileFromPortal.bind(this)
|
|
);
|
|
}
|
|
}
|
|
loadMakerMode() {
|
|
if (this.settings.makerMode) {
|
|
this.addCommand({
|
|
id: "mk-toggle-bold",
|
|
name: i18n_default.commandPalette.toggleBold,
|
|
callback: () => this.toggleBold(),
|
|
hotkeys: [
|
|
{
|
|
modifiers: ["Mod"],
|
|
key: "b"
|
|
}
|
|
]
|
|
});
|
|
this.addCommand({
|
|
id: "mk-toggle-italics",
|
|
name: i18n_default.commandPalette.toggleItalics,
|
|
callback: () => this.toggleEm(),
|
|
hotkeys: [
|
|
{
|
|
modifiers: ["Mod"],
|
|
key: "i"
|
|
}
|
|
]
|
|
});
|
|
this.registerEditorSuggest(new MakeMenu(this.app, this));
|
|
this.registerEditorSuggest(new StickerMenu(this.app, this));
|
|
if (platformIsMobile() && this.settings.mobileMakeBar)
|
|
loadStylerIntoContainer(app.mobileToolbar.containerEl, this);
|
|
}
|
|
}
|
|
addToQueue(operation) {
|
|
this.queue = this.queue.then(operation).catch(() => {
|
|
});
|
|
}
|
|
async onload() {
|
|
console.time("Loading Make.md");
|
|
this.loadTime = Date.now();
|
|
this.queue = Promise.resolve();
|
|
(0, import_obsidian46.addIcon)("mk-logo", mkLogo);
|
|
console.time("Loading Settings");
|
|
await this.loadSettings();
|
|
this.addSettingTab(new MakeMDPluginSettingsTab(this.app, this));
|
|
console.timeEnd("Loading Settings");
|
|
this.app.workspace.onLayoutReady(async () => {
|
|
if (!getAbstractFileAtPath(
|
|
this.app,
|
|
getFolderPathFromString(this.settings.tagContextFolder)
|
|
)) {
|
|
this.app.vault.createFolder(this.settings.tagContextFolder);
|
|
}
|
|
});
|
|
console.time("Loading Spaces");
|
|
await this.loadSpaces();
|
|
console.timeEnd("Loading Spaces");
|
|
console.time("Loading Context");
|
|
this.loadContext();
|
|
console.timeEnd("Loading Context");
|
|
console.time("Loading Flow Editor");
|
|
this.loadFlowEditor();
|
|
console.timeEnd("Loading Flow Editor");
|
|
console.time("Loading Maker Mode");
|
|
this.loadMakerMode();
|
|
console.timeEnd("Loading Maker Mode");
|
|
console.time("Loading CM Extensions");
|
|
this.registerEditorExtension(cmExtensions(this, platformIsMobile()));
|
|
console.timeEnd("Loading CM Extensions");
|
|
console.timeEnd("Loading Make.md");
|
|
}
|
|
openFileFromPortal(e4) {
|
|
openFileFromPortal(this, e4);
|
|
}
|
|
loadPortal(e4) {
|
|
loadFlowEditorByDOM2(this, e4.detail.el, e4.detail.view, e4.detail.id);
|
|
}
|
|
spawnPortal(e4) {
|
|
spawnNewPortal(this, e4);
|
|
}
|
|
focusPortal(e4) {
|
|
focusPortal(this, e4);
|
|
}
|
|
async loadSettings() {
|
|
this.settings = Object.assign({}, DEFAULT_SETTINGS, await this.loadData());
|
|
const userConfig = safelyParseJSON(await defaultConfigFile(this.app));
|
|
this.settings.newFileFolderPath = userConfig.newFileFolderPath;
|
|
this.settings.newFileLocation = userConfig.newFileLocation;
|
|
this.saveSettings();
|
|
}
|
|
async saveSettings(refresh = true) {
|
|
await this.saveData(this.settings);
|
|
if (refresh) {
|
|
let evt = new CustomEvent(eventTypes.settingsChanged, {});
|
|
window.dispatchEvent(evt);
|
|
}
|
|
}
|
|
onunload() {
|
|
console.log("Unloading Make.md");
|
|
this.spaceDBInstance().close();
|
|
window.removeEventListener(eventTypes.spawnPortal, this.spawnPortal);
|
|
window.removeEventListener(eventTypes.loadPortal, this.loadPortal);
|
|
window.removeEventListener(eventTypes.focusPortal, this.focusPortal);
|
|
window.removeEventListener(
|
|
eventTypes.openFilePortal,
|
|
this.openFileFromPortal
|
|
);
|
|
this.detachFileTreeLeafs();
|
|
}
|
|
};
|
|
/*!
|
|
Copyright (c) 2018 Jed Watson.
|
|
Licensed under the MIT License (MIT), see
|
|
http://jedwatson.github.io/classnames
|
|
*/
|
|
/**
|
|
* @license
|
|
* Lodash <https://lodash.com/>
|
|
* Copyright OpenJS Foundation and other contributors <https://openjsf.org/>
|
|
* Released under MIT license <https://lodash.com/license>
|
|
* Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>
|
|
* Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
|
|
*/
|
|
/**
|
|
* react-table
|
|
*
|
|
* Copyright (c) TanStack
|
|
*
|
|
* This source code is licensed under the MIT license found in the
|
|
* LICENSE.md file in the root directory of this source tree.
|
|
*
|
|
* @license MIT
|
|
*/
|
|
/**
|
|
* react-virtual
|
|
*
|
|
* Copyright (c) TanStack
|
|
*
|
|
* This source code is licensed under the MIT license found in the
|
|
* LICENSE.md file in the root directory of this source tree.
|
|
*
|
|
* @license MIT
|
|
*/
|
|
/**
|
|
* table-core
|
|
*
|
|
* Copyright (c) TanStack
|
|
*
|
|
* This source code is licensed under the MIT license found in the
|
|
* LICENSE.md file in the root directory of this source tree.
|
|
*
|
|
* @license MIT
|
|
*/
|