#! /usr/bin/env node "use strict"; 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 __esm = (fn, res) => function __init() { return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res; }; 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 key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( // If the importer is in node compatibility mode or this is not an ESM // file that has been converted to a CommonJS file using a Babel- // compatible transform (i.e. "__esModule" has not been set), then set // "default" to the CommonJS "module.exports" for node compatibility. isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, mod )); // src/vendor/hash-wasm/sha256.js var import_meta, Module, sha256_default; var init_sha256 = __esm({ "src/vendor/hash-wasm/sha256.js"() { "use strict"; import_meta = {}; Module = (() => { var _unused = import_meta.url; return function(moduleArg = {}) { var Module2 = moduleArg; var readyPromiseResolve, readyPromiseReject; Module2["ready"] = new Promise((resolve3, reject) => { readyPromiseResolve = resolve3; readyPromiseReject = reject; }); var moduleOverrides = Object.assign({}, Module2); var arguments_ = []; var thisProgram = "./this.program"; var quit_ = (status, toThrow) => { throw toThrow; }; var ENVIRONMENT_IS_WEB = typeof window == "object"; var ENVIRONMENT_IS_WORKER = typeof importScripts == "function"; var ENVIRONMENT_IS_NODE = typeof process == "object" && typeof process.versions == "object" && typeof process.versions.node == "string"; var ENVIRONMENT_IS_SHELL = !ENVIRONMENT_IS_WEB && !ENVIRONMENT_IS_NODE && !ENVIRONMENT_IS_WORKER; var scriptDirectory = ""; function locateFile(path2) { if (Module2["locateFile"]) { return Module2["locateFile"](path2, scriptDirectory); } return scriptDirectory + path2; } var read_, readAsync, readBinary; if (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER) { if (ENVIRONMENT_IS_WORKER) { scriptDirectory = self.location.href; } else if (typeof document != "undefined" && document.currentScript) { scriptDirectory = document.currentScript.src; } if (false) { scriptDirectory = false; } if (scriptDirectory.startsWith("blob:")) { scriptDirectory = ""; } else { scriptDirectory = scriptDirectory.substr(0, scriptDirectory.replace(/[?#].*/, "").lastIndexOf("/") + 1); } { read_ = (url) => { var xhr = new XMLHttpRequest(); xhr.open("GET", url, false); xhr.send(null); return xhr.responseText; }; if (ENVIRONMENT_IS_WORKER) { readBinary = (url) => { var xhr = new XMLHttpRequest(); xhr.open("GET", url, false); xhr.responseType = "arraybuffer"; xhr.send(null); return new Uint8Array( /** @type{!ArrayBuffer} */ xhr.response ); }; } readAsync = (url, onload, onerror) => { var xhr = new XMLHttpRequest(); xhr.open("GET", url, true); xhr.responseType = "arraybuffer"; xhr.onload = () => { if (xhr.status == 200 || xhr.status == 0 && xhr.response) { onload(xhr.response); return; } onerror(); }; xhr.onerror = onerror; xhr.send(null); }; } } else { } var out = Module2["print"] || console.log.bind(console); var err = Module2["printErr"] || console.error.bind(console); Object.assign(Module2, moduleOverrides); moduleOverrides = null; if (Module2["arguments"]) arguments_ = Module2["arguments"]; if (Module2["thisProgram"]) thisProgram = Module2["thisProgram"]; if (Module2["quit"]) quit_ = Module2["quit"]; var wasmBinary2; if (Module2["wasmBinary"]) wasmBinary2 = Module2["wasmBinary"]; if (typeof WebAssembly != "object") { abort("no native wasm support detected"); } function intArrayFromBase64(s) { var decoded = atob(s); var bytes = new Uint8Array(decoded.length); for (var i = 0; i < decoded.length; ++i) { bytes[i] = decoded.charCodeAt(i); } return bytes; } function tryParseAsDataURI(filename) { if (!isDataURI(filename)) { return; } return intArrayFromBase64(filename.slice(dataURIPrefix.length)); } var wasmMemory; var ABORT = false; var EXITSTATUS; function assert(condition, text) { if (!condition) { abort(text); } } var HEAP, HEAP8, HEAPU8, HEAP16, HEAPU16, HEAP32, HEAPU32, HEAPF32, HEAPF64; function updateMemoryViews() { var b = wasmMemory.buffer; Module2["HEAP8"] = HEAP8 = new Int8Array(b); Module2["HEAP16"] = HEAP16 = new Int16Array(b); Module2["HEAPU8"] = HEAPU8 = new Uint8Array(b); Module2["HEAPU16"] = HEAPU16 = new Uint16Array(b); Module2["HEAP32"] = HEAP32 = new Int32Array(b); Module2["HEAPU32"] = HEAPU32 = new Uint32Array(b); Module2["HEAPF32"] = HEAPF32 = new Float32Array(b); Module2["HEAPF64"] = HEAPF64 = new Float64Array(b); } var __ATPRERUN__ = []; var __ATINIT__ = []; var __ATEXIT__ = []; var __ATPOSTRUN__ = []; var runtimeInitialized = false; function preRun() { if (Module2["preRun"]) { if (typeof Module2["preRun"] == "function") Module2["preRun"] = [Module2["preRun"]]; while (Module2["preRun"].length) { addOnPreRun(Module2["preRun"].shift()); } } callRuntimeCallbacks(__ATPRERUN__); } function initRuntime() { runtimeInitialized = true; callRuntimeCallbacks(__ATINIT__); } function postRun() { if (Module2["postRun"]) { if (typeof Module2["postRun"] == "function") Module2["postRun"] = [Module2["postRun"]]; while (Module2["postRun"].length) { addOnPostRun(Module2["postRun"].shift()); } } callRuntimeCallbacks(__ATPOSTRUN__); } function addOnPreRun(cb) { __ATPRERUN__.unshift(cb); } function addOnInit(cb) { __ATINIT__.unshift(cb); } function addOnExit(cb) { } function addOnPostRun(cb) { __ATPOSTRUN__.unshift(cb); } var runDependencies = 0; var runDependencyWatcher = null; var dependenciesFulfilled = null; function getUniqueRunDependency(id) { return id; } function addRunDependency(id) { runDependencies++; Module2["monitorRunDependencies"]?.(runDependencies); } function removeRunDependency(id) { runDependencies--; Module2["monitorRunDependencies"]?.(runDependencies); if (runDependencies == 0) { if (runDependencyWatcher !== null) { clearInterval(runDependencyWatcher); runDependencyWatcher = null; } if (dependenciesFulfilled) { var callback = dependenciesFulfilled; dependenciesFulfilled = null; callback(); } } } function abort(what) { Module2["onAbort"]?.(what); what = "Aborted(" + what + ")"; err(what); ABORT = true; EXITSTATUS = 1; what += ". Build with -sASSERTIONS for more info."; var e = new WebAssembly.RuntimeError(what); readyPromiseReject(e); throw e; } var dataURIPrefix = "data:application/octet-stream;base64,"; var isDataURI = (filename) => filename.startsWith(dataURIPrefix); var isFileURI = (filename) => filename.startsWith("file://"); var wasmBinaryFile; wasmBinaryFile = "data:application/octet-stream;base64,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"; if (!isDataURI(wasmBinaryFile)) { wasmBinaryFile = locateFile(wasmBinaryFile); } function getBinarySync(file) { if (file == wasmBinaryFile && wasmBinary2) { return new Uint8Array(wasmBinary2); } var binary = tryParseAsDataURI(file); if (binary) { return binary; } if (readBinary) { return readBinary(file); } throw "both async and sync fetching of the wasm failed"; } function getBinaryPromise(binaryFile) { return Promise.resolve().then(() => getBinarySync(binaryFile)); } function instantiateArrayBuffer(binaryFile, imports, receiver) { return getBinaryPromise(binaryFile).then((binary) => { return WebAssembly.instantiate(binary, imports); }).then(receiver, (reason) => { err(`failed to asynchronously prepare wasm: ${reason}`); abort(reason); }); } function instantiateAsync(binary, binaryFile, imports, callback) { return instantiateArrayBuffer(binaryFile, imports, callback); } function createWasm() { var info = { "env": wasmImports, "wasi_snapshot_preview1": wasmImports }; function receiveInstance(instance, module2) { wasmExports = instance.exports; wasmMemory = wasmExports["memory"]; updateMemoryViews(); addOnInit(wasmExports["__wasm_call_ctors"]); removeRunDependency("wasm-instantiate"); return wasmExports; } addRunDependency("wasm-instantiate"); function receiveInstantiationResult(result) { receiveInstance(result["instance"]); } if (Module2["instantiateWasm"]) { try { return Module2["instantiateWasm"](info, receiveInstance); } catch (e) { err(`Module.instantiateWasm callback failed with error: ${e}`); readyPromiseReject(e); } } instantiateAsync(wasmBinary2, wasmBinaryFile, info, receiveInstantiationResult).catch(readyPromiseReject); return {}; } var tempDouble; var tempI64; function ExitStatus(status) { this.name = "ExitStatus"; this.message = `Program terminated with exit(${status})`; this.status = status; } var callRuntimeCallbacks = (callbacks) => { while (callbacks.length > 0) { callbacks.shift()(Module2); } }; function getValue(ptr, type = "i8") { if (type.endsWith("*")) type = "*"; switch (type) { case "i1": return HEAP8[ptr]; case "i8": return HEAP8[ptr]; case "i16": return HEAP16[ptr >> 1]; case "i32": return HEAP32[ptr >> 2]; case "i64": abort("to do getValue(i64) use WASM_BIGINT"); case "float": return HEAPF32[ptr >> 2]; case "double": return HEAPF64[ptr >> 3]; case "*": return HEAPU32[ptr >> 2]; default: abort(`invalid type for getValue: ${type}`); } } var noExitRuntime = Module2["noExitRuntime"] || true; function setValue(ptr, value, type = "i8") { if (type.endsWith("*")) type = "*"; switch (type) { case "i1": HEAP8[ptr] = value; break; case "i8": HEAP8[ptr] = value; break; case "i16": HEAP16[ptr >> 1] = value; break; case "i32": HEAP32[ptr >> 2] = value; break; case "i64": abort("to do setValue(i64) use WASM_BIGINT"); case "float": HEAPF32[ptr >> 2] = value; break; case "double": HEAPF64[ptr >> 3] = value; break; case "*": HEAPU32[ptr >> 2] = value; break; default: abort(`invalid type for setValue: ${type}`); } } var wasmImports = {}; var wasmExports = createWasm(); var ___wasm_call_ctors = () => (___wasm_call_ctors = wasmExports["__wasm_call_ctors"])(); var _Hash_Update = Module2["_Hash_Update"] = (a0) => (_Hash_Update = Module2["_Hash_Update"] = wasmExports["Hash_Update"])(a0); var _Hash_Final = Module2["_Hash_Final"] = () => (_Hash_Final = Module2["_Hash_Final"] = wasmExports["Hash_Final"])(); var _Hash_Init = Module2["_Hash_Init"] = (a0) => (_Hash_Init = Module2["_Hash_Init"] = wasmExports["Hash_Init"])(a0); var _GetBufferPtr = Module2["_GetBufferPtr"] = () => (_GetBufferPtr = Module2["_GetBufferPtr"] = wasmExports["GetBufferPtr"])(); var stackSave = () => (stackSave = wasmExports["stackSave"])(); var stackRestore = (a0) => (stackRestore = wasmExports["stackRestore"])(a0); var stackAlloc = (a0) => (stackAlloc = wasmExports["stackAlloc"])(a0); var calledRun; dependenciesFulfilled = function runCaller() { if (!calledRun) run2(); if (!calledRun) dependenciesFulfilled = runCaller; }; function run2() { if (runDependencies > 0) { return; } preRun(); if (runDependencies > 0) { return; } function doRun() { if (calledRun) return; calledRun = true; Module2["calledRun"] = true; if (ABORT) return; initRuntime(); readyPromiseResolve(Module2); if (Module2["onRuntimeInitialized"]) Module2["onRuntimeInitialized"](); postRun(); } if (Module2["setStatus"]) { Module2["setStatus"]("Running..."); setTimeout(function() { setTimeout(function() { Module2["setStatus"](""); }, 1); doRun(); }, 1); } else { doRun(); } } if (Module2["preInit"]) { if (typeof Module2["preInit"] == "function") Module2["preInit"] = [Module2["preInit"]]; while (Module2["preInit"].length > 0) { Module2["preInit"].pop()(); } } run2(); return moduleArg.ready; }; })(); sha256_default = Module; } }); // src/vendor/hash-wasm/sha256-wrapper.ts var sha256_wrapper_exports = {}; __export(sha256_wrapper_exports, { createSHA256: () => createSHA256, createSHA256WorkerCode: () => createSHA256WorkerCode }); async function createSHA256(isInsideWorker = false) { const BUFFER_MAX_SIZE = 8 * 1024 * 1024; const wasm2 = isInsideWorker ? ( // @ts-expect-error WasmModule will be populated inside self object await self["SHA256WasmModule"]() ) : await sha256_default(); const heap = wasm2.HEAPU8.subarray(wasm2._GetBufferPtr()); return { init() { wasm2._Hash_Init(256); }, update(data) { let byteUsed = 0; while (byteUsed < data.byteLength) { const bytesLeft = data.byteLength - byteUsed; const length = Math.min(bytesLeft, BUFFER_MAX_SIZE); heap.set(data.subarray(byteUsed, byteUsed + length)); wasm2._Hash_Update(length); byteUsed += length; } }, digest(method) { if (method !== "hex") { throw new Error("Only digest hex is supported"); } wasm2._Hash_Final(); const result = Array.from(heap.slice(0, 32)); return result.map((b) => b.toString(16).padStart(2, "0")).join(""); } }; } function createSHA256WorkerCode() { return ` self.addEventListener('message', async (event) => { const { file } = event.data; const sha256 = await self.createSHA256(true); sha256.init(); const reader = file.stream().getReader(); const total = file.size; let bytesDone = 0; while (true) { const { done, value } = await reader.read(); if (done) { break; } sha256.update(value); bytesDone += value.length; postMessage({ progress: bytesDone / total }); } postMessage({ sha256: sha256.digest('hex') }); }); self.SHA256WasmModule = ${sha256_default.toString()}; self.createSHA256 = ${createSHA256.toString()}; `; } var init_sha256_wrapper = __esm({ "src/vendor/hash-wasm/sha256-wrapper.ts"() { "use strict"; init_sha256(); } }); // src/utils/sha256-node.ts var sha256_node_exports = {}; __export(sha256_node_exports, { sha256Node: () => sha256Node }); async function* sha256Node(buffer, opts) { const sha256Stream = (0, import_node_crypto.createHash)("sha256"); const size = buffer instanceof Blob ? buffer.size : buffer.byteLength; let done = 0; const readable = buffer instanceof Blob ? import_node_stream.Readable.fromWeb(buffer.stream()) : import_node_stream.Readable.from(Buffer.from(buffer)); for await (const buffer2 of readable) { sha256Stream.update(buffer2); done += buffer2.length; yield done / size; opts?.abortSignal?.throwIfAborted(); } return sha256Stream.digest("hex"); } var import_node_stream, import_node_crypto; var init_sha256_node = __esm({ "src/utils/sha256-node.ts"() { "use strict"; import_node_stream = require("stream"); import_node_crypto = require("crypto"); } }); // src/utils/FileBlob.ts var FileBlob_exports = {}; __export(FileBlob_exports, { FileBlob: () => FileBlob }); var import_node_fs, import_promises2, import_node_stream2, import_node_url, FileBlob; var init_FileBlob = __esm({ "src/utils/FileBlob.ts"() { "use strict"; import_node_fs = require("fs"); import_promises2 = require("fs/promises"); import_node_stream2 = require("stream"); import_node_url = require("url"); FileBlob = class extends Blob { /** * Creates a new FileBlob on the provided file. * * @param path Path to the file to be lazy readed */ static async create(path2) { path2 = path2 instanceof URL ? (0, import_node_url.fileURLToPath)(path2) : path2; const { size } = await (0, import_promises2.stat)(path2); const fileBlob = new FileBlob(path2, 0, size); return fileBlob; } path; start; end; constructor(path2, start, end) { super(); this.path = path2; this.start = start; this.end = end; } /** * Returns the size of the blob. */ get size() { return this.end - this.start; } /** * Returns a new instance of FileBlob that is a slice of the current one. * * The slice is inclusive of the start and exclusive of the end. * * The slice method does not supports negative start/end. * * @param start beginning of the slice * @param end end of the slice */ slice(start = 0, end = this.size) { if (start < 0 || end < 0) { new TypeError("Unsupported negative start/end on FileBlob.slice"); } const slice = new FileBlob(this.path, this.start + start, Math.min(this.start + end, this.end)); return slice; } /** * Read the part of the file delimited by the FileBlob and returns it as an ArrayBuffer. */ async arrayBuffer() { const slice = await this.execute((file) => file.read(Buffer.alloc(this.size), 0, this.size, this.start)); return slice.buffer; } /** * Read the part of the file delimited by the FileBlob and returns it as a string. */ async text() { const buffer = await this.arrayBuffer(); return buffer.toString("utf8"); } /** * Returns a stream around the part of the file delimited by the FileBlob. */ stream() { if (this.start === this.end) { return new Blob([]).stream(); } return import_node_stream2.Readable.toWeb((0, import_node_fs.createReadStream)(this.path, { start: this.start, end: this.end - 1 })); } /** * We are opening and closing the file for each action to prevent file descriptor leaks. * * It is an intended choice of developer experience over performances. */ async execute(action) { const file = await (0, import_promises2.open)(this.path, "r"); try { return await action(file); } finally { await file.close(); } } }; } }); // src/utils/sub-paths.ts var sub_paths_exports = {}; __export(sub_paths_exports, { subPaths: () => subPaths }); async function subPaths(path2, maxDepth = 10) { const state = await (0, import_promises3.stat)(path2); if (!state.isDirectory()) { return [{ path: path2, relativePath: "." }]; } const files = await (0, import_promises3.readdir)(path2, { withFileTypes: true }); const ret = []; for (const file of files) { const filePath = (0, import_node_url2.pathToFileURL)((0, import_node_url2.fileURLToPath)(path2) + "/" + file.name); if (file.isDirectory()) { ret.push( ...(await subPaths(filePath, maxDepth - 1)).map((subPath) => ({ ...subPath, relativePath: `${file.name}/${subPath.relativePath}` })) ); } else { ret.push({ path: filePath, relativePath: file.name }); } } return ret; } var import_promises3, import_node_url2; var init_sub_paths = __esm({ "src/utils/sub-paths.ts"() { "use strict"; import_promises3 = require("fs/promises"); import_node_url2 = require("url"); } }); // src/vendor/xet-chunk/chunker_wasm_bg.js var chunker_wasm_bg_exports = {}; __export(chunker_wasm_bg_exports, { Chunker: () => Chunker, __wbg_String_8f0eb39a4a4c2f66: () => __wbg_String_8f0eb39a4a4c2f66, __wbg_buffer_609cc3eee51ed158: () => __wbg_buffer_609cc3eee51ed158, __wbg_call_672a4d21634d4a24: () => __wbg_call_672a4d21634d4a24, __wbg_done_769e5ede4b31c67b: () => __wbg_done_769e5ede4b31c67b, __wbg_get_67b2ba62fc30de12: () => __wbg_get_67b2ba62fc30de12, __wbg_get_b9b93047fe3cf45b: () => __wbg_get_b9b93047fe3cf45b, __wbg_getwithrefkey_1dc361bd10053bfe: () => __wbg_getwithrefkey_1dc361bd10053bfe, __wbg_instanceof_ArrayBuffer_e14585432e3737fc: () => __wbg_instanceof_ArrayBuffer_e14585432e3737fc, __wbg_instanceof_Uint8Array_17156bcf118086a9: () => __wbg_instanceof_Uint8Array_17156bcf118086a9, __wbg_isArray_a1eab7e0d067391b: () => __wbg_isArray_a1eab7e0d067391b, __wbg_isSafeInteger_343e2beeeece1bb0: () => __wbg_isSafeInteger_343e2beeeece1bb0, __wbg_iterator_9a24c88df860dc65: () => __wbg_iterator_9a24c88df860dc65, __wbg_length_a446193dc22c12f8: () => __wbg_length_a446193dc22c12f8, __wbg_length_e2d2a49132c1b256: () => __wbg_length_e2d2a49132c1b256, __wbg_new_405e22f390576ce2: () => __wbg_new_405e22f390576ce2, __wbg_new_78feb108b6472713: () => __wbg_new_78feb108b6472713, __wbg_new_a12002a7f91c75be: () => __wbg_new_a12002a7f91c75be, __wbg_next_25feadfc0913fea9: () => __wbg_next_25feadfc0913fea9, __wbg_next_6574e1a8a62d1055: () => __wbg_next_6574e1a8a62d1055, __wbg_set_37837023f3d740e8: () => __wbg_set_37837023f3d740e8, __wbg_set_3f1d0b984ed272ed: () => __wbg_set_3f1d0b984ed272ed, __wbg_set_65595bdd868b3009: () => __wbg_set_65595bdd868b3009, __wbg_set_wasm: () => __wbg_set_wasm, __wbg_value_cd1ffa7b1ab794f1: () => __wbg_value_cd1ffa7b1ab794f1, __wbindgen_as_number: () => __wbindgen_as_number, __wbindgen_boolean_get: () => __wbindgen_boolean_get, __wbindgen_debug_string: () => __wbindgen_debug_string, __wbindgen_error_new: () => __wbindgen_error_new, __wbindgen_in: () => __wbindgen_in, __wbindgen_init_externref_table: () => __wbindgen_init_externref_table, __wbindgen_is_function: () => __wbindgen_is_function, __wbindgen_is_object: () => __wbindgen_is_object, __wbindgen_is_undefined: () => __wbindgen_is_undefined, __wbindgen_jsval_loose_eq: () => __wbindgen_jsval_loose_eq, __wbindgen_memory: () => __wbindgen_memory, __wbindgen_number_get: () => __wbindgen_number_get, __wbindgen_number_new: () => __wbindgen_number_new, __wbindgen_string_get: () => __wbindgen_string_get, __wbindgen_string_new: () => __wbindgen_string_new, __wbindgen_throw: () => __wbindgen_throw, compute_file_hash: () => compute_file_hash, compute_hmac: () => compute_hmac, compute_verification_hash: () => compute_verification_hash, compute_xorb_hash: () => compute_xorb_hash }); function __wbg_set_wasm(val) { wasm = val; } function getUint8ArrayMemory0() { if (cachedUint8ArrayMemory0 === null || cachedUint8ArrayMemory0.byteLength === 0) { cachedUint8ArrayMemory0 = new Uint8Array(wasm.memory.buffer); } return cachedUint8ArrayMemory0; } function passStringToWasm0(arg, malloc, realloc) { if (realloc === void 0) { const buf = cachedTextEncoder.encode(arg); const ptr2 = malloc(buf.length, 1) >>> 0; getUint8ArrayMemory0().subarray(ptr2, ptr2 + buf.length).set(buf); WASM_VECTOR_LEN = buf.length; return ptr2; } let len = arg.length; let ptr = malloc(len, 1) >>> 0; const mem = getUint8ArrayMemory0(); let offset = 0; for (; offset < len; offset++) { const code = arg.charCodeAt(offset); if (code > 127) break; mem[ptr + offset] = code; } if (offset !== len) { if (offset !== 0) { arg = arg.slice(offset); } ptr = realloc(ptr, len, len = offset + arg.length * 3, 1) >>> 0; const view = getUint8ArrayMemory0().subarray(ptr + offset, ptr + len); const ret = encodeString(arg, view); offset += ret.written; ptr = realloc(ptr, len, offset, 1) >>> 0; } WASM_VECTOR_LEN = offset; return ptr; } function getDataViewMemory0() { if (cachedDataViewMemory0 === null || cachedDataViewMemory0.buffer.detached === true || cachedDataViewMemory0.buffer.detached === void 0 && cachedDataViewMemory0.buffer !== wasm.memory.buffer) { cachedDataViewMemory0 = new DataView(wasm.memory.buffer); } return cachedDataViewMemory0; } function addToExternrefTable0(obj) { const idx = wasm.__externref_table_alloc(); wasm.__wbindgen_export_4.set(idx, obj); return idx; } function handleError(f, args) { try { return f.apply(this, args); } catch (e) { const idx = addToExternrefTable0(e); wasm.__wbindgen_exn_store(idx); } } function debugString(val) { const type = typeof val; if (type == "number" || type == "boolean" || val == null) { return `${val}`; } if (type == "string") { return `"${val}"`; } if (type == "symbol") { const description = val.description; if (description == null) { return "Symbol"; } else { return `Symbol(${description})`; } } if (type == "function") { const name = val.name; if (typeof name == "string" && name.length > 0) { return `Function(${name})`; } else { return "Function"; } } if (Array.isArray(val)) { const length = val.length; let debug = "["; if (length > 0) { debug += debugString(val[0]); } for (let i = 1; i < length; i++) { debug += ", " + debugString(val[i]); } debug += "]"; return debug; } const builtInMatches = /\[object ([^\]]+)\]/.exec(toString.call(val)); let className; if (builtInMatches && builtInMatches.length > 1) { className = builtInMatches[1]; } else { return toString.call(val); } if (className == "Object") { try { return "Object(" + JSON.stringify(val) + ")"; } catch (_) { return "Object"; } } if (val instanceof Error) { return `${val.name}: ${val.message} ${val.stack}`; } return className; } function getStringFromWasm0(ptr, len) { ptr = ptr >>> 0; return cachedTextDecoder.decode(getUint8ArrayMemory0().subarray(ptr, ptr + len)); } function isLikeNone(x) { return x === void 0 || x === null; } function passArray8ToWasm0(arg, malloc) { const ptr = malloc(arg.length * 1, 1) >>> 0; getUint8ArrayMemory0().set(arg, ptr / 1); WASM_VECTOR_LEN = arg.length; return ptr; } function takeFromExternrefTable0(idx) { const value = wasm.__wbindgen_export_4.get(idx); wasm.__externref_table_dealloc(idx); return value; } function compute_xorb_hash(chunks_array) { let deferred2_0; let deferred2_1; try { const ret = wasm.compute_xorb_hash(chunks_array); var ptr1 = ret[0]; var len1 = ret[1]; if (ret[3]) { ptr1 = 0; len1 = 0; throw takeFromExternrefTable0(ret[2]); } deferred2_0 = ptr1; deferred2_1 = len1; return getStringFromWasm0(ptr1, len1); } finally { wasm.__wbindgen_free(deferred2_0, deferred2_1, 1); } } function compute_file_hash(chunks_array) { let deferred2_0; let deferred2_1; try { const ret = wasm.compute_file_hash(chunks_array); var ptr1 = ret[0]; var len1 = ret[1]; if (ret[3]) { ptr1 = 0; len1 = 0; throw takeFromExternrefTable0(ret[2]); } deferred2_0 = ptr1; deferred2_1 = len1; return getStringFromWasm0(ptr1, len1); } finally { wasm.__wbindgen_free(deferred2_0, deferred2_1, 1); } } function passArrayJsValueToWasm0(array, malloc) { const ptr = malloc(array.length * 4, 4) >>> 0; for (let i = 0; i < array.length; i++) { const add = addToExternrefTable0(array[i]); getDataViewMemory0().setUint32(ptr + 4 * i, add, true); } WASM_VECTOR_LEN = array.length; return ptr; } function compute_verification_hash(chunk_hashes) { let deferred3_0; let deferred3_1; try { const ptr0 = passArrayJsValueToWasm0(chunk_hashes, wasm.__wbindgen_malloc); const len0 = WASM_VECTOR_LEN; const ret = wasm.compute_verification_hash(ptr0, len0); var ptr2 = ret[0]; var len2 = ret[1]; if (ret[3]) { ptr2 = 0; len2 = 0; throw takeFromExternrefTable0(ret[2]); } deferred3_0 = ptr2; deferred3_1 = len2; return getStringFromWasm0(ptr2, len2); } finally { wasm.__wbindgen_free(deferred3_0, deferred3_1, 1); } } function compute_hmac(hash_hex, hmac_key_hex) { let deferred4_0; let deferred4_1; try { const ptr0 = passStringToWasm0(hash_hex, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); const len0 = WASM_VECTOR_LEN; const ptr1 = passStringToWasm0(hmac_key_hex, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); const len1 = WASM_VECTOR_LEN; const ret = wasm.compute_hmac(ptr0, len0, ptr1, len1); var ptr3 = ret[0]; var len3 = ret[1]; if (ret[3]) { ptr3 = 0; len3 = 0; throw takeFromExternrefTable0(ret[2]); } deferred4_0 = ptr3; deferred4_1 = len3; return getStringFromWasm0(ptr3, len3); } finally { wasm.__wbindgen_free(deferred4_0, deferred4_1, 1); } } function __wbg_String_8f0eb39a4a4c2f66(arg0, arg1) { const ret = String(arg1); const ptr1 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); const len1 = WASM_VECTOR_LEN; getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true); getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true); } function __wbg_buffer_609cc3eee51ed158(arg0) { const ret = arg0.buffer; return ret; } function __wbg_call_672a4d21634d4a24() { return handleError(function(arg0, arg1) { const ret = arg0.call(arg1); return ret; }, arguments); } function __wbg_done_769e5ede4b31c67b(arg0) { const ret = arg0.done; return ret; } function __wbg_get_67b2ba62fc30de12() { return handleError(function(arg0, arg1) { const ret = Reflect.get(arg0, arg1); return ret; }, arguments); } function __wbg_get_b9b93047fe3cf45b(arg0, arg1) { const ret = arg0[arg1 >>> 0]; return ret; } function __wbg_getwithrefkey_1dc361bd10053bfe(arg0, arg1) { const ret = arg0[arg1]; return ret; } function __wbg_instanceof_ArrayBuffer_e14585432e3737fc(arg0) { let result; try { result = arg0 instanceof ArrayBuffer; } catch (_) { result = false; } const ret = result; return ret; } function __wbg_instanceof_Uint8Array_17156bcf118086a9(arg0) { let result; try { result = arg0 instanceof Uint8Array; } catch (_) { result = false; } const ret = result; return ret; } function __wbg_isArray_a1eab7e0d067391b(arg0) { const ret = Array.isArray(arg0); return ret; } function __wbg_isSafeInteger_343e2beeeece1bb0(arg0) { const ret = Number.isSafeInteger(arg0); return ret; } function __wbg_iterator_9a24c88df860dc65() { const ret = Symbol.iterator; return ret; } function __wbg_length_a446193dc22c12f8(arg0) { const ret = arg0.length; return ret; } function __wbg_length_e2d2a49132c1b256(arg0) { const ret = arg0.length; return ret; } function __wbg_new_405e22f390576ce2() { const ret = new Object(); return ret; } function __wbg_new_78feb108b6472713() { const ret = new Array(); return ret; } function __wbg_new_a12002a7f91c75be(arg0) { const ret = new Uint8Array(arg0); return ret; } function __wbg_next_25feadfc0913fea9(arg0) { const ret = arg0.next; return ret; } function __wbg_next_6574e1a8a62d1055() { return handleError(function(arg0) { const ret = arg0.next(); return ret; }, arguments); } function __wbg_set_37837023f3d740e8(arg0, arg1, arg2) { arg0[arg1 >>> 0] = arg2; } function __wbg_set_3f1d0b984ed272ed(arg0, arg1, arg2) { arg0[arg1] = arg2; } function __wbg_set_65595bdd868b3009(arg0, arg1, arg2) { arg0.set(arg1, arg2 >>> 0); } function __wbg_value_cd1ffa7b1ab794f1(arg0) { const ret = arg0.value; return ret; } function __wbindgen_as_number(arg0) { const ret = +arg0; return ret; } function __wbindgen_boolean_get(arg0) { const v = arg0; const ret = typeof v === "boolean" ? v ? 1 : 0 : 2; return ret; } function __wbindgen_debug_string(arg0, arg1) { const ret = debugString(arg1); const ptr1 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); const len1 = WASM_VECTOR_LEN; getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true); getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true); } function __wbindgen_error_new(arg0, arg1) { const ret = new Error(getStringFromWasm0(arg0, arg1)); return ret; } function __wbindgen_in(arg0, arg1) { const ret = arg0 in arg1; return ret; } function __wbindgen_init_externref_table() { const table = wasm.__wbindgen_export_4; const offset = table.grow(4); table.set(0, void 0); table.set(offset + 0, void 0); table.set(offset + 1, null); table.set(offset + 2, true); table.set(offset + 3, false); ; } function __wbindgen_is_function(arg0) { const ret = typeof arg0 === "function"; return ret; } function __wbindgen_is_object(arg0) { const val = arg0; const ret = typeof val === "object" && val !== null; return ret; } function __wbindgen_is_undefined(arg0) { const ret = arg0 === void 0; return ret; } function __wbindgen_jsval_loose_eq(arg0, arg1) { const ret = arg0 == arg1; return ret; } function __wbindgen_memory() { const ret = wasm.memory; return ret; } function __wbindgen_number_get(arg0, arg1) { const obj = arg1; const ret = typeof obj === "number" ? obj : void 0; getDataViewMemory0().setFloat64(arg0 + 8 * 1, isLikeNone(ret) ? 0 : ret, true); getDataViewMemory0().setInt32(arg0 + 4 * 0, !isLikeNone(ret), true); } function __wbindgen_number_new(arg0) { const ret = arg0; return ret; } function __wbindgen_string_get(arg0, arg1) { const obj = arg1; const ret = typeof obj === "string" ? obj : void 0; var ptr1 = isLikeNone(ret) ? 0 : passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc); var len1 = WASM_VECTOR_LEN; getDataViewMemory0().setInt32(arg0 + 4 * 1, len1, true); getDataViewMemory0().setInt32(arg0 + 4 * 0, ptr1, true); } function __wbindgen_string_new(arg0, arg1) { const ret = getStringFromWasm0(arg0, arg1); return ret; } function __wbindgen_throw(arg0, arg1) { throw new Error(getStringFromWasm0(arg0, arg1)); } var wasm, WASM_VECTOR_LEN, cachedUint8ArrayMemory0, lTextEncoder, cachedTextEncoder, encodeString, cachedDataViewMemory0, lTextDecoder, cachedTextDecoder, ChunkerFinalization, Chunker; var init_chunker_wasm_bg = __esm({ "src/vendor/xet-chunk/chunker_wasm_bg.js"() { "use strict"; WASM_VECTOR_LEN = 0; cachedUint8ArrayMemory0 = null; lTextEncoder = typeof TextEncoder === "undefined" ? (0, module.require)("util").TextEncoder : TextEncoder; cachedTextEncoder = new lTextEncoder("utf-8"); encodeString = typeof cachedTextEncoder.encodeInto === "function" ? function(arg, view) { return cachedTextEncoder.encodeInto(arg, view); } : function(arg, view) { const buf = cachedTextEncoder.encode(arg); view.set(buf); return { read: arg.length, written: buf.length }; }; cachedDataViewMemory0 = null; lTextDecoder = typeof TextDecoder === "undefined" ? (0, module.require)("util").TextDecoder : TextDecoder; cachedTextDecoder = new lTextDecoder("utf-8", { ignoreBOM: true, fatal: true }); cachedTextDecoder.decode(); ChunkerFinalization = typeof FinalizationRegistry === "undefined" ? { register: () => { }, unregister: () => { } } : new FinalizationRegistry((ptr) => wasm.__wbg_chunker_free(ptr >>> 0, 1)); Chunker = class { __destroy_into_raw() { const ptr = this.__wbg_ptr; this.__wbg_ptr = 0; ChunkerFinalization.unregister(this); return ptr; } free() { const ptr = this.__destroy_into_raw(); wasm.__wbg_chunker_free(ptr, 0); } /** * @param {number} target_chunk_size */ constructor(target_chunk_size) { const ret = wasm.chunker_new(target_chunk_size); this.__wbg_ptr = ret >>> 0; ChunkerFinalization.register(this, this.__wbg_ptr, this); return this; } /** * @param {Uint8Array} data * @returns {any} */ add_data(data) { const ptr0 = passArray8ToWasm0(data, wasm.__wbindgen_malloc); const len0 = WASM_VECTOR_LEN; const ret = wasm.chunker_add_data(this.__wbg_ptr, ptr0, len0); if (ret[2]) { throw takeFromExternrefTable0(ret[1]); } return takeFromExternrefTable0(ret[0]); } /** * @returns {any} */ finish() { const ret = wasm.chunker_finish(this.__wbg_ptr); if (ret[2]) { throw takeFromExternrefTable0(ret[1]); } return takeFromExternrefTable0(ret[0]); } }; } }); // src/vendor/xet-chunk/chunker_wasm_bg.wasm.base64.ts var wasmBase64, wasmBinary; var init_chunker_wasm_bg_wasm_base64 = __esm({ "src/vendor/xet-chunk/chunker_wasm_bg.wasm.base64.ts"() { "use strict"; wasmBase64 = atob( ` AGFzbQEAAAABwAIuYAJ/fwF/YAN/f38Bf2ACf38AYAN/f38AYAR/f39/AGABfwBgAW8Bf2ABfwF/YAAEf39/f2AFf39/f38AYAFv AW9gAABgAn9vAGAAAW9gBn9/f39/fwBgAAN/f39gAm9vAW9gBn9/f39/fwF/YAV/f39/fwF/YAR/f39/AX9gAn9/AW9gAm9vAX9g AW8Ef39/f2ABbwF8YAF8AW9gA29vbwBgAm9/AW9gA29/bwBgA29vfwBgBX9/f35/AGAHf39/fn9/fwF/YAl/f39/f39+fn4AYAAB f2ADfn9/AX9gB39/f39/f38Bf2AEf39/fwR/f39/YAJ/fwR/f39/YAN/f38Df39/YAF/A39/f2AFf399f38AYAR/fX9/AGAFf398 f38AYAR/fH9/AGAFf39+f38AYAR/fn9/AGACf34BfgK/ECcYLi9oZl94ZXRfdGhpbl93YXNtX2JnLmpzFV9fd2JpbmRnZW5fc3Ry aW5nX25ldwAUGC4vaGZfeGV0X3RoaW5fd2FzbV9iZy5qcxRfX3diaW5kZ2VuX2Vycm9yX25ldwAUGC4vaGZfeGV0X3RoaW5fd2Fz bV9iZy5qcxRfX3diaW5kZ2VuX2lzX29iamVjdAAGGC4vaGZfeGV0X3RoaW5fd2FzbV9iZy5qcxdfX3diaW5kZ2VuX2lzX3VuZGVm aW5lZAAGGC4vaGZfeGV0X3RoaW5fd2FzbV9iZy5qcw1fX3diaW5kZ2VuX2luABUYLi9oZl94ZXRfdGhpbl93YXNtX2JnLmpzFV9f d2JpbmRnZW5fc3RyaW5nX2dldAAMGC4vaGZfeGV0X3RoaW5fd2FzbV9iZy5qcxlfX3diaW5kZ2VuX2pzdmFsX2xvb3NlX2VxABUY Li9oZl94ZXRfdGhpbl93YXNtX2JnLmpzFl9fd2JpbmRnZW5fYm9vbGVhbl9nZXQABhguL2hmX3hldF90aGluX3dhc21fYmcuanMV X193YmluZGdlbl9udW1iZXJfZ2V0AAwYLi9oZl94ZXRfdGhpbl93YXNtX2JnLmpzFF9fd2JpbmRnZW5fYXNfbnVtYmVyABcYLi9o Zl94ZXRfdGhpbl93YXNtX2JnLmpzHV9fd2JnX1N0cmluZ184ZjBlYjM5YTRhNGMyZjY2AAwYLi9oZl94ZXRfdGhpbl93YXNtX2Jn LmpzFV9fd2JpbmRnZW5fbnVtYmVyX25ldwAYGC4vaGZfeGV0X3RoaW5fd2FzbV9iZy5qcyRfX3diZ19nZXR3aXRocmVma2V5XzFk YzM2MWJkMTAwNTNiZmUAEBguL2hmX3hldF90aGluX3dhc21fYmcuanMaX193Ymdfc2V0XzNmMWQwYjk4NGVkMjcyZWQAGRguL2hm X3hldF90aGluX3dhc21fYmcuanMaX193YmdfZ2V0X2I5YjkzMDQ3ZmUzY2Y0NWIAGhguL2hmX3hldF90aGluX3dhc21fYmcuanMd X193YmdfbGVuZ3RoX2UyZDJhNDkxMzJjMWIyNTYABhguL2hmX3hldF90aGluX3dhc21fYmcuanMaX193YmdfbmV3Xzc4ZmViMTA4 YjY0NzI3MTMADRguL2hmX3hldF90aGluX3dhc21fYmcuanMWX193YmluZGdlbl9pc19mdW5jdGlvbgAGGC4vaGZfeGV0X3RoaW5f d2FzbV9iZy5qcxtfX3diZ19uZXh0XzI1ZmVhZGZjMDkxM2ZlYTkAChguL2hmX3hldF90aGluX3dhc21fYmcuanMbX193YmdfbmV4 dF82NTc0ZTFhOGE2MmQxMDU1AAoYLi9oZl94ZXRfdGhpbl93YXNtX2JnLmpzG19fd2JnX2RvbmVfNzY5ZTVlZGU0YjMxYzY3YgAG GC4vaGZfeGV0X3RoaW5fd2FzbV9iZy5qcxxfX3diZ192YWx1ZV9jZDFmZmE3YjFhYjc5NGYxAAoYLi9oZl94ZXRfdGhpbl93YXNt X2JnLmpzH19fd2JnX2l0ZXJhdG9yXzlhMjRjODhkZjg2MGRjNjUADRguL2hmX3hldF90aGluX3dhc21fYmcuanMaX193YmdfZ2V0 XzY3YjJiYTYyZmMzMGRlMTIAEBguL2hmX3hldF90aGluX3dhc21fYmcuanMbX193YmdfY2FsbF82NzJhNGQyMTYzNGQ0YTI0ABAY Li9oZl94ZXRfdGhpbl93YXNtX2JnLmpzGl9fd2JnX25ld180MDVlMjJmMzkwNTc2Y2UyAA0YLi9oZl94ZXRfdGhpbl93YXNtX2Jn LmpzGl9fd2JnX3NldF8zNzgzNzAyM2YzZDc0MGU4ABsYLi9oZl94ZXRfdGhpbl93YXNtX2JnLmpzHl9fd2JnX2lzQXJyYXlfYTFl YWI3ZTBkMDY3MzkxYgAGGC4vaGZfeGV0X3RoaW5fd2FzbV9iZy5qcy1fX3diZ19pbnN0YW5jZW9mX0FycmF5QnVmZmVyX2UxNDU4 NTQzMmUzNzM3ZmMABhguL2hmX3hldF90aGluX3dhc21fYmcuanMkX193YmdfaXNTYWZlSW50ZWdlcl8zNDNlMmJlZWVlY2UxYmIw AAYYLi9oZl94ZXRfdGhpbl93YXNtX2JnLmpzHV9fd2JnX2J1ZmZlcl82MDljYzNlZWU1MWVkMTU4AAoYLi9oZl94ZXRfdGhpbl93 YXNtX2JnLmpzGl9fd2JnX25ld19hMTIwMDJhN2Y5MWM3NWJlAAoYLi9oZl94ZXRfdGhpbl93YXNtX2JnLmpzGl9fd2JnX3NldF82 NTU5NWJkZDg2OGIzMDA5ABwYLi9oZl94ZXRfdGhpbl93YXNtX2JnLmpzHV9fd2JnX2xlbmd0aF9hNDQ2MTkzZGMyMmMxMmY4AAYY Li9oZl94ZXRfdGhpbl93YXNtX2JnLmpzLF9fd2JnX2luc3RhbmNlb2ZfVWludDhBcnJheV8xNzE1NmJjZjExODA4NmE5AAYYLi9o Zl94ZXRfdGhpbl93YXNtX2JnLmpzF19fd2JpbmRnZW5fZGVidWdfc3RyaW5nAAwYLi9oZl94ZXRfdGhpbl93YXNtX2JnLmpzEF9f d2JpbmRnZW5fdGhyb3cAAhguL2hmX3hldF90aGluX3dhc21fYmcuanMRX193YmluZGdlbl9tZW1vcnkADRguL2hmX3hldF90aGlu X3dhc21fYmcuanMfX193YmluZGdlbl9pbml0X2V4dGVybnJlZl90YWJsZQALA8oByAEdBwIeAgADCQMRAQQDAwEABQEAAAABEQEA BAICAR8BAAIgIQcOACIAAAIOAAAAAgIACQMLAgAEBAQDAwECBwUAAwICCQMCDgMFDgIABAIDAAAACQQDAQMCBwAABAQEAwAFBAsB AQQFAgEDBAIAABIABSMkJRYWAiYTEQcAACcSCSkrBQQAAQQtAAUDBQAABxMAAwABAAkAAAQEAAAFAgICAAAAAgMHAwMDAAUAAAAA AAAAAAAAAgsLAAIAAAIBAQIAAAIHBwcHAwQJAnABZ2dvAIABBQMBABEGCQF/AUGAgMAACwffAhEGbWVtb3J5AgASX193YmdfY2h1 bmtlcl9mcmVlAGgLY2h1bmtlcl9uZXcAShBjaHVua2VyX2FkZF9kYXRhAJoBDmNodW5rZXJfZmluaXNoAJ4BEWNvbXB1dGVfeG9y Yl9oYXNoAJsBEWNvbXB1dGVfZmlsZV9oYXNoAJwBGWNvbXB1dGVfdmVyaWZpY2F0aW9uX2hhc2gAmQEMY29tcHV0ZV9obWFjAJgB EV9fd2JpbmRnZW5fbWFsbG9jAJYBEl9fd2JpbmRnZW5fcmVhbGxvYwCfARRfX3diaW5kZ2VuX2V4bl9zdG9yZQDDARdfX2V4dGVy bnJlZl90YWJsZV9hbGxvYwBIE19fd2JpbmRnZW5fZXhwb3J0XzQBARlfX2V4dGVybnJlZl90YWJsZV9kZWFsbG9jAG8PX193Ymlu ZGdlbl9mcmVlALgBEF9fd2JpbmRnZW5fc3RhcnQAJgm5AQEAQQELZtcB2AG3AbABigFO2QHTAbsBNr0B1QGwAYoBUucB6AHWAdQB sAGKAU+7AXKTAaUBcKYBpQGgAawBqgGmAaYBpAGnAagBrQGDAXrtAe4BggGIAV2hAWuEAYwBX27aAZEBvwHAAcwBe3fBAb0BhgGr AdIBowFmV8IBlAFirwHbAcEBsgHQAX6wAYsBVN8BxAHFAccBjgHGAeABqQF4W2npAbABjwFT4QHiAbkBuwHIAckBOnZcCsr6BMgB iRsBIH8gACAAKAIYIh0gASgAECIkIAAoAghqaiIbIAEoABQiFWogHSAbIAJB/wFxc0EQdyICQfLmu+MDaiIdc0EUdyIbaiIiIAJz QRh3IgkgHWoiHCAbc0EZdyIPIAAoAhQiGyABKAAIIgIgACgCBGpqIhkgASgADCIdaiAZIANCIIinc0EQdyIeQfui4aQEayIgIBtz QRR3IgZqIgogASgAKCIbamoiIyABKAAsIhlqIA8gIyAAKAIQIiEgASgAACIPIAAoAgBqaiIIIAEoAAQiH2ogISAIIAOnc0EQdyIh QefMp9AGaiIIc0EUdyIHaiIOICFzQRh3Ig1zQRB3IgsgACgCHCIFIAEoABgiIyAAKAIMamoiDCABKAAcIiFqIAUgDCAEQf8BcXNB EHciBEHGlcDVBWsiBXNBFHciDGoiESAEc0EYdyIQIAVqIgVqIhJzQRR3IhRqIhMgHWogBiAgIAogHnNBGHciIGoiBnNBGXciCiAO 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 AgAhCSAIQRhqIhEgAkEYaikCADcDACAIQRBqIhIgAkEQaikCADcDACAIQQhqIhMgAkEIaikCADcDACAIIAIpAgA3AwAgCCAJQcAA IBQgEBAnIAggCUFAa0HAACAUIAQQJyAIIAlBgAFqQcAAIBQgBBAnIAggCUHAAWpBwAAgFCAEECcgCCAJQYACakHAACAUIAQQJyAI IAlBwAJqQcAAIBQgBBAnIAggCUGAA2pBwAAgFCAEECcgCCAJQcADakHAACAUIAQQJyAIIAlBgARqQcAAIBQgBBAnIAggCUHABGpB wAAgFCAEECcgCCAJQYAFakHAACAUIAQQJyAIIAlBwAVqQcAAIBQgBBAnIAggCUGABmpBwAAgFCAEECcgCCAJQcAGakHAACAUIAQQ JyAIIAlBgAdqQcAAIBQgBBAnIAggCUHAB2pBwAAgFCAPECcgCkEYaiARKQMANwAAIApBEGogEikDADcAACAKQQhqIBMpAwA3AAAg CiAIKQMANwAAIAxBBGohDCAKQSBqIQogFEIBfCEUIA1BAWsiDQ0ACwsgCEEgaiQAIAFB/wdxIglFDQEgB0HIAWpCADcDACAHQcAB akIANwMAIAdBuAFqQgA3AwAgB0GwAWpCADcDACAHQagBakIANwMAIAdBoAFqQgA3AwAgB0GYAWpCADcDACAHQdgBaiIBIAJBCGop AgA3AwAgB0HgAWoiCiACQRBqKQIANwMAIAdB6AFqIgggAkEYaikCADcDACAHQgA3A5ABIAcgBDoA+gEgB0EAOwH4ASAHIAIpAgA3 A9ABIAcgC60gA3w3A/ABIAdBkAFqIAAgDmogCRBFIQAgB0HQAGogASkDADcDACAHQdgAaiAKKQMANwMAIAdB4ABqIAgpAwA3AwAg B0EQaiAAQQhqKQMANwMAIAdBGGogAEEQaikDADcDACAHQSBqIABBGGopAwA3AwAgB0EoaiAAQSBqKQMANwMAIAdBMGogAEEoaikD ADcDACAHQThqIABBMGopAwA3AwAgB0FAayAAQThqKQMANwMAIAcgBykD0AE3A0ggByAAKQMANwMIIActAPoBIQAgBy0A+QEhAiAH IActAPgBIgQ6AHAgByAHKQPwASIDNwNoIAcgACACRXJBAnIiADoAcSAHQZgCaiICIAgpAwA3AwAgB0GQAmoiCCAKKQMANwMAIAdB iAJqIgogASkDADcDACAHIAcpA9ABNwOAAiAHQYACaiAHQQhqIAQgAyAAECcgC0EFdCIAQSBqIgEgBksNAiACKAIAIQEgCCgCACEC IAooAgAhBCAHKAKUAiEGIAcoAowCIQogBygChAIhCCAHKAKAAiEJIAAgBWoiACAHKAKcAjYAHCAAIAE2ABggACAGNgAUIAAgAjYA ECAAIAo2AAwgACAENgAIIAAgCDYABCAAIAk2AAAgC0EBaiELDAELQn8gAa1CAXxCAYhCAX15iKciCiABTw0CIAdBCGoiCEEAQYAB EEMaIAAgCkEBaiIKIAIgAyAEIAhBIEHAACAKQYAIRhsiCRAqIQsgACAKaiABIAprIAIgCkEKdq0gA3wgBCAIIAlqQYABIAlrECog C0EBRgRAIAZBP00NBCAFIAcpAAg3AAAgBUE4aiAHQUBrKQAANwAAIAVBMGogB0E4aikAADcAACAFQShqIAdBMGopAAA3AAAgBUEg aiAHQShqKQAANwAAIAVBGGogB0EgaikAADcAACAFQRBqIAdBGGopAAA3AAAgBUEIaiAHQRBqKQAANwAAQQIhCwwBCyALakEFdCIA QYEBTw0EIAdBCGogACACIAQgBSAGED0hCwsgB0GgAmokACALDwsgASAGQYC9wAAQzgEACyAHQQA2AhggB0EBNgIMIAdBiLzAADYC CCAHQgQ3AhAgB0EIakHQvcAAEJ0BAAtBwAAgBkHgvcAAEM4BAAsgAEGAAUHwvcAAEM4BAAuECwQMfwF8AX4Bb0GshcAAIQMjAEHQ AGsiAiQAIAIgATYCDAJAAkACQCABEOoBQQFGBEAgAiABNgIgIAJBADYCECACQayFwAA2AhggAkG8hcAANgIcIAJBIGohCkGAgICA eCEBAkADQCACIANBCGo2AhggAiADKAIAIAMoAgQQOzYCOAJAAn8gCigCACUBIAJBOGooAgAlARAMIRAQSCIFIBAmAQJAAkACQCAF JQEQA0EBRgRAIAIoAjglASACKAIgJQEQBEEBRw0BCwJAIAIoAhBFDQAgAigCFCIHQYQBSQ0AIAcQbwsgAiAFNgIUIAJBATYCECAD KAIAIQUCQCADKAIEQQRrDgMCAwADC0EAIQdBBiEIQaWFwAAhAwJAA0AgBS0AACILIAMtAAAiDEYEQCAFQQFqIQUgA0EBaiEDIAhB AWsiCA0BDAILCyALIAxrIQcLIAcNAkEBDAMLIAVBhAFPBEAgBRBvCyACKAI4IgNBhAFPBEAgAxBvCwwDC0EAIAUoAABBoYXAACgA AEYNARoLQQILIQMgAigCOCIFQYQBTwRAIAUQbwsCQAJAAkACQAJAIANBAWsOAgIAAQsgAigCECACQQA2AhBBAUYEQCACKAIUIgNB hAFJDQQgAxBvDAQLDAoLIAFBgICAgHhHBEBB0ZLAAEEEEIEBIQQMAgsgAigCECACQQA2AhBBAUcNCSACIAIoAhQiAzYCOCACIAMQ 5gECQCACKAIAIgYEQCACKAIEIgEhDQwBCyACQThqIAJBzwBqQdiQwAAQPiEGQYCAgIB4IQELIANBhAFPBEAgAxBvCyABQYCAgIB4 Rw0CIABBgICAgHg2AgAgACAGNgIEDAULIAlFBEAgAigCECACQQA2AhBBAUcNCSACIAIoAhQ2AiQgAkEoaiIEIAJBJGoiAygCACUB EB0EfiADKAIAJQEQCSIORAAAAAAAAODDZiEDIARC////////////AAJ+IA6ZRAAAAAAAAOBDYwRAIA6wDAELQoCAgICAgICAgH8L QoCAgICAgICAgH8gAxsgDkT////////fQ2QbQgAgDiAOYRs3AwhCAQVCAAs3AwACfwJAIAIoAihBAUYEQCACKQMwIg9CAFkNAQsg AkEkaiACQc8AakHIkMAAED4hBEEBDAELIA9CgICAgBBaBEAgAkEBOgA4IAIgDzcDQCMAQTBrIgMkACADQciQwAA2AgQgAyACQc8A ajYCACADQQI2AgwgA0HIjMAANgIIIANCAjcCFCADIAOtQoCAgICQAYQ3AyggAyACQThqrUKAgICAoAGENwMgIAMgA0EgajYCECAD QQhqEGQhBCADQTBqJABBAQwBCyAPpyEEQQALIAIoAiQiBUGEAU8EQCAFEG8LQQEhCUUNAgwBC0HVksAAQQYQgQEhBAsgAEGAgICA eDYCACAAIAQ2AgQgAUGAgICAeHJBgICAgHhGDQMgBiABEMoBDAMLCyACKAIYIgMgAigCHEcNAAsgAUGAgICAeEYEQEHRksAAQQQQ gAEhASAAQYCAgIB4NgIAIAAgATYCBAwBCyAJRQRAQdWSwABBBhCAASEEIABBgICAgHg2AgAgACAENgIEIAFFDQEgBiABEMoBDAEL IAAgBDYCDCAAIA02AgggACAGNgIEIAAgATYCACACKAIgIgBBhAFPBEAgABBvCyACKAIQRQ0DIAIoAhQiA0GDAU0NAwwCCyACKAIg IgBBhAFPBEAgABBvCyACKAIQRQ0CIAIoAhQiA0GDAUsNAQwCCyACQQxqIAJBzwBqQfiQwAAQPiEEIABBgICAgHg2AgAgACAENgIE IAFBhAFJDQEgARBvDAELIAMQbwsgAkHQAGokAA8LQaCSwABBMRDcAQALxgYBCH8CQAJAIAEgAEEDakF8cSIDIABrIghJDQAgASAI ayIGQQRJDQAgBkEDcSEHQQAhAQJAIAAgA0YiCQ0AAkAgACADayIFQXxLBEBBACEDDAELQQAhAwNAIAEgACADaiICLAAAQb9/Smog AkEBaiwAAEG/f0pqIAJBAmosAABBv39KaiACQQNqLAAAQb9/SmohASADQQRqIgMNAAsLIAkNACAAIANqIQIDQCABIAIsAABBv39K aiEBIAJBAWohAiAFQQFqIgUNAAsLIAAgCGohAAJAIAdFDQAgACAGQXxxaiIDLAAAQb9/SiEEIAdBAUYNACAEIAMsAAFBv39KaiEE IAdBAkYNACAEIAMsAAJBv39KaiEECyAGQQJ2IQUgASAEaiEEA0AgACEDIAVFDQJBwAEgBSAFQcABTxsiBkEDcSEHIAZBAnQhCEEA IQIgBUEETwRAIAAgCEHwB3FqIQkgACEBA0AgASgCACIAQX9zQQd2IABBBnZyQYGChAhxIAJqIAEoAgQiAEF/c0EHdiAAQQZ2ckGB goQIcWogASgCCCIAQX9zQQd2IABBBnZyQYGChAhxaiABKAIMIgBBf3NBB3YgAEEGdnJBgYKECHFqIQIgAUEQaiIBIAlHDQALCyAF IAZrIQUgAyAIaiEAIAJBCHZB/4H8B3EgAkH/gfwHcWpBgYAEbEEQdiAEaiEEIAdFDQALAn8gAyAGQfwBcUECdGoiACgCACIBQX9z QQd2IAFBBnZyQYGChAhxIgEgB0EBRg0AGiABIAAoAgQiAUF/c0EHdiABQQZ2ckGBgoQIcWoiASAHQQJGDQAaIAAoAggiAEF/c0EH diAAQQZ2ckGBgoQIcSABagsiAUEIdkH/gRxxIAFB/4H8B3FqQYGABGxBEHYgBGoPCyABRQRAQQAPCyABQQNxIQMCQCABQQRJBEAM AQsgAUF8cSEFA0AgBCAAIAJqIgEsAABBv39KaiABQQFqLAAAQb9/SmogAUECaiwAAEG/f0pqIAFBA2osAABBv39KaiEEIAUgAkEE aiICRw0ACwsgA0UNACAAIAJqIQEDQCAEIAEsAABBv39KaiEEIAFBAWohASADQQFrIgMNAAsLIAQLmQgCCn8DfiMAQeAAayIEJAAg Aq1CKH4iDachAwJAAkACQAJAAkACQCANQiCIpyADQfj///8HS3INAAJ/IANFBEBBCCEGQQAMAQtB+YLBAC0AABpBCCEFIANBCBC+ ASIGRQ0BIAILIQsgBiABIAMQNSEHIAJBAkkNBSAHQdAAaiEMIARB3ABqrUKAgICAEIQhDiAEQdgAaq1CgICAgCCEIQ8DQEEAIQNB ACEFAkADQCADIQYgAiAFSQ0HIAVBKGwhCQJAIAIgBWsiAUEDSQ0AQQkgASABQQlPGyEIIAkgDGohA0ECIQEDQCABIAhGBEAgCCEB DAILIAFBAWohASADQgQQrgEgA0EoaiEDQgBSDQALCyABIAVqIgggAUkNBCACIAhJDQVBvIPBACEFQbiDwQAoAgBFBEACf0H5gsEA LQAAGkGACEEBEL4BIgMEQEHIg8EAQQA2AgBBvIPBAEEANgIAQcSDwQAoAgAhBUHEg8EAIAM2AgBBwIPBACgCACEDQcCDwQBBgAg2 AgBBuIPBACgCAEG4g8EAQQE2AgBFIANFckUEQCAFIAMQygELQbyDwQAMAQtBAUGACEGoj8AAELEBAAshBQsCQAJAIAUoAgBFBEBB ACEDIAVBADYCDCAFQX82AgAgAQ0BQgAhDQwCC0GAicAAEIcBAAsgBUEEaiEKIAcgCWoiAyABQShsaiEJQgAhDQNAIAQgAzYCWCAE IANBIGoiATYCXCAEQQM2AjQgBEG0h8AANgIwIARCAjcCPCAEIA43AxAgBCAPNwMIIAQgBEEIajYCOCAKQZyNwAAgBEEwahA4DQgg ASkDACANfCENIAFBCGoiAyAJRw0ACyAFKAIMIQMLIARBMGpB1LvAACAFKAIIIAMQMiAEQdAAaiANNwMAIAUgBSgCAEEBajYCACAE QShqIgMgDTcDACAEQRBqIgUgBEE4aikDADcDACAEQRhqIgkgBEFAaykDADcDACAEQSBqIgogBEHIAGopAwA3AwAgBCAEKQMwNwMI IAIgBk0NASAHIAZBKGxqIgEgBCkDCDcDACABQSBqIAMpAwA3AwAgAUEYaiAKKQMANwMAIAFBEGogCSkDADcDACABQQhqIAUpAwA3 AwAgBkEBaiEDIAgiBSACRw0ACyADIQIgBg0BDAcLCyAGIAJB/IDAABB9AAsgBSADQfCEwAAQsQEACyAFIAhB7IDAABDPAQALIAgg AkHsgMAAEM4BAAtB3IfAAEErIARBMGpBzIfAAEHwiMAAEHkACyAFIAJBjIHAABDNAQALIAAgBykDADcDACAAQRhqIAdBGGopAwA3 AwAgAEEQaiAHQRBqKQMANwMAIABBCGogB0EIaikDADcDACALBEAgByALQShsEMoBCyAEQeAAaiQAC58HAgp/An4jAEEwayIGJAAC QAJAAkACQAJAAkACQAJAAkAgAwRAIAEoAhwgASgCKCIIayABKAIYIgUgCGtBwQBrIgcgAyADIAdLG0EAIAhBQGsgBUkbIgVqIgcg AyADIAdLGyEJAkADQCAFIAlLDQMgBkEIaiEKIAIgBWohDCAJIAVrIQ0gASkDECEQQQAhByABKQMAIQ8gASgCCCEOA0ACQCAHIA1G BEBBACELDAELIAEgDiAHIAxqLQAAQQN0aikDACAPQgGGfCIPNwMAQQEhCyAHQQFqIQcgDyAQg0IAUg0BCwsgCiAHNgIEIAogCzYC ACAGKAIIQQFHDQEgBigCDCAFaiIFIAhqIgogASgCGEkNAAsgCiABKAIcIgdJDQYMBQsgASgCHCIHIAggCWpNDQQLIARFBEAgAyAB KAIgIAEoAigiBWtLBEAgAUEgaiAFIAMQWSABKAIoIQULIAEoAiQgBWogAiADEDUaIAAgAzYCMCAAQQA2AgAgASADIAVqNgIoDAkL IAEoAigiBUUNASABQSBqIQQgAyABKAIgIAVrSwRAIAQgBSADEFkgASgCKCEFCyABKAIkIAVqIAIgAxA1GiABIAMgBWo2AiggBkEY aiAEQQhqKAIANgIAIAFBADYCKCAEKQIAIQ8gAUKAgICAEDcDICAGIA83AxAgBkEgaiAGQRBqEHEMAgsgBSAJQYCYwAAQzwEACyAG QSBqIAIgAxB1CyABQgA3AwAgAyEFDAILIAcgCGshBQsgAUIANwMAIAEoAigiB0UEQCADIAVJDQIgBkEgaiACIAUQdQwBCyADIAVJ DQIgAUEgaiEDIAUgASgCICAHa0sEQCADIAcgBRBZIAEoAighBwsgASgCJCAHaiACIAUQNRogASAFIAdqNgIoIAZBGGogA0EIaigC ADYCACABQQA2AiggAykCACEPIAFCgICAgBA3AyAgBiAPNwMQIAZBIGogBkEQahBxCyAGQRhqIAZBKGopAgAiDzcDACAGIAYpAiA3 AxAgD6dFBEAgAEEANgIwIABBADYCACAGQRxqIAYoAhRBACAGKAIQKAIQEQMADAMLIAYoAiAhASAGKAIsIQIgAEEQakG0u8AAIAYo AiQiAyAGKAIoIgQQMiAAIAU2AjAgACACNgIMIAAgBDYCCCAAIAM2AgQgACABNgIADAILIAUgA0GQmMAAEM4BAAsgBSADQaCYwAAQ zgEACyAGQTBqJAAL1QUCDH8DfiMAQaABayIDJAAgA0EAQaABEEMhCgJAAkACQAJAIAIgACgCoAEiBU0EQCAFQSlPDQEgASACQQJ0 aiEMAkACQCAFBEAgBUEBaiENIAVBAnQhCQNAIAogBkECdGohAwNAIAYhAiADIQQgASAMRg0JIANBBGohAyACQQFqIQYgASgCACEH IAFBBGoiCyEBIAdFDQALIAetIRFCACEPIAkhByACIQEgACEDA0AgAUEoTw0EIAQgDyAENQIAfCADNQIAIBF+fCIQPgIAIBBCIIgh DyAEQQRqIQQgAUEBaiEBIANBBGohAyAHQQRrIgcNAAsgCCAQQoCAgIAQWgR/IAIgBWoiAUEoTw0DIAogAUECdGogDz4CACANBSAF CyACaiIBIAEgCEkbIQggCyEBDAALAAsDQCABIAxGDQcgBEEBaiEEIAEoAgAgAUEEaiEBRQ0AIAggBEEBayICIAIgCEkbIQgMAAsA CyABQShBlPjAABB9AAsgAUEoQZT4wAAQfQALIAVBKU8NASACQQJ0IQwgAkEBaiENIAAgBUECdGohDiAAIQMDQCAKIAdBAnRqIQYD QCAHIQsgBiEEIAMgDkYNBSAEQQRqIQYgB0EBaiEHIAMoAgAhCSADQQRqIgUhAyAJRQ0ACyAJrSERQgAhDyAMIQkgCyEDIAEhBgJA A0AgA0EoTw0BIAQgDyAENQIAfCAGNQIAIBF+fCIQPgIAIBBCIIghDyAEQQRqIQQgA0EBaiEDIAZBBGohBiAJQQRrIgkNAAsgCCAQ QoCAgIAQWgR/IAIgC2oiA0EoTw0FIAogA0ECdGogDz4CACANBSACCyALaiIDIAMgCEkbIQggBSEDDAELCyADQShBlPjAABB9AAsg BUEoQZT4wAAQzgEACyAFQShBlPjAABDOAQALIANBKEGU+MAAEH0ACyAAIApBoAEQNSAINgKgASAKQaABaiQAC+wFAQd/An8gAUUE QCAAKAIUIQhBLSEKIAVBAWoMAQtBK0GAgMQAIAAoAhQiCEEBcSIBGyEKIAEgBWoLIQcCQCAIQQRxRQRAQQAhAgwBCyADQRBPBEAg AiADECwgB2ohBwwBCyADRQ0AIANBA3EhCQJAIANBBEkEQEEAIQEMAQsgA0EMcSEMQQAhAQNAIAEgAiAGaiILLAAAQb9/SmogC0EB aiwAAEG/f0pqIAtBAmosAABBv39KaiALQQNqLAAAQb9/SmohASAMIAZBBGoiBkcNAAsLIAkEQCACIAZqIQYDQCABIAYsAABBv39K aiEBIAZBAWohBiAJQQFrIgkNAAsLIAEgB2ohBwsgACgCAEUEQCAAKAIcIgEgACgCICIAIAogAiADEJUBBEBBAQ8LIAEgBCAFIAAo AgwRAQAPCwJAAkACQCAHIAAoAgQiBk8EQCAAKAIcIgEgACgCICIAIAogAiADEJUBRQ0BQQEPCyAIQQhxRQ0BIAAoAhAhCyAAQTA2 AhAgAC0AGCEMQQEhASAAQQE6ABggACgCHCIIIAAoAiAiCSAKIAIgAxCVAQ0CIAYgB2tBAWohAQJAA0AgAUEBayIBRQ0BIAhBMCAJ KAIQEQAARQ0AC0EBDwsgCCAEIAUgCSgCDBEBAARAQQEPCyAAIAw6ABggACALNgIQQQAPCyABIAQgBSAAKAIMEQEAIQEMAQsgBiAH ayEHAkACQAJAQQEgAC0AGCIBIAFBA0YbIgFBAWsOAgABAgsgByEBQQAhBwwBCyAHQQF2IQEgB0EBakEBdiEHCyABQQFqIQEgACgC ECEIIAAoAiAhBiAAKAIcIQACQANAIAFBAWsiAUUNASAAIAggBigCEBEAAEUNAAtBAQ8LQQEhASAAIAYgCiACIAMQlQENACAAIAQg BSAGKAIMEQEADQBBACEBA0AgASAHRgRAQQAPCyABQQFqIQEgACAIIAYoAhARAABFDQALIAFBAWsgB0kPCyABC64FAQd/AkAgACgC ACIJIAAoAggiBHIEQAJAIARBAXFFDQAgASACaiEHAkAgACgCDCIGRQRAIAEhBAwBCyABIQQDQCAEIgMgB0YNAgJ/IANBAWogAywA ACIIQQBODQAaIANBAmogCEFgSQ0AGiADQQNqIAhBcEkNABogA0EEagsiBCADayAFaiEFIAZBAWsiBg0ACwsgBCAHRg0AIAQsAAAa IAUgAgJ/AkAgBUUNACACIAVNBEAgAiAFRg0BQQAMAgsgASAFaiwAAEFATg0AQQAMAQsgAQsiAxshAiADIAEgAxshAQsgCUUNASAA KAIEIQcCQCACQRBPBEAgASACECwhAwwBCyACRQRAQQAhAwwBCyACQQNxIQYCQCACQQRJBEBBACEDQQAhBQwBCyACQQxxIQhBACED QQAhBQNAIAMgASAFaiIELAAAQb9/SmogBEEBaiwAAEG/f0pqIARBAmosAABBv39KaiAEQQNqLAAAQb9/SmohAyAIIAVBBGoiBUcN AAsLIAZFDQAgASAFaiEEA0AgAyAELAAAQb9/SmohAyAEQQFqIQQgBkEBayIGDQALCwJAIAMgB0kEQCAHIANrIQYCQAJAAkAgAC0A GCIEQQAgBEEDRxsiA0EBaw4CAAECCyAGIQNBACEGDAELIAZBAXYhAyAGQQFqQQF2IQYLIANBAWohAyAAKAIQIQUgACgCICEEIAAo AhwhAANAIANBAWsiA0UNAiAAIAUgBCgCEBEAAEUNAAtBAQ8LDAILIAAgASACIAQoAgwRAQAEQEEBDwtBACEDA0AgAyAGRgRAQQAP CyADQQFqIQMgACAFIAQoAhARAABFDQALIANBAWsgBkkPCyAAKAIcIAEgAiAAKAIgKAIMEQEADwsgACgCHCABIAIgACgCICgCDBEB AAveCAIKfwF+IwBBgAJrIgQkACAEIAEpABg3AhggBCABKQAQNwIQIAQgASkACDcCCCAEIAEpAAA3AgACfyADQYEITwRAIARBIGoh BSMAQeAAayIBJAAgAUE4aiIGQgA3AwAgAUEwaiIHQgA3AwAgAUEoaiIIQgA3AwAgAUEgaiIJQgA3AwAgAUEYaiIKQgA3AwAgAUEQ aiILQgA3AwAgAUEIaiIMQgA3AwAgAUIANwMAIAIgAyAEQgBBECABQcAAECohAiABQdgAakIANwMAIAFB0ABqQgA3AwAgAUHIAGpC ADcDACABQgA3A0ACQAJAAkACQCACQQNPBEADQCACQQV0IgJBwQBPDQIgASACIARBECABQUBrIg1BIBA9IgJBBXQiA0HBAE8NAyAD QSFPDQQgASANIAMQNRogAkECSw0ACwsgBSABKQMANwAAIAVBOGogBikDADcAACAFQTBqIAcpAwA3AAAgBUEoaiAIKQMANwAAIAVB IGogCSkDADcAACAFQRhqIAopAwA3AAAgBUEQaiALKQMANwAAIAVBCGogDCkDADcAACABQeAAaiQADAMLIAJBwABBgL7AABDOAQAL IANBwABBkL7AABDOAQALIANBIEGgvsAAEM4BAAsgBEH4AGogBEEYaikCADcDACAEQfAAaiAEQRBqKQIANwMAIARB6ABqIARBCGop AgA3AwAgBCAEKQIANwNgQcAAIQNBFAwBCyAEQcgBakIANwMAIARBwAFqQgA3AwAgBEG4AWpCADcDACAEQbABakIANwMAIARBqAFq QgA3AwAgBEGYAWpCADcDACAEQRA6APoBIARBoAFqQgA3AwAgBEHYAWoiBSAEQQhqKQIANwMAIARB6AFqIgYgBEEYaikCADcDACAE QeABaiIHIARBEGopAgA3AwAgBEIANwOQASAEIAQpAgA3A9ABIARBADsB+AEgBEIANwPwASAEQZABaiACIAMQRSEBIARB6ABqIAUp AwA3AwAgBEHwAGogBykDADcDACAEQfgAaiAGKQMANwMAIARBKGogAUEIaikDADcDACAEQTBqIAFBEGopAwA3AwAgBEE4aiABQRhq KQMANwMAIARBQGsgAUEgaikDADcDACAEQcgAaiABQShqKQMANwMAIARB0ABqIAFBMGopAwA3AwAgBEHYAGogAUE4aikDADcDACAE IAQpA9ABNwNgIAQgASkDADcDICAEKQPwASEOIAQtAPgBIQMgBC0A+gEgBC0A+QFFckECcgshASAEIA43A4ABIAQgAzoAiAEgBCAB OgCJASAEQagBaiICIARB+ABqKQMANwMAIARBoAFqIgUgBEHwAGopAwA3AwAgBEGYAWoiBiAEQegAaikDADcDACAEIAQpA2A3A5AB IARBkAFqIARBIGogA0IAIAFBCHIQJyAAIAIpAwA3ABggACAFKQMANwAQIAAgBikDADcACCAAIAQpA5ABNwAAIARBgAJqJAALuAsB BX8jAEEgayIEJAACQAJAAkACQAJAAkACQAJAAkACQAJAAkAgAQ4oBgEBAQEBAQEBAgQBAQMBAQEBAQEBAQEBAQEBAQEBAQEBAQgB AQEBBwALIAFB3ABGDQQLIAJBAXFFIAFBgAZJcg0HAn8CQEERQQAgAUGvsARPGyICIAJBCHIiAyABQQt0IgIgA0ECdEHg+8AAaigC AEELdEkbIgMgA0EEciIDIANBAnRB4PvAAGooAgBBC3QgAksbIgMgA0ECciIDIANBAnRB4PvAAGooAgBBC3QgAksbIgMgA0EBaiID IANBAnRB4PvAAGooAgBBC3QgAksbIgMgA0EBaiIDIANBAnRB4PvAAGooAgBBC3QgAksbIgNBAnRB4PvAAGooAgBBC3QiBSACRiAC IAVLaiADaiIDQSFNBEAgA0ECdEHg+8AAaiIGKAIAQRV2IQJB7wUhBQJ/AkAgA0EhRg0AIAYoAgRBFXYhBSADDQBBAAwBCyAGQQRr KAIAQf///wBxCyEDAkAgBSACQX9zakUNACABIANrIQdB7wUgAiACQe8FTRshBiAFQQFrIQNBACEFA0AgAiAGRg0DIAUgAkHo/MAA ai0AAGoiBSAHSw0BIAMgAkEBaiICRw0ACyADIQILIAJBAXEMAgsgA0EiQdT3wAAQfQALIAZB7wVB5PfAABB9AAtFDQcgBEEAOgAK IARBADsBCCAEIAFBFHZB/+PAAGotAAA6AAsgBCABQQR2QQ9xQf/jwABqLQAAOgAPIAQgAUEIdkEPcUH/48AAai0AADoADiAEIAFB DHZBD3FB/+PAAGotAAA6AA0gBCABQRB2QQ9xQf/jwABqLQAAOgAMIAFBAXJnQQJ2IgIgBEEIaiIDaiIFQfsAOgAAIAVBAWtB9QA6 AAAgAyACQQJrIgJqQdwAOgAAIARBEGoiAyABQQ9xQf/jwABqLQAAOgAAIABBCjoACyAAIAI6AAogACAEKQIINwIAIARB/QA6ABEg AEEIaiADLwEAOwEADAkLIABBgAQ7AQogAEIANwECIABB3OgBOwEADAgLIABBgAQ7AQogAEIANwECIABB3OQBOwEADAcLIABBgAQ7 AQogAEIANwECIABB3NwBOwEADAYLIABBgAQ7AQogAEIANwECIABB3LgBOwEADAULIABBgAQ7AQogAEIANwECIABB3OAAOwEADAQL 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 QQdxIgQEQANAIAMgAToAACADQQFqIQMgBEEBayIEDQALCyACQQFrQQdJDQADQCADIAE6AAAgA0EHaiABOgAAIANBBmogAToAACAD QQVqIAE6AAAgA0EEaiABOgAAIANBA2ogAToAACADQQJqIAE6AAAgA0EBaiABOgAAIANBCGoiAyAFRw0ACwsgAAv+AgEEfwJAAkAC QAJAAkACQAJ/AkAgByAIVgRAIAcgCH0gCFgNAwJAIAYgByAGfVQgByAGQgGGfSAIQgGGWnFFBEAgBiAIVg0BDAoLIAIgA0kNBQwI CyAHIAYgCH0iBn0gBlYNCCACIANJDQUgASADaiEMIAEhCwJAA0AgAyAJRg0BIAlBAWohCSALQQFrIgsgA2oiCi0AAEE5Rg0ACyAK IAotAABBAWo6AAAgAyAJa0EBaiADTw0HIApBAWpBMCAJQQFrEEMaDAcLQTEgA0UNAhogAUExOgAAIANBAUcNAUEwDAILIABBADYC AA8LIAFBAWpBMCADQQFrEEMaQTALIQkgBEEBasEiBCAFwUwgAiADTXINAyAMIAk6AAAgA0EBaiEDDAMLIABBADYCAA8LIAMgAkGQ 4sAAEM4BAAsgAyACQfDhwAAQzgEACyACIANPDQAgAyACQYDiwAAQzgEACyAAIAQ7AQggACADNgIEIAAgATYCAA8LIABBADYCAAub AwECfwJAAkACQAJAIAAtAGgiAwRAIANBwQBPDQMgACADaiABIAJBwAAgA2siAyACIANJGyIDEDUaIAAgAC0AaCADaiIEOgBoIAEg A2ohASACIANrIgJFBEBBACECDAILIABBQGsgAEHAACAAKQNgIAAtAGogAC0AaUVyECcgAEIANwMAIABBADoAaCAAQQhqQgA3AwAg AEEQakIANwMAIABBGGpCADcDACAAQSBqQgA3AwAgAEEoakIANwMAIABBMGpCADcDACAAQThqQgA3AwAgACAALQBpQQFqOgBpC0EA IQMgAkHBAEkNASAAQUBrIQQgAC0AaSEDA0AgBCABQcAAIAApA2AgAC0AaiADQf8BcUVyECcgACAALQBpQQFqIgM6AGkgAUFAayEB IAJBQGoiAkHAAEsNAAsgAC0AaCEECyAEQf8BcSIDQcEATw0CCyAAIANqIAEgAkHAACADayIBIAEgAksbIgEQNRogACAALQBoIAFq OgBoIAAPCyADQcAAQfC8wAAQzQEACyADQcAAQfC8wAAQzQEAC+cCAQV/AkBBzf97QRAgACAAQRBNGyIAayABTQ0AIABBECABQQtq QXhxIAFBC0kbIgRqQQxqECgiAkUNACACQQhrIQECQCAAQQFrIgMgAnFFBEAgASEADAELIAJBBGsiBSgCACIGQXhxIAIgA2pBACAA a3FBCGsiAiAAQQAgAiABa0EQTRtqIgAgAWsiAmshAyAGQQNxBEAgACADIAAoAgRBAXFyQQJyNgIEIAAgA2oiAyADKAIEQQFyNgIE IAUgAiAFKAIAQQFxckECcjYCACABIAJqIgMgAygCBEEBcjYCBCABIAIQQQwBCyABKAIAIQEgACADNgIEIAAgASACajYCAAsCQCAA KAIEIgFBA3FFDQAgAUF4cSICIARBEGpNDQAgACAEIAFBAXFyQQJyNgIEIAAgBGoiASACIARrIgRBA3I2AgQgACACaiICIAIoAgRB AXI2AgQgASAEEEELIABBCGohAwsgAwuCAwEHfyMAQRBrIgQkAAJAAkACQAJAAkAgASgCBCICRQ0AIAEoAgAhByACQQNxIQUCQCAC QQRJBEBBACECDAELIAdBHGohAyACQXxxIQhBACECA0AgAygCACADQQhrKAIAIANBEGsoAgAgA0EYaygCACACampqaiECIANBIGoh AyAIIAZBBGoiBkcNAAsLIAUEQCAGQQN0IAdqQQRqIQMDQCADKAIAIAJqIQIgA0EIaiEDIAVBAWsiBQ0ACwsgASgCDARAIAJBAEgN ASAHKAIERSACQRBJcQ0BIAJBAXQhAgtBACEFIAJBAEgNAyACDQELQQEhA0EAIQIMAQtB+YLBAC0AABpBASEFIAJBARC+ASIDRQ0B CyAEQQA2AgggBCADNgIEIAQgAjYCACAEQYDLwAAgARA4RQ0BQZzMwABB1gAgBEEPakGMzMAAQYzNwAAQeQALIAUgAkH8y8AAELEB AAsgACAEKQIANwIAIABBCGogBEEIaigCADYCACAEQRBqJAALnQMBCH8jAEEgayICJAAQWkHsgsEAKAIAIQVB6ILBACgCACEHQeiC wQBCADcCAEHggsEAKAIAIQZB5ILBACgCACEDQeCCwQBCBDcCAEHcgsEAKAIAIQBB3ILBAEEANgIAAkAgAyAHRgRAAkAgACADRgRA 0G9BgAEgACAAQYABTRsiBPwPASIBQX9GDQMCQCAFRQRAIAEhBQwBCyAAIAVqIAFHDQQLIAAgBGoiBEH/////AUsNAyACIAAEfyAC IAY2AhQgAiAAQQJ0NgIcQQQFQQALNgIYIAJBCGpBBCAEQQJ0IAJBFGoQcyACKAIIQQFGDQMgAigCDCEGIAAhASAEIQAMAQsgACAD IgFNDQILIAYgAUECdGogA0EBajYCACABQQFqIQMLIAMgB00NACAGIAdBAnRqKAIAIQFB7ILBACAFNgIAQeiCwQAgATYCAEHkgsEA IAM2AgBB4ILBACgCACEBQeCCwQAgBjYCAEHcgsEAKAIAIQRB3ILBACAANgIAIAQEQCABIARBAnQQygELIAJBIGokACAFIAdqDwsA C+oCAgZ/An4jAEEgayIFJABBFCEDIAAiCULoB1oEQCAJIQoDQCAFQQxqIANqIgRBA2sgCiAKQpDOAIAiCUKQzgB+faciBkH//wNx QeQAbiIHQQF0IghB3+bAAGotAAA6AAAgBEEEayAIQd7mwABqLQAAOgAAIARBAWsgBiAHQeQAbGtB//8DcUEBdCIGQd/mwABqLQAA OgAAIARBAmsgBkHe5sAAai0AADoAACADQQRrIQMgCkL/rOIEViAJIQoNAAsLIAlCCVYEQCADIAVqQQtqIAmnIgQgBEH//wNxQeQA biIEQeQAbGtB//8DcUEBdCIGQd/mwABqLQAAOgAAIANBAmsiAyAFQQxqaiAGQd7mwABqLQAAOgAAIAStIQkLIABQRSAJUHFFBEAg A0EBayIDIAVBDGpqIAmnQQF0QR5xQd/mwABqLQAAOgAACyACIAFBAUEAIAVBDGogA2pBFCADaxAwIAVBIGokAAv1CAEIfyMAQYAB ayICJAAgAkEIaiEEIwBBIGsiAyQAIAMgAGkiATYCHAJAAkACQAJAAkACQAJAIAFBAUYEQCAAQcAATQ0BIABBf0YNAiADQZyDwQA2 AhhBoIPBAC0AAEEDRwR/IAMgA0EYajYCHCADIANBHGo2AgAjAEEgayIBJAACQAJAAkACQAJAAkBBoIPBAC0AAEEBaw4DAgQBAAtB oIPBAEECOgAAIAMoAgAiBigCACEFIAZBADYCACAFRQ0CIAUoAgBBCDYCAEGgg8EAQQM6AAALIAFBIGokAAwDCyABQQA2AhggAUEB NgIMIAFB/JrAADYCCAwKC0G8nMAAENEBAAsgAUEANgIYIAFBATYCDCABQbybwAA2AggMCAsgAygCGAVBnIPBAAsoAgAiAUUNAyAD QZSDwQA2AhggACABbiIGQZiDwQAtAABBA0cEfyADIANBGGo2AhwgAyADQRxqNgIAIwBBIGsiASQAAkACQAJAAkACQAJAQZiDwQAt AABBAWsOAwIEAQALQZiDwQBBAjoAACADKAIAIggoAgAhBSAIQQA2AgAgBUUNAiAFKAIAQQI2AgBBmIPBAEEDOgAACyABQSBqJAAM AwsgAUEANgIYIAFBATYCDCABQfyawAA2AggMCgtBvJzAABDRAQALIAFBADYCGCABQQE2AgwgAUG8m8AANgIIDAgLIAMoAhgFQZSD wQALKAIAIABsIgFPDQQgAUEASA0FQfmCwQAtAAAaQQEhByABQQEQvgEiBUUNBSAEIAE2AhwgBCAGNgIYIARB0JzAADYCCCAEQgA3 AwAgBEEANgIoIAQgBTYCJCAEIAE2AiAgBCAAQQFrIgCtIABnQSBzrYY3AxAgA0EgaiQADAcLIANBADYCACMAQRBrIgAkACAAQaiV wAA2AgwgACADQRxqNgIIIABBCGpB/LLAACAAQQxqQfyywAAgA0GQlsAAEEsAC0GglsAAQShByJbAABCQAQALQdiWwABBN0GQl8AA EJABAAtBoJfAABCXAQALQbCXwABBL0Hgl8AAEJABAAsgByABQfCXwAAQsQEACyABQgQ3AhAgAUEIakHAmsAAEJ0BAAsgAkE4aiIA QQA6AAAgAkH4AGogACkDADcCACACQfAAaiACQTBqKQMANwIAIAJB6ABqIAJBKGopAwA3AgAgAkHgAGogAkEgaikDADcCACACQdgA aiACQRhqKQMANwIAIAJB0ABqIAJBEGopAwA3AgBB+YLBAC0AABogAiACKQMINwJIQcgAQQgQvgEiAEUEQEEIQcgAEOMBAAsgAEEA NgIIIABCgYCAgBA3AwAgACACKQJENwIMIABBFGogAkHMAGopAgA3AgAgAEEcaiACQdQAaikCADcCACAAQSRqIAJB3ABqKQIANwIA IABBLGogAkHkAGopAgA3AgAgAEE0aiACQewAaikCADcCACAAQTxqIAJB9ABqKQIANwIAIABBxABqIAJB/ABqKAIANgIAIAJBgAFq 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 AgQOAgABAgsgAQ0BQQEhAUEAIQBBASECDAMLIAFFDQELIANBBGogABBHIAMoAgQhACADKAIIIQIgAygCDAwCCyAAKAIAIgEoAgQi AEEASA0CIAEoAgAhASAARQRAQQEhAkEAIQAMAQtB+YLBAC0AABpBASEEIABBARC+ASICRQ0CCyACIAEgABA1GiAACyEBIAIgARC0 ASAABEAgAiAAEMoBCyADQRBqJAAPCyAEIABBlIvAABCxAQAL0AEBBX8jAEEgayIBJAAgACgCACIDQQFqIgIgA0EBdCIEIAIgBEsb IgJB/////wBLBEBBAEEAQbiQwAAQsQEACwJAQQQgAiACQQRNGyICQQR0IgRB/P///wdNBH8gASADBH8gASADQQR0NgIcIAEgACgC BDYCFEEEBUEACzYCGCABQQhqQQQgBCABQRRqEHMgASgCCEEBRw0BIAEoAhAhBSABKAIMBUEACyAFQbiQwAAQsQEACyABKAIMIQMg ACACNgIAIAAgAzYCBCABQSBqJAAL8gEBAn8jAEEwayICJAACQCAAKQMAQv///////////wCDQoCAgICAgID4/wBaBEAgAkEBNgIU IAJBvMHAADYCECACQgE3AhwgAiAArUKAgICAwAiENwMoIAIgAkEoajYCGCABKAIcIAEoAiAgAkEQahA4IQMMAQsgAkEAOgAMIAIg ATYCCEEBIQMgAkEBNgIUIAJBvMHAADYCECACQgE3AhwgAiAArUKAgICAwAiENwMoIAIgAkEoajYCGCACQQhqQaS/wAAgAkEQahA4 DQAgAi0ADEUEQCABQcTBwABBAhC6AQ0BC0EAIQMLIAJBMGokACADC7sBAQJ/IwBBIGsiAyQAAkACf0EAIAEgASACaiICSw0AGkEA QQggAiAAKAIAIgFBAXQiBCACIARLGyICIAJBCE0bIgRBAEgNABpBACECIAMgAQR/IAMgATYCHCADIAAoAgQ2AhRBAQUgAgs2Ahgg A0EIakEBIAQgA0EUahBzIAMoAghBAUcNASADKAIQIQAgAygCDAsgAEHQy8AAELEBAAsgAygCDCEBIAAgBDYCACAAIAE2AgQgA0Eg aiQAC70BAQN/IwBBEGsiAiQAAkACQAJAIAFFBEAgAEUNASAAQQhrIgEoAgBBAUcNAiAAKAIsIAAoAighAyABQQA2AgACQCABQX9G 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 AAwBCyAEIABBzJPAABCxAQALIANBMGokAAtqAgF/AX4jAEEwayIDJAAgAyABNgIEIAMgADYCACADQQI2AgwgA0GY5cAANgIIIANC AjcCFCADQoCAgICgCSIEIAOthDcDKCADIAQgA0EEaq2ENwMgIAMgA0EgajYCECADQQhqIAIQnQEAC2cAIwBBMGsiACQAQfiCwQAt AAAEQCAAQQI2AgwgAEGIycAANgIIIABCATcCFCAAIAE2AiwgACAAQSxqrUKAgICAoAmENwMgIAAgAEEgajYCECAAQQhqQbDJwAAQ nQEACyAAQTBqJAALnAICA38BfiMAQRBrIgEkACABQaiDwQA2AgQgAEGwg8EALQAAQQNHBH8gASABQQRqNgIIIAEgAUEIajYCDCAB QQxqIQIjAEEgayIAJAACQAJAAkACQAJAAkACQEGwg8EALQAAQQFrDgMCBAEAC0Gwg8EAQQI6AAAgAigCACIDKAIAIQIgA0EANgIA IAJFDQIgAigCAEKACDcDAEGwg8EAQQM6AAALIABBIGokAAwECyAAQQA2AhggAEEBNgIMIABBqLDAADYCCAwCC0HoscAAENEBAAsg AEEANgIYIABBATYCDCAAQeiwwAA2AggLIABCBDcCECAAQQhqQeyvwAAQnQEACyABKAIEBUGog8EACykDABCuASABQRBqJABQC14B AX8jAEEwayICJAAgAiABNgIMIAIgADYCCCACQQI2AhQgAkHojMAANgIQIAJCATcCHCACIAJBCGqtQoCAgICwAYQ3AyggAiACQShq NgIYIAJBEGoQZCACQTBqJAALXgEBfyMAQTBrIgIkACACIAE2AgwgAiAANgIIIAJBAjYCFCACQYyNwAA2AhAgAkIBNwIcIAIgAkEI aq1CgICAgLABhDcDKCACIAJBKGo2AhggAkEQahBkIAJBMGokAAtbAQF/IAEoAgAiBEEBcQRAIAAgASAEIARBfnEgAiADEG0PCyAE IAQoAggiAUEBajYCCCABQQBOBEAgACAENgIMIAAgAzYCCCAAIAI2AgQgAEG8uMAANgIADwsAC2MBAX9BACEBAkAgA0EATgRAIANF BEBBASEEDAILQfmCwQAtAAAaQQEhASADQQEQvgEiBA0BCyABIANBpLbAABCxAQALIAQgAiADEDUhASAAIAM2AgggACABNgIEIAAg AzYCAAtYAQF/IAEoAgAiBEEBcQRAIAAgASAEIAQgAiADEG0PCyAEIAQoAggiAUEBajYCCCABQQBOBEAgACAENgIMIAAgAzYCCCAA IAI2AgQgAEG8uMAANgIADwsAC1gBAX8jAEEgayIDJAAgA0EYaiACQRhqKQAANwMAIANBEGogAkEQaikAADcDACADQQhqIAJBCGop AAA3AwAgAyACKQAANwMAIAAgAyABQSAQMiADQSBqJAALTgAjAEEgayIAJAAgAEEBNgIEIABB4L7AADYCACAAQgE3AgwgAELIvsCA wAc3AxggACAAQRhqNgIIIAEoAhwgASgCICAAEDggAEEgaiQAC00BAX8jAEEwayIBJAAgAUEBNgIMIAFBsOTAADYCCCABQgE3AhQg ASABQS9qrUKAgICAgAyENwMgIAEgAUEgajYCECABQQhqIAAQnQEAC0MAIAEoAgAiAUEBcQRAIAFBfnEgAiADEOUBIQEgACADNgII IAAgATYCBCAAIAIgA2ogAWs2AgAPCyAAIAEgAiADEF4LOgEBfyMAQSBrIgAkACAAQQA2AhggAEEBNgIMIABBtMrAADYCCCAAQgQ3 AhAgAEEIakHoysAAEJ0BAAtFAQF/IAIgACgCACAAKAIIIgNrSwRAIAAgAyACQQFBARBYIAAoAgghAwsgACgCBCADaiABIAIQNRog ACACIANqNgIIQQALQQEBfyACIAAoAgAgACgCCCIDa0sEQCAAIAMgAhBgIAAoAgghAwsgACgCBCADaiABIAIQNRogACACIANqNgII QQALQAAgASgCACIBQQFxBEAgASACIAMQ5QEhASAAIAM2AgggACABNgIEIAAgAiADaiABazYCAA8LIAAgASACIAMQXgtCAQF/IAAo AgAiACgCMCIBBEAgACgCNCABEMoBCwJAIABBf0YNACAAIAAoAgRBAWsiATYCBCABDQAgAEHIABDKAQsLTwECf0H5gsEALQAAGiAB KAIEIQIgASgCACEDQQhBBBC+ASIBRQRAQQRBCBDjAQALIAEgAjYCBCABIAM2AgAgAEHQycAANgIEIAAgATYCAAtBAQF/IAIgACgC ACAAKAIIIgNrSwRAIAAgAyACEGcgACgCCCEDCyAAKAIEIANqIAEgAhA1GiAAIAIgA2o2AghBAAtCAQF/IwBBIGsiAyQAIANBADYC ECADQQE2AgQgA0IENwIIIAMgATYCHCADIAA2AhggAyADQRhqNgIAIAMgAhCdAQALQAEBfyABKAIAIgEgASgCCCIEQQFqNgIIIARB AEgEQAALIAAgATYCDCAAIAM2AgggACACNgIEIABBvLjAADYCAAs8ACAAIAEpAAA3AAAgAEEYaiABQRhqKQAANwAAIABBEGogAUEQ aikAADcAACAAQQhqIAFBCGopAAA3AAALjgIBA38gACgCACECIAEoAhQiAEEQcUUEQCAAQSBxRQRAIAIgARDQAQ8LQQAhACMAQYAB ayIEJAAgAigCACECA0AgACAEakH/AGogAkEPcSIDQTByIANBN2ogA0EKSRs6AAAgAEEBayEAIAJBD0sgAkEEdiECDQALIAFBAUHc 5sAAQQIgACAEakGAAWpBACAAaxAwIARBgAFqJAAPC0EAIQAjAEGAAWsiBCQAIAIoAgAhAgNAIAAgBGpB/wBqIAJBD3EiA0EwciAD QdcAaiADQQpJGzoAACAAQQFrIQAgAkEPSyACQQR2IQINAAsgAUEBQdzmwABBAiAAIARqQYABakEAIABrEDAgBEGAAWokAAvgcwMj fxp+AXwgASgCFEEBcSECIAArAwAhPwJAIAEoAghBAUYEQAJ/IAEhCCABKAIMIRNBACEAIwBB8AhrIgkkACA/vSEnAn9BAyA/mUQA AAAAAADwf2ENABpBAiAnQoCAgICAgID4/wCDIiZCgICAgICAgPj/AFENABogJ0L/////////B4MiKUKAgICAgICACIQgJ0IBhkL+ ////////D4MgJ0I0iKdB/w9xIgEbIiVCAYMhKCAmUARAQQQgKVANARogAUGzCGshAEIBISYgKFAMAQtCgICAgICAgCAgJUIBhiAl QoCAgICAgIAIUSIAGyElQgJCASAAGyEmQct3Qcx3IAAbIAFqIQAgKFALIQEgCSAAOwHoCCAJICY3A+AIIAlCATcD2AggCSAlNwPQ CCAJIAE6AOoIAkACfwJAAkACQAJAIAFBAmsiAwRAQQEhAUG748AAQbzjwAAgJ0IAUyIGG0G748AAQQEgBhsgAhshGSAnQj+IpyAC ciEcQQMgAyADQQNPG0ECaw4CAgMBCyAJQQM2ApgIIAlBvePAADYClAggCUECOwGQCEEBIRlBASEBIAlBkAhqDAQLIAlBAzYCmAgg CUHA48AANgKUCCAJQQI7AZAIIAlBkAhqDAMLQQIhASAJQQI7AZAIIBNFDQEgCSATNgKgCCAJQQA7AZwIIAlBAjYCmAggCUG548AA NgKUCCAJQZAIagwCC0F0QQUgAMEiAEEASBsgAGwiAEHA/QBJBEAgCUGQCGohDCAJQRBqIQsgAEEEdkEVaiEHQYCAfkEAIBNrIBNB gIACTxshAQJAAkACfwJAAkACQAJAIAlB0AhqIhEpAwAiJVBFBEAgJUKAgICAgICAgCBaDQEgB0UNAkGgfyARLwEYIgBBIGsgACAl QoCAgIAQVCIAGyICQRBrIAIgJUIghiAlIAAbIiVCgICAgICAwABUIgAbIgJBCGsgAiAlQhCGICUgABsiJUKAgICAgICAgAFUIgAb IgJBBGsgAiAlQgiGICUgABsiJUKAgICAgICAgBBUIgAbIgJBAmsgAiAlQgSGICUgABsiJUKAgICAgICAgMAAVCIAGyAlQgKGICUg ABsiJUIAWWsiA2vBQdAAbEGwpwVqQc4QbSIAQdEATw0DIABBBHQiAkGA1MAAaikDACImQv////8PgyInICUgJUJ/hUI/iIYiJUIg iCIofiIpQiCIICZCIIgiJiAofnwgJiAlQv////8PgyIlfiImQiCIfCApQv////8PgyAlICd+QiCIfCAmQv////8Pg3xCgICAgAh8 QiCIfCIlQUAgAyACQYjUwABqLwEAamsiBUE/ca0iJ4inIQAgAkGK1MAAai8BACECICVCASAnhiIoQgF9IimDIiZQBEAgB0EKSw0H IAdBAnRBlOHAAGooAgAgAEsNBwsgAEGQzgBPBEAgAEHAhD1JDQUgAEGAwtcvTwRAQQhBCSAAQYCU69wDSSIDGyEGQYDC1y9BgJTr 3AMgAxsMBwtBBkEHIABBgK3iBEkiAxshBkHAhD1BgK3iBCADGwwGCyAAQeQATwRAQQJBAyAAQegHSSIDGyEGQeQAQegHIAMbDAYL QQpBASAAQQlLIgYbDAULQdfPwABBHEHE4MAAEJABAAtB1ODAAEEkQfjgwAAQkAEAC0Gg4MAAQSFBiOHAABCQAQALIABB0QBBwN7A ABB9AAtBBEEFIABBoI0GSSIDGyEGQZDOAEGgjQYgAxsLIQMCQAJAAkACQCAGIAJrQQFqwSIEIAHBIgJKBEAgBUH//wNxIQ4gBCAB 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 ai0AADoAACACQQNqIANBA2otAAA6AAAgAkEEaiADQQRqLQAAOgAAIAJBBWogA0EFai0AADoAACACQQZqIANBBmotAAA6AAAgAkEH aiADQQdqLQAAOgAAIANBCGohAyACQQhqIgIgBEcNAAsLIAQgBSAGayIDQXxxIghqIQICQCABIAZqIgBBA3FFBEAgAiAETQ0BIAAh AQNAIAQgASgCADYCACABQQRqIQEgBEEEaiIEIAJJDQALDAELIAIgBE0NACAAQQN0IgVBGHEhBiAAQXxxIglBBGohAUEAIAVrQRhx IQogCSgCACEFA0AgBCAFIAZ2IAEoAgAiBSAKdHI2AgAgAUEEaiEBIARBBGoiBCACSQ0ACwsgA0EDcSEFIAAgCGohAQsgAiACIAVq IgBPDQEgBUEHcSIDBEADQCACIAEtAAA6AAAgAUEBaiEBIAJBAWohAiADQQFrIgMNAAsLIAVBAWtBB0kNAQNAIAIgAS0AADoAACAC QQFqIAFBAWotAAA6AAAgAkECaiABQQJqLQAAOgAAIAJBA2ogAUEDai0AADoAACACQQRqIAFBBGotAAA6AAAgAkEFaiABQQVqLQAA OgAAIAJBBmogAUEGai0AADoAACACQQdqIAFBB2otAAA6AAAgAUEIaiEBIAJBCGoiAiAARw0ACwwBCyACIAVrIgQgAk8NACAFQQNx IgEEQANAIAJBAWsiAiAAQQFrIgAtAAA6AAAgAUEBayIBDQALCyAFQQFrQQNJDQAgAEEEayEBA0AgAkEBayABQQNqLQAAOgAAIAJB AmsgAUECai0AADoAACACQQNrIAFBAWotAAA6AAAgAkEEayICIAEtAAA6AAAgAUEEayEBIAIgBEsNAAsLIAcLCgAgACABJQEQBQsO ACABQcbBwABBAxC6AQsOACABQby/wABBCBC6AQsJACAAQQA2AgALCAAgACUBEAILCAAgACUBEBELCAAgACUBECELBABBAAsCAAsL tYIBDgBBgIDAAAu1Ai9Vc2Vycy9hc3NhZnZheW5lci9oZi9odWdnaW5nZmFjZS5qcy9wYWNrYWdlcy9odWIveGV0LWNvcmUtd2Fz bS1idWlsZC9tZXJrbGVoYXNoL3NyYy9hZ2dyZWdhdGVkX2hhc2hlcy5ycwAAAAAAEABpAAAAWQAAADgAAAAAABAAaQAAAFkAAAAP AAAAAAAQAGkAAABWAAAAOQAAAC9Vc2Vycy9hc3NhZnZheW5lci8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0x OTQ5Y2Y4YzZiNWI1NTdmL3dhc20tYmluZGdlbi0wLjIuMTAwL3NyYy9jb252ZXJ0L3NsaWNlcy5ycwAAnAAQAHIAAAAkAQAADgAA AAQAAAAMAAAABAAAAAUAAAAGAAAABwBBwILAAAuRBAEAAAAIAAAAYSBEaXNwbGF5IGltcGxlbWVudGF0aW9uIHJldHVybmVkIGFu IGVycm9yIHVuZXhwZWN0ZWRseS9Vc2Vycy9hc3NhZnZheW5lci8ucnVzdHVwL3Rvb2xjaGFpbnMvMS44Ni1hYXJjaDY0LWFwcGxl LWRhcndpbi9saWIvcnVzdGxpYi9zcmMvcnVzdC9saWJyYXJ5L2FsbG9jL3NyYy9zdHJpbmcucnMAfwEQAHAAAADfCgAADgAAAC9V c2Vycy9hc3NhZnZheW5lci8ucnVzdHVwL3Rvb2xjaGFpbnMvMS44Ni1hYXJjaDY0LWFwcGxlLWRhcndpbi9saWIvcnVzdGxpYi9z cmMvcnVzdC9saWJyYXJ5L2FsbG9jL3NyYy9zbGljZS5ycwAAAhAAbwAAAKIAAAAZAAAARXJyb3IAAAB/ARAAcAAAAI0FAAAbAAAA SnNDaHVua0luaGFzaGxlbmd0aAChAhAABAAAAKUCEAAGAAAAc3RydWN0IEpzQ2h1bmtJbkpzQ2h1bmtPdXRkZWR1cGF0dGVtcHRl ZCB0byB0YWtlIG93bmVyc2hpcCBvZiBSdXN0IHZhbHVlIHdoaWxlIGl0IHdhcyBib3Jyb3dlZHNyYy9saWIucnMaAxAACgAAAD4A AAA4AAAAGgMQAAoAAABBAAAAIQAAABoDEAAKAAAASwAAABQAQfSGwAALVUludmFsaWQgaGFzaCBoZXg6IAAAdAMQABIAAABJbnZh bGlkIEhNQUMga2V5IGhleDogAACQAxAAFgAAACA6IAoBAAAAAAAAALADEAADAAAAswMQAAEAQdSHwAAL8QgBAAAADAAAAGNhbGxl ZCBgUmVzdWx0Ojp1bndyYXAoKWAgb24gYW4gYEVycmAgdmFsdWUvVXNlcnMvYXNzYWZ2YXluZXIvaGYvaHVnZ2luZ2ZhY2UuanMv cGFja2FnZXMvaHViL3hldC1jb3JlLXdhc20tYnVpbGQvbWVya2xlaGFzaC9zcmMvYWdncmVnYXRlZF9oYXNoZXMucnMHBBAAaQAA AD0AAAAqAAAABwQQAGkAAAA4AAAAHgAAAC9Vc2Vycy9hc3NhZnZheW5lci8ucnVzdHVwL3Rvb2xjaGFpbnMvMS44Ni1hYXJjaDY0 LWFwcGxlLWRhcndpbi9saWIvcnVzdGxpYi9zcmMvcnVzdC9saWJyYXJ5L2FsbG9jL3NyYy92ZWMvc3BlY19mcm9tX2l0ZXJfbmVz dGVkLnJzAJAEEACDAAAAEwAAAAUAAAAvVXNlcnMvYXNzYWZ2YXluZXIvLnJ1c3R1cC90b29sY2hhaW5zLzEuODYtYWFyY2g2NC1h cHBsZS1kYXJ3aW4vbGliL3J1c3RsaWIvc3JjL3J1c3QvbGlicmFyeS9hbGxvYy9zcmMvc2xpY2UucnMAJAUQAG8AAACiAAAAGQAA AEVycm9yL1VzZXJzL2Fzc2FmdmF5bmVyLy5ydXN0dXAvdG9vbGNoYWlucy8xLjg2LWFhcmNoNjQtYXBwbGUtZGFyd2luL2xpYi9y dXN0bGliL3NyYy9ydXN0L2xpYnJhcnkvYWxsb2Mvc3JjL3N0cmluZy5ycwAAAKkFEABwAAAAjQUAABsAAABpbnZhbGlkIHZhbHVl OiAsIGV4cGVjdGVkIAAALAYQAA8AAAA7BhAACwAAAG1pc3NpbmcgZmllbGQgYGBYBhAADwAAAGcGEAABAAAAZHVwbGljYXRlIGZp ZWxkIGAAAAB4BhAAEQAAAGcGEAABAAAADQAAAAwAAAAEAAAADgAAAA8AAAAHAAAAL1VzZXJzL2Fzc2FmdmF5bmVyLy5ydXN0dXAv dG9vbGNoYWlucy8xLjg2LWFhcmNoNjQtYXBwbGUtZGFyd2luL2xpYi9ydXN0bGliL3NyYy9ydXN0L2xpYnJhcnkvYWxsb2Mvc3Jj L3Jhd192ZWMucnMAAAC0BhAAcQAAACoCAAARAAAAL1VzZXJzL2Fzc2FmdmF5bmVyLy5ydXN0dXAvdG9vbGNoYWlucy8xLjg2LWFh cmNoNjQtYXBwbGUtZGFyd2luL2xpYi9ydXN0bGliL3NyYy9ydXN0L2xpYnJhcnkvYWxsb2Mvc3JjL3N0cmluZy5yczgHEABwAAAA 6gEAABcAAABhIHNlcXVlbmNlL1VzZXJzL2Fzc2FmdmF5bmVyLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5 NDljZjhjNmI1YjU1N2Yvc2VyZGUtMS4wLjIxOS9zcmMvZGUvaW1wbHMucnMAwgcQAGUAAACVBAAAIgAAAMIHEABlAAAAmAQAABwA QdCQwAALBQEAAAAQAEHgkMAACwUBAAAAEQBB8JDAAAsFAQAAABIAQYCRwAALmwQBAAAAEwAAAC9Vc2Vycy9hc3NhZnZheW5lci8u cnVzdHVwL3Rvb2xjaGFpbnMvMS44Ni1hYXJjaDY0LWFwcGxlLWRhcndpbi9saWIvcnVzdGxpYi9zcmMvcnVzdC9saWJyYXJ5L2Fs bG9jL3NyYy9zdHJpbmcucnOICBAAcAAAAI0FAAAbAAAAFAAAAAwAAAAEAAAAFQAAABYAAAAHAAAAY2FsbGVkIGBPcHRpb246OnVu d3JhcF90aHJvdygpYCBvbiBhIGBOb25lYCB2YWx1ZWhhc2hsZW5ndGgvVXNlcnMvYXNzYWZ2YXluZXIvLnJ1c3R1cC90b29sY2hh aW5zLzEuODYtYWFyY2g2NC1hcHBsZS1kYXJ3aW4vbGliL3J1c3RsaWIvc3JjL3J1c3QvbGlicmFyeS9hbGxvYy9zcmMvc2xpY2Uu cnMAAFsJEABvAAAAogAAABkAAABpbnZhbGlkIHR5cGU6ICwgZXhwZWN0ZWQgAAAA3AkQAA4AAADqCRAACwAAAAEAAAAAAAAAL1Vz ZXJzL2Fzc2FmdmF5bmVyLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2Yvc2VyZGUt d2FzbS1iaW5kZ2VuLTAuNi41L3NyYy9saWIucnMAEAoQAGsAAAA1AAAADgAAAAAAAAD//////////5AKEABBqJXAAAu1IgEAAAAv VXNlcnMvYXNzYWZ2YXluZXIvaGYvaHVnZ2luZ2ZhY2UuanMvcGFja2FnZXMvaHViL3hldC1jb3JlLXdhc20tYnVpbGQvZGVkdXBs aWNhdGlvbi9zcmMvY2h1bmtpbmcucnMArAoQAGMAAAAfAAAACQAAAGFzc2VydGlvbiBmYWlsZWQ6IHRhcmdldF9jaHVua19zaXpl ID4gNjSsChAAYwAAACMAAAAJAAAAYXNzZXJ0aW9uIGZhaWxlZDogdGFyZ2V0X2NodW5rX3NpemUgPCB1MzI6Ok1BWCBhcyB1c2l6 ZQCsChAAYwAAACcAAAAJAAAArAoQAGMAAAAvAAAAHQAAAGFzc2VydGlvbiBmYWlsZWQ6IG1heGltdW1fY2h1bmsgPiBtaW5pbXVt X2NodW5rAKwKEABjAAAAMgAAAAkAAACsChAAYwAAADwAAAAXAAAArAoQAGMAAABlAAAAQQAAAKwKEABjAAAAnwAAADIAAACsChAA YwAAAKEAAAA6AAAArAoQAGMAAADTAAAAFQAAAKwKEABjAAAA0AAAAEAAAAAvVXNlcnMvYXNzYWZ2YXluZXIvLnJ1c3R1cC90b29s Y2hhaW5zLzEuODYtYWFyY2g2NC1hcHBsZS1kYXJ3aW4vbGliL3J1c3RsaWIvc3JjL3J1c3QvbGlicmFyeS9hbGxvYy9zcmMvcmF3 X3ZlYy5ycwAAAFAMEABxAAAAKgIAABEAAAAvVXNlcnMvYXNzYWZ2YXluZXIvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0 ZXMuaW8tMTk0OWNmOGM2YjViNTU3Zi9sYXp5X3N0YXRpYy0xLjUuMC9zcmMvaW5saW5lX2xhenkucnPUDBAAbAAAAB4AAAAQAAAA T25jZSBpbnN0YW5jZSBoYXMgcHJldmlvdXNseSBiZWVuIHBvaXNvbmVkAABQDRAAKgAAAG9uZS10aW1lIGluaXRpYWxpemF0aW9u IG1heSBub3QgYmUgcGVyZm9ybWVkIHJlY3Vyc2l2ZWx5hA0QADgAAAAvVXNlcnMvYXNzYWZ2YXluZXIvLnJ1c3R1cC90b29sY2hh aW5zLzEuODYtYWFyY2g2NC1hcHBsZS1kYXJ3aW4vbGliL3J1c3RsaWIvc3JjL3J1c3QvbGlicmFyeS9zdGQvc3JjL3N5bmMvcG9p c29uL29uY2UucnPEDRAAeAAAAJsAAAAyAAAAAAAAAFn1QOip04iw1iDtOffHUlarcomJaYmyRXfHjrbViQprtzF6iz5XjzZL2Tbp 3DbGHbbVVFVOTHogy5ojKEazdKQSuaMcPqgGO/e6Ai9sjeeQipoNFfctyeGt04YQOgWVjiIHOrjx9C5arn+An5SsD6WB1tiA6wNz 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 bvtaMxMJs8r50u4V9MVgXkq0cjZQZ2kAAIe7VBQSHaWdFsi7uRMeMoSN3S+rtm89+40KFo7tXjBg6GyU6RRLv8vDEBs4Y08AABBO zG+Bt9UHVYFqanI2peXdf6BHNLKvV5TTyav3RvMYPdMa1lXGbWP28/c5SauLzHsY3cEGqcdjL1VzZXJzL2Fzc2FmdmF5bmVyLy5y dXN0dXAvdG9vbGNoYWlucy8xLjg2LWFhcmNoNjQtYXBwbGUtZGFyd2luL2xpYi9ydXN0bGliL3NyYy9ydXN0L2xpYnJhcnkvY29y ZS9zcmMvaXRlci90cmFpdHMvaXRlcmF0b3IucnMAAABQFhAAfQAAALMHAAAJAAAAL1VzZXJzL2Fzc2FmdmF5bmVyLy5ydXN0dXAv dG9vbGNoYWlucy8xLjg2LWFhcmNoNjQtYXBwbGUtZGFyd2luL2xpYi9ydXN0bGliL3NyYy9ydXN0L2xpYnJhcnkvYWxsb2Mvc3Jj L3NsaWNlLnJzAOAWEABvAAAAogAAABkAAAB/GFfWzlbtZhJ/+RPnpcPzpM0m1bXbSeZBJJh/KPuUwy9Vc2Vycy9hc3NhZnZheW5l ci8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5Y2Y4YzZiNWI1NTdmL2xhenlfc3RhdGljLTEuNS4wL3Ny Yy9pbmxpbmVfbGF6eS5yc4AXEABsAAAAHgAAABAAAABPbmNlIGluc3RhbmNlIGhhcyBwcmV2aW91c2x5IGJlZW4gcG9pc29uZWQA APwXEAAqAAAAb25lLXRpbWUgaW5pdGlhbGl6YXRpb24gbWF5IG5vdCBiZSBwZXJmb3JtZWQgcmVjdXJzaXZlbHkwGBAAOAAAAC9V c2Vycy9hc3NhZnZheW5lci8ucnVzdHVwL3Rvb2xjaGFpbnMvMS44Ni1hYXJjaDY0LWFwcGxlLWRhcndpbi9saWIvcnVzdGxpYi9z cmMvcnVzdC9saWJyYXJ5L3N0ZC9zcmMvc3luYy9wb2lzb24vb25jZS5yc3AYEAB4AAAAmwAAADIAAAAvVXNlcnMvYXNzYWZ2YXlu ZXIvLnJ1c3R1cC90b29sY2hhaW5zLzEuODYtYWFyY2g2NC1hcHBsZS1kYXJ3aW4vbGliL3J1c3RsaWIvc3JjL3J1c3QvbGlicmFy eS9hbGxvYy9zcmMvcmF3X3ZlYy5ycwAAAPgYEABxAAAAKgIAABEAAAAAAAAABAAAAAQAAAAZAAAAL1VzZXJzL2Fzc2FmdmF5bmVy Ly5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvanMtc3lzLTAuMy43Ny9zcmMvbGli LnJzjBkQAGAAAAD7GAAAAQAAAC9Vc2Vycy9hc3NhZnZheW5lci8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0x OTQ5Y2Y4YzZiNWI1NTdmL3dhc20tYmluZGdlbi0wLjIuMTAwL3NyYy9jb252ZXJ0L3NsaWNlcy5ycwAA/BkQAHIAAAAkAQAADgAA AGNsb3N1cmUgaW52b2tlZCByZWN1cnNpdmVseSBvciBhZnRlciBiZWluZyBkcm9wcGVkL1VzZXJzL2Fzc2FmdmF5bmVyLy5ydXN0 dXAvdG9vbGNoYWlucy8xLjg2LWFhcmNoNjQtYXBwbGUtZGFyd2luL2xpYi9ydXN0bGliL3NyYy9ydXN0L2xpYnJhcnkvYWxsb2Mv c3JjL3NsaWNlLnJzAAAAshoQAG8AAACiAAAAGQAAAExheW91dEVycm9yACYAAAAnAAAAKAAAACkAAAAqAAAAL1VzZXJzL2Fzc2Fm dmF5bmVyLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5kZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2YvYnl0ZXMtMS4xMC4xL3Ny Yy9ieXRlcy5ycwAAACsAAAAsAAAALQAAAC4AAAAvAAAAMAAAADEAAAAyAAAALgAAADMAQei3wAALoRQBAAAANAAAAGNhbGxlZCBg UmVzdWx0Ojp1bndyYXAoKWAgb24gYW4gYEVycmAgdmFsdWUAVBsQAGEAAABIBQAAMgAAAFQbEABhAAAAVgUAAEkAAAA1AAAANgAA ADcAAAA4AAAAOQAAAC9Vc2Vycy9hc3NhZnZheW5lci8ucnVzdHVwL3Rvb2xjaGFpbnMvMS44Ni1hYXJjaDY0LWFwcGxlLWRhcndp bi9saWIvcnVzdGxpYi9zcmMvcnVzdC9saWJyYXJ5L2FsbG9jL3NyYy9zbGljZS5ycwBQHBAAbwAAAKIAAAAZAAAAL1VzZXJzL2Fz c2FmdmF5bmVyL2hmL2h1Z2dpbmdmYWNlLmpzL3BhY2thZ2VzL2h1Yi94ZXQtY29yZS13YXNtLWJ1aWxkL21lcmtsZWhhc2gvc3Jj L2RhdGFfaGFzaC5ycwAAANAcEABhAAAAegAAAAkAAABJbnZhbGlkIGhleCBpbnB1dCBmb3IgRGF0YUhhc2gAAAEAAAAAAAAAAQAA AAAAAAABAAAAAAAAAAEAAAAAAAAA0BwQAGEAAAC9AAAAKgAAANAcEABhAAAAvgAAACoAAADQHBAAYQAAAL8AAAAqAAAAZpf1d1uV UN4xNcuspZcYHJ3kIRCb6ytYtNCwS5Ot8ikBfsXHpUcplv2UZma0igLmXd1TbzfHbdL4Y1LmSlNxPwEAAAAAAAAAbWlkID4gbGVu AAAA/B0QAAkAAAAvVXNlcnMvYXNzYWZ2YXluZXIvLmNhcmdvL3JlZ2lzdHJ5L3NyYy9pbmRleC5jcmF0ZXMuaW8tMTk0OWNmOGM2 YjViNTU3Zi9ibGFrZTMtMS44LjIvc3JjL2xpYi5ycwAQHhAAXwAAAAsCAAARAAAAEB4QAF8AAAC+AgAACgAAABAeEABfAAAA7AIA ACgAAAAQHhAAXwAAAOwCAAA0AAAAEB4QAF8AAADsAgAADAAAABAeEABfAAAA3AIAABcAAAAQHhAAXwAAABgDAAAfAAAAEB4QAF8A AAA1AwAADAAAABAeEABfAAAAPAMAABIAAAAQHhAAXwAAAGADAAAhAAAAEB4QAF8AAABiAwAAEQAAABAeEABfAAAAYgMAAEEAAABp bnN1ZmZpY2llbnQgY2FwYWNpdHkAAAAwHxAAFQAAAENhcGFjaXR5RXJyb3I6IABQHxAADwAAAGNhbGxlZCBgUmVzdWx0Ojp1bndy YXAoKWAgb24gYW4gYEVycmAgdmFsdWUAAAAAAAQAAAAEAAAAPQAAAAAAAAAIAAAABAAAAEUAAABGAAAARwAAAGEgc3RyaW5nYnl0 ZSBhcnJheWJvb2xlYW4gYGDOHxAACQAAANcfEAABAAAAaW50ZWdlciBgAAAA6B8QAAkAAADXHxAAAQAAAGZsb2F0aW5nIHBvaW50 IGAEIBAAEAAAANcfEAABAAAAY2hhcmFjdGVyIGAAJCAQAAsAAADXHxAAAQAAAHN0cmluZyAAQCAQAAcAAAB1bml0IHZhbHVlT3B0 aW9uIHZhbHVlbmV3dHlwZSBzdHJ1Y3RzZXF1ZW5jZW1hcGVudW11bml0IHZhcmlhbnRuZXd0eXBlIHZhcmlhbnR0dXBsZSB2YXJp YW50c3RydWN0IHZhcmlhbnQAAAABAAAAAAAAAC4wdTMyL1VzZXJzL2Fzc2FmdmF5bmVyLy5jYXJnby9yZWdpc3RyeS9zcmMvaW5k ZXguY3JhdGVzLmlvLTE5NDljZjhjNmI1YjU1N2Yvd2FzbS1iaW5kZ2VuLTAuMi4xMDAvc3JjL2NvbnZlcnQvaW1wbHMucnMAAMkg EABxAAAAYQIAABYAAADJIBAAcQAAAHECAAAMAAAAySAQAHEAAABtAgAAEAAAAGFycmF5IGNvbnRhaW5zIGEgdmFsdWUgb2YgdGhl IHdyb25nIHR5cGVKc1ZhbHVlKCkAAACUIRAACAAAAJwhEAABAAAATGF6eSBpbnN0YW5jZSBoYXMgcHJldmlvdXNseSBiZWVuIHBv aXNvbmVkAACwIRAAKgAAAC9Vc2Vycy9hc3NhZnZheW5lci8uY2FyZ28vcmVnaXN0cnkvc3JjL2luZGV4LmNyYXRlcy5pby0xOTQ5 Y2Y4YzZiNWI1NTdmL29uY2VfY2VsbC0xLjIxLjMvc3JjL2xpYi5ycwDkIRAAYwAAAAgDAAAZAAAAcmVlbnRyYW50IGluaXQAAFgi EAAOAAAA5CEQAGMAAAB6AgAADQAAAG51bGwgcG9pbnRlciBwYXNzZWQgdG8gcnVzdHJlY3Vyc2l2ZSB1c2Ugb2YgYW4gb2JqZWN0 IGRldGVjdGVkIHdoaWNoIHdvdWxkIGxlYWQgdG8gdW5zYWZlIGFsaWFzaW5nIGluIHJ1c3QvcnVzdGMvMDVmOTg0NmY4OTNiMDlh MWJlMWZjODU2MGUzM2ZjM2M4MTVjZmVjYi9saWJyYXJ5L2FsbG9jL3NyYy9zdHJpbmcucnMAAADqIhAASwAAAI0FAAAbAAAAL3J1 c3RjLzA1Zjk4NDZmODkzYjA5YTFiZTFmYzg1NjBlMzNmYzNjODE1Y2ZlY2IvbGlicmFyeS9hbGxvYy9zcmMvcmF3X3ZlYy5yc0gj EABMAAAAKgIAABEAAABMAAAADAAAAAQAAABNAAAATgAAAE8AAAAvcnVzdC9kZXBzL2RsbWFsbG9jLTAuMi43L3NyYy9kbG1hbGxv Yy5yc2Fzc2VydGlvbiBmYWlsZWQ6IHBzaXplID49IHNpemUgKyBtaW5fb3ZlcmhlYWQAvCMQACkAAACoBAAACQAAAGFzc2VydGlv biBmYWlsZWQ6IHBzaXplIDw9IHNpemUgKyBtYXhfb3ZlcmhlYWQAALwjEAApAAAArgQAAA0AAABtZW1vcnkgYWxsb2NhdGlvbiBv ZiAgYnl0ZXMgZmFpbGVkAABkJBAAFQAAAHkkEAANAAAAbGlicmFyeS9zdGQvc3JjL2FsbG9jLnJzmCQQABgAAABjAQAACQAAAEwA AAAMAAAABAAAAFAAAAAAAAAACAAAAAQAAABRAAAAAAAAAAgAAAAEAAAAUgAAAFMAAABUAAAAVQAAAFYAAAAQAAAABAAAAFcAAABY AAAAWQAAAFoAAABIYXNoIHRhYmxlIGNhcGFjaXR5IG92ZXJmbG93GCUQABwAAAAvcnVzdC9kZXBzL2hhc2hicm93bi0wLjE1LjIv c3JjL3Jhdy9tb2QucnMAADwlEAAqAAAAIwAAACgAAABFcnJvcgAAAFsAAAAMAAAABAAAAFwAAABdAAAAXgAAAGNhcGFjaXR5IG92 ZXJmbG93AAAAmCUQABEAAABsaWJyYXJ5L2FsbG9jL3NyYy9yYXdfdmVjLnJztCUQABwAAAAqAgAAEQAAAGxpYnJhcnkvYWxsb2Mv c3JjL3N0cmluZy5ycwDgJRAAGwAAAOoBAAAXAEGUzMAAC9gMAQAAAF8AAABhIGZvcm1hdHRpbmcgdHJhaXQgaW1wbGVtZW50YXRp b24gcmV0dXJuZWQgYW4gZXJyb3Igd2hlbiB0aGUgdW5kZXJseWluZyBzdHJlYW0gZGlkIG5vdGxpYnJhcnkvYWxsb2Mvc3JjL2Zt dC5ycwAAciYQABgAAACKAgAADgAAAOAlEAAbAAAAjQUAABsAAABhc3NlcnRpb24gZmFpbGVkOiBlZGVsdGEgPj0gMGxpYnJhcnkv Y29yZS9zcmMvbnVtL2RpeV9mbG9hdC5ycwAAySYQACEAAABMAAAACQAAAMkmEAAhAAAATgAAAAkAAADBb/KGIwAAAIHvrIVbQW0t 7gQAAAEfar9k7Thu7Zen2vT5P+kDTxgAAT6VLgmZ3wP9OBUPL+R0I+z1z9MI3ATE2rDNvBl/M6YDJh/pTgIAAAF8Lphbh9O+cp/Z 2IcvFRLGUN5rcG5Kzw/YldVucbImsGbGrSQ2FR1a00I8DlT/Y8BzVcwX7/ll8ii8VffH3IDc7W70zu/cX/dTBQBsaWJyYXJ5L2Nv cmUvc3JjL251bS9mbHQyZGVjL3N0cmF0ZWd5L2RyYWdvbi5yc2Fzc2VydGlvbiBmYWlsZWQ6IGQubWFudCA+IDAAqCcQAC8AAAB2 AAAABQAAAGFzc2VydGlvbiBmYWlsZWQ6IGQubWludXMgPiAwAAAAqCcQAC8AAAB3AAAABQAAAGFzc2VydGlvbiBmYWlsZWQ6IGQu cGx1cyA+IDCoJxAALwAAAHgAAAAFAAAAYXNzZXJ0aW9uIGZhaWxlZDogYnVmLmxlbigpID49IE1BWF9TSUdfRElHSVRTAAAAqCcQ AC8AAAB7AAAABQAAAKgnEAAvAAAAwgAAAAkAAACoJxAALwAAAPsAAAANAAAAqCcQAC8AAAACAQAAEgAAAGFzc2VydGlvbiBmYWls ZWQ6IGQubWFudC5jaGVja2VkX3N1YihkLm1pbnVzKS5pc19zb21lKCkAqCcQAC8AAAB6AAAABQAAAGFzc2VydGlvbiBmYWlsZWQ6 IGQubWFudC5jaGVja2VkX2FkZChkLnBsdXMpLmlzX3NvbWUoKQAAqCcQAC8AAAB5AAAABQAAAKgnEAAvAAAACwEAAAUAAACoJxAA LwAAAAwBAAAFAAAAqCcQAC8AAAANAQAABQAAAKgnEAAvAAAAcgEAACQAAACoJxAALwAAAHcBAAAvAAAAqCcQAC8AAACEAQAAEgAA AKgnEAAvAAAAZgEAAA0AAACoJxAALwAAAEwBAAAiAAAAqCcQAC8AAAAPAQAABQAAAKgnEAAvAAAADgEAAAUAAADfRRo9A88a5sH7 zP4AAAAAysaaxxf+cKvc+9T+AAAAAE/cvL78sXf/9vvc/gAAAAAM1mtB75FWvhH85P4AAAAAPPx/kK0f0I0s/Oz+AAAAAIOaVTEo XFHTRvz0/gAAAAC1yaatj6xxnWH8/P4AAAAAy4vuI3cinOp7/AT/AAAAAG1TeECRScyulvwM/wAAAABXzrZdeRI8grH8FP8AAAAA N1b7TTaUEMLL/Bz/AAAAAE+YSDhv6paQ5vwk/wAAAADHOoIly4V01wD9LP8AAAAA9Je/l83PhqAb/TT/AAAAAOWsKheYCjTvNf08 /wAAAACOsjUq+2c4slD9RP8AAAAAOz/G0t/UyIRr/Uz/AAAAALrN0xonRN3Fhf1U/wAAAACWySW7zp9rk6D9XP8AAAAAhKVifSRs rNu6/WT/AAAAAPbaXw1YZquj1f1s/wAAAAAm8cPek/ji8+/9dP8AAAAAuID/qqittbUK/nz/AAAAAItKfGwFX2KHJf6E/wAAAABT MME0YP+8yT/+jP8AAAAAVSa6kYyFTpZa/pT/AAAAAL1+KXAkd/nfdP6c/wAAAACPuOW4n73fpo/+pP8AAAAAlH10iM9fqfip/qz/ AAAAAM+bqI+TcES5xP60/wAAAABrFQ+/+PAIit/+vP8AAAAAtjExZVUlsM35/sT/AAAAAKx/e9DG4j+ZFP/M/wAAAAAGOysqxBBc 5C7/1P8AAAAA05JzaZkkJKpJ/9z/AAAAAA7KAIPytYf9Y//k/wAAAADrGhGSZAjlvH7/7P8AAAAAzIhQbwnMvIyZ//T/AAAAACxl GeJYF7fRs//8/wBB9tjAAAsFQJzO/wQAQYTZwAAL0ikQpdTo6P8MAAAAAAAAAGKsxet4rQMAFAAAAAAAhAmU+Hg5P4EeABwAAAAA ALMVB8l7zpfAOAAkAAAAAABwXOp7zjJ+j1MALAAAAAAAaIDpq6Q40tVtADQAAAAAAEUimhcmJ0+fiAA8AAAAAAAn+8TUMaJj7aIA RAAAAAAAqK3IjDhl3rC9AEwAAAAAANtlqxqOCMeD2ABUAAAAAACaHXFC+R1dxPIAXAAAAAAAWOcbpixpTZINAWQAAAAAAOqNcBpk 7gHaJwFsAAAAAABKd++amaNtokIBdAAAAAAAhWt9tHt4CfJcAXwAAAAAAHcY3Xmh5FS0dwGEAAAAAADCxZtbkoZbhpIBjAAAAAAA PV2WyMVTNcisAZQAAAAAALOgl/pctCqVxwGcAAAAAADjX6CZvZ9G3uEBpAAAAAAAJYw52zTCm6X8AawAAAAAAFyfmKNymsb2FgK0 AAAAAADOvulUU7/ctzECvAAAAAAA4kEi8hfz/IhMAsQAAAAAAKV4XNObziDMZgLMAAAAAADfUyF781oWmIEC1AAAAAAAOjAfl9y1 oOKbAtwAAAAAAJaz41xT0dmotgLkAAAAAAA8RKek2Xyb+9AC7AAAAAAAEESkp0xMdrvrAvQAAAAAABqcQLbvjquLBgP8AAAAAAAs hFemEO8f0CADBAEAAAAAKTGR6eWkEJs7AwwBAAAAAJ0MnKH7mxDnVQMUAQAAAAAp9Dti2SAorHADHAEAAAAAhc+nel5LRICLAyQB AAAAAC3drANA5CG/pQMsAQAAAACP/0ReL5xnjsADNAEAAAAAQbiMnJ0XM9TaAzwBAAAAAKkb47SS2xme9QNEAQAAAADZd9+6br+W 6w8ETAEAAAAAbGlicmFyeS9jb3JlL3NyYy9udW0vZmx0MmRlYy9zdHJhdGVneS9ncmlzdS5ycwAAEC8QAC4AAAB9AAAAFQAAABAv EAAuAAAAqQAAAAUAAAAQLxAALgAAAKoAAAAFAAAAEC8QAC4AAACrAAAABQAAABAvEAAuAAAArgAAAAUAAABhc3NlcnRpb24gZmFp bGVkOiBkLm1hbnQgKyBkLnBsdXMgPCAoMSA8PCA2MSkAAAAQLxAALgAAAK8AAAAFAAAAEC8QAC4AAAAKAQAAEQAAABAvEAAuAAAA DQEAAAkAAAAQLxAALgAAAEABAAAJAAAAEC8QAC4AAACtAAAABQAAABAvEAAuAAAArAAAAAUAAABhc3NlcnRpb24gZmFpbGVkOiAh YnVmLmlzX2VtcHR5KCkAAAAQLxAALgAAANwBAAAFAAAAYXNzZXJ0aW9uIGZhaWxlZDogZC5tYW50IDwgKDEgPDwgNjEpEC8QAC4A AADdAQAABQAAABAvEAAuAAAA3gEAAAUAAAABAAAACgAAAGQAAADoAwAAECcAAKCGAQBAQg8AgJaYAADh9QUAypo7EC8QAC4AAAAz AgAAEQAAABAvEAAuAAAANgIAAAkAAAAQLxAALgAAAGwCAAAJAAAAEC8QAC4AAADjAgAAJgAAABAvEAAuAAAA7wIAACYAAAAQLxAA LgAAAMwCAAAmAAAAbGlicmFyeS9jb3JlL3NyYy9udW0vZmx0MmRlYy9tb2QucnMAIDEQACMAAAC7AAAABQAAAGFzc2VydGlvbiBm YWlsZWQ6IGJ1ZlswXSA+IGInMCcAIDEQACMAAAC8AAAABQAAAGFzc2VydGlvbiBmYWlsZWQ6IHBhcnRzLmxlbigpID49IDQAACAx EAAjAAAAvQAAAAUAAAAuMC4tK05hTmluZjBhc3NlcnRpb24gZmFpbGVkOiBidWYubGVuKCkgPj0gbWF4bGVuAAAAIDEQACMAAAB+ AgAADQAAACkuLjAxMjM0NTY3ODlhYmNkZWZCb3Jyb3dNdXRFcnJvcmFscmVhZHkgYm9ycm93ZWQ6IAAdMhAAEgAAAGNhbGxlZCBg T3B0aW9uOjp1bndyYXAoKWAgb24gYSBgTm9uZWAgdmFsdWVpbmRleCBvdXQgb2YgYm91bmRzOiB0aGUgbGVuIGlzICBidXQgdGhl IGluZGV4IGlzIAAAAGMyEAAgAAAAgzIQABIAAAAAAAAABAAAAAQAAABmAAAAPT0hPW1hdGNoZXNhc3NlcnRpb24gYGxlZnQgIHJp Z2h0YCBmYWlsZWQKICBsZWZ0OiAKIHJpZ2h0OiAAwzIQABAAAADTMhAAFwAAAOoyEAAJAAAAIHJpZ2h0YCBmYWlsZWQ6IAogIGxl ZnQ6IAAAAMMyEAAQAAAADDMQABAAAAAcMxAACQAAAOoyEAAJAAAAOiAAAAEAAAAAAAAASDMQAAIAAAAweDAwMDEwMjAzMDQwNTA2 MDcwODA5MTAxMTEyMTMxNDE1MTYxNzE4MTkyMDIxMjIyMzI0MjUyNjI3MjgyOTMwMzEzMjMzMzQzNTM2MzczODM5NDA0MTQyNDM0 NDQ1NDY0NzQ4NDk1MDUxNTI1MzU0NTU1NjU3NTg1OTYwNjE2MjYzNjQ2NTY2Njc2ODY5NzA3MTcyNzM3NDc1NzY3Nzc4Nzk4MDgx ODI4Mzg0ODU4Njg3ODg4OTkwOTE5MjkzOTQ5NTk2OTc5ODk5bGlicmFyeS9jb3JlL3NyYy9mbXQvbW9kLnJzMDAwMDAwMDAwMDAw MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMGZhbHNldHJ1ZQAAJjQQABsAAACpCgAA JgAAACY0EAAbAAAAsgoAABoAAABsaWJyYXJ5L2NvcmUvc3JjL3N0ci9tb2QucnNbLi4uXWJlZ2luIDw9IGVuZCAoIDw9ICkgd2hl biBzbGljaW5nIGBgAMw0EAAOAAAA2jQQAAQAAADeNBAAEAAAAO40EAABAAAAYnl0ZSBpbmRleCAgaXMgbm90IGEgY2hhciBib3Vu ZGFyeTsgaXQgaXMgaW5zaWRlICAoYnl0ZXMgKSBvZiBgABA1EAALAAAAGzUQACYAAABBNRAACAAAAEk1EAAGAAAA7jQQAAEAAAAg aXMgb3V0IG9mIGJvdW5kcyBvZiBgAAAQNRAACwAAAHg1EAAWAAAA7jQQAAEAAACsNBAAGwAAAKQBAAAsAAAAbGlicmFyeS9jb3Jl L3NyYy91bmljb2RlL3ByaW50YWJsZS5ycwAAALg1EAAlAAAAGgAAADYAAAC4NRAAJQAAAAoAAAArAAAAAAYBAQMBBAIFBwcCCAgJ AgoFCwIOBBABEQISBRMcFAEVAhcCGQ0cBR0IHwEkAWoEawKvA7ECvALPAtEC1AzVCdYC1wLaAeAF4QLnBOgC7iDwBPgC+gT7AQwn Oz5OT4+enp97i5OWorK6hrEGBwk2PT5W89DRBBQYNjdWV3+qrq+9NeASh4mOngQNDhESKTE0OkVGSUpOT2RlioyNj7bBw8TGy9Zc trcbHAcICgsUFzY5Oqip2NkJN5CRqAcKOz5maY+SEW9fv+7vWmL0/P9TVJqbLi8nKFWdoKGjpKeorbq8xAYLDBUdOj9FUaanzM2g BxkaIiU+P+fs7//FxgQgIyUmKDM4OkhKTFBTVVZYWlxeYGNlZmtzeH1/iqSqr7DA0K6vbm/d3pNeInsFAwQtA2YDAS8ugIIdAzEP HAQkCR4FKwVEBA4qgKoGJAQkBCgINAtOAzQMgTcJFgoIGDtFOQNjCAkwFgUhAxsFAUA4BEsFLwQKBwkHQCAnBAwJNgM6BRoHBAwH UEk3Mw0zBy4ICgYmAx0IAoDQUhADNywIKhYaJhwUFwlOBCQJRA0ZBwoGSAgnCXULQj4qBjsFCgZRBgEFEAMFC1kIAh1iHkgICoCm XiJFCwoGDRM6BgoGFBwsBBeAuTxkUwxICQpGRRtICFMNSQcKgLYiDgoGRgodA0dJNwMOCAoGOQcKgTYZBzsDHVUBDzINg5tmdQuA xIpMYw2EMBAWCo+bBYJHmrk6hsaCOQcqBFwGJgpGCigFE4GwOoDGW2VLBDkHEUAFCwIOl/gIhNYpCqLngTMPAR0GDgQIgYyJBGsF DQMJBxCPYID6BoG0TEcJdDyA9gpzCHAVRnoUDBQMVwkZgIeBRwOFQg8VhFAfBgaA1SsFPiEBcC0DGgQCgUAfEToFAYHQKoDWKwQB geCA9ylMBAoEAoMRREw9gMI8BgEEVQUbNAKBDiwEZAxWCoCuOB0NLAQJBwIOBoCag9gEEQMNA3cEXwYMBAEPDAQ4CAoGKAgsBAI+ gVQMHQMKBTgHHAYJB4D6hAYAAQMFBQYGAgcGCAcJEQocCxkMGg0QDgwPBBADEhITCRYBFwQYARkDGgcbARwCHxYgAysDLQsuATAE MQIyAacEqQKqBKsI+gL7Bf0C/gP/Ca14eYuNojBXWIuMkBzdDg9LTPv8Li8/XF1f4oSNjpGSqbG6u8XGycre5OX/AAQREikxNDc6 Oz1JSl2EjpKpsbS6u8bKzs/k5QAEDQ4REikxNDo7RUZJSl5kZYSRm53Jzs8NESk6O0VJV1tcXl9kZY2RqbS6u8XJ3+Tl8A0RRUlk ZYCEsry+v9XX8PGDhYukpr6/xcfP2ttImL3Nxs7PSU5PV1leX4mOj7G2t7/BxsfXERYXW1z29/7/gG1x3t8OH25vHB1ffX6ur027 vBYXHh9GR05PWFpcXn5/tcXU1dzw8fVyc490dZYmLi+nr7e/x8/X35oAQJeYMI8fzs/S1M7/Tk9aWwcIDxAnL+7vbm83PT9CRZCR U2d1yMnQ0djZ5/7/ACBfIoLfBIJECBsEBhGBrA6AqwUfCIEcAxkIAQQvBDQEBwMBBwYHEQpQDxIHVQcDBBwKCQMIAwcDAgMDAwwE BQMLBgEOFQVOBxsHVwcCBhcMUARDAy0DAQQRBg8MOgQdJV8gbQRqJYDIBYKwAxoGgv0DWQcWCRgJFAwUDGoGCgYaBlkHKwVGCiwE DAQBAzELLAQaBgsDgKwGCgYvMYD0CDwDDwM+BTgIKwWC/xEYCC8RLQMhDyEPgIwEgpoWCxWIlAUvBTsHAg4YCYC+InQMgNYagRAF gOEJ8p4DNwmBXBSAuAiA3RU7AwoGOAhGCAwGdAseA1oEWQmAgxgcChYJTASAigarpAwXBDGhBIHaJgcMBQWAphCB9QcBICoGTASA jQSAvgMbAw8NbGlicmFyeS9jb3JlL3NyYy91bmljb2RlL3VuaWNvZGVfZGF0YS5ycwAAAKk7EAAoAAAATQAAACgAAACpOxAAKAAA AFkAAAAWAAAAbGlicmFyeS9jb3JlL3NyYy9udW0vYmlnbnVtLnJzAAD0OxAAHgAAAKoBAAABAAAAYXNzZXJ0aW9uIGZhaWxlZDog bm9ib3Jyb3dhc3NlcnRpb24gZmFpbGVkOiBkaWdpdHMgPCA0MGFzc2VydGlvbiBmYWlsZWQ6IG90aGVyID4gMGF0dGVtcHQgdG8g ZGl2aWRlIGJ5IHplcm8AdjwQABkAAABhdHRlbXB0IHRvIGNhbGN1bGF0ZSB0aGUgcmVtYWluZGVyIHdpdGggYSBkaXZpc29yIG9m IHplcm8AAACYPBAAOQAAAHJhbmdlIHN0YXJ0IGluZGV4ICBvdXQgb2YgcmFuZ2UgZm9yIHNsaWNlIG9mIGxlbmd0aCDcPBAAEgAA AO48EAAiAAAAcmFuZ2UgZW5kIGluZGV4ICA9EAAQAAAA7jwQACIAAABzbGljZSBpbmRleCBzdGFydHMgYXQgIGJ1dCBlbmRzIGF0 IABAPRAAFgAAAFY9EAANAAAAY29weV9mcm9tX3NsaWNlOiBzb3VyY2Ugc2xpY2UgbGVuZ3RoICgpIGRvZXMgbm90IG1hdGNoIGRl c3RpbmF0aW9uIHNsaWNlIGxlbmd0aCAoAAAAdD0QACYAAACaPRAAKwAAAPwxEAABAAAAAAMAAIMEIACRBWAAXROgABIXIB8MIGAf 7ywgKyowoCtvpmAsAqjgLB774C0A/iA2nv9gNv0B4TYBCiE3JA3hN6sOYTkvGOE5MBzhSvMe4U5ANKFSHmHhU/BqYVRPb+FUnbxh VQDPYVZl0aFWANohVwDgoViu4iFa7OThW9DoYVwgAO5c8AF/XQBwAAcALQEBAQIBAgEBSAswFRABZQcCBgICAQQjAR4bWws6CQkB GAQBCQEDAQUrAzsJKhgBIDcBAQEECAQBAwcKAh0BOgEBAQIECAEJAQoCGgECAjkBBAIEAgIDAwEeAgMBCwI5AQQFAQIEARQCFgYB AToBAQIBBAgBBwMKAh4BOwEBAQwBCQEoAQMBNwEBAwUDAQQHAgsCHQE6AQICAQEDAwEEBwILAhwCOQIBAQIECAEJAQoCHQFIAQQB AgMBAQgBUQECBwwIYgECCQsHSQIbAQEBAQE3DgEFAQIFCwEkCQFmBAEGAQICAhkCBAMQBA0BAgIGAQ8BAAMABBwDHQIeAkACAQcI AQILCQEtAwEBdQIiAXYDBAIJAQYD2wICAToBAQcBAQEBAggGCgIBMB8xBDAKBAMmCQwCIAQCBjgBAQIDAQEFOAgCApgDAQ0BBwQB BgEDAsZAAAHDIQADjQFgIAAGaQIABAEKIAJQAgABAwEEARkCBQGXAhoSDQEmCBkLAQEsAzABAgQCAgIBJAFDBgICAgIMAQgBLwEz AQEDAgIFAgEBKgIIAe4BAgEEAQABABAQEAACAAHiAZUFAAMBAgUEKAMEAaUCAARBBQACTwRGCzEEewE2DykBAgIKAzEEAgIHAT0D JAUBCD4BDAI0CQEBCAQCAV8DAgQGAQIBnQEDCBUCOQIBAQEBDAEJAQ4HAwVDAQIGAQECAQEDBAMBAQ4CVQgCAwEBFwFRAQIGAQEC AQECAQLrAQIEBgIBAhsCVQgCAQECagEBAQIIZQEBAQIEAQUACQEC9QEKBAQBkAQCAgQBIAooBgIECAEJBgIDLg0BAgAHAQYBAVIW AgcBAgECegYDAQECAQcBAUgCAwEBAQACCwI0BQUDFwEAAQYPAAwDAwAFOwcAAT8EUQELAgACAC4CFwAFAwYICAIHHgSUAwA3BDII AQ4BFgUBDwAHARECBwECAQVkAaAHAAE9BAAE/gIAB20HAGCA8ABB8ILBAAsBSQBwCXByb2R1Y2VycwIIbGFuZ3VhZ2UBBFJ1c3QA DHByb2Nlc3NlZC1ieQMFcnVzdGMdMS44Ni4wICgwNWY5ODQ2ZjggMjAyNS0wMy0zMSkGd2FscnVzBjAuMjMuMwx3YXNtLWJpbmRn ZW4HMC4yLjEwMABJD3RhcmdldF9mZWF0dXJlcwQrD211dGFibGUtZ2xvYmFscysIc2lnbi1leHQrD3JlZmVyZW5jZS10eXBlcysK bXVsdGl2YWx1ZQ== `.trim().replaceAll("\n", "") ); wasmBinary = new Uint8Array(wasmBase64.length); for (let i = 0; i < wasmBase64.length; i++) { wasmBinary[i] = wasmBase64.charCodeAt(i); } } }); // src/vendor/xet-chunk/chunker_wasm.ts var chunker_wasm_exports = {}; __export(chunker_wasm_exports, { Chunker: () => Chunker, compute_file_hash: () => compute_file_hash, compute_hmac: () => compute_hmac, compute_verification_hash: () => compute_verification_hash, compute_xorb_hash: () => compute_xorb_hash, init: () => init }); async function init() { if (initPromise) { return initPromise; } let resolve3; let reject; initPromise = new Promise((_resolve, _reject) => { resolve3 = _resolve; reject = _reject; }); await Promise.resolve(); try { const wasmModule2 = await WebAssembly.compile(wasmBinary); const imports = Object.entries( WebAssembly.Module.imports(wasmModule2).reduce( (result, item) => ({ ...result, // @ts-expect-error ok for any type [item.module]: [...result[item.module] || [], item.name] }), {} ) ).map(([from, names]) => ({ from, names })); const wasm2 = await WebAssembly.instantiate(wasmModule2, { "./hf_xet_thin_wasm_bg.js": Object.fromEntries( // @ts-expect-error ok for any type imports[0].names.map((name) => [name, chunker_wasm_bg_exports[name]]) ) }); __wbg_set_wasm(wasm2.exports); wasm2.exports.__wbindgen_start(); resolve3(); } catch (error) { reject(error); } } var initPromise; var init_chunker_wasm = __esm({ "src/vendor/xet-chunk/chunker_wasm.ts"() { "use strict"; init_chunker_wasm_bg(); init_chunker_wasm_bg(); init_chunker_wasm_bg_wasm_base64(); init_chunker_wasm_bg(); initPromise = null; init(); } }); // node_modules/.pnpm/cli-progress@3.12.0/node_modules/cli-progress/lib/eta.js var require_eta = __commonJS({ "node_modules/.pnpm/cli-progress@3.12.0/node_modules/cli-progress/lib/eta.js"(exports, module2) { var ETA = class { constructor(length, initTime, initValue) { this.etaBufferLength = length || 100; this.valueBuffer = [initValue]; this.timeBuffer = [initTime]; this.eta = "0"; } // add new values to calculation buffer update(time, value, total) { this.valueBuffer.push(value); this.timeBuffer.push(time); this.calculate(total - value); } // fetch estimated time getTime() { return this.eta; } // eta calculation - request number of remaining events calculate(remaining) { const currentBufferSize = this.valueBuffer.length; const buffer = Math.min(this.etaBufferLength, currentBufferSize); const v_diff = this.valueBuffer[currentBufferSize - 1] - this.valueBuffer[currentBufferSize - buffer]; const t_diff = this.timeBuffer[currentBufferSize - 1] - this.timeBuffer[currentBufferSize - buffer]; const vt_rate = v_diff / t_diff; this.valueBuffer = this.valueBuffer.slice(-this.etaBufferLength); this.timeBuffer = this.timeBuffer.slice(-this.etaBufferLength); const eta = Math.ceil(remaining / vt_rate / 1e3); if (isNaN(eta)) { this.eta = "NULL"; } else if (!isFinite(eta)) { this.eta = "INF"; } else if (eta > 1e7) { this.eta = "INF"; } else if (eta < 0) { this.eta = 0; } else { this.eta = eta; } } }; module2.exports = ETA; } }); // node_modules/.pnpm/cli-progress@3.12.0/node_modules/cli-progress/lib/terminal.js var require_terminal = __commonJS({ "node_modules/.pnpm/cli-progress@3.12.0/node_modules/cli-progress/lib/terminal.js"(exports, module2) { var _readline = require("readline"); var Terminal = class { constructor(outputStream) { this.stream = outputStream; this.linewrap = true; this.dy = 0; } // save cursor position + settings cursorSave() { if (!this.stream.isTTY) { return; } this.stream.write("\x1B7"); } // restore last cursor position + settings cursorRestore() { if (!this.stream.isTTY) { return; } this.stream.write("\x1B8"); } // show/hide cursor cursor(enabled) { if (!this.stream.isTTY) { return; } if (enabled) { this.stream.write("\x1B[?25h"); } else { this.stream.write("\x1B[?25l"); } } // change cursor positionn cursorTo(x = null, y = null) { if (!this.stream.isTTY) { return; } _readline.cursorTo(this.stream, x, y); } // change relative cursor position cursorRelative(dx = null, dy = null) { if (!this.stream.isTTY) { return; } this.dy = this.dy + dy; _readline.moveCursor(this.stream, dx, dy); } // relative reset cursorRelativeReset() { if (!this.stream.isTTY) { return; } _readline.moveCursor(this.stream, 0, -this.dy); _readline.cursorTo(this.stream, 0, null); this.dy = 0; } // clear to the right from cursor clearRight() { if (!this.stream.isTTY) { return; } _readline.clearLine(this.stream, 1); } // clear the full line clearLine() { if (!this.stream.isTTY) { return; } _readline.clearLine(this.stream, 0); } // clear everyting beyond the current line clearBottom() { if (!this.stream.isTTY) { return; } _readline.clearScreenDown(this.stream); } // add new line; increment counter newline() { this.stream.write("\n"); this.dy++; } // write content to output stream // @TODO use string-width to strip length write(s, rawWrite = false) { if (this.linewrap === true && rawWrite === false) { this.stream.write(s.substr(0, this.getWidth())); } else { this.stream.write(s); } } // control line wrapping lineWrapping(enabled) { if (!this.stream.isTTY) { return; } this.linewrap = enabled; if (enabled) { this.stream.write("\x1B[?7h"); } else { this.stream.write("\x1B[?7l"); } } // tty environment ? isTTY() { return this.stream.isTTY === true; } // get terminal width getWidth() { return this.stream.columns || (this.stream.isTTY ? 80 : 200); } }; module2.exports = Terminal; } }); // node_modules/.pnpm/ansi-regex@5.0.1/node_modules/ansi-regex/index.js var require_ansi_regex = __commonJS({ "node_modules/.pnpm/ansi-regex@5.0.1/node_modules/ansi-regex/index.js"(exports, module2) { "use strict"; module2.exports = ({ onlyFirst = false } = {}) => { const pattern = [ "[\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]+)*|[a-zA-Z\\d]+(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]*)*)?\\u0007)", "(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PR-TZcf-ntqry=><~]))" ].join("|"); return new RegExp(pattern, onlyFirst ? void 0 : "g"); }; } }); // node_modules/.pnpm/strip-ansi@6.0.1/node_modules/strip-ansi/index.js var require_strip_ansi = __commonJS({ "node_modules/.pnpm/strip-ansi@6.0.1/node_modules/strip-ansi/index.js"(exports, module2) { "use strict"; var ansiRegex = require_ansi_regex(); module2.exports = (string) => typeof string === "string" ? string.replace(ansiRegex(), "") : string; } }); // node_modules/.pnpm/is-fullwidth-code-point@3.0.0/node_modules/is-fullwidth-code-point/index.js var require_is_fullwidth_code_point = __commonJS({ "node_modules/.pnpm/is-fullwidth-code-point@3.0.0/node_modules/is-fullwidth-code-point/index.js"(exports, module2) { "use strict"; var isFullwidthCodePoint = (codePoint) => { if (Number.isNaN(codePoint)) { return false; } if (codePoint >= 4352 && (codePoint <= 4447 || // Hangul Jamo codePoint === 9001 || // LEFT-POINTING ANGLE BRACKET codePoint === 9002 || // RIGHT-POINTING ANGLE BRACKET // CJK Radicals Supplement .. Enclosed CJK Letters and Months 11904 <= codePoint && codePoint <= 12871 && codePoint !== 12351 || // Enclosed CJK Letters and Months .. CJK Unified Ideographs Extension A 12880 <= codePoint && codePoint <= 19903 || // CJK Unified Ideographs .. Yi Radicals 19968 <= codePoint && codePoint <= 42182 || // Hangul Jamo Extended-A 43360 <= codePoint && codePoint <= 43388 || // Hangul Syllables 44032 <= codePoint && codePoint <= 55203 || // CJK Compatibility Ideographs 63744 <= codePoint && codePoint <= 64255 || // Vertical Forms 65040 <= codePoint && codePoint <= 65049 || // CJK Compatibility Forms .. Small Form Variants 65072 <= codePoint && codePoint <= 65131 || // Halfwidth and Fullwidth Forms 65281 <= codePoint && codePoint <= 65376 || 65504 <= codePoint && codePoint <= 65510 || // Kana Supplement 110592 <= codePoint && codePoint <= 110593 || // Enclosed Ideographic Supplement 127488 <= codePoint && codePoint <= 127569 || // CJK Unified Ideographs Extension B .. Tertiary Ideographic Plane 131072 <= codePoint && codePoint <= 262141)) { return true; } return false; }; module2.exports = isFullwidthCodePoint; module2.exports.default = isFullwidthCodePoint; } }); // node_modules/.pnpm/emoji-regex@8.0.0/node_modules/emoji-regex/index.js var require_emoji_regex = __commonJS({ "node_modules/.pnpm/emoji-regex@8.0.0/node_modules/emoji-regex/index.js"(exports, module2) { "use strict"; module2.exports = function() { return /\uD83C\uDFF4\uDB40\uDC67\uDB40\uDC62(?:\uDB40\uDC65\uDB40\uDC6E\uDB40\uDC67|\uDB40\uDC73\uDB40\uDC63\uDB40\uDC74|\uDB40\uDC77\uDB40\uDC6C\uDB40\uDC73)\uDB40\uDC7F|\uD83D\uDC68(?:\uD83C\uDFFC\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68\uD83C\uDFFB|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFF\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFE])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFE\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFD])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFD\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB\uDFFC])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\u200D(?:\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D)?\uD83D\uDC68|(?:\uD83D[\uDC68\uDC69])\u200D(?:\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67]))|\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67])|(?:\uD83D[\uDC68\uDC69])\u200D(?:\uD83D[\uDC66\uDC67])|[\u2695\u2696\u2708]\uFE0F|\uD83D[\uDC66\uDC67]|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|(?:\uD83C\uDFFB\u200D[\u2695\u2696\u2708]|\uD83C\uDFFF\u200D[\u2695\u2696\u2708]|\uD83C\uDFFE\u200D[\u2695\u2696\u2708]|\uD83C\uDFFD\u200D[\u2695\u2696\u2708]|\uD83C\uDFFC\u200D[\u2695\u2696\u2708])\uFE0F|\uD83C\uDFFB\u200D(?:\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C[\uDFFB-\uDFFF])|(?:\uD83E\uDDD1\uD83C\uDFFB\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFC\u200D\uD83E\uDD1D\u200D\uD83D\uDC69)\uD83C\uDFFB|\uD83E\uDDD1(?:\uD83C\uDFFF\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1(?:\uD83C[\uDFFB-\uDFFF])|\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1)|(?:\uD83E\uDDD1\uD83C\uDFFE\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFF\u200D\uD83E\uDD1D\u200D(?:\uD83D[\uDC68\uDC69]))(?:\uD83C[\uDFFB-\uDFFE])|(?:\uD83E\uDDD1\uD83C\uDFFC\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFD\u200D\uD83E\uDD1D\u200D\uD83D\uDC69)(?:\uD83C[\uDFFB\uDFFC])|\uD83D\uDC69(?:\uD83C\uDFFE\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB-\uDFFD\uDFFF])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFC\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB\uDFFD-\uDFFF])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFB\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFC-\uDFFF])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFD\u200D(?:\uD83E\uDD1D\u200D\uD83D\uDC68(?:\uD83C[\uDFFB\uDFFC\uDFFE\uDFFF])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\u200D(?:\u2764\uFE0F\u200D(?:\uD83D\uDC8B\u200D(?:\uD83D[\uDC68\uDC69])|\uD83D[\uDC68\uDC69])|\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD])|\uD83C\uDFFF\u200D(?:\uD83C[\uDF3E\uDF73\uDF93\uDFA4\uDFA8\uDFEB\uDFED]|\uD83D[\uDCBB\uDCBC\uDD27\uDD2C\uDE80\uDE92]|\uD83E[\uDDAF-\uDDB3\uDDBC\uDDBD]))|\uD83D\uDC69\u200D\uD83D\uDC69\u200D(?:\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67]))|(?:\uD83E\uDDD1\uD83C\uDFFD\u200D\uD83E\uDD1D\u200D\uD83E\uDDD1|\uD83D\uDC69\uD83C\uDFFE\u200D\uD83E\uDD1D\u200D\uD83D\uDC69)(?:\uD83C[\uDFFB-\uDFFD])|\uD83D\uDC69\u200D\uD83D\uDC66\u200D\uD83D\uDC66|\uD83D\uDC69\u200D\uD83D\uDC69\u200D(?:\uD83D[\uDC66\uDC67])|(?:\uD83D\uDC41\uFE0F\u200D\uD83D\uDDE8|\uD83D\uDC69(?:\uD83C\uDFFF\u200D[\u2695\u2696\u2708]|\uD83C\uDFFE\u200D[\u2695\u2696\u2708]|\uD83C\uDFFC\u200D[\u2695\u2696\u2708]|\uD83C\uDFFB\u200D[\u2695\u2696\u2708]|\uD83C\uDFFD\u200D[\u2695\u2696\u2708]|\u200D[\u2695\u2696\u2708])|(?:(?:\u26F9|\uD83C[\uDFCB\uDFCC]|\uD83D\uDD75)\uFE0F|\uD83D\uDC6F|\uD83E[\uDD3C\uDDDE\uDDDF])\u200D[\u2640\u2642]|(?:\u26F9|\uD83C[\uDFCB\uDFCC]|\uD83D\uDD75)(?:\uD83C[\uDFFB-\uDFFF])\u200D[\u2640\u2642]|(?:\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDCD-\uDDCF\uDDD6-\uDDDD])(?:(?:\uD83C[\uDFFB-\uDFFF])\u200D[\u2640\u2642]|\u200D[\u2640\u2642])|\uD83C\uDFF4\u200D\u2620)\uFE0F|\uD83D\uDC69\u200D\uD83D\uDC67\u200D(?:\uD83D[\uDC66\uDC67])|\uD83C\uDFF3\uFE0F\u200D\uD83C\uDF08|\uD83D\uDC15\u200D\uD83E\uDDBA|\uD83D\uDC69\u200D\uD83D\uDC66|\uD83D\uDC69\u200D\uD83D\uDC67|\uD83C\uDDFD\uD83C\uDDF0|\uD83C\uDDF4\uD83C\uDDF2|\uD83C\uDDF6\uD83C\uDDE6|[#\*0-9]\uFE0F\u20E3|\uD83C\uDDE7(?:\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEF\uDDF1-\uDDF4\uDDF6-\uDDF9\uDDFB\uDDFC\uDDFE\uDDFF])|\uD83C\uDDF9(?:\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDED\uDDEF-\uDDF4\uDDF7\uDDF9\uDDFB\uDDFC\uDDFF])|\uD83C\uDDEA(?:\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDED\uDDF7-\uDDFA])|\uD83E\uDDD1(?:\uD83C[\uDFFB-\uDFFF])|\uD83C\uDDF7(?:\uD83C[\uDDEA\uDDF4\uDDF8\uDDFA\uDDFC])|\uD83D\uDC69(?:\uD83C[\uDFFB-\uDFFF])|\uD83C\uDDF2(?:\uD83C[\uDDE6\uDDE8-\uDDED\uDDF0-\uDDFF])|\uD83C\uDDE6(?:\uD83C[\uDDE8-\uDDEC\uDDEE\uDDF1\uDDF2\uDDF4\uDDF6-\uDDFA\uDDFC\uDDFD\uDDFF])|\uD83C\uDDF0(?:\uD83C[\uDDEA\uDDEC-\uDDEE\uDDF2\uDDF3\uDDF5\uDDF7\uDDFC\uDDFE\uDDFF])|\uD83C\uDDED(?:\uD83C[\uDDF0\uDDF2\uDDF3\uDDF7\uDDF9\uDDFA])|\uD83C\uDDE9(?:\uD83C[\uDDEA\uDDEC\uDDEF\uDDF0\uDDF2\uDDF4\uDDFF])|\uD83C\uDDFE(?:\uD83C[\uDDEA\uDDF9])|\uD83C\uDDEC(?:\uD83C[\uDDE6\uDDE7\uDDE9-\uDDEE\uDDF1-\uDDF3\uDDF5-\uDDFA\uDDFC\uDDFE])|\uD83C\uDDF8(?:\uD83C[\uDDE6-\uDDEA\uDDEC-\uDDF4\uDDF7-\uDDF9\uDDFB\uDDFD-\uDDFF])|\uD83C\uDDEB(?:\uD83C[\uDDEE-\uDDF0\uDDF2\uDDF4\uDDF7])|\uD83C\uDDF5(?:\uD83C[\uDDE6\uDDEA-\uDDED\uDDF0-\uDDF3\uDDF7-\uDDF9\uDDFC\uDDFE])|\uD83C\uDDFB(?:\uD83C[\uDDE6\uDDE8\uDDEA\uDDEC\uDDEE\uDDF3\uDDFA])|\uD83C\uDDF3(?:\uD83C[\uDDE6\uDDE8\uDDEA-\uDDEC\uDDEE\uDDF1\uDDF4\uDDF5\uDDF7\uDDFA\uDDFF])|\uD83C\uDDE8(?:\uD83C[\uDDE6\uDDE8\uDDE9\uDDEB-\uDDEE\uDDF0-\uDDF5\uDDF7\uDDFA-\uDDFF])|\uD83C\uDDF1(?:\uD83C[\uDDE6-\uDDE8\uDDEE\uDDF0\uDDF7-\uDDFB\uDDFE])|\uD83C\uDDFF(?:\uD83C[\uDDE6\uDDF2\uDDFC])|\uD83C\uDDFC(?:\uD83C[\uDDEB\uDDF8])|\uD83C\uDDFA(?:\uD83C[\uDDE6\uDDEC\uDDF2\uDDF3\uDDF8\uDDFE\uDDFF])|\uD83C\uDDEE(?:\uD83C[\uDDE8-\uDDEA\uDDF1-\uDDF4\uDDF6-\uDDF9])|\uD83C\uDDEF(?:\uD83C[\uDDEA\uDDF2\uDDF4\uDDF5])|(?:\uD83C[\uDFC3\uDFC4\uDFCA]|\uD83D[\uDC6E\uDC71\uDC73\uDC77\uDC81\uDC82\uDC86\uDC87\uDE45-\uDE47\uDE4B\uDE4D\uDE4E\uDEA3\uDEB4-\uDEB6]|\uD83E[\uDD26\uDD37-\uDD39\uDD3D\uDD3E\uDDB8\uDDB9\uDDCD-\uDDCF\uDDD6-\uDDDD])(?:\uD83C[\uDFFB-\uDFFF])|(?:\u26F9|\uD83C[\uDFCB\uDFCC]|\uD83D\uDD75)(?:\uD83C[\uDFFB-\uDFFF])|(?:[\u261D\u270A-\u270D]|\uD83C[\uDF85\uDFC2\uDFC7]|\uD83D[\uDC42\uDC43\uDC46-\uDC50\uDC66\uDC67\uDC6B-\uDC6D\uDC70\uDC72\uDC74-\uDC76\uDC78\uDC7C\uDC83\uDC85\uDCAA\uDD74\uDD7A\uDD90\uDD95\uDD96\uDE4C\uDE4F\uDEC0\uDECC]|\uD83E[\uDD0F\uDD18-\uDD1C\uDD1E\uDD1F\uDD30-\uDD36\uDDB5\uDDB6\uDDBB\uDDD2-\uDDD5])(?:\uD83C[\uDFFB-\uDFFF])|(?:[\u231A\u231B\u23E9-\u23EC\u23F0\u23F3\u25FD\u25FE\u2614\u2615\u2648-\u2653\u267F\u2693\u26A1\u26AA\u26AB\u26BD\u26BE\u26C4\u26C5\u26CE\u26D4\u26EA\u26F2\u26F3\u26F5\u26FA\u26FD\u2705\u270A\u270B\u2728\u274C\u274E\u2753-\u2755\u2757\u2795-\u2797\u27B0\u27BF\u2B1B\u2B1C\u2B50\u2B55]|\uD83C[\uDC04\uDCCF\uDD8E\uDD91-\uDD9A\uDDE6-\uDDFF\uDE01\uDE1A\uDE2F\uDE32-\uDE36\uDE38-\uDE3A\uDE50\uDE51\uDF00-\uDF20\uDF2D-\uDF35\uDF37-\uDF7C\uDF7E-\uDF93\uDFA0-\uDFCA\uDFCF-\uDFD3\uDFE0-\uDFF0\uDFF4\uDFF8-\uDFFF]|\uD83D[\uDC00-\uDC3E\uDC40\uDC42-\uDCFC\uDCFF-\uDD3D\uDD4B-\uDD4E\uDD50-\uDD67\uDD7A\uDD95\uDD96\uDDA4\uDDFB-\uDE4F\uDE80-\uDEC5\uDECC\uDED0-\uDED2\uDED5\uDEEB\uDEEC\uDEF4-\uDEFA\uDFE0-\uDFEB]|\uD83E[\uDD0D-\uDD3A\uDD3C-\uDD45\uDD47-\uDD71\uDD73-\uDD76\uDD7A-\uDDA2\uDDA5-\uDDAA\uDDAE-\uDDCA\uDDCD-\uDDFF\uDE70-\uDE73\uDE78-\uDE7A\uDE80-\uDE82\uDE90-\uDE95])|(?:[#\*0-9\xA9\xAE\u203C\u2049\u2122\u2139\u2194-\u2199\u21A9\u21AA\u231A\u231B\u2328\u23CF\u23E9-\u23F3\u23F8-\u23FA\u24C2\u25AA\u25AB\u25B6\u25C0\u25FB-\u25FE\u2600-\u2604\u260E\u2611\u2614\u2615\u2618\u261D\u2620\u2622\u2623\u2626\u262A\u262E\u262F\u2638-\u263A\u2640\u2642\u2648-\u2653\u265F\u2660\u2663\u2665\u2666\u2668\u267B\u267E\u267F\u2692-\u2697\u2699\u269B\u269C\u26A0\u26A1\u26AA\u26AB\u26B0\u26B1\u26BD\u26BE\u26C4\u26C5\u26C8\u26CE\u26CF\u26D1\u26D3\u26D4\u26E9\u26EA\u26F0-\u26F5\u26F7-\u26FA\u26FD\u2702\u2705\u2708-\u270D\u270F\u2712\u2714\u2716\u271D\u2721\u2728\u2733\u2734\u2744\u2747\u274C\u274E\u2753-\u2755\u2757\u2763\u2764\u2795-\u2797\u27A1\u27B0\u27BF\u2934\u2935\u2B05-\u2B07\u2B1B\u2B1C\u2B50\u2B55\u3030\u303D\u3297\u3299]|\uD83C[\uDC04\uDCCF\uDD70\uDD71\uDD7E\uDD7F\uDD8E\uDD91-\uDD9A\uDDE6-\uDDFF\uDE01\uDE02\uDE1A\uDE2F\uDE32-\uDE3A\uDE50\uDE51\uDF00-\uDF21\uDF24-\uDF93\uDF96\uDF97\uDF99-\uDF9B\uDF9E-\uDFF0\uDFF3-\uDFF5\uDFF7-\uDFFF]|\uD83D[\uDC00-\uDCFD\uDCFF-\uDD3D\uDD49-\uDD4E\uDD50-\uDD67\uDD6F\uDD70\uDD73-\uDD7A\uDD87\uDD8A-\uDD8D\uDD90\uDD95\uDD96\uDDA4\uDDA5\uDDA8\uDDB1\uDDB2\uDDBC\uDDC2-\uDDC4\uDDD1-\uDDD3\uDDDC-\uDDDE\uDDE1\uDDE3\uDDE8\uDDEF\uDDF3\uDDFA-\uDE4F\uDE80-\uDEC5\uDECB-\uDED2\uDED5\uDEE0-\uDEE5\uDEE9\uDEEB\uDEEC\uDEF0\uDEF3-\uDEFA\uDFE0-\uDFEB]|\uD83E[\uDD0D-\uDD3A\uDD3C-\uDD45\uDD47-\uDD71\uDD73-\uDD76\uDD7A-\uDDA2\uDDA5-\uDDAA\uDDAE-\uDDCA\uDDCD-\uDDFF\uDE70-\uDE73\uDE78-\uDE7A\uDE80-\uDE82\uDE90-\uDE95])\uFE0F|(?:[\u261D\u26F9\u270A-\u270D]|\uD83C[\uDF85\uDFC2-\uDFC4\uDFC7\uDFCA-\uDFCC]|\uD83D[\uDC42\uDC43\uDC46-\uDC50\uDC66-\uDC78\uDC7C\uDC81-\uDC83\uDC85-\uDC87\uDC8F\uDC91\uDCAA\uDD74\uDD75\uDD7A\uDD90\uDD95\uDD96\uDE45-\uDE47\uDE4B-\uDE4F\uDEA3\uDEB4-\uDEB6\uDEC0\uDECC]|\uD83E[\uDD0F\uDD18-\uDD1F\uDD26\uDD30-\uDD39\uDD3C-\uDD3E\uDDB5\uDDB6\uDDB8\uDDB9\uDDBB\uDDCD-\uDDCF\uDDD1-\uDDDD])/g; }; } }); // node_modules/.pnpm/string-width@4.2.3/node_modules/string-width/index.js var require_string_width = __commonJS({ "node_modules/.pnpm/string-width@4.2.3/node_modules/string-width/index.js"(exports, module2) { "use strict"; var stripAnsi = require_strip_ansi(); var isFullwidthCodePoint = require_is_fullwidth_code_point(); var emojiRegex = require_emoji_regex(); var stringWidth = (string) => { if (typeof string !== "string" || string.length === 0) { return 0; } string = stripAnsi(string); if (string.length === 0) { return 0; } string = string.replace(emojiRegex(), " "); let width = 0; for (let i = 0; i < string.length; i++) { const code = string.codePointAt(i); if (code <= 31 || code >= 127 && code <= 159) { continue; } if (code >= 768 && code <= 879) { continue; } if (code > 65535) { i++; } width += isFullwidthCodePoint(code) ? 2 : 1; } return width; }; module2.exports = stringWidth; module2.exports.default = stringWidth; } }); // node_modules/.pnpm/cli-progress@3.12.0/node_modules/cli-progress/lib/format-value.js var require_format_value = __commonJS({ "node_modules/.pnpm/cli-progress@3.12.0/node_modules/cli-progress/lib/format-value.js"(exports, module2) { module2.exports = function formatValue(v, options, type) { if (options.autopadding !== true) { return v; } function autopadding(value, length) { return (options.autopaddingChar + value).slice(-length); } switch (type) { case "percentage": return autopadding(v, 3); default: return v; } }; } }); // node_modules/.pnpm/cli-progress@3.12.0/node_modules/cli-progress/lib/format-bar.js var require_format_bar = __commonJS({ "node_modules/.pnpm/cli-progress@3.12.0/node_modules/cli-progress/lib/format-bar.js"(exports, module2) { module2.exports = function formatBar(progress, options) { const completeSize = Math.round(progress * options.barsize); const incompleteSize = options.barsize - completeSize; return options.barCompleteString.substr(0, completeSize) + options.barGlue + options.barIncompleteString.substr(0, incompleteSize); }; } }); // node_modules/.pnpm/cli-progress@3.12.0/node_modules/cli-progress/lib/format-time.js var require_format_time = __commonJS({ "node_modules/.pnpm/cli-progress@3.12.0/node_modules/cli-progress/lib/format-time.js"(exports, module2) { module2.exports = function formatTime(t, options, roundToMultipleOf) { function round(input) { if (roundToMultipleOf) { return roundToMultipleOf * Math.round(input / roundToMultipleOf); } else { return input; } } function autopadding(v) { return (options.autopaddingChar + v).slice(-2); } if (t > 3600) { return autopadding(Math.floor(t / 3600)) + "h" + autopadding(round(t % 3600 / 60)) + "m"; } else if (t > 60) { return autopadding(Math.floor(t / 60)) + "m" + autopadding(round(t % 60)) + "s"; } else if (t > 10) { return autopadding(round(t)) + "s"; } else { return autopadding(t) + "s"; } }; } }); // node_modules/.pnpm/cli-progress@3.12.0/node_modules/cli-progress/lib/formatter.js var require_formatter = __commonJS({ "node_modules/.pnpm/cli-progress@3.12.0/node_modules/cli-progress/lib/formatter.js"(exports, module2) { var _stringWidth = require_string_width(); var _defaultFormatValue = require_format_value(); var _defaultFormatBar = require_format_bar(); var _defaultFormatTime = require_format_time(); module2.exports = function defaultFormatter(options, params, payload) { let s = options.format; const formatTime = options.formatTime || _defaultFormatTime; const formatValue = options.formatValue || _defaultFormatValue; const formatBar = options.formatBar || _defaultFormatBar; const percentage = Math.floor(params.progress * 100) + ""; const stopTime = params.stopTime || Date.now(); const elapsedTime = Math.round((stopTime - params.startTime) / 1e3); const context = Object.assign({}, payload, { bar: formatBar(params.progress, options), percentage: formatValue(percentage, options, "percentage"), total: formatValue(params.total, options, "total"), value: formatValue(params.value, options, "value"), eta: formatValue(params.eta, options, "eta"), eta_formatted: formatTime(params.eta, options, 5), duration: formatValue(elapsedTime, options, "duration"), duration_formatted: formatTime(elapsedTime, options, 1) }); s = s.replace(/\{(\w+)\}/g, function(match, key) { if (typeof context[key] !== "undefined") { return context[key]; } return match; }); const fullMargin = Math.max(0, params.maxWidth - _stringWidth(s) - 2); const halfMargin = Math.floor(fullMargin / 2); switch (options.align) { case "right": s = fullMargin > 0 ? " ".repeat(fullMargin) + s : s; break; case "center": s = halfMargin > 0 ? " ".repeat(halfMargin) + s : s; break; case "left": default: break; } return s; }; } }); // node_modules/.pnpm/cli-progress@3.12.0/node_modules/cli-progress/lib/options.js var require_options = __commonJS({ "node_modules/.pnpm/cli-progress@3.12.0/node_modules/cli-progress/lib/options.js"(exports, module2) { function mergeOption(v, defaultValue) { if (typeof v === "undefined" || v === null) { return defaultValue; } else { return v; } } module2.exports = { // set global options parse: function parse(rawOptions, preset) { const options = {}; const opt = Object.assign({}, preset, rawOptions); options.throttleTime = 1e3 / mergeOption(opt.fps, 10); options.stream = mergeOption(opt.stream, process.stderr); options.terminal = mergeOption(opt.terminal, null); options.clearOnComplete = mergeOption(opt.clearOnComplete, false); options.stopOnComplete = mergeOption(opt.stopOnComplete, false); options.barsize = mergeOption(opt.barsize, 40); options.align = mergeOption(opt.align, "left"); options.hideCursor = mergeOption(opt.hideCursor, false); options.linewrap = mergeOption(opt.linewrap, false); options.barGlue = mergeOption(opt.barGlue, ""); options.barCompleteChar = mergeOption(opt.barCompleteChar, "="); options.barIncompleteChar = mergeOption(opt.barIncompleteChar, "-"); options.format = mergeOption(opt.format, "progress [{bar}] {percentage}% | ETA: {eta}s | {value}/{total}"); options.formatTime = mergeOption(opt.formatTime, null); options.formatValue = mergeOption(opt.formatValue, null); options.formatBar = mergeOption(opt.formatBar, null); options.etaBufferLength = mergeOption(opt.etaBuffer, 10); options.etaAsynchronousUpdate = mergeOption(opt.etaAsynchronousUpdate, false); options.progressCalculationRelative = mergeOption(opt.progressCalculationRelative, false); options.synchronousUpdate = mergeOption(opt.synchronousUpdate, true); options.noTTYOutput = mergeOption(opt.noTTYOutput, false); options.notTTYSchedule = mergeOption(opt.notTTYSchedule, 2e3); options.emptyOnZero = mergeOption(opt.emptyOnZero, false); options.forceRedraw = mergeOption(opt.forceRedraw, false); options.autopadding = mergeOption(opt.autopadding, false); options.gracefulExit = mergeOption(opt.gracefulExit, false); return options; }, // derived options: instance specific, has to be created for every bar element assignDerivedOptions: function assignDerivedOptions(options) { options.barCompleteString = options.barCompleteChar.repeat(options.barsize + 1); options.barIncompleteString = options.barIncompleteChar.repeat(options.barsize + 1); options.autopaddingChar = options.autopadding ? mergeOption(options.autopaddingChar, " ") : ""; return options; } }; } }); // node_modules/.pnpm/cli-progress@3.12.0/node_modules/cli-progress/lib/generic-bar.js var require_generic_bar = __commonJS({ "node_modules/.pnpm/cli-progress@3.12.0/node_modules/cli-progress/lib/generic-bar.js"(exports, module2) { var _ETA = require_eta(); var _Terminal = require_terminal(); var _formatter = require_formatter(); var _options = require_options(); var _EventEmitter = require("events"); module2.exports = class GenericBar extends _EventEmitter { constructor(options) { super(); this.options = _options.assignDerivedOptions(options); this.terminal = this.options.terminal ? this.options.terminal : new _Terminal(this.options.stream); this.value = 0; this.startValue = 0; this.total = 100; this.lastDrawnString = null; this.startTime = null; this.stopTime = null; this.lastRedraw = Date.now(); this.eta = new _ETA(this.options.etaBufferLength, 0, 0); this.payload = {}; this.isActive = false; this.formatter = typeof this.options.format === "function" ? this.options.format : _formatter; } // internal render function render(forceRendering = false) { const params = { progress: this.getProgress(), eta: this.eta.getTime(), startTime: this.startTime, stopTime: this.stopTime, total: this.total, value: this.value, maxWidth: this.terminal.getWidth() }; if (this.options.etaAsynchronousUpdate) { this.updateETA(); } const s = this.formatter(this.options, params, this.payload); const forceRedraw = forceRendering || this.options.forceRedraw || this.options.noTTYOutput && !this.terminal.isTTY(); if (forceRedraw || this.lastDrawnString != s) { this.emit("redraw-pre"); this.terminal.cursorTo(0, null); this.terminal.write(s); this.terminal.clearRight(); this.lastDrawnString = s; this.lastRedraw = Date.now(); this.emit("redraw-post"); } } // start the progress bar start(total, startValue, payload) { this.value = startValue || 0; this.total = typeof total !== "undefined" && total >= 0 ? total : 100; this.startValue = startValue || 0; this.payload = payload || {}; this.startTime = Date.now(); this.stopTime = null; this.lastDrawnString = ""; this.eta = new _ETA(this.options.etaBufferLength, this.startTime, this.value); this.isActive = true; this.emit("start", total, startValue); } // stop the bar stop() { this.isActive = false; this.stopTime = Date.now(); this.emit("stop", this.total, this.value); } // update the bar value // update(value, payload) // update(payload) update(arg0, arg1 = {}) { if (typeof arg0 === "number") { this.value = arg0; this.eta.update(Date.now(), arg0, this.total); } const payloadData = (typeof arg0 === "object" ? arg0 : arg1) || {}; this.emit("update", this.total, this.value); for (const key in payloadData) { this.payload[key] = payloadData[key]; } if (this.value >= this.getTotal() && this.options.stopOnComplete) { this.stop(); } } // calculate the actual progress value getProgress() { let progress = this.value / this.total; if (this.options.progressCalculationRelative) { progress = (this.value - this.startValue) / (this.total - this.startValue); } if (isNaN(progress)) { progress = this.options && this.options.emptyOnZero ? 0 : 1; } progress = Math.min(Math.max(progress, 0), 1); return progress; } // update the bar value // increment(delta, payload) // increment(payload) increment(arg0 = 1, arg1 = {}) { if (typeof arg0 === "object") { this.update(this.value + 1, arg0); } else { this.update(this.value + arg0, arg1); } } // get the total (limit) value getTotal() { return this.total; } // set the total (limit) value setTotal(total) { if (typeof total !== "undefined" && total >= 0) { this.total = total; } } // force eta calculation update (long running processes) updateETA() { this.eta.update(Date.now(), this.value, this.total); } }; } }); // node_modules/.pnpm/cli-progress@3.12.0/node_modules/cli-progress/lib/single-bar.js var require_single_bar = __commonJS({ "node_modules/.pnpm/cli-progress@3.12.0/node_modules/cli-progress/lib/single-bar.js"(exports, module2) { var _GenericBar = require_generic_bar(); var _options = require_options(); module2.exports = class SingleBar extends _GenericBar { constructor(options, preset) { super(_options.parse(options, preset)); this.timer = null; if (this.options.noTTYOutput && this.terminal.isTTY() === false) { this.options.synchronousUpdate = false; } this.schedulingRate = this.terminal.isTTY() ? this.options.throttleTime : this.options.notTTYSchedule; this.sigintCallback = null; } // internal render function render() { if (this.timer) { clearTimeout(this.timer); this.timer = null; } super.render(); if (this.options.noTTYOutput && this.terminal.isTTY() === false) { this.terminal.newline(); } this.timer = setTimeout(this.render.bind(this), this.schedulingRate); } update(current, payload) { if (!this.timer) { return; } super.update(current, payload); if (this.options.synchronousUpdate && this.lastRedraw + this.options.throttleTime * 2 < Date.now()) { this.render(); } } // start the progress bar start(total, startValue, payload) { if (this.options.noTTYOutput === false && this.terminal.isTTY() === false) { return; } if (this.sigintCallback === null && this.options.gracefulExit) { this.sigintCallback = this.stop.bind(this); process.once("SIGINT", this.sigintCallback); process.once("SIGTERM", this.sigintCallback); } this.terminal.cursorSave(); if (this.options.hideCursor === true) { this.terminal.cursor(false); } if (this.options.linewrap === false) { this.terminal.lineWrapping(false); } super.start(total, startValue, payload); this.render(); } // stop the bar stop() { if (!this.timer) { return; } if (this.sigintCallback) { process.removeListener("SIGINT", this.sigintCallback); process.removeListener("SIGTERM", this.sigintCallback); this.sigintCallback = null; } this.render(); super.stop(); clearTimeout(this.timer); this.timer = null; if (this.options.hideCursor === true) { this.terminal.cursor(true); } if (this.options.linewrap === false) { this.terminal.lineWrapping(true); } this.terminal.cursorRestore(); if (this.options.clearOnComplete) { this.terminal.cursorTo(0, null); this.terminal.clearLine(); } else { this.terminal.newline(); } } }; } }); // node_modules/.pnpm/cli-progress@3.12.0/node_modules/cli-progress/lib/multi-bar.js var require_multi_bar = __commonJS({ "node_modules/.pnpm/cli-progress@3.12.0/node_modules/cli-progress/lib/multi-bar.js"(exports, module2) { var _Terminal = require_terminal(); var _BarElement = require_generic_bar(); var _options = require_options(); var _EventEmitter = require("events"); module2.exports = class MultiBar extends _EventEmitter { constructor(options, preset) { super(); this.bars = []; this.options = _options.parse(options, preset); this.options.synchronousUpdate = false; this.terminal = this.options.terminal ? this.options.terminal : new _Terminal(this.options.stream); this.timer = null; this.isActive = false; this.schedulingRate = this.terminal.isTTY() ? this.options.throttleTime : this.options.notTTYSchedule; this.loggingBuffer = []; this.sigintCallback = null; } // add a new bar to the stack create(total, startValue, payload, barOptions = {}) { const bar = new _BarElement(Object.assign( {}, // global options this.options, // terminal instance { terminal: this.terminal }, // overrides barOptions )); this.bars.push(bar); if (this.options.noTTYOutput === false && this.terminal.isTTY() === false) { return bar; } if (this.sigintCallback === null && this.options.gracefulExit) { this.sigintCallback = this.stop.bind(this); process.once("SIGINT", this.sigintCallback); process.once("SIGTERM", this.sigintCallback); } if (!this.isActive) { if (this.options.hideCursor === true) { this.terminal.cursor(false); } if (this.options.linewrap === false) { this.terminal.lineWrapping(false); } this.timer = setTimeout(this.update.bind(this), this.schedulingRate); } this.isActive = true; bar.start(total, startValue, payload); this.emit("start"); return bar; } // remove a bar from the stack remove(bar) { const index = this.bars.indexOf(bar); if (index < 0) { return false; } this.bars.splice(index, 1); this.update(); this.terminal.newline(); this.terminal.clearBottom(); return true; } // internal update routine update() { if (this.timer) { clearTimeout(this.timer); this.timer = null; } this.emit("update-pre"); this.terminal.cursorRelativeReset(); this.emit("redraw-pre"); if (this.loggingBuffer.length > 0) { this.terminal.clearLine(); while (this.loggingBuffer.length > 0) { this.terminal.write(this.loggingBuffer.shift(), true); } } for (let i = 0; i < this.bars.length; i++) { if (i > 0) { this.terminal.newline(); } this.bars[i].render(); } this.emit("redraw-post"); if (this.options.noTTYOutput && this.terminal.isTTY() === false) { this.terminal.newline(); this.terminal.newline(); } this.timer = setTimeout(this.update.bind(this), this.schedulingRate); this.emit("update-post"); if (this.options.stopOnComplete && !this.bars.find((bar) => bar.isActive)) { this.stop(); } } stop() { clearTimeout(this.timer); this.timer = null; if (this.sigintCallback) { process.removeListener("SIGINT", this.sigintCallback); process.removeListener("SIGTERM", this.sigintCallback); this.sigintCallback = null; } this.isActive = false; if (this.options.hideCursor === true) { this.terminal.cursor(true); } if (this.options.linewrap === false) { this.terminal.lineWrapping(true); } this.terminal.cursorRelativeReset(); this.emit("stop-pre-clear"); if (this.options.clearOnComplete) { this.terminal.clearBottom(); } else { for (let i = 0; i < this.bars.length; i++) { if (i > 0) { this.terminal.newline(); } this.bars[i].render(); this.bars[i].stop(); } this.terminal.newline(); } this.emit("stop"); } log(s) { this.loggingBuffer.push(s); } }; } }); // node_modules/.pnpm/cli-progress@3.12.0/node_modules/cli-progress/presets/legacy.js var require_legacy = __commonJS({ "node_modules/.pnpm/cli-progress@3.12.0/node_modules/cli-progress/presets/legacy.js"(exports, module2) { module2.exports = { format: "progress [{bar}] {percentage}% | ETA: {eta}s | {value}/{total}", barCompleteChar: "=", barIncompleteChar: "-" }; } }); // node_modules/.pnpm/cli-progress@3.12.0/node_modules/cli-progress/presets/shades-classic.js var require_shades_classic = __commonJS({ "node_modules/.pnpm/cli-progress@3.12.0/node_modules/cli-progress/presets/shades-classic.js"(exports, module2) { module2.exports = { format: " {bar} {percentage}% | ETA: {eta}s | {value}/{total}", barCompleteChar: "\u2588", barIncompleteChar: "\u2591" }; } }); // node_modules/.pnpm/cli-progress@3.12.0/node_modules/cli-progress/presets/shades-grey.js var require_shades_grey = __commonJS({ "node_modules/.pnpm/cli-progress@3.12.0/node_modules/cli-progress/presets/shades-grey.js"(exports, module2) { module2.exports = { format: " \x1B[90m{bar}\x1B[0m {percentage}% | ETA: {eta}s | {value}/{total}", barCompleteChar: "\u2588", barIncompleteChar: "\u2591" }; } }); // node_modules/.pnpm/cli-progress@3.12.0/node_modules/cli-progress/presets/rect.js var require_rect = __commonJS({ "node_modules/.pnpm/cli-progress@3.12.0/node_modules/cli-progress/presets/rect.js"(exports, module2) { module2.exports = { format: " {bar}\u25A0 {percentage}% | ETA: {eta}s | {value}/{total}", barCompleteChar: "\u25A0", barIncompleteChar: " " }; } }); // node_modules/.pnpm/cli-progress@3.12.0/node_modules/cli-progress/presets/index.js var require_presets = __commonJS({ "node_modules/.pnpm/cli-progress@3.12.0/node_modules/cli-progress/presets/index.js"(exports, module2) { var _legacy = require_legacy(); var _shades_classic = require_shades_classic(); var _shades_grey = require_shades_grey(); var _rect = require_rect(); module2.exports = { legacy: _legacy, shades_classic: _shades_classic, shades_grey: _shades_grey, rect: _rect }; } }); // node_modules/.pnpm/cli-progress@3.12.0/node_modules/cli-progress/cli-progress.js var require_cli_progress = __commonJS({ "node_modules/.pnpm/cli-progress@3.12.0/node_modules/cli-progress/cli-progress.js"(exports, module2) { var _SingleBar = require_single_bar(); var _MultiBar = require_multi_bar(); var _Presets = require_presets(); var _Formatter = require_formatter(); var _defaultFormatValue = require_format_value(); var _defaultFormatBar = require_format_bar(); var _defaultFormatTime = require_format_time(); module2.exports = { Bar: _SingleBar, SingleBar: _SingleBar, MultiBar: _MultiBar, Presets: _Presets, Format: { Formatter: _Formatter, BarFormat: _defaultFormatBar, ValueFormat: _defaultFormatValue, TimeFormat: _defaultFormatTime } }; } }); // cli.ts var import_node_util = require("util"); // src/utils/typedEntries.ts function typedEntries(obj) { return Object.entries(obj); } // src/lib/cache-management.ts var import_node_os = require("os"); var import_node_path = require("path"); var import_promises = require("fs/promises"); // src/consts.ts var HUB_URL = "https://huggingface.co"; // src/error.ts async function createApiError(response, opts) { const error = new HubApiError(response.url, response.status, response.headers.get("X-Request-Id") ?? opts?.requestId); error.message = `Api error with status ${error.statusCode}${opts?.message ? `. ${opts.message}` : ""}`; const trailer = [`URL: ${error.url}`, error.requestId ? `Request ID: ${error.requestId}` : void 0].filter(Boolean).join(". "); if (response.headers.get("Content-Type")?.startsWith("application/json")) { const json = await response.json(); error.message = json.error || json.message || error.message; if (json.error_description) { error.message = error.message ? error.message + `: ${json.error_description}` : json.error_description; } error.data = json; } else { error.data = { message: await response.text() }; } error.message += `. ${trailer}`; throw error; } var HubApiError = class extends Error { statusCode; url; requestId; data; constructor(url, statusCode, requestId, message) { super(message); this.statusCode = statusCode; this.requestId = requestId; this.url = url; } }; var InvalidApiResponseFormatError = class extends Error { }; // src/utils/checkCredentials.ts function checkAccessToken(accessToken) { if (!accessToken.startsWith("hf_")) { throw new TypeError("Your access token must start with 'hf_'"); } } function checkCredentials(params) { if (params.accessToken) { checkAccessToken(params.accessToken); return params.accessToken; } if (params.credentials?.accessToken) { checkAccessToken(params.credentials.accessToken); return params.credentials.accessToken; } } // src/utils/toRepoId.ts function toRepoId(repo) { if (typeof repo !== "string") { return repo; } if (repo.startsWith("model/") || repo.startsWith("models/")) { throw new TypeError( "A repo designation for a model should not start with 'models/', directly specify the model namespace / name" ); } if (repo.startsWith("space/")) { throw new TypeError("Spaces should start with 'spaces/', plural, not 'space/'"); } if (repo.startsWith("dataset/")) { throw new TypeError("Datasets should start with 'datasets/', plural, not 'dataset/'"); } if (repo.startsWith("bucket/")) { throw new TypeError("Buckets should start with 'buckets/', plural, not 'bucket/'"); } const slashes = repo.split("/").length - 1; if (repo.startsWith("spaces/")) { if (slashes !== 2) { throw new TypeError("Space Id must include namespace and name of the space"); } return { type: "space", name: repo.slice("spaces/".length) }; } if (repo.startsWith("datasets/")) { if (slashes > 2) { throw new TypeError("Too many slashes in repo designation: " + repo); } return { type: "dataset", name: repo.slice("datasets/".length) }; } if (repo.startsWith("buckets/")) { if (slashes !== 2) { throw new TypeError("Bucket Id must include namespace and name of the bucket"); } return { type: "bucket", name: repo.slice("buckets/".length) }; } if (slashes > 1) { throw new TypeError("Too many slashes in repo designation: " + repo); } return { type: "model", name: repo }; } // src/utils/range.ts function range(n, b) { return b ? Array(b - n).fill(0).map((_, i) => n + i) : Array(n).fill(0).map((_, i) => i); } // src/utils/chunk.ts function chunk(arr, chunkSize) { if (isNaN(chunkSize) || chunkSize < 1) { throw new RangeError("Invalid chunk size: " + chunkSize); } if (!arr.length) { return []; } if (arr.length <= chunkSize) { return [arr]; } return range(Math.ceil(arr.length / chunkSize)).map((i) => { return arr.slice(i * chunkSize, (i + 1) * chunkSize); }); } // src/utils/promisesQueue.ts async function promisesQueue(factories, concurrency) { const results = []; const executing = /* @__PURE__ */ new Set(); let index = 0; for (const factory of factories) { const closureIndex = index++; const e = factory().then((r) => { results[closureIndex] = r; executing.delete(e); }); executing.add(e); if (executing.size >= concurrency) { await Promise.race(executing); } } await Promise.all(executing); return results; } // src/utils/promisesQueueStreaming.ts async function promisesQueueStreaming(factories, concurrency) { const executing = []; for await (const factory of factories) { const e = factory().then(() => { executing.splice(executing.indexOf(e), 1); }); executing.push(e); if (executing.length >= concurrency) { await Promise.race(executing); } } await Promise.all(executing); } // src/utils/eventToGenerator.ts async function* eventToGenerator(cb) { const promises = []; function addPromise() { let resolve3; let reject; const p = new Promise((res, rej) => { resolve3 = res; reject = rej; }); promises.push({ p, resolve: resolve3, reject }); } addPromise(); const callbackRes = Promise.resolve().then( () => cb( (y) => { addPromise(); promises.at(-2)?.resolve({ done: false, value: y }); }, (r) => { addPromise(); promises.at(-2)?.resolve({ done: true, value: r }); }, (err) => promises.shift()?.reject(err) ) ).catch((err) => promises.shift()?.reject(err)); while (1) { const p = promises[0]; if (!p) { throw new Error("Logic error in eventGenerator, promises should never be empty"); } const result = await p.p; promises.shift(); if (result.done) { await callbackRes; return result.value; } yield result.value; } throw new Error("Unreachable"); } // src/utils/hexFromBytes.ts function hexFromBytes(arr) { if (globalThis.Buffer) { return globalThis.Buffer.from(arr).toString("hex"); } else { const bin = []; arr.forEach((byte) => { bin.push(byte.toString(16).padStart(2, "0")); }); return bin.join(""); } } // src/utils/isBackend.ts var isBrowser = typeof window !== "undefined" && typeof window.document !== "undefined"; var isWebWorker = typeof self === "object" && self.constructor && self.constructor.name === "DedicatedWorkerGlobalScope"; var isBackend = !isBrowser && !isWebWorker; // src/utils/isFrontend.ts var isFrontend = !isBackend; // src/utils/sha256.ts async function getWebWorkerCode() { const sha256Module = await Promise.resolve().then(() => (init_sha256_wrapper(), sha256_wrapper_exports)); return URL.createObjectURL(new Blob([sha256Module.createSHA256WorkerCode()])); } var pendingWorkers = []; var runningWorkers = /* @__PURE__ */ new Set(); var resolve; var waitPromise = new Promise((r) => { resolve = r; }); async function getWorker(poolSize) { { const worker2 = pendingWorkers.pop(); if (worker2) { runningWorkers.add(worker2); return worker2; } } if (!poolSize) { const worker2 = new Worker(await getWebWorkerCode()); runningWorkers.add(worker2); return worker2; } if (poolSize <= 0) { throw new TypeError("Invalid webworker pool size: " + poolSize); } while (runningWorkers.size >= poolSize) { await waitPromise; } const worker = new Worker(await getWebWorkerCode()); runningWorkers.add(worker); return worker; } async function freeWorker(worker, poolSize) { if (!poolSize) { return destroyWorker(worker); } runningWorkers.delete(worker); pendingWorkers.push(worker); const r = resolve; waitPromise = new Promise((r2) => { resolve = r2; }); r(); } function destroyWorker(worker) { runningWorkers.delete(worker); worker.terminate(); const r = resolve; waitPromise = new Promise((r2) => { resolve = r2; }); r(); } async function* sha256(buffer, opts) { yield 0; const maxCryptoSize = typeof opts?.useWebWorker === "object" && opts?.useWebWorker.minSize !== void 0 ? opts.useWebWorker.minSize : 1e7; if (buffer.size < maxCryptoSize && globalThis.crypto?.subtle) { const res = hexFromBytes( new Uint8Array( await globalThis.crypto.subtle.digest("SHA-256", buffer instanceof Blob ? await buffer.arrayBuffer() : buffer) ) ); yield 1; return res; } if (isFrontend) { if (opts?.useWebWorker) { try { const poolSize = typeof opts?.useWebWorker === "object" ? opts.useWebWorker.poolSize : void 0; const worker = await getWorker(poolSize); let messageHandler; let errorHandler; const cleanup = () => { worker.removeEventListener("message", messageHandler); worker.removeEventListener("error", errorHandler); }; return yield* eventToGenerator((yieldCallback, returnCallback, rejectCallback) => { messageHandler = (event) => { if (event.data.sha256) { cleanup(); freeWorker(worker, poolSize); returnCallback(event.data.sha256); } else if (event.data.progress) { yieldCallback(event.data.progress); try { opts.abortSignal?.throwIfAborted(); } catch (err) { cleanup(); destroyWorker(worker); rejectCallback(err); } } else { cleanup(); destroyWorker(worker); rejectCallback(event); } }; errorHandler = (event) => { cleanup(); destroyWorker(worker); rejectCallback(event.error); }; if (opts?.abortSignal) { try { opts.abortSignal?.throwIfAborted(); } catch (err) { cleanup(); destroyWorker(worker); rejectCallback(opts.abortSignal.reason ?? new DOMException("Aborted", "AbortError")); return; } const abortListener = () => { cleanup(); destroyWorker(worker); rejectCallback(opts.abortSignal?.reason ?? new DOMException("Aborted", "AbortError")); opts.abortSignal?.removeEventListener("abort", abortListener); }; opts.abortSignal.addEventListener("abort", abortListener); } worker.addEventListener("message", messageHandler); worker.addEventListener("error", errorHandler); worker.postMessage({ file: buffer }); }); } catch (err) { console.warn("Failed to use web worker for sha256", err); } } if (!wasmModule) { wasmModule = await Promise.resolve().then(() => (init_sha256_wrapper(), sha256_wrapper_exports)); } const sha2562 = await wasmModule.createSHA256(); sha2562.init(); const reader = buffer.stream().getReader(); const total = buffer.size; let bytesDone = 0; while (true) { const { done, value } = await reader.read(); if (done) { break; } sha2562.update(value); bytesDone += value.length; yield bytesDone / total; opts?.abortSignal?.throwIfAborted(); } return sha2562.digest("hex"); } if (!cryptoModule) { cryptoModule = await Promise.resolve().then(() => (init_sha256_node(), sha256_node_exports)); } return yield* cryptoModule.sha256Node(buffer, { abortSignal: opts?.abortSignal }); } var cryptoModule; var wasmModule; // src/utils/WebBlob.ts var WebBlob = class extends Blob { static async create(url, opts) { const customFetch = opts?.fetch ?? fetch; const response = await customFetch(url, { method: "HEAD", ...opts?.accessToken && { headers: { Authorization: `Bearer ${opts.accessToken}` } } }); const size = Number(response.headers.get("content-length")); const contentType = response.headers.get("content-type") || ""; const supportRange = response.headers.get("accept-ranges") === "bytes"; if (!supportRange || size < (opts?.cacheBelow ?? 1e6)) { return await (await customFetch(url)).blob(); } return new WebBlob(url, 0, size, contentType, true, customFetch, opts?.accessToken); } url; start; end; contentType; full; fetch; accessToken; constructor(url, start, end, contentType, full, customFetch, accessToken) { super([]); this.url = url; this.start = start; this.end = end; this.contentType = contentType; this.full = full; this.fetch = customFetch; this.accessToken = accessToken; } get size() { return this.end - this.start; } get type() { return this.contentType; } slice(start = 0, end = this.size) { if (start < 0 || end < 0) { new TypeError("Unsupported negative start/end on WebBlob.slice"); } const slice = new WebBlob( this.url, this.start + start, Math.min(this.start + end, this.end), this.contentType, start === 0 && end === this.size ? this.full : false, this.fetch, this.accessToken ); return slice; } async arrayBuffer() { const result = await this.fetchRange(); return result.arrayBuffer(); } async text() { const result = await this.fetchRange(); return result.text(); } stream() { const stream = new TransformStream(); this.fetchRange().then((response) => response.body?.pipeThrough(stream)).catch((error) => stream.writable.abort(error.message)); return stream.readable; } fetchRange() { const fetch2 = this.fetch; if (this.full) { return fetch2(this.url, { ...this.accessToken && { headers: { Authorization: `Bearer ${this.accessToken}` } } }).then((resp) => resp.ok ? resp : createApiError(resp)); } return fetch2(this.url, { headers: { Range: `bytes=${this.start}-${this.end - 1}`, ...this.accessToken && { Authorization: `Bearer ${this.accessToken}` } } }).then((resp) => resp.ok ? resp : createApiError(resp)); } }; // src/utils/base64FromBytes.ts function base64FromBytes(arr) { if (globalThis.Buffer) { return globalThis.Buffer.from(arr).toString("base64"); } else { const bin = []; arr.forEach((byte) => { bin.push(String.fromCharCode(byte)); }); return globalThis.btoa(bin.join("")); } } // src/utils/createBlobs.ts async function createBlobs(url, destPath, opts) { if (url.protocol === "http:" || url.protocol === "https:") { const blob = await WebBlob.create(url, { fetch: opts?.fetch, accessToken: opts?.accessToken }); return [{ path: destPath, blob }]; } if (isFrontend) { throw new TypeError(`Unsupported URL protocol "${url.protocol}"`); } if (url.protocol === "file:") { const { FileBlob: FileBlob2 } = await Promise.resolve().then(() => (init_FileBlob(), FileBlob_exports)); const { subPaths: subPaths2 } = await Promise.resolve().then(() => (init_sub_paths(), sub_paths_exports)); const paths = await subPaths2(url, opts?.maxFolderDepth); if (paths.length === 1 && paths[0].relativePath === ".") { const blob = await FileBlob2.create(url); return [{ path: destPath, blob }]; } return Promise.all( paths.map(async (path2) => ({ path: `${destPath}/${path2.relativePath}`.replace(/\/[.]$/, "").replaceAll("//", "/").replace(/^[.]?\//, ""), blob: await FileBlob2.create(new URL(path2.path)) })) ); } throw new TypeError(`Unsupported URL protocol "${url.protocol}"`); } // src/vendor/lz4js/util.ts function hashU32(a) { a = a | 0; a = a + 2127912214 + (a << 12) | 0; a = a ^ -949894596 ^ a >>> 19; a = a + 374761393 + (a << 5) | 0; a = a + -744332180 ^ a << 9; a = a + -42973499 + (a << 3) | 0; return a ^ -1252372727 ^ a >>> 16 | 0; } function readU32(b, n) { let x = 0; x |= b[n++] << 0; x |= b[n++] << 8; x |= b[n++] << 16; x |= b[n++] << 24; return x; } function writeU32(b, n, x) { b[n++] = x >> 0 & 255; b[n++] = x >> 8 & 255; b[n++] = x >> 16 & 255; b[n++] = x >> 24 & 255; } function imul(a, b) { const ah = a >>> 16; const al = a & 65535; const bh = b >>> 16; const bl = b & 65535; return al * bl + (ah * bl + al * bh << 16) | 0; } // src/vendor/lz4js/xxh32.ts var prime1 = 2654435761; var prime2 = 2246822519; var prime3 = 3266489917; var prime4 = 668265263; var prime5 = 374761393; function rotl32(x, r) { x = x | 0; r = r | 0; return x >>> (32 - r | 0) | x << r | 0; } function rotmul32(h, r, m) { h = h | 0; r = r | 0; m = m | 0; return imul(h >>> (32 - r | 0) | h << r, m) | 0; } function shiftxor32(h, s) { h = h | 0; s = s | 0; return h >>> s ^ h | 0; } function xxhapply(h, src, m0, s, m1) { return rotmul32(imul(src, m0) + h, s, m1); } function xxh1(h, src, index) { return rotmul32(h + imul(src[index], prime5), 11, prime1); } function xxh4(h, src, index) { return xxhapply(h, readU32(src, index), prime3, 17, prime4); } function xxh16(h, src, index) { return [ xxhapply(h[0], readU32(src, index + 0), prime2, 13, prime1), xxhapply(h[1], readU32(src, index + 4), prime2, 13, prime1), xxhapply(h[2], readU32(src, index + 8), prime2, 13, prime1), xxhapply(h[3], readU32(src, index + 12), prime2, 13, prime1) ]; } function xxh32(seed, src, index, len) { let h; const l = len; if (len >= 16) { h = [seed + prime1 + prime2, seed + prime2, seed, seed - prime1]; while (len >= 16) { h = xxh16(h, src, index); index += 16; len -= 16; } h = rotl32(h[0], 1) + rotl32(h[1], 7) + rotl32(h[2], 12) + rotl32(h[3], 18) + l; } else { h = seed + prime5 + len >>> 0; } while (len >= 4) { h = xxh4(h, src, index); index += 4; len -= 4; } while (len > 0) { h = xxh1(h, src, index); index++; len--; } h = shiftxor32(imul(shiftxor32(imul(shiftxor32(h, 15), prime2), 13), prime3), 16); return h >>> 0; } var hash = xxh32; // src/vendor/lz4js/index.ts var minMatch = 4; var matchSearchLimit = 12; var minTrailingLitterals = 5; var skipTrigger = 6; var hashSize = 1 << 16; var mlBits = 4; var mlMask = (1 << mlBits) - 1; var runBits = 4; var runMask = (1 << runBits) - 1; var blockBuf = makeBuffer(5 << 20); var hashTable = makeHashTable(); var magicNum = 407708164; var fdVersion = 64; var bsDefault = 7; var bsShift = 4; var bsMap = { 4: 65536, 5: 262144, 6: 1048576, 7: 4194304 }; function makeHashTable() { try { return new Uint32Array(hashSize); } catch (error) { const hashTable2 = new Array(hashSize); for (let i = 0; i < hashSize; i++) { hashTable2[i] = 0; } return hashTable2; } } function clearHashTable(table) { for (let i = 0; i < hashSize; i++) { table[i] = 0; } } function makeBuffer(size) { return new Uint8Array(size); } function sliceArray(array, start, end) { return array.slice(start, end); } function compressBound(n) { return n + n / 255 + 16 | 0; } function compressBlock(src, dst, sIndex, sLength, hashTable2) { let mIndex, mAnchor, mLength, mOffset, mStep; let literalCount, dIndex, sEnd, n; dIndex = 0; sEnd = sLength + sIndex; mAnchor = sIndex; let searchMatchCount = (1 << skipTrigger) + 3; while (sIndex <= sEnd - matchSearchLimit) { const seq = readU32(src, sIndex); let hash2 = hashU32(seq) >>> 0; hash2 = (hash2 >> 16 ^ hash2) >>> 0 & 65535; mIndex = hashTable2[hash2] - 1; hashTable2[hash2] = sIndex + 1; if (mIndex < 0 || sIndex - mIndex >>> 16 > 0 || readU32(src, mIndex) !== seq) { mStep = searchMatchCount++ >> skipTrigger; sIndex += mStep; continue; } searchMatchCount = (1 << skipTrigger) + 3; literalCount = sIndex - mAnchor; mOffset = sIndex - mIndex; sIndex += minMatch; mIndex += minMatch; mLength = sIndex; while (sIndex < sEnd - minTrailingLitterals && src[sIndex] === src[mIndex]) { sIndex++; mIndex++; } mLength = sIndex - mLength; const token = mLength < mlMask ? mLength : mlMask; if (literalCount >= runMask) { dst[dIndex++] = (runMask << mlBits) + token; for (n = literalCount - runMask; n >= 255; n -= 255) { dst[dIndex++] = 255; } dst[dIndex++] = n; } else { dst[dIndex++] = (literalCount << mlBits) + token; } for (let i = 0; i < literalCount; i++) { dst[dIndex++] = src[mAnchor + i]; } dst[dIndex++] = mOffset; dst[dIndex++] = mOffset >> 8; if (mLength >= mlMask) { for (n = mLength - mlMask; n >= 255; n -= 255) { dst[dIndex++] = 255; } dst[dIndex++] = n; } mAnchor = sIndex; } if (mAnchor === 0) { return 0; } literalCount = sEnd - mAnchor; if (literalCount >= runMask) { dst[dIndex++] = runMask << mlBits; for (n = literalCount - runMask; n >= 255; n -= 255) { dst[dIndex++] = 255; } dst[dIndex++] = n; } else { dst[dIndex++] = literalCount << mlBits; } sIndex = mAnchor; while (sIndex < sEnd) { dst[dIndex++] = src[sIndex++]; } return dIndex; } function compressFrame(src, dst) { let dIndex = 0; writeU32(dst, dIndex, magicNum); dIndex += 4; dst[dIndex++] = fdVersion; dst[dIndex++] = bsDefault << bsShift; dst[dIndex] = hash(0, dst, 4, dIndex - 4) >> 8; dIndex++; const maxBlockSize = bsMap[bsDefault]; let remaining = src.length; let sIndex = 0; clearHashTable(hashTable); while (remaining > 0) { let compSize = 0; const blockSize = remaining > maxBlockSize ? maxBlockSize : remaining; compSize = compressBlock(src, blockBuf, sIndex, blockSize, hashTable); if (compSize > blockSize || compSize === 0) { writeU32(dst, dIndex, 2147483648 | blockSize); dIndex += 4; for (let z = sIndex + blockSize; sIndex < z; ) { dst[dIndex++] = src[sIndex++]; } remaining -= blockSize; } else { writeU32(dst, dIndex, compSize); dIndex += 4; for (let j = 0; j < compSize; ) { dst[dIndex++] = blockBuf[j++]; } sIndex += blockSize; remaining -= blockSize; } } writeU32(dst, dIndex, 0); dIndex += 4; return dIndex; } function compress(src, maxSize) { let dst, size; if (maxSize === void 0) { maxSize = compressBound(src.length); } dst = makeBuffer(maxSize); size = compressFrame(src, dst); if (size !== maxSize) { dst = sliceArray(dst, 0, size); } return dst; } // src/utils/XetBlob.ts var XET_CHUNK_HEADER_BYTES = 8; function bg4_split_bytes(bytes) { const ret = new Uint8Array(bytes.byteLength); const split = Math.floor(bytes.byteLength / 4); const rem = bytes.byteLength % 4; const g1_pos = split + (rem >= 1 ? 1 : 0); const g2_pos = g1_pos + split + (rem >= 2 ? 1 : 0); const g3_pos = g2_pos + split + (rem == 3 ? 1 : 0); for (let i = 0, j = 0; i < bytes.byteLength; i += 4, j++) { ret[j] = bytes[i]; } for (let i = 1, j = g1_pos; i < bytes.byteLength; i += 4, j++) { ret[j] = bytes[i]; } for (let i = 2, j = g2_pos; i < bytes.byteLength; i += 4, j++) { ret[j] = bytes[i]; } for (let i = 3, j = g3_pos; i < bytes.byteLength; i += 4, j++) { ret[j] = bytes[i]; } return ret; } // src/utils/ChunkCache.ts var CHUNK_CACHE_INITIAL_SIZE = 1e4; var CHUNK_CACHE_GROW_FACTOR = 1.5; var CHUNK_CACHE_MAX_SIZE = 1e6; var ChunkCache = class { index = 0; // Index >= 0 means local xorb, < 0 means remote xorb xorbIndices; // Max 8K chunks per xorb, less than 64K uint16_t chunkIndices; map = /* @__PURE__ */ new Map(); // hash -> chunkCacheIndex. Less overhead that way, empty object is 60+B and empty array is 40+B hmacs = /* @__PURE__ */ new Set(); // todo : remove old hmacs maxSize; constructor(maxSize = CHUNK_CACHE_MAX_SIZE) { if (maxSize < 1) { throw new Error("maxSize must be at least 1"); } this.maxSize = maxSize; this.xorbIndices = new Int32Array(Math.min(CHUNK_CACHE_INITIAL_SIZE, maxSize)); this.chunkIndices = new Uint16Array(Math.min(CHUNK_CACHE_INITIAL_SIZE, maxSize)); } addChunkToCache(hash2, xorbIndex, chunkIndex, hmac) { if (this.map.has(hash2)) { return; } if (this.map.values().next().value === this.index) { this.map.delete(this.map.keys().next().value); } this.map.set(hash2, this.index); if (hmac !== null) { this.hmacs.add(hmac); } if (this.index >= this.xorbIndices.length) { const oldXorbIndices = this.xorbIndices; const oldChunkIndices = this.chunkIndices; this.xorbIndices = new Int32Array(Math.min(this.xorbIndices.length * CHUNK_CACHE_GROW_FACTOR, this.maxSize)); this.chunkIndices = new Uint16Array(Math.min(this.chunkIndices.length * CHUNK_CACHE_GROW_FACTOR, this.maxSize)); this.xorbIndices.set(oldXorbIndices); this.chunkIndices.set(oldChunkIndices); } this.xorbIndices[this.index] = xorbIndex; this.chunkIndices[this.index] = chunkIndex; this.index = (this.index + 1) % this.maxSize; } getChunk(hash2, hmacFunction) { let index = this.map.get(hash2); if (index === void 0 && hmacFunction !== null) { for (const hmac of this.hmacs) { index = this.map.get(hmacFunction(hash2, hmac)); if (index !== void 0) { break; } } } if (index === void 0) { return void 0; } return { xorbIndex: this.xorbIndices[index], chunkIndex: this.chunkIndices[index] }; } updateChunkIndex(hash2, chunkIndex) { const index = this.map.get(hash2); if (index === void 0) { throw new Error(`Chunk not found in cache: ${hash2}`); } this.chunkIndices[index] = chunkIndex; } removeChunkFromCache(hash2) { this.map.delete(hash2); } }; // src/utils/xetWriteToken.ts var JWT_SAFETY_PERIOD = 6e4; var JWT_CACHE_SIZE = 1e3; var jwtPromises = /* @__PURE__ */ new Map(); var jwts = /* @__PURE__ */ new Map(); async function xetWriteToken(params) { if (params.xetParams.expiresAt && params.xetParams.casUrl && params.xetParams.accessToken && params.xetParams.expiresAt > new Date(Date.now() + JWT_SAFETY_PERIOD)) { return { accessToken: params.xetParams.accessToken, casUrl: params.xetParams.casUrl }; } const key = params.xetParams.refreshWriteTokenUrl; const jwt = jwts.get(key); if (jwt && jwt.expiresAt > new Date(Date.now() + JWT_SAFETY_PERIOD)) { return { accessToken: jwt.accessToken, casUrl: jwt.casUrl }; } const existingPromise = jwtPromises.get(key); if (existingPromise) { return existingPromise; } const promise = (async () => { const resp = await (params.fetch ?? fetch)(params.xetParams.refreshWriteTokenUrl, { headers: { ...params.accessToken ? { Authorization: `Bearer ${params.accessToken}` } : {}, ...params.xetParams.sessionId ? { "X-Xet-Session-Id": params.xetParams.sessionId } : {} } }); if (!resp.ok) { throw await createApiError(resp); } const json = await resp.json(); const jwt2 = { accessToken: json.accessToken, expiresAt: new Date(json.exp * 1e3), casUrl: json.casUrl }; jwtPromises.delete(key); for (const [key2, value] of jwts.entries()) { if (value.expiresAt < new Date(Date.now() + JWT_SAFETY_PERIOD)) { jwts.delete(key2); } else { break; } } if (jwts.size >= JWT_CACHE_SIZE) { const keyToDelete = jwts.keys().next().value; if (keyToDelete) { jwts.delete(keyToDelete); } } jwts.set(key, jwt2); return { accessToken: json.accessToken, casUrl: json.casUrl }; })(); jwtPromises.set(key, promise); return promise; } // src/utils/shardParser.ts var HASH_LENGTH = 32; var XORB_HASH_BOOKEND = "ff".repeat(HASH_LENGTH); function readHashFromArray(array, offset) { let hash2 = ""; for (let i = 0; i < HASH_LENGTH; i += 8) { hash2 += `${array[offset + i + 7].toString(16).padStart(2, "0")}${array[offset + i + 6].toString(16).padStart(2, "0")}${array[offset + i + 5].toString(16).padStart(2, "0")}${array[offset + i + 4].toString(16).padStart(2, "0")}${array[offset + i + 3].toString(16).padStart(2, "0")}${array[offset + i + 2].toString(16).padStart(2, "0")}${array[offset + i + 1].toString(16).padStart(2, "0")}${array[offset + i].toString(16).padStart(2, "0")}`; } return hash2; } async function parseShardData(shardBlob) { const shard = new Uint8Array(await shardBlob.arrayBuffer()); const shardView = new DataView(shard.buffer); const magicTag = shard.slice(0, SHARD_MAGIC_TAG.length); if (!magicTag.every((byte, i) => byte === SHARD_MAGIC_TAG[i])) { throw new Error("Invalid shard magic tag"); } const version2 = shardView.getBigUint64(SHARD_MAGIC_TAG.length, true); if (version2 !== SHARD_HEADER_VERSION) { throw new Error(`Invalid shard version: ${version2}`); } const footerSize = Number(shardView.getBigUint64(SHARD_MAGIC_TAG.length + 8, true)); const footerStart = shard.length - footerSize; const footerVersion = shardView.getBigUint64(footerStart, true); if (footerVersion !== SHARD_FOOTER_VERSION) { throw new Error(`Invalid shard footer version: ${footerVersion}`); } const xorbInfoStart = Number(shardView.getBigUint64(footerStart + 16, true)); const fileLookupStart = Number(shardView.getBigUint64(footerStart + 24, true)); const hmacKey = readHashFromArray(shard, footerStart + 72); const xorbs = []; let offset = xorbInfoStart; while (offset < fileLookupStart) { const xorbHash = readHashFromArray(shard, offset); offset += HASH_LENGTH; if (xorbHash === XORB_HASH_BOOKEND) { break; } offset += 4; const chunkCount = shardView.getUint32(offset, true); offset += 4; offset += 4; offset += 4; const chunks = []; for (let i = 0; i < chunkCount; i++) { const chunkHash = readHashFromArray(shard, offset); offset += HASH_LENGTH; const startOffset = shardView.getUint32(offset, true); offset += 4; const length = shardView.getUint32(offset, true); offset += 4; offset += 8; chunks.push({ hash: chunkHash, startOffset, unpackedLength: length }); } xorbs.push({ hash: xorbHash, chunks }); } return { hmacKey, xorbs }; } // src/utils/sum.ts function sum(arr) { return arr.reduce((a, b) => a + b, 0); } // src/utils/SplicedBlob.ts var SplicedBlob = class extends Blob { originalBlob; spliceOperations; constructor(originalBlob, spliceOperations) { super(); this.originalBlob = originalBlob; this.spliceOperations = spliceOperations; } static create(originalBlob, operations) { for (const op of operations) { if (op.start < 0 || op.end < 0) { throw new Error("Invalid start/end positions for SplicedBlob"); } if (op.start > originalBlob.size || op.end > originalBlob.size) { throw new Error("Invalid start/end positions for SplicedBlob"); } if (op.start > op.end) { throw new Error("Invalid start/end positions for SplicedBlob"); } } const sortedOps = [...operations].sort((a, b) => a.start - b.start); for (let i = 0; i < sortedOps.length - 1; i++) { if (sortedOps[i].end > sortedOps[i + 1].start) { throw new Error("Overlapping splice operations are not supported"); } } return new SplicedBlob(originalBlob, sortedOps); } /** * Returns the size of the spliced blob. * Size = original size - total replaced size + total insert size */ get size() { let totalReplacedSize = 0; let totalInsertSize = 0; for (const op of this.spliceOperations) { totalReplacedSize += op.end - op.start; totalInsertSize += op.insert.size; } return this.originalBlob.size - totalReplacedSize + totalInsertSize; } /** * Returns the MIME type of the original blob. */ get type() { return this.originalBlob.type; } /** * Returns a new instance of SplicedBlob that is a slice of the current one. * * The slice is inclusive of the start and exclusive of the end. * The slice method does not support negative start/end. * * @param start beginning of the slice * @param end end of the slice */ slice(start = 0, end = this.size) { if (start < 0 || end < 0) { throw new TypeError("Unsupported negative start/end on SplicedBlob.slice"); } start = Math.min(start, this.size); end = Math.min(end, this.size); if (start >= end) { return new Blob([]); } const segments = this.segments; const segmentBoundaries = [0]; let cumulativeSize = 0; for (const segment of segments) { cumulativeSize += segment.size; segmentBoundaries.push(cumulativeSize); } const resultSegments = []; for (let i = 0; i < segments.length; i++) { const segmentStart = segmentBoundaries[i]; const segmentEnd = segmentBoundaries[i + 1]; if (segmentEnd <= start) { continue; } if (segmentStart >= end) { break; } const sliceStart = Math.max(0, start - segmentStart); const sliceEnd = Math.min(segments[i].size, end - segmentStart); if (sliceStart < sliceEnd) { resultSegments.push(segments[i].slice(sliceStart, sliceEnd)); } } return new Blob(resultSegments); } get firstSpliceIndex() { return this.spliceOperations[0]?.start ?? Infinity; } /** * Read the spliced blob content and returns it as an ArrayBuffer. */ async arrayBuffer() { const segments = this.segments; const buffers = await Promise.all(segments.map((segment) => segment.arrayBuffer())); const totalSize = sum(buffers.map((buffer) => buffer.byteLength)); const result = new Uint8Array(totalSize); let offset = 0; for (const buffer of buffers) { result.set(new Uint8Array(buffer), offset); offset += buffer.byteLength; } return result.buffer; } /** * Read the spliced blob content and returns it as a string. */ async text() { const buffer = await this.arrayBuffer(); return new TextDecoder().decode(buffer); } /** * Returns a stream around the spliced blob content. */ stream() { const readable = new ReadableStream({ start: async (controller) => { try { const segments = this.segments; for (const segment of segments) { const reader = segment.stream().getReader(); try { while (true) { const { done, value } = await reader.read(); if (done) { break; } controller.enqueue(value); } } finally { reader.releaseLock(); } } controller.close(); } catch (error) { controller.error(error); } } }); return readable; } /** * Get all segments that make up the spliced blob. * This includes original blob segments between splice operations and insert blobs. */ get segments() { const segments = []; let currentPosition = 0; const sortedOps = [...this.spliceOperations].sort((a, b) => a.start - b.start); for (const op of sortedOps) { if (currentPosition < op.start) { segments.push(this.originalBlob.slice(currentPosition, op.start)); } if (op.insert.size > 0) { segments.push(op.insert); } currentPosition = op.end; } if (currentPosition < this.originalBlob.size) { segments.push(this.originalBlob.slice(currentPosition)); } return segments; } }; // src/utils/createXorbs.ts var TARGET_CHUNK_SIZE = 64 * 1024; var MAX_CHUNK_SIZE = 2 * TARGET_CHUNK_SIZE; var XORB_SIZE = 64 * 1024 * 1024; var MAX_XORB_CHUNKS = 8 * 1024; var INTERVAL_BETWEEN_REMOTE_DEDUP = 4e6; var PROCESSING_PROGRESS_RATIO = 0.1; var UPLOADING_PROGRESS_RATIO = 1 - PROCESSING_PROGRESS_RATIO; var CurrentXorbInfo = class { id; offset; chunks; fileProcessedBytes; fileUploadedBytes; fileSize; data; immutableData; constructor() { this.id = 0; this.offset = 0; this.chunks = []; this.fileProcessedBytes = {}; this.fileUploadedBytes = {}; this.fileSize = {}; this.data = new Uint8Array(XORB_SIZE); this.immutableData = null; } event(computeXorbHash) { const xorbChunksCleaned = this.chunks.map((chunk2) => ({ hash: chunk2.hash, length: chunk2.length })); return { event: "xorb", xorb: this.data.subarray(0, this.offset), hash: computeXorbHash(xorbChunksCleaned), chunks: xorbChunksCleaned, id: this.id, files: Object.entries(this.fileProcessedBytes).map(([path2, processedBytes]) => ({ path: path2, progress: processedBytes / this.fileSize[path2], lastSentProgress: ((this.fileUploadedBytes[path2] ?? 0) + (processedBytes - (this.fileUploadedBytes[path2] ?? 0)) * PROCESSING_PROGRESS_RATIO) / this.fileSize[path2] })) }; } }; async function* createXorbs(fileSources, params) { const alreadyDoneFileSha256s = /* @__PURE__ */ new Set(); const chunkModule = await Promise.resolve().then(() => (init_chunker_wasm(), chunker_wasm_exports)); let xorbId = 0; await chunkModule.init(); const chunkCache = new ChunkCache(); let xorb = new CurrentXorbInfo(); const nextXorb = (currentFile) => { const event = xorb.event(chunkModule.compute_xorb_hash.bind(chunkModule)); xorbId++; xorb = new CurrentXorbInfo(); xorb.id = xorbId; xorb.fileUploadedBytes = { [currentFile.path]: currentFile.uploadedBytes }; xorb.fileSize[currentFile.path] = currentFile.size; return event; }; const pendingFileEvents = []; const remoteXorbHashes = [""]; for await (const fileSource of fileSources) { params.yieldCallback?.({ event: "fileProgress", path: fileSource.path, progress: 0 }); if (fileSource.sha256 && alreadyDoneFileSha256s.has(fileSource.sha256)) { params.yieldCallback?.({ event: "fileProgress", path: fileSource.path, progress: 1 }); continue; } if (fileSource.sha256) { alreadyDoneFileSha256s.add(fileSource.sha256); } const chunker = new chunkModule.Chunker(TARGET_CHUNK_SIZE); try { xorb.fileSize[fileSource.path] = fileSource.content.size; if (fileSource.content instanceof SplicedBlob && fileSource.content.firstSpliceIndex < MAX_CHUNK_SIZE) { await loadDedupInfoToCache( fileSource.content.originalBlob.slice(0, MAX_CHUNK_SIZE), remoteXorbHashes, params, chunkCache, chunkModule, { maxChunks: 1, isAtBeginning: true } ); } let bytesSinceRemoteDedup = Infinity; let bytesSinceLastProgressEvent = 0; let isFirstFileChunk = true; const sourceChunks = []; const reader = fileSource.content.stream().getReader(); let processedBytes = 0; let dedupedBytes = 0; const fileChunks = []; const chunkMetadata = []; const addChunks = async function* (chunks) { for (const chunk2 of chunks) { if (isFirstFileChunk) { chunk2.dedup = true; isFirstFileChunk = false; } let chunkIndex = xorb.chunks.length; let chunkXorbId = xorbId; const chunkToCopy = removeChunkFromSourceData(sourceChunks, chunk2.length); let cacheData = chunkCache.getChunk(chunk2.hash, chunkModule.compute_hmac); if (cacheData === void 0 && chunk2.dedup && bytesSinceRemoteDedup >= INTERVAL_BETWEEN_REMOTE_DEDUP) { const token = await xetWriteToken(params); bytesSinceRemoteDedup = 0; const shardResp = await (params.fetch ?? fetch)(token.casUrl + "/v1/chunks/default/" + chunk2.hash, { headers: { Authorization: `Bearer ${token.accessToken}` } }); if (shardResp.ok) { const shard = await shardResp.blob(); const shardData = await parseShardData(shard); for (const xorb2 of shardData.xorbs) { const remoteXorbId = -remoteXorbHashes.length; remoteXorbHashes.push(xorb2.hash); let i = 0; for (const chunk3 of xorb2.chunks) { chunkCache.addChunkToCache(chunk3.hash, remoteXorbId, i++, shardData.hmacKey); } } cacheData = chunkCache.getChunk(chunk2.hash, chunkModule.compute_hmac); const oldDedupedBytes = dedupedBytes; dedupedBytes = backtrackDedup( xorb, chunkModule.compute_hmac.bind(chunkModule), shardData, chunkCache, chunkMetadata, dedupedBytes ); if (dedupedBytes > oldDedupedBytes) { xorb.fileUploadedBytes[fileSource.path] ??= 0; xorb.fileUploadedBytes[fileSource.path] += dedupedBytes - oldDedupedBytes; } } } if (cacheData === void 0) { if (!writeChunk(xorb, chunkToCopy, chunk2.hash)) { yield nextXorb({ path: fileSource.path, uploadedBytes: processedBytes, size: fileSource.content.size }); chunkIndex = 0; chunkXorbId = xorbId; for (const event of pendingFileEvents) { event.representation = event.representation.map((rep) => ({ ...rep, xorbId: rep.xorbId >= 0 ? rep.xorbId : remoteXorbHashes[-rep.xorbId] })); yield event; } pendingFileEvents.length = 0; if (!writeChunk(xorb, chunkToCopy, chunk2.hash)) { throw new Error("Failed to write chunk into xorb"); } } chunkCache.addChunkToCache(chunk2.hash, xorbId, chunkIndex, null); } else { chunkXorbId = cacheData.xorbIndex; chunkIndex = cacheData.chunkIndex; dedupedBytes += chunk2.length; xorb.fileUploadedBytes[fileSource.path] ??= 0; xorb.fileUploadedBytes[fileSource.path] += chunk2.length; } bytesSinceRemoteDedup += chunk2.length; bytesSinceLastProgressEvent += chunk2.length; fileChunks.push({ hash: chunk2.hash, length: chunk2.length }); chunkMetadata.push({ xorbId: chunkXorbId, chunkIndex, length: chunk2.length }); xorb.fileProcessedBytes[fileSource.path] = processedBytes; if (bytesSinceLastProgressEvent >= 1e6) { bytesSinceLastProgressEvent = 0; params.yieldCallback?.({ event: "fileProgress", path: fileSource.path, progress: ((xorb.fileUploadedBytes[fileSource.path] ?? 0) + (xorb.fileProcessedBytes[fileSource.path] - (xorb.fileUploadedBytes[fileSource.path] ?? 0)) * PROCESSING_PROGRESS_RATIO) / fileSource.content.size }); } if (xorb.chunks.length >= MAX_XORB_CHUNKS) { yield nextXorb({ path: fileSource.path, uploadedBytes: processedBytes, size: fileSource.content.size }); for (const event of pendingFileEvents) { event.representation = event.representation.map((rep) => ({ ...rep, xorbId: rep.xorbId >= 0 ? rep.xorbId : remoteXorbHashes[-rep.xorbId] })); yield event; } pendingFileEvents.length = 0; } } }; while (true) { const { done, value } = await reader.read(); if (done) { yield* addChunks(chunker.finish()); break; } processedBytes += value.length; sourceChunks.push(value); yield* addChunks(chunker.add_data(value)); } const fileRepresentation = buildFileRepresentation( chunkMetadata, fileChunks, chunkModule.compute_verification_hash.bind(chunkModule) ); xorb.immutableData = { chunkIndex: xorb.chunks.length, offset: xorb.offset }; const dedupRatio = fileSource.content.size > 0 ? dedupedBytes / fileSource.content.size : 0; pendingFileEvents.push({ event: "file", path: fileSource.path, hash: chunkModule.compute_file_hash(fileChunks), sha256: fileSource.sha256, dedupRatio, representation: fileRepresentation }); } finally { chunker.free(); } } if (xorb.offset > 0) { yield xorb.event(chunkModule.compute_xorb_hash.bind(chunkModule)); } for (const event of pendingFileEvents) { event.representation = event.representation.map((rep) => ({ ...rep, xorbId: rep.xorbId >= 0 ? rep.xorbId : remoteXorbHashes[-rep.xorbId] })); yield event; } } function backtrackDedup(xorb, computeHmac, shardData, chunkCache, chunkMetadata, dedupedBytes) { const chunkIndexesToBacktrackFor = /* @__PURE__ */ new Map(); for (let chunkToRecheckIndex = xorb.immutableData?.chunkIndex ?? 0; chunkToRecheckIndex < xorb.chunks.length; chunkToRecheckIndex++) { const chunk2 = xorb.chunks[chunkToRecheckIndex]; const hmacHash = computeHmac(chunk2.hash, shardData.hmacKey); const cacheData = chunkCache.getChunk(hmacHash, null); if (cacheData !== void 0) { chunkIndexesToBacktrackFor.set(chunkToRecheckIndex, { xorbId: cacheData.xorbIndex, chunkIndex: cacheData.chunkIndex }); chunkCache.removeChunkFromCache(chunk2.hash); } } for (const metadata of chunkMetadata) { if (metadata.xorbId === xorb.id && chunkIndexesToBacktrackFor.has(metadata.chunkIndex)) { const backtrackData = chunkIndexesToBacktrackFor.get(metadata.chunkIndex); if (backtrackData !== void 0) { metadata.xorbId = backtrackData.xorbId; metadata.chunkIndex = backtrackData.chunkIndex; dedupedBytes += metadata.length; } } } const xorbRangesToErase = []; for (let i = 0; i < xorb.chunks.length; i++) { const chunk2 = xorb.chunks[i]; if (chunkIndexesToBacktrackFor.has(i)) { xorbRangesToErase.push({ start: chunk2.offset, end: i < xorb.chunks.length - 1 ? xorb.chunks[i + 1].offset : xorb.offset }); } } const xorbRangesToKeep = []; let currentStart = 0; for (let i = 0; i < xorbRangesToErase.length; i++) { const range2 = xorbRangesToErase[i]; if (currentStart !== range2.start) { xorbRangesToKeep.push({ start: currentStart, end: range2.start }); } currentStart = range2.end; } if (currentStart !== xorb.offset) { xorbRangesToKeep.push({ start: currentStart, end: xorb.offset }); } let currentOffset = 0; for (const range2 of xorbRangesToKeep) { if (range2.start !== currentOffset) { xorb.data.set(xorb.data.subarray(range2.start, range2.end), currentOffset); } currentOffset += range2.end - range2.start; } const newXorbChunks = []; const oldIndexToNewIndex = /* @__PURE__ */ new Map(); let erasedOffset = 0; for (let i = 0; i < xorb.chunks.length; i++) { const chunk2 = xorb.chunks[i]; if (chunkIndexesToBacktrackFor.has(i)) { if (i < xorb.chunks.length - 1) { erasedOffset += xorb.chunks[i + 1].offset - chunk2.offset; } } else { newXorbChunks.push({ hash: chunk2.hash, length: chunk2.length, offset: chunk2.offset - erasedOffset }); if (erasedOffset > 0) { oldIndexToNewIndex.set(i, newXorbChunks.length - 1); } } } xorb.chunks = newXorbChunks; xorb.offset = currentOffset; for (const chunk2 of chunkMetadata) { if (chunk2.xorbId === xorb.id) { const newIndex = oldIndexToNewIndex.get(chunk2.chunkIndex); if (newIndex !== void 0) { const cached = chunkCache.getChunk(xorb.chunks[newIndex].hash, null); if (cached !== void 0 && cached.xorbIndex === chunk2.xorbId && cached.chunkIndex === chunk2.chunkIndex) { chunkCache.updateChunkIndex(xorb.chunks[newIndex].hash, newIndex); } chunk2.chunkIndex = newIndex; } } } return dedupedBytes; } function removeChunkFromSourceData(sourceChunks, chunkLength) { if (chunkLength === sourceChunks[0].length) { const chunkToCopy = sourceChunks[0]; sourceChunks.shift(); return chunkToCopy; } else if (chunkLength < sourceChunks[0].length) { const chunkToCopy = sourceChunks[0].subarray(0, chunkLength); sourceChunks[0] = sourceChunks[0].subarray(chunkLength); return chunkToCopy; } else { const chunkToCopy = new Uint8Array(chunkLength); let copyOffset = 0; let index = 0; let toSlice = -1; while (copyOffset < chunkLength) { const nToCopy = Math.min(sourceChunks[index].length, chunkLength - copyOffset); chunkToCopy.set(sourceChunks[index].subarray(0, nToCopy), copyOffset); copyOffset += nToCopy; if (nToCopy === sourceChunks[index].length) { index++; } else { toSlice = nToCopy; } } sourceChunks.splice(0, index); if (toSlice !== -1) { sourceChunks[0] = sourceChunks[0].subarray(toSlice); } return chunkToCopy; } } function writeChunk(xorb, chunk2, hash2) { const regularCompressedChunk = compress(chunk2); const bgCompressedChunk = compress(bg4_split_bytes(chunk2)); const compressedChunk = bgCompressedChunk.length < regularCompressedChunk.length ? bgCompressedChunk : regularCompressedChunk; const chunkToWrite = compressedChunk.length < chunk2.length ? compressedChunk : chunk2; if (xorb.offset + XET_CHUNK_HEADER_BYTES + chunkToWrite.length > XORB_SIZE) { return false; } xorb.data[xorb.offset] = 0; xorb.data[xorb.offset + 1] = chunkToWrite.length & 255; xorb.data[xorb.offset + 2] = chunkToWrite.length >> 8 & 255; xorb.data[xorb.offset + 3] = chunkToWrite.length >> 16 & 255; xorb.data[xorb.offset + 4] = chunkToWrite.length < chunk2.length ? bgCompressedChunk.length < regularCompressedChunk.length ? 2 /* ByteGroupingLZ4 */ : 1 /* LZ4 */ : 0 /* None */; xorb.data[xorb.offset + 5] = chunk2.length & 255; xorb.data[xorb.offset + 6] = chunk2.length >> 8 & 255; xorb.data[xorb.offset + 7] = chunk2.length >> 16 & 255; xorb.data.set(chunkToWrite, xorb.offset + XET_CHUNK_HEADER_BYTES); xorb.chunks.push({ hash: hash2, length: chunk2.length, offset: xorb.offset }); xorb.offset += XET_CHUNK_HEADER_BYTES + chunkToWrite.length; return true; } var buildFileRepresentation = (metadata, chunks, computeVerificationHash) => { if (metadata.length === 0) { return []; } const representation = []; let currentRange = { xorbId: metadata[0].xorbId, indexStart: metadata[0].chunkIndex, indexEnd: metadata[0].chunkIndex + 1, length: metadata[0].length, chunkHashStart: 0 }; for (let i = 1; i < metadata.length; i++) { const chunk2 = metadata[i]; if (currentRange.xorbId === chunk2.xorbId && currentRange.indexEnd === chunk2.chunkIndex) { currentRange.indexEnd = chunk2.chunkIndex + 1; currentRange.length += chunk2.length; } else { const rangeHash2 = computeVerificationHash(chunks.slice(currentRange.chunkHashStart, i).map((x) => x.hash)); representation.push({ xorbId: currentRange.xorbId, indexStart: currentRange.indexStart, indexEnd: currentRange.indexEnd, length: currentRange.length, rangeHash: rangeHash2 }); currentRange = { xorbId: chunk2.xorbId, indexStart: chunk2.chunkIndex, indexEnd: chunk2.chunkIndex + 1, length: chunk2.length, chunkHashStart: i }; } } const rangeHash = computeVerificationHash(chunks.slice(currentRange.chunkHashStart).map((x) => x.hash)); representation.push({ xorbId: currentRange.xorbId, indexStart: currentRange.indexStart, indexEnd: currentRange.indexEnd, length: currentRange.length, rangeHash }); return representation; }; async function loadDedupInfoToCache(content, remoteXorbHashes, params, chunkCache, chunkModule, opts) { const chunker = new chunkModule.Chunker(TARGET_CHUNK_SIZE); const cache = chunkCache; let dedupedBytes = 0; let chunksProcessed = 0; let totalBytes = 0; let bytesSinceRemoteDedup = Infinity; const sourceChunks = []; try { const reader = content.stream().getReader(); const processChunks = async (chunkData) => { for (const chunk2 of chunkData) { chunksProcessed++; if (opts?.isAtBeginning && chunksProcessed === 1) { chunk2.dedup = true; } totalBytes += chunk2.length; removeChunkFromSourceData(sourceChunks, chunk2.length); let cacheData = cache.getChunk(chunk2.hash, chunkModule.compute_hmac); if (cacheData !== void 0) { dedupedBytes += chunk2.length; bytesSinceRemoteDedup += chunk2.length; continue; } if (chunk2.dedup && bytesSinceRemoteDedup >= INTERVAL_BETWEEN_REMOTE_DEDUP) { const token = await xetWriteToken(params); bytesSinceRemoteDedup = 0; const shardResp = await (params.fetch ?? fetch)(token.casUrl + "/v1/chunks/default/" + chunk2.hash, { headers: { Authorization: `Bearer ${token.accessToken}` } }); if (shardResp.ok) { const shard = await shardResp.blob(); const shardData = await parseShardData(shard); for (const xorb of shardData.xorbs) { const remoteXorbId = -remoteXorbHashes.length; remoteXorbHashes.push(xorb.hash); let i = 0; for (const xorbChunk of xorb.chunks) { cache.addChunkToCache(xorbChunk.hash, remoteXorbId, i++, shardData.hmacKey); } } cacheData = cache.getChunk(chunk2.hash, chunkModule.compute_hmac); } } if (cacheData !== void 0) { dedupedBytes += chunk2.length; } bytesSinceRemoteDedup += chunk2.length; } }; while (true) { if (opts?.end !== void 0 && totalBytes >= opts.end) { break; } if (opts?.maxChunks !== void 0 && chunksProcessed >= opts.maxChunks) { break; } const { done, value } = await reader.read(); if (done) { await processChunks(chunker.finish()); break; } sourceChunks.push(value); await processChunks(chunker.add_data(value)); } } finally { chunker.free(); } } // src/utils/uploadShards.ts var SHARD_MAX_SIZE = 64 * 1024 * 1024; var SHARD_HEADER_SIZE = 48; var SHARD_FOOTER_SIZE = 200; var HASH_LENGTH2 = 32; var XORB_FOOTER_LENGTH = 48; var FILE_FOOTER_LENGTH = 48; var SHARD_HEADER_VERSION = 2n; var SHARD_FOOTER_VERSION = 1n; var MDB_FILE_FLAG_WITH_VERIFICATION = 2147483648; var MDB_FILE_FLAG_WITH_METADATA_EXT = 1073741824; var EMPTY_HEX_HASH = "0".repeat(HASH_LENGTH2 * 2); var SHARD_MAGIC_TAG = new Uint8Array([ "H".charCodeAt(0), "F".charCodeAt(0), "R".charCodeAt(0), "e".charCodeAt(0), "p".charCodeAt(0), "o".charCodeAt(0), "M".charCodeAt(0), "e".charCodeAt(0), "t".charCodeAt(0), "a".charCodeAt(0), "D".charCodeAt(0), "a".charCodeAt(0), "t".charCodeAt(0), "a".charCodeAt(0), 0, 85, 105, 103, 69, 106, 123, 129, 87, 131, 165, 189, 217, 92, 205, 209, 74, 169 ]); async function* uploadShards(source, params) { const xorbHashes = []; const fileInfoSection = new Uint8Array(Math.floor(SHARD_MAX_SIZE - SHARD_HEADER_SIZE - SHARD_FOOTER_SIZE) * 0.25); const xorbInfoSection = new Uint8Array(Math.floor(SHARD_MAX_SIZE - SHARD_HEADER_SIZE - SHARD_FOOTER_SIZE) * 0.75); const xorbView = new DataView(xorbInfoSection.buffer); let xorbViewOffset = 0; const fileInfoView = new DataView(fileInfoSection.buffer); let fileViewOffset = 0; let xorbTotalSize = 0n; let fileTotalSize = 0n; let xorbTotalUnpackedSize = 0n; for await (const output of createXorbs(source, params)) { switch (output.event) { case "xorb": { xorbHashes.push(output.hash); const xorbEntrySize = HASH_LENGTH2 + 4 + 4 + 4 + 4; const chunksSize = output.chunks.length * (HASH_LENGTH2 + 4 + 4 + 8); const totalXorbSize = xorbEntrySize + chunksSize; if (xorbViewOffset + totalXorbSize > xorbInfoSection.length) { if (xorbViewOffset > 0 || fileViewOffset > 0) { await uploadShard(createShard(), params); } } writeHashToArray(output.hash, xorbInfoSection, xorbViewOffset); xorbViewOffset += HASH_LENGTH2; xorbView.setUint32(xorbViewOffset, 0, true); xorbViewOffset += 4; xorbView.setUint32(xorbViewOffset, output.chunks.length, true); xorbViewOffset += 4; const xorbUnpackedSize = sum(output.chunks.map((x) => x.length)); xorbView.setUint32(xorbViewOffset, xorbUnpackedSize, true); xorbTotalUnpackedSize += BigInt(xorbUnpackedSize); xorbTotalSize += BigInt(output.xorb.byteLength); xorbViewOffset += 4; xorbView.setUint32(xorbViewOffset, output.xorb.byteLength, true); xorbViewOffset += 4; let chunkBytes = 0; for (const chunk2 of output.chunks) { writeHashToArray(chunk2.hash, xorbInfoSection, xorbViewOffset); xorbViewOffset += HASH_LENGTH2; xorbView.setUint32(xorbViewOffset, chunkBytes, true); xorbViewOffset += 4; xorbView.setUint32(xorbViewOffset, chunk2.length, true); xorbViewOffset += 4; xorbView.setBigUint64(xorbViewOffset, 0n, true); xorbViewOffset += 8; chunkBytes += chunk2.length; } for (const file of output.files) { yield { event: "fileProgress", path: file.path, progress: file.lastSentProgress }; } await uploadXorb(output, params); for (const file of output.files) { yield { event: "fileProgress", path: file.path, progress: file.progress }; } break; } case "file": { yield { event: "file", path: output.path, xetHash: output.hash, sha256: output.sha256, dedupRatio: output.dedupRatio }; const fileHeaderSize = HASH_LENGTH2 + 4 + 4 + 8; const representationSize = output.representation.length * (HASH_LENGTH2 + 4 + 4 + 4 + 4); const verificationSize = output.representation.length * (HASH_LENGTH2 + 16); const metadataSize = HASH_LENGTH2 + 16; const totalFileSize = fileHeaderSize + representationSize + verificationSize + metadataSize; if (fileViewOffset + totalFileSize > fileInfoSection.length) { if (xorbViewOffset > 0 || fileViewOffset > 0) { await uploadShard(createShard(), params); } } writeHashToArray(output.hash, fileInfoSection, fileViewOffset); fileViewOffset += HASH_LENGTH2; fileInfoView.setUint32(fileViewOffset, MDB_FILE_FLAG_WITH_METADATA_EXT + MDB_FILE_FLAG_WITH_VERIFICATION, true); fileViewOffset += 4; fileInfoView.setUint32(fileViewOffset, output.representation.length, true); fileViewOffset += 4; fileInfoView.setBigUint64(fileViewOffset, 0n, true); fileViewOffset += 8; for (const repItem of output.representation) { writeHashToArray( typeof repItem.xorbId === "number" ? xorbHashes[repItem.xorbId] : repItem.xorbId, fileInfoSection, fileViewOffset ); fileViewOffset += HASH_LENGTH2; fileInfoView.setUint32(fileViewOffset, 0, true); fileViewOffset += 4; fileInfoView.setUint32(fileViewOffset, repItem.length, true); fileViewOffset += 4; fileInfoView.setUint32(fileViewOffset, repItem.indexStart, true); fileViewOffset += 4; fileInfoView.setUint32(fileViewOffset, repItem.indexEnd, true); fileViewOffset += 4; } for (const repItem of output.representation) { writeHashToArray(repItem.rangeHash, fileInfoSection, fileViewOffset); fileViewOffset += HASH_LENGTH2; for (let i = 0; i < 16; i++) { fileInfoSection[fileViewOffset + i] = 0; } fileViewOffset += 16; } writeHashToArray(output.sha256 ?? EMPTY_HEX_HASH, fileInfoSection, fileViewOffset); fileViewOffset += HASH_LENGTH2; for (let i = 0; i < 16; i++) { fileInfoSection[fileViewOffset + i] = 0; } fileViewOffset += 16; break; } } } function createShard() { const shard = new Uint8Array( SHARD_HEADER_SIZE + SHARD_FOOTER_SIZE + xorbViewOffset + XORB_FOOTER_LENGTH + fileViewOffset + FILE_FOOTER_LENGTH ); const shardView = new DataView(shard.buffer); let shardOffset = 0; shard.set(SHARD_MAGIC_TAG, shardOffset); shardOffset += SHARD_MAGIC_TAG.length; shardView.setBigUint64(shardOffset, SHARD_HEADER_VERSION, true); shardOffset += 8; shardView.setBigUint64(shardOffset, BigInt(SHARD_FOOTER_SIZE), true); shardOffset += 8; shard.set(fileInfoSection.slice(0, fileViewOffset), shardOffset); shardOffset += fileViewOffset; for (let i = 0; i < 32; i++) { shard[shardOffset + i] = 255; } shardOffset += 32; for (let i = 0; i < 16; i++) { shard[shardOffset + i] = 0; } shardOffset += 16; const xorbInfoOffset = shardOffset; shard.set(xorbInfoSection.slice(0, xorbViewOffset), shardOffset); shardOffset += xorbViewOffset; for (let i = 0; i < 32; i++) { shard[shardOffset + i] = 255; } shardOffset += 32; for (let i = 0; i < 16; i++) { shard[shardOffset + i] = 0; } shardOffset += 16; const footerOffset = shardOffset; shardView.setBigUint64(shardOffset, SHARD_FOOTER_VERSION, true); shardOffset += 8; shardView.setBigUint64(shardOffset, BigInt(SHARD_HEADER_SIZE), true); shardOffset += 8; shardView.setBigUint64(shardOffset, BigInt(xorbInfoOffset), true); shardOffset += 8; for (let i = 0; i < 48; i++) { shardView.setUint8(shardOffset + i, 0); } shardOffset += 48; for (let i = 0; i < 32; i++) { shardView.setUint8(shardOffset + i, 0); } shardOffset += 32; shardView.setBigUint64(shardOffset, BigInt(Math.floor(Date.now() / 1e3)), true); shardOffset += 8; shardView.setBigUint64(shardOffset, 0n, true); shardOffset += 8; for (let i = 0; i < 48; i++) { shardView.setUint8(shardOffset + i, 0); } shardOffset += 48; shardView.setBigUint64(shardOffset, xorbTotalSize, true); shardOffset += 8; shardView.setBigUint64(shardOffset, fileTotalSize, true); shardOffset += 8; shardView.setBigUint64(shardOffset, xorbTotalUnpackedSize, true); shardOffset += 8; shardView.setBigUint64(shardOffset, BigInt(footerOffset), true); xorbViewOffset = 0; fileViewOffset = 0; xorbTotalSize = 0n; xorbTotalUnpackedSize = 0n; fileTotalSize = 0n; return shard; } if (xorbViewOffset || fileViewOffset) { await uploadShard(createShard(), params); } } function writeHashToArray(hash2, array, offset) { for (let i = 0; i < hash2.length; i += 16) { array[offset + i / 2] = parseInt(hash2.substring(i + 2 * 7, i + 2 * 8), 16); array[offset + i / 2 + 1] = parseInt(hash2.substring(i + 2 * 6, i + 2 * 7), 16); array[offset + i / 2 + 2] = parseInt(hash2.substring(i + 2 * 5, i + 2 * 6), 16); array[offset + i / 2 + 3] = parseInt(hash2.substring(i + 2 * 4, i + 2 * 5), 16); array[offset + i / 2 + 4] = parseInt(hash2.substring(i + 2 * 3, i + 2 * 4), 16); array[offset + i / 2 + 5] = parseInt(hash2.substring(i + 2 * 2, i + 2 * 3), 16); array[offset + i / 2 + 6] = parseInt(hash2.substring(i + 2 * 1, i + 2 * 2), 16); array[offset + i / 2 + 7] = parseInt(hash2.substring(i + 2 * 0, i + 2 * 1), 16); } } async function uploadXorb(xorb, params) { const token = await xetWriteToken(params); const resp = await (params.fetch ?? fetch)(`${token.casUrl}/v1/xorbs/default/${xorb.hash}`, { method: "POST", body: xorb.xorb, headers: { Authorization: `Bearer ${token.accessToken}`, ...params.xetParams.sessionId ? { "X-Xet-Session-Id": params.xetParams.sessionId } : {} }, ...{ progressHint: { progressCallback: (progress) => { for (const file of xorb.files) { params.yieldCallback?.({ event: "fileProgress", path: file.path, progress: file.lastSentProgress + (file.progress - file.lastSentProgress) * progress }); } } } } }); if (!resp.ok) { throw await createApiError(resp); } } async function uploadShard(shard, params) { const token = await xetWriteToken(params); const resp = await (params.fetch ?? fetch)(`${token.casUrl}/v1/shards`, { method: "POST", body: shard, headers: { Authorization: `Bearer ${token.accessToken}`, ...params.xetParams.sessionId ? { "X-Xet-Session-Id": params.xetParams.sessionId } : {} } }); if (!resp.ok) { throw await createApiError(resp); } } // src/utils/splitAsyncGenerator.ts function splitAsyncGenerator(source, n) { if (n <= 0) { return []; } const sleep = (ms) => new Promise((resolve3) => setTimeout(resolve3, ms)); let takenIndex = null; const generators = []; let remaining = n; for (let i = 0; i < n; i++) { generators.push({ next: async () => { while (takenIndex !== null) { await sleep(1); } takenIndex = i; return source.next().then((r) => { takenIndex = null; return r; }); }, return: async () => { remaining--; if (remaining === 0) { return source.return(void 0); } return { done: true, value: void 0 }; }, throw: async (error) => { return source.throw(error); }, [Symbol.asyncIterator]: () => generators[i] }); } return generators; } // src/lib/commit.ts var CONCURRENT_SHAS = 5; var CONCURRENT_LFS_UPLOADS = 5; var MULTIPART_PARALLEL_UPLOAD = 5; function isFileOperation(op) { const ret = op.operation === "addOrUpdate"; if (ret && !(op.content instanceof Blob)) { throw new TypeError("Precondition failed: op.content should be a Blob"); } return ret; } async function* commitIter(params) { const accessToken = checkCredentials(params); const repoId = toRepoId(params.repo); if (repoId.type === "bucket") { return yield* commitIterBucket(params); } yield { event: "phase", phase: "preuploading" }; let useXet = params.useXet ?? true; const lfsShas = /* @__PURE__ */ new Map(); const abortController = new AbortController(); const abortSignal = abortController.signal; if (!abortSignal.throwIfAborted) { abortSignal.throwIfAborted = () => { if (abortSignal.aborted) { throw new DOMException("Aborted", "AbortError"); } }; } if (params.abortSignal) { params.abortSignal.addEventListener("abort", () => abortController.abort()); } try { const allOperations = (await Promise.all( params.operations.map(async (operation) => { if (operation.operation === "edit") { const splicedBlob = SplicedBlob.create( operation.originalContent, operation.edits.map((splice) => ({ insert: splice.content, start: splice.start, end: splice.end })) ); return { operation: "addOrUpdate", path: operation.path, content: splicedBlob }; } if (operation.operation !== "addOrUpdate") { return operation; } if (!(operation.content instanceof URL)) { return { ...operation, content: operation.content }; } const lazyBlobs = await createBlobs(operation.content, operation.path, { fetch: params.fetch, maxFolderDepth: params.maxFolderDepth }); abortSignal?.throwIfAborted(); return lazyBlobs.map((blob) => ({ ...operation, content: blob.blob, path: blob.path })); }) )).flat(1); const gitAttributes = allOperations.filter(isFileOperation).find((op) => op.path === ".gitattributes")?.content; for (const operations of chunk(allOperations.filter(isFileOperation), 100)) { const payload = { gitAttributes: gitAttributes && await gitAttributes.text(), files: await Promise.all( operations.map(async (operation) => ({ path: operation.path, size: operation.content.size, sample: base64FromBytes(new Uint8Array(await operation.content.slice(0, 512).arrayBuffer())) })) ) }; abortSignal?.throwIfAborted(); const res = await (params.fetch ?? fetch)( `${params.hubUrl ?? HUB_URL}/api/${repoId.type}s/${repoId.name}/preupload/${encodeURIComponent( params.branch ?? "main" )}` + (params.isPullRequest ? "?create_pr=1" : ""), { method: "POST", headers: { ...accessToken && { Authorization: `Bearer ${accessToken}` }, "Content-Type": "application/json" }, body: JSON.stringify(payload), signal: abortSignal } ); if (!res.ok) { throw await createApiError(res); } const json = await res.json(); for (const file of json.files) { if (file.uploadMode === "lfs") { lfsShas.set(file.path, null); } } } yield { event: "phase", phase: "uploadingLargeFiles" }; for (const operations of chunk( allOperations.filter(isFileOperation).filter((op) => lfsShas.has(op.path)), 100 )) { const shas = yield* eventToGenerator((yieldCallback, returnCallback, rejectCallack) => { return promisesQueue( operations.map((op) => async () => { const iterator = sha256(op.content, { useWebWorker: params.useWebWorkers, abortSignal }); let res2; do { res2 = await iterator.next(); if (!res2.done) { yieldCallback({ event: "fileProgress", path: op.path, progress: res2.value, state: "hashing" }); } } while (!res2.done); const sha = res2.value; lfsShas.set(op.path, res2.value); return sha; }), CONCURRENT_SHAS ).then(returnCallback, rejectCallack); }); abortSignal?.throwIfAborted(); const payload = { operation: "upload", // multipart is a custom protocol for HF transfers: ["basic", "multipart", ...useXet ? ["xet"] : []], hash_algo: "sha_256", ...!params.isPullRequest && { ref: { name: params.branch ?? "main" } }, objects: operations.map((op, i) => ({ oid: shas[i], size: op.content.size })) }; const res = await (params.fetch ?? fetch)( `${params.hubUrl ?? HUB_URL}/${repoId.type === "model" ? "" : repoId.type + "s/"}${repoId.name}.git/info/lfs/objects/batch`, { method: "POST", headers: { ...accessToken && { Authorization: `Bearer ${accessToken}` }, Accept: "application/vnd.git-lfs+json", "Content-Type": "application/vnd.git-lfs+json" }, body: JSON.stringify(payload), signal: abortSignal } ); if (!res.ok) { throw await createApiError(res); } const json = await res.json(); const batchRequestId = res.headers.get("X-Request-Id") || void 0; const shaToOperation = new Map(operations.map((op, i) => [shas[i], op])); if (useXet && json.transfer !== "xet") { useXet = false; } let xetParams = null; if (useXet) { for (const obj of json.objects) { const op = shaToOperation.get(obj.oid); if (!op) { throw new InvalidApiResponseFormatError("Unrequested object ID in response"); } if (obj.error) { const errorMessage = `Error while doing LFS batch call for ${operations[shas.indexOf(obj.oid)].path}: ${obj.error.message}${batchRequestId ? ` - Request ID: ${batchRequestId}` : ""}`; throw new HubApiError(res.url, obj.error.code, batchRequestId, errorMessage); } if (!obj.actions?.upload) { yield { event: "fileProgress", path: op.path, progress: 1, state: "uploading" }; } else { const headers = new Headers(obj.actions.upload.header); xetParams = { sessionId: headers.get("X-Xet-Session-Id") ?? void 0, casUrl: headers.get("X-Xet-Cas-Url") ?? void 0, accessToken: headers.get("X-Xet-Access-Token") ?? void 0, expiresAt: headers.get("X-Xet-Token-Expiration") ? new Date(parseInt(headers.get("X-Xet-Token-Expiration") ?? "0") * 1e3) : void 0, refreshWriteTokenUrl: obj.actions.upload.href }; } } const source = async function* () { for (const obj of json.objects) { const op = shaToOperation.get(obj.oid); if (!op || !obj.actions?.upload) { continue; } abortSignal?.throwIfAborted(); yield { content: op.content, path: op.path, sha256: obj.oid }; } }(); if (xetParams) { const fixedXetParams = xetParams; const sources = splitAsyncGenerator(source, 5); yield* eventToGenerator( (yieldCallback, returnCallback, rejectCallback) => Promise.all( sources.map(async function(source2) { for await (const event of uploadShards(source2, { fetch: params.fetch, accessToken, hubUrl: params.hubUrl ?? HUB_URL, repo: repoId, xetParams: fixedXetParams, // todo: maybe leave empty if PR? rev: params.branch ?? "main", isPullRequest: params.isPullRequest, yieldCallback: (event2) => yieldCallback({ ...event2, state: "uploading" }) })) { if (event.event === "file") { yieldCallback({ event: "fileProgress", path: event.path, progress: 1, state: "uploading" }); } else if (event.event === "fileProgress") { yieldCallback({ event: "fileProgress", path: event.path, progress: event.progress, state: "uploading" }); } } }) ).then(() => returnCallback(void 0), rejectCallback) ); } else { } } else { yield* eventToGenerator((yieldCallback, returnCallback, rejectCallback) => { return promisesQueueStreaming( json.objects.map((obj) => async () => { const op = shaToOperation.get(obj.oid); if (!op) { throw new InvalidApiResponseFormatError("Unrequested object ID in response"); } abortSignal?.throwIfAborted(); if (obj.error) { const errorMessage = `Error while doing LFS batch call for ${operations[shas.indexOf(obj.oid)].path}: ${obj.error.message}${batchRequestId ? ` - Request ID: ${batchRequestId}` : ""}`; throw new HubApiError(res.url, obj.error.code, batchRequestId, errorMessage); } if (!obj.actions?.upload) { yieldCallback({ event: "fileProgress", path: op.path, progress: 1, state: "uploading" }); return; } yieldCallback({ event: "fileProgress", path: op.path, progress: 0, state: "uploading" }); const content = op.content; const header = obj.actions.upload.header; if (header?.chunk_size) { const chunkSize = parseInt(header.chunk_size); const completionUrl = obj.actions.upload.href; const parts = Object.keys(header).filter((key) => /^[0-9]+$/.test(key)); if (parts.length !== Math.ceil(content.size / chunkSize)) { throw new Error("Invalid server response to upload large LFS file, wrong number of parts"); } const completeReq = { oid: obj.oid, parts: parts.map((part) => ({ partNumber: +part, etag: "" })) }; const progressCallback = (progress) => yieldCallback({ event: "fileProgress", path: op.path, progress, state: "uploading" }); await promisesQueueStreaming( parts.map((part) => async () => { abortSignal?.throwIfAborted(); const index = parseInt(part) - 1; const slice = content.slice(index * chunkSize, (index + 1) * chunkSize); const res3 = await (params.fetch ?? fetch)(header[part], { method: "PUT", /** Unfortunately, browsers don't support our inherited version of Blob in fetch calls */ body: slice instanceof WebBlob && isFrontend ? await slice.arrayBuffer() : slice, signal: abortSignal, ...{ progressHint: { path: op.path, part: index, numParts: parts.length, progressCallback } // eslint-disable-next-line @typescript-eslint/no-explicit-any } }); if (!res3.ok) { throw await createApiError(res3, { requestId: batchRequestId, message: `Error while uploading part ${part} of ${operations[shas.indexOf(obj.oid)].path} to LFS storage` }); } const eTag = res3.headers.get("ETag"); if (!eTag) { throw new Error("Cannot get ETag of part during multipart upload"); } completeReq.parts[Number(part) - 1].etag = eTag; }), MULTIPART_PARALLEL_UPLOAD ); abortSignal?.throwIfAborted(); const res2 = await (params.fetch ?? fetch)(completionUrl, { method: "POST", body: JSON.stringify(completeReq), headers: { Accept: "application/vnd.git-lfs+json", "Content-Type": "application/vnd.git-lfs+json" }, signal: abortSignal }); if (!res2.ok) { throw await createApiError(res2, { requestId: batchRequestId, message: `Error completing multipart upload of ${operations[shas.indexOf(obj.oid)].path} to LFS storage` }); } yieldCallback({ event: "fileProgress", path: op.path, progress: 1, state: "uploading" }); } else { const res2 = await (params.fetch ?? fetch)(obj.actions.upload.href, { method: "PUT", headers: { ...batchRequestId ? { "X-Request-Id": batchRequestId } : void 0 }, /** Unfortunately, browsers don't support our inherited version of Blob in fetch calls */ body: content instanceof WebBlob && isFrontend ? await content.arrayBuffer() : content, signal: abortSignal, ...{ progressHint: { path: op.path, progressCallback: (progress) => yieldCallback({ event: "fileProgress", path: op.path, progress, state: "uploading" }) } // eslint-disable-next-line @typescript-eslint/no-explicit-any } }); if (!res2.ok) { throw await createApiError(res2, { requestId: batchRequestId, message: `Error while uploading ${operations[shas.indexOf(obj.oid)].path} to LFS storage` }); } yieldCallback({ event: "fileProgress", path: op.path, progress: 1, state: "uploading" }); } }), CONCURRENT_LFS_UPLOADS ).then(returnCallback, rejectCallback); }); } } abortSignal?.throwIfAborted(); yield { event: "phase", phase: "committing" }; return yield* eventToGenerator( async (yieldCallback, returnCallback, rejectCallback) => (params.fetch ?? fetch)( `${params.hubUrl ?? HUB_URL}/api/${repoId.type}s/${repoId.name}/commit/${encodeURIComponent( params.branch ?? "main" )}` + (params.isPullRequest ? "?create_pr=1" : ""), { method: "POST", headers: { ...accessToken && { Authorization: `Bearer ${accessToken}` }, "Content-Type": "application/x-ndjson" }, body: [ { key: "header", value: { summary: params.title, description: params.description, parentCommit: params.parentCommit } }, ...await Promise.all( allOperations.map((operation) => { if (isFileOperation(operation)) { const sha = lfsShas.get(operation.path); if (sha) { return { key: "lfsFile", value: { path: operation.path, algo: "sha256", size: operation.content.size, oid: sha } }; } } return convertOperationToNdJson(operation); }) ) ].map((x) => JSON.stringify(x)).join("\n"), signal: abortSignal, ...{ progressHint: { progressCallback: (progress) => { for (const op of allOperations) { if (isFileOperation(op) && !lfsShas.has(op.path)) { yieldCallback({ event: "fileProgress", path: op.path, progress, state: "uploading" }); } } } } // eslint-disable-next-line @typescript-eslint/no-explicit-any } } ).then(async (res) => { if (!res.ok) { throw await createApiError(res); } const json = await res.json(); returnCallback({ pullRequestUrl: json.pullRequestUrl, commit: { oid: json.commitOid, url: json.commitUrl }, hookOutput: json.hookOutput }); }).catch(rejectCallback) ); } catch (err) { abortController.abort(); throw err; } } async function* commitIterBucket(params) { const accessToken = checkCredentials(params); const repoId = toRepoId(params.repo); if (params.useXet === false) { throw new Error("useXet must be true or undefined for buckets"); } const abortController = new AbortController(); const abortSignal = abortController.signal; if (!abortSignal.throwIfAborted) { abortSignal.throwIfAborted = () => { if (abortSignal.aborted) { throw new DOMException("Aborted", "AbortError"); } }; } if (params.abortSignal) { params.abortSignal.addEventListener("abort", () => abortController.abort()); } try { const allOperations = (await Promise.all( params.operations.map(async (operation) => { if (operation.operation === "edit") { const splicedBlob = SplicedBlob.create( operation.originalContent, operation.edits.map((splice) => ({ insert: splice.content, start: splice.start, end: splice.end })) ); return { operation: "addOrUpdate", path: operation.path, content: splicedBlob }; } if (operation.operation !== "addOrUpdate") { return operation; } if (!(operation.content instanceof URL)) { return { ...operation, content: operation.content }; } const lazyBlobs = await createBlobs(operation.content, operation.path, { fetch: params.fetch, maxFolderDepth: params.maxFolderDepth }); abortSignal?.throwIfAborted(); return lazyBlobs.map((blob) => ({ ...operation, content: blob.blob, path: blob.path })); }) )).flat(1); yield { event: "phase", phase: "uploadingLargeFiles" }; for (const operations of chunk(allOperations.filter(isFileOperation), 100)) { const xetHashes = /* @__PURE__ */ new Map(); abortSignal?.throwIfAborted(); const source = async function* () { for (const operation of operations) { abortSignal?.throwIfAborted(); yield { content: operation.content, path: operation.path }; } }(); const xetParams = { sessionId: crypto.randomUUID(), refreshWriteTokenUrl: `${params.hubUrl ?? HUB_URL}/api/${repoId.type}s/${repoId.name}/xet-write-token` }; const sources = splitAsyncGenerator(source, 5); yield* eventToGenerator( (yieldCallback, returnCallback, rejectCallback) => Promise.all( sources.map(async function(source2) { for await (const event of uploadShards(source2, { fetch: params.fetch, accessToken, hubUrl: params.hubUrl ?? HUB_URL, repo: repoId, xetParams, rev: params.branch ?? "main", yieldCallback: (event2) => yieldCallback({ ...event2, state: "uploading" }) })) { if (event.event === "file") { yieldCallback({ event: "fileProgress", path: event.path, progress: 1, state: "uploading" }); xetHashes.set(event.path, event.xetHash); } else if (event.event === "fileProgress") { yieldCallback({ event: "fileProgress", path: event.path, progress: event.progress, state: "uploading" }); } } }) ).then(() => returnCallback(void 0), rejectCallback) ); const resp = await (params.fetch ?? fetch)( `${params.hubUrl ?? HUB_URL}/api/${repoId.type}s/${repoId.name}/batch`, { method: "POST", headers: { ...accessToken && { Authorization: `Bearer ${accessToken}` }, "Content-Type": "application/x-ndjson" }, body: [...xetHashes.entries()].map( ([path2, xetHash]) => JSON.stringify({ type: "addFile", path: path2, xetHash }) ).join("\n"), signal: abortSignal } ); if (!resp.ok && resp.status !== 422) { throw await createApiError(resp); } const json = await resp.json(); for (const failed of json.failed) { yield { event: "fileProgress", path: failed.path, progress: 0, state: "error" }; } } abortSignal?.throwIfAborted(); const deletedOperations = allOperations.filter((operation) => operation.operation === "delete"); if (deletedOperations.length > 0) { const resp = await (params.fetch ?? fetch)( `${params.hubUrl ?? HUB_URL}/api/${repoId.type}s/${repoId.name}/batch`, { method: "POST", headers: { ...accessToken && { Authorization: `Bearer ${accessToken}` }, "Content-Type": "application/x-ndjson" }, body: deletedOperations.map( (operation) => JSON.stringify({ type: "deleteFile", path: operation.path }) ).join("\n"), signal: abortSignal } ); if (!resp.ok) { throw await createApiError(resp); } const json = await resp.json(); if (json.failed.length > 0) { const failedPaths = json.failed.slice(0, 5).map((f) => f.path); throw new Error( `Failed to delete ${json.failed.length} file(s): ${failedPaths.join(", ")}${json.failed.length > 5 ? "..." : ""}, request ID: ${resp.headers.get("X-Request-Id")}` ); } } abortSignal?.throwIfAborted(); } catch (err) { abortController.abort(); throw err; } } async function convertOperationToNdJson(operation) { switch (operation.operation) { case "addOrUpdate": { return { key: "file", value: { content: base64FromBytes(new Uint8Array(await operation.content.arrayBuffer())), path: operation.path, encoding: "base64" } }; } case "delete": { return { key: "deletedFile", value: { path: operation.path } }; } case "edit": { throw new Error( "Edit operations should be converted to addOrUpdate operations before reaching convertOperationToNdJson" ); } default: throw new TypeError("Unknown operation: " + operation.operation); } } // src/lib/create-repo.ts async function createRepo(params) { const accessToken = checkCredentials(params); const repoId = toRepoId(params.repo); const [namespace, repoName] = repoId.name.split("/"); if (!namespace || !repoName) { throw new TypeError( `"${repoId.name}" is not a fully qualified repo name. It should be of the form "{namespace}/{repoName}".` ); } const res = repoId.type === "bucket" ? await (params.fetch ?? fetch)(`${params.hubUrl ?? HUB_URL}/api/buckets/${namespace}/${repoName}`, { method: "POST", body: JSON.stringify({ private: params.private, resourceGroupId: params.resourceGroupId }), headers: { Authorization: `Bearer ${accessToken}`, "Content-Type": "application/json" } }) : await (params.fetch ?? fetch)(`${params.hubUrl ?? HUB_URL}/api/repos/create`, { method: "POST", body: JSON.stringify({ name: repoName, private: params.private, organization: namespace, resourceGroupId: params.resourceGroupId, license: params.license, ...repoId.type === "space" ? { type: "space", sdk: params.sdk ?? "static" } : { type: repoId.type }, files: params.files ? await Promise.all( params.files.map(async (file) => ({ encoding: "base64", path: file.path, content: base64FromBytes( new Uint8Array(file.content instanceof Blob ? await file.content.arrayBuffer() : file.content) ) })) ) : void 0 }), headers: { Authorization: `Bearer ${accessToken}`, "Content-Type": "application/json" } }); if (!res.ok) { throw await createApiError(res); } const output = await res.json(); return { repoUrl: output.url, id: output.id }; } // src/lib/create-branch.ts async function createBranch(params) { const repoId = toRepoId(params.repo); const res = await (params.fetch ?? fetch)( `${params.hubUrl ?? HUB_URL}/api/${repoId.type}s/${repoId.name}/branch/${encodeURIComponent(params.branch)}`, { method: "POST", headers: { "Content-Type": "application/json", ...params.accessToken && { Authorization: `Bearer ${params.accessToken}` } }, body: JSON.stringify({ startingPoint: params.revision, ...params.empty && { emptyBranch: true }, overwrite: params.overwrite }) } ); if (!res.ok) { throw await createApiError(res); } } // src/utils/pick.ts function pick(o, props) { return Object.assign( {}, ...props.map((prop) => { if (o[prop] !== void 0) { return { [prop]: o[prop] }; } }) ); } // src/utils/parseLinkHeader.ts function parseLinkHeader(header) { const regex = /<(https?:[/][/][^>]+)>;\s+rel="([^"]+)"/g; return Object.fromEntries([...header.matchAll(regex)].map(([, url, rel]) => [rel, url])); } // src/lib/delete-branch.ts async function deleteBranch(params) { const repoId = toRepoId(params.repo); const res = await (params.fetch ?? fetch)( `${params.hubUrl ?? HUB_URL}/api/${repoId.type}s/${repoId.name}/branch/${encodeURIComponent(params.branch)}`, { method: "DELETE", headers: { ...params.accessToken && { Authorization: `Bearer ${params.accessToken}` } } } ); if (!res.ok) { throw await createApiError(res); } } // src/lib/delete-repo.ts async function deleteRepo(params) { const accessToken = checkCredentials(params); const repoId = toRepoId(params.repo); const [namespace, repoName] = repoId.name.split("/"); const res = repoId.type === "bucket" ? await (params.fetch ?? fetch)(`${params.hubUrl ?? HUB_URL}/api/buckets/${namespace}/${repoName}`, { method: "DELETE", headers: { Authorization: `Bearer ${accessToken}`, "Content-Type": "application/json" } }) : await (params.fetch ?? fetch)(`${params.hubUrl ?? HUB_URL}/api/repos/delete`, { method: "DELETE", body: JSON.stringify({ name: repoName, organization: namespace, type: repoId.type }), headers: { Authorization: `Bearer ${accessToken}`, "Content-Type": "application/json" } }); if (!res.ok) { throw await createApiError(res); } } // src/lib/download-file-to-cache-dir.ts var import_node_path2 = require("path"); var import_promises4 = require("fs/promises"); // src/utils/symlink.ts var fs = __toESM(require("fs/promises")); var path = __toESM(require("path")); var os = __toESM(require("os")); // src/lib/download-file-to-cache-dir.ts var import_node_stream3 = require("stream"); var import_promises5 = require("stream/promises"); var import_node_fs2 = require("fs"); var REGEX_COMMIT_HASH = new RegExp("^[0-9a-f]{40}$"); // src/lib/jobs/get-job.ts async function getJob(params) { const accessToken = checkCredentials(params); const response = await (params.fetch || fetch)( `${params.hubUrl || HUB_URL}/api/jobs/${params.namespace}/${params.jobId}`, { headers: { ...accessToken ? { Authorization: `Bearer ${accessToken}` } : {} } } ); if (!response.ok) { throw await createApiError(response); } return await response.json(); } // src/lib/jobs/list-job-hardware.ts async function listJobHardware(params) { const accessToken = checkCredentials(params ?? {}); const headers = {}; if (accessToken) { headers.Authorization = `Bearer ${accessToken}`; } const response = await (params?.fetch || fetch)(`${params?.hubUrl || HUB_URL}/api/jobs/hardware`, { headers }); if (!response.ok) { throw await createApiError(response); } return await response.json(); } // src/lib/jobs/list-jobs.ts async function listJobs(params) { const accessToken = checkCredentials(params); const response = await (params.fetch || fetch)(`${params.hubUrl || HUB_URL}/api/jobs/${params.namespace}`, { headers: { ...accessToken ? { Authorization: `Bearer ${accessToken}` } : {} } }); if (!response.ok) { throw await createApiError(response); } return await response.json(); } // src/lib/jobs/run-job.ts async function runJob(params) { const accessToken = checkCredentials(params); if (!params.dockerImage && !params.spaceId) { throw new Error("Either dockerImage or spaceId must be provided"); } if (params.dockerImage && params.spaceId) { throw new Error("Cannot provide both dockerImage and spaceId"); } const body = { flavor: params.flavor, environment: params.environment || {} }; if (params.dockerImage) { body.dockerImage = params.dockerImage; } if (params.spaceId) { body.spaceId = params.spaceId; } if (params.command) { body.command = params.command; } if (params.arguments) { body.arguments = params.arguments; } if (params.secrets) { body.secrets = params.secrets; } if (params.arch) { body.arch = params.arch; } if (params.timeoutSeconds !== void 0) { body.timeoutSeconds = params.timeoutSeconds; } if (params.attempts !== void 0) { body.attempts = params.attempts; } if (params.labels) { body.labels = params.labels; } const response = await (params.fetch || fetch)(`${params.hubUrl || HUB_URL}/api/jobs/${params.namespace}`, { method: "POST", headers: { "Content-Type": "application/json", ...accessToken ? { Authorization: `Bearer ${accessToken}` } : {} }, body: JSON.stringify(body) }); if (!response.ok) { throw await createApiError(response); } return await response.json(); } // src/lib/jobs/stream-job-logs.ts async function* streamJobLogs(params) { const accessToken = checkCredentials(params); const response = await (params.fetch || fetch)( `${params.hubUrl || HUB_URL}/api/jobs/${params.namespace}/${params.jobId}/logs`, { headers: { Accept: "text/event-stream", ...accessToken ? { Authorization: `Bearer ${accessToken}` } : {} } } ); if (!response.ok) { throw await createApiError(response); } if (!response.body) { return; } const reader = response.body.getReader(); const decoder = new TextDecoder(); let buffer = ""; try { while (true) { const { done, value } = await reader.read(); if (done) break; buffer += decoder.decode(value, { stream: true }); const lines = buffer.split("\n"); buffer = lines.pop() || ""; for (const line of lines) { if (line.startsWith("data: ")) { try { const data = JSON.parse(line.slice(6)); yield { message: data.data, timestamp: new Date(data.timestamp) }; } catch { yield { message: line.slice(6), timestamp: /* @__PURE__ */ new Date() }; } } } } if (buffer) { const lines = buffer.split("\n"); for (const line of lines) { if (line.startsWith("data: ")) { try { const data = JSON.parse(line.slice(6)); yield { message: data.data, timestamp: new Date(data.timestamp) }; } catch { yield { message: line.slice(6), timestamp: /* @__PURE__ */ new Date() }; } } } } } finally { reader.releaseLock(); } } // src/utils/normalizeInferenceProviderMapping.ts function normalizeInferenceProviderMapping(hfModelId, inferenceProviderMapping) { if (!inferenceProviderMapping) { return []; } if (Array.isArray(inferenceProviderMapping)) { return inferenceProviderMapping.map((entry) => ({ ...entry, hfModelId })); } return Object.entries(inferenceProviderMapping).map(([provider, mapping]) => ({ provider, hfModelId, providerId: mapping.providerId, status: mapping.status, task: mapping.task })); } // src/lib/list-models.ts var MODEL_EXPAND_KEYS = [ "pipeline_tag", "private", "gated", "downloads", "likes", "lastModified" ]; async function* listModels(params) { const accessToken = params && checkCredentials(params); let totalToFetch = params?.limit ?? Infinity; const search = new URLSearchParams([ ...Object.entries({ limit: String(Math.min(totalToFetch, 500)), ...params?.search?.owner ? { author: params.search.owner } : void 0, ...params?.search?.task ? { pipeline_tag: params.search.task } : void 0, ...params?.search?.query ? { search: params.search.query } : void 0, ...params?.search?.inferenceProviders ? { inference_provider: params.search.inferenceProviders.join(",") } : void 0, ...params?.search?.apps ? { apps: params.search.apps.join(",") } : void 0, ...params?.sort ? { sort: params.sort } : void 0 }), ...params?.search?.tags?.map((tag) => ["filter", tag]) ?? [], ...MODEL_EXPAND_KEYS.map((val) => ["expand", val]), ...params?.additionalFields?.map((val) => ["expand", val]) ?? [] ]).toString(); let url = `${params?.hubUrl || HUB_URL}/api/models?${search}`; while (url) { const res = await (params?.fetch ?? fetch)(url, { headers: { accept: "application/json", ...accessToken ? { Authorization: `Bearer ${accessToken}` } : void 0 } }); if (!res.ok) { throw await createApiError(res); } const items = await res.json(); for (const item of items) { const normalizedItem = { ...item }; if (params?.additionalFields?.includes("inferenceProviderMapping") && item.inferenceProviderMapping) { normalizedItem.inferenceProviderMapping = normalizeInferenceProviderMapping( item.id, item.inferenceProviderMapping ); } yield { ...params?.additionalFields && pick(normalizedItem, params.additionalFields), id: item._id, name: item.id, private: item.private, task: item.pipeline_tag, downloads: item.downloads, gated: item.gated, likes: item.likes, updatedAt: new Date(item.lastModified) }; totalToFetch--; if (totalToFetch <= 0) { return; } } const linkHeader = res.headers.get("Link"); url = linkHeader ? parseLinkHeader(linkHeader).next : void 0; } } // src/utils/typedInclude.ts function typedInclude(arr, v) { return arr.includes(v); } // src/lib/repo-exists.ts async function repoExists(params) { const repoId = toRepoId(params.repo); const res = await (params.fetch ?? fetch)( `${params.hubUrl ?? HUB_URL}/api/${repoId.type}s/${repoId.name}?expand[]=likes`, { method: "GET", headers: { ...params.accessToken && { Authorization: `Bearer ${params.accessToken}` } } } ); if (res.status === 404 || res.status === 401) { return false; } if (!res.ok) { throw await createApiError(res); } return true; } // src/lib/snapshot-download.ts var import_node_path3 = require("path"); var import_promises6 = require("fs/promises"); // src/lib/upload-files-with-progress.ts var multipartUploadTracking = /* @__PURE__ */ new WeakMap(); async function* uploadFilesWithProgress(params) { return yield* commitIter({ ...params.accessToken ? { accessToken: params.accessToken } : { credentials: params.credentials }, repo: params.repo, operations: params.files.map((file) => ({ operation: "addOrUpdate", path: file instanceof URL ? file.pathname.split("/").at(-1) ?? "file" : "path" in file ? file.path : file.name, content: "content" in file ? file.content : file })), title: params.commitTitle ?? `Add ${params.files.length} files`, description: params.commitDescription, hubUrl: params.hubUrl, branch: params.branch, isPullRequest: params.isPullRequest, parentCommit: params.parentCommit, useWebWorkers: params.useWebWorkers, abortSignal: params.abortSignal, useXet: params.useXet, fetch: async (input, init2) => { if (!init2) { return fetch(input); } if (!typedInclude(["PUT", "POST"], init2.method) || !("progressHint" in init2) || !init2.progressHint || typeof XMLHttpRequest === "undefined" || typeof input !== "string" || !(init2.body instanceof ArrayBuffer) && !(init2.body instanceof Blob) && !(init2.body instanceof File) && typeof init2.body !== "string") { return fetch(input, init2); } const progressHint = init2.progressHint; const progressCallback = progressHint.progressCallback; const xhr = new XMLHttpRequest(); xhr.upload.addEventListener("progress", (event) => { if (event.lengthComputable) { if (progressHint.part !== void 0) { let tracking = multipartUploadTracking.get(progressCallback); if (!tracking) { tracking = { numParts: progressHint.numParts, partsProgress: {} }; multipartUploadTracking.set(progressCallback, tracking); } tracking.partsProgress[progressHint.part] = event.loaded / event.total; let totalProgress = 0; for (const partProgress of Object.values(tracking.partsProgress)) { totalProgress += partProgress; } if (totalProgress === tracking.numParts) { progressCallback(0.9999999999); } else { progressCallback(totalProgress / tracking.numParts); } } else { if (event.loaded === event.total) { progressCallback(0.9999999999); } else { progressCallback(event.loaded / event.total); } } } }); xhr.open(init2.method, input, true); if (init2.headers) { const headers = new Headers(init2.headers); headers.forEach((value, key) => { xhr.setRequestHeader(key, value); }); } init2.signal?.throwIfAborted(); xhr.send(init2.body); return new Promise((resolve3, reject) => { xhr.addEventListener("load", () => { resolve3( new Response(xhr.responseText, { status: xhr.status, statusText: xhr.statusText, headers: Object.fromEntries( xhr.getAllResponseHeaders().trim().split("\n").map((header) => [ header.slice(0, header.indexOf(":")), header.slice(header.indexOf(":") + 1).trim() ]) ) }) ); }); xhr.addEventListener("error", () => { reject(new Error(xhr.statusText)); }); if (init2.signal) { init2.signal.addEventListener("abort", () => { xhr.abort(); try { init2.signal?.throwIfAborted(); } catch (err) { reject(err); } }); } }); } }); } // src/lib/who-am-i.ts async function whoAmI(params) { const accessToken = checkCredentials(params); const res = await (params.fetch ?? fetch)(`${params.hubUrl ?? HUB_URL}/api/whoami-v2`, { headers: { Authorization: `Bearer ${accessToken}` } }); if (!res.ok) { throw await createApiError(res); } const response = await res.json(); if (typeof response.auth.accessToken?.createdAt === "string") { response.auth.accessToken.createdAt = new Date(response.auth.accessToken.createdAt); } return response; } // cli.ts var import_node_url3 = require("url"); var import_promises7 = require("fs/promises"); var import_node_path4 = require("path"); // package.json var version = "2.10.5"; // cli.ts var UploadProgressManager = class { multibar = null; fileBars = /* @__PURE__ */ new Map(); isQuiet; cliProgressAvailable = false; constructor(isQuiet = false) { this.isQuiet = isQuiet; } async initialize() { if (this.isQuiet) return; try { const cliProgress = await Promise.resolve().then(() => __toESM(require_cli_progress())); this.cliProgressAvailable = true; this.multibar = new cliProgress.MultiBar( { clearOnComplete: false, hideCursor: true, format: " {bar} | {filename} | {percentage}% | {state}", barCompleteChar: "\u2588", barIncompleteChar: "\u2591" }, cliProgress.Presets.shades_grey ); } catch (error) { this.cliProgressAvailable = false; } } handleEvent(event) { if (this.isQuiet) return; if (event.event === "phase") { this.logPhase(event.phase); } else if (event.event === "fileProgress") { this.updateFileProgress(event.path, event.progress, event.state); } } logPhase(phase) { if (this.isQuiet) return; const phaseMessages = { preuploading: "\u{1F4CB} Preparing files for upload...", uploadingLargeFiles: "\u2B06\uFE0F Uploading files...", committing: "\u2728 Finalizing commit..." }; console.log(` ${phaseMessages[phase] || phase}`); } updateFileProgress(path2, progress, state) { if (this.isQuiet) return; if (this.cliProgressAvailable && this.multibar) { let bar = this.fileBars.get(path2); if (!bar) { bar = this.multibar.create(100, 0, { filename: this.truncateFilename(path2, 100), state }); this.fileBars.set(path2, bar); } if (state === "error") { bar.update(0, { state: "\u2717 error" }); } else if (progress >= 1) { bar.update(100, { state: state === "hashing" ? "\u2713 hashed" : "\u2713 uploaded" }); } else { const percentage = Math.round(progress * 100); bar.update(percentage, { state }); } } else { const percentage = Math.round(progress * 100); const truncatedPath = this.truncateFilename(path2, 100); if (state === "error") { console.error(`\u2717 error: ${truncatedPath}`); } else if (progress >= 1) { const statusIcon = state === "hashing" ? "\u2713 hashed" : "\u2713 uploaded"; console.log(`${statusIcon}: ${truncatedPath}`); } else if (percentage % 25 === 0) { console.log(`${state}: ${truncatedPath} (${percentage}%)`); } } } truncateFilename(filename, maxLength) { if (filename.length <= maxLength) return filename; return "..." + filename.slice(-(maxLength - 3)); } stop() { if (!this.isQuiet && this.cliProgressAvailable && this.multibar) { this.multibar.stop(); } } }; var commands = { upload: { description: "Upload a folder to a repo on the Hub", args: [ { name: "repo-name", description: "The name of the repo to upload to", positional: true, required: true }, { name: "local-folder", description: "The local folder to upload. Defaults to the current working directory", positional: true, default: () => process.cwd() }, { name: "path-in-repo", description: "The path in the repo to upload the folder to. Defaults to the root of the repo", positional: true, default: "." }, { name: "quiet", short: "q", description: "Suppress all output", boolean: true }, { name: "repo-type", enum: ["dataset", "model", "space", "bucket"], description: "The type of repo to upload to. Defaults to model. You can also prefix the repo name with the type, e.g. datasets/username/repo-name or buckets/username/repo-name" }, { name: "revision", description: "The revision to upload to. Defaults to the main branch", default: "main" }, { name: "commit-message", description: "The commit message to use. Defaults to 'Upload files using @huggingface/hub'", default: "Upload files using @huggingface/hub" }, { name: "private", description: "If creating a new repo, make it private", boolean: true }, { name: "token", description: "The access token to use for authentication. If not provided, the HF_TOKEN environment variable will be used.", default: process.env.HF_TOKEN } ] }, branch: { description: "Manage repository branches", subcommands: { create: { description: "Create a new branch in a repo, or update an existing one", args: [ { name: "repo-name", description: "The name of the repo to create the branch in", positional: true, required: true }, { name: "branch", description: "The name of the branch to create", positional: true, required: true }, { name: "repo-type", enum: ["dataset", "model", "space"], description: "The type of the repo to create the branch into. Defaults to model. You can also prefix the repo name with the type, e.g. datasets/username/repo-name" }, { name: "revision", description: "The revision to create the branch from. Defaults to the main branch, or existing branch if it exists." }, { name: "empty", boolean: true, description: "Create an empty branch. This will erase all previous commits on the branch if it exists." }, { name: "force", short: "f", boolean: true, description: "Overwrite the branch if it already exists. Otherwise, throws an error if the branch already exists. No-ops if no revision is provided and the branch exists." }, { name: "token", description: "The access token to use for authentication. If not provided, the HF_TOKEN environment variable will be used.", default: process.env.HF_TOKEN } ] }, delete: { description: "Delete a branch in a repo", args: [ { name: "repo-name", description: "The name of the repo to delete the branch from", positional: true, required: true }, { name: "branch", description: "The name of the branch to delete", positional: true, required: true }, { name: "repo-type", enum: ["dataset", "model", "space"], description: "The type of repo to delete the branch from. Defaults to model. You can also prefix the repo name with the type, e.g. datasets/username/repo-name" }, { name: "token", description: "The access token to use for authentication. If not provided, the HF_TOKEN environment variable will be used.", default: process.env.HF_TOKEN } ] } } }, repo: { description: "Manage repositories on the Hub", subcommands: { delete: { description: "Delete a repository from the Hub", args: [ { name: "repo-name", description: "The name of the repo to delete. You can also prefix the repo name with the type, e.g. datasets/username/repo-name", positional: true, required: true }, { name: "repo-type", enum: ["dataset", "model", "space"], description: "The type of the repo to delete. Defaults to model. You can also prefix the repo name with the type, e.g. datasets/username/repo-name" }, { name: "token", description: "The access token to use for authentication. If not provided, the HF_TOKEN environment variable will be used.", default: process.env.HF_TOKEN } ] } } }, models: { description: "Manage models on the Hub", subcommands: { list: { description: "List models on the Hub (first page)", args: [ { name: "search", description: "Search query to filter models by name", positional: true }, { name: "sort", enum: [ "createdAt", "downloads", "likes", "lastModified", "likes30d", "trendingScore", "num_parameters" // "mainSize", // "id", ], description: "Sort models by a specific field" }, { name: "token", description: "The access token to use for authentication. If not provided, the HF_TOKEN environment variable will be used.", default: process.env.HF_TOKEN } ] } } }, version: { description: "Print the version of the CLI", args: [] }, jobs: { description: "Manage jobs on the Hub", subcommands: { run: { description: "Run a new job", args: [ { name: "docker-image-or-space", description: "The Docker image to run (e.g., python:3.12) or Space ID (e.g., hf.co/spaces/username/space-name or username/space-name)", positional: true, required: true }, { name: "command", description: `The command to run (can be multiple arguments preceded by --, e.g., -- python -c 'import os; print(os.environ["FOO"])')`, positional: true, multiple: true }, { name: "env", short: "e", multiple: true, description: "Environment variable in the format KEY=VALUE (can be specified multiple times)" }, { name: "secret", short: "s", multiple: true, description: "Secret in the format KEY=VALUE (will be encrypted server-side, can be specified multiple times)" }, { name: "label", short: "l", multiple: true, description: "Label in the format KEY=VALUE or KEY alone (in this case VALUE defaults to empty string). Can be specified multiple times." }, { name: "flavor", description: "Hardware flavor to use (defaults to cpu-basic)", default: "cpu-basic" }, { name: "attempts", description: "Maximum number of attempts (defaults to 1)" }, { name: "namespace", description: "The namespace (username or organization name). Defaults to the current user's username." }, { name: "token", description: "The access token to use for authentication. If not provided, the HF_TOKEN environment variable will be used.", default: process.env.HF_TOKEN }, { name: "detach", short: "d", description: "Don't stream logs after creating the job", boolean: true } ] }, ps: { description: "List jobs", args: [ { name: "all", short: "a", description: "List all jobs (not just running ones)", boolean: true }, { name: "namespace", description: "The namespace (username or organization name). Defaults to the current user's username." }, { name: "token", description: "The access token to use for authentication. If not provided, the HF_TOKEN environment variable will be used.", default: process.env.HF_TOKEN } ] }, hardware: { description: "List available hardware options for jobs", args: [ { name: "token", description: "The access token to use for authentication. If not provided, the HF_TOKEN environment variable will be used.", default: process.env.HF_TOKEN } ] }, logs: { description: "Show logs for a job", args: [ { name: "job-id", description: "The job ID", positional: true, required: true }, { name: "namespace", description: "The namespace (username or organization name). Defaults to the current user's username." }, { name: "token", description: "The access token to use for authentication. If not provided, the HF_TOKEN environment variable will be used.", default: process.env.HF_TOKEN } ] } } } }; var mainCommandName = process.argv[2]; var subCommandName; var cliArgs; if (mainCommandName && mainCommandName in commands && commands[mainCommandName] && "subcommands" in commands[mainCommandName]) { subCommandName = process.argv[3]; cliArgs = process.argv.slice(4); } else { cliArgs = process.argv.slice(3); } async function run() { switch (mainCommandName) { case void 0: case "--help": case "help": { const helpArgs = mainCommandName === "help" ? process.argv.slice(3) : []; if (helpArgs.length > 0) { const cmdName = helpArgs[0]; if (cmdName && commands[cmdName]) { const cmdDef = commands[cmdName]; if ("subcommands" in cmdDef) { if (helpArgs.length > 1) { const subCmdName = helpArgs[1]; if (subCmdName in cmdDef.subcommands && cmdDef.subcommands[subCmdName]) { console.log(detailedUsageForSubcommand(cmdName, subCmdName)); break; } else { console.error(`Error: Unknown subcommand '${subCmdName}' for command '${cmdName}'.`); console.log(listSubcommands(cmdName, cmdDef)); process.exitCode = 1; break; } } else { console.log(listSubcommands(cmdName, cmdDef)); break; } } else { console.log(detailedUsageForCommand(cmdName)); break; } } else { console.error(`Error: Unknown command '${cmdName}' for help.`); process.exitCode = 1; } } else { console.log( `Hugging Face CLI Tools (hfjs) Available commands: ` + typedEntries(commands).map(([name, def]) => ` ${usage(name)}: ${def.description}`).join("\n") ); console.log("\nTo get help on a specific command, run `hfjs help ` or `hfjs --help`"); console.log( "For commands with subcommands (like 'branch'), run `hfjs help ` or `hfjs --help`" ); if (mainCommandName === void 0) { process.exitCode = 1; } } break; } case "upload": { const cmdDef = commands.upload; if (cliArgs[0] === "--help" || cliArgs[0] === "-h") { console.log(detailedUsageForCommand("upload")); break; } const parsedArgs = advParseArgs(cliArgs, cmdDef.args, "upload"); const { repoName, localFolder, repoType, revision, token, quiet, commitMessage, pathInRepo, private: isPrivate } = parsedArgs; const repoId = repoType ? { type: repoType, name: repoName } : repoName; if (!await repoExists({ repo: repoId, revision, accessToken: token, hubUrl: process.env.HF_ENDPOINT ?? HUB_URL })) { if (!quiet) { console.log(`Repo ${repoName} does not exist. Creating it...`); } await createRepo({ repo: repoId, accessToken: token, private: !!isPrivate, hubUrl: process.env.HF_ENDPOINT ?? HUB_URL }); } const isFile = (await (0, import_promises7.stat)(localFolder)).isFile(); const files = isFile ? [ { content: (0, import_node_url3.pathToFileURL)(localFolder), path: (0, import_node_path4.join)(pathInRepo, `${(0, import_node_path4.basename)(localFolder)}`).replace(/^[.]?\//, "") } ] : [{ content: (0, import_node_url3.pathToFileURL)(localFolder), path: pathInRepo.replace(/^[.]?\//, "") }]; const progressManager = new UploadProgressManager(!!quiet); await progressManager.initialize(); try { for await (const event of uploadFilesWithProgress({ repo: repoId, files, branch: revision, accessToken: token, commitTitle: commitMessage?.trim().split("\n")[0], commitDescription: commitMessage?.trim().split("\n").slice(1).join("\n").trim(), hubUrl: process.env.HF_ENDPOINT ?? HUB_URL, useXet: true })) { progressManager.handleEvent(event); } if (!quiet) { console.log("\n\u2705 Upload completed successfully!"); } } catch (error) { progressManager.stop(); throw error; } finally { progressManager.stop(); } break; } case "branch": { const branchCommandGroup = commands.branch; const currentSubCommandName = subCommandName; if (subCommandName === "--help" || subCommandName === "-h") { console.log(listSubcommands("branch", branchCommandGroup)); break; } if (cliArgs[0] === "--help" || cliArgs[0] === "-h") { if (currentSubCommandName && branchCommandGroup.subcommands[currentSubCommandName]) { console.log(detailedUsageForSubcommand("branch", currentSubCommandName)); } else { console.log(listSubcommands("branch", branchCommandGroup)); } break; } if (!currentSubCommandName || !branchCommandGroup.subcommands[currentSubCommandName]) { console.error(`Error: Missing or invalid subcommand for 'branch'.`); console.log(listSubcommands("branch", branchCommandGroup)); process.exitCode = 1; break; } const subCmdDef = branchCommandGroup.subcommands[currentSubCommandName]; switch (currentSubCommandName) { case "create": { const parsedArgs = advParseArgs(cliArgs, subCmdDef.args, "branch create"); const { repoName, branch, revision, empty, repoType, token, force } = parsedArgs; await createBranch({ repo: repoType ? { type: repoType, name: repoName } : repoName, branch, accessToken: token, revision, empty: empty ?? void 0, overwrite: force ?? void 0, hubUrl: process.env.HF_ENDPOINT ?? HUB_URL }); console.log(`Branch '${branch}' created successfully in repo '${repoName}'.`); break; } case "delete": { const parsedArgs = advParseArgs(cliArgs, subCmdDef.args, "branch delete"); const { repoName, branch, repoType, token } = parsedArgs; await deleteBranch({ repo: repoType ? { type: repoType, name: repoName } : repoName, branch, accessToken: token, hubUrl: process.env.HF_ENDPOINT ?? HUB_URL }); console.log(`Branch '${branch}' deleted successfully from repo '${repoName}'.`); break; } default: console.error(`Error: Unknown subcommand '${currentSubCommandName}' for 'branch'.`); console.log(listSubcommands("branch", branchCommandGroup)); process.exitCode = 1; break; } break; } case "repo": { const repoCommandGroup = commands.repo; const currentSubCommandName = subCommandName; if (subCommandName === "--help" || subCommandName === "-h") { console.log(listSubcommands("repo", repoCommandGroup)); break; } if (cliArgs[0] === "--help" || cliArgs[0] === "-h") { if (currentSubCommandName && repoCommandGroup.subcommands[currentSubCommandName]) { console.log(detailedUsageForSubcommand("repo", currentSubCommandName)); } else { console.log(listSubcommands("repo", repoCommandGroup)); } break; } if (!currentSubCommandName || !repoCommandGroup.subcommands[currentSubCommandName]) { console.error(`Error: Missing or invalid subcommand for 'repo'.`); console.log(listSubcommands("repo", repoCommandGroup)); process.exitCode = 1; break; } const subCmdDef = repoCommandGroup.subcommands[currentSubCommandName]; switch (currentSubCommandName) { case "delete": { const parsedArgs = advParseArgs(cliArgs, subCmdDef.args, `repo ${currentSubCommandName}`); const { repoName, repoType, token } = parsedArgs; const repoDesignation = repoType ? { type: repoType, name: repoName } : repoName; await deleteRepo({ repo: repoDesignation, accessToken: token, hubUrl: process.env.HF_ENDPOINT ?? HUB_URL }); console.log(`Repository '${repoName}' deleted successfully.`); break; } default: console.error(`Error: Unknown subcommand '${currentSubCommandName}' for 'repo'.`); console.log(listSubcommands("repo", repoCommandGroup)); process.exitCode = 1; break; } break; } case "models": { const modelCommandGroup = commands.models; const currentSubCommandName = subCommandName; if (subCommandName === "--help" || subCommandName === "-h") { console.log(listSubcommands("models", modelCommandGroup)); break; } if (cliArgs[0] === "--help" || cliArgs[0] === "-h") { if (currentSubCommandName && modelCommandGroup.subcommands[currentSubCommandName]) { console.log(detailedUsageForSubcommand("models", currentSubCommandName)); } else { console.log(listSubcommands("models", modelCommandGroup)); } break; } if (!currentSubCommandName || !modelCommandGroup.subcommands[currentSubCommandName]) { console.error(`Error: Missing or invalid subcommand for 'models'.`); console.log(listSubcommands("models", modelCommandGroup)); process.exitCode = 1; break; } const subCmdDef = modelCommandGroup.subcommands[currentSubCommandName]; switch (currentSubCommandName) { case "list": { const parsedArgs = advParseArgs(cliArgs, subCmdDef.args, "models list"); const { search, sort, token } = parsedArgs; const models = []; for await (const model of listModels({ search: search ? { query: search } : void 0, sort, limit: 20, accessToken: token, hubUrl: process.env.HF_ENDPOINT ?? HUB_URL })) { models.push(model); } if (models.length === 0) { console.log("No models found."); break; } console.log( `${"MODEL".padEnd(45)} ${"TASK".padEnd(25)} ${"DOWNLOADS".padStart(10)} ${"LIKES".padStart(7)} ${"UPDATED"}` ); console.log("-".repeat(110)); for (const model of models) { const task = model.task || "N/A"; const updatedAt = model.updatedAt.toLocaleDateString(); console.log( `${model.name.padEnd(45)} ${task.padEnd(25)} ${String(model.downloads).padStart(10)} ${String(model.likes).padStart(7)} ${updatedAt}` ); } break; } default: console.error(`Error: Unknown subcommand '${currentSubCommandName}' for 'models'.`); console.log(listSubcommands("models", modelCommandGroup)); process.exitCode = 1; break; } break; } case "version": { if (cliArgs[0] === "--help" || cliArgs[0] === "-h") { console.log(detailedUsageForCommand("version")); break; } console.log(`hfjs version: ${version}`); break; } case "jobs": { const jobsCommandGroup = commands.jobs; const currentSubCommandName = subCommandName; if (subCommandName === "--help" || subCommandName === "-h") { console.log(listSubcommands("jobs", jobsCommandGroup)); break; } if (cliArgs[0] === "--help" || cliArgs[0] === "-h") { if (currentSubCommandName && jobsCommandGroup.subcommands[currentSubCommandName]) { console.log(detailedUsageForSubcommand("jobs", currentSubCommandName)); } else { console.log(listSubcommands("jobs", jobsCommandGroup)); } break; } if (!currentSubCommandName || !jobsCommandGroup.subcommands[currentSubCommandName]) { console.error(`Error: Missing or invalid subcommand for 'jobs'.`); console.log(listSubcommands("jobs", jobsCommandGroup)); process.exitCode = 1; break; } const subCmdDef = jobsCommandGroup.subcommands[currentSubCommandName]; switch (currentSubCommandName) { case "run": { const parsedArgs = advParseArgs(cliArgs, subCmdDef.args, "jobs run"); const { dockerImageOrSpace: firstArg, command: commandArray, env, secret, label, flavor, attempts: attemptsStr, namespace, token, detach } = parsedArgs; const envVars = env; const secretVars = secret; const labelVars = label; let attempts; if (attemptsStr) { const parsed = parseInt(attemptsStr, 10); if (isNaN(parsed) || parsed < 1) { throw new Error("Attempts must be a positive integer"); } attempts = parsed; } let dockerImage; let spaceId; const hfCoSpacesMatch = firstArg.match(/^hf\.co\/spaces\/(.+)$/); if (hfCoSpacesMatch) { spaceId = hfCoSpacesMatch[1]; } else { dockerImage = firstArg; } let finalNamespace = namespace; if (!finalNamespace) { if (!token) { throw new Error( "Cannot determine namespace without authentication. Please provide --namespace or --token." ); } const userInfo = await whoAmI({ accessToken: token, hubUrl: process.env.HF_ENDPOINT ?? HUB_URL }); if (userInfo.type !== "user") { throw new Error("Cannot determine namespace. Please provide --namespace explicitly."); } finalNamespace = userInfo.name; } const environment = {}; if (envVars) { for (const envVar of envVars) { const equalIndex = envVar.indexOf("="); if (equalIndex === -1) { throw new Error(`Invalid environment variable format: ${envVar}. Expected KEY=VALUE`); } const key = envVar.slice(0, equalIndex); const value = envVar.slice(equalIndex + 1); environment[key] = value; } } const secrets = {}; if (secretVars) { for (const secretVar of secretVars) { const equalIndex = secretVar.indexOf("="); if (equalIndex === -1) { throw new Error(`Invalid secret format: ${secretVar}. Expected KEY=VALUE`); } const key = secretVar.slice(0, equalIndex); const value = secretVar.slice(equalIndex + 1); secrets[key] = value; } } const labels = {}; if (labelVars) { for (const labelVar of labelVars) { const equalIndex = labelVar.indexOf("="); const [key, value] = equalIndex > -1 ? [labelVar.slice(0, equalIndex), labelVar.slice(equalIndex + 1)] : [labelVar, ""]; labels[key] = value; } } const jobParams = { namespace: finalNamespace, ...dockerImage ? { dockerImage } : {}, ...spaceId ? { spaceId } : {}, flavor, command: commandArray.length > 0 ? commandArray : void 0, environment, secrets, ...attempts !== void 0 ? { attempts } : {}, ...Object.keys(labels).length > 0 ? { labels } : {}, hubUrl: process.env.HF_ENDPOINT ?? HUB_URL, ...token ? { accessToken: token } : {} }; const job = await runJob(jobParams); console.log(`Job created: ${job.id}`); console.log(`Status: ${job.status.stage}`); if (!detach) { const logsParams = { namespace: finalNamespace, jobId: job.id, hubUrl: process.env.HF_ENDPOINT ?? HUB_URL, ...token ? { accessToken: token } : {} }; for await (const logChunk of streamJobLogs(logsParams)) { console.log(logChunk.message); } } break; } case "ps": { const parsedArgs = advParseArgs(cliArgs, subCmdDef.args, "jobs ps"); const { all, namespace, token } = parsedArgs; let finalNamespace = namespace; if (!finalNamespace) { if (!token) { throw new Error( "Cannot determine namespace without authentication. Please provide --namespace or --token." ); } const userInfo = await whoAmI({ accessToken: token, hubUrl: process.env.HF_ENDPOINT ?? HUB_URL }); if (userInfo.type !== "user") { throw new Error("Cannot determine namespace. Please provide --namespace explicitly."); } finalNamespace = userInfo.name; } const jobs = await listJobs({ namespace: finalNamespace, accessToken: token, hubUrl: process.env.HF_ENDPOINT ?? HUB_URL }); const filteredJobs = all ? jobs : jobs.filter((job) => job.status.stage === "RUNNING"); if (filteredJobs.length === 0) { console.log(all ? "No jobs found." : "No running jobs found."); break; } console.log(`${"ID".padEnd(40)} ${"STATUS".padEnd(12)} ${"CREATED".padEnd(20)} ${"DOCKER IMAGE"}`); console.log("-".repeat(100)); for (const job of filteredJobs) { const createdAt = new Date(job.createdAt).toLocaleString(); const dockerImage = job.dockerImage || job.spaceId || "N/A"; const status = job.status.stage; console.log(`${job.id.padEnd(40)} ${status.padEnd(12)} ${createdAt.padEnd(20)} ${dockerImage}`); } break; } case "hardware": { const parsedArgs = advParseArgs(cliArgs, subCmdDef.args, "jobs hardware"); const { token } = parsedArgs; const hardwareParams = { hubUrl: process.env.HF_ENDPOINT ?? HUB_URL }; if (token) { hardwareParams.accessToken = token; } const hardware = await listJobHardware(hardwareParams); console.log( `${"NAME".padEnd(15)} ${"PRETTY NAME".padEnd(22)} ${"CPU".padEnd(8)} ${"RAM".padEnd(7)} ${"ACCELERATOR".padEnd(16)} ${"COST/MIN".padEnd(9)} ${"COST/HOUR"}` ); console.log("-".repeat(100)); for (const hw of hardware) { let accelerator = "N/A"; if (hw.accelerator) { accelerator = `${hw.accelerator.quantity}x ${hw.accelerator.model} (${hw.accelerator.vram})`; } const costPerMin = (hw.unitCostMicroUSD / 1e6).toFixed(4); const costPerHour = (hw.unitCostMicroUSD / 1e6 * 60).toFixed(2); console.log( `${hw.name.padEnd(15)} ${hw.prettyName.padEnd(22)} ${hw.cpu.padEnd(8)} ${hw.ram.padEnd(7)} ${accelerator.padEnd(16)} $${costPerMin.padStart(8)} $${costPerHour.padStart(9)}` ); } break; } case "logs": { const parsedArgs = advParseArgs(cliArgs, subCmdDef.args, "jobs logs"); const { jobId, namespace, token } = parsedArgs; let finalNamespace = namespace; if (!finalNamespace) { if (!token) { throw new Error( "Cannot determine namespace without authentication. Please provide --namespace or --token." ); } const userInfo = await whoAmI({ accessToken: token, hubUrl: process.env.HF_ENDPOINT ?? HUB_URL }); if (userInfo.type !== "user") { throw new Error("Cannot determine namespace. Please provide --namespace explicitly."); } finalNamespace = userInfo.name; } const logsParams = { namespace: finalNamespace, jobId, hubUrl: process.env.HF_ENDPOINT ?? HUB_URL, ...token ? { accessToken: token } : {} }; const jobInfoParams = { namespace: finalNamespace, jobId, hubUrl: process.env.HF_ENDPOINT ?? HUB_URL, ...token ? { accessToken: token } : {} }; const jobInfo = await getJob(jobInfoParams); if (jobInfo.status.stage === "ERROR" && jobInfo.status.message) { console.error(` \u274C Job failed: ${jobInfo.status.message} `); } for await (const logChunk of streamJobLogs(logsParams)) { console.log(logChunk.message); } break; } default: console.error(`Error: Unknown subcommand '${currentSubCommandName}' for 'jobs'.`); console.log(listSubcommands("jobs", jobsCommandGroup)); process.exitCode = 1; break; } break; } default: console.error("Command not found: " + mainCommandName); console.log( ` Available commands: ` + typedEntries(commands).map(([name, def]) => ` ${usage(name)}: ${def.description}`).join("\n") ); console.log("\nTo get help on a specific command, run `hfjs help ` or `hfjs --help`"); process.exitCode = 1; break; } } run().catch((err) => { console.error("\x1B[31mError:\x1B[0m", err.message); console.error(err); process.exitCode = 1; }); function usage(commandName, subCommandName2) { const commandEntry = commands[commandName]; let cmdArgs; let fullCommandName = commandName; if ("subcommands" in commandEntry) { if (subCommandName2 && subCommandName2 in commandEntry.subcommands) { const subCmd = commandEntry.subcommands[subCommandName2]; cmdArgs = subCmd.args; fullCommandName = `${commandName} ${subCommandName2}`; } else { return `${commandName} `; } } else { cmdArgs = commandEntry.args; } return `${fullCommandName} ${(cmdArgs || []).map((arg) => { if (arg.positional) { return arg.required ? `<${arg.name}>` : `[${arg.name}]`; } return `[--${arg.name}${arg.short ? `|-${arg.short}` : ""}${arg.enum ? ` {${arg.enum.join("|")}}` : arg.boolean ? "" : ` <${arg.name.toUpperCase().replace(/-/g, "_")}>`}]`; }).join(" ")}`.trim(); } function _detailedUsage(args, usageLine, commandDescription) { let ret = `usage: hfjs ${usageLine} `; if (commandDescription) { ret += ` ${commandDescription} `; } const positionals = args.filter((p) => p.positional); const options = args.filter((p) => !p.positional); if (positionals.length > 0) { ret += ` Positional arguments: `; for (const arg of positionals) { ret += ` ${arg.name} ${arg.description}${arg.default ? ` (default: ${typeof arg.default === "function" ? arg.default() : arg.default})` : ""} `; } } if (options.length > 0) { ret += ` Options: `; for (const arg of options) { const nameAndAlias = `--${arg.name}${arg.short ? `, -${arg.short}` : ""}`; const valueHint = arg.enum ? `{${arg.enum.join("|")}}` : arg.boolean ? "" : `<${arg.name.toUpperCase().replace(/-/g, "_")}>`; ret += ` ${nameAndAlias}${valueHint ? " " + valueHint : ""} ${arg.description}${arg.default !== void 0 ? ` (default: ${typeof arg.default === "function" ? arg.default() : arg.default})` : ""} `; } } ret += ` `; return ret; } function detailedUsageForCommand(commandName) { const commandDef = commands[commandName]; if ("subcommands" in commandDef) { return listSubcommands(commandName, commandDef); } return _detailedUsage(commandDef.args, usage(commandName), commandDef.description); } function detailedUsageForSubcommand(commandName, subCommandName2) { const commandGroup = commands[commandName]; if (!("subcommands" in commandGroup)) { throw new Error(`Command ${commandName} does not have subcommands`); } if (!(subCommandName2 in commandGroup.subcommands)) { throw new Error(`Subcommand ${subCommandName2} not found for ${commandName}`); } const subCommandDef = commandGroup.subcommands[subCommandName2]; return _detailedUsage(subCommandDef.args, usage(commandName, subCommandName2), subCommandDef.description); } function listSubcommands(commandName, commandGroup) { let ret = `usage: hfjs ${commandName} [options] `; ret += `${commandGroup.description} `; ret += `Available subcommands for '${commandName}': `; ret += typedEntries(commandGroup.subcommands).map(([subName, subDef]) => ` ${subName} ${subDef.description}`).join("\n"); if (commandName === "jobs") { ret += ` Example: hfjs jobs run -e FOO=foo -e BAR=bar python:3.12 -- python -c 'import os; print(os.environ["FOO"], os.environ["BAR"])'`; } ret += ` Run \`hfjs help ${commandName} \` for more information on a specific subcommand.`; return ret; } function advParseArgs(args, argDefs, commandNameForError) { const hasMultiplePositional = argDefs.some((arg) => arg.multiple && arg.positional); const { tokens } = (0, import_node_util.parseArgs)({ options: Object.fromEntries( argDefs.filter((arg) => !arg.positional).map((arg) => { const optionConfig = { type: arg.boolean ? "boolean" : "string", ...arg.short && { short: arg.short }, ...arg.multiple && { multiple: true }, ...arg.default !== void 0 && { default: typeof arg.default === "function" ? arg.default() : arg.default } }; return [arg.name, optionConfig]; }) ), args, allowPositionals: true, strict: false, // We do custom validation based on tokens and argDefs tokens: true }); const expectedPositionals = argDefs.filter((arg) => arg.positional); const providedPositionalTokens = tokens.filter((token) => token.kind === "positional"); if (providedPositionalTokens.length < expectedPositionals.filter((arg) => arg.required).length) { throw new Error( `Command '${commandNameForError}': Missing required positional arguments. Usage: hfjs ${usage( commandNameForError.split(" ")[0], commandNameForError.split(" ")[1] )}` ); } if (providedPositionalTokens.length > expectedPositionals.length && !hasMultiplePositional) { throw new Error( `Command '${commandNameForError}': Too many positional arguments. Usage: hfjs ${usage( commandNameForError.split(" ")[0], commandNameForError.split(" ")[1] )}` ); } const result = {}; for (const argDef of argDefs) { if (argDef.default !== void 0) { result[argDef.name] = typeof argDef.default === "function" ? argDef.default() : argDef.default; } else if (argDef.boolean) { result[argDef.name] = false; } } expectedPositionals.forEach((argDef, i) => { if (argDef.multiple) { result[argDef.name] = providedPositionalTokens.slice(i).map((token) => token.value); } else if (providedPositionalTokens[i]) { result[argDef.name] = providedPositionalTokens[i].value; } }); tokens.filter((token) => token.kind === "option").forEach((token) => { const argDef = argDefs.find((def) => def.name === token.name || def.short === token.name); if (!argDef) { throw new Error(`Command '${commandNameForError}': Unknown option: ${token.rawName}`); } if (argDef.boolean) { result[argDef.name] = true; } else { if (token.value === void 0) { throw new Error(`Command '${commandNameForError}': Missing value for option: ${token.rawName}`); } if (argDef.enum && !argDef.enum.includes(token.value)) { throw new Error( `Command '${commandNameForError}': Invalid value '${token.value}' for option ${token.rawName}. Expected one of: ${argDef.enum.join(", ")}` ); } if (argDef.multiple) { const existing = result[argDef.name] || []; existing.push(token.value); result[argDef.name] = existing; } else { result[argDef.name] = token.value; } } }); for (const argDef of argDefs) { if (argDef.required && result[argDef.name] === void 0) { throw new Error(`Command '${commandNameForError}': Missing required argument: ${argDef.name}`); } } return Object.fromEntries( Object.entries(result).map(([name, val]) => [kebabToCamelCase(name), val]) ); } function kebabToCamelCase(str) { return str.replace(/-./g, (match) => match[1].toUpperCase()); }