227 lines
18 KiB
JavaScript
227 lines
18 KiB
JavaScript
"use strict";
|
|
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
if (k2 === undefined) k2 = k;
|
|
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
}
|
|
Object.defineProperty(o, k2, desc);
|
|
}) : (function(o, m, k, k2) {
|
|
if (k2 === undefined) k2 = k;
|
|
o[k2] = m[k];
|
|
}));
|
|
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
}) : function(o, v) {
|
|
o["default"] = v;
|
|
});
|
|
var __importStar = (this && this.__importStar) || (function () {
|
|
var ownKeys = function(o) {
|
|
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
var ar = [];
|
|
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
return ar;
|
|
};
|
|
return ownKeys(o);
|
|
};
|
|
return function (mod) {
|
|
if (mod && mod.__esModule) return mod;
|
|
var result = {};
|
|
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
__setModuleDefault(result, mod);
|
|
return result;
|
|
};
|
|
})();
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
exports.run = exports.processRun = void 0;
|
|
const path = __importStar(require("path"));
|
|
const glob_1 = require("glob");
|
|
const dir_1 = require("@plastichub/fs/dir");
|
|
const exists_1 = require("@plastichub/fs/exists");
|
|
const write_1 = require("@plastichub/fs/write");
|
|
const read_1 = require("@plastichub/fs/read");
|
|
const osr_commons_1 = require("@plastichub/osr-commons");
|
|
const primitives_1 = require("@plastichub/core/primitives");
|
|
const __1 = require("../");
|
|
const client_1 = require("../client");
|
|
const zod_schema_1 = require("../zod_schema");
|
|
const source_1 = require("../source");
|
|
const array_1 = require("../utils/array");
|
|
const collector_1 = require("../collector");
|
|
const profile_1 = require("../profile");
|
|
const tools_1 = require("../tools");
|
|
const prompt_1 = require("../prompt");
|
|
const variables_1 = require("../variables");
|
|
const zod_schema_2 = require("../zod_schema");
|
|
const run_completion_1 = require("./run-completion");
|
|
const run_tools_1 = require("./run-tools");
|
|
const run_assistant_1 = require("./run-assistant");
|
|
const models_1 = require("../models");
|
|
const processRun = async (opts) => {
|
|
let options = null;
|
|
const target = path.resolve(opts.output || opts.path);
|
|
if (!(0, exists_1.sync)(target)) {
|
|
(0, dir_1.sync)(target);
|
|
}
|
|
opts.disable = (0, array_1.flatten)(opts.disable);
|
|
opts.disableTools = (0, array_1.flatten)(opts.disableTools);
|
|
opts.include = (0, array_1.flatten)(opts.include);
|
|
opts.variables = await (0, profile_1.load)(opts);
|
|
try {
|
|
options = (0, zod_schema_1.OptionsSchema)().parse(opts);
|
|
}
|
|
catch (error) {
|
|
__1.logger.error('Failed to parse options:', error.message, error.issues);
|
|
return;
|
|
}
|
|
const client = (0, client_1.createClient)(options);
|
|
options.variables = { ...options.variables, ...(0, variables_1.variables)(options) };
|
|
if (!client) {
|
|
__1.logger.error('Failed to create client');
|
|
return;
|
|
}
|
|
options.client = client;
|
|
options.collector = (0, collector_1.collector)(options, client);
|
|
let messages = [];
|
|
messages.push(await (0, prompt_1.prompt)(opts));
|
|
messages.push(await (0, prompt_1.preferences)(opts));
|
|
let files = await (0, source_1.get)(path.resolve(options.path), options.include) || [];
|
|
files = files.map(f => { return { ...f, role: 'user' }; });
|
|
messages = [...messages, ...files];
|
|
const params = {
|
|
model: options.model,
|
|
messages,
|
|
tools: []
|
|
};
|
|
if (options.mode === zod_schema_2.ChatCompletionType.TOOLS || options.mode === zod_schema_2.ChatCompletionType.ASSISTANT) {
|
|
params.tools = await (0, tools_1.load)(options);
|
|
params.tool_choice = 'auto';
|
|
params.parallel_tool_calls = false;
|
|
}
|
|
const logDir = path.resolve((0, osr_commons_1.resolve)(opts.logs));
|
|
const paramsPath = path.join(logDir, 'params.json');
|
|
(0, write_1.sync)(paramsPath, JSON.stringify({ ...params }, null, 2));
|
|
__1.logger.debug(`Read ${files.length} files from project ${path.resolve(options.path)} with ${options.include}`, files.map(f => f.path), options.variables, params.tools.map(t => `${t.function.name} : ${t.function.description}`));
|
|
let ret = null;
|
|
try {
|
|
switch (options.mode) {
|
|
case zod_schema_2.ChatCompletionType.COMPLETION:
|
|
ret = await (0, run_completion_1.runCompletion)(client, params, options);
|
|
break;
|
|
case zod_schema_2.ChatCompletionType.TOOLS:
|
|
ret = await (0, run_tools_1.runTools)(client, params, options);
|
|
break;
|
|
case zod_schema_2.ChatCompletionType.ASSISTANT:
|
|
ret = await (0, run_assistant_1.runAssistant)(client, params, options);
|
|
break;
|
|
default:
|
|
throw new Error(`Unsupported mode: ${options.mode}`);
|
|
}
|
|
}
|
|
catch (e) {
|
|
__1.logger.error(`Error running ${options.mode} mode: ${e.message}`);
|
|
}
|
|
opts.variables['LAST'] = ret;
|
|
return ret;
|
|
};
|
|
exports.processRun = processRun;
|
|
/**
|
|
* Extract file paths (Windows or POSIX style) from a single string,
|
|
* preserving any spaces within the paths. Needed for Salamand File Manager selections (eg: kbot "summarize, as json" -i "$(ListOfSelectedFullNames)")
|
|
* - For Windows, it looks for patterns like "C:\" (any drive letter).
|
|
* - For POSIX, it looks for a leading slash "/".
|
|
*
|
|
* Returns an array of path strings. If no matches are found, returns [].
|
|
*
|
|
*/
|
|
function extractPaths(input) {
|
|
if ((0, exists_1.sync)(path.resolve((0, osr_commons_1.resolve)(input)))) {
|
|
return [input];
|
|
}
|
|
// Matches either a Windows drive pattern like "C:\" or a forward slash "/".
|
|
// Parentheses group with `|` to match either part correctly.
|
|
const pathStartRegex = /([A-Za-z]:\\)|\//g;
|
|
const matchIndices = [];
|
|
let match;
|
|
// Collect the start index of each path
|
|
while ((match = pathStartRegex.exec(input)) !== null) {
|
|
matchIndices.push(match.index);
|
|
}
|
|
// If none found, return empty
|
|
if (!matchIndices.length) {
|
|
return [];
|
|
}
|
|
// Slice from each index to just before the next
|
|
const paths = [];
|
|
for (let i = 0; i < matchIndices.length; i++) {
|
|
const start = matchIndices[i];
|
|
const end = i < matchIndices.length - 1 ? matchIndices[i + 1] : input.length;
|
|
const path = input.substring(start, end).trim();
|
|
if (path) {
|
|
paths.push(path);
|
|
}
|
|
}
|
|
return paths;
|
|
}
|
|
function flattenArrays(arrays) {
|
|
return arrays.reduce((accumulator, current) => {
|
|
return accumulator.concat(current);
|
|
}, []);
|
|
}
|
|
const run = async (opts) => {
|
|
const ret = [];
|
|
if (opts.include) {
|
|
if ((0, primitives_1.isString)(opts.include)) {
|
|
opts.include = [opts.include];
|
|
}
|
|
if ((0, primitives_1.isArray)(opts.include)) {
|
|
opts.include = flattenArrays(opts.include.map(extractPaths));
|
|
}
|
|
opts.include = Array.from(new Set(opts.include));
|
|
}
|
|
if (opts.each) {
|
|
let items = [];
|
|
if ((0, primitives_1.isArray)(opts.each)) {
|
|
items = opts.each;
|
|
}
|
|
else if ((0, exists_1.sync)(opts.each) && (0, osr_commons_1.isFile)(opts.each) && path.parse(opts.each).ext === '.json') {
|
|
items = (0, read_1.sync)(opts.each, 'json') || [];
|
|
}
|
|
else if ((0, glob_1.hasMagic)(opts.each)) {
|
|
const info = (0, osr_commons_1.pathInfoEx)((0, osr_commons_1.forward_slash)(path.resolve((0, osr_commons_1.resolve)(opts.each))));
|
|
items = info.FILES;
|
|
}
|
|
else if ((0, osr_commons_1.isFile)(opts.each) && (0, exists_1.sync)(opts.each)) {
|
|
items = [opts.each];
|
|
}
|
|
else if ((0, primitives_1.isString)(opts.each)) {
|
|
items = opts.each.split(',');
|
|
}
|
|
if (items.length === 0) {
|
|
__1.logger.warn(`No files matching pattern ${opts.each} found in ${opts.path}`);
|
|
return ret;
|
|
}
|
|
__1.logger.info(`Processing ${items.length} items matching pattern ${opts.each}...`);
|
|
const _models = (0, models_1.all)();
|
|
for (const item of items) {
|
|
const itemOpts = {
|
|
...opts,
|
|
ITEM: item,
|
|
variables: { ITEM: item }
|
|
};
|
|
//override model if item is a model id
|
|
const model = _models.find(m => m.id === item);
|
|
if (model) {
|
|
itemOpts.model = item;
|
|
}
|
|
itemOpts.include = [...opts.include, ...[(0, osr_commons_1.forward_slash)(item)]];
|
|
ret.push(await (0, exports.processRun)(itemOpts));
|
|
}
|
|
}
|
|
else {
|
|
ret.push(await (0, exports.processRun)(opts));
|
|
}
|
|
return ret;
|
|
};
|
|
exports.run = run;
|
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVuLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2NvbW1hbmRzL3J1bi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSwyQ0FBNEI7QUFDNUIsK0JBQStCO0FBQy9CLDRDQUFnRDtBQUNoRCxrREFBc0Q7QUFDdEQsZ0RBQW9EO0FBQ3BELDhDQUFrRDtBQUNsRCx5REFBOEY7QUFDOUYsNERBQStEO0FBRy9ELDJCQUE0QjtBQUM1QixzQ0FBd0M7QUFDeEMsOENBQTZDO0FBQzdDLHNDQUErQjtBQUMvQiwwQ0FBd0M7QUFDeEMsNENBQXdDO0FBQ3hDLHdDQUFnRDtBQUNoRCxvQ0FBNEM7QUFDNUMsc0NBQStDO0FBQy9DLDRDQUF3QztBQUN4Qyw4Q0FBa0Q7QUFFbEQscURBQWdEO0FBQ2hELDJDQUFzQztBQUN0QyxtREFBOEM7QUFFOUMsc0NBQStCO0FBRXhCLE1BQU0sVUFBVSxHQUFHLEtBQUssRUFBRSxJQUFlLEVBQUUsRUFBRTtJQUVsRCxJQUFJLE9BQU8sR0FBYyxJQUFJLENBQUE7SUFDN0IsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQTtJQUNyRCxJQUFJLENBQUMsSUFBQSxhQUFNLEVBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztRQUNwQixJQUFBLFVBQUcsRUFBQyxNQUFNLENBQUMsQ0FBQTtJQUNiLENBQUM7SUFDRCxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUEsZUFBTyxFQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQTtJQUNwQyxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUEsZUFBTyxFQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQTtJQUM5QyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUEsZUFBTyxFQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQTtJQUNwQyxJQUFJLENBQUMsU0FBUyxHQUFHLE1BQU0sSUFBQSxjQUFXLEVBQUMsSUFBSSxDQUFDLENBQUE7SUFDeEMsSUFBSSxDQUFDO1FBQ0gsT0FBTyxHQUFHLElBQUEsMEJBQWEsR0FBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQVEsQ0FBQTtJQUM5QyxDQUFDO0lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztRQUNmLFVBQU0sQ0FBQyxLQUFLLENBQUMsMEJBQTBCLEVBQUUsS0FBSyxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUE7UUFDckUsT0FBTTtJQUNSLENBQUM7SUFFRCxNQUFNLE1BQU0sR0FBRyxJQUFBLHFCQUFZLEVBQUMsT0FBTyxDQUFDLENBQUE7SUFDcEMsT0FBTyxDQUFDLFNBQVMsR0FBRyxFQUFFLEdBQUcsT0FBTyxDQUFDLFNBQVMsRUFBRSxHQUFHLElBQUEscUJBQVMsRUFBQyxPQUFPLENBQUMsRUFBRSxDQUFBO0lBRW5FLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNaLFVBQU0sQ0FBQyxLQUFLLENBQUMseUJBQXlCLENBQUMsQ0FBQTtRQUN2QyxPQUFNO0lBQ1IsQ0FBQztJQUNELE9BQU8sQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFBO0lBQ3ZCLE9BQU8sQ0FBQyxTQUFTLEdBQUcsSUFBQSxxQkFBUyxFQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQTtJQUU5QyxJQUFJLFFBQVEsR0FBc0MsRUFBRSxDQUFBO0lBRXBELFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxJQUFBLGVBQU0sRUFBQyxJQUFJLENBQUMsQ0FBQyxDQUFBO0lBQ2pDLFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxJQUFBLG9CQUFXLEVBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQTtJQUV0QyxJQUFJLEtBQUssR0FBRyxNQUFNLElBQUEsWUFBRyxFQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUE7SUFDeEUsS0FBSyxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxPQUFPLEVBQUUsR0FBRyxDQUFDLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxDQUFBLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFDekQsUUFBUSxHQUFHLENBQUMsR0FBRyxRQUFlLEVBQUUsR0FBRyxLQUFLLENBQUMsQ0FBQTtJQUV6QyxNQUFNLE1BQU0sR0FBRztRQUNiLEtBQUssRUFBRSxPQUFPLENBQUMsS0FBSztRQUNwQixRQUFRO1FBQ1IsS0FBSyxFQUFFLEVBQUU7S0FDNkIsQ0FBQTtJQUV4QyxJQUFJLE9BQU8sQ0FBQyxJQUFJLEtBQUssK0JBQWtCLENBQUMsS0FBSyxJQUFJLE9BQU8sQ0FBQyxJQUFJLEtBQUssK0JBQWtCLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDL0YsTUFBTSxDQUFDLEtBQUssR0FBRyxNQUFNLElBQUEsWUFBUyxFQUFDLE9BQU8sQ0FBQyxDQUFBO1FBQ3ZDLE1BQU0sQ0FBQyxXQUFXLEdBQUcsTUFBTSxDQUFBO1FBQzNCLE1BQU0sQ0FBQyxtQkFBbUIsR0FBRyxLQUFLLENBQUE7SUFDcEMsQ0FBQztJQUVELE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBQSxxQkFBTyxFQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFBO0lBQy9DLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLGFBQWEsQ0FBQyxDQUFBO0lBQ25ELElBQUEsWUFBSyxFQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsR0FBRyxNQUFNLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQTtJQUN6RCxVQUFNLENBQUMsS0FBSyxDQUFDLFFBQVEsS0FBSyxDQUFDLE1BQU0sdUJBQXVCLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxTQUFTLE9BQU8sQ0FBQyxPQUFPLEVBQUUsRUFBRSxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLE9BQU8sQ0FBQyxTQUFTLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxNQUFNLENBQUMsQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFBO0lBQ2pPLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQTtJQUNkLElBQUksQ0FBQztRQUNILFFBQVEsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ3JCLEtBQUssK0JBQWtCLENBQUMsVUFBVTtnQkFDaEMsR0FBRyxHQUFHLE1BQU0sSUFBQSw4QkFBYSxFQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUE7Z0JBQ2xELE1BQUs7WUFFUCxLQUFLLCtCQUFrQixDQUFDLEtBQUs7Z0JBQzNCLEdBQUcsR0FBRyxNQUFNLElBQUEsb0JBQVEsRUFBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFBO2dCQUM3QyxNQUFLO1lBRVAsS0FBSywrQkFBa0IsQ0FBQyxTQUFTO2dCQUMvQixHQUFHLEdBQUcsTUFBTSxJQUFBLDRCQUFZLEVBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQTtnQkFDakQsTUFBSztZQUVQO2dCQUNFLE1BQU0sSUFBSSxLQUFLLENBQUMscUJBQXFCLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFBO1FBQ3hELENBQUM7SUFDSCxDQUFDO0lBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztRQUNYLFVBQU0sQ0FBQyxLQUFLLENBQUMsaUJBQWlCLE9BQU8sQ0FBQyxJQUFJLFVBQVUsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUE7SUFDbEUsQ0FBQztJQUNELElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLEdBQUcsR0FBRyxDQUFBO0lBQzVCLE9BQU8sR0FBRyxDQUFBO0FBQ1osQ0FBQyxDQUFBO0FBNUVZLFFBQUEsVUFBVSxjQTRFdEI7QUFFRDs7Ozs7Ozs7R0FRRztBQUNILFNBQVMsWUFBWSxDQUFDLEtBQWE7SUFFakMsSUFBRyxJQUFBLGFBQU0sRUFBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUEscUJBQU8sRUFBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUMsQ0FBQztRQUN2QyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUE7SUFDaEIsQ0FBQztJQUVELDRFQUE0RTtJQUM1RSw2REFBNkQ7SUFDN0QsTUFBTSxjQUFjLEdBQUcsbUJBQW1CLENBQUM7SUFFM0MsTUFBTSxZQUFZLEdBQWEsRUFBRSxDQUFDO0lBQ2xDLElBQUksS0FBNkIsQ0FBQztJQUVsQyx1Q0FBdUM7SUFDdkMsT0FBTyxDQUFDLEtBQUssR0FBRyxjQUFjLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUM7UUFDckQsWUFBWSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDakMsQ0FBQztJQUVELDhCQUE4QjtJQUM5QixJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ3pCLE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQztJQUVELGdEQUFnRDtJQUNoRCxNQUFNLEtBQUssR0FBYSxFQUFFLENBQUM7SUFDM0IsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFlBQVksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUM3QyxNQUFNLEtBQUssR0FBRyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDOUIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxHQUFHLFlBQVksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDO1FBQzdFLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ2hELElBQUksSUFBSSxFQUFFLENBQUM7WUFDVCxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ25CLENBQUM7SUFDSCxDQUFDO0lBRUQsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDO0FBRUQsU0FBUyxhQUFhLENBQUksTUFBYTtJQUNyQyxPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxXQUFXLEVBQUUsT0FBTyxFQUFFLEVBQUU7UUFDNUMsT0FBTyxXQUFXLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3JDLENBQUMsRUFBRSxFQUFTLENBQUMsQ0FBQztBQUNoQixDQUFDO0FBRU0sTUFBTSxHQUFHLEdBQUcsS0FBSyxFQUFFLElBQWUsRUFBRSxFQUFFO0lBQzNDLE1BQU0sR0FBRyxHQUFHLEVBQUUsQ0FBQTtJQUNkLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ2pCLElBQUksSUFBQSxxQkFBUSxFQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQzNCLElBQUksQ0FBQyxPQUFPLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUE7UUFDL0IsQ0FBQztRQUNELElBQUksSUFBQSxvQkFBTyxFQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQzFCLElBQUksQ0FBQyxPQUFPLEdBQUcsYUFBYSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUE7UUFDOUQsQ0FBQztRQUNELElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQTtJQUNsRCxDQUFDO0lBQ0QsSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDZCxJQUFJLEtBQUssR0FBYSxFQUFFLENBQUE7UUFDeEIsSUFBSSxJQUFBLG9CQUFPLEVBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDdkIsS0FBSyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUE7UUFDbkIsQ0FBQzthQUFNLElBQUksSUFBQSxhQUFNLEVBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUEsb0JBQU0sRUFBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxLQUFLLE9BQU8sRUFBRSxDQUFDO1lBQzNGLEtBQUssR0FBRyxJQUFBLFdBQUksRUFBQyxJQUFJLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBTyxJQUFJLEVBQUUsQ0FBQTtRQUM3QyxDQUFDO2FBQU0sSUFBSSxJQUFBLGVBQVEsRUFBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUMvQixNQUFNLElBQUksR0FBRyxJQUFBLHdCQUFVLEVBQUMsSUFBQSwyQkFBYSxFQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBQSxxQkFBTyxFQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQTtZQUN4RSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQTtRQUNwQixDQUFDO2FBQU0sSUFBSSxJQUFBLG9CQUFNLEVBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUEsYUFBTSxFQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ2xELEtBQUssR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUNyQixDQUFDO2FBQU0sSUFBSSxJQUFBLHFCQUFRLEVBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDL0IsS0FBSyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFBO1FBQzlCLENBQUM7UUFDRCxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDdkIsVUFBTSxDQUFDLElBQUksQ0FBQyw2QkFBNkIsSUFBSSxDQUFDLElBQUksYUFBYSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQTtZQUMzRSxPQUFPLEdBQUcsQ0FBQTtRQUNaLENBQUM7UUFDRCxVQUFNLENBQUMsSUFBSSxDQUFDLGNBQWMsS0FBSyxDQUFDLE1BQU0sMkJBQTJCLElBQUksQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFBO1FBQ2hGLE1BQU0sT0FBTyxHQUFHLElBQUEsWUFBRyxHQUFFLENBQUE7UUFDckIsS0FBSyxNQUFNLElBQUksSUFBSSxLQUFLLEVBQUUsQ0FBQztZQUN6QixNQUFNLFFBQVEsR0FBRztnQkFDZixHQUFHLElBQUk7Z0JBQ1AsSUFBSSxFQUFFLElBQUk7Z0JBQ1YsU0FBUyxFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRTthQUMxQixDQUFBO1lBQ0Qsc0NBQXNDO1lBQ3RDLE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLElBQUksQ0FBQyxDQUFBO1lBQzlDLElBQUksS0FBSyxFQUFFLENBQUM7Z0JBQ1YsUUFBUSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUE7WUFDdkIsQ0FBQztZQUNELFFBQVEsQ0FBQyxPQUFPLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLEVBQUUsR0FBRyxDQUFDLElBQUEsMkJBQWEsRUFBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUE7WUFDOUQsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLElBQUEsa0JBQVUsRUFBQyxRQUFRLENBQUMsQ0FBQyxDQUFBO1FBQ3RDLENBQUM7SUFDSCxDQUFDO1NBQU0sQ0FBQztRQUNOLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxJQUFBLGtCQUFVLEVBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQTtJQUNsQyxDQUFDO0lBQ0QsT0FBTyxHQUFHLENBQUE7QUFDWixDQUFDLENBQUE7QUFqRFksUUFBQSxHQUFHLE9BaURmIn0=
|