Полезная информация

Список ответов на каверзные вопросы можно получить в FAQ-разделе форума.

№125103-03-2024 13:45:21

b0ttle
Участник
 
Группа: Members
Зарегистрирован: 22-10-2020
Сообщений: 182
UA: Firefox 123.0

Re: UCF - ваши кнопки, скрипты…

Vitaliy V.. ;) Рады вас видеть. Спасибо за новую сборку.

Отсутствует

 

№125203-03-2024 15:18:10

unter_officer
Участник
 
Группа: Members
Откуда: Санкт-Петербург
Зарегистрирован: 27-03-2011
Сообщений: 599
UA: Firefox 115.0

Re: UCF - ваши кнопки, скрипты…

Vitaliy V. пишет

На старых версиях  работать не будет

Vitaliy V.
Очень рады вас видеть! Огромное спасибо за новую версию.
Вопрос. Какая минимальная версия [firefox] будет работать с новой сборкой?

Отредактировано unter_officer (03-03-2024 15:25:21)


«The Truth Is Out There»

Отсутствует

 

№125303-03-2024 17:12:24

Vitaliy V.
Участник
 
Группа: Members
Зарегистрирован: 19-09-2014
Сообщений: 2186
UA: Firefox 124.0

Re: UCF - ваши кнопки, скрипты…

-

Отредактировано Vitaliy V. (08-08-2024 15:03:19)

Отсутствует

 

№125403-03-2024 18:46:27

unter_officer
Участник
 
Группа: Members
Откуда: Санкт-Петербург
Зарегистрирован: 27-03-2011
Сообщений: 599
UA: Firefox 115.0

Re: UCF - ваши кнопки, скрипты…

Vitaliy V. пишет

Полноценно с [firefox] 117, но можно в [firefox] 115 запустить, не будут работать некоторые стили (в том числе настройках)

Спасибо за ответ. Я уже успел интереса ради немного потестировать на 115 ESR.
В целом работает нормально, но проблемки со стилями, как вы и сказали, присутствуют.
Глубже копать не стал. Откатился на старую версию UCF.


«The Truth Is Out There»

Отсутствует

 

№125503-03-2024 20:28:20

Vitaliy V.
Участник
 
Группа: Members
Зарегистрирован: 19-09-2014
Сообщений: 2186
UA: Firefox 124.0

Re: UCF - ваши кнопки, скрипты…

-

Отредактировано Vitaliy V. (08-08-2024 15:03:06)

Отсутствует

 

№125603-03-2024 21:47:20

unter_officer
Участник
 
Группа: Members
Откуда: Санкт-Петербург
Зарегистрирован: 27-03-2011
Сообщений: 599
UA: Firefox 115.0

Re: UCF - ваши кнопки, скрипты…

Vitaliy V. пишет

Хорошо т. к. 128 ESR выйдет в июле судя по графику, сделал патч для 115 ESR,
заменить файлы css из этого архива https://github.com/VitaliyVstyle/Vitali … 15_ESR.zip

Vitaliy V., большое спасибо за патч. Теперь на 115 ESR всё нормально.
Что касается 128 ESR, то для этого надо переходить на Win10+, а я пока этого не планирую.


«The Truth Is Out There»

Отсутствует

 

№125704-03-2024 08:12:11

Dumby
Участник
 
Группа: Members
Зарегистрирован: 12-08-2012
Сообщений: 2249
UA: Firefox 78.0

Re: UCF - ваши кнопки, скрипты…

egorsemenov06 пишет

вот эта кнопка отвалиться когда выпилят jsm?

В этом смысле — вроде не должна.


Vitaliy V.
Насчёт UcfPrefs.mjs. Сперва по Fluent'у.
Лис 124 ru. Поставил langpack'и uk и de.


STR: Включаю de, рестарт. Открываю «Настройки UserChromeFiles»,
окно локализировано как ru, это нормально, сборка ведь ru, а de отсутствует.
Теперь переключаюсь на uk.


ER: Локализация в окне меняется на uk, ведь uk есть.
AR: Ничего не происходит, локализация остаётся ru.


Да, я понимаю, что STR довольно экзотичен.
Но, может быть, заменить appLocalesAsBCP47 на availableLocales


И по коду.
Первая строка var global = Cu.getGlobalForObject({}); Разве это не globalThis?
И, UcfPrefs.global да, полезно пробросить, но почему геттер, а не просто значение?


UcfPrefs.defineGlobalGetters есть, но в само́м UCF нигде не используется.


UcfPrefs.defineLazyGlobalGetters есть, но нужно ли это?
Вот, добавил в config.js, в самое начало, ещё до антиподписячего (мне можно),
чтобы не было никаких сомнений, что там что-то появится только когда-то позже.

скрытый текст

Выделить код

Код:

//
(globalProperties => {
	var result = [];
	var global = Cu.getGlobalForObject(Cu);

	var max = Math.max(...globalProperties.map(prop => prop.length)) + 2;
	
	for(var name of globalProperties) {
		var desc = global.Object.getOwnPropertyDescriptor(global, name);
		if (desc) {
			for(var key in desc) {
				var type = typeof desc[key];
				if (type != "boolean") desc[key] = type;
			}
		}
		result.push(name.padEnd(max) + JSON.stringify(desc));
	}

	Services.obs.addObserver(async function test(win, topic) {
		Services.obs.removeObserver(test, topic);
		await win.gBrowserInit.idleTasksFinishedPromise;

		var text = encodeURIComponent(result.join("\n"));
		var url = "data:text/plain;charset=utf-8," + text;

		var gb = win.gBrowser;
		gb.selectedTab = gb.addTrustedTab(url);

	}, "browser-delayed-startup-finished");
})([
	"atob",
	"btoa",
	"Blob",
	"CSS",
	"CSSRule",
	"DOMParser",
	"Event",
	"File",
	"FileReader",
	"InspectorUtils",
	"URL",
	"XMLHttpRequest",
	"fetch",
	"L10nFileSource",
	"L10nRegistry",
	"Localization",

	// test non-existens
	"absent",
	"alert",

	// candidates
	"TextEncoder",
	"TextDecoder",
]);


Код собирает дескрипторы свойств и визуализирует во вкладке
первого окна браузера (не сразу, нужно чуть подождать).


Насколько я вижу, все свойства уже есть, и у всех сразу value (не get).
Таким образом, lazy-фикация представляется излишней,
можно просто сразу пробросить ссылки, и все дела.


Кстати, почему только эти.
Мне вот за Text{En, De}coder особенно обидно было ещё в прошлом UCF.

Отредактировано Dumby (04-03-2024 08:13:09)

Отсутствует

 

№125804-03-2024 12:42:17

grom17
Участник
 
Группа: Members
Зарегистрирован: 13-06-2019
Сообщений: 47
UA: Firefox 123.0

Re: UCF - ваши кнопки, скрипты…

Vitaliy V. пишет

UserChromeFiles обнова https://github.com/VitaliyVstyle/Vitali … hromeFiles

Сделал всё по инструкции ...никаких изменений. Видимо чего-то не понимаю. 125.0a1 (2024-03-03) (64-разрядный)

Отредактировано grom17 (04-03-2024 13:01:50)

Отсутствует

 

№125904-03-2024 14:15:35

fuchsfan
Участник
 
Группа: Members
Зарегистрирован: 07-08-2023
Сообщений: 130
UA: Firefox 123.0

Re: UCF - ваши кнопки, скрипты…

grom17 пишет

Сделал всё по инструкции ...никаких изменений.

В v124.0beta6 работает. Кэш автозапуска очищал? Сразу должны быть видны три кнопки доп. тулбаров и доступны Промежуток и Разделитель. Зайди в настройки UCF и в нижней части проставь все птички, по умолчанию они все сняты. Не все скрипты, работающие в Aris-t2, работают в UCF.

Добавлено 04-03-2024 14:17:46
А вот кнопку  "Open settings" button я так и не смог отыскать, она, видимо, открывает настройки UCF в сепаратном окне.

Отредактировано fuchsfan (04-03-2024 14:17:46)

Отсутствует

 

№126004-03-2024 19:12:11

Vitaliy V.
Участник
 
Группа: Members
Зарегистрирован: 19-09-2014
Сообщений: 2186
UA: Firefox 124.0

Re: UCF - ваши кнопки, скрипты…

Dumby пишет

AR: Ничего не происходит, локализация остаётся ru.

Да, я понимаю, что STR довольно экзотичен.
Но, может быть, заменить appLocalesAsBCP47 на availableLocales

Т. е. не происходит без перезагрузки ? Так и не было цели чтобы локали изменялись без перезагрузки, на панелях и кнопках UCF вообще ничего не происходит там просто при старте браузера один раз выбирается наиболее подходящая локаль и все, DOMLocalization не следит за ними.
А appLocalesAsBCP47 вполне достаточно для этого

скрытый текст
  /**
   * Returns a list of locales that the application should be localized to.
   *
   * The result is a ordered list of valid locale IDs and it should be
   * used for all APIs that accept list of locales, like ECMA402 and L10n APIs.
   *
   * This API always returns at least one locale.
   *
   * When retrieving the locales for language negotiation and matching
   * to language resources, use the language tag form.
   * When retrieving the locales for Intl API or ICU locale settings,
   * use the BCP47 form.
   *
   * Example: ["en-US", "de", "pl", "sr-Cyrl", "zh-Hans-HK"]
   */
  readonly attribute Array<ACString> appLocalesAsLangTags;
  readonly attribute Array<ACString> appLocalesAsBCP47;

А availableLocales возвращает неупорядочный список (хоть это и не важно в данном случае) всех доступных локалей,
ну и как бы он не нужен весь список если локаль только один раз при старте инициализируется
скрытый текст
  /**
   * Returns a list of locales that the app can be localized to.
   *
   * The result is an unordered list of locale IDs which should be
   * used as a availableLocales input list for language negotiation.
   *
   * Example: ["en-US", "de", "pl", "sr-Cyrl", "zh-Hans-HK"]
   */
  attribute Array<ACString> availableLocales;

Dumby пишет

Первая строка var global = Cu.getGlobalForObject({}); Разве это не globalThis?
И, UcfPrefs.global да, полезно пробросить, но почему геттер, а не просто значение?

В XPCOMUtils.sys.mjs так и записано
и да Cu.getGlobalForObject({}) == globalThis
В чем проблемма геттера?

Dumby пишет

UcfPrefs.defineGlobalGetters есть, но в само́м UCF нигде не используется.

Это я хотел использовать но потом не потребовалось, но оставил может пригодится для использования в пользовательском коде

Dumby пишет

Таким образом, lazy-фикация представляется излишней,
можно просто сразу пробросить ссылки, и все дела.

Возможно излишняя но мне нравится lazy, не используешь не загружается лишнее

Dumby пишет

Кстати, почему только эти.
Мне вот за Text{En, De}coder особенно обидно было ещё в прошлом UCF.

Хм что-то не вижу где в прошлом UCF это было? Но ок добавлю

Добавлено 04-03-2024 19:28:26

fuchsfan пишет

А вот кнопку  "Open settings" button я так и не смог отыскать

Значек шестеренка, в зависимости от локали может отличаться, например для en-US так
label кнопки:
Settings UserChromeFiles
tooltip:
Left-click: Open UserChromeFiles settings in window
Midle-click: Open about:config
Right-click: Open UserChromeFiles settings in the tab

И вообще она по умолчанию находится на дополнительной панели

Отредактировано Vitaliy V. (04-03-2024 19:28:26)

Отсутствует

 

№126104-03-2024 19:53:05

b0ttle
Участник
 
Группа: Members
Зарегистрирован: 22-10-2020
Сообщений: 182
UA: Firefox 123.0

Re: UCF - ваши кнопки, скрипты…

Vitaliy V.
Мне кажется лишним код с разными переводами. Может оставить просто английский, кому надо, сами переведут в коде, вручную. Пытался выпилить не нужное, как обычно:
                "ucf-open-about-config-button", - пользуюсь через ucf_hookClicks.js
                "ucf-additional-vertical-spring", - special_widgets(из-за space, separator)
                "ucf-additional-top-spring",
                "ucf-additional-bottom-spring",
                "ucf-restart-app", - через ucf_hookClicks.js + hotkey
                "ucf-view-history-sidebar-button", - через ucf_hookClicks.js + hotkey
                "ucf-view-bookmarks-sidebar-button", - тоже самое
                "ucf-open-directories-button", - через ucf_hookClicks.js + hotkey
И их в переводе не выпилишь(плохо разбираюсь как), мне по сути нужно только вертикальная, изредка верхняя. А тут какие-то переводы еще добавились) Итак путаюсь в коде, наверняка выпиливая костыльно и не все. Многие пользуются, тем же Aris-t2, на соседнем форуме. Так он без переводов, как и многие другие альтернативы. Лишние переводы, как по мне, лишнее. На костыль похоже)


Это лишь мой каприз, может другим нужны переводы. Мне и одного вполне хватает, если код от этого будет меньше и выпиливать будет легче. Да, можно просто под коврик спрятать все эти потроха, но они и там в глаза бросаются. Вместо одного spring, висят аж 4) Можно не прятать, оставляя на местах. Но все равно, не то. Зачем их именовать по-разному, чтобы не путаться? В коде, их тоже так и хочется выпиливать, возможно это лишь мой причуды и не критично.


(В общем, пытался их убрать в "async formatMessages(){}", файл UcfPrefs.mjs, и у меня пропали пункты выбора, раскрыть-спрятать вертикальную панель и другие. Пришлось их вернуть, а так, вроде везде выпилил).

Отредактировано b0ttle (04-03-2024 20:09:34)

Отсутствует

 

№126205-03-2024 00:43:51

Dumby
Участник
 
Группа: Members
Зарегистрирован: 12-08-2012
Сообщений: 2249
UA: Firefox 78.0

Re: UCF - ваши кнопки, скрипты…

Vitaliy V. пишет

не было цели чтобы локали изменялись без перезагрузки

OK, принято.

В XPCOMUtils.sys.mjs так и записано

Точно. Запись довольно старая, старше чем globalThis.

В чем проблемма геттера?

Проблем нет никаких.
Геттер это функция. Обратился к свойству — считай вызвал функцию.
А функция всегда возвращает одно и то же.

оставил может пригодится для использования в пользовательском коде

OK, принято.

Возможно излишняя но мне нравится lazy, не используешь не загружается лишнее

Наоборот.
В цикле всё равно идёт перебор свойств, где для каждого из них
низачем создаётся своя отдельная функция и назначается как геттер.


Когда случится обращение к этому свойству,
геттер-функция низачем проверит, есть ли такое свойство в SystemGlobal,
ведь оно есть и было, перезапишет как свойство сандбокса, и вернёт значение.


Создание множества этих функций, которые проверяют уже заранее известное,
и возвращающих нечто заведомо существующее — это и есть «лишнее».

Хм что-то не вижу где в прошлом UCF это было?

Да-да, не было. Именно поэтому мне и было странно чем они впали в немилость.


Вообще-то да, это проблема, как выбрать то, что следует пробросить.
В смысле как определить наиболее популярное.


Гобальные свойства проброшены не все, но их хотя бы немного,
а если брать и что-то вроде L10nRegistry, то это и вовсе не гобальное свойство,
но нечто DOM-idl'ское, а такого добра в SystemGlobal целый вагон.


Например, IOUtils и PathUtils кажутся вполне достойными кандидатами.

Отсутствует

 

№126305-03-2024 01:23:32

Vitaliy V.
Участник
 
Группа: Members
Зарегистрирован: 19-09-2014
Сообщений: 2186
UA: Firefox 124.0

Re: UCF - ваши кнопки, скрипты…

b0ttle пишет

Мне кажется лишним код с разными переводами. Может оставить просто английский, кому надо, сами переведут в коде

Предлагаете переводить юзерам в коде потому что вам сложно разобраться с кодом а им типа легко.
Не не вариант с локалью проще добавить новый язык просто создать в папке locales папку с названием идентификатора нужного языка и в ней файлы .ftl с переводом.

b0ttle пишет

Мне и одного вполне хватает, если код от этого будет меньше и выпиливать будет легче. Да, можно просто под коврик спрятать все эти потроха, но они и там в глаза бросаются. Вместо одного spring, висят аж 4

Первое пробовали отключить в настройках ненужные панели? Вместе с панелями отключаются и соответствующие кнопки, интервалы
И в коде лучше не выпиливать если не ориентируетесь, можно добавить данный код в custom_script.js или в другой подключенный в scriptsbackground
и эти кнопоки, интервалы будут удалятся до того как попасть на панели или хранилище

скрытый текст

Выделить код

Код:

(ids => ({
    init() {
        CustomizableUI.addListener(this);
        Services.obs.addObserver(this, "browser-delayed-startup-finished");
    },
    observe() {
        Services.obs.removeObserver(this, "browser-delayed-startup-finished");
        CustomizableUI.removeListener(this);
    },
    onWidgetCreated(aWidgetId) {
        if (ids.has(aWidgetId))
            CustomizableUI.destroyWidget(aWidgetId);
    },
}).init())(new Set([
    "ucf-open-about-config-button",
    "ucf-additional-vertical-spring",
    "ucf-additional-top-spring",
    "ucf-additional-bottom-spring",
    "ucf-restart-app",
    "ucf-view-history-sidebar-button",
    "ucf-view-bookmarks-sidebar-button",
    "ucf-open-directories-button",
]));

Отредактировано Vitaliy V. (05-03-2024 01:27:01)

Отсутствует

 

№126405-03-2024 01:55:43

Vitaliy V.
Участник
 
Группа: Members
Зарегистрирован: 19-09-2014
Сообщений: 2186
UA: Firefox 124.0

Re: UCF - ваши кнопки, скрипты…

Dumby пишет

Наоборот.
В цикле всё равно идёт перебор свойств, где для каждого из них
низачем создаётся своя отдельная функция и назначается как геттер.

Когда случится обращение к этому свойству,
геттер-функция низачем проверит, есть ли такое свойство в SystemGlobal,
ведь оно есть и было, перезапишет как свойство сандбокса, и вернёт значение.

Да это понятно но следует добавить что это происходит только один раз при первом вызове

Dumby пишет

Создание множества этих функций, которые проверяют уже заранее известное,
и возвращающих нечто заведомо существующее — это и есть «лишнее».

Так а где гарантии что это сейчас заведомо существующее не станет потом просто существующим или вообще не существующим.
А лишнее для меня то что не требуется для работы основных функций UserChromeFiles

Отредактировано Vitaliy V. (05-03-2024 02:30:41)

Отсутствует

 

№126505-03-2024 07:16:51

b0ttle
Участник
 
Группа: Members
Зарегистрирован: 22-10-2020
Сообщений: 182
UA: Firefox 123.0

Re: UCF - ваши кнопки, скрипты…

Vitaliy V. Спасибо. До меня потом дошло, что можно просто оставить все как есть. Если не пытаться выпилить сразу, то потом может и привыкнуть можно. Про настройки, что-то не подумал. Код попробую. Чисто мой закидоны)

Отсутствует

 

№126605-03-2024 09:26:14

Dumby
Участник
 
Группа: Members
Зарегистрирован: 12-08-2012
Сообщений: 2249
UA: Firefox 78.0

Re: UCF - ваши кнопки, скрипты…

Vitaliy V. пишет

добавить что это происходит только один раз при первом вызове

Да, разумеется. Но могло бы не происходить вовсе.

а где гарантии что это сейчас заведомо существующее не станет потом просто существующим или вообще не существующим

Ну так можно вообще обо всём сказать.
Хорошо, пусть сочтётся как осторожность.


Кстати, Console.sys.mjs же собираются выпилить,
неплохо бы что-то предусмотреть на такой случай.


Ещё, при переключении тулбаров посредством контекстного меню,
BrowserUsageTelemetry мусорит в консоль записью "widgetId is undefined".


Когда был проект встроить в UCF дебаггер,
то я просто добавлял id'шники в BROWSER_UI_CONTAINER_IDS


А теперь, наверно, надо какую-то функцию переопределять.
Ну, или ничего не делать, в консоль всё равно никто не смотрит.

Отсутствует

 

№126705-03-2024 18:29:32

Vitaliy V.
Участник
 
Группа: Members
Зарегистрирован: 19-09-2014
Сообщений: 2186
UA: Firefox 124.0

Re: UCF - ваши кнопки, скрипты…

Dumby пишет

Кстати, Console.sys.mjs же собираются выпилить

Да уж 6 лет выпиливали Console.jsm не выпилили, выпилили jsm теперь Console.sys.mjs выпиливают

Dumby пишет

Когда был проект встроить в UCF дебаггер

Что за проект? Нашел только настройки
extensions.user_chrome_files.debug
extensions.user_chrome_files.expert

Добавлено 05-03-2024 18:32:38

Dumby пишет

BrowserUsageTelemetry мусорит

Её вообще выпиливать нужно а не id'шники в BROWSER_UI_CONTAINER_IDS добавлять

Отредактировано Vitaliy V. (05-03-2024 18:35:57)

Отсутствует

 

№126805-03-2024 22:14:54

Dumby
Участник
 
Группа: Members
Зарегистрирован: 12-08-2012
Сообщений: 2249
UA: Firefox 78.0

Re: UCF - ваши кнопки, скрипты…

Vitaliy V. пишет

Что за проект?

Поскольку никто не мог знать, что нарисуется UCF 2024 от самого́ Автора,
а желающих обезопасить педыдущий UCF от последствий завершения JSM-геноцида
как-то не наблюдалось, то чувствовалось, что отдуваться придётся мне.


Я уже упоминал, что, увы, для некоторых задач, необходим дебаггер.
Вот когда приступил пробовать править UCF, решил, что он будет встроен.


Собственно, ничего особо сделать не успел,
пока там подформатировал всякий xml-like стафф в более человеко-читаемый вид,
пока заменил все четырёх-пробелья на благородную tab'уляцию,
случилось то, что случилось, и проект, соответственно, был мгновенно остановлен.


И это, несомненно, к лучшему.


Так вот, в config.js предполагалось оставить только самый минимум,
определение nsIFile'а с путём %профиль%/chrome/user_chrome_files/init.js
проверка, что он существует, и является файлом,
и загрузка этого init.js в объект {file: этот_файл};


А сырой набросок init.js был такой, скину какой был.
Не годен ни на что, но лишь составить представление о чём речь.


Дебаггер, собственно, это некая цитата из ранее добавленного в CB,
ну и в антиподписячем подобный есть, но без наворотов.

скрытый текст

Выделить код

Код:

(url => {
	(file = file.parent).append("user_chrome.manifest");
	if (!file.exists() || !file.isFile()) return;

	Components.manager.QueryInterface(Ci.nsIComponentRegistrar).autoRegister(file);

	var sysp = Cu.getObjectPrincipal(this), SB = opts => Cu.Sandbox(sysp, opts);
	var sb = SB({sandboxName: "UserChromeFiles", wantGlobalProperties: ["ChromeUtils"]});
	Services.scriptloader.loadSubScript(url, sb);

	var unload = ["unload", e => e.target.ownerGlobal.windowRoot.removeEventListener(...ins), {once: true}];

	var ins = ["DOMDocElementInserted", e => {
		var win = e.target.ownerGlobal;
		if (win.windowRoot.ownerGlobal == win) {
			if (win.location == "about:blank") return;
			win.addEventListener(...unload);
		}
		win.isChromeWindow && sb.user_chrome.initWindow(win);
	}];

	Services.obs.addObserver(win => win.windowRoot.addEventListener(...ins), "domwindowopened");


	var re = Cu.reportError;
	var sandbox = SB({freshCompartment: true});
	Cc["@mozilla.org/jsdebugger;1"].createInstance(Ci.IJSDebugger).addClass(sandbox);
	var dbg = sb.dbg = new sandbox.Debugger();

	var g = Cu.getGlobalForObject(Cu);
	var gref = dbg.gref = dbg.makeGlobalObjectReference(g);

	var envRef = function(name) {
		var val = this.find(name).getVariable(name);
		return val.unsafeDereference?.() || val;
	}
	dbg.ref = (arg, func, glob) => {
		var go = glob === undefined ? g : glob || Cu.getGlobalForObject(func);
		var has = dbg.hasDebuggee(go);
		has || dbg.addDebuggee(go);
		try {
			var ref = go == g ? gref : dbg.makeGlobalObjectReference(go);
			var env = ref.makeDebuggeeValue(func).environment;

			var cn = arg.constructor.name;
			if (cn == "Object") for(var name in arg) try {
				env.find(name).setVariable(name, ref.makeDebuggeeValue(arg[name]));
			} catch(err) {re(err);}

			else return cn == "Array" ? arg.map(envRef, env) : envRef.call(env, arg);
		}
		catch(ex) {re(ex);} finally {has || dbg.removeDebuggee(go);}
	}

	// Meds. Prevent "widgetId is undefined" console spam
	// from BrowserUsageTelemetry.sys.mjs when toggle ucf-toolbars.
	if (sb.UcfPrefs.vertical_top_bottom_bar_enable) try {
		var exp = ChromeUtils.importESModule("resource:///modules/BrowserUsageTelemetry.sys.mjs");
		var ids = dbg.ref("BROWSER_UI_CONTAINER_IDS", exp.BrowserUsageTelemetry.init);
		ids && ["top", "vertical", "bottom"].forEach(pos => ids[`ucf-additional-${pos}-bar`] = "");
	} catch(ex) {re(ex);}

})("chrome://user_chrome_files/content/user_chrome.js");


И да, я согласен, что BrowserUsageTelemetry следует душить как угодно.
Но, если абстрагироваться от нашей к нему неприязни,
и рассмотреть просто как задачу: «Как получить ссылу на BROWSER_UI_CONTAINER_IDS?».


Пока нынешний Ку.import() ещё с нами можно использовать его.
Вообще, метод, конечно, волшебный. Возвращает некий прокси,
куда проброшен весь стафф — var, let, const, function, class, всё вообще.
Это arai подогнал какую-то .cpp-магию.


Но метод сгинет вместе с JSM.
И как тогда получить ссылку? Вроде никак. Только дебаггером.

Отсутствует

 

№126906-03-2024 10:08:18

kokoss
Участник
 
Группа: Members
Зарегистрирован: 15-02-2018
Сообщений: 1740
UA: Firefox 115.0

Re: UCF - ваши кнопки, скрипты…

grom17 пишет

Сделал всё по инструкции ...никаких изменений. Видимо чего-то не понимаю. 125.0a1 (2024-03-03) (64-разрядный)

В [firefox] 123 тоже не работает ?

Add, если не работает, тогда опишите что сделали, желательно по пунктам!


Add, ладно.... user_chrome_files. С остальным надеюсь сами разберётесь.

Отредактировано kokoss (06-03-2024 19:19:57)


Win7

Отсутствует

 

№127006-03-2024 15:42:09

Vitaliy V.
Участник
 
Группа: Members
Зарегистрирован: 19-09-2014
Сообщений: 2186
UA: Firefox 124.0

Re: UCF - ваши кнопки, скрипты…

Dumby пишет

Я уже упоминал, что, увы, для некоторых задач, необходим дебаггер

Ну именно для BrowserUsageTelemetry я бы не стал добавлять его, но если нужно для некоего кода в custom_script.js  что если добавить этот модуль
он делает часть работы ?
ChromeUtils.defineESModuleGetters(scope, {
    ...
    addDebuggerToGlobal: "resource://gre/modules/jsdebugger.sys.mjs",
    addSandboxedDebuggerToGlobal: "resource://gre/modules/jsdebugger.sys.mjs",
});

Отсутствует

 

№127106-03-2024 18:18:58

Dumby
Участник
 
Группа: Members
Зарегистрирован: 12-08-2012
Сообщений: 2249
UA: Firefox 78.0

Re: UCF - ваши кнопки, скрипты…

Vitaliy V. пишет

именно для BrowserUsageTelemetry я бы не стал добавлять его, но если нужно для некоего кода

Не-не, конечно же, в первую очередь, для пользовательского кода.


Просто когда он уже есть, возникает соблазн
воспользоваться им и для усмирения BrowserUsageTelemetry.


Мягонькое такое воздействие, никакого насилия,
добавляем id'шники как пустые строки, и это дело умолкает.


Если будет принято решение заткнуть BrowserUsageTelemetry
как-то иначе, или не делать с этим ничего, тогда дебаггер мог бы быть lazy getter'ом.


Наверно лучше как свойство UcfPrefs. Он определён как в сандбоксе, так и в окнах браузера.
В других окнах UcfPrefs можно просто импортировать, если вдруг понадобится.


Вот, поискал, нашёл, например, такой код.
Здесь TransactionsHistory не вытащишь никак, когда исчезнет Cu.import()
А с дебаггером просто пишем UcfPrefs.dbg.ref("lazy", PlacesTransactions.undo).TransactionsHistory

что если добавить этот модуль
он делает часть работы ?

Да, указанные методы этого модуля делают часть работы.
Но только совсем небольшую, только самое начало.
Плюс, они делают нечто совсем, в данном случае ненужное, вызывают initPromiseDebugging();
Таким образом, добавление этого модуля не представляется полезным.

Отредактировано Dumby (06-03-2024 18:20:20)

Отсутствует

 

№127207-03-2024 00:34:13

Vitaliy V.
Участник
 
Группа: Members
Зарегистрирован: 19-09-2014
Сообщений: 2186
UA: Firefox 124.0

Re: UCF - ваши кнопки, скрипты…

Dumby
https://github.com/VitaliyVstyle/Vitali … fs.mjs#L46
Проверил сработало на BROWSER_UI_CONTAINER_IDS и код по ссылке

Но чтобы не мусорила BrowserUsageTelemetry просто переопределил
функцию onViewToolbarCommand https://github.com/VitaliyVstyle/Vitali … ar.js#L143

Также убрал Lazy, побавил TextEncoder TextDecoder https://github.com/VitaliyVstyle/Vitali … me.js#L179

Отредактировано Vitaliy V. (07-03-2024 00:34:54)

Отсутствует

 

№127307-03-2024 10:20:57

Dumby
Участник
 
Группа: Members
Зарегистрирован: 12-08-2012
Сообщений: 2249
UA: Firefox 78.0

Re: UCF - ваши кнопки, скрипты…

О, спасибо!
Тогда код «Восстановить удалённое», будет, наверно, таким

скрытый текст

Выделить код

Код:

(async sep => {
	if (!sep) return;

	var key = "hasRemoveTransaction";
	var raws = UcfPrefs.dbg.ref("lazy", PlacesTransactions.undo).TransactionsHistory.proxifiedToRaw;
	raws[key] ??= entry => {
		for(var transaction of entry) {
			if (raws.get(transaction) instanceof PlacesTransactions.Remove)
				return true;
		}
	}
	var menuitem = document.createXULElement("menuitem");
	for(var args of Object.entries({
		closemenu: "single",
		class: "menuitem-iconic",
		id: "placesCmd_undoRemove",
		label: "Восстановить удалённое",
		oncommand: "PlacesTransactions.undo().catch(Cu.reportError);",
		image: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQEAYAAABPYyMiAAAABmJLR0T///////8JWPfcAAAACXBIWXMAAABIAAAASABGyWs+AAAACXZwQWcAAAAQAAAAEABcxq3DAAAEd0lEQVRIx53Ve2yW5RkG8N/7ft8Hxa/9CgjSSDnMA4xVTUMQWzadhzhnjSCC0y0jSjom+JdGp844ZhSjHLJsowaNZoCCHOWglXGoQbo2fBW3obDNUBfXKpsUVhxn6OHdH8+31GXGmL3/3M913ffzPNed93qeBxvmI8umCNjyPFEDSRJw40qKa9jyHSbdzY77Ar+9FTvZ+nHAb9T7P76YcwlOktlBdJia2SSthfRvaR/Mync5tp85Q2mbEHJ/X0bqRTpOBJyehog3C3j1HV9RQP91xG9T8z2SofyphMELWH4zW5s40s7kQ/T0cnYfXfPD1OgM0TlGzSN1DZkzxG1EdURjaa9HCfddEupfuSkIfHXJ5wVENA8Iw9QcRnbzXj31++g8w+WVZHMhXzaKhu2MGMtd36f5CTrn8WAJyf001KCYpA6dDBtLlOfoYuI6kgp6XuLsbhQRfw39ovDPx7/JgYS1b3NkCxcvoPgTevIULyFVTm4jyinp4uRJiirYt5BMLc15kvE0lnCsgZaE2wdx6LVCo9/ghQn4LhdFxEOonELv8ogVV9Iyjd9fx8T1FE2nq5XSQWQuJbsmrJH9JclMsldhFsW3EU0iuxsb6f9zTA3dHj1J1yPsKaPrIOtnkn6KDY2cvYF/vkfmINGuiPdnUD6Pd/7Mur/x0RCqXqTfj+m5glyO1B8ovR1pijeil6KvBw8V1QaB/QYWzNgSYu+TmMm5GVhKT47OBWR28kgnvxvKS/OjvuMGuTSr72FtBR/WctNe4l+H3GUt7DxB2TKe+CmnF5IZRzSZzFmS4wy9n2QGY2eR3Mx193DqAao+4vh04lZS2/EkQyqo7cWux4Kjwf4gKF3N5hEs+QsLlwVuVRPLP2FeTSh95hZSpSx6OOAkwWCWLSEqYWVz4JtLqd3GiuX0/oS6XKjd/BQbF6SRJynij4eJKpl7WSg8cCdzxjHjH3QuIsaorQx7NCx8QQdxCYM2kzxL423BbGN6SP+I6tmcO86hahqu4MA2To3mX+eTxbA2er6VJjcA/Yl2kOzlrutJxrDraaI1XH09j3fQVk7pcG5sCgIOttLVzejpmMPrnxJvYnIZXelwxGHTCOaX0PorsmUMOC/wpeNofg4fjg9EW3+k6CzcYJ99M7h6fSfxFFJrMZzFm0I+fzXxlTQ1EHf3eSlJyI3mlYGs/yEPx4F7/NkQ11zEymFhnDoY9RnwcHmIZ34Q1CcTkBD9FSM58gu8SmUHbmVuJbYRt2AiE/cwZT/tG3h+Gh29lH3A+VPZ+zMq1rHwcq6tY1U31ReQXPgFt3M+/9+xJRvM9f5S3NnX6btLqfqYt1p44xQrFnH0aX6zmBXIj+Hae0N95qG+ea/PJjrB7tV47csE7CzEJqKXyTcW8CquaibfwTOX0FjPLSfYk+G8XWyb+rlTUcndVUQjWXOK+FiBn/QfQen/FVBVVdhoc4FIkczqM5WBvPMWp4fQMpzFHeEN2NCFCcyNSH2b1AiSl3nhVnrnkjpNkqP9jrBvdzX8G2rIlxvMK3a7AAAAInpUWHRTb2Z0d2FyZQAAeNorLy/Xy8zLLk5OLEjVyy9KBwA22AZYEFPKXAAAAABJRU5ErkJggg==",
	}))
		menuitem.setAttribute(...args);

	var desc = Object.getOwnPropertyDescriptor(XULElement.prototype, "hidden");
	var {set} = desc;
	desc.set = () => {
		var entry = PlacesTransactions.topUndoEntry;
		set.call(menuitem, !entry || !raws[key](entry));
	}
	Object.defineProperty(menuitem, "disabled", {});
	Object.defineProperty(menuitem, "hidden", desc);
	sep.before(menuitem);
})(document.getElementById("placesContext_deleteSeparator"));


Так же, вижу улучшение для UcfPrefs.global
Всё ещё функция, но лишь до первого обращения,
затем просто значение, как и могло бы быть сразу, но всяко лучше, чем было.


Кстати, и в геттере UcfPrefs.dbg
строка var g = Cu.getGlobalForObject(Cu); — это тоже globalThis


Это глобальный объект всех модулей.
Такой единственный, такой один на весь процесс. Он.

Но чтобы не мусорила BrowserUsageTelemetry просто переопределил
функцию onViewToolbarCommand https://github.com/VitaliyVstyle/Vitali … ar.js#L143

Да, вижу, теперь в консоли тишина.

onViewToolbarCommand, было - стало

Выделить код

Код:

data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABd4AAAEoCAIAAADJ7nQSAABfdElEQVR42uzdzW8bWX/g+8MgyeIuA3W70YDvihRGagkYdIIHafLaBoxZRHSnoVFrtMqAMQZTNLqnI2606AFhPzaEeKENOT2dK1YQdIjJilfRFTptMouBcbs1ZA8e5DECSLYAsVY3jQd2LDz5A24yunXqhayXU1RRpPim72djuVh1XqpInZ/Orw4r8f0vDWH5zd/6LQEAwBT6337z//vN33RGsd9iOAMAAMBUSfzTP/3TuNsAAMAlnZ+f/8Zv/Ebn53E3BwAAAOhb4uzsbNxtAADgMv75n//5t3/7t71TM//yL/8y7kYBAAAA/ZFTM2/fztn/+Vf/inwjAGBqvHnzJjw1w6AGAACA6cLUDABgWjE1AwAAgBnA1AwAYFoxNQMAAIAZwNQMAGBaMTUDAACAGaCamjFEPif0lvwxXRLNzSFUU84IURWbSf/WhkhkRf1crIyyx8bhbur5G/MHbeNRZeEk/7imm/+5cbf94FbSfvXtnfO1hT5LPSvvfl14492yXH+01k/H3JYsb7i1H2YePxd3HzVvDdDZk/1c7ahldbD07ktx+8Hm3AjOsapr3X7ZXugPf/XJk4/fi2h4OZMqtDwbtPp55areJ6+/e/jt+0+0D+Pv/uUvfvY0su0ARifW1AyDGoPaUDGoAQCAoVNMzTTyYntxOMFrhzqKHRczVN2Ze1BxYqqT/O7ZlhXCDsCMYn+Yf7C2crKfOVtr3nL/23c5h5n9uWYn2nNKu2yjTvbzZ7crt+yre1Le/V6sjyWKDfUrVuBolPPP7lXs90w5k59vDiOKNaPjHUVJvUPqgO8e6n3EvACuUpypGQa1S2BQ66dfDGoAAGBQiqmZfELo1n9LbRl3mgFooWX93Jb5QFPd3CsvsroolUStIFoy+yOcwMCTnBTu9k6BUlq0myJpxcpZ3SmtG1N0Dk+LUlFsrji7KSpSauzvbh+9kYffWC7KINLK+4llTRzpb4S4sVxaX7PCOE9QdbafObEjxXCKT77c2N/LHsnUYXp5o7q2kLTyfi0nf+jkFdOdNGAo7gw1KXKjJRzFLiy9rPkbLxqHu9vPrcOdJgk7G9mysogFs7U3lusP1sT+7qkqoxis/WQ/UTtK37jRevMmfffu0vPnutm7uyL7PLTx87WVuXDtUSf5rLy/Jxsjbmgb7x6fLHii2GAQ2yhntgstWaZWr1ZWrB7ZUey9Z92ws5FPyPdMunTe3PT+bDTyuaz1pnMPt/KTQtOEbr2ZtFJVhsPOMe47sdRudv6u6ifHSBQLTI44UzMMagxqDGo9MKgBADAJYt01000PGiKTEkUr7pTR7ZJoV0SyITLbomrFpmbAKtxA09zhVbH7szLBaO6/2olircI36jJ4dX7uhNGhihQi0oZmbPq92JDbzR1y4oEVYnYTgI1gqOeLI61D1qu35pL2fdRnt5u35nrlJ/1RrHJP0Su9GYxiE9+L+rqMHcXZSX7vZNVqs3F2lpybs8NEz+3cVk/v3tm6Zce1Zh/3whnFqCal3t5pr4mdx98vfv7g3oncZ+tMsVGeRkXtipMsY+V37FNn/iXwdVZ4/zYIJvQMw0gmk1bkmhNbdnDZuf3be9t3I585dV6XP1bMt6m5X05Uq5vW8WY867xuhqzboi7jX2uHpv2Gjkgw2i3Snnwc5zNDFAtMjsvdNcOgxqDGoNbBoAYAwCQYaGomuLEhzMChrYoy40SxRlmkXonzivNSpxnK2hX88WgnTvWEid4Q0/k5fOO3L45s7D/OHnnqsFfvW8cW3+5u/+O7xfV3tk8WmrfcUNEfxSqbJNTtVNQeUVoncScbVPrcE8X6+9JQJRiVTUo5oa0vzjaj2PDGyoKy9vBJ7tmvYBQrg9eCk5bu5P3CCUZ7V/v/3XDUnzbsFKCId8XgUezr7/Q/+2ux+g1BLDAZhjs1w6DGoMagBgAAxqK/qRkZaBacu7UVwaUnKxgop7NzoPCYCcZYUWxkglEZxdrbP3jpOcQWmWD0OMnvnwjxztbC29z3/7h0x1PClSUYjbPD3Ndvi49kxJl7u95cmwulEEMR+dl+5ocF5+ZwmZ/8fnG9mydUNeniKNbcqKpdcZJ7Jhh9t1rLBOCrarOSFE6y0BvFuu+lTkhqL9HfOs3s3LMO8SUYPSKjWKsC0SjnsrWNzt3f3PsNTKcBp2YY1NxjGdQY1AAAwDj1+q6Zuif1l7NWxZfqopYVLU3URXdR/am1bl9oVm7Quj27ZT8IIy2KzWAJaU1UKyJpxaPeZxXYXwFgNETOPdxege9dve+rSMmMnOwl9Pa69M6yeWul/Zm1nN5+hoWzs8wQukmwzkMuHM7jLbrL8uXy8rvr1hcQyiRb7Z11M1bzpNHcVf1S90kWoSapN6pqn9t5XDu+uxFalm+GjM4W7d0j/UjWlfIf3umj52EWnlX9gdrP9hNfH1lHbYiafOpE+53vO6X5N4rS53de7QVqv32qPsn+Zfm1I++DOfxRoxlmZu3189qSruta/dyMUv0Ps/Asojf3PhBicauzqL67LN9dgi+c+8blbeOnmYT744onl+n5AgC+MRGYWn191wyDGoMag1oYgxoAAJNA9fBs4Or1FTherT6fM0oUC0yOWA/PBq4egxoAABgEUzNAf8yg98tf/OzpZETgwDXH1AwwIAY1AAAmAVMzAIBpxdQMAAAAZgBTMwCAacXUDAAAAGYAUzMAgGnF1AwAAABmAFMzAIBpxdQMAAAAZgBTMwCAacXUDAAAAGbA5admGnmR1eUP9XOxctHO5YwQVbGZHH4HGvlEVtfq55UL2zAsRjmTKrQ8G0Za+6Wa+6oYp4Xx9wyxroLvVITO0oSfJgBTaYhTMwxqrsn+bc2gBgAAZtGgd83kE2J1rFGsVXh+vjnSAMko55/dq9jdGVrtZty3M+J+DJn3VLi9aeQzp5Xm5tV2bvpPHYDLGfpdMwxqDGodDGoAAGBkhjw1YzRELivsvJJWF3ZcYe6jdw5Ii3ZTKKNZKyUlNE3oullAWitVnTjRDIS29ZbcltaKTqxixpG5gr1ffen4YNXabDTyuazcKLdWKysRQfML/f5XP/o3ffTFN9qH6r0b5cx2odXylWlHsfeedWMnJ8OWLp03N70/h5uk7qaboXNOUqnd7BHyq05IOZMotNKl0lJNnhazMrk9nPfznzptSdft7GxEhlB5ORQnxKYK6J0otvf5VDZe2U7FJe5x6qwrffPTp08+fq/fNzaAqXDVUzMMagxqDGoAAGAEhjo10xCJrKi3hYwtDJFJiY22cLNwsRKMZkCyLZwQJpMTTTP68eeOZEy01dxsm2HcYrW6mUzKyDVlVioDHHmIvdGKZ+WOQ8hoGoaRtIo0gyrhFNm5sdkbHjptS4pu6BbRJEU3RewsmfKEJDtnr1Tc2gyE777g0tMkM57M1jbOPSFmIAyNaKfihCgP7zTQF8VGHB5svLKdUZeYBCNwXV3t1AyDGoMagxoAABiJYU7NGGWRKvheTZeEHcDEjmJDgaA3THPDla1TX9DiBE/+RFOPLF1fCcZOmstbYjjB2G2cFU472yOapOimiB2KqU6Im+TMKCN3X3Dp2ykYYoaiWEU7lSdEebiyiqjDg41XtjPqEhPFAtfVlU7NMKgxqDGoAQCA0biyu2b8OlFsIy+2F4U34eSlztFdIsE4LLLMV9VmJelmvLxRbOfO9E64ZYVxMsa+Zx0iIpoUGcVaFYhGOZetbUTd/d0rwRgjiu0vwahMmSpOiPLwThndKDb68GDjL0wwBi+T4tRZf670uK0fwNQb3V0zfgxqF3RTMKgxqAEAgD5cdmrGurXb+6yCknWbt1EWuYK7PS20onBX0Tvb05qoVnosy2/Z91OfynXa7q3VZoBjr8R2F2yL4LL8rC78a+B968gH4lbeXRtuRqn+xzR48mTm3gdCLHoSgKEmiahu+vrkWe8eXlsePiGBR0fYBQafJ+G007fc/XjRiU1De957pm5n+IRUUuqKvOnAzk3yFx/u7qpop+p8ut+TED51r/X7X/7Emnxgpg1taoZBrYtBjUENAACM2qB3zWB6ydzs9uJ5VLZ3YlyynS/0hwfvf0YMC8y0od81g+nFoAYAAKYXUzPXUCfzd8FDM8ZtWtoJYGyYmsH0DBbT0k4AADAGTM0AAKYVUzMAAACYAUzNAACmFVMzAAAAmAFMzQAAphVTMwAAAJgBTM0AAKYVUzMAAACYAUzNAACmFVMzAAAAmAGXn5pp5IX9pIH6uVi5aOdyRoiqGMvzCMqZRKHl/if0VATreQla/bxyYRcAAJNmiFMzDGoAAAAYl0HvmsknxOpkR7FuA/LzTXWo2uMlAMAkG/pdMwxqAAAAGL0hT80YDZHLCjufp9WFHRua++idA9Ki3RRJdVEJPZ1Ot1qtdKm0VCjoZgntykrSaORzWV2WmdbqVXODMMqZVEFomtDl5rRWqlY2k91UofWyWch5c7NTeCBUNcr5XME+uL50fLDaeemFfv+rH29++vTJx++N+9IAAC5w1VMzDGoAAAAYgaFOzTREIivqbWEGmsIQmZTYaDtJxVgJRhl9viq2K2Insb3Ybt57ltmZb26dZnKiWt1MyjLNePZ0y7p524xZt0VdBp/mUTnRtAJWT6jayGdOK1FRrPni9qJdpllkymwz934DwBS62qkZBjUAAACMxDCnZoyySBV8r6ZLwo4k40axOzLUlBGoGasK67+rB4ms7ivSWljv7CML7AasMaNYtx7FSwCAKXKlUzMMagAAABiNK7trxq8TxTbyYntReMJLD2UU600wekREsRlRNTcajXIuW9s47z/BaN36/dEX32gfjvvCAAAuNLq7ZvwY1AAAADBEl52asW7tbnk2lKzbvI2yyBXc7WmhFZ2V+Z3taU1UK9HL8oVczV8XWbnAvr24nSqY5Vbnd5xl+e4SfGGtu5e7nldO7WdVOOvx7cX25l4bolCwF+krH2bhX5af1YW9hv+1fv/Ln1iTDwBTYmhTMwxqAAAAGJ9B75qZKS/0hwfvf0YMCwBTYuh3zcwUBjUAAIApwdQMAGBaMTUDAACAGcDUDABgWjE1AwAAgBnA1AwAYFoxNQMAAIAZwNQMAGBaMTUDAACAGcDUDABgWjE1AwAAgBnA1AwAYFoxNQMAAIAZcPmpmUZeZHX5Q/1crFy0czkjRFVsJq+2M418wmqSVj+vrDj1JgqidN7cvHSZsoSW+590qd30dcKqsVsdAGCUhjg1w6AmGNQAAADGZNC7ZvIJsTrEKNYoZ3bmm4PFhOVM3lNEI585rQwQxarKjPsSAOBKDf2uGQY1BjUAAIDRG/LUjNEQuaywE3JaXdjBnbmP3jkgLdpNoY5m3fygs2MnmWcGott6yyw0ndaKbsCo3GgJR7GrS7WsLnfVStWKU2Y5s12wDtfq1cpK0j4wUWilS6WlWsHc23yhW0ogVDXK+VzBLrG+dHyw2nnphX7/qx9vfvr0ycfvjfnCAsA1cNVTMwxqDGoAAAAjMNSpmYZIZEW9LWRQaIhMSmy0naTi5ROM/i0yJt1qbgrVRrfwYBSb2BZOoGo08jkn5DQMI5lM2vGo6B5s7V0qbm2u+JvqK1MG0IvV6qZ5vFliyuwy934DwDhc7dQMgxoAAABGYphTM0ZZpAq+V9MlYd92ffko1h+iOq8L1UZ1MtB/77dbWidDKPxr7QMBcYe3zJ7VAQBG50qnZhjUAAAAMBpXdteMXyeKbeTF9qKIXCZvRog5UTVfbpRz2dpGOyKXeLkEo2GUc6lXxfNKyqzlVbVZSXYr7COK7ZFgtG79/uiLb7QPx3tVAeB6GN1dM34MagAAABiiy07NWLd2tzwbStZt3kZZ5Aru9rTQis7K/M72tCaqFRGdaPQueHeXy5tRY9ZOBnqWyoc3mgFpquBpkkwczu8ksselemhZvnt0WtOWdN16HEXKf7j7hArlwyz8y/KzuvO8jNf6/S9/Yk0+AIzK0KZmGNQY1AAAAMZn0Ltm0PVCf3jw/mfEsAAwKkO/awZdDGoAAACjwtQMAGBaMTUDAACAGcDUDABgWjE1AwAAgBnA1AwAYFoxNQMAAIAZwNQMAGBaMTUDAACAGcDUDABgWjE1AwAAgBnA1AwAYFoxNQMAAIAZcPmpmUZeZHX5Q/1crFy0czkjRFVsJmOUa5QzqVfF88pKrx0KLfMHrW7u1cgnrGakS+2mLP/CwyMqKmcSBVE6b26GummXb1U21FMPABjQEKdmGNQAAAAwLoPeNZNPiNXhRrFxmAHoznzTjSob+czpVnPgwmUxlVAU67Y/360PADAZhn7XDIMaAAAARm/IUzNGQ+SyomX9rNWFHfeZ++idA9Ki3RRRAac6m2c08rmsbhaa1tJCFK1o0hNWGvnMMzv6jH+4ak8Zxa4u1ZxdS9WKJy4ORLGdIs0d69XKSmfHF/r9r368+enTJx+/N86rCgDXw1VPzTCoMagBAACMwFCnZhoikRX1tpBRnSEyKbHRdpKKfSUYAyGjGV0erHpDRambYgylF+McrtrTjGy3hROTyjD1YLX7mm9Ps+6cqFY3k86Ow8huAgD6d7VTMwxqAAAAGIlhTs0YZZEq+F5Nl4R9M/UgUayMQ+1sni/v59yqHb7xO97h4T399377y/Xt6WYnu71sE8YCwBhc6dQMgxoAAABG48rumvHrRLGNvNheFBGL3zs7R6yBNxr51MGqe7e2FWdu1HaC+8Y8XPRIMBpGOef73sXIBKOfdev3R198o314JRcLAOAzurtm/BjUAAAAMESXnZqxbu1ueTaUrNu8jbLIFdztaaEVnZX5ne1pTVQrEcvyO0+pcNiJO3nvthC6swjemyE0X9k+Xiq60WX8w1V7zu8ksselemBZvrpMz7J8X5te6/e//Ik1+QAwKkObmmFQY1ADAAAYn0HvmkHXC/3hwfufEcMCwKgM/a4ZdDGoAQAAjApTMwCAacXUDAAAAGYAUzMAgGnF1AwAAABmAFMzAIBpxdQMAAAAZgBTMwCAacXUDAAAAGYAUzMAgGnF1AwAAABmAFMzAIBpxdQMAAAAZsBgUzMNkciK+rlY8W40RD4n9Jb8MV0Szc0LynihP/zVJ5d/OGcjn8jqWv28sjKOw69UOZMoiNL5hWdwpJ2LW6ZRzqQKLe+Wfhti1eQ7bqAT0mmQVZ5beLrUbm4m7VdfFeM00L9nryaFygz3KGrPPrz+7uG37z/RPoy/+5e/+NlTnoaLWTHkqRkGtavEoMagdjEGNQDAdTX8u2YaebG9eHHw6uhzDFYqZ/LzzctHahccbkYYO4MUP0iZjXzmtHL5KHacjXf3crpw6Yb4r85gJ8TfCFnWlhXCDqTvJsV6u/Zzvvr6O/C7h/qgnzdgkozgrhkGtYsxqMXGoHYhBjUAwPV0+akZM1q1siXBBGM+IazNotQWF4YI3iDWygAJTRO6zE6mtVK1Yh9vxgnbektuS2tFZ2Q3yvlcwd6vvnR8sGptNhr5XNZKbZpbq5WV6NqVh4tGObNdaLU8h7spIZubjVLtKTzVp7W0EMWoJkWVqTzHmdPVpVo2xglRb7SDodUDq0azquKrVFZPp9OtVitdKi0VCrrQ6m3ZLFWPZPbM2q8mz5X5gt2lQJl2gk7R904XfEFe/MYLuw3BKFZ1QuI23lOakc88sxumzvupeqTaU92kyFxiKIpV7Kl+h9hbPenRtJvY7OdPQaJYzJghTs0wqDGoMagxqAEAMC6D3jVjxqyr/ii2rwRjIDdijs7bwgo3zFApJ5pmKcqkUNsMehar1c1kUgYbKXn/eWXFOsTeaIUg0dmjhupwc7thGEnraDPGFe7RylSPak+z1INVf+wc1aT4CUZ5Puwy5fEy3E6pToiISJ1ZFVVXD3Kdltm3GbcrYiexvdhu3nvmHKjsu9OCUnFrs9utcJnKvnfPtSeKNfppvCUYxYZPyIqI3/hu/aH0Yii4jOpRvCapyuxjo/Id4mmzv/nyY6Q9+fiit5NEFIsZM/S7ZhjUGNQEgxqDGgAAIzdpUzO+YVpGP/7h2h7ct059Q7wTAfjTMj1Sd4EIoRNAdLKOvoNV8YR6T7OpWefrCJxEU1STLnfvt30q5nfCJ6QiFGfJSQamaiK9VG1WAq8FIkh1j5Q3SIfLVPa9RxdiNt5/dXqU1kfj3RLCLwXjyMgexWqSusz4GyPeIc5uwVdjRrGvv9P/7K/F6jcEsZghEz81w6DmxaDGoKbajUENAICxT80E7lpVRLGXSzD21og6/JUdmdkldaNY6z+iUc5laxttK/JT7tkhCz1Y7dGkcJlRmdBO8sowyjnrW/X6TzA2t0R+53Sr4stt+g40/yyI6JE6ig2Uqey755JeSYLRe0LiN97ZuFELxYiRq+WDPYrRpKEkGJXvEKv1xVf+7Dn3fuMam7SpGQY1BjUGNcGgBgBA/y47NWOITEp4n1XQWYTfWZYffMiFkmcAdp82IBcen8o11e5SZW+qp65clp/VrQcKdNfAB7JCL/T7X/1489PuV/grD3frSWvakq53ntjg3de5GVi1p7xZWNhfKeCpPKJJijLD7ZTpyeNSXbksP3RCVBvdB084S+jlCnyRTdk/1UVWvtZe3E4VhFyvnwv2KOV/HIVzOsJlRvbdm17tLjqP2fjgwzBk4nB+R31CFJdD3Xi3ru3jJe83F4Qq2kyqehS/ScoyReyNyeh3iPV1A7Wlujfi5RsTcZ0NbWqGQY1BjUGNQQ0AgPEZ/hOa+jXgc0aBayWYiuzzcTBEsZgxI3hCU78Y1ID4GNQAALCNf2oGQBzdhK3iERlxmUHvl7/42VP+bMSsmMCpGQBxMKgBAODF1AwAYFoxNQMAAIAZwNQMAGBaMTUDAACAGcDUDABgWjE1AwAAgBnA1AwAYFoxNQMAAIAZwNQMAGBaMTUDAACAGTCqqRmjnEm9Kvb4Cn65Q6ElnC/qd7+3P11qNzeTMQ6PqKicSRRE6by5GdjLLX+ApwJcGattl2/YgIePzbAvsbLMyOsev/ZwDdbb1jWFZx6YZmObmmFQi41Bra89GdQAALieJumuGTMi2JlvujFAI5853bJC2IHIYirKEEcGQPlufZNkwIZdcLj/PA/HVZQZV69LfJnz02ePjHL+2b2K/Uad2HcUMKsm+q4ZBrUhNYxBbaDz02ePGNQAABiLUUzNqLM6RiOfy+otIdJaWoiiNfZ7ggAjn3lmhybxD1ftKUOc1aWas2upWvHExYGYo1OkuWO9WlmJCKBf6Pe/+tG/6aMvvtE+DO9pZZ+Epgk9ULvZqG29JbeltaLb4XI+V7D3qy8dH6xam2M2Kepw0Shntgutludw9xzZ3ASuas+Ik6xoUlSZUe+EtMwHKn4e6iXukUMOXHfFnuoe2Vs9GXCr8XYUe+9ZN+hVXvdu4tdOSspj5+W2dDrdapn/LS0VCrL0tnP2rffZzU+fPvn4vUt97IBrYSxTMwxqDGq+dwKDGoMaAAADG91dM6HQIXOwGozLukmdUHoxzuGqPc3gYVs40ZYMi9z4LrSnWXdOVKubSWfHYWQ33eplJVb5TTMuV+ZR22Zcu2jXblaeygon3InZpIbqcNkpw0haR5sxrnCPVqbOVHsqTnJUk2Kn4zwXNpgYvPJLLPrZqOxRoPXWj/5VC9HX3VeF23f7nvN2RewkthfbTW8sDCCGMd41w6DGoCYY1BjUAAAYkrFNzchx3M5T+fJ+zugevvE73uHhPf2hkr9c357+nFKPPFn8BKNQBm3+NtjB0tapL3pxGha7SYGIq9OvTtbRd7AqPlPvGT7JUU2Kf++3u2f4iCu/xFEVKTdG9MjZzfNqOMEoIoJ1dRS7Y19qa38xxlvogak0OVMzDGr2Dgxqo7vEURUpNzKoAQAw2cY3NdMhM2IHq25uxhrON2qhsTzm4aJH9skwyjnf1+JFJhiHRxHNXC7BeGE16sNfVZuVpNu5bhRr/Uc0yrlsbaNtBU/KPcMnOapJ4TKj22yddhm337NqHN0lFv1sjOqRdcGKr7rZXu+y/M7ljohiM9apNewiz3tGsdYfS9F/HgGwTNDUTAeDGoPaaC6x6GcjgxoAAJPt6qdmgl/3b6ek5I29wl62HEgfyYDseMldrN7H4ao953cS2eNSPbBmW12mZ8F5OKU1UNflTcGnmYT744ovdVZXLsvP6tYDGiKbFFqzrTzcrSetaUu63nnEhXdf5+Zq1Z7qaxTRJEWZynY6l9gseNFzL/poLrGIvTEZ3SPr8Rm1pbqbXQw8zEIefu+Z+rq7JZqN3BCFgq6VNL1gfyFAXWTlov324naq0Dw3P4av9ftf/sSafOAiY5iaYVBjUGNQY1ADAGDYJukJTcA0GMUTK17oDw/e/4wYFrjIRD+hCZgGDGoAAEwCpmaAuLpfSqB4RAaAMWBqBrg0BjUAACYHUzMAgGnF1AwAAABmAFMzAIBpxdQMAAAAZgBTMwCAacXUDAAAAGYAUzMAgGnF1AwAAABmAFMzAIBpxdQMAAAAZsAUTM24TxDoPj+gnEkUROm8uXnpMmUJLfc/6VK7uZkM1jicxxWclTNfF8TddvFtKnuk1R/JIhv7ieyRu8MNrf5gAh6LcJJP1KyTvHFeWei2vOXdZ7l+vtZPS8NlHmYSz0Xp0QAXTnU+AVxf0zg1w6A2AgxqAABguoxkasYoZ3bmm4MFHOVM3lNEI585rQwQDKnKjPtSfxr5x1mxcb51lkm93Gg/sKNlo7y7M28Hr2ZY9sN8s6/o8OocZvJzzW4UazWssZ85XWtuXrqd3jJlBG+VNuTzCeC6Gs/UDIMag5p7OhjUAADAUFz91IybH7R1k3lmILqtt1rmprRWdANG5UZLOIpdXapldbmrVqpWnDLLme2CdbhWr1ZWkvaBiUIrXSot1Qrm3uYL3VICoapRzucKdon1peOD1Ygo9oV+/6sf/Zs++uIb7UN1982ANSceNDcPM4m3RTdB54liza7snm6Z0dhZI7+X1d/Ic6RtVCsLVuNlRq6VvltaelkwX0ov16040mjs57JHVkNvCHHHjhHNcrb1N9apWy7K3exc3LImjqw+LZeqa+5Z2t0uWHt2K7L5I07nVAfjzlBFkRsVZcrSFpZqtRhNiui76ny6V+Xmp0+ffPze8N/DACbVGKZmGNQY1BjUAADAsI3prhn/FhmTbpmBkmqjG2MFo9jEtnACVaORzzkhp2EYyWTSjkdF92Br71Jxa3PFn47ylSkD6MVqddM83iwxlRVDufc76oR0otiTcuZkvrmWksHZenVzLmkHqae3m5v2VTnJJ74XpTtbm51w8ySfOVmtrnk74w2LrR3Otpq3kvax1r3lbvBn7WycJZNzMoWY3xNb3hzdxVGssiKhrl1VZmPfunBW442TfO5k1Y5N1U0K9x0AvCblrhkGNQY1BjUAADCAMU3N+ENU53Wh2qhOBvrv/XZL62QIhX+tfSAg7vCW2bM6n/4SjBEnZDdVeGP9eKNk3cAsb2nWPXuk77adQDAQFNr92bVTkZ0cnZultF/v3KftObYbjMpIsaD7anddHMUqKxLq2lVlqkuLapKi7wDgMSlTMwxqDGqCQQ0AAFzeqKZmcqJqxi6Nci5b22hH5BIvl2A0jHIu9ap4XkmZtbyqNivJboV9RLHjSjB2t3QSjH69IjmjsZ86WDivLEQmGENRrKzo1XqzYmXzMnuiOrYEo2Ec5lLy/u1UZJPiR7HWnxb9/jEBYOqNbWqGQc1/QhjUGNQAAMAgRvOEJu+Cd3e5vBk1Zu1koGepfHijGZCmvM9UkInD+Z1E9rhUDy3Ld49Oa9qSrluPo0j5D3efUKF8mIV/WX5WH+x5GdE8D7PwPI6huyxfPuGitF7ZnPPkIT07m2HlgRC6XJbvW9nuyTrWO8vyW/azJM7kEnenBDM0dFbFa0tHui4fUZHyV+SmN92nUUjdJ1mEKlJvNBRlzu0kaseljdCy/IubdMFzK17r97/8iTX5wPUzpic0Mah5MagxqAEAgEFNwcOzgQu80B8evP8ZMSxw/Uzjw7OBCzCoAQBw/TA1AwCYVkzNAAAAYAYwNQMAmFZMzQAAAGAGMDUDAJhWTM0AAABgBjA1AwCYVkzNAAAAYAYwNQMAmFZMzQAAAGAGMDUDAJhWTM0AAABgBkzr1Ew5kyi03P+kS+3mZtLzaiOfyOpa/byyMo62jbf2S7BOpn0SrbYLeUrPm5t0k25ezChnUq+KqgOn7tRhGs3M1AyD2hDx255uMqgBAKbOtE7N2MqZ/HxTPUb2eGm8DRs/M+zYCbTOF2/EbzzdHL/J7uZEnzrMhJmZmrExqF3GZP8apJuz1M2JPnUAgCl35VMz+URCT6fTrVYrXSotFQq60OrtykrSaORzWV3mCNNavWpusBIVBaFpQpeb01qpWnFSJNaAbL3c8qdKAmOkUc7nCvbB9aXjg9WI4fOFfv+rH/2bPvriG+3D8J7KJskXGvnMtt6S29Ja0alGWXu4m0oyKSTkYdlgReXMdqHV8h3uZJBKSzVZnfmCrCnm+RRuzsnmpmbNrQeLpeNX1tnsnlW6STejuylEp35fFjHyY2h98G5++vTJx+9d4jcJoDT6qRkGNX4N0s2Z7KZgUAMAjNXV3zVj3xraroidxPZiu3nvmcyHbJ1mcqJa3Uwm7THzdMsdfreFPYyXzR2aVsDqCVXNcfi0EhXFykF60S7TLDKVFUO56VTRJH9KR7bJbH1bVbt1SLibEfWYx7StgMUo59y7aQ3DSFpHm5GB6B5ttapU3Np0IoyIipTnMyIldbB6bl6VnXvNyjP7rNJNunlBN0f3MQSijOGuGQY1fg3Szdns5ug+hgAAhI1kasYaPp2BU1j/XT3wJkY6qRFnHzlmdgPWmFFsYDTvcdNp/ASjEKomeTZ16pUhQ7h2f/5H8f0B/nq6XXOr6ORqAgf7myBEREXK8xkd9zgXaaPmvWB0k25eEMZe7mMIDMV4pmYY1PzdjKrnGvwapJuz1E3/gULRHAY1AMDVGdPUjDfB6BERxWZEVcYAjXIuW9s4H3WCMdSky+VqLqwnnJJKmYe/qjYrSTfnFBn3RFQUGfdYZQn7hDpfrWfFPfZZPF4qXjolRTevUTcdMT+G1l+P0X8vApcyKVMzDGrheq7Fr0G6OUvddDCoAQDGYiTfNSPkut26yMoF9u3F7VRBlNrV+R1n6a+7yFhY6+7tJb6n9rMqnPX4dlrG3GtDFAr2In3lwyz864Gzurj4O/x7MyKaJIdqp/HOOmoRUXt3hbNvfXZ4ibJZ4sFqaCG3W09a05Z03ep6ymmTw10QHa4o6nz6WypXXfsWV3ufTUA36WaPbhr+xrufw4iP4Wv9/pc/sSYfwzae75oRDGrdbl7rX4N0c5a6yaAGABir6X5C0wwJ3tY+o+jmdfVCf3jw/mfEsBi2GXtC0wy5Jr8G6eZ1xaAGABg2pmYmQidfqs3098vRTQDDxdTMZLomvwbpJgAAGBamZgAA04qpGQAAAMwApmYAANOKqRkAAADMAKZmAADTiqkZAAAAzACmZgAA04qpGQAAAMwApmYAANOKqRkAAADMgJFMzRiNfC6rt4RIa5o4Xqw2N5NDKbacSb0qTsHjAhr5jNV9+XSDdmVlKJ2PxzjZz9WOZNU37pbefSlu33n1dU1f3jhfW7hkiSf7idqR+58b2saDyiVKOtnP2K0Sy/XP11bmOi+80B/+6hOeRQkgrvFMzTCoMagFCmFQAwAAgxnF1Ew5kxF25GoY5VxODCuKnRJmsL0jqpWr7rNxuLsz548pT/bzZ7crt+yre1Le/V6sP9icO8zszzUvHcX6Kjor7/4w/2Ctzz8j5FFifW1zLvjC6+8efvv+E+3Dqz1RAGbIWKZmGNQY1LwY1AAAwOBGNTVTrG76E2udpKNIa/Wqk3UrZxKFVrpUWqoVzJfMF5qrB4msbu5TOm9uNvKhn4VW9yYYvYVqQqw2zdeUFXlznmkhik11llK2x6xi6djZteQEo+F2RlVk7dkpz21tvNqtdroZwvTyDSHuWNHnWWN/L3v0Rla0vFFdWzArauw/znbSfuJG6XMzWjU37p7efhAKFs0o9u3SPx7pZgE3luvrTn6vcbi7/fxNy1Om3PPx85aVmSyY1Zk7WwGrN1x2q1DuqWinU2anLb5UJ0EsgH6NbWqGQU0IBjXBoAYAAIZktAuaOvGdUc7kRLW6mUzar55uuUlHMzzdFqXiVjfobeQz7svyx0pzs1NwOZOf74aARj6zs+qEj+594Sl1RWZBB6vVGLdhy2hZ2Ddsy+xo917zYDujeyQTjPO+QDV27eIkv3uyuu69O1oGkTmxXr01l7Rj3LPbTSuFGEownpV396yMYqBMM458uWTds20V9aB5yyr27Cw5NyeP2t8T3dj3JP/4e3H3ztathaSnAW5FJ+XdEzfBGNwzqp3RaUlu/AbQrzEvaGJQc3vEoMagBgAABjHarwE2jHxuR6b93PygK11qO0GfJ2btHOWEgeFw0BfFhl8WdhSqqqi7Ur6bNlTxx82BgNrbzugeKdoVt3Yrg2fn6MSN5ZJ1v7Q/lyjX27cf3Eqq7v2OTjC6936f7GfO1qwoVgavBbsiNz9pMcPosy2r/O7lONxNPb94z6h2EsUCGJ4xfw0wg1qnHAY1BjUAADCAq5+asVN97c690HknIO2k4/wUUaxz1NZpZudes5IMblcmGD21R1Tk7tDIpw5WI792sUeC0d/O6IqU0XW82r17nuynThbO1xa8iTvfDtZ2MyRtHO5lX34gQ8az/cwPC85N12cn+b3vFwPL8t0oVh77dr25NhdKS6qj2OD6f9WeUe2MjmK59xtAv8YwNcOgxqDmx6AGAAAGN5KpmZ1XS8e6e++3E8917wfvZNlkvKtYwy7Ju6WFWNzq5uy8e3ayeUY5nyv4C1VV5BTnNsmb4nuh3//qx5ufPnXzXNZt2oFl+RHtVFXkX5ZvfaGA6KN2M8o8EeLIfhqFk2D0LsuXj5O4u+58J+LZYX7veWCxvedhFvbhJ/nHNZkHXf78fO3EXiGvbTyqLJgxaM0+Vnv3SD9arj9aS3UTiVY35W6+h1k4W3wpR+92ZTt9y/LTdx/Zd57bCGMB9Gk8UzMMam4zGdQY1AAAwFCMdkHT9Al+EQCuFLd/A+jLmBc0TR8GtZFiUAMAADExNdNLJz3of2YGAGAiMDXTFwY1AACAycTUDABgWjE1AwAAgBnA1AwAYFoxNQMAAIAZwNQMAGBaMTUDAACAGcDUDABgWjE1AwAAgBnA1AwAYFoxNQMAAIAZMFlTM2flzNcFcbddfJvKHmn1R5WVw0ziuSg9ugZP+jzJJ2q6+a+2cV5ZsLaMrO8DV9TYTzjXa3iNuooyLUZ5N/XqjnuS4+/Z6yyFygxfzb5rDwl/OoZ8ZoApNOFTMwxqDGpXWaaFQQ0AgJkwWVMzopF/nBUb51tnmdTLjfaDzaSMZjKna1MRxZoBys78g8Fii8NMfq7ZCXFG1veBKxpG30dR5kD6Pkv+qzlwNxWfDuC6m/CpGQY1BrWrLXMgDGoAAEyQCZuaMUf0nHjQ3DzMJN4Wz9fkyC5Dh4WlWk1vCZFeLlXXrMFbZnta6bulpZcF/Y25vd6UOzfyu9v6G7ljerkot1i7ieW6LMrKz7RE2soRGY39XPZI7qndEOKOFWqcNfJ7WbM0uXGjWlmwggR1RWEywtA7/7tRcoOMUJMiNwq7umAUG+67aJR3twvW4Re1U9VNZesjKordeDsUWz2wTkLaSYKl0zdarTfp0t2lwnPdvArttZVkP40PlNm8lYzbIye/Z11rxc+BvJ+qTNWe6rMUmUsMRbGKPdVvGyu5au9m7+C8acOfDuC6m/SpGQY1BjUGNQY1AABimLCpGQVzRN8W9aoMgIRxks+drDqRkxkTfC9Kd7Y27UgokKg5yWfOtpq3hGpjUv5wsmqX6bJChPXq5pwTKp3ebm7OCVVFUcKZon6aZAtGscq+G8ZZMjknbwbO74mtTqIp3E5FN+Of5FQ/jbd6ur56sHewul5ZmRPuTc7tithJfL/YfnDvmXNg7MYryuyjR94TG0wMhoLLyDJjXQ5VmX1sVCYYzT8VTp2TE3iHAPCa9KkZBQY1BjUGNQY1AACCpmFqxhuC9BjdPS8Jaw3zD/NmkGEdXny1u338brH6zvazBTs2NXe2c4mdTJE/1dPNaMUPI8LhiLJJQtlO54he9367pcn4r2A33pPJVLYz3M34J3l+p4/Gy5i1JtJL683KnP9sBMLfPhofLrOPHnUbEDjDIhxHRpcZ53Koy4y/MeLeb2e3ibsBHpgsUzk1w6DmL41BjUENAABMw9RMJ6tjGIe5VOeu12DcY0TlEvMnQryztfo2t/2PS8VgQGA09lMHC+dWuNBJMPr1EcWaJZhRTqO8l6190I5Ix10uwdjpe8qs5ZUd2Jnx2Z6o9goEw92Mf5L7TzA+2BL7O6e3K5tzIiKK3Trto/HhMvvoUedkbp1ldha8cXCP1fKhMi++HENJMAbeNvZJsKLkO69yZBeBHqZyaoZBjUGNQQ0AAPhN+tSMXMl8XNoIrIWWqafCm85OnS/292aK3PXzMqNVW5RRQjfR1NjPHAihy5XYnpxSd1m+EDe00roZOUVVJJwF1d4UmRmPHOZzz+121t17iVVNUmwMVGSlN+d2VH23Aj5ni7Z0pOvySwdSynaquxluvPokx29858ETzhJ6uQJfZFNHVks2RLamaxvtxe9TBVFqm2FZ3MYHyzy30sWxetTZuGvuvuimAVUn+VZSVWb8y6EsU8TemIx421gOM4mXS/ULs4sv9Ptf/fjR02+094b5yQOmw9RNzTCoMagxqPX+jDCoAQCup0mfmgGurVjPwrCCWPHFN9qH424uMA5TNzUDXFsMagAA9MDUDDBx3Mde+HPaSmYQe/D+N08+HneTgfFgagaYfAxqAABciKkZAMC0YmoGAAAAM4CpGQDAtGJqBgAAADOAqRkAwLRiagYAAAAzgKkZAMC0YmoGAAAAM4CpGQDAtGJqBgAAADNg8qZmjHIm9ap4Hv0N/nKHQkvI7/k392rkE1n5tf/pUru5mYxxeERF5UyiIErnzc3AXm75VmXjPjcAAK8pmJphUAMAAMBFJm9qJg4zAN2Zb7pRZSOfOd2yQtiByGIqoSjWVs7ku/UBACbDFEzNxMGgBgAAcL1N1tSMOptnNPK5rN4SIq2lhSha0aQnrDTymWd29Bn/cNWeMopdXao5u5aqFU9cHIhiO0WaO9arlZVBA2gAwGVM+NQMgxoAAADimKypGVsgZDSjy4PVYKjYTTGG0otxDlftaUa228KJSWWYerDafc23p1l3TlSrm0lnx2FkNwEA/ZvwqRkbgxoAAAB6m4KpGRmH2tk8X97PuVU7fON3vMPDe/rv/faX69vTzU663G8EAACM1jROzTCoAQAAIGAapmY6jEY+dbDq3q1txZkbtZ3gvjEPFz0SjIZRzvm+dzEywQgAGJ+pnJrpYFADAACAZZKmZjpPqXDYiTt577YQurMI3pshNF/ZPl4qutFl/MNVe87vJLLHpXpgWb66TM+y/HDWEgAwKhM9NcOgBgAAgHgmaWoGAIB+TPTUDAAAABAPUzMAgGnF1AwAAABmAFMzAIBpxdQMAAAAZgBTMwCAacXUDAAAAGYAUzMAgGnF1AwAAABmAFMzAIBpxdQMAAAAZgBTMwCAacXUDAAAAGbASKZmXn/38Nv3n2gfjruzAICZMp6pGQY1AAAADNWI7pp5oT/81SdPPn5v3N0FAMyQcd01w6AGAACAIRrVgiZljvGFfv+rH29++pTwFgBwCWNb0MSgBgAAgOEZ2XfNyBSj9uTjcfcXADA7xvddMwxqAAAAGBqmZgAA04qpGQAAAMyAcS5osm79/uiLb/gqRQDAZUzUgiYGNQAAAFzOGL8G+LV+/8ufWJMPALisSfoaYAY1AAAAXNL4Hp5tBrYH739GDAsAuKwJeng2gxoAAAAua2TfNQMAwJCN77tmAAAAgKFhagYAMK2YmgEAAMAMYGoGADCtmJoBAADADGBqBgAwrZiaAQAAwAxgagYAMK2YmgEAAMAMYGoGADCtmJoBAADADBhkauaFfv+rnz59erlHhTbyIqvLH+rnYmWoXXr93cMvf/GzSzYLADA9hjo1w6AGAACA8RjwrpkX+sNfaU8+vnT1+YRYHXYU+91D/f0n2odDPlEAgIkz7LtmGNQAAAAwBqOYmjEaIpcVLetnrS4qnqA1EMV69xRp0W6KZM/DlYhiAeCaGMvUDIMaAAAAhmsIUzOf9L7LuiESWVFvixUZkIpMSmy0xWbSeTEQxZYz4tWG2Lonkm2R2RZVM4rtebgSUSwAXBNXMTXDoAYAAIARG/RrgOXS/B8/+uKbyKjRKItUwbclXRLNTefn4L3fDRm8tlrd3XofHvL6O/3P/lqsfkMQCwDXwNC/BphBDQAAAKM32rtmQnxRrCEyOVGs+nOJ7V6HK5FgBIBrYsx3zYQwqAEAAOASRvJdM2WRK3QX22tFUUnJILXl2adkBqzCt1EricpmxOE9V+YTxQLANTGe75phUAMAAMBQjfkJTVeBKBYArolJe0LTVWBQAwAAmHmDTM3IJfk/ffq0963fo/f6u4df/uJnE9csAMCwDXVqhkENAAAA4zHo1wADADAuQ/8aYAAAAGD0mJoBAEwrpmYAAAAwA5iaAQBMK6ZmAAAAMAOYmgEATCumZgAAADADmJoBAEwrpmYAAAAwA6Z1aqacSRRa7n/SpXZzM+l5tZFPZHWtfl5ZGUfbxlv7JVgn0z6JVtuFPKXnzc2r6qZRzqReFVUHTt2pAzBeMzM1w6A2RAxqAABg6kzr1IytnMnPN9URT4+Xxtuw8TODyJ1A63zRY/zGX0U3J/rUAZgwMzM1Y2NQuwwGNQAAMP2ufGomn0jo6XS61WqlS6WlQkEXWr1dWUkajXwuq8scYVqrV80NVtqpIDRN6HJzWitVK07CywqvrJdb/sRXIOIxyvlcwT64vnR8sBoRDL3Q73/1o3/TR198o30Y3lPZJPlCI5/Z1ltyW1orOtUoaw93U0mm+IQ8LBusqJzZLrRavsOdfGBpqSarM1+QNcU8n8LNINrc1Ky59WCxdPzKOpvdszrsbgrRqd+XRYy8cNaluvnp0ycfvzf0dyaAGTD6qRkGNQY1LwY1AAAwFFd/14x9o2+7InYS24vt5r1nMru1dZrJiWp1M5m0I6DTLTeY2hZ2UFY2d2haAasnVDWjqtNKVBQrQ65Fu0yzyFRWDOUWYkWT/Ak62Saz9W1V7dYh4W5G1GMe07bCT6Occ++NNgwjaR1txnmie7TVqlJxa9OJFyMqUp7PiATjweq5eVV27jUrz+yzeiXdHN2FA3AdjOGuGQY1BrUQBjUAADCgkUzNWMGQEwYJ67+rB940VyfR5ewjI6BuwBozig3EZj1uIY6fYBRC1STPpk69MgAM1+7P5im+P8BfT7drbhWdzFvgYH8ThIioSHk+o6NY5yJt1LwXbLjdHOjCAUDAeKZmGNT83Yyqh0FNMKgBAIB4xjQ1400wekREsRlRlRFdo5zL1jbOR51gDDXpcpm3C+sJJxhT5uGvqs1K0s0gRkaxERVFRrFWWcI+oc4XJVpRrH0Wj5eKl04wxhPzwll/b0T/hQHg2puUqRkGtXA9DGoMagAAILaRfNeMkKuw6yIrF9i3F7dTBVFqV+d3nIXc7pJxYa27txdsn9rPqnDW49tJNnOvDVEo2Iv0lQ+z8K/uzuri4icy9GZENEkGXk7jnVXxIqL27np132r78IJzs8SD1dCyfLeetKYt6brV9ZTTJoe7vD1cUdT59LdUrqH3LZX3Pmli6N00/I13r1zEhXut3//yJ9bkA4g2nu+aEQxq3W4yqDGoAQCAwU33E5pmSPC2dpgR8MOD9z8jhgUQbcae0DRDGNRCGNQAAEA0pmYmQidfqvFtgQAQG1Mzk4lBDQAAoC9MzQAAphVTMwAAAJgBTM0AAKYVUzMAAACYAUzNAACmFVMzAAAAmAFMzQAAphVTMwAAAJgBTM0AAKYVUzMAAACYAVMwNdPIJ7K68D7nQT76QZTOB3gqZ+fhEVK61G5uJoM1ju2xEuOo/WQ/UTuSP9y4235wKzlocV3G4W7q7Z3ztQXrf4eZx8/F3UfNW1fUjRf6w1994jyY9Kyc+bog7raLb1PZI63+aBin8ySfqFlvxY3zitujxHNRejTAW1GW4Hkrft7cnAvW6FSn7tHr7x5++/4T7cMrOqXAhJvGqRkGtavHoBbvNDGoAQAwMUYyNWOUMzvzzcHCiHIm7ymikc+cVgYIHVRlxn1pBK62djOy3Jl74IRhXWfl3R9evSsWb6914ijlnhGHx3OynzlbixnF9ltRIJ5r5B9nxcb51lkm9XKj/cD+O8Uo7+7MPxjs1B5m8nPNTrMa+5nTtYHfiv4yI15S9sgfuwPXzXimZhjUhtewIWBQY1ADAGD6Xf3UjJsftHWTeWYguq23WuamtFZ0QzblRks4il1dqmV1uatWqlacMsuZ7YJ1uFavVlaS9oGJQitdKi3VCube5gvdUgLBolHO5wp2ifWl44PViDjyhX7/qx/9mz764htVhseM3lMFoWlCD7ZT0U1l7UYjn7M66e2R0ll5f69w9EaIG9ryu/rRkbbxqLJw1tjfy8qNIr28UV1bSMqg63H2qHPUjdLnD9yY9TCzv9C8/UPm5Hbzltyk3DPicJk5bN24W3r3pWzDjeX6g7UVcZJ/bKXjljfcBKMdxS4svazpsqXLpXUzYrZ2s/aR2cjnb9JWBjKiIkWPXMFMmxmw5sSD5uZhJvG2eG62x4oCdU+ZbiDYyO9u62+sy7FcbK65b0XFRudEBaPYhaVazbp0y6XqmvtW3N0uWIdrG9WK3U4rl5i+W1p6WTD7n16ud4sNRLFn5fxewTpHWv3d44MF+6Vwj9Q9775Nb376lPAWs20MUzMMagxqDGoMagAADNuY7prxb5Ex6VZzU6g2umFKMIpNbAsnrJORnhv0GUYymbQjQtE92Nq7VNzaDESBvjJlZLlYrW6ax5slprJiKHdf2w2VlZhdzomm2Utl39uq2q1D7I1WL73nI3CGD834Zr16ay4pTsq7tdoHMhD0bBTGyX7uzAlPo9KGzxbMSFGmGecfOBFSPwlGMxj9Xty9s3Vrwd9EMziea3qi2MT3or6+tmI25Owkv3eyKuvy7OPJQIYriuqRJVaeLZxg9G85yWfOtszqVRvdfgWjWOutuGa9FU/yuZNVKzY1jLNkcs6OR8VWJxl4kjf7X7qztRk6S54yZQC9uF7dNLt51sh/LZOKvdOssuvak48HfbMCU2hS7pphUGNQY1DznSUGNQAA+jOmqRl/iOq8LlQb1clA/73fbmmdHJ3wr7UPBMQd3jJ7VucTP8Hor9pts6rvW6eq2v25WcX3B3Sr2d89ve2mCt1A0J+j6y65V4WhbjLQYiUnrcb1FcXunm0plvQHo1jvvd9us+NGsVE9cq7LpaJYM2Q87UaZZ+XMD/PNNaHaqE4G+u/9dkvrZAiFN5MZCog9Z6lbZs/qlIhicX1NytQMgxqDmmBQ854lBjUAAPozqqmZnKjKAK6cy9Y22hG5xMslGA2jnEu9Kp5XUmYtr6rNSrJbYR9R7JUlGENR7OUSjBec4YsSjOGdZZh7uJd9+YEMBM/2O7d8y0hrX1SsmFKxZ8TG+FFsJ8FonB3mvn5bfGQlGHdFVTbjpLznNF5Zu4jokSXWVwdat0+vW2/FvWztg3ZELvFyCUbDOMyl5F3ZKbOWV+vNipVgzOyZfesniu07wajqufW3VvRfV8CsGNvUDIMag5q1F4MagxoAAEMxmic0eZecu4vLzfDNXnDuXSof3mgtbW91i5JJtvmdRPa4VA8ty3ePTmvakq5bD4RI+Q93nxGhfJiFf2F8Vh/seRmi23ZZ66ldo90AVd+VtXeX5fuW9SsWXfuW5R+/Y+fouovY5fa76xU7Tj07zO89txfGy4DyrfMkC2s9vLXAXri5u8Ce9vsktNFeTt89yVZ+MrDRKnBu53Ht+O6Gf1m+p/Hmlg9E4fmRk+FU1B7RI0u8MPYwn3tuL6F3bti2osasnQz0LJUPbzQj4FTB06P03XZzbidROy5thJblm9Gqs0VbOtL15boV2noPd59GoXyYhX9Zfvao5/MyVJnV1/r9L39iTT6ugTE9oYlBjUGNQY1BDQCAYZqCh2ejL2ac9/X2O1f3LM9Jdh0f6xDxdYkPD97/7JqdCVxP0/jwbPSFQe16/SpnUAMAXFdMzcyMEydP6F+sDgAzjKmZ2cWgBgAArhGmZgAA04qpGQAAAMwApmYAANOKqRkAAADMAKZmAADTiqkZAAAAzACmZgAA04qpGQAAAMwApmYAANOKqRkAAADMgFFNzRjlTOpV8byy0muHQsv8QaubezXyiaxu/iddajc3kzEOj6ionEkUROm8uRnYyy3fquyqz3GfrLaNuGFX9iAM43A39fbO+dqC9b/DzOPn4u7VPQPV+5zRs3Lm64K42y6+TWWPtPqjiNN5kk/UdG3jvLJwyTob+4le5V9YqbqdyqeHXoGYZ2mKKsJ1M7apGQa12BjULo1BrV8MagCA6TVJd82YAejOfNMd3hr5zOmWFcIORBZTCUWxtnIm361vklxtw8zIcmfuQShsOyvv/vDqXbF4e21zrteeEYfHc7KfOVuLGcX2W1Eg8mvkH2fFxvnWWSb1cqP9IPqddJjJzzUvHcXK9+3uzvyDPi9Xt9KIdnoj8iukrP1SPbpMRcDAJvquGQa10TSMQc2PQY1BDQAwjUYxNaPO5hmNfC6rt4RIa2khilbQ5onejHzmmR19xj9ctaeMYleXas6upWrFM3wGgsVOkeaO9WplJWKcfaHf/+pH/6aPvvhGlQuykqZC04QeqN1s1LbektvSWtHtcDmfK9j71ZeOD1atzTGbJGQMur9XOHojxA1t+V396EjbeFRZOGvs72XlRpFe3qiuLSRlPuxx9qhz1I3S5w/cmPUws7/QvP1D5uR285bcpNwz4nCZOWzduFt696Vsw43l+oO1FXGSf1yTl2N5w00w2lHswtLLmi5bulxaNyNmazdrH5mNfP4mbWUgIypS9MgVzMmZoVhOPGhuHmYSb4vnayvONd7PZY+sE7qsCbHaNLebAeXbpeMj69wv16tr1lk+a+T3srpVkbZRrTgVqQ53Yr7Vg8fyzZe+227eSqoPPyvn9wpWz7X6u8cHC3YUq2yniJVjVL4VvxBfxXx/qs+SDDd1z5l3Ik5zh+et9N3S0kvZBfNENRcO3DSpWUiq8CZdemR9YCNOXUQ3rT7c/PTp1QfsmE1jmZphUGNQY1ATDGoMagCAoRrdXTOBkNEM5A5Wg3FZN8UYSi/GOVy1pxnZbgsnAJQxoRMehvc0686JanUz6ew4jOymW72sxCq/aQ7zyjxq24xrF+3azcpTWSED8fhNMuO/nFiv3ppLipPybq32gQwEPRuFcbKfO3PC06i04bMFM1KUacb5B27M10eC0QxGvxd372zdWvA30QyO55qeKDbxvaivr62YDTk7ye+drD6w4sjOPp4MZLiiqB5ZYmTkjP3MzoITVxmHmZQdTplx1cul+gPrGtmRlv3DenXTqsiMXE9vN80gWn24HcWurx7sHayuV1asM6w6vJHf3V60N5px3tcy29Y7qyk7pD35eOD3YP8iEownefPile5sbXYusSc329jPnK5FnjrgqozxrhkGNQY1BjUGNQAAhmVsUzMyfLNTZ768n3OrdvjG73iHh/f03/vtL9e3p5uddLnfCBASP8Hor9Btib8Ndky7deqNbN2GxW6SGULsnt52U4VuIOjP0XWX3KvCUDcZaLGSk1bj+opid8+2FEv6g1Gs995vt9lxo9ioHjnX5aIoNiI4U4Ri/iSbkzYUEXdEy/RaTaSX1puVOfeqhw9feJb5Yb7ZSazFuOH84ih2CAnGfk7UST5zttX0XuK4p44bvXFlJmdqhkHN3oFBjUEtAoMaAAC9jG9qpkMm1A5W3bu1rRhvo7YT3Dfm4aJHgtEwyjnf9y5GJhiHRxHFXi7B2NuFCcbwzjLMPdzLvvxABoJn+51bvmWwsi8qVkyp2DNiY/wotpNgNM4Oc1+/LT6yUny7oiqbcVLecxqvrF1E9MgS415pb4bQ28KeWbKLDndivi2xv3N6u7IZTDB63gr9JRhH9aWJqvNktV+GpOW9bO0DNwxVRbEZUTW3GCflXK228Sjy1EWyAvF+o2yga4KmZjoY1BjUGNQu1Z+rwqAGAJgGVz8103lKhcPOksl7t4W9XD2QIZRL1o+X3MXqfRyu2nN+J5E9LtUDy/LVZXrWwIezlgN1XX5NwGkm4f644suO1pXL8rO69QyOyCaFFjP7luUfv2Pn6LqL2OX2u+sVO049O8zvPbcXxsuA8q3zJAtrPby1wF64ubvAnvb7JLTRXk7f6badnwxstAqc23lcO7674V+W72m8ueUDUXh+5GQ4FbVH9MgSJ+wzyvu5wpF7Qu9WK3M7CSuzqn1+XjmRK8/lNXpUWemuLZcVldbd8DRw+K2k+zALZ1m+WK7LG8KVh/uX5WePhLOOXWlE35gYcZoO87nn3u8psBfedy+x8zQKt0fp5dKGKBSOepw6tdf6/S9/Yk0+BjCGqRkGNQY1IRjUGNRUGNQAAJc3SU9owjCYcd7X2+9c3bM8J9lYI7+hGmN2cZTMC3bw/mczccUwLhP9hCYMA4PaLPyKZFADAOAiTM3MjBMnT+hfrA4AM4ypmdnFoAYAAK4RpmYAANOKqRkAAADMAKZmAADTiqkZAAAAzACmZgAA04qpGQAAAMwApmYAANOKqRkAAADMAKZmAADTiqkZAAAAzIBBpmZe6Pe/+unTpzwlEAAwFkOdmmFQAwAAwHgMeNfMC/3hr7QnH4+7FwCA62jYd80wqAEAAGAMmJoBAEwrpmYAAAAwA4YwNfMJN38DAMbhKqZmGNQAAAAwYoN+DbBcmv/jR198o3047p4AAK6boX8NMIMaAAAARo+7ZgAA04q7ZgAAADAD+K4ZAMC04rtmAAAAMAOYmgEATCumZgAAADADBpmakUvyf/r0Kbd+AwDGYqhTMwxqAAAAGI9BvwYYAIBxGfrXAAMAAACjx9QMAGBaMTUDAACAGcDUDABgWjE1AwAAgBnA1AwAYFoxNQMAAIAZwNQMAGBaMTUDAACAGTDA1IzRyOeyesv8KV0qLdXEVnMzOdK2G+VM6lXxvLLS53HlTKIgSufNzcD2Rj6R1c1/tXrPMuXhLXu31QP7iLQszd1uSZfaV3M6zsq7XxfeeLcs1x+t9XMKTvKPa7LRyxvnawvWlsPM4+fi7qPmrcs0yDjcTT2XDdI2HlUW3MJv3G0/uJW0X317x63oonK6e/ZqUqjMcI+i9rwE+SjdT4bzwJbwGyzqrRhf73edVeMF72e1Cz9ccgf3c1BZcbvmtiD+Z9O/54CfTen1dw+/ff+J9uGlTymmyzCnZhjUGNQEg1ofGNQurIhBDQAQ36WnZhr5/OlWxRkyG+XMtqj2F7aZo9fOfLP/4XUYGvnMaSUidChn8hc1y3d4YP8Yh/fDjMN25h5UumGYGcX+MP9gbeVkP3O21rzl/rfvgg8z+3PNTnjnlDaURp7kd8+2rBB2IH03yd+juOfzAoGQaBhvWv87pNdb8bJlxn1pUP6zIXsyhL9kB/xsSkP8wwOTb3hTMwxqDGrqRjKo9cag1hODGgAgrstOzaiGrG42w04+pN1EQScVmdbSQhSb3XyErZsXMYvd1ltyz7TW2S+dTrdaLZnFLBR0odXblZWkMuHgL1Vrn1dkoTLELlhlavWqeajT+tWlmtOmUrXi6UhgpPSkUX2HDxTFGif7udqRrHz5hhB3rNjrrLG/lz2Smbr08kZ1bcGsqLH/OHvUOehG6fMHm3Pu/0JBXmN/d/vojSzzxnLRjWuVGy3hKHZh6WVNN+u/sVxaX7Mrahzubj+3DnebZKf+Wjfult59WTBbe2O5Lov1lHa2nzmxG6bO+6n6rtpT3aTIXGIoilXsqT6fJ/uJ2pG9m71DupvY9AWxcd+0InKj4h0S8VZUvGntXKKVzC+Ye5svdEsJvmnL+VzBLrG+dHyw2mcUq87mhT/FvnqNfOaZ/aGIf7hqzwE/m+HL5nqh3//qx5ufPiW8nTFDm5phUGNQY1BjUGNQAwCMzyWnZswwNafKKHqGmW6oZ/50sOodZNwiArkaZb5CWLeGtitiJ7G92G7ee+bdJzCquaG1OYjviE720zCMZDJpD+3ODerm6LktnHFPDoXecd5Xpt3P6mbS2dGO3AeNYk/yuyer62src91NxuFuTqxXb80l7Tjv7Hbz1pzokRDzR7HKFJ/olfcLRrGJ70XdbtLZSX7vZNUKeY2zs+Sc3FTe3xO3OzG0GSB+L+7e2bq14JbWzXOacfPpbU+0HQ4uQ30X/TRJVWYfG5Xn09PmwFkKpqriv2mjM2/BKFb5VlS8aTt7l4pbm4EPk69MGUAv2m9as8RUVlzm3m/Vhyv8Ke72PvRnbZzD+zgh4T3Vn83uddOefNx/pzF9hjU1w6DGoMag1utNy6DGoAYAuGLDvGtGRESx8kc7D+DNGIQDAn+ZzuspZzdlfKAIGe2BzzNcdpItopsU8t9f6q83EBB4c0puAQMnGM2wyc4ldlJn/tyXb1l7nCjWHzs6MaVQbVQHgurSZPBasNvpS2+q7u52Sgi/FIwjw30XfTRJXWb8jRHn09kt9OrFUazyTStUG9XJQPVbUfWmDdfW5S2zZ3V9CB6o/BS77Q83LN7hcU+IYk/1Z7N73Yhir4krvWtGMKgxqDGoMaj1cXjcE6LYk0ENAK69S3/XjJHP7LjBoowctxdlvrGcyVh5R6NRzmVrG8FvPpP5joNVO93h5iiFvWs7Ii0j+ohirQh20R4hnZdkLa+qzUrSlxT1JDEMo5zzfbdbZBLDw+2mItPaX9BgnOynThbOrfipk2D07WBtN4O5xuFe9uUH7U6AeGUJRuPsMPf12+KjtZRZ9dv15pqVYNzdE+s9o1h74wcvQzFi5Gr5Tt9F7CYNJcGoPJ9WlHzn1V6gX8GbiPt80/o2Xphg7LwVU8o3raIozxvyyhOMngvn+RQ7Tdqohb6tIObhsU5IP59N1WWTrFu/P/riG75KcdYM77tmGNQY1HwtZVATDGr9Hx7rhDCoAQBUhvOEpk7GwE2MmFs2RKFgLdIX+cyBEHpgT//aYTch6M1CyFXHRj6Rstft1kVWrvlvL26nCkLTnPIcbt7Pl3Fw1vq6RaY1bUnXdecRFMelemDpb+fL+X1lenrp62d3jbF/1XTgaEtwPbAZgJ4IcSSXpnuSbN1l+eZW7e56xbr3W5wd5vee20vTnRuhOwvOpe6TLLyJu/qDyI2dZ084ZCZzbudx7fjuhmIN/K6zRXv3SD+SdaX8h1sPsHB+ll8B8I/vdhb/qyq6lVT1PX6TlGWK2BuT6vNpO8w8frm0Ecw9hsPYi9+0Qr1R9Qab31G9FVVvWhnaeg93V7Ir33X+Zfnmh8L5ggw7knv6jdZrYbr6g9CI+BTbQfPxUtGT34x5ePwT0tdnU/2Nia/1+1/+xJr8WXRFT2hiUBMMagxqDGp9Hc6gBgAYzABTM8AMiUqEztCTEWQQK2Y+xRbxdYkPD97/bDYuI/yGOTUDzBAGtRnBoAYA1wZTM7juuglbb7509phB7MH737BYHbOFqRkggEENAIBpxNQMAGBaMTUDAACAGRCYmvl53OP+LysO/nf/a9ztBwBMj2GPHW/ePOg5NfPz/hoG4DogfAUA9Ct+rHjZUYapGQDAqDA1A2DsCF8BAP1iagYAMDuYmgEwdoSvAIB+MTUDAJgdTM0AGDvCVwBAvyZ2asa4/xepv/wH9383tfq/raz8zrjOkq2c+XmhZf77u/XzhYPEX8mnE6T/4Lz5+0OvyCj/RarwD94tWv3nlRX1zo38z7O63ao/XIlR+PVhnRl5WlL9nM/oooT3JMs3g7js1Tf+Zyb1t/KtpP3ReSXpFn6z1P4Pm0n71bfFOFfTv2evJoXKjHzbxK+91+n6i9Mtqy8DG/KZ75TQcv+T/oN28/e9Le28bfo+AxeeutFe92n5zdDH5TA7vjPXrFz0xprwqZnXP2b+5G2x9on/orTzxf+mn8qftP9cqPzrCwa7hv7np5/8x833PIdv/D+L/8W7xfX332Z+sdDUUv33u78mRbTzYfa//17d39ngRvUJUYm/Zx/NM/8NtrAv5eK389u9Di8XHxbEyvn2R0No8eWv5hCE3nWDFBU884OfJVnCqfuf+ZX29ke+3yTed535Rvp2LngalRujGfU/T7WWArX4dvjVn3sCD4JYgti+EcRG7SkIYgliJ8ZVBbEKZqT3347/uNDMukPJ6O+akXHA/2lfbyOfO9lq/uEwPiaDMPKZs4r77iln/ma+eSVvF3NU25n/D5UVpzr3v70OGXJjYr57Jp59WlL9n88epbnH+d4MffOf4SENA303Kdbbpt83Q2D/YbyXhnnmY/T96j7ao7/uV9iXoYp5OWKdsQmfmlEx/8zbEZ9WsvH+clP8DWkO2CerivmFX5eL/6P3xMFwmhRNOXNxwXRGn38kX0ULh3p4O188qwxhaibG1Rzw1PU4PPDSMK6R/9QN5yz1uBzel5TTTH3NPV183f/d/+r+viKIJYi9FILYfnoUq6n9do0gtsfJIYiN085LBrFq/oFyrFMz/zOTE1VrIsqanbpZKr1bK/yyJRMR1q+nxt9ktn/ZagmRvqkV5RZ7EsueV3bm7+3kgBwg/0qXe/5uWoiidbKMxt/ksr+Uc17p361X/3AlaZ/KcEURo5qqTNH4n5ntv7Wa1C3TKP9NTpYm0trvLum/1K15R2XtluCbNXrP4HsitKeRT/yVnr6Zbv1DK/0HpaW/LejmyfmTysrvKMps/E0i+8tOyenSnzQ3fyfyhMjEizUdaB8VnYFRXjh1jzrn09xNE2JVfYkjy+ye5D9aOj5Z7fHbUFWmeqPiJMvSVpdeZvV/kO0s/duKdZaU113ZTk9pv85nTu2GqSeJVW8w1Z7qJvWYeA68bRR7qt8Mva67L2iIeC+N98yrPzKRb5tY4l+4kV33eL8Z+uhjPvHzmL9DrF+5wvzw6p4mdVMHduLF/7si7uVQBknW26z77prgqRnlbRq+bH+MOzjkpMn7/7Hyr73bIqZm/v7bzK/+DzvB0r1rQN570mjNu3covG7n/6t9d8xN7d8I8TNZch9N+vsfM3uNlrnz/O/V/9MnK+/ZLfw295d/Jy/fv/n3S//vyar1F6xyo+KE/P23iT/9u07xaTdBpL7Dxezg3t9Ztd/U1mXL5b0MfynMjuj/3Xrv/bE7u6Rqp3v+RzE1s/q/H2djNMk68zdLf3yjJs/VTe0/ey6052pGXAv1qTP+/tvcn8oz7+t757rP/5789WJ2IeJwxbsuas/Q5YjcqDh1wzlLgcuhfNdZ3R/0xpk+p2YIYq3/E8QSxBLEEsQSxMYJYtXGPzVjh2JSt8XWdd0Wf1Dc+n33l6BqDk+oJ/bMHw5W/beV2kNm9feTTmbjbMu9GSlYUUTCQVGm3PfXRvJ3kvblERnZeE9FjfJfZGsfWKNsZO3B38K99vS/J5R72vePtf9Q7Px8e/FPmvdO5fnZOlOXGTFJHDoh1m+i00zT+e15wVyg4sIpajc/6s1V5/P263Lmv7wq/rySipymDZYpfzO+Y5dpfthSWRH48PvOZ+y3jeIky9/s3wvnFuVfN/L/94E9+oave8Sp6/7295xDVUURb7D4TVKV2cfGiN8jUdc9+DYIHz7uM68os9fbpg9xLtw4r3vP3yEX6+d3iHXa/0heUKvSpvW58zQmGGLGvhwx0k0TPDXjdDb0R51qtiWSKrevnJr5db74P1a3vXNAnXo7o7u1j/MX76/LxdKr9Sd2M4JNsid0uoXfLNnrp17/2njP+tyZfwMLa+JA/in+TvU/fZR8T04KpP5UyMkU5UZFw9y6Iv5C9u3p361zWszIYVv8e7nd3OG/iqYzAxVqZ1SZ/397Z+8bxREF8PEf4YQmHbYUuCqJIiGKpKDAhFggS1SJLml8DSFu3FhWhCwrFDQY3HBRlJygQkK2guRzkSZFIJEApXCwhF0lKMKA7l9w9vt2d97szeKF/fDvV97tzsd7sztv37w3I3ZTJ+meUG7a19LNI+LtbrqZWpjxksIG/e7ddc//ZWqS1/6pxekTU4l609qU0UXnCcGXvOeOeTXv5eA44lr/eCadp2aWfHrUiRXp6lCyjiS9FyKlZJlZo04M0skRuWPnmvE/QlwwYjFiMWKF5wgjFiMWIzbFKNfMfJRIW2bUjHKngfXQi5l+bJKDIxFIufjy5PKL1uL5Y8tPP/P151zs+8Yiz1zSJzrMmhNe04YFB73MmMNMRVNyop1hUeba0/rLujI9JoQrw7dG4iVyblsu0zirCfNWULVFyJ+uuIx2Ju8UVSyUmYrzzIohFMtUxoosSxP0bhRdUIL+V3pekQZY3g4WPKuZ9T56Vitf8ukyM6vLgZ3iytN75jtkNLs53iGx3g2bZzmr5dC+yGF0zchlttWMwQcRfoKaP8UtmxRFJagweiJ1o1/phPTjQV0zySiSqN6YfIZf2no7M0SXi9wJTWGzTU0S9atrU0YXXdqFFDqbnGb4oTTxEJWDuGZEdShZR5LoCpBSqswc1WX9qDNY6d6dU5/uZ8fXxKNmMGIVRixGrMKILUjy6TIxYq2olxFrILFvWrmuGaefbXVedmzvmtYW7q0rdWz+/Sft37Zan6Qfy93dzsT2OT8wKXKYpfovDLsfVS8dnmoo82XPyysetnzkgoM2iIwLDhpGt+KwMGlExp2FKnmx1zvV/6N95u8LxmneF5P7FC0+WRuZPicoTqg9vuAwQsVKNHHe/oLD7mClHS6M6Ho3jKXwx+N3tDnD+FaNBpiyblIhCw7SYDDpPZ0Frd+uype8yuHhzoGl4krTe+Y7ZDR53iGGWc1/fw76K2vBCzCvOiQbK73pXdNdM3YXOx+Z2/PL03FJrSz+oC46X7OD/sbdM/db++momfy1uBEZL3teLUPfQSFRM6uq5zTvrwft77cuXDfEWRijZjTXjNhOU+05sXLNRPEgzwcrq15o0hFjk+SoKE2bZo0kRadiUTPyLTudS2HIlVnyQhSVXlFRUTOvKSWtzIxR95YTmjBiFUYsRixGbGGSVxixr0G9jFiZUqNmkic0hZseR7tD+3hproEUIs9cmInnOiDvjLuP0/Axc+S7rdSjIAU0WhyI0szcrLDTvZvmimKJc2GSm1ymo9Qga272nW73UZgwHEvT3Rr3NS3UPkzG8yoPd2If3c7Q26ddOXl17HrX68iGuu2OgJ3x5YlNde1Sb/J3vXZ3UaizNue3P3haDAIJRuTlO60vUk7lROKc4Xax787FnfZmN/j1w2u9z789KqnYVGYiwe9219v3W5SnOGxGV+QJefLq5TNbpzeEnFhN7xNm0blP74tWlJIqa1MaYPZNEstU1j8elQZDht6V/t6Rbi9V8uJu6uKwUeEbc2c/c/tGe8WVq/ejhifOrptumq6yeoeo4DgJd6Z56kvb35IgELLTyONqbtPfpyCnOnQbZdAZu74VW2Kqrmvmxp9iskzqZJnRh9SIuSSX+q2FpejLWXSshAEI781+1VI/97unvtz3sn46q33/JCY1+dG1i9O5muR8IQebg5x6t/vrw1mvDckNPm51vZN3hB8vKkP2kBeV4BcbfKsb8ozioR8L0V4z//pb0jz1e+F1U2jnEevcJR8v/CQVcaMsPtHdNa5/pja0XVRGN8lXUIabTGiSJjoV22vGFf5Ub9ax6lxfj1IPgz2GoqgZ6XbDqJOu1NQh/yhpc/KXg0pJPKFJHIrqrWwDnDyhCSNWWbUTIxYjFiMWIxYj1kjZe80cpNaK43rRlsffxJmFpVCXDbShWEx6L/DcwbJx94pTOU+prCE16aYpY3x5PLH2W1nXTGaQai5GfEM+3zm5+qpnPtYX6kRltFng4dklU8Th2TZRM2X38w2CEQsNACO2KdSkm7mMWBlcM8Xj7wqucifIVZWhIz+5BAHN5rDovX9vrEHW52Hp5iFwzQBAubjxWfdbOxkus6aZr0G/MWKhARwWvTfMujsk3TTaijudC7e24nGyuGYAAKDq4JoBgNLBfAUAgLzY24oFuWb2y+4xAACALXt7e5muGSY1AAAAAKgBuGYAAKCu4JoBAAAAgAaAawYAAOoKrhkAAAAAaAC4ZgAAoK7gmgEAAACABqC7Zh53v77xbObK0tkGnMEIAABNxsI1w6QGAAAAAFVHjJp53P3uv9mls2W3DQAAIAu7qBkmNQAAAACoNLhmAACgruCaAQAAAIAGYHTNTBP8DQAA1cbeNcOkBgAAAACVRd4G2E3Nf3Dim59mPyi7fQAAACYstwFmUgMAAACAKkPUDAAA1BWiZgAAAACgAbDXDAAA1BX2mgEAAACABoBrBgAA6gquGQAAAABoALprxk3JfzZzhdBvAACoOBauGSY1AAAAAKg6/wNCf7ORZy/lqAAAAABJRU5ErkJggg==

побавил TextEncoder TextDecoder https://github.com/VitaliyVstyle/Vitali … me.js#L179

Благодарю, надеюсь достойны.
И, я смотрю, console изменилась. Это тоже хорошо.

Также убрал Lazy

Ну здесь я не смог тебя убедить просто сразу скопировать
их с глобального объекта модулей, поэтому просто скажу
самому себе, что я был недостаточно убедителен.

Отредактировано Dumby (07-03-2024 10:38:53)

Отсутствует

 

№127407-03-2024 14:55:43

Vitaliy V.
Участник
 
Группа: Members
Зарегистрирован: 19-09-2014
Сообщений: 2186
UA: Firefox 124.0

Re: UCF - ваши кнопки, скрипты…

Dumby пишет

сразу скопировать
их с глобального объекта модулей

Это типа оператором присваивания ?
scope.TextEncoder = UcfPrefs.global.TextEncoder
или же Object.assign() использовать
Можно ещё в виде прототипа все унаследовать
sandboxPrototype: UcfPrefs.global,
но тогда нужно будет опять загружать CustomizableUI и UcfPrefs

Отсутствует

 

№127507-03-2024 17:21:07

Dumby
Участник
 
Группа: Members
Зарегистрирован: 12-08-2012
Сообщений: 2249
UA: Firefox 78.0

Re: UCF - ваши кнопки, скрипты…

Vitaliy V. пишет

Это типа оператором присваивания ?

Да-да, именно им.
Они всё равно перебираются в цикле, вот прямо там и присвоить.

Можно ещё в виде прототипа все унаследовать
sandboxPrototype: UcfPrefs.global

Ууу, мысль, несомненно, интересная.
Это был бы эпический сдвиг само́й парадигмы.
Но тогда, да, действительно, мы получим вообще всё и сразу.

тогда нужно будет опять загружать CustomizableUI и UcfPrefs

Не загружать, а сослаться. Они уже загружены.

Отсутствует

 

Board footer

Powered by PunBB
Modified by Mozilla Russia
Copyright © 2004–2020 Mozilla Russia GitHub mark
Язык отображения форума: [Русский] [English]