@browserstack/testcafe
Version:
Automated browser testing for the modern web development stack.
540 lines • 90.5 kB
JavaScript
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const lodash_1 = require("lodash");
const builder_symbol_1 = __importDefault(require("../builder-symbol"));
const snapshot_properties_1 = require("./snapshot-properties");
const get_callsite_1 = require("../../errors/get-callsite");
const client_function_builder_1 = __importDefault(require("../client-function-builder"));
const re_executable_promise_1 = __importDefault(require("../../utils/re-executable-promise"));
const type_assertions_1 = require("../../errors/runtime/type-assertions");
const make_reg_exp_1 = __importDefault(require("../../utils/make-reg-exp"));
const selector_text_filter_1 = __importDefault(require("./selector-text-filter"));
const selector_attribute_filter_1 = __importDefault(require("./selector-attribute-filter"));
const prepare_api_args_1 = __importDefault(require("./prepare-api-args"));
const VISIBLE_PROP_NAME = 'visible';
const filterNodes = (new client_function_builder_1.default((nodes, filter, querySelectorRoot, originNode, ...filterArgs) => {
if (typeof filter === 'number') {
const matchingNode = filter < 0 ? nodes[nodes.length + filter] : nodes[filter];
return matchingNode ? [matchingNode] : [];
}
const result = [];
if (typeof filter === 'string') {
// NOTE: we can search for elements only in document or element.
if (querySelectorRoot.nodeType !== 1 && querySelectorRoot.nodeType !== 9)
return null;
const matching = querySelectorRoot.querySelectorAll(filter);
const matchingArr = [];
for (let i = 0; i < matching.length; i++)
matchingArr.push(matching[i]);
filter = node => matchingArr.indexOf(node) > -1;
}
if (typeof filter === 'function') {
for (let j = 0; j < nodes.length; j++) {
if (filter(nodes[j], j, originNode, ...filterArgs))
result.push(nodes[j]);
}
}
return result;
})).getFunction();
const expandSelectorResults = (new client_function_builder_1.default((selector, populateDerivativeNodes) => {
const nodes = selector();
if (!nodes.length)
return null;
const result = [];
for (let i = 0; i < nodes.length; i++) {
const derivativeNodes = populateDerivativeNodes(nodes[i]);
if (derivativeNodes) {
for (let j = 0; j < derivativeNodes.length; j++) {
if (result.indexOf(derivativeNodes[j]) < 0)
result.push(derivativeNodes[j]);
}
}
}
return result;
})).getFunction();
async function getSnapshot(getSelector, callsite, SelectorBuilder, getVisibleValueMode) {
let node = null;
const selector = new SelectorBuilder(getSelector(), { getVisibleValueMode, needError: true }, { instantiation: 'Selector' }).getFunction();
try {
node = await selector();
}
catch (err) {
err.callsite = callsite;
throw err;
}
return node;
}
function assertAddCustomDOMPropertiesOptions(properties) {
type_assertions_1.assertType(type_assertions_1.is.nonNullObject, 'addCustomDOMProperties', '"addCustomDOMProperties" option', properties);
Object.keys(properties).forEach(prop => {
type_assertions_1.assertType(type_assertions_1.is.function, 'addCustomDOMProperties', `Custom DOM properties method '${prop}'`, properties[prop]);
});
}
function assertAddCustomMethods(properties, opts) {
type_assertions_1.assertType(type_assertions_1.is.nonNullObject, 'addCustomMethods', '"addCustomMethods" option', properties);
if (opts !== void 0)
type_assertions_1.assertType(type_assertions_1.is.nonNullObject, 'addCustomMethods', '"addCustomMethods" option', opts);
Object.keys(properties).forEach(prop => {
type_assertions_1.assertType(type_assertions_1.is.function, 'addCustomMethods', `Custom method '${prop}'`, properties[prop]);
});
}
function getDerivativeSelectorArgs(options, selectorFn, apiFn, filter, additionalDependencies) {
return Object.assign({}, options, { selectorFn, apiFn, filter, additionalDependencies });
}
function addSnapshotProperties(obj, getSelector, SelectorBuilder, properties) {
properties.forEach(prop => {
Object.defineProperty(obj, prop, {
get: () => {
const callsite = get_callsite_1.getCallsiteForMethod('get');
return re_executable_promise_1.default.fromFn(async () => {
const snapshot = await getSnapshot(getSelector, callsite, SelectorBuilder);
return snapshot[prop];
});
}
});
});
}
function addVisibleProperty({ obj, getSelector, SelectorBuilder }) {
Object.defineProperty(obj, VISIBLE_PROP_NAME, {
get: () => {
const callsite = get_callsite_1.getCallsiteForMethod('get');
return re_executable_promise_1.default.fromFn(async () => {
const snapshot = await getSnapshot(getSelector, callsite, SelectorBuilder, true);
return !!snapshot && snapshot[VISIBLE_PROP_NAME];
});
}
});
}
function addCustomMethods(obj, getSelector, SelectorBuilder, customMethods) {
const customMethodProps = customMethods ? Object.keys(customMethods) : [];
customMethodProps.forEach(prop => {
const { returnDOMNodes = false, method } = customMethods[prop];
const dependencies = {
customMethod: method,
selector: getSelector()
};
const callsiteNames = { instantiation: prop };
if (returnDOMNodes) {
obj[prop] = (...args) => {
const selectorFn = () => {
/* eslint-disable no-undef */
const nodes = selector();
return customMethod.apply(customMethod, [nodes].concat(args));
/* eslint-enable no-undef */
};
const apiFn = prepare_api_args_1.default(prop, ...args);
const filter = () => true;
const additionalDependencies = {
args,
customMethod: method
};
return createDerivativeSelectorWithFilter({ getSelector, SelectorBuilder, selectorFn, apiFn, filter, additionalDependencies });
};
}
else {
obj[prop] = (new client_function_builder_1.default((...args) => {
/* eslint-disable no-undef */
const node = selector();
return customMethod.apply(customMethod, [node].concat(args));
/* eslint-enable no-undef */
}, { dependencies }, callsiteNames)).getFunction();
}
});
}
exports.addCustomMethods = addCustomMethods;
function prepareSnapshotPropertyList(customDOMProperties) {
let properties = [...snapshot_properties_1.SNAPSHOT_PROPERTIES];
// NOTE: The 'visible' snapshot property has a separate handler.
lodash_1.pull(properties, VISIBLE_PROP_NAME);
if (customDOMProperties)
properties = properties.concat(Object.keys(customDOMProperties));
return properties;
}
function addSnapshotPropertyShorthands({ obj, getSelector, SelectorBuilder, customDOMProperties, customMethods }) {
const properties = prepareSnapshotPropertyList(customDOMProperties);
addSnapshotProperties(obj, getSelector, SelectorBuilder, properties);
addCustomMethods(obj, getSelector, SelectorBuilder, customMethods);
obj.getStyleProperty = prop => {
const callsite = get_callsite_1.getCallsiteForMethod('getStyleProperty');
return re_executable_promise_1.default.fromFn(async () => {
const snapshot = await getSnapshot(getSelector, callsite, SelectorBuilder);
return snapshot.style ? snapshot.style[prop] : void 0;
});
};
obj.getAttribute = attrName => {
const callsite = get_callsite_1.getCallsiteForMethod('getAttribute');
return re_executable_promise_1.default.fromFn(async () => {
const snapshot = await getSnapshot(getSelector, callsite, SelectorBuilder);
return snapshot.attributes ? snapshot.attributes[attrName] : void 0;
});
};
obj.hasAttribute = attrName => {
const callsite = get_callsite_1.getCallsiteForMethod('hasAttribute');
return re_executable_promise_1.default.fromFn(async () => {
const snapshot = await getSnapshot(getSelector, callsite, SelectorBuilder);
return snapshot.attributes ? snapshot.attributes.hasOwnProperty(attrName) : false;
});
};
obj.getBoundingClientRectProperty = prop => {
const callsite = get_callsite_1.getCallsiteForMethod('getBoundingClientRectProperty');
return re_executable_promise_1.default.fromFn(async () => {
const snapshot = await getSnapshot(getSelector, callsite, SelectorBuilder);
return snapshot.boundingClientRect ? snapshot.boundingClientRect[prop] : void 0;
});
};
obj.hasClass = name => {
const callsite = get_callsite_1.getCallsiteForMethod('hasClass');
return re_executable_promise_1.default.fromFn(async () => {
const snapshot = await getSnapshot(getSelector, callsite, SelectorBuilder);
return snapshot.classNames ? snapshot.classNames.indexOf(name) > -1 : false;
});
};
}
function createCounter(getSelector, SelectorBuilder) {
const builder = new SelectorBuilder(getSelector(), { counterMode: true }, { instantiation: 'Selector' });
const counter = builder.getFunction();
const callsite = get_callsite_1.getCallsiteForMethod('get');
return async () => {
try {
return await counter();
}
catch (err) {
err.callsite = callsite;
throw err;
}
};
}
function addCounterProperties({ obj, getSelector, SelectorBuilder }) {
Object.defineProperty(obj, 'count', {
get: () => {
const counter = createCounter(getSelector, SelectorBuilder);
return re_executable_promise_1.default.fromFn(() => counter());
}
});
Object.defineProperty(obj, 'exists', {
get: () => {
const counter = createCounter(getSelector, SelectorBuilder);
return re_executable_promise_1.default.fromFn(async () => await counter() > 0);
}
});
}
function convertFilterToClientFunctionIfNecessary(callsiteName, filter, dependencies) {
if (typeof filter === 'function') {
const builder = filter[builder_symbol_1.default];
const fn = builder ? builder.fn : filter;
const options = builder ? lodash_1.assign({}, builder.options, { dependencies }) : { dependencies };
return (new client_function_builder_1.default(fn, options, { instantiation: callsiteName })).getFunction();
}
return filter;
}
function createDerivativeSelectorWithFilter({ getSelector, SelectorBuilder, selectorFn, apiFn, filter, additionalDependencies }) {
const collectionModeSelectorBuilder = new SelectorBuilder(getSelector(), { collectionMode: true });
const customDOMProperties = collectionModeSelectorBuilder.options.customDOMProperties;
const customMethods = collectionModeSelectorBuilder.options.customMethods;
let dependencies = {
selector: collectionModeSelectorBuilder.getFunction(),
filter: filter,
filterNodes: filterNodes
};
const { boundTestRun, timeout, visibilityCheck, apiFnChain } = collectionModeSelectorBuilder.options;
dependencies = lodash_1.assign(dependencies, additionalDependencies);
const builder = new SelectorBuilder(selectorFn, {
dependencies,
customDOMProperties,
customMethods,
boundTestRun,
timeout,
visibilityCheck,
apiFnChain,
apiFn
}, { instantiation: 'Selector' });
return builder.getFunction();
}
const filterByText = convertFilterToClientFunctionIfNecessary('filter', selector_text_filter_1.default);
const filterByAttr = convertFilterToClientFunctionIfNecessary('filter', selector_attribute_filter_1.default);
function ensureRegExpContext(str) {
// NOTE: if a regexp is created in a separate context (via the 'vm' module) we
// should wrap it with new RegExp() to make the `instanceof RegExp` check successful.
if (typeof str !== 'string' && !(str instanceof RegExp))
return new RegExp(str);
return str;
}
function addFilterMethods(options) {
const { obj, getSelector, SelectorBuilder } = options;
obj.nth = index => {
type_assertions_1.assertType(type_assertions_1.is.number, 'nth', '"index" argument', index);
const apiFn = prepare_api_args_1.default('nth', index);
const builder = new SelectorBuilder(getSelector(), { index, apiFn }, { instantiation: 'Selector' });
return builder.getFunction();
};
obj.withText = text => {
type_assertions_1.assertType([type_assertions_1.is.string, type_assertions_1.is.regExp], 'withText', '"text" argument', text);
const apiFn = prepare_api_args_1.default('withText', text);
text = ensureRegExpContext(text);
const selectorFn = () => {
/* eslint-disable no-undef */
const nodes = selector();
if (!nodes.length)
return null;
return filterNodes(nodes, filter, document, void 0, textRe);
/* eslint-enable no-undef */
};
const args = getDerivativeSelectorArgs(options, selectorFn, apiFn, filterByText, { textRe: make_reg_exp_1.default(text) });
return createDerivativeSelectorWithFilter(args);
};
obj.withExactText = text => {
type_assertions_1.assertType(type_assertions_1.is.string, 'withExactText', '"text" argument', text);
const selectorFn = () => {
/* eslint-disable no-undef */
const nodes = selector();
if (!nodes.length)
return null;
return filterNodes(nodes, filter, document, void 0, exactText);
/* eslint-enable no-undef */
};
const apiFn = prepare_api_args_1.default('withExactText', text);
const args = getDerivativeSelectorArgs(options, selectorFn, apiFn, filterByText, { exactText: text });
return createDerivativeSelectorWithFilter(args);
};
obj.withAttribute = (attrName, attrValue) => {
type_assertions_1.assertType([type_assertions_1.is.string, type_assertions_1.is.regExp], 'withAttribute', '"attrName" argument', attrName);
const apiFn = prepare_api_args_1.default('withAttribute', attrName, attrValue);
attrName = ensureRegExpContext(attrName);
if (attrValue !== void 0) {
type_assertions_1.assertType([type_assertions_1.is.string, type_assertions_1.is.regExp], 'withAttribute', '"attrValue" argument', attrValue);
attrValue = ensureRegExpContext(attrValue);
}
const selectorFn = () => {
/* eslint-disable no-undef */
const nodes = selector();
if (!nodes.length)
return null;
return filterNodes(nodes, filter, document, void 0, attrName, attrValue);
/* eslint-enable no-undef */
};
const args = getDerivativeSelectorArgs(options, selectorFn, apiFn, filterByAttr, {
attrName,
attrValue
});
return createDerivativeSelectorWithFilter(args);
};
obj.filter = (filter, dependencies) => {
type_assertions_1.assertType([type_assertions_1.is.string, type_assertions_1.is.function], 'filter', '"filter" argument', filter);
const apiFn = prepare_api_args_1.default('filter', filter);
filter = convertFilterToClientFunctionIfNecessary('filter', filter, dependencies);
const selectorFn = () => {
/* eslint-disable no-undef */
const nodes = selector();
if (!nodes.length)
return null;
return filterNodes(nodes, filter, document, void 0);
/* eslint-enable no-undef */
};
const args = getDerivativeSelectorArgs(options, selectorFn, apiFn, filter);
return createDerivativeSelectorWithFilter(args);
};
obj.filterVisible = () => {
const apiFn = prepare_api_args_1.default('filterVisible');
const builder = new SelectorBuilder(getSelector(), { filterVisible: true, apiFn }, { instantiation: 'Selector' });
return builder.getFunction();
};
obj.filterHidden = () => {
const apiFn = prepare_api_args_1.default('filterHidden');
const builder = new SelectorBuilder(getSelector(), { filterHidden: true, apiFn }, { instantiation: 'Selector' });
return builder.getFunction();
};
}
function addCustomDOMPropertiesMethod({ obj, getSelector, SelectorBuilder }) {
obj.addCustomDOMProperties = customDOMProperties => {
assertAddCustomDOMPropertiesOptions(customDOMProperties);
const builder = new SelectorBuilder(getSelector(), { customDOMProperties }, { instantiation: 'Selector' });
return builder.getFunction();
};
}
function addCustomMethodsMethod({ obj, getSelector, SelectorBuilder }) {
obj.addCustomMethods = function (methods, opts) {
assertAddCustomMethods(methods, opts);
const customMethods = {};
Object.keys(methods).forEach(methodName => {
customMethods[methodName] = {
method: methods[methodName],
returnDOMNodes: opts && !!opts.returnDOMNodes
};
});
const builder = new SelectorBuilder(getSelector(), { customMethods }, { instantiation: 'Selector' });
return builder.getFunction();
};
}
function addHierarchicalSelectors(options) {
const { obj } = options;
// Find
obj.find = (filter, dependencies) => {
type_assertions_1.assertType([type_assertions_1.is.string, type_assertions_1.is.function], 'find', '"filter" argument', filter);
const apiFn = prepare_api_args_1.default('find', filter);
filter = convertFilterToClientFunctionIfNecessary('find', filter, dependencies);
const selectorFn = () => {
/* eslint-disable no-undef */
return expandSelectorResults(selector, node => {
if (typeof filter === 'string') {
return typeof node.querySelectorAll === 'function' ?
node.querySelectorAll(filter) :
null;
}
const results = [];
const visitNode = currentNode => {
const cnLength = currentNode.childNodes.length;
for (let i = 0; i < cnLength; i++) {
const child = currentNode.childNodes[i];
results.push(child);
visitNode(child);
}
};
visitNode(node);
return filterNodes(results, filter, null, node);
});
/* eslint-enable no-undef */
};
const args = getDerivativeSelectorArgs(options, selectorFn, apiFn, filter, { expandSelectorResults });
return createDerivativeSelectorWithFilter(args);
};
// Parent
obj.parent = (filter, dependencies) => {
if (filter !== void 0)
type_assertions_1.assertType([type_assertions_1.is.string, type_assertions_1.is.function, type_assertions_1.is.number], 'parent', '"filter" argument', filter);
const apiFn = prepare_api_args_1.default('parent', filter);
filter = convertFilterToClientFunctionIfNecessary('find', filter, dependencies);
const selectorFn = () => {
/* eslint-disable no-undef */
return expandSelectorResults(selector, node => {
const parents = [];
for (let parent = node.parentNode; parent; parent = parent.parentNode)
parents.push(parent);
return filter !== void 0 ? filterNodes(parents, filter, document, node) : parents;
});
/* eslint-enable no-undef */
};
const args = getDerivativeSelectorArgs(options, selectorFn, apiFn, filter, { expandSelectorResults });
return createDerivativeSelectorWithFilter(args);
};
// Child
obj.child = (filter, dependencies) => {
if (filter !== void 0)
type_assertions_1.assertType([type_assertions_1.is.string, type_assertions_1.is.function, type_assertions_1.is.number], 'child', '"filter" argument', filter);
const apiFn = prepare_api_args_1.default('child', filter);
filter = convertFilterToClientFunctionIfNecessary('find', filter, dependencies);
const selectorFn = () => {
/* eslint-disable no-undef */
return expandSelectorResults(selector, node => {
const childElements = [];
const cnLength = node.childNodes.length;
for (let i = 0; i < cnLength; i++) {
const child = node.childNodes[i];
if (child.nodeType === 1)
childElements.push(child);
}
return filter !== void 0 ? filterNodes(childElements, filter, node, node) : childElements;
});
/* eslint-enable no-undef */
};
const args = getDerivativeSelectorArgs(options, selectorFn, apiFn, filter, { expandSelectorResults });
return createDerivativeSelectorWithFilter(args);
};
// Sibling
obj.sibling = (filter, dependencies) => {
if (filter !== void 0)
type_assertions_1.assertType([type_assertions_1.is.string, type_assertions_1.is.function, type_assertions_1.is.number], 'sibling', '"filter" argument', filter);
const apiFn = prepare_api_args_1.default('sibling', filter);
filter = convertFilterToClientFunctionIfNecessary('find', filter, dependencies);
const selectorFn = () => {
/* eslint-disable no-undef */
return expandSelectorResults(selector, node => {
const parent = node.parentNode;
if (!parent)
return null;
const siblings = [];
const cnLength = parent.childNodes.length;
for (let i = 0; i < cnLength; i++) {
const child = parent.childNodes[i];
if (child.nodeType === 1 && child !== node)
siblings.push(child);
}
return filter !== void 0 ? filterNodes(siblings, filter, parent, node) : siblings;
});
/* eslint-enable no-undef */
};
const args = getDerivativeSelectorArgs(options, selectorFn, apiFn, filter, { expandSelectorResults });
return createDerivativeSelectorWithFilter(args);
};
// Next sibling
obj.nextSibling = (filter, dependencies) => {
if (filter !== void 0)
type_assertions_1.assertType([type_assertions_1.is.string, type_assertions_1.is.function, type_assertions_1.is.number], 'nextSibling', '"filter" argument', filter);
const apiFn = prepare_api_args_1.default('nextSibling', filter);
filter = convertFilterToClientFunctionIfNecessary('find', filter, dependencies);
const selectorFn = () => {
/* eslint-disable no-undef */
return expandSelectorResults(selector, node => {
const parent = node.parentNode;
if (!parent)
return null;
const siblings = [];
const cnLength = parent.childNodes.length;
let afterNode = false;
for (let i = 0; i < cnLength; i++) {
const child = parent.childNodes[i];
if (child === node)
afterNode = true;
else if (afterNode && child.nodeType === 1)
siblings.push(child);
}
return filter !== void 0 ? filterNodes(siblings, filter, parent, node) : siblings;
});
/* eslint-enable no-undef */
};
const args = getDerivativeSelectorArgs(options, selectorFn, apiFn, filter, { expandSelectorResults });
return createDerivativeSelectorWithFilter(args);
};
// Prev sibling
obj.prevSibling = (filter, dependencies) => {
if (filter !== void 0)
type_assertions_1.assertType([type_assertions_1.is.string, type_assertions_1.is.function, type_assertions_1.is.number], 'prevSibling', '"filter" argument', filter);
const apiFn = prepare_api_args_1.default('prevSibling', filter);
filter = convertFilterToClientFunctionIfNecessary('find', filter, dependencies);
const selectorFn = () => {
/* eslint-disable no-undef */
return expandSelectorResults(selector, node => {
const parent = node.parentNode;
if (!parent)
return null;
const siblings = [];
const cnLength = parent.childNodes.length;
for (let i = 0; i < cnLength; i++) {
const child = parent.childNodes[i];
if (child === node)
break;
if (child.nodeType === 1)
siblings.push(child);
}
return filter !== void 0 ? filterNodes(siblings, filter, parent, node) : siblings;
});
/* eslint-enable no-undef */
};
const args = getDerivativeSelectorArgs(options, selectorFn, apiFn, filter, { expandSelectorResults });
return createDerivativeSelectorWithFilter(args);
};
}
function addAPI(selector, getSelector, SelectorBuilder, customDOMProperties, customMethods) {
const options = { obj: selector, getSelector, SelectorBuilder, customDOMProperties, customMethods };
addFilterMethods(options);
addHierarchicalSelectors(options);
addSnapshotPropertyShorthands(options);
addCustomDOMPropertiesMethod(options);
addCustomMethodsMethod(options);
addCounterProperties(options);
addVisibleProperty(options);
}
exports.addAPI = addAPI;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRkLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jbGllbnQtZnVuY3Rpb25zL3NlbGVjdG9ycy9hZGQtYXBpLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsbUNBQWdEO0FBQ2hELHVFQUE0RDtBQUM1RCwrREFBNEQ7QUFDNUQsNERBQWlFO0FBQ2pFLHlGQUErRDtBQUMvRCw4RkFBb0U7QUFDcEUsMEVBQXNFO0FBQ3RFLDRFQUFrRDtBQUNsRCxrRkFBd0Q7QUFDeEQsNEZBQWtFO0FBQ2xFLDBFQUFrRDtBQUVsRCxNQUFNLGlCQUFpQixHQUFHLFNBQVMsQ0FBQztBQUVwQyxNQUFNLFdBQVcsR0FBRyxDQUFDLElBQUksaUNBQXFCLENBQUMsQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLGlCQUFpQixFQUFFLFVBQVUsRUFBRSxHQUFHLFVBQVUsRUFBRSxFQUFFO0lBQzNHLElBQUksT0FBTyxNQUFNLEtBQUssUUFBUSxFQUFFO1FBQzVCLE1BQU0sWUFBWSxHQUFHLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFL0UsT0FBTyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztLQUM3QztJQUVELE1BQU0sTUFBTSxHQUFHLEVBQUUsQ0FBQztJQUVsQixJQUFJLE9BQU8sTUFBTSxLQUFLLFFBQVEsRUFBRTtRQUM1QixnRUFBZ0U7UUFDaEUsSUFBSSxpQkFBaUIsQ0FBQyxRQUFRLEtBQUssQ0FBQyxJQUFJLGlCQUFpQixDQUFDLFFBQVEsS0FBSyxDQUFDO1lBQ3BFLE9BQU8sSUFBSSxDQUFDO1FBRWhCLE1BQU0sUUFBUSxHQUFNLGlCQUFpQixDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxDQUFD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