You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
686 lines
58 KiB
686 lines
58 KiB
/*
|
|
THIS IS A GENERATED/BUNDLED FILE BY ROLLUP
|
|
if you want to view the source visit the plugins github repository
|
|
*/
|
|
|
|
'use strict';
|
|
|
|
var obsidian = require('obsidian');
|
|
|
|
/*! *****************************************************************************
|
|
Copyright (c) Microsoft Corporation.
|
|
|
|
Permission to use, copy, modify, and/or distribute this software for any
|
|
purpose with or without fee is hereby granted.
|
|
|
|
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
|
|
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
|
|
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
|
|
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
|
|
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
|
|
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
|
PERFORMANCE OF THIS SOFTWARE.
|
|
***************************************************************************** */
|
|
|
|
function __awaiter(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());
|
|
});
|
|
}
|
|
|
|
const DEFAULT_SETTINGS = {
|
|
expansionMode: 'expanded',
|
|
ignoreNulls: false,
|
|
nullValue: '',
|
|
skipKey: 'metatable',
|
|
ignoredKeys: [],
|
|
filterKeys: ['metatable', 'frontmatter'],
|
|
filterMode: 'ignore',
|
|
autolinks: false,
|
|
naked: false,
|
|
vault: null,
|
|
};
|
|
class MetatableSettingTab extends obsidian.PluginSettingTab {
|
|
constructor(app, plugin) {
|
|
super(app, plugin);
|
|
this.plugin = plugin;
|
|
}
|
|
display() {
|
|
return __awaiter(this, void 0, void 0, function* () {
|
|
const { containerEl, plugin } = this;
|
|
containerEl.empty();
|
|
containerEl.createEl('h2', { text: 'Metatable Settings' });
|
|
new obsidian.Setting(containerEl)
|
|
.setName('Expansion level')
|
|
.setDesc('Level of expansion of the metatable tree')
|
|
.addDropdown(drop => drop
|
|
.addOption('expanded', 'Fully expanded')
|
|
.addOption('leaf-collapsed', 'Collapse leafs')
|
|
.addOption('all-collapsed', 'Collapse all')
|
|
.addOption('root-collapsed', 'Collapse root')
|
|
.setValue(plugin.settings.expansionMode)
|
|
.onChange((value) => __awaiter(this, void 0, void 0, function* () {
|
|
plugin.settings.expansionMode = value;
|
|
yield plugin.saveSettings();
|
|
})));
|
|
new obsidian.Setting(containerEl)
|
|
.setName('Skip key')
|
|
.setDesc('When this key is found and `true`, the metatable will not be displayed')
|
|
.addText(text => text
|
|
.setValue(plugin.settings.skipKey)
|
|
.onChange((value) => __awaiter(this, void 0, void 0, function* () {
|
|
plugin.settings.skipKey = value;
|
|
yield plugin.saveSettings();
|
|
})));
|
|
containerEl.createEl('h3', { text: 'Nulls' });
|
|
new obsidian.Setting(containerEl)
|
|
.setName('Ignore null values')
|
|
.setDesc('Ignore any member with a null value.')
|
|
.addToggle(setting => setting
|
|
.setValue(plugin.settings.ignoreNulls)
|
|
.onChange((value) => __awaiter(this, void 0, void 0, function* () {
|
|
plugin.settings.ignoreNulls = value;
|
|
yield plugin.saveSettings();
|
|
this.display();
|
|
})));
|
|
if (!plugin.settings.ignoreNulls) {
|
|
new obsidian.Setting(containerEl)
|
|
.setName('Null value')
|
|
.setDesc('Text to show when a key has no value. Defaults to nothing')
|
|
.addText(text => text
|
|
.setValue(plugin.settings.nullValue)
|
|
.onChange((value) => __awaiter(this, void 0, void 0, function* () {
|
|
plugin.settings.nullValue = value;
|
|
yield plugin.saveSettings();
|
|
})));
|
|
}
|
|
containerEl.createEl('h3', { text: 'Filter' });
|
|
new obsidian.Setting(containerEl)
|
|
.setName('Filter mode')
|
|
.setDesc('Either ignore or keep the filter keys')
|
|
.addDropdown(drop => drop
|
|
.addOption('ignore', 'Ignore')
|
|
.addOption('keep', 'Keep')
|
|
.setValue(plugin.settings.filterMode)
|
|
.onChange((value) => __awaiter(this, void 0, void 0, function* () {
|
|
plugin.settings.filterMode = value;
|
|
yield plugin.saveSettings();
|
|
})));
|
|
// XXX: Remove in 0.11.0
|
|
if (plugin.settings.ignoredKeys.length > 0) {
|
|
plugin.settings.filterKeys = plugin.settings.ignoredKeys;
|
|
yield plugin.saveSettings();
|
|
}
|
|
new obsidian.Setting(containerEl)
|
|
.setName('Filter keys')
|
|
.setDesc('Any empty field will be ignored.');
|
|
let keyset = new Set(plugin.settings.filterKeys);
|
|
keyset.delete('');
|
|
let filterKeys = containerEl.createEl('ol');
|
|
for (const originalValue of keyset) {
|
|
addFilterInput(originalValue, filterKeys, keyset, plugin);
|
|
}
|
|
new obsidian.Setting(containerEl)
|
|
.addButton(x => x
|
|
.setButtonText("Add key")
|
|
.onClick(() => __awaiter(this, void 0, void 0, function* () {
|
|
addFilterInput('', filterKeys, keyset, plugin);
|
|
})));
|
|
containerEl.createEl('h3', { text: 'Experimental' });
|
|
new obsidian.Setting(containerEl)
|
|
.setName('Autolink')
|
|
.setDesc('Enables autolinks for wikilinks `[[target]]`, frontmatter links `%target%` and local links `./deep/target`')
|
|
.addToggle(setting => setting
|
|
.setValue(plugin.settings.autolinks)
|
|
.onChange((value) => __awaiter(this, void 0, void 0, function* () {
|
|
plugin.settings.autolinks = value;
|
|
yield plugin.saveSettings();
|
|
})));
|
|
new obsidian.Setting(containerEl)
|
|
.setName('Naked')
|
|
.setDesc('Removes the Shadow DOM and the default CSS so you can bring your own via CSS snippets.')
|
|
.addToggle(setting => setting
|
|
.setValue(plugin.settings.naked)
|
|
.onChange((value) => __awaiter(this, void 0, void 0, function* () {
|
|
plugin.settings.naked = value;
|
|
yield plugin.saveSettings();
|
|
})));
|
|
});
|
|
}
|
|
}
|
|
function addFilterInput(originalValue, el, keyset, plugin) {
|
|
const item = el.createEl('li');
|
|
const input = item.createEl('input');
|
|
input.setAttribute('type', 'text');
|
|
input.setAttribute('value', originalValue);
|
|
input.setAttribute('data-prev', originalValue);
|
|
input.addEventListener('input', (e) => __awaiter(this, void 0, void 0, function* () {
|
|
let target = e.target;
|
|
keyset.delete(target.dataset.prev);
|
|
keyset.add(target.value);
|
|
input.setAttribute('data-prev', target.value);
|
|
keyset.delete('');
|
|
plugin.settings.filterKeys = [...keyset];
|
|
yield plugin.saveSettings();
|
|
}));
|
|
}
|
|
|
|
/**
|
|
* A store of rules to apply to set members.
|
|
*
|
|
* Only one rule can be assigned to a member. If you add two rules against the
|
|
* same member key it will only keep the last one.
|
|
*
|
|
* ## Example
|
|
*
|
|
* ```
|
|
* const rules = new RuleStore()
|
|
* const tagsRule = { toHtml: tagslist, foldable: false }
|
|
* rules.set('tags', tagsRule)
|
|
* ```
|
|
*/
|
|
class RuleStore extends Map {
|
|
}
|
|
|
|
function isEmptyArray(value) {
|
|
if (typeof value === 'string') {
|
|
return value === '[]';
|
|
}
|
|
if (Array.isArray(value) && value.length === 0) {
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
function toggle(trigger) {
|
|
const isExpanded = trigger.getAttribute('aria-expanded') == 'true';
|
|
trigger.setAttribute('aria-expanded', String(!isExpanded));
|
|
}
|
|
function clickHandler(event, searchFn, openLinkFn) {
|
|
const trigger = event.target;
|
|
if (trigger === null || trigger === void 0 ? void 0 : trigger.hasAttribute('aria-expanded')) {
|
|
event.stopPropagation();
|
|
event.preventDefault();
|
|
toggle(trigger);
|
|
return;
|
|
}
|
|
if (trigger === null || trigger === void 0 ? void 0 : trigger.hasAttribute('href')) {
|
|
event.stopPropagation();
|
|
const href = trigger.getAttribute('href');
|
|
if (trigger.hasClass('internal-link')) {
|
|
event.preventDefault();
|
|
openLinkFn(trigger.dataset.href, '');
|
|
}
|
|
if (trigger.hasClass('tag')) {
|
|
event.preventDefault();
|
|
searchFn(`tag:${href}`);
|
|
}
|
|
}
|
|
}
|
|
function keyHandler(event) {
|
|
const trigger = event.target;
|
|
if ((event.code == 'Space' || event.code == 'Enter') && (trigger === null || trigger === void 0 ? void 0 : trigger.hasAttribute('aria-expanded'))) {
|
|
event.stopPropagation();
|
|
event.preventDefault();
|
|
toggle(trigger);
|
|
}
|
|
}
|
|
function externalLink(value) {
|
|
var _a, _b;
|
|
const a = document.createElement('a');
|
|
// @ts-ignore
|
|
(_a = a.part) === null || _a === void 0 ? void 0 : _a.add('link');
|
|
// @ts-ignore
|
|
(_b = a.part) === null || _b === void 0 ? void 0 : _b.add('external-link');
|
|
a.classList.add('external-link');
|
|
a.setAttribute('target', '_blank');
|
|
a.setAttribute('rel', 'noopener');
|
|
a.setAttribute('href', value);
|
|
a.append(value);
|
|
return a;
|
|
}
|
|
function obsidianUrl(vaultName, fileName) {
|
|
return `obsidian://open?vault=${vaultName}&file=${encodeURI(obsidian.getLinkpath(fileName))}`;
|
|
}
|
|
function internalLink(url) {
|
|
var _a, _b;
|
|
const a = document.createElement('a');
|
|
const label = url.searchParams.get('file');
|
|
a.dataset.href = label;
|
|
a.setAttribute('href', label);
|
|
// @ts-ignore
|
|
(_a = a.part) === null || _a === void 0 ? void 0 : _a.add('link');
|
|
// @ts-ignore
|
|
(_b = a.part) === null || _b === void 0 ? void 0 : _b.add('internal-link');
|
|
a.classList.add('internal-link');
|
|
a.setAttribute('target', '_blank');
|
|
a.setAttribute('rel', 'noopener');
|
|
a.append(label);
|
|
return a;
|
|
}
|
|
/**
|
|
/* Creates a link for internal links from a string of the form `[[text]]`.
|
|
*/
|
|
function wikiLink(value, vaultName) {
|
|
const cleanValue = value.slice(2, -2);
|
|
const url = new URL(obsidianUrl(vaultName, cleanValue));
|
|
return internalLink(url);
|
|
}
|
|
/**
|
|
/* Creates a link for internal links from a string of the form `%text%`.
|
|
*/
|
|
function frontmatterLink(value, vaultName) {
|
|
const cleanValue = value.slice(1, -1);
|
|
const url = new URL(obsidianUrl(vaultName, cleanValue));
|
|
return internalLink(url);
|
|
}
|
|
/**
|
|
* Creates a link for local paths.
|
|
*/
|
|
function localLink(value, vaultName) {
|
|
const url = new URL(obsidianUrl(vaultName, value));
|
|
return internalLink(url);
|
|
}
|
|
function isOpen(mode, depth) {
|
|
if (mode == 'expanded') {
|
|
return true;
|
|
}
|
|
// Keep the root open when leafs are collapsed
|
|
if (mode == 'leaf-collapsed' && depth == 0) {
|
|
return true;
|
|
}
|
|
// Keep the root close when leafs are opened
|
|
if (mode == 'root-collapsed' && depth != 0) {
|
|
return true;
|
|
}
|
|
// all-collapsed
|
|
return false;
|
|
}
|
|
function isObsidianUrl(url) {
|
|
return (url instanceof URL && url.protocol == 'obsidian:');
|
|
}
|
|
function isUrl(url) {
|
|
const allowedProtocols = ['http:', 'https:', 'evernote:', 'zotero:'];
|
|
return (url instanceof URL && allowedProtocols.some(protocol => url.protocol == protocol));
|
|
}
|
|
function isLocalLink(value) {
|
|
return value.startsWith('./');
|
|
}
|
|
function tryUrl(value) {
|
|
try {
|
|
return new URL(value);
|
|
}
|
|
catch (_) {
|
|
}
|
|
}
|
|
function isWikiLink(value) {
|
|
return (value.startsWith('[[') && value.endsWith(']]'));
|
|
}
|
|
function isFrontmatterLink(value) {
|
|
return (value.startsWith('%') && value.endsWith('%'));
|
|
}
|
|
function enrichValue(value, context) {
|
|
const { settings, vaultName } = context;
|
|
const { autolinks } = settings;
|
|
const cleanValue = value.toString().trim();
|
|
if (autolinks) {
|
|
if (isWikiLink(cleanValue)) {
|
|
return wikiLink(cleanValue, vaultName);
|
|
}
|
|
if (isFrontmatterLink(cleanValue)) {
|
|
return frontmatterLink(cleanValue, vaultName);
|
|
}
|
|
if (isLocalLink(cleanValue)) {
|
|
return localLink(cleanValue, vaultName);
|
|
}
|
|
}
|
|
const url = tryUrl(cleanValue);
|
|
if (isObsidianUrl(url)) {
|
|
return internalLink(url);
|
|
}
|
|
if (isUrl(url)) {
|
|
return externalLink(cleanValue);
|
|
}
|
|
return value.toString();
|
|
}
|
|
function isNully(value) {
|
|
if (typeof value == 'string') {
|
|
return value.length == 0;
|
|
}
|
|
return value == null;
|
|
}
|
|
/**
|
|
* A set member with a scalar value.
|
|
*/
|
|
function leafMember(label, data, context) {
|
|
var _a, _b;
|
|
const { rules, settings } = context;
|
|
const root = document.createElement('tr');
|
|
const key = document.createElement('th');
|
|
const value = document.createElement('td');
|
|
const rule = rules.get(label);
|
|
const datum = (rules.has(label) && !isNully(data))
|
|
? rule.toHtml(data, rule)
|
|
: enrichValue(data, context);
|
|
// XXX: Note that `part` is an `Element` extension in draft. Checking for
|
|
// undefined lets us get away with plain jest dom testing.
|
|
// @ts-ignore
|
|
(_a = key.part) === null || _a === void 0 ? void 0 : _a.add('key');
|
|
key.classList.add('key');
|
|
key.append(label);
|
|
// @ts-ignore
|
|
(_b = value.part) === null || _b === void 0 ? void 0 : _b.add('value');
|
|
value.classList.add('value');
|
|
value.append(datum);
|
|
root.classList.add('member');
|
|
root.append(key);
|
|
root.append(value);
|
|
return root;
|
|
}
|
|
/**
|
|
* A set member with a complex value.
|
|
*/
|
|
function nodeMember(label, value, context) {
|
|
const root = details(label, value, Object.assign(Object.assign({}, context), { depth: context.depth + 1 }));
|
|
root.classList.add('member');
|
|
return root;
|
|
}
|
|
/**
|
|
* A set member.
|
|
*/
|
|
function member(label, value, context) {
|
|
const { settings } = context;
|
|
const patchedValue = value == null ? settings.nullValue : value;
|
|
if (typeof patchedValue == 'object') {
|
|
return nodeMember(label, value, context);
|
|
}
|
|
return leafMember(label, patchedValue, context);
|
|
}
|
|
/**
|
|
* A set of members.
|
|
*/
|
|
function set(data, context) {
|
|
const { settings, depth } = context;
|
|
const { filterMode, filterKeys, ignoreNulls } = settings;
|
|
const valueContext = Object.assign(Object.assign({}, context), { depth: depth + 1 });
|
|
const root = document.createElement('table');
|
|
root.classList.add('set');
|
|
Object.entries(data).forEach(([label, value]) => {
|
|
if (ignoreNulls && (value == null || isEmptyArray(value)))
|
|
return;
|
|
if (filterMode == 'ignore') {
|
|
if (filterKeys.some(key => key == label))
|
|
return;
|
|
}
|
|
if (filterMode == 'keep') {
|
|
if (!filterKeys.some(key => key == label))
|
|
return;
|
|
}
|
|
root.append(member(label, value, valueContext));
|
|
});
|
|
return root;
|
|
}
|
|
/**
|
|
* A list of members.
|
|
*/
|
|
function list(data, context) {
|
|
const { settings, depth } = context;
|
|
const valueContext = Object.assign(Object.assign({}, context), { depth: depth + 1 });
|
|
const root = document.createElement('ul');
|
|
data.forEach((item) => {
|
|
let value;
|
|
const li = document.createElement('li');
|
|
if (Array.isArray(item)) {
|
|
value = list(item, valueContext);
|
|
}
|
|
else if (typeof item == 'object') {
|
|
value = set(item, valueContext);
|
|
}
|
|
else {
|
|
value = enrichValue(item, valueContext);
|
|
}
|
|
li.append(value);
|
|
root.append(li);
|
|
});
|
|
return root;
|
|
}
|
|
function ordinaryValue(data, context) {
|
|
return Array.isArray(data)
|
|
? list(data, context)
|
|
: set(data, context);
|
|
}
|
|
/**
|
|
* A collapsible group.
|
|
*/
|
|
function details(label, data, context) {
|
|
var _a, _b;
|
|
const { settings, rules, depth } = context;
|
|
const { mode } = settings;
|
|
const root = document.createElement('tr');
|
|
const key = document.createElement('th');
|
|
const value = document.createElement('td');
|
|
const rule = rules.get(label);
|
|
const valueId = `${label}-${depth}`;
|
|
const datum = (rules.has(label) && !isNully(data))
|
|
? rule.toHtml(data, rule)
|
|
: ordinaryValue(data, Object.assign(Object.assign({}, context), { depth: depth + 1 }));
|
|
// @ts-ignore
|
|
(_a = key.part) === null || _a === void 0 ? void 0 : _a.add('key');
|
|
key.classList.add('key');
|
|
key.append(label);
|
|
root.append(key);
|
|
// @ts-ignore
|
|
(_b = value.part) === null || _b === void 0 ? void 0 : _b.add('value');
|
|
value.classList.add('value');
|
|
value.setAttribute('id', valueId);
|
|
value.append(datum);
|
|
root.append(value);
|
|
if (rule == undefined || rule.foldable) {
|
|
const marker = document.createElement('div');
|
|
key.classList.add('toggle');
|
|
key.setAttribute('role', 'button');
|
|
key.setAttribute('aria-expanded', String(isOpen(mode, depth)));
|
|
key.setAttribute('aria-controls', valueId);
|
|
key.setAttribute('tabindex', '0');
|
|
marker.classList.add('marker');
|
|
value.append(marker);
|
|
}
|
|
return root;
|
|
}
|
|
function sheath(data, context) {
|
|
const { settings } = context;
|
|
const root = document.createElement('details');
|
|
const summary = document.createElement('summary');
|
|
const value = set(data, context);
|
|
if (isOpen(settings.mode, 0)) {
|
|
root.setAttribute('open', '');
|
|
}
|
|
summary.append('Metadata');
|
|
root.classList.add('metatable');
|
|
root.append(summary);
|
|
root.append(value);
|
|
return root;
|
|
}
|
|
function metatable(data, context) {
|
|
const { searchFn, openLinkFn, settings } = context;
|
|
const fragment = new DocumentFragment();
|
|
const root = sheath(data, context);
|
|
root.addEventListener('click', (e) => clickHandler(e, searchFn, openLinkFn));
|
|
root.addEventListener('keydown', keyHandler);
|
|
fragment.append(root);
|
|
return fragment;
|
|
}
|
|
|
|
/**
|
|
* Transforms a list of dirty tags into HTML.
|
|
*/
|
|
function taglist(data, rule) {
|
|
const list = normaliseTags(data);
|
|
// No valid tags found.
|
|
if (list.length == 0)
|
|
return null;
|
|
const root = document.createElement('ul');
|
|
root.classList.add('tag-list');
|
|
list.forEach((item) => {
|
|
const li = document.createElement('li');
|
|
const value = tag(item);
|
|
li.append(value);
|
|
root.append(li);
|
|
});
|
|
return root;
|
|
}
|
|
/**
|
|
* Normalises a list of tags as an array of strings.
|
|
*/
|
|
function normaliseTags(data) {
|
|
if (data == null) {
|
|
return [];
|
|
}
|
|
if (typeof data == 'string') {
|
|
return data.split(',').map(x => x.trim()).filter(x => x && x.length != 0);
|
|
}
|
|
return data.filter(x => x && x.length != 0);
|
|
}
|
|
function tag(value) {
|
|
var _a, _b;
|
|
const a = document.createElement('a');
|
|
a.classList.add('tag');
|
|
// XXX: Note that `part` is an `Element` extension in draft. Checking for
|
|
// undefined lets us get away with plain jest dom testing.
|
|
// @ts-ignore
|
|
(_a = a.part) === null || _a === void 0 ? void 0 : _a.add('tag');
|
|
// @ts-ignore
|
|
(_b = a.part) === null || _b === void 0 ? void 0 : _b.add(encodeURI(value));
|
|
a.setAttribute('target', '_blank');
|
|
a.setAttribute('rel', 'noopener');
|
|
a.setAttribute('href', `#${value}`);
|
|
a.append(`${value}`);
|
|
return a;
|
|
}
|
|
|
|
var styles = ":host-context(.theme-light) {\n --metatable-foreground: var(--text-muted, darkslategrey);\n --metatable-key-background: var(--background-primary-alt, #f3f3f3);\n --metatable-key-border-color: var(--background-modifier-border, lightgrey);\n --metatable-key-border-color-focus: orange;\n --metatable-key-focus: var(--background-match-highlight, lightyellow);\n --metatable-tag-background: var(--background-primary-alt, #f3f3f3);\n --metatable-link-color: var(--text-accent, #705dcf);\n --metatable-link-color-hover: var(--text-accent-hover, #8875ff);\n}\n\n:host-context(.theme-dark) {\n --metatable-foreground: var(--text-muted, #999);\n --metatable-key-background: var(--background-primary-alt, #111);\n --metatable-key-border-color: var(--background-modifier-border, #333);\n --metatable-key-border-color-focus: orange;\n --metatable-key-focus: black;\n --metatable-tag-background: var(--background-primary-alt, #111);\n --metatable-link-color: var(--text-accent, #705dcf);\n --metatable-link-color-hover: var(--text-accent-hover, #8875ff);\n}\n\n:host {\n --metatable-collapsed-symbol: \"▶︎\";\n --metatable-expanded-symbol: \"▼\";\n --metatable-font-family: var(--text, sans-serif);\n --metatable-font-size: var(--font-small, 13px);\n --metatable-key-border-width: 2px;\n --metatable-mark-symbol: \"…\";\n --metatable-value-background: transparent;\n --metatable-background: transparent;\n --metatable-tag-symbol: \"\";\n --metatable-external-link-icon: url(app://obsidian.md/public/images/874d8b8e340f75575caa.svg);\n --metatable-external-link-color: var(--metatable-link-color);\n --metatable-external-link-color-hover: var(--metatable-link-color-hover);\n --metatable-internal-link-icon: none;\n --metatable-internal-link-color: var(--metatable-link-color);\n --metatable-internal-link-color-hover: var(--metatable-link-color-hover);\n}\n\n\n* {\n box-sizing: border-box;\n}\n\ndetails {\n background-color: var(--metatable-background);\n color: var(--metatable-foreground);\n font-family: var(--metatable-font-family);\n font-size: var(--metatable-font-size);\n}\n\nsummary {\n cursor: pointer;\n}\n\nsummary:focus {\n outline: none;\n}\n\nsummary:focus-visible {\n outline: none;\n background-color: var(--metatable-key-focus)\n}\n\n.set {\n background-color: var(--metatable-background);\n display: grid;\n grid-gap: 2px;\n margin-top: 0.4rem;\n}\n\n.member {\n display: grid;\n grid-gap: 2px;\n grid-template-columns: minmax(0, 1fr) minmax(0, 4fr);\n grid-template-areas: \"key value\";\n}\n\n.key[role=button] {\n cursor: pointer;\n}\n\n.member .key {\n background-color: var(--metatable-key-background);\n border-right: var(--metatable-key-border-width) solid var(--metatable-key-border-color);\n display: grid;\n grid-template-columns: 10px auto;\n grid-gap: 0.4rem;\n font-weight: bold;\n grid-area: key;\n overflow: hidden;\n padding: 0.4rem;\n text-align: left;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.member .value {\n background-color: var(--metatable-value-background);\n grid-area: value;\n margin: 0;\n overflow: auto;\n padding: 0.4rem;\n}\n\n.member .key:focus {\n outline: none;\n}\n\n.member .key:focus-visible {\n outline: none;\n border-right-color: var(--metatable-key-border-color-focus);\n background-color: var(--metatable-key-focus);\n}\n\n.value ul {\n margin: 0;\n padding: 0;\n}\n\n.value li {\n margin-left: 1rem;\n}\n\n.key[aria-expanded]::before {\n font-size: 0.6rem;\n padding-top: 0.3rem;\n}\n\n.key[aria-expanded=true]::before {\n content: var(--metatable-expanded-symbol);\n}\n\n.key[aria-expanded=false]::before {\n content: var(--metatable-collapsed-symbol);\n}\n\n.key[aria-expanded=false] + .value > :first-child {\n display: none;\n}\n\n.key[aria-expanded=false] + .value > .marker::after {\n content: var(--metatable-mark-symbol);\n display: block;\n}\n\n@media screen and (min-width: 400px) and (max-width: 550px) {\n .member {\n grid-template-columns: minmax(0, 1.5fr) minmax(0, 3fr);\n }\n .member .member {\n grid-template-areas: \"key key\" \"value value\";\n }\n\n .member .member .key {\n border-right: none;\n border-bottom: var(--metatable-key-border-width) solid var(--metatable-key-border-color);\n }\n\n}\n\n@media screen and (max-width: 400px) {\n .member {\n grid-template-areas: \"key key\" \"value value\";\n }\n\n .member .key {\n border-right: none;\n border-bottom: var(--metatable-key-border-width) solid var(--metatable-key-border-color);\n }\n}\n\n/* Mappers */\n\n.tag-list li {\n display: inline-block;\n margin: 0 0.4rem 0 2px;\n}\n\n.tag {\n background-color: var(--metatable-tag-background);\n border-radius: 1rem;\n color: var(--metatable-foreground);\n display: inline-block;\n padding: 0.1rem 0.6rem;\n text-decoration: none;\n}\n\n.tag::before {\n content: var(--metatable-tag-symbol);\n}\n\n.tag:hover {\n filter: brightness(0.8);\n}\n\n.tag:focus, .external-link:focus, .internal-link:focus {\n outline: none;\n}\n\n.tag:focus-visible, .external-link:focus-visible, .internal-link:focus-visible {\n outline: none;\n background-color: var(--metatable-key-focus)\n}\n\n.external-link {\n color: var(--metatable-external-link-color);\n display: inline-block;\n white-space: nowrap;\n}\n\n.external-link::after {\n content: var(--metatable-external-link-icon);\n display: inline-block;\n margin-left: 0.3rem;\n vertical-align: sub;\n}\n\n.external-link:hover {\n color: var(--metatable-external-link-color-hover);\n}\n\n.internal-link {\n color: var(--metatable-internal-link-color);\n display: inline-block;\n overflow: hidden;\n text-overflow: ellipsis;\n max-width: 450px;\n white-space: nowrap;\n}\n\n.internal-link::after {\n content: var(--metatable-internal-link-icon);\n display: inline-block;\n margin-left: 0.3rem;\n vertical-align: sub;\n}\n\n.internal-link:hover {\n color: var(--metatable-internal-link-color-hover);\n}\n";
|
|
|
|
function log(msg) {
|
|
console.log(`metatable: ${msg}`);
|
|
}
|
|
function createMetatable(el, data, context) {
|
|
const wrapper = el.createEl('div');
|
|
const fragment = new DocumentFragment();
|
|
wrapper.classList.add('obsidian-metatable');
|
|
if (!context.settings.naked) {
|
|
wrapper.attachShadow({ mode: 'open' });
|
|
fragment.createEl('style', { text: styles });
|
|
}
|
|
fragment.append(metatable(data, context));
|
|
if (context.settings.naked) {
|
|
wrapper.append(fragment);
|
|
}
|
|
else {
|
|
wrapper.shadowRoot.append(fragment);
|
|
}
|
|
}
|
|
function isEmpty(data) {
|
|
return Object.entries(data)
|
|
.every(([_, value]) => value == null || isEmptyArray(value));
|
|
}
|
|
function filterSet(data, filterKeys, filterMode) {
|
|
const filterFn = filterMode == 'ignore'
|
|
? (x => !x)
|
|
: (x => x);
|
|
const newData = Object.entries(data)
|
|
.filter(([key, _value]) => filterFn(filterKeys.some(x => x == key)));
|
|
return Object.fromEntries(newData);
|
|
}
|
|
function frontmatterProcessor(el, ctx) {
|
|
return __awaiter(this, void 0, void 0, function* () {
|
|
const plugin = this;
|
|
const frontmatter = yield el.querySelector('.frontmatter');
|
|
if (frontmatter !== null) {
|
|
const embed = yield el.querySelector('.internal-embed');
|
|
// If an embed has already been loaded, writing after the embed expression
|
|
// triggers a re-render for the embedded markdown wrongly injecting the
|
|
// parent metatable for every keystroke.
|
|
//
|
|
// See https://github.com/arnau/obsidian-metatable/issues/12
|
|
if (embed !== null) {
|
|
return;
|
|
}
|
|
const target = yield el.querySelector('.frontmatter-container');
|
|
target.removeAttribute('class');
|
|
// Prevents an undesired `display: none` if `tags` is not present.
|
|
target.removeAttribute('style');
|
|
target.empty();
|
|
// @ts-ignore
|
|
const searchFn = plugin.app.internalPlugins.getPluginById('global-search').instance.openGlobalSearch.bind(plugin);
|
|
const openLinkFn = plugin.app.workspace.openLinkText.bind(plugin.app.workspace);
|
|
const { ignoreNulls, filterMode, filterKeys, skipKey } = plugin.settings;
|
|
const rules = new RuleStore();
|
|
rules.set('tags', {
|
|
toHtml: taglist,
|
|
foldable: false,
|
|
});
|
|
const context = {
|
|
vaultName: plugin.app.vault.getName(),
|
|
rules,
|
|
searchFn,
|
|
openLinkFn,
|
|
settings: {
|
|
mode: plugin.settings.expansionMode,
|
|
ignoreNulls,
|
|
nullValue: plugin.settings.nullValue,
|
|
filterKeys,
|
|
filterMode,
|
|
autolinks: plugin.settings.autolinks,
|
|
naked: plugin.settings.naked,
|
|
},
|
|
depth: 0,
|
|
};
|
|
if (ctx.frontmatter) {
|
|
const data = filterSet(ctx.frontmatter, filterKeys, filterMode);
|
|
if (ctx.frontmatter[skipKey]) {
|
|
return;
|
|
}
|
|
// Nothing to render if all top-level are null and nulls should be
|
|
// ignored.
|
|
if (ignoreNulls && isEmpty(data)) {
|
|
return;
|
|
}
|
|
if (Object.isEmpty(data)) {
|
|
return;
|
|
}
|
|
createMetatable(target, data, context);
|
|
}
|
|
}
|
|
});
|
|
}
|
|
class MetatablePlugin extends obsidian.Plugin {
|
|
onload() {
|
|
return __awaiter(this, void 0, void 0, function* () {
|
|
yield this.loadSettings();
|
|
this.registerMarkdownPostProcessor(frontmatterProcessor.bind(this));
|
|
this.addSettingTab(new MetatableSettingTab(this.app, this));
|
|
log('loaded');
|
|
});
|
|
}
|
|
onunload() {
|
|
log('unloaded');
|
|
}
|
|
loadSettings() {
|
|
return __awaiter(this, void 0, void 0, function* () {
|
|
this.settings = Object.assign({}, DEFAULT_SETTINGS, yield this.loadData());
|
|
});
|
|
}
|
|
saveSettings() {
|
|
return __awaiter(this, void 0, void 0, function* () {
|
|
yield this.saveData(this.settings);
|
|
});
|
|
}
|
|
}
|
|
|
|
module.exports = MetatablePlugin;
|
|
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFpbi5qcyIsInNvdXJjZXMiOlsibm9kZV9tb2R1bGVzL3RzbGliL3RzbGliLmVzNi5qcyIsInNyYy9zZXR0aW5ncy50cyIsInNyYy9ydWxlLnRzIiwic3JjL3V0aWxzLnRzIiwic3JjL3RhYmxlLnRzIiwic3JjL21hcHBlcnMudHMiLCJzcmMvcGx1Z2luLnRzIl0sInNvdXJjZXNDb250ZW50IjpudWxsLCJuYW1lcyI6WyJQbHVnaW5TZXR0aW5nVGFiIiwiU2V0dGluZyIsImdldExpbmtwYXRoIiwiUGx1Z2luIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBdURBO0FBQ08sU0FBUyxTQUFTLENBQUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxDQUFDLEVBQUUsU0FBUyxFQUFFO0FBQzdELElBQUksU0FBUyxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsT0FBTyxLQUFLLFlBQVksQ0FBQyxHQUFHLEtBQUssR0FBRyxJQUFJLENBQUMsQ0FBQyxVQUFVLE9BQU8sRUFBRSxFQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFO0FBQ2hILElBQUksT0FBTyxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsT0FBTyxDQUFDLEVBQUUsVUFBVSxPQUFPLEVBQUUsTUFBTSxFQUFFO0FBQy9ELFFBQVEsU0FBUyxTQUFTLENBQUMsS0FBSyxFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxFQUFFLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTtBQUNuRyxRQUFRLFNBQVMsUUFBUSxDQUFDLEtBQUssRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxFQUFFLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTtBQUN0RyxRQUFRLFNBQVMsSUFBSSxDQUFDLE1BQU0sRUFBRSxFQUFFLE1BQU0sQ0FBQyxJQUFJLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsUUFBUSxDQUFDLENBQUMsRUFBRTtBQUN0SCxRQUFRLElBQUksQ0FBQyxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxVQUFVLElBQUksRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztBQUM5RSxLQUFLLENBQUMsQ0FBQztBQUNQOztBQy9DTyxNQUFNLGdCQUFnQixHQUFzQjtJQUNqRCxhQUFhLEVBQUUsVUFBVTtJQUN6QixXQUFXLEVBQUUsS0FBSztJQUNsQixTQUFTLEVBQUUsRUFBRTtJQUNiLE9BQU8sRUFBRSxXQUFXO0lBQ3BCLFdBQVcsRUFBRSxFQUFFO0lBQ2YsVUFBVSxFQUFFLENBQUMsV0FBVyxFQUFFLGFBQWEsQ0FBQztJQUN4QyxVQUFVLEVBQUUsUUFBUTtJQUNwQixTQUFTLEVBQUUsS0FBSztJQUNoQixLQUFLLEVBQUUsS0FBSztJQUNaLEtBQUssRUFBRSxJQUFJO0NBQ1osQ0FBQTtNQUdZLG1CQUFvQixTQUFRQSx5QkFBZ0I7SUFHdkQsWUFBWSxHQUFRLEVBQUUsTUFBdUI7UUFDM0MsS0FBSyxDQUFDLEdBQUcsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUNuQixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztLQUN0QjtJQUVLLE9BQU87O1lBQ1gsTUFBTSxFQUFDLFdBQVcsRUFBRSxNQUFNLEVBQUMsR0FBRyxJQUFJLENBQUE7WUFFbEMsV0FBVyxDQUFDLEtBQUssRUFBRSxDQUFBO1lBRW5CLFdBQVcsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLEVBQUMsSUFBSSxFQUFFLG9CQUFvQixFQUFDLENBQUMsQ0FBQTtZQUV4RCxJQUFJQyxnQkFBTyxDQUFDLFdBQVcsQ0FBQztpQkFDckIsT0FBTyxDQUFDLGlCQUFpQixDQUFDO2lCQUMxQixPQUFPLENBQUMsMENBQTBDLENBQUM7aUJBQ25ELFdBQVcsQ0FBQyxJQUFJLElBQUksSUFBSTtpQkFDWCxTQUFTLENBQUMsVUFBVSxFQUFFLGdCQUFnQixDQUFDO2lCQUN2QyxTQUFTLENBQUMsZ0JBQWdCLEVBQUUsZ0JBQWdCLENBQUM7aUJBQzdDLFNBQVMsQ0FBQyxlQUFlLEVBQUUsY0FBYyxDQUFDO2lCQUMxQyxTQUFTLENBQUMsZ0JBQWdCLEVBQUUsZUFBZSxDQUFDO2lCQUM1QyxRQUFRLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUM7aUJBQ3ZDLFFBQVEsQ0FBQyxDQUFPLEtBQUs7Z0JBQ3BCLE1BQU0sQ0FBQyxRQUFRLENBQUMsYUFBYSxHQUFHLEtBQWEsQ0FBQTtnQkFDN0MsTUFBTSxNQUFNLENBQUMsWUFBWSxFQUFFLENBQUE7YUFDNUIsQ0FBQSxDQUFDLENBQUMsQ0FBQTtZQUVsQixJQUFJQSxnQkFBTyxDQUFDLFdBQVcsQ0FBQztpQkFDckIsT0FBTyxDQUFDLFVBQVUsQ0FBQztpQkFDbkIsT0FBTyxDQUFDLHdFQUF3RSxDQUFDO2lCQUNqRixPQUFPLENBQUMsSUFBSSxJQUFJLElBQUk7aUJBQ1gsUUFBUSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDO2lCQUNqQyxRQUFRLENBQUMsQ0FBTyxLQUFLO2dCQUNwQixNQUFNLENBQUMsUUFBUSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUE7Z0JBQy9CLE1BQU0sTUFBTSxDQUFDLFlBQVksRUFBRSxDQUFBO2FBQzVCLENBQUEsQ0FBQyxDQUFDLENBQUE7WUFFZCxXQUFXLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxFQUFDLElBQUksRUFBRSxPQUFPLEVBQUMsQ0FBQyxDQUFBO1lBRTNDLElBQUlBLGdCQUFPLENBQUMsV0FBVyxDQUFDO2lCQUNyQixPQUFPLENBQUMsb0JBQW9CLENBQUM7aUJBQzdCLE9BQU8sQ0FBQyxzQ0FBc0MsQ0FBQztpQkFDL0MsU0FBUyxDQUFDLE9BQU8sSUFBSSxPQUFPO2lCQUNuQixRQUFRLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUM7aUJBQ3JDLFFBQVEsQ0FBQyxDQUFPLEtBQUs7Z0JBQ3BCLE1BQU0sQ0FBQyxRQUFRLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQTtnQkFDbkMsTUFBTSxNQUFNLENBQUMsWUFBWSxFQUFFLENBQUE7Z0JBQzNCLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQTthQUNmLENBQUEsQ0FBQyxDQUFDLENBQUE7WUFFZCxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUU7Z0JBQ2hDLElBQUlBLGdCQUFPLENBQUMsV0FBVyxDQUFDO3FCQUNyQixPQUFPLENBQUMsWUFBWSxDQUFDO3FCQUNyQixPQUFPLENBQUMsMkRBQTJELENBQUM7cUJBQ3BFLE9BQU8sQ0FBQyxJQUFJLElBQUksSUFBSTtxQkFDWCxRQUFRLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUM7cUJBQ25DLFFBQVEsQ0FBQyxDQUFPLEtBQUs7b0JBQ3BCLE1BQU0sQ0FBQyxRQUFRLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQTtvQkFDakMsTUFBTSxNQUFNLENBQUMsWUFBWSxFQUFFLENBQUE7aUJBQzVCLENBQUEsQ0FBQyxDQUFDLENBQUE7YUFDZjtZQUdELFdBQVcsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLEVBQUMsSUFBSSxFQUFFLFFBQVEsRUFBQyxDQUFDLENBQUE7WUFFNUMsSUFBSUEsZ0JBQU8sQ0FBQyxXQUFXLENBQUM7aUJBQ3JCLE9BQU8sQ0FBQyxhQUFhLENBQUM7aUJBQ3RCLE9BQU8sQ0FBQyx1Q0FBdUMsQ0FBQztpQkFDaEQsV0FBVyxDQUFDLElBQUksSUFBSSxJQUFJO2lCQUNYLFNBQVMsQ0FBQyxRQUFRLEVBQUUsUUFBUSxDQUFDO2lCQUM3QixTQUFTLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQztpQkFDekIsUUFBUSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDO2lCQUNwQyxRQUFRLENBQUMsQ0FBTyxLQUFLO2dCQUNwQixNQUFNLENBQUMsUUFBUSxDQUFDLFVBQVUsR0FBRyxLQUFtQixDQUFBO2dCQUNoRCxNQUFNLE1BQU0sQ0FBQyxZQUFZLEVBQUUsQ0FBQTthQUM1QixDQUFBLENBQUMsQ0FBQyxDQUFBOztZQUdsQixJQUFJLE1BQU0sQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7Z0JBQzFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsVUFBVSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFBO2dCQUN4RCxNQUFNLE1BQU0sQ0FBQyxZQUFZLEVBQUUsQ0FBQTthQUM1QjtZQUVELElBQUlBLGdCQUFPLENBQUMsV0FBVyxDQUFDO2lCQUNyQixPQUFPLENBQUMsYUFBYSxDQUFDO2lCQUN0QixPQUFPLENBQUMsa0NBQWtDLENBQUMsQ0FBQTtZQUU5QyxJQUFJLE1BQU0sR0FBRyxJQUFJLEdBQUcsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFBO1lBQ2hELE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUE7WUFFakIsSUFBSSxVQUFVLEdBQUcsV0FBVyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQTtZQUUzQyxLQUFLLE1BQU0sYUFBYSxJQUFJLE1BQU0sRUFBRTtnQkFDbEMsY0FBYyxDQUFDLGFBQWEsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFBO2FBQzFEO1lBRUQsSUFBSUEsZ0JBQU8sQ0FBQyxXQUFXLENBQUM7aUJBQ3JCLFNBQVMsQ0FBQyxDQUFDLElBQUksQ0FBQztpQkFDTCxhQUFhLENBQUMsU0FBUyxDQUFDO2lCQUN6QixPQUFPLENBQUM7Z0JBQ1AsY0FBYyxDQUFDLEVBQUUsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFBO2FBQy9DLENBQUEsQ0FBQyxDQUFDLENBQUE7WUFHZixXQUFXLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxFQUFDLElBQUksRUFBRSxjQUFjLEVBQUMsQ0FBQyxDQUFBO1lBRWxELElBQUlBLGdCQUFPLENBQUMsV0FBVyxDQUFDO2lCQUNyQixPQUFPLENBQUMsVUFBVSxDQUFDO2lCQUNuQixPQUFPLENBQUMsNEdBQTRHLENBQUM7aUJBQ3JILFNBQVMsQ0FBQyxPQUFPLElBQUksT0FBTztpQkFDakIsUUFBUSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDO2lCQUNuQyxRQUFRLENBQUMsQ0FBTyxLQUFLO2dCQUNwQixNQUFNLENBQUMsUUFBUSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUE7Z0JBQ2pDLE1BQU0sTUFBTSxDQUFDLFlBQVksRUFBRSxDQUFBO2FBQzVCLENBQUEsQ0FBQyxDQUFDLENBQUE7WUFFaEIsSUFBSUEsZ0JBQU8sQ0FBQyxXQUFXLENBQUM7aUJBQ3JCLE9BQU8sQ0FBQyxPQUFPLENBQUM7aUJBQ2hCLE9BQU8sQ0FBQyx3RkFBd0YsQ0FBQztpQkFDakcsU0FBUyxDQUFDLE9BQU8sSUFBSSxPQUFPO2lCQUNqQixRQUFRLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7aUJBQy9CLFFBQVEsQ0FBQyxDQUFPLEtBQUs7Z0JBQ3BCLE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQTtnQkFDN0IsTUFBTSxNQUFNLENBQUMsWUFBWSxFQUFFLENBQUE7YUFDNUIsQ0FBQSxDQUFDLENBQUMsQ0FBQTtTQUNqQjtLQUFBO0NBQ0Y7QUFFRCxTQUFTLGNBQWMsQ0FBQyxhQUFxQixFQUFFLEVBQWUsRUFBRSxNQUFtQixFQUFFLE1BQXVCO0lBQzFHLE1BQU0sSUFBSSxHQUFHLEVBQUUsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUE7SUFDOUIsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQTtJQUVwQyxLQUFLLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQTtJQUNsQyxLQUFLLENBQUMsWUFBWSxDQUFDLE9BQU8sRUFBRSxhQUFhLENBQUMsQ0FBQTtJQUMxQyxLQUFLLENBQUMsWUFBWSxDQUFDLFdBQVcsRUFBRSxhQUFhLENBQUMsQ0FBQTtJQUU5QyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxFQUFFLENBQU8sQ0FBQztRQUN0QyxJQUFJLE1BQU0sR0FBRyxDQUFDLENBQUMsTUFBMEIsQ0FBQTtRQUV6QyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUE7UUFDbEMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUE7UUFDeEIsS0FBSyxDQUFDLFlBQVksQ0FBQyxXQUFXLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFBO1FBRTdDLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUE7UUFFakIsTUFBTSxDQUFDLFFBQVEsQ0FBQyxVQUFVLEdBQUcsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFBO1FBQ3hDLE1BQU0sTUFBTSxDQUFDLFlBQVksRUFBRSxDQUFBO0tBQzVCLENBQUEsQ0FBQyxDQUFBO0FBQ0o7O0FDN0tBOzs7Ozs7Ozs7Ozs7OztNQWNhLFNBQVUsU0FBUSxHQUFjOzs7U0NuQzdCLFlBQVksQ0FBQyxLQUFjO0lBQ3pDLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFO1FBQzdCLE9BQU8sS0FBSyxLQUFLLElBQUksQ0FBQTtLQUN0QjtJQUVELElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtRQUM5QyxPQUFPLElBQUksQ0FBQztLQUNiO0lBRUQsT0FBTyxLQUFLLENBQUM7QUFDZjs7QUNIQSxTQUFTLE1BQU0sQ0FBQyxPQUFvQjtJQUNsQyxNQUFNLFVBQVUsR0FBRyxPQUFPLENBQUMsWUFBWSxDQUFDLGVBQWUsQ0FBQyxJQUFJLE1BQU0sQ0FBQTtJQUNsRSxPQUFPLENBQUMsWUFBWSxDQUFDLGVBQWUsRUFBRSxNQUFNLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFBO0FBQzVELENBQUM7QUFFRCxTQUFTLFlBQVksQ0FBQyxLQUFZLEVBQUUsUUFBaUMsRUFBRSxVQUEwRTtJQUMvSSxNQUFNLE9BQU8sR0FBZ0IsS0FBSyxDQUFDLE1BQXFCLENBQUE7SUFFeEQsSUFBSSxPQUFPLGFBQVAsT0FBTyx1QkFBUCxPQUFPLENBQUUsWUFBWSxDQUFDLGVBQWUsQ0FBQyxFQUFFO1FBQzFDLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUN4QixLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDdkIsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFBO1FBQ2YsT0FBTztLQUNSO0lBRUQsSUFBSSxPQUFPLGFBQVAsT0FBTyx1QkFBUCxPQUFPLENBQUUsWUFBWSxDQUFDLE1BQU0sQ0FBQyxFQUFFO1FBQ2pDLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUN4QixNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFBO1FBRXpDLElBQUksT0FBTyxDQUFDLFFBQVEsQ0FBQyxlQUFlLENBQUMsRUFBRTtZQUNyQyxLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDdkIsVUFBVSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFBO1NBQ3JDO1FBRUQsSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQzNCLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUN2QixRQUFRLENBQUMsT0FBTyxJQUFJLEVBQUUsQ0FBQyxDQUFBO1NBQ3hCO0tBQ0Y7QUFDSCxDQUFDO0FBRUQsU0FBUyxVQUFVLENBQUMsS0FBb0I7SUFDdEMsTUFBTSxPQUFPLEdBQWdCLEtBQUssQ0FBQyxNQUFxQixDQUFBO0lBRXhELElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxJQUFJLE9BQU8sSUFBSSxLQUFLLENBQUMsSUFBSSxJQUFJLE9BQU8sTUFBSyxPQUFPLGFBQVAsT0FBTyx1QkFBUCxPQUFPLENBQUUsWUFBWSxDQUFDLGVBQWUsQ0FBQyxDQUFBLEVBQUU7UUFDOUYsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3hCLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUN2QixNQUFNLENBQUMsT0FBTyxDQUFDLENBQUE7S0FDaEI7QUFDSCxDQUFDO0FBRUQsU0FBUyxZQUFZLENBQUMsS0FBYTs7SUFDakMsTUFBTSxDQUFDLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQTs7SUFFckMsTUFBQSxDQUFDLENBQUMsSUFBSSwwQ0FBRSxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUE7O0lBRW5CLE1BQUEsQ0FBQyxDQUFDLElBQUksMENBQUUsR0FBRyxDQUFDLGVBQWUsQ0FBQyxDQUFBO0lBQzVCLENBQUMsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxDQUFBO0lBQ2hDLENBQUMsQ0FBQyxZQUFZLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFBO0lBQ2xDLENBQUMsQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLFVBQVUsQ0FBQyxDQUFBO0lBQ2pDLENBQUMsQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFBO0lBQzdCLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUE7SUFFZixPQUFPLENBQUMsQ0FBQTtBQUNWLENBQUM7QUFFRCxTQUFTLFdBQVcsQ0FBQyxTQUFpQixFQUFFLFFBQWdCO0lBQ3RELE9BQU8seUJBQXlCLFNBQVMsU0FBUyxTQUFTLENBQUNDLG9CQUFXLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxDQUFBO0FBQ3RGLENBQUM7QUFHRCxTQUFTLFlBQVksQ0FBQyxHQUFROztJQUM1QixNQUFNLENBQUMsR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFBO0lBQ3JDLE1BQU0sS0FBSyxHQUFHLEdBQUcsQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFBO0lBRTFDLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQTtJQUN0QixDQUFDLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQTs7SUFHN0IsTUFBQSxDQUFDLENBQUMsSUFBSSwwQ0FBRSxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUE7O0lBRW5CLE1BQUEsQ0FBQyxDQUFDLElBQUksMENBQUUsR0FBRyxDQUFDLGVBQWUsQ0FBQyxDQUFBO0lBQzVCLENBQUMsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxDQUFBO0lBQ2hDLENBQUMsQ0FBQyxZQUFZLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFBO0lBQ2xDLENBQUMsQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLFVBQVUsQ0FBQyxDQUFBO0lBQ2pDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUE7SUFFZixPQUFPLENBQUMsQ0FBQTtBQUNWLENBQUM7QUFFRDs7O0FBR0EsU0FBUyxRQUFRLENBQUMsS0FBYSxFQUFFLFNBQWlCO0lBQ2hELE1BQU0sVUFBVSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFDckMsTUFBTSxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUMsV0FBVyxDQUFDLFNBQVMsRUFBRSxVQUFVLENBQUMsQ0FBQyxDQUFBO0lBRXZELE9BQU8sWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFBO0FBQzFCLENBQUM7QUFFRDs7O0FBR0EsU0FBUyxlQUFlLENBQUMsS0FBYSxFQUFFLFNBQWlCO0lBQ3ZELE1BQU0sVUFBVSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFDckMsTUFBTSxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUMsV0FBVyxDQUFDLFNBQVMsRUFBRSxVQUFVLENBQUMsQ0FBQyxDQUFBO0lBRXZELE9BQU8sWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFBO0FBQzFCLENBQUM7QUFHRDs7O0FBR0EsU0FBUyxTQUFTLENBQUMsS0FBYSxFQUFFLFNBQWlCO0lBQ2pELE1BQU0sR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDLFdBQVcsQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQTtJQUVsRCxPQUFPLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQTtBQUMxQixDQUFDO0FBTUQsU0FBUyxNQUFNLENBQUMsSUFBWSxFQUFFLEtBQWE7SUFDekMsSUFBSSxJQUFJLElBQUksVUFBVSxFQUFFO1FBQ3RCLE9BQU8sSUFBSSxDQUFBO0tBQ1o7O0lBR0QsSUFBSSxJQUFJLElBQUksZ0JBQWdCLElBQUksS0FBSyxJQUFJLENBQUMsRUFBRTtRQUMxQyxPQUFPLElBQUksQ0FBQTtLQUNaOztJQUdELElBQUksSUFBSSxJQUFJLGdCQUFnQixJQUFJLEtBQUssSUFBSSxDQUFDLEVBQUU7UUFDMUMsT0FBTyxJQUFJLENBQUE7S0FDWjs7SUFHRCxPQUFPLEtBQUssQ0FBQTtBQUNkLENBQUM7QUFFRCxTQUFTLGFBQWEsQ0FBQyxHQUFpQjtJQUN0QyxRQUFRLEdBQUcsWUFBWSxHQUFHLElBQUksR0FBRyxDQUFDLFFBQVEsSUFBSSxXQUFXLEVBQUM7QUFDNUQsQ0FBQztBQUVELFNBQVMsS0FBSyxDQUFDLEdBQWlCO0lBQzlCLE1BQU0sZ0JBQWdCLEdBQUcsQ0FBQyxPQUFPLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRSxTQUFTLENBQUMsQ0FBQTtJQUVwRSxRQUFRLEdBQUcsWUFBWSxHQUFHLElBQUksZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFFBQVEsSUFBSSxHQUFHLENBQUMsUUFBUSxJQUFJLFFBQVEsQ0FBQyxFQUFDO0FBQzVGLENBQUM7QUFFRCxTQUFTLFdBQVcsQ0FBQyxLQUFhO0lBQ2hDLE9BQU8sS0FBSyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQTtBQUMvQixDQUFDO0FBRUQsU0FBUyxNQUFNLENBQUMsS0FBYTtJQUMzQixJQUFJO1FBQ0YsT0FBTyxJQUFJLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQTtLQUN0QjtJQUFDLE9BQU0sQ0FBQyxFQUFFO0tBRVY7QUFDSCxDQUFDO0FBRUQsU0FBUyxVQUFVLENBQUMsS0FBYTtJQUMvQixRQUFRLEtBQUssQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksS0FBSyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBQztBQUN6RCxDQUFDO0FBRUQsU0FBUyxpQkFBaUIsQ0FBQyxLQUFhO0lBQ3RDLFFBQVEsS0FBSyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsSUFBSSxLQUFLLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFDO0FBQ3ZELENBQUM7QUFFRCxTQUFTLFdBQVcsQ0FBQyxLQUFXLEVBQUUsT0FBZ0I7SUFDaEQsTUFBTSxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsR0FBRyxPQUFPLENBQUE7SUFDdkMsTUFBTSxFQUFFLFNBQVMsRUFBRSxHQUFHLFFBQVEsQ0FBQTtJQUM5QixNQUFNLFVBQVUsR0FBRyxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUE7SUFFMUMsSUFBSSxTQUFTLEVBQUU7UUFDYixJQUFJLFVBQVUsQ0FBQyxVQUFVLENBQUMsRUFBRTtZQUMxQixPQUFPLFFBQVEsQ0FBQyxVQUFVLEVBQUUsU0FBUyxDQUFDLENBQUE7U0FDdkM7UUFFRCxJQUFJLGlCQUFpQixDQUFDLFVBQVUsQ0FBQyxFQUFFO1lBQ2pDLE9BQU8sZUFBZSxDQUFDLFVBQVUsRUFBRSxTQUFTLENBQUMsQ0FBQTtTQUM5QztRQUVELElBQUksV0FBVyxDQUFDLFVBQVUsQ0FBQyxFQUFFO1lBQzNCLE9BQU8sU0FBUyxDQUFDLFVBQVUsRUFBRSxTQUFTLENBQUMsQ0FBQTtTQUN4QztLQUNGO0lBRUQsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFBO0lBRTlCLElBQUksYUFBYSxDQUFDLEdBQUcsQ0FBQyxFQUFFO1FBQ3RCLE9BQU8sWUFBWSxDQUFDLEdBQVUsQ0FBQyxDQUFBO0tBQ2hDO0lBRUQsSUFBSSxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUU7UUFDZCxPQUFPLFlBQVksQ0FBQyxVQUFVLENBQUMsQ0FBQTtLQUNoQztJQUVELE9BQU8sS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFBO0FBQ3pCLENBQUM7QUFFRCxTQUFTLE9BQU8sQ0FBQyxLQUFjO0lBQzdCLElBQUksT0FBTyxLQUFLLElBQUksUUFBUSxFQUFFO1FBQzVCLE9BQU8sS0FBSyxDQUFDLE1BQU0sSUFBSSxDQUFDLENBQUE7S0FDekI7SUFFRCxPQUFPLEtBQUssSUFBSSxJQUFJLENBQUE7QUFDdEIsQ0FBQztBQUdEOzs7QUFHQSxTQUFTLFVBQVUsQ0FBQyxLQUFhLEVBQUUsSUFBbUIsRUFBRSxPQUFnQjs7SUFDdEUsTUFBTSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsR0FBRyxPQUFPLENBQUE7SUFDbkMsTUFBTSxJQUFJLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQTtJQUN6QyxNQUFNLEdBQUcsR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFBO0lBQ3hDLE1BQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUE7SUFDMUMsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUM3QixNQUFNLEtBQUssR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDO1VBQzdDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQztVQUN2QixXQUFXLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFBOzs7O0lBSzlCLE1BQUEsR0FBRyxDQUFDLElBQUksMENBQUUsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFBO0lBQ3BCLEdBQUcsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFBO0lBQ3hCLEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUE7O0lBR2pCLE1BQUEsS0FBSyxDQUFDLElBQUksMENBQUUsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFBO0lBQ3hCLEtBQUssQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFBO0lBQzVCLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUE7SUFFbkIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUE7SUFDNUIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQTtJQUNoQixJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFBO0lBRWxCLE9BQU8sSUFBSSxDQUFBO0FBQ2IsQ0FBQztBQUVEOzs7QUFHQSxTQUFTLFVBQVUsQ0FBQyxLQUFhLEVBQUUsS0FBYyxFQUFFLE9BQWdCO0lBQ2pFLE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxLQUFLLEVBQUUsS0FBSyxrQ0FBTyxPQUFPLEtBQUUsS0FBSyxFQUFFLE9BQU8sQ0FBQyxLQUFLLEdBQUcsQ0FBQyxJQUFHLENBQUE7SUFDNUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUE7SUFFNUIsT0FBTyxJQUFJLENBQUE7QUFDYixDQUFDO0FBRUQ7OztBQUdBLFNBQVMsTUFBTSxDQUFDLEtBQWEsRUFBRSxLQUFjLEVBQUUsT0FBZ0I7SUFDN0QsTUFBTSxFQUFFLFFBQVEsRUFBRSxHQUFHLE9BQU8sQ0FBQTtJQUM1QixNQUFNLFlBQVksR0FBRyxLQUFLLElBQUksSUFBSSxHQUFHLFFBQVEsQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFBO0lBRS9ELElBQUksT0FBTyxZQUFZLElBQUksUUFBUSxFQUFFO1FBQ25DLE9BQU8sVUFBVSxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUE7S0FDekM7SUFFRCxPQUFPLFVBQVUsQ0FBQyxLQUFLLEVBQUUsWUFBc0IsRUFBRSxPQUFPLENBQUMsQ0FBQTtBQUMzRCxDQUFDO0FBRUQ7OztBQUdBLFNBQVMsR0FBRyxDQUFDLElBQVksRUFBRSxPQUFnQjtJQUN6QyxNQUFNLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxHQUFHLE9BQU8sQ0FBQTtJQUNuQyxNQUFNLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsR0FBRyxRQUFRLENBQUE7SUFDeEQsTUFBTSxZQUFZLG1DQUFRLE9BQU8sS0FBRSxLQUFLLEVBQUUsS0FBSyxHQUFHLENBQUMsR0FBRSxDQUFBO0lBRXJELE1BQU0sSUFBSSxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUE7SUFDNUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUE7SUFFekIsTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQW9CO1FBQzdELElBQUksV0FBVyxLQUFLLEtBQUssSUFBSSxJQUFJLElBQUksWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQUUsT0FBTztRQUVsRSxJQUFJLFVBQVUsSUFBSSxRQUFRLEVBQUU7WUFDMUIsSUFBSSxVQUFVLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxHQUFHLElBQUksS0FBSyxDQUFDO2dCQUFFLE9BQU87U0FDbEQ7UUFFRCxJQUFJLFVBQVUsSUFBSSxNQUFNLEVBQUU7WUFDeEIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLEdBQUcsSUFBSSxLQUFLLENBQUM7Z0JBQUUsT0FBTztTQUNuRDtRQUVELElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsWUFBWSxDQUFDLENBQUMsQ0FBQTtLQUNoRCxDQUFDLENBQUE7SUFFRixPQUFPLElBQUksQ0FBQTtBQUNiLENBQUM7QUFHRDs7O0FBR0EsU0FBUyxJQUFJLENBQUMsSUFBZSxFQUFFLE9BQWdCO0lBQzdDLE1BQU0sRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLEdBQUcsT0FBTyxDQUFBO0lBQ25DLE1BQU0sWUFBWSxtQ0FBUSxPQUFPLEtBQUUsS0FBSyxFQUFFLEtBQUssR0FBRyxDQUFDLEdBQUUsQ0FBQTtJQUVyRCxNQUFNLElBQUksR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFBO0lBRXpDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFhO1FBQ3pCLElBQUksS0FBSyxDQUFBO1FBQ1QsTUFBTSxFQUFFLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUV2QyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDdkIsS0FBSyxHQUFHLElBQUksQ0FBQyxJQUFJLEVBQUUsWUFBWSxDQUFDLENBQUE7U0FDakM7YUFBTSxJQUFJLE9BQU8sSUFBSSxJQUFJLFFBQVEsRUFBRTtZQUNsQyxLQUFLLEdBQUcsR0FBRyxDQUFDLElBQUksRUFBRyxZQUFZLENBQUMsQ0FBQTtTQUNqQzthQUFNO1lBQ0wsS0FBSyxHQUFHLFdBQVcsQ0FBQyxJQUFZLEVBQUUsWUFBWSxDQUFDLENBQUE7U0FDaEQ7UUFFRCxFQUFFLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFBO1FBRWhCLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUE7S0FDaEIsQ0FBQyxDQUFBO0lBRUYsT0FBTyxJQUFJLENBQUE7QUFDYixDQUFDO0FBR0QsU0FBUyxhQUFhLENBQUMsSUFBYSxFQUFFLE9BQWdCO0lBQ3BELE9BQU8sS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUM7VUFDdEIsSUFBSSxDQUFDLElBQUksRUFBRSxPQUFPLENBQUM7VUFDbkIsR0FBRyxDQUFDLElBQWMsRUFBRSxPQUFPLENBQUMsQ0FBQTtBQUNsQyxDQUFDO0FBRUQ7OztBQUdBLFNBQVMsT0FBTyxDQUFDLEtBQWEsRUFBRSxJQUFTLEVBQUUsT0FBZ0I7O0lBQ3pELE1BQU0sRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxHQUFHLE9BQU8sQ0FBQTtJQUMxQyxNQUFNLEVBQUUsSUFBSSxFQUFFLEdBQUcsUUFBUSxDQUFBO0lBRXpCLE1BQU0sSUFBSSxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUE7SUFDekMsTUFBTSxHQUFHLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQTtJQUN4QyxNQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFBO0lBRTFDLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUE7SUFDN0IsTUFBTSxPQUFPLEdBQUcsR0FBRyxLQUFLLElBQUksS0FBSyxFQUFFLENBQUE7SUFDbkMsTUFBTSxLQUFLLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQztVQUM3QyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUM7VUFDdkIsYUFBYSxDQUFDLElBQUksa0NBQU8sT0FBTyxLQUFFLEtBQUssRUFBRSxLQUFLLEdBQUcsQ0FBQyxJQUFHLENBQUE7O0lBR3pELE1BQUEsR0FBRyxDQUFDLElBQUksMENBQUUsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFBO0lBQ3BCLEdBQUcsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFBO0lBQ3hCLEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUE7SUFDakIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQTs7SUFHaEIsTUFBQSxLQUFLLENBQUMsSUFBSSwwQ0FBRSxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUE7SUFDeEIsS0FBSyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUE7SUFDNUIsS0FBSyxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUE7SUFDakMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUNuQixJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFBO0lBRWxCLElBQUksSUFBSSxJQUFJLFNBQVMsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFO1FBQ3RDLE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUE7UUFFNUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUE7UUFDM0IsR0FBRyxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUE7UUFDbEMsR0FBRyxDQUFDLFlBQVksQ0FBQyxlQUFlLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFBO1FBQzlELEdBQUcsQ0FBQyxZQUFZLENBQUMsZUFBZSxFQUFFLE9BQU8sQ0FBQyxDQUFBO1FBQzFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsVUFBVSxFQUFFLEdBQUcsQ0FBQyxDQUFBO1FBRWpDLE1BQU0sQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFBO1FBQzlCLEtBQUssQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUE7S0FDckI7SUFFRCxPQUFPLElBQUksQ0FBQTtBQUNiLENBQUM7QUFHRCxTQUFTLE1BQU0sQ0FBQyxJQUFZLEVBQUUsT0FBZ0I7SUFDNUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxHQUFHLE9BQU8sQ0FBQTtJQUM1QixNQUFNLElBQUksR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFBO0lBQzlDLE1BQU0sT0FBTyxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUE7SUFDakQsTUFBTSxLQUFLLEdBQUcsR0FBRyxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQTtJQUVoQyxJQUFJLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxFQUFFO1FBQzVCLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFBO0tBQzlCO0lBRUQsT0FBTyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQTtJQUMxQixJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQTtJQUMvQixJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFBO0lBQ3BCLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUE7SUFFbEIsT0FBTyxJQUFJLENBQUE7QUFDYixDQUFDO1NBRXVCLFNBQVMsQ0FBQyxJQUFZLEVBQUUsT0FBZ0I7SUFDOUQsTUFBTSxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLEdBQUcsT0FBTyxDQUFBO0lBQ2xELE1BQU0sUUFBUSxHQUFHLElBQUksZ0JBQWdCLEVBQUUsQ0FBQTtJQUV2QyxNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFBO0lBQ2xDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLEtBQUssWUFBWSxDQUFDLENBQUMsRUFBRSxRQUFRLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQTtJQUM1RSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxFQUFFLFVBQVUsQ0FBQyxDQUFBO0lBQzVDLFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUE7SUFFckIsT0FBTyxRQUFRLENBQUE7QUFDakI7O0FDaFhBOzs7U0FHZ0IsT0FBTyxDQUFDLElBQWUsRUFBRSxJQUFVO0lBQ2pELE1BQU0sSUFBSSxHQUFHLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQTs7SUFHaEMsSUFBSSxJQUFJLENBQUMsTUFBTSxJQUFJLENBQUM7UUFBRSxPQUFPLElBQUksQ0FBQTtJQUVqQyxNQUFNLElBQUksR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFBO0lBQ3pDLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFBO0lBRTlCLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFZO1FBQ3hCLE1BQU0sRUFBRSxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUE7UUFDdkMsTUFBTSxLQUFLLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFBO1FBRXZCLEVBQUUsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUE7UUFDaEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQTtLQUNoQixDQUFDLENBQUE7SUFFRixPQUFPLElBQUksQ0FBQTtBQUNiLENBQUM7QUFFRDs7O0FBR0EsU0FBUyxhQUFhLENBQUMsSUFBZTtJQUNwQyxJQUFJLElBQUksSUFBSSxJQUFJLEVBQUU7UUFBRSxPQUFPLEVBQUUsQ0FBQTtLQUFFO0lBRS9CLElBQUksT0FBTyxJQUFJLElBQUksUUFBUSxFQUFFO1FBQzNCLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLElBQUksQ0FBQyxDQUFDLENBQUE7S0FDMUU7SUFFRCxPQUFRLElBQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxJQUFJLENBQUMsQ0FBQyxDQUFBO0FBQ3hELENBQUM7QUFFRCxTQUFTLEdBQUcsQ0FBQyxLQUFhOztJQUN4QixNQUFNLENBQUMsR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFBO0lBQ3JDLENBQUMsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFBOzs7O0lBS3RCLE1BQUEsQ0FBQyxDQUFDLElBQUksMENBQUUsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFBOztJQUVsQixNQUFBLENBQUMsQ0FBQyxJQUFJLDBDQUFFLEdBQUcsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQTtJQUU3QixDQUFDLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQTtJQUNsQyxDQUFDLENBQUMsWUFBWSxDQUFDLEtBQUssRUFBRSxVQUFVLENBQUMsQ0FBQTtJQUNqQyxDQUFDLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxJQUFJLEtBQUssRUFBRSxDQUFDLENBQUE7SUFDbkMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLEtBQUssRUFBRSxDQUFDLENBQUE7SUFFcEIsT0FBTyxDQUFDLENBQUE7QUFDVjs7OztBQ2xGQSxTQUFTLEdBQUcsQ0FBQyxHQUFXO0lBQ3RCLE9BQU8sQ0FBQyxHQUFHLENBQUMsY0FBYyxHQUFHLEVBQUUsQ0FBQyxDQUFBO0FBQ2xDLENBQUM7QUFFRCxTQUFTLGVBQWUsQ0FBQyxFQUFlLEVBQUUsSUFBWSxFQUFFLE9BQWdCO0lBQ3RFLE1BQU0sT0FBTyxHQUFHLEVBQUUsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUE7SUFDbEMsTUFBTSxRQUFRLEdBQUcsSUFBSSxnQkFBZ0IsRUFBRSxDQUFBO0lBRXZDLE9BQU8sQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLG9CQUFvQixDQUFDLENBQUE7SUFFM0MsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFO1FBQzNCLE9BQU8sQ0FBQyxZQUFZLENBQUMsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQTtRQUN0QyxRQUFRLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFBO0tBQzdDO0lBRUQsUUFBUSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUE7SUFFekMsSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRTtRQUMxQixPQUFPLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFBO0tBQ3pCO1NBQU07UUFDTCxPQUFPLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQTtLQUNwQztBQUVILENBQUM7QUFFRCxTQUFTLE9BQU8sQ0FBQyxJQUFZO0lBQzNCLE9BQU8sTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUM7U0FDeEIsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLEtBQUssS0FBSyxJQUFJLElBQUksSUFBSSxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQTtBQUNoRSxDQUFDO0FBRUQsU0FBUyxTQUFTLENBQUMsSUFBWSxFQUFFLFVBQW9CLEVBQUUsVUFBc0I7SUFDM0UsTUFBTSxRQUFRLEdBQUcsVUFBVSxJQUFJLFFBQVE7V0FDcEMsQ0FBQyxJQUFJLENBQUMsQ0FBQztXQUNQLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQTtJQUNWLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDO1NBQ2pDLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxLQUFLLFFBQVEsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFBO0lBRXRFLE9BQU8sTUFBTSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQTtBQUNwQyxDQUFDO0FBRUQsU0FBZSxvQkFBb0IsQ0FBd0IsRUFBZSxFQUFFLEdBQWlDOztRQUMzRyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUE7UUFDbkIsTUFBTSxXQUFXLEdBQUcsTUFBTSxFQUFFLENBQUMsYUFBYSxDQUFDLGNBQWMsQ0FBQyxDQUFBO1FBRTFELElBQUksV0FBVyxLQUFLLElBQUksRUFBRTtZQUN4QixNQUFNLEtBQUssR0FBRyxNQUFNLEVBQUUsQ0FBQyxhQUFhLENBQUMsaUJBQWlCLENBQWdCLENBQUE7Ozs7OztZQU90RSxJQUFJLEtBQUssS0FBSyxJQUFJLEVBQUU7Z0JBQ2xCLE9BQU07YUFDUDtZQUVELE1BQU0sTUFBTSxHQUFHLE1BQU0sRUFBRSxDQUFDLGFBQWEsQ0FBQyx3QkFBd0IsQ0FBZ0IsQ0FBQTtZQUM5RSxNQUFNLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxDQUFBOztZQUUvQixNQUFNLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxDQUFBO1lBQy9CLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQTs7WUFHZCxNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxhQUFhLENBQUMsZUFBZSxDQUFDLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQTtZQUNqSCxNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUE7WUFDL0UsTUFBTSxFQUFFLFdBQVcsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUE7WUFDeEUsTUFBTSxLQUFLLEdBQUcsSUFBSSxTQUFTLEVBQUUsQ0FBQTtZQUM3QixLQUFLLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRTtnQkFDaEIsTUFBTSxFQUFFLE9BQU87Z0JBQ2YsUUFBUSxFQUFFLEtBQUs7YUFDaEIsQ0FBQyxDQUFBO1lBRUYsTUFBTSxPQUFPLEdBQVk7Z0JBQ3ZCLFNBQVMsRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUU7Z0JBQ3JDLEtBQUs7Z0JBQ0wsUUFBUTtnQkFDUixVQUFVO2dCQUNWLFFBQVEsRUFBRTtvQkFDUixJQUFJLEVBQUUsTUFBTSxDQUFDLFFBQVEsQ0FBQyxhQUFhO29CQUNuQyxXQUFXO29CQUNYLFNBQVMsRUFBRSxNQUFNLENBQUMsUUFBUSxDQUFDLFNBQVM7b0JBQ3BDLFVBQVU7b0JBQ1YsVUFBVTtvQkFDVixTQUFTLEVBQUUsTUFBTSxDQUFDLFFBQVEsQ0FBQyxTQUFTO29CQUNwQyxLQUFLLEVBQUUsTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLO2lCQUM3QjtnQkFDRCxLQUFLLEVBQUUsQ0FBQzthQUNULENBQUE7WUFFRCxJQUFJLEdBQUcsQ0FBQyxXQUFXLEVBQUU7Z0JBQ25CLE1BQU0sSUFBSSxHQUFHLFNBQVMsQ0FBQyxHQUFHLENBQUMsV0FBVyxFQUFFLFVBQVUsRUFBRSxVQUFVLENBQUMsQ0FBQTtnQkFFL0QsSUFBSSxHQUFHLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxFQUFFO29CQUFFLE9BQU07aUJBQUU7OztnQkFHeEMsSUFBSSxXQUFXLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFO29CQUFFLE9BQU07aUJBQUU7Z0JBQzVDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRTtvQkFBRSxPQUFNO2lCQUFFO2dCQUVwQyxlQUFlLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQTthQUN2QztTQUNGO0tBQ0Y7Q0FBQTtNQUVvQixlQUFnQixTQUFRQyxlQUFNO0lBRzNDLE1BQU07O1lBQ1YsTUFBTSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFFMUIsSUFBSSxDQUFDLDZCQUE2QixDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFBO1lBQ25FLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUM7WUFFNUQsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFBO1NBQ2Q7S0FBQTtJQUVELFFBQVE7UUFDTixHQUFHLENBQUMsVUFBVSxDQUFDLENBQUE7S0FDaEI7SUFFSyxZQUFZOztZQUNoQixJQUFJLENBQUMsUUFBUSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLGdCQUFnQixFQUFFLE1BQU0sSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7U0FDNUU7S0FBQTtJQUVLLFlBQVk7O1lBQ2hCLE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7U0FDcEM7S0FBQTs7Ozs7In0=
|