@pictogrammers/element
Version:
Web Component Element for TypeScript
185 lines • 27.9 kB
JavaScript
export const addObserver = Symbol('addObserver');
export const removeObserver = Symbol('removeObserver');
export const hasObserver = Symbol('getObservers');
export const swapObserver = Symbol('swapObserver');
export const isProxy = Symbol('isProxy');
export const getTarget = Symbol('getTarget');
const arrayMutate = ['fill', 'pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift'];
const observers = new Map();
export function createProxy(obj) {
return new Proxy(obj, {
get(target, prop) {
if (typeof prop === 'symbol') {
switch (prop) {
case isProxy:
return true;
case getTarget:
return target;
case hasObserver:
return (host) => {
const hosts = observers.get(obj);
return hosts?.has(host);
};
case swapObserver:
return (host, newObj) => {
const hosts = observers.get(obj);
if (hosts) {
const elements = hosts.get(host);
if (elements) {
elements.forEach((callbacks, element) => {
if (callbacks) {
const hostsNew = observers.get(newObj);
if (hostsNew) {
const elementsNew = hostsNew.get(host);
if (elementsNew) {
elementsNew.set(element, callbacks);
}
else {
hostsNew.set(host, new Map([[
element,
callbacks
]]));
}
}
else {
observers.set(newObj, new Map([[
host,
new Map([[
element,
callbacks
]])
]]));
}
}
else {
throw new Error('Unreachable');
}
elements.delete(element);
callbacks.forEach((callback) => {
callback(null, Mutation.swap, [newObj]);
});
});
}
}
};
case addObserver:
return (element, callback) => {
const host = element.getRootNode().host;
const hosts = observers.get(obj);
if (hosts) {
const elements = hosts.get(host);
if (elements) {
const callbacks = elements.get(element);
if (callbacks) {
callbacks.push(callback);
}
else {
elements.set(element, [callback]);
}
}
else {
hosts.set(host, new Map([[
element, [callback]
]]));
}
}
else {
observers.set(obj, new Map([[
host,
new Map([[
element, [callback]
]])
]]));
}
};
case removeObserver:
return (element) => {
const host = element.getRootNode().host;
const hosts = observers.get(obj);
if (hosts) {
const elements = hosts.get(host);
if (elements) {
elements.delete(element);
if (elements.size === 0) {
hosts.delete(host);
}
}
if (hosts.size === 0) {
observers.delete(obj);
}
}
};
case Symbol.iterator:
case Symbol.toPrimitive:
case Symbol.toStringTag:
return Reflect.get(target, prop);
}
throw new Error('Unsupported symbol');
}
if (prop in target) {
if (!Number.isNaN(Number(prop))) {
if (typeof target[prop] === 'object') {
return createProxy(target[prop]);
}
return target[prop];
}
if (prop === 'copyWithin') {
throw new Error('Unsupported array method copyWithin');
}
if (arrayMutate.includes(prop)) {
if (observers.has(target)) {
return function () {
const result = Array.prototype[prop].apply(target, arguments);
const hosts = observers.get(target);
hosts?.forEach((elements) => {
elements.forEach((callbacks) => {
callbacks.forEach((callback) => {
callback(target, prop, arguments);
});
});
});
return result;
};
}
return Reflect.get(target, prop);
}
if (target[prop] instanceof Array) {
return createProxy(target[prop]);
}
// nested objects do not get proxied for perf
}
return Reflect.get(target, prop);
},
set(target, prop, value) {
if (typeof prop === 'symbol') {
throw new Error('Setting symbols not allowed.');
}
if (Array.isArray(target)) {
return Reflect.set(target, prop, value);
}
if (observers.has(target)) {
const hosts = observers.get(target);
hosts?.forEach((elements) => {
elements.forEach((callbacks) => {
callbacks.forEach((callback) => {
callback(prop, value);
});
});
});
}
return Reflect.set(target, prop, value);
}
});
}
export const Mutation = {
fill: 'fill',
pop: 'pop',
push: 'push',
reverse: 'reverse',
shift: 'shift',
sort: 'sort',
splice: 'splice',
unshift: 'unshift',
swap: 'swap',
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJveHkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvcHJveHkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsTUFBTSxDQUFDLE1BQU0sV0FBVyxHQUFrQixNQUFNLENBQUMsYUFBYSxDQUFDLENBQUM7QUFDaEUsTUFBTSxDQUFDLE1BQU0sY0FBYyxHQUFrQixNQUFNLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztBQUN0RSxNQUFNLENBQUMsTUFBTSxXQUFXLEdBQWtCLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQztBQUNqRSxNQUFNLENBQUMsTUFBTSxZQUFZLEdBQWtCLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQztBQUNsRSxNQUFNLENBQUMsTUFBTSxPQUFPLEdBQWtCLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztBQUN4RCxNQUFNLENBQUMsTUFBTSxTQUFTLEdBQWtCLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQztBQU01RCxNQUFNLFdBQVcsR0FBRyxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQztBQVU3RixNQUFNLFNBQVMsR0FBRyxJQUFJLEdBQUcsRUFBZ0IsQ0FBQztBQStCMUMsTUFBTSxVQUFVLFdBQVcsQ0FBSSxHQUFNO0lBQ25DLE9BQU8sSUFBSSxLQUFLLENBQUMsR0FBVSxFQUFFO1FBQzNCLEdBQUcsQ0FBQyxNQUFXLEVBQUUsSUFBcUI7WUFDcEMsSUFBSSxPQUFPLElBQUksS0FBSyxRQUFRLEVBQUUsQ0FBQztnQkFDN0IsUUFBUSxJQUFJLEVBQUUsQ0FBQztvQkFDYixLQUFLLE9BQU87d0JBQ1YsT0FBTyxJQUFJLENBQUM7b0JBQ2QsS0FBSyxTQUFTO3dCQUNaLE9BQU8sTUFBTSxDQUFDO29CQUNoQixLQUFLLFdBQVc7d0JBQ2QsT0FBTyxDQUFDLElBQWlCLEVBQUUsRUFBRTs0QkFDM0IsTUFBTSxL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QyxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUU7b0JBQzFCLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxTQUFjLEVBQUUsRUFBRTt3QkFDbEMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLFFBQWEsRUFBRSxFQUFFOzRCQUNsQyxRQUFRLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO3dCQUN4QixDQUFDLENBQUMsQ0FBQztvQkFDTCxDQUFDLENBQUMsQ0FBQztnQkFDTCxDQUFDLENBQUMsQ0FBQztZQUNMLENBQUM7WUFDRCxPQUFPLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztRQUMxQyxDQUFDO0tBQ0YsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLFFBQVEsR0FBRztJQUN0QixJQUFJLEVBQUUsTUFBTTtJQUNaLEdBQUcsRUFBRSxLQUFLO0lBQ1YsSUFBSSxFQUFFLE1BQU07SUFDWixPQUFPLEVBQUUsU0FBUztJQUNsQixLQUFLLEVBQUUsT0FBTztJQUNkLElBQUksRUFBRSxNQUFNO0lBQ1osTUFBTSxFQUFFLFFBQVE7SUFDaEIsT0FBTyxFQUFFLFNBQVM7SUFDbEIsSUFBSSxFQUFFLE1BQU07Q0FDYixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGNvbnN0IGFkZE9ic2VydmVyOiB1bmlxdWUgc3ltYm9sID0gU3ltYm9sKCdhZGRPYnNlcnZlcicpO1xyXG5leHBvcnQgY29uc3QgcmVtb3ZlT2JzZXJ2ZXI6IHVuaXF1ZSBzeW1ib2wgPSBTeW1ib2woJ3JlbW92ZU9ic2VydmVyJyk7XHJcbmV4cG9ydCBjb25zdCBoYXNPYnNlcnZlcjogdW5pcXVlIHN5bWJvbCA9IFN5bWJvbCgnZ2V0T2JzZXJ2ZXJzJyk7XHJcbmV4cG9ydCBjb25zdCBzd2FwT2JzZXJ2ZXI6IHVuaXF1ZSBzeW1ib2wgPSBTeW1ib2woJ3N3YXBPYnNlcnZlcicpO1xyXG5leHBvcnQgY29uc3QgaXNQcm94eTogdW5pcXVlIHN5bWJvbCA9IFN5bWJvbCgnaXNQcm94eScpO1xyXG5leHBvcnQgY29uc3QgZ2V0VGFyZ2V0OiB1bmlxdWUgc3ltYm9sID0gU3ltYm9sKCdnZXRUYXJnZXQnKTtcclxuXHJcbnR5cGUgQWRkT2JzZXJ2ZXJDYWxsYmFjayA9IChrZXk/OiBzdHJpbmcpID0+IHZvaWQ7XHJcbnR5cGUgQWRkT2JzZXJ2ZXIgPSAoaG9zdDogSFRNTEVsZW1lbnQsIGNhbGxiYWNrOiBBZGRPYnNlcnZlckNhbGxiYWNrKSA9PiB2b2lkO1xyXG50eXBlIFJlbW92ZU9ic2VydmVyID0gKGhvc3Q6IEhUTUxFbGVtZW50KSA9PiB2b2lkO1xyXG5cclxuY29uc3QgYXJyYXlNdXRhdGUgPSBbJ2ZpbGwnLCAncG9wJywgJ3B1c2gnLCAncmV2ZXJzZScsICdzaGlmdCcsICdzb3J0JywgJ3NwbGljZScsICd1bnNoaWZ0J107XHJcblxyXG4vLyBrZXkgPSBvYmogICAgICAgICAgICAgICAgLSBvYnNlcnZlZCBvYmplY3RcclxuLy8gdmFsdWUgPSBNYXBcclxuLy8gICBrZXkgPSBob3N0ICAgICAgICAgICAgIC0gd2ViIGNvbXBvbmVudFxyXG4vLyAgIHZhbHVlID0gTWFwXHJcbi8vICAgICBrZXkgPSBlbGVtZW50ICAgICAgICAtIGZvckVhY2ggY29udGFpbmVyIG9yIGJpbmRpbmdcclxuLy8gICAgIHZhbHVlID0gY2FsbGJhY2tbXVxyXG50eXBlIEVsZW1lbnRNYXAgPSBNYXA8RWxlbWVudCwgYW55W10+O1xyXG50eXBlIEhvc3RNYXAgPSBNYXA8RWxlbWVudCwgRWxlbWVudE1hcD47XHJcbmNvbnN0IG9ic2VydmVycyA9IG5ldyBNYXA8YW55LCBIb3N0TWFwPigpO1xyXG5cclxudHlwZSBJc0FueTxUPiA9IHVua25vd24gZXh0ZW5kcyBUICYgc3RyaW5nID8gdHJ1ZSA6IGZhbHNlO1xyXG5cclxudHlwZSBFeHRyYXNBcnJheTxUPiA9IHtcclxuICBbYWRkT2JzZXJ2ZXJdOiBBZGRPYnNlcnZlcjtcclxuICBbcmVtb3ZlT2JzZXJ2ZXJdOiBSZW1vdmVPYnNlcnZlcjtcclxuICBbaXNQcm94eV06IGJvb2xlYW47XHJcbn0gJiBBcnJheTxUIGV4dGVuZHMgKGluZmVyIFUpW10gPyBQYXJ0aWFsPFU+IDogb2JqZWN0PjtcclxuXHJcbnR5cGUgRXh0cmFzID0ge1xyXG4gIFthZGRPYnNlcnZlcl06IEFkZE9ic2VydmVyO1xyXG4gIFtyZW1vdmVPYnNlcnZlcl06IFJlbW92ZU9ic2VydmVyO1xyXG4gIFtpc1Byb3h5XTogYm9vbGVhbjtcclxufTtcclxuXHJcbi8vIFNob3J0LWNpcmN1aXQgYW55IG9yIHRoaXMgaXMgaW5maW5pdGVcclxudHlwZSBSZWN1cnNpdmVQcm94eTxUPiA9IElzQW55PFQ+IGV4dGVuZHMgdHJ1ZVxyXG4gID8gYW55XHJcbiAgOiBUIGV4dGVuZHMgQXJyYXk8YW55PlxyXG4gID8gRXh0cmFzQXJyYXk8VD4gJiB7XHJcbiAgICBbUCBpbiBrZXlvZiBUXTogSXNBbnk8VFtQXT4gZXh0ZW5kcyB0cnVlID8gYW55IDogUmVjdXJzaXZlUHJveHk8VFtQXT5cclxuICB9XHJcbiAgOiB7XHJcbiAgICBbUCBpbiBrZXlvZiBUXTogSXNBbnk8VFtQXT4gZXh0ZW5kcyB0cnVlXHJcbiAgICA/IGFueVxyXG4gICAgOiBUW1BdIGV4dGVuZHMgQXJyYXk8YW55PlxyXG4gICAgPyBSZWN1cnNpdmVQcm94eTxUW1BdPlxyXG4gICAgOiBUW1BdXHJcbiAgfSAmIEV4dHJhcztcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVQcm94eTxUPihvYmo6IFQpOiBSZWN1cnNpdmVQcm94eTxUPiB7XHJcbiAgcmV0dXJuIG5ldyBQcm94eShvYmogYXMgYW55LCB7XHJcbiAgICBnZXQodGFyZ2V0OiBhbnksIHByb3A6IHN0cmluZyB8IHN5bWJvbCk6IGFueSB7XHJcbiAgICAgIGlmICh0eXBlb2YgcHJvcCA9PT0gJ3N5bWJvbCcpIHtcclxuICAgICAgICBzd2l0Y2ggKHByb3ApIHtcclxuICAgICAgICAgIGNhc2UgaXNQcm94eTpcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICBjYXNlIGdldFRhcmdldDpcclxuICAgICAgICAgICAgcmV0dXJuIHRhcmdldDtcclxuICAgICAgICAgIGNhc2UgaGFzT2JzZXJ2ZXI6XHJcbiAgICAgICAgICAgIHJldHVybiAoaG9zdDogSFRNTEVsZW1lbnQpID0+IHtcclxuICAgICAgICAgICAgICBjb25zdCBob3N0cyA9IG9ic2VydmVycy5nZXQob2JqKTtcclxuICAgICAgICAgICAgICByZXR1cm4gaG9zdHM/Lmhhcyhob3N0KTtcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgIGNhc2Ugc3dhcE9ic2VydmVyOlxyXG4gICAgICAgICAgICByZXR1cm4gKGhvc3Q6IEhUTUxFbGVtZW50LCBuZXdPYmo6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICAgIGNvbnN0IGhvc3RzID0gb2JzZXJ2ZXJzLmdldChvYmopO1xyXG4gICAgICAgICAgICAgIGlmIChob3N0cykge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZWxlbWVudHMgPSBob3N0cy5nZXQoaG9zdCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoZWxlbWVudHMpIHtcclxuICAgICAgICAgICAgICAgICAgZWxlbWVudHMuZm9yRWFjaCgoY2FsbGJhY2tzOiBhbnlbXSwgZWxlbWVudCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChjYWxsYmFja3MpIHtcclxuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhvc3RzTmV3ID0gb2JzZXJ2ZXJzLmdldChuZXdPYmopO1xyXG4gICAgICAgICAgICAgICAgICAgICAgaWYgKGhvc3RzTmV3KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVsZW1lbnRzTmV3ID0gaG9zdHNOZXcuZ2V0KGhvc3QpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudHNOZXcpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50c05ldy5zZXQoZWxlbWVudCwgY2FsbGJhY2tzKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICBob3N0c05ldy5zZXQoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBob3N0LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE1hcChbW1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFja3NcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF1dKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9ic2VydmVycy5zZXQoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3T2JqLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBNYXAoW1tcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvc3QsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgTWFwKFtbXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXV0pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgXV0pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVW5yZWFjaGFibGUnKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudHMuZGVsZXRlKGVsZW1lbnQpO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrcy5mb3JFYWNoKChjYWxsYmFjazogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhudWxsLCBNdXRhdGlvbi5zd2FwLCBbbmV3T2JqXSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgY2FzZSBhZGRPYnNlcnZlcjpcclxuICAgICAgICAgICAgcmV0dXJuIChlbGVtZW50OiBIVE1MRWxlbWVudCwgY2FsbGJhY2s6IEFkZE9ic2VydmVyQ2FsbGJhY2spID0+IHtcclxuICAgICAgICAgICAgICBjb25zdCBob3N0ID0gKGVsZW1lbnQuZ2V0Um9vdE5vZGUoKSBhcyBTaGFkb3dSb290KS5ob3N0O1xyXG4gICAgICAgICAgICAgIGNvbnN0IGhvc3RzID0gb2JzZXJ2ZXJzLmdldChvYmopO1xyXG4gICAgICAgICAgICAgIGlmIChob3N0cykge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZWxlbWVudHMgPSBob3N0cy5nZXQoaG9zdCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoZWxlbWVudHMpIHtcclxuICAgICAgICAgICAgICAgICAgY29uc3QgY2FsbGJhY2tzID0gZWxlbWVudHMuZ2V0KGVsZW1lbnQpO1xyXG4gICAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2tzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tzLnB1c2goY2FsbGJhY2spO1xyXG4gICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnRzLnNldChlbGVtZW50LCBbY2FsbGJhY2tdKTtcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgaG9zdHMuc2V0KFxyXG4gICAgICAgICAgICAgICAgICAgIGhvc3QsXHJcbiAgICAgICAgICAgICAgICAgICAgbmV3IE1hcChbW1xyXG4gICAgICAgICAgICAgICAgICAgICAgZWxlbWVudCwgW2NhbGxiYWNrXVxyXG4gICAgICAgICAgICAgICAgICAgIF1dKVxyXG4gICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBvYnNlcnZlcnMuc2V0KFxyXG4gICAgICAgICAgICAgICAgICBvYmosXHJcbiAgICAgICAgICAgICAgICAgIG5ldyBNYXAoW1tcclxuICAgICAgICAgICAgICAgICAgICBob3N0LFxyXG4gICAgICAgICAgICAgICAgICAgIG5ldyBNYXAoW1tcclxuICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQsIFtjYWxsYmFja11cclxuICAgICAgICAgICAgICAgICAgICBdXSlcclxuICAgICAgICAgICAgICAgICAgXV0pXHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgIGNhc2UgcmVtb3ZlT2JzZXJ2ZXI6XHJcbiAgICAgICAgICAgIHJldHVybiAoZWxlbWVudDogSFRNTEVsZW1lbnQpID0+IHtcclxuICAgICAgICAgICAgICBjb25zdCBob3N0ID0gKGVsZW1lbnQuZ2V0Um9vdE5vZGUoKSBhcyBTaGFkb3dSb290KS5ob3N0O1xyXG4gICAgICAgICAgICAgIGNvbnN0IGhvc3RzID0gb2JzZXJ2ZXJzLmdldChvYmopO1xyXG4gICAgICAgICAgICAgIGlmIChob3N0cykge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgZWxlbWVudHMgPSBob3N0cy5nZXQoaG9zdCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoZWxlbWVudHMpIHtcclxuICAgICAgICAgICAgICAgICAgZWxlbWVudHMuZGVsZXRlKGVsZW1lbnQpO1xyXG4gICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudHMuc2l6ZSA9PT0gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGhvc3RzLmRlbGV0ZShob3N0KTtcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgaWYgKGhvc3RzLnNpemUgPT09IDApIHtcclxuICAgICAgICAgICAgICAgICAgb2JzZXJ2ZXJzLmRlbGV0ZShvYmopO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfTtcclxuICAgICAgICAgIGNhc2UgU3ltYm9sLml0ZXJhdG9yOlxyXG4gICAgICAgICAgY2FzZSBTeW1ib2wudG9QcmltaXRpdmU6XHJcbiAgICAgICAgICBjYXNlIFN5bWJvbC50b1N0cmluZ1RhZzpcclxuICAgICAgICAgICAgcmV0dXJuIFJlZmxlY3QuZ2V0KHRhcmdldCwgcHJvcCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVW5zdXBwb3J0ZWQgc3ltYm9sJyk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHByb3AgaW4gdGFyZ2V0KSB7XHJcbiAgICAgICAgaWYgKCFOdW1iZXIuaXNOYU4oTnVtYmVyKHByb3ApKSkge1xyXG4gICAgICAgICAgaWYgKHR5cGVvZiB0YXJnZXRbcHJvcF0gPT09ICdvYmplY3QnKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVQcm94eSh0YXJnZXRbcHJvcF0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgcmV0dXJuIHRhcmdldFtwcm9wXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHByb3AgPT09ICdjb3B5V2l0aGluJykge1xyXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbnN1cHBvcnRlZCBhcnJheSBtZXRob2QgY29weVdpdGhpbicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoYXJyYXlNdXRhdGUuaW5jbHVkZXMocHJvcCkpIHtcclxuICAgICAgICAgIGlmIChvYnNlcnZlcnMuaGFzKHRhcmdldCkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcclxuICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBBcnJheS5wcm90b3R5cGVbcHJvcCBhcyBhbnldLmFwcGx5KHRhcmdldCwgYXJndW1lbnRzKTtcclxuICAgICAgICAgICAgICBjb25zdCBob3N0cyA9IG9ic2VydmVycy5nZXQodGFyZ2V0KTtcclxuICAgICAgICAgICAgICBob3N0cz8uZm9yRWFjaCgoZWxlbWVudHMpID0+IHtcclxuICAgICAgICAgICAgICAgIGVsZW1lbnRzLmZvckVhY2goKGNhbGxiYWNrczogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgIGNhbGxiYWNrcy5mb3JFYWNoKChjYWxsYmFjazogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sodGFyZ2V0LCBwcm9wLCBhcmd1bWVudHMpO1xyXG4gICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHJldHVybiBSZWZsZWN0LmdldCh0YXJnZXQsIHByb3ApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGFyZ2V0W3Byb3BdIGluc3RhbmNlb2YgQXJyYXkpIHtcclxuICAgICAgICAgIHJldHVybiBjcmVhdGVQcm94eSh0YXJnZXRbcHJvcF0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBuZXN0ZWQgb2JqZWN0cyBkbyBub3QgZ2V0IHByb3hpZWQgZm9yIHBlcmZcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gUmVmbGVjdC5nZXQodGFyZ2V0LCBwcm9wKTtcclxuICAgIH0sXHJcbiAgICBzZXQodGFyZ2V0OiBhbnksIHByb3A6IHN0cmluZyB8IHN5bWJvbCwgdmFsdWUpOiBib29sZWFuIHtcclxuICAgICAgaWYgKHR5cGVvZiBwcm9wID09PSAnc3ltYm9sJykge1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignU2V0dGluZyBzeW1ib2xzIG5vdCBhbGxvd2VkLicpO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHRhcmdldCkpIHtcclxuICAgICAgICByZXR1cm4gUmVmbGVjdC5zZXQodGFyZ2V0LCBwcm9wLCB2YWx1ZSk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKG9ic2VydmVycy5oYXModGFyZ2V0KSkge1xyXG4gICAgICAgIGNvbnN0IGhvc3RzID0gb2JzZXJ2ZXJzLmdldCh0YXJnZXQpO1xyXG4gICAgICAgIGhvc3RzPy5mb3JFYWNoKChlbGVtZW50cykgPT4ge1xyXG4gICAgICAgICAgZWxlbWVudHMuZm9yRWFjaCgoY2FsbGJhY2tzOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgY2FsbGJhY2tzLmZvckVhY2goKGNhbGxiYWNrOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgICBjYWxsYmFjayhwcm9wLCB2YWx1ZSk7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIFJlZmxlY3Quc2V0KHRhcmdldCwgcHJvcCwgdmFsdWUpO1xyXG4gICAgfVxyXG4gIH0pO1xyXG59XHJcblxyXG5leHBvcnQgY29uc3QgTXV0YXRpb24gPSB7XHJcbiAgZmlsbDogJ2ZpbGwnLFxyXG4gIHBvcDogJ3BvcCcsXHJcbiAgcHVzaDogJ3B1c2gnLFxyXG4gIHJldmVyc2U6ICdyZXZlcnNlJyxcclxuICBzaGlmdDogJ3NoaWZ0JyxcclxuICBzb3J0OiAnc29ydCcsXHJcbiAgc3BsaWNlOiAnc3BsaWNlJyxcclxuICB1bnNoaWZ0OiAndW5zaGlmdCcsXHJcbiAgc3dhcDogJ3N3YXAnLFxyXG59O1xyXG4iXX0=