UNPKG

anylang

Version:

A translator's kit that uses the free APIs of Google Translate, Yandex, Bing, ChatGPT, and other LLMs

117 lines (115 loc) 13.1 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.DeepLTranslator = void 0; var _zod = _interopRequireDefault(require("zod")); var _BaseTranslator = require("../BaseTranslator"); function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; } var __awaiter = void 0 && (void 0).__awaiter || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; class DeepLTranslator extends _BaseTranslator.BaseTranslator { static getSupportedLanguages() { // eslint-disable // prettier-ignore return ['bg', 'cs', 'da', 'de', 'el', 'en', 'es', 'et', 'fi', 'fr', 'hu', 'id', 'it', 'ja', 'ko', 'lt', 'lv', 'nb', 'nl', 'pl', 'pt', 'ro', 'ru', 'sk', 'sl', 'sv', 'tr', 'uk', 'zh']; // eslint-enable } constructor(options) { super(options); // DeepL API Free authentication keys can be identified easily by the suffix ":fx" // Docs: https://www.deepl.com/docs-api/api-access/ const isApiKeyFreeVersion = options.apiKey.endsWith(':fx'); const apiHost = isApiKeyFreeVersion ? 'https://api-free.deepl.com' : 'https://api.deepl.com'; this.apiHost = apiHost + '/v2/translate'; } getLengthLimit() { return 5000; } getRequestsTimeout() { return 300; } checkLimitExceeding(text) { if (Array.isArray(text)) { const arrayLen = text.reduce((acc, text) => acc + text.length, 0); const extra = arrayLen - this.getLengthLimit(); return extra > 0 ? extra : 0; } else { const extra = text.length - this.getLengthLimit(); return extra > 0 ? extra : 0; } } translate(text, from, to) { return __awaiter(this, void 0, void 0, function* () { return this.translateBatch([text], from, to).then(resp => resp[0]); }); } translateBatch(text, from, to) { return __awaiter(this, void 0, void 0, function* () { // eslint-disable-next-line camelcase const requestBody = { text, target_lang: to }; if (from !== 'auto') { requestBody['source_lang'] = from; } const stringifiedBody = Object.entries(requestBody).map(([key, value]) => { if (!Array.isArray(value)) return `${key}=${encodeURIComponent(value)}`; // Handle array parameters return value.map(t => `${key}=` + encodeURIComponent(t)).join('&'); }).join('&'); return this.fetch(this.apiHost, { responseType: 'json', method: 'POST', headers: Object.assign({ Authorization: `DeepL-Auth-Key ${this.options.apiKey}`, 'Content-Type': 'application/x-www-form-urlencoded' }, this.options.headers), body: stringifiedBody }).then(rsp => { return _zod.default.object({ translations: _zod.default.object({ text: _zod.default.string() }).array() }).transform(({ translations }) => translations.map(({ text }) => text)).parse(rsp.data, { error: () => 'Unexpected data' }); }); }); } } exports.DeepLTranslator = DeepLTranslator; DeepLTranslator.translatorName = 'DeepLTranslator'; DeepLTranslator.isRequiredKey = () => true; DeepLTranslator.isSupportedAutoFrom = () => true; //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNsYXRvcnMvRGVlcExUcmFuc2xhdG9yL2luZGV4LmpzIiwibmFtZXMiOlsiX3pvZCIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJyZXF1aXJlIiwiX0Jhc2VUcmFuc2xhdG9yIiwiZSIsIl9fZXNNb2R1bGUiLCJkZWZhdWx0IiwiRGVlcExUcmFuc2xhdG9yIiwiQmFzZVRyYW5zbGF0b3IiLCJnZXRTdXBwb3J0ZWRMYW5ndWFnZXMiLCJjb25zdHJ1Y3RvciIsIm9wdGlvbnMiLCJpc0FwaUtleUZyZWVWZXJzaW9uIiwiYXBpS2V5IiwiZW5kc1dpdGgiLCJhcGlIb3N0IiwiZ2V0TGVuZ3RoTGltaXQiLCJnZXRSZXF1ZXN0c1RpbWVvdXQiLCJjaGVja0xpbWl0RXhjZWVkaW5nIiwidGV4dCIsIkFycmF5IiwiaXNBcnJheSIsImFycmF5TGVuIiwicmVkdWNlIiwiYWNjIiwibGVuZ3RoIiwiZXh0cmEiLCJ0cmFuc2xhdGUiLCJmcm9tIiwidG8iLCJ0cmFuc2xhdGVCYXRjaCIsInRoZW4iLCJyZXNwIiwicmVxdWVzdEJvZHkiLCJ0YXJnZXRfbGFuZyIsInN0cmluZ2lmaWVkQm9keSIsIk9iamVjdCIsImVudHJpZXMiLCJtYXAiLCJrZXkiLCJ2YWx1ZSIsImVuY29kZVVSSUNvbXBvbmVudCIsInQiLCJqb2luIiwiZmV0Y2giLCJyZXNwb25zZVR5cGUiLCJtZXRob2QiLCJoZWFkZXJzIiwiYXNzaWduIiwiQXV0aG9yaXphdGlvbiIsImJvZHkiLCJyc3AiLCJ6Iiwib2JqZWN0IiwidHJhbnNsYXRpb25zIiwic3RyaW5nIiwiYXJyYXkiLCJ0cmFuc2Zvcm0iLCJwYXJzZSIsImRhdGEiLCJlcnJvciIsInRyYW5zbGF0b3JOYW1lIiwiaXNSZXF1aXJlZEtleSIsImlzU3VwcG9ydGVkQXV0b0Zyb20iXSwic291cmNlcyI6WyJ0cmFuc2xhdG9ycy9EZWVwTFRyYW5zbGF0b3IvaW5kZXgudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHogZnJvbSAnem9kJztcblxuaW1wb3J0IHsgQmFzZVRyYW5zbGF0b3IsIFRyYW5zbGF0b3JPcHRpb25zIH0gZnJvbSAnLi4vQmFzZVRyYW5zbGF0b3InO1xuXG5leHBvcnQgdHlwZSBEZWVwTFRyYW5zbGF0b3JPcHRpb25zID0ge1xuXHRhcGlLZXk6IHN0cmluZztcbn07XG5cbmV4cG9ydCBjbGFzcyBEZWVwTFRyYW5zbGF0b3IgZXh0ZW5kcyBCYXNlVHJhbnNsYXRvcjxEZWVwTFRyYW5zbGF0b3JPcHRpb25zPiB7XG5cdHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgdHJhbnNsYXRvck5hbWUgPSAnRGVlcExUcmFuc2xhdG9yJztcblxuXHRwdWJsaWMgc3RhdGljIGlzUmVxdWlyZWRLZXkgPSAoKSA9PiB0cnVlO1xuXG5cdHB1YmxpYyBzdGF0aWMgaXNTdXBwb3J0ZWRBdXRvRnJvbSA9ICgpID0+IHRydWU7XG5cblx0cHVibGljIHN0YXRpYyBnZXRTdXBwb3J0ZWRMYW5ndWFnZXMoKTogc3RyaW5nW10ge1xuXHRcdC8vIGVzbGludC1kaXNhYmxlXG5cdFx0Ly8gcHJldHRpZXItaWdub3JlXG5cdFx0cmV0dXJuIFtcblx0XHRcdCdiZycsICdjcycsICdkYScsICdkZScsICdlbCcsICdlbicsICdlcycsICdldCcsICdmaScsICdmcicsXG5cdFx0XHQnaHUnLCAnaWQnLCAnaXQnLCAnamEnLCAna28nLCAnbHQnLCAnbHYnLCAnbmInLCAnbmwnLCAncGwnLFxuXHRcdFx0J3B0JywgJ3JvJywgJ3J1JywgJ3NrJywgJ3NsJywgJ3N2JywgJ3RyJywgJ3VrJywgJ3poJ1xuXHRcdF07XG5cdFx0Ly8gZXNsaW50LWVuYWJsZVxuXHR9XG5cblx0cHJpdmF0ZSByZWFkb25seSBhcGlIb3N0OiBzdHJpbmc7XG5cdGNvbnN0cnVjdG9yKG9wdGlvbnM6IFRyYW5zbGF0b3JPcHRpb25zPERlZXBMVHJhbnNsYXRvck9wdGlvbnM+KSB7XG5cdFx0c3VwZXIob3B0aW9ucyk7XG5cblx0XHQvLyBEZWVwTCBBUEkgRnJlZSBhdXRoZW50aWNhdGlvbiBrZXlzIGNhbiBiZSBpZGVudGlmaWVkIGVhc2lseSBieSB0aGUgc3VmZml4IFwiOmZ4XCJcblx0XHQvLyBEb2NzOiBodHRwczovL3d3dy5kZWVwbC5jb20vZG9jcy1hcGkvYXBpLWFjY2Vzcy9cblxuXHRcdGNvbnN0IGlzQXBpS2V5RnJlZVZlcnNpb24gPSBvcHRpb25zLmFwaUtleS5lbmRzV2l0aCgnOmZ4Jyk7XG5cdFx0Y29uc3QgYXBpSG9zdCA9IGlzQXBpS2V5RnJlZVZlcnNpb25cblx0XHRcdD8gJ2h0dHBzOi8vYXBpLWZyZWUuZGVlcGwuY29tJ1xuXHRcdFx0OiAnaHR0cHM6Ly9hcGkuZGVlcGwuY29tJztcblxuXHRcdHRoaXMuYXBpSG9zdCA9IGFwaUhvc3QgKyAnL3YyL3RyYW5zbGF0ZSc7XG5cdH1cblxuXHRwdWJsaWMgZ2V0TGVuZ3RoTGltaXQoKSB7XG5cdFx0cmV0dXJuIDUwMDA7XG5cdH1cblxuXHRwdWJsaWMgZ2V0UmVxdWVzdHNUaW1lb3V0KCkge1xuXHRcdHJldHVybiAzMDA7XG5cdH1cblxuXHRwdWJsaWMgY2hlY2tMaW1pdEV4Y2VlZGluZyh0ZXh0OiBzdHJpbmcgfCBzdHJpbmdbXSkge1xuXHRcdGlmIChBcnJheS5pc0FycmF5KHRleHQpKSB7XG5cdFx0XHRjb25zdCBhcnJheUxlbiA9IHRleHQucmVkdWNlKChhY2MsIHRleHQpID0+IGFjYyArIHRleHQubGVuZ3RoLCAwKTtcblx0XHRcdGNvbnN0IGV4dHJhID0gYXJyYXlMZW4gLSB0aGlzLmdldExlbmd0aExpbWl0KCk7XG5cdFx0XHRyZXR1cm4gZXh0cmEgPiAwID8gZXh0cmEgOiAwO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRjb25zdCBleHRyYSA9IHRleHQubGVuZ3RoIC0gdGhpcy5nZXRMZW5ndGhMaW1pdCgpO1xuXHRcdFx0cmV0dXJuIGV4dHJhID4gMCA/IGV4dHJhIDogMDtcblx0XHR9XG5cdH1cblxuXHRwdWJsaWMgYXN5bmMgdHJhbnNsYXRlKHRleHQ6IHN0cmluZywgZnJvbTogc3RyaW5nLCB0bzogc3RyaW5nKSB7XG5cdFx0cmV0dXJuIHRoaXMudHJhbnNsYXRlQmF0Y2goW3RleHRdLCBmcm9tLCB0bykudGhlbigocmVzcCkgPT4gcmVzcFswXSk7XG5cdH1cblxuXHRwdWJsaWMgYXN5bmMgdHJhbnNsYXRlQmF0Y2godGV4dDogc3RyaW5nW10sIGZyb206IHN0cmluZywgdG86IHN0cmluZykge1xuXHRcdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjYW1lbGNhc2Vcblx0XHRjb25zdCByZXF1ZXN0Qm9keTogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgc3RyaW5nW10+ID0geyB0ZXh0LCB0YXJnZXRfbGFuZzogdG8gfTtcblxuXHRcdGlmIChmcm9tICE9PSAnYXV0bycpIHtcblx0XHRcdHJlcXVlc3RCb2R5Wydzb3VyY2VfbGFuZyddID0gZnJvbTtcblx0XHR9XG5cblx0XHRjb25zdCBzdHJpbmdpZmllZEJvZHkgPSBPYmplY3QuZW50cmllcyhyZXF1ZXN0Qm9keSlcblx0XHRcdC5tYXAoKFtrZXksIHZhbHVlXSkgPT4ge1xuXHRcdFx0XHRpZiAoIUFycmF5LmlzQXJyYXkodmFsdWUpKSByZXR1cm4gYCR7a2V5fT0ke2VuY29kZVVSSUNvbXBvbmVudCh2YWx1ZSl9YDtcblxuXHRcdFx0XHQvLyBIYW5kbGUgYXJyYXkgcGFyYW1ldGVyc1xuXHRcdFx0XHRyZXR1cm4gdmFsdWUubWFwKCh0KSA9PiBgJHtrZXl9PWAgKyBlbmNvZGVVUklDb21wb25lbnQodCkpLmpvaW4oJyYnKTtcblx0XHRcdH0pXG5cdFx0XHQuam9pbignJicpO1xuXG5cdFx0cmV0dXJuIHRoaXMuZmV0Y2godGhpcy5hcGlIb3N0LCB7XG5cdFx0XHRyZXNwb25zZVR5cGU6ICdqc29uJyxcblx0XHRcdG1ldGhvZDogJ1BPU1QnLFxuXHRcdFx0aGVhZGVyczoge1xuXHRcdFx0XHRBdXRob3JpemF0aW9uOiBgRGVlcEwtQXV0aC1LZXkgJHt0aGlzLm9wdGlvbnMuYXBpS2V5fWAsXG5cdFx0XHRcdCdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJyxcblx0XHRcdFx0Li4udGhpcy5vcHRpb25zLmhlYWRlcnMsXG5cdFx0XHR9LFxuXHRcdFx0Ym9keTogc3RyaW5naWZpZWRCb2R5LFxuXHRcdH0pLnRoZW4oKHJzcCkgPT4ge1xuXHRcdFx0cmV0dXJuIHpcblx0XHRcdFx0Lm9iamVjdCh7XG5cdFx0XHRcdFx0dHJhbnNsYXRpb25zOiB6Lm9iamVjdCh7IHRleHQ6IHouc3RyaW5nKCkgfSkuYXJyYXkoKSxcblx0XHRcdFx0fSlcblx0XHRcdFx0LnRyYW5zZm9ybSgoeyB0cmFuc2xhdGlvbnMgfSkgPT4gdHJhbnNsYXRpb25zLm1hcCgoeyB0ZXh0IH0pID0+IHRleHQpKVxuXHRcdFx0XHQucGFyc2UocnNwLmRhdGEsIHsgZXJyb3I6ICgpID0+ICdVbmV4cGVjdGVkIGRhdGEnIH0pO1xuXHRcdH0pO1xuXHR9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLElBQUFBLElBQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUVBLElBQUFDLGVBQUEsR0FBQUQsT0FBQTtBQUFzRSxTQUFBRCx1QkFBQUcsQ0FBQSxXQUFBQSxDQUFBLElBQUFBLENBQUEsQ0FBQUMsVUFBQSxHQUFBRCxDQUFBLEtBQUFFLE9BQUEsRUFBQUYsQ0FBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQU1oRSxNQUFPRyxlQUFnQixTQUFRQyw4QkFBc0M7RUFPbkUsT0FBT0MscUJBQXFCQSxDQUFBO0lBQ2xDO0lBQ0E7SUFDQSxPQUFPLENBQ04sSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUMxRCxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQzFELElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUNwRDtJQUNEO0VBQ0Q7RUFHQUMsWUFBWUMsT0FBa0Q7SUFDN0QsS0FBSyxDQUFDQSxPQUFPLENBQUM7SUFFZDtJQUNBO0lBRUEsTUFBTUMsbUJBQW1CLEdBQUdELE9BQU8sQ0FBQ0UsTUFBTSxDQUFDQyxRQUFRLENBQUMsS0FBSyxDQUFDO0lBQzFELE1BQU1DLE9BQU8sR0FBR0gsbUJBQW1CLEdBQ2hDLDRCQUE0QixHQUM1Qix1QkFBdUI7SUFFMUIsSUFBSSxDQUFDRyxPQUFPLEdBQUdBLE9BQU8sR0FBRyxlQUFlO0VBQ3pDO0VBRU9DLGNBQWNBLENBQUE7SUFDcEIsT0FBTyxJQUFJO0VBQ1o7RUFFT0Msa0JBQWtCQSxDQUFBO0lBQ3hCLE9BQU8sR0FBRztFQUNYO0VBRU9DLG1CQUFtQkEsQ0FBQ0MsSUFBdUI7SUFDakQsSUFBSUMsS0FBSyxDQUFDQyxPQUFPLENBQUNGLElBQUksQ0FBQyxFQUFFO01BQ3hCLE1BQU1HLFFBQVEsR0FBR0gsSUFBSSxDQUFDSSxNQUFNLENBQUMsQ0FBQ0MsR0FBRyxFQUFFTCxJQUFJLEtBQUtLLEdBQUcsR0FBR0wsSUFBSSxDQUFDTSxNQUFNLEVBQUUsQ0FBQyxDQUFDO01BQ2pFLE1BQU1DLEtBQUssR0FBR0osUUFBUSxHQUFHLElBQUksQ0FBQ04sY0FBYyxFQUFFO01BQzlDLE9BQU9VLEtBQUssR0FBRyxDQUFDLEdBQUdBLEtBQUssR0FBRyxDQUFDO0lBQzdCLENBQUMsTUFBTTtNQUNOLE1BQU1BLEtBQUssR0FBR1AsSUFBSSxDQUFDTSxNQUFNLEdBQUcsSUFBSSxDQUFDVCxjQUFjLEVBQUU7TUFDakQsT0FBT1UsS0FBSyxHQUFHLENBQUMsR0FBR0EsS0FBSyxHQUFHLENBQUM7SUFDN0I7RUFDRDtFQUVhQyxTQUFTQSxDQUFDUixJQUFZLEVBQUVTLElBQVksRUFBRUMsRUFBVTs7TUFDNUQsT0FBTyxJQUFJLENBQUNDLGNBQWMsQ0FBQyxDQUFDWCxJQUFJLENBQUMsRUFBRVMsSUFBSSxFQUFFQyxFQUFFLENBQUMsQ0FBQ0UsSUFBSSxDQUFFQyxJQUFJLElBQUtBLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNyRSxDQUFDOztFQUVZRixjQUFjQSxDQUFDWCxJQUFjLEVBQUVTLElBQVksRUFBRUMsRUFBVTs7TUFDbkU7TUFDQSxNQUFNSSxXQUFXLEdBQXNDO1FBQUVkLElBQUk7UUFBRWUsV0FBVyxFQUFFTDtNQUFFLENBQUU7TUFFaEYsSUFBSUQsSUFBSSxLQUFLLE1BQU0sRUFBRTtRQUNwQkssV0FBVyxDQUFDLGFBQWEsQ0FBQyxHQUFHTCxJQUFJO01BQ2xDO01BRUEsTUFBTU8sZUFBZSxHQUFHQyxNQUFNLENBQUNDLE9BQU8sQ0FBQ0osV0FBVyxDQUFDLENBQ2pESyxHQUFHLENBQUMsQ0FBQyxDQUFDQyxHQUFHLEVBQUVDLEtBQUssQ0FBQyxLQUFJO1FBQ3JCLElBQUksQ0FBQ3BCLEtBQUssQ0FBQ0MsT0FBTyxDQUFDbUIsS0FBSyxDQUFDLEVBQUUsT0FBTyxHQUFHRCxHQUFHLElBQUlFLGtCQUFrQixDQUFDRCxLQUFLLENBQUMsRUFBRTtRQUV2RTtRQUNBLE9BQU9BLEtBQUssQ0FBQ0YsR0FBRyxDQUFFSSxDQUFDLElBQUssR0FBR0gsR0FBRyxHQUFHLEdBQUdFLGtCQUFrQixDQUFDQyxDQUFDLENBQUMsQ0FBQyxDQUFDQyxJQUFJLENBQUMsR0FBRyxDQUFDO01BQ3JFLENBQUMsQ0FBQyxDQUNEQSxJQUFJLENBQUMsR0FBRyxDQUFDO01BRVgsT0FBTyxJQUFJLENBQUNDLEtBQUssQ0FBQyxJQUFJLENBQUM3QixPQUFPLEVBQUU7UUFDL0I4QixZQUFZLEVBQUUsTUFBTTtRQUNwQkMsTUFBTSxFQUFFLE1BQU07UUFDZEMsT0FBTyxFQUFBWCxNQUFBLENBQUFZLE1BQUE7VUFDTkMsYUFBYSxFQUFFLGtCQUFrQixJQUFJLENBQUN0QyxPQUFPLENBQUNFLE1BQU0sRUFBRTtVQUN0RCxjQUFjLEVBQUU7UUFBbUMsR0FDaEQsSUFBSSxDQUFDRixPQUFPLENBQUNvQyxPQUFPLENBQ3ZCO1FBQ0RHLElBQUksRUFBRWY7T0FDTixDQUFDLENBQUNKLElBQUksQ0FBRW9CLEdBQUcsSUFBSTtRQUNmLE9BQU9DLFlBQUMsQ0FDTkMsTUFBTSxDQUFDO1VBQ1BDLFlBQVksRUFBRUYsWUFBQyxDQUFDQyxNQUFNLENBQUM7WUFBRWxDLElBQUksRUFBRWlDLFlBQUMsQ0FBQ0csTUFBTTtVQUFFLENBQUUsQ0FBQyxDQUFDQyxLQUFLO1NBQ2xELENBQUMsQ0FDREMsU0FBUyxDQUFDLENBQUM7VUFBRUg7UUFBWSxDQUFFLEtBQUtBLFlBQVksQ0FBQ2hCLEdBQUcsQ0FBQyxDQUFDO1VBQUVuQjtRQUFJLENBQUUsS0FBS0EsSUFBSSxDQUFDLENBQUMsQ0FDckV1QyxLQUFLLENBQUNQLEdBQUcsQ0FBQ1EsSUFBSSxFQUFFO1VBQUVDLEtBQUssRUFBRUEsQ0FBQSxLQUFNO1FBQWlCLENBQUUsQ0FBQztNQUN0RCxDQUFDLENBQUM7SUFDSCxDQUFDOzs7O0FBekZzQnJELGVBQUEsQ0FBQXNELGNBQWMsR0FBRyxpQkFBaUI7QUFFM0N0RCxlQUFBLENBQUF1RCxhQUFhLEdBQUcsTUFBTSxJQUFJO0FBRTFCdkQsZUFBQSxDQUFBd0QsbUJBQW1CLEdBQUcsTUFBTSxJQUFJIiwiaWdub3JlTGlzdCI6W119