From 404650fc764d7d341b7eabffdcc9ed3e0d045787 Mon Sep 17 00:00:00 2001 From: lizixin <2271170409@qq.com> Date: Fri, 27 Dec 2024 14:06:53 +0800 Subject: [PATCH 1/5] =?UTF-8?q?1230=20calamares=20=E8=BD=AF=E4=BB=B6?= =?UTF-8?q?=E8=A1=A5=E4=B8=81=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 0001-branding-patch.patch | 12 +- 0002-lang.patch | 33469 ++++-------------------------------- 0003-calamares.patch | 1714 +- 0004-libcalamares.patch | 159 +- 0005-libcalamaresui.patch | 11503 ++++++++++++- 0006-modules-file.patch | 4768 ++++- 0007-root.patch | 182 +- 0008-progromTree.patch | 729 +- 0009-qss.patch | 15 +- calamares.spec | 6 +- 10 files changed, 19854 insertions(+), 32703 deletions(-) diff --git a/0001-branding-patch.patch b/0001-branding-patch.patch index 52f9719..474f4df 100644 --- a/0001-branding-patch.patch +++ b/0001-branding-patch.patch @@ -1,11 +1,7 @@ -From 56fc0430a2ba6876c3e1362e004b5a650994b507 Mon Sep 17 00:00:00 2001 -From: Super User -Date: Fri, 8 Nov 2024 12:38:42 +0800 -Subject: [PATCH] =?UTF-8?q?branding=E6=96=87=E4=BB=B6=E5=A4=B9=E4=BB=A3?= - =?UTF-8?q?=E7=A0=81patch?= -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit +From 8e59b03b3eb539f88787a4cfc7db6b540f2cdff2 Mon Sep 17 00:00:00 2001 +From: lizixin <2271170409@qq.com> +Date: Fri, 27 Dec 2024 11:40:47 +0800 +Subject: [PATCH 1/8] branding patch --- src/branding/default/branding.desc | 40 ++++++++++++------------- diff --git a/0002-lang.patch b/0002-lang.patch index f63526c..bf0944d 100644 --- a/0002-lang.patch +++ b/0002-lang.patch @@ -1,31662 +1,5279 @@ -From 18a137ef970bb3cb19227fb5f9a2aec5568fd962 Mon Sep 17 00:00:00 2001 -From: cui-gaoleng <562344211@qq.com> -Date: Thu, 7 Nov 2024 20:01:41 +0800 -Subject: [PATCH 1/2] =?UTF-8?q?=E7=BF=BB=E8=AF=91?= -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit +From 328c4966fc09dddbe19e69c17debf008b5272e15 Mon Sep 17 00:00:00 2001 +From: lizixin <2271170409@qq.com> +Date: Fri, 27 Dec 2024 15:04:43 +0800 +Subject: [PATCH 1/6] lang --- - lang/calamares_en_GB.ts | 8 +- - lang/calamares_en_US.ts | 5259 ++++++++++++++++++ - lang/calamares_zh_CN.ts | 6744 ++++++++++++----------- - lang/calamares_zh_HK.ts | 6722 +++++++++++----------- - lang/calamares_zh_TW.ts | 6739 +++++++++++----------- - lang/python/en_US/LC_MESSAGES/python.po | 399 ++ - 6 files changed, 15960 insertions(+), 9911 deletions(-) - create mode 100644 lang/calamares_en_US.ts - create mode 100644 lang/python/en_US/LC_MESSAGES/python.po + lang/tz_zh_CN.ts | 2626 ++++++++++++++++++++++++++++++++++++++++++++++ + lang/tz_zh_TW.ts | 2626 ++++++++++++++++++++++++++++++++++++++++++++++ + 2 files changed, 5252 insertions(+) + create mode 100644 lang/tz_zh_CN.ts + create mode 100644 lang/tz_zh_TW.ts -diff --git a/lang/calamares_en_GB.ts b/lang/calamares_en_GB.ts -index 0210077..5247c32 100644 ---- a/lang/calamares_en_GB.ts -+++ b/lang/calamares_en_GB.ts -@@ -739,8 +739,8 @@ The installer will quit and all changes will be lost. - - - -- <strong>Erase disk</strong><br/>This will <font color="red">delete</font> all data currently present on the selected storage device. -- <strong>Erase disk</strong><br/>This will <font color="red">delete</font> all data currently present on the selected storage device. -+ <strong>Automatic partitioning</strong><br/>This will <font color="red">delete</font> all data currently present on the selected storage device. -+ <strong>Automatic partitioning</strong><br/>This will <font color="red">delete</font> all data currently present on the selected storage device. - - - -@@ -3012,8 +3012,8 @@ The installer will quit and all changes will be lost. - - - -- Use the same password for the administrator account. -- Use the same password for the administrator account. -+ Use the same password for the root account. -+ Use the same password for the root account. - - - -diff --git a/lang/calamares_en_US.ts b/lang/calamares_en_US.ts +diff --git a/lang/tz_zh_CN.ts b/lang/tz_zh_CN.ts new file mode 100644 -index 0000000..90f165b +index 0000000..b154b93 --- /dev/null -+++ b/lang/calamares_en_US.ts -@@ -0,0 +1,5259 @@ ++++ b/lang/tz_zh_CN.ts +@@ -0,0 +1,2626 @@ + ++ + -+ -+ -+ AboutData ++ ++ ++ QObject + -+ -+ <h1>%1</h1><br/><strong>%2<br/> for %3</strong><br/><br/> -+ ++ ++ Africa ++ tz_regions ++ 非洲 + + -+ -+ Thanks to <a href="https://calamares.io/team/">the Calamares team</a> and the <a href="https://app.transifex.com/calamares/calamares/">Calamares translators team</a>. -+ ++ ++ America ++ tz_regions ++ 美洲 + + -+ -+ Copyright %1-%2 %3 &lt;%4&gt;<br/> -+ Copyright year-year Name <email-address> -+ ++ ++ Antarctica ++ tz_regions ++ 南极洲 + -+ -+ -+ ActiveDirectoryJob + -+ -+ Enroll system in Active Directory -+ @label -+ ++ ++ Arctic ++ tz_regions ++ 北极 + + -+ -+ Enrolling system in Active Directory… -+ @status -+ ++ ++ Asia ++ tz_regions ++ 亚洲 + -+ -+ -+ AutoMountManagementJob + -+ -+ Managing auto-mount settings… -+ @status -+ ++ ++ Atlantic ++ tz_regions ++ 大西洋 + -+ -+ -+ BootInfoWidget + -+ -+ The <strong>boot environment</strong> of this system.<br><br>Older x86 systems only support <strong>BIOS</strong>.<br>Modern systems usually use <strong>EFI</strong>, but may also show up as BIOS if started in compatibility mode. -+ ++ ++ Australia ++ tz_regions ++ 澳大利亚 + + -+ -+ This system was started with an <strong>EFI</strong> boot environment.<br><br>To configure startup from an EFI environment, this installer must deploy a boot loader application, like <strong>GRUB</strong> or <strong>systemd-boot</strong> on an <strong>EFI System Partition</strong>. This is automatic, unless you choose manual partitioning, in which case you must choose it or create it on your own. -+ ++ ++ Europe ++ tz_regions ++ 欧洲 + + -+ -+ This system was started with a <strong>BIOS</strong> boot environment.<br><br>To configure startup from a BIOS environment, this installer must install a boot loader, like <strong>GRUB</strong>, either at the beginning of a partition or on the <strong>Master Boot Record</strong> near the beginning of the partition table (preferred). This is automatic, unless you choose manual partitioning, in which case you must set it up on your own. -+ ++ ++ Indian ++ tz_regions ++ 印度 + -+ -+ -+ BootLoaderModel + -+ -+ Master Boot Record of %1 -+ @info -+ ++ ++ Pacific ++ tz_regions ++ 太平洋 + + -+ -+ Boot Partition -+ @info -+ ++ ++ Abidjan ++ tz_names ++ 阿比让 + + -+ -+ System Partition -+ @info -+ ++ ++ Accra ++ tz_names ++ 阿克拉 + + -+ -+ Do not install a boot loader -+ @label -+ ++ ++ Adak ++ tz_names ++ 阿达克 + + -+ -+ %1 (%2) -+ ++ ++ Addis Ababa ++ tz_names ++ 亚的斯亚贝巴 + -+ -+ -+ Calamares::BlankViewStep + -+ -+ Blank Page -+ ++ ++ Adelaide ++ tz_names ++ 阿德莱德 + -+ -+ -+ Calamares::DebugWindow + -+ -+ GlobalStorage -+ ++ ++ Aden ++ tz_names ++ 亚丁 + + -+ -+ JobQueue -+ ++ ++ Algiers ++ tz_names ++ 阿尔及尔 + + -+ -+ Modules -+ ++ ++ Almaty ++ tz_names ++ 阿拉木图 + + -+ -+ Type: -+ ++ ++ Amman ++ tz_names ++ 安曼 + + -+ -+ -+ none -+ ++ ++ Amsterdam ++ tz_names ++ 阿姆斯特丹 + + -+ -+ Interface: -+ ++ ++ Anadyr ++ tz_names ++ 阿纳迪尔 + + -+ -+ Crashes Calamares, so that Dr. Konqi can look at it. -+ ++ ++ Anchorage ++ tz_names ++ 安克雷奇 + + -+ -+ Reloads the stylesheet from the branding directory. -+ ++ ++ Andorra ++ tz_names ++ 安道尔 + + -+ -+ Reload Stylesheet -+ ++ ++ Anguilla ++ tz_names ++ 安圭拉 + + -+ -+ Displays the tree of widget names in the log (for stylesheet debugging). -+ ++ ++ Antananarivo ++ tz_names ++ 塔那那利佛 + + -+ -+ Widget Tree -+ ++ ++ Antigua ++ tz_names ++ 安提瓜 + + -+ -+ Uploads the session log to the configured pastebin. -+ ++ ++ Apia ++ tz_names ++ 阿皮亚 + + -+ -+ Send Session Log -+ ++ ++ Aqtau ++ tz_names ++ 阿克托 + + -+ -+ Debug Information -+ @title -+ ++ ++ Aqtobe ++ tz_names ++ 阿克托贝 + -+ -+ -+ Calamares::ExecutionViewStep + -+ -+ %p% -+ Progress percentage indicator: %p is where the number 0..100 is placed -+ ++ ++ Araguaina ++ tz_names ++ 阿拉瓜伊纳 + + -+ -+ Set Up -+ @label -+ ++ ++ Argentina/Buenos Aires ++ tz_names ++ 阿根廷/布宜诺斯艾利斯 + + -+ -+ Install -+ @label -+ ++ ++ Argentina/Catamarca ++ tz_names ++ 阿根廷/卡塔马卡 + -+ -+ -+ Calamares::FailJob + -+ -+ Job failed (%1) -+ ++ ++ Argentina/Cordoba ++ tz_names ++ 阿根廷/科尔多瓦 + + -+ -+ Programmed job failure was explicitly requested. -+ ++ ++ Argentina/Jujuy ++ tz_names ++ 阿根廷/胡胡伊 + -+ -+ -+ Calamares::JobThread + -+ -+ Done -+ ++ ++ Argentina/La Rioja ++ tz_names ++ 阿根廷/拉里奥哈 + -+ -+ -+ Calamares::NamedJob + -+ -+ Example job (%1) -+ ++ ++ Argentina/Mendoza ++ tz_names ++ 阿根廷/门多萨 + -+ -+ -+ Calamares::ProcessJob + -+ -+ Running command %1 in target system… -+ @status -+ ++ ++ Argentina/Rio Gallegos ++ tz_names ++ 阿根廷/里奥加列戈斯 + + -+ -+ Running command %1… -+ @status -+ ++ ++ Argentina/Salta ++ tz_names ++ 阿根廷/萨尔塔 + -+ -+ -+ Calamares::Python::Job + -+ -+ Running %1 operation. -+ ++ ++ Argentina/San Juan ++ tz_names ++ 阿根廷/圣胡安 + + -+ -+ Bad working directory path -+ ++ ++ Argentina/San Luis ++ tz_names ++ 阿根廷/圣路易斯 + + -+ -+ Working directory %1 for python job %2 is not readable. -+ ++ ++ Argentina/Tucuman ++ tz_names ++ 阿根廷/图库曼 + + -+ -+ -+ -+ -+ -+ -+ Bad main script file -+ ++ ++ Argentina/Ushuaia ++ tz_names ++ 阿根廷/乌斯怀亚 + + -+ -+ Main script file %1 for python job %2 is not readable. -+ ++ ++ Aruba ++ tz_names ++ 阿鲁巴 + + -+ -+ Bad internal script -+ ++ ++ Ashgabat ++ tz_names ++ 阿什哈巴德 + + -+ -+ Internal script for python job %1 raised an exception. -+ ++ ++ Asmara ++ tz_names ++ 阿斯马拉 + + -+ -+ Main script file %1 for python job %2 could not be loaded because it raised an exception. -+ ++ ++ Astrakhan ++ tz_names ++ 阿斯特拉罕 + + -+ -+ Main script file %1 for python job %2 raised an exception. -+ ++ ++ Asuncion ++ tz_names ++ 亚松森 + + -+ -+ -+ Main script file %1 for python job %2 returned invalid results. -+ ++ ++ Athens ++ tz_names ++ 雅典 + + -+ -+ Main script file %1 for python job %2 does not contain a run() function. -+ ++ ++ Atikokan ++ tz_names ++ 阿提科坎 + -+ -+ -+ Calamares::PythonJob + -+ -+ Running %1 operation… -+ @status -+ ++ ++ Atyrau ++ tz_names ++ 阿特劳 + + -+ -+ Bad working directory path -+ @error -+ ++ ++ Auckland ++ tz_names ++ 奥克兰 + + -+ -+ Working directory %1 for python job %2 is not readable. -+ @error -+ ++ ++ Azores ++ tz_names ++ 亚速尔群岛 + + -+ -+ Bad main script file -+ @error -+ ++ ++ Baghdad ++ tz_names ++ 巴格达 + + -+ -+ Main script file %1 for python job %2 is not readable. -+ @error -+ ++ ++ Bahia ++ tz_names ++ 巴伊亚 + + -+ -+ Boost.Python error in job "%1" -+ @error -+ ++ ++ Bahia Banderas ++ tz_names ++ 巴伊亚·班德拉斯 + -+ -+ -+ Calamares::QmlViewStep + -+ -+ Loading… -+ @status -+ ++ ++ Bahrain ++ tz_names ++ 巴林 + + -+ -+ QML step <i>%1</i>. -+ @label -+ ++ ++ Baku ++ tz_names ++ 巴库 + + -+ -+ Loading failed. -+ @info -+ ++ ++ Bamako ++ tz_names ++ 巴马科 + -+ -+ -+ Calamares::RequirementsChecker + -+ -+ Requirements checking for module '%1' is complete. -+ @info -+ ++ ++ Bangkok ++ tz_names ++ 曼谷 + -+ -+ -+ Waiting for %n module(s)… -+ @status -+ -+ -+ -+ ++ ++ ++ Bangui ++ tz_names ++ 班吉 + -+ -+ -+ (%n second(s)) -+ @status -+ -+ -+ -+ ++ ++ ++ Banjul ++ tz_names ++ 班珠尔 + + -+ -+ System-requirements checking is complete. -+ @info -+ ++ ++ Barbados ++ tz_names ++ 巴巴多斯 + -+ -+ -+ Calamares::ViewManager + -+ -+ The upload was unsuccessful. No web-paste was done. -+ ++ ++ Barnaul ++ tz_names ++ 巴尔瑙尔 + + -+ -+ Install log posted to -+ -+%1 -+ -+Link copied to clipboard -+ ++ ++ Beirut ++ tz_names ++ 贝鲁特 + + -+ -+ Install Log Paste URL -+ ++ ++ Belem ++ tz_names ++ 贝伦 + + -+ -+ &Yes -+ ++ ++ Belgrade ++ tz_names ++ 贝尔格莱德 + + -+ -+ &No -+ ++ ++ Belize ++ tz_names ++ 伯利兹 + + -+ -+ &Close -+ ++ ++ Berlin ++ tz_names ++ 柏林 + + -+ -+ Setup Failed -+ @title -+ ++ ++ Bermuda ++ tz_names ++ 百慕大 + + -+ -+ Installation Failed -+ @title -+ ++ ++ Bishkek ++ tz_names ++ 比什凯克 + + -+ -+ Error -+ @title -+ ++ ++ Bissau ++ tz_names ++ 比绍 + + -+ -+ Calamares Initialization Failed -+ @title -+ ++ ++ Blanc-Sablon ++ tz_names ++ 布兰克·萨布隆 + + -+ -+ %1 can not be installed. Calamares was unable to load all of the configured modules. This is a problem with the way Calamares is being used by the distribution. -+ @info -+ ++ ++ Blantyre ++ tz_names ++ 布兰太尔 + + -+ -+ <br/>The following modules could not be loaded: -+ @info -+ ++ ++ Boa Vista ++ tz_names ++ 博阿维斯塔 + + -+ -+ Continue with Setup? -+ @title -+ ++ ++ Bogota ++ tz_names ++ 波哥大 + + -+ -+ Continue with Installation? -+ @title -+ ++ ++ Boise ++ tz_names ++ 博伊西 + + -+ -+ The %1 setup program is about to make changes to your disk in order to set up %2.<br/><strong>You will not be able to undo these changes.</strong> -+ %1 is short product name, %2 is short product name with version -+ ++ ++ Bougainville ++ tz_names ++ 布干维尔 + + -+ -+ The %1 installer is about to make changes to your disk in order to install %2.<br/><strong>You will not be able to undo these changes.</strong> -+ %1 is short product name, %2 is short product name with version -+ ++ ++ Bratislava ++ tz_names ++ 布拉迪斯拉发 + + -+ -+ &Set Up Now -+ @button -+ ++ ++ Brazzaville ++ tz_names ++ 布拉柴维尔 + + -+ -+ &Install Now -+ @button -+ ++ ++ Brisbane ++ tz_names ++ 布里斯班 + + -+ -+ Go &Back -+ @button -+ ++ ++ Broken Hill ++ tz_names ++ 布罗肯希尔 + + -+ -+ &Set Up -+ @button -+ ++ ++ Brunei ++ tz_names ++ 文莱 + + -+ -+ &Install -+ @button -+ ++ ++ Brussels ++ tz_names ++ 布鲁塞尔 + + -+ -+ Setup is complete. Close the setup program. -+ @tooltip -+ ++ ++ Beijing ++ tz_names ++ 北京 + + -+ -+ The installation is complete. Close the installer. -+ @tooltip -+ ++ ++ Bucharest ++ tz_names ++ 布加勒斯特 + + -+ -+ Cancel the setup process without changing the system. -+ @tooltip -+ ++ ++ Budapest ++ tz_names ++ 布达佩斯 + + -+ -+ Cancel the installation process without changing the system. -+ @tooltip -+ ++ ++ Bujumbura ++ tz_names ++ 布琼布拉 + + -+ -+ &Next -+ @button -+ ++ ++ Busingen ++ tz_names ++ 比辛根 + + -+ -+ &Back -+ @button -+ ++ ++ Cairo ++ tz_names ++ 开罗 + + -+ -+ &Done -+ @button -+ ++ ++ Cambridge Bay ++ tz_names ++ 剑桥湾 + + -+ -+ &Cancel -+ @button -+ ++ ++ Campo Grande ++ tz_names ++ 坎波格兰德 + + -+ -+ Cancel Setup? -+ @title -+ ++ ++ Canary ++ tz_names ++ 加那利群岛 + + -+ -+ Cancel Installation? -+ @title -+ ++ ++ Cancun ++ tz_names ++ 坎昆 + + -+ -+ Do you really want to cancel the current setup process? -+The setup program will quit and all changes will be lost. -+ ++ ++ Cape Verde ++ tz_names ++ 佛得角 + + -+ -+ Do you really want to cancel the current install process? -+The installer will quit and all changes will be lost. -+ ++ ++ Caracas ++ tz_names ++ 加拉加斯 + -+ -+ -+ CalamaresPython::Helper + -+ -+ Unknown exception type -+ @error -+ ++ ++ Casablanca ++ tz_names ++ 卡萨布兰卡 + + -+ -+ Unparseable Python error -+ @error -+ ++ ++ Casey ++ tz_names ++ 凯西 + + -+ -+ Unparseable Python traceback -+ @error -+ ++ ++ Cayenne ++ tz_names ++ 卡宴 + + -+ -+ Unfetchable Python error -+ @error -+ ++ ++ Cayman ++ tz_names ++ 开曼群岛 + -+ -+ -+ CalamaresWindow + -+ -+ %1 Setup Program -+ ++ ++ Ceuta ++ tz_names ++ 休达 + + -+ -+ %1 Installer -+ ++ ++ Chagos ++ tz_names ++ 查戈斯 + -+ -+ -+ ChangeFilesystemLabelJob + -+ -+ Set filesystem label on %1 -+ @title -+ ++ ++ Chatham ++ tz_names ++ 查塔姆 + + -+ -+ Set filesystem label <strong>%1</strong> to partition <strong>%2</strong> -+ @info -+ ++ ++ Chicago ++ tz_names ++ 芝加哥 + + -+ -+ Setting filesystem label <strong>%1</strong> to partition <strong>%2</strong>… -+ @status -+ ++ ++ Chihuahua ++ tz_names ++ 吉娃娃 + + -+ -+ -+ The installer failed to update partition table on disk '%1'. -+ @info -+ ++ ++ Chisinau ++ tz_names ++ 基希讷乌 + -+ -+ -+ CheckerContainer + -+ -+ Gathering system information... -+ ++ ++ Chita ++ tz_names ++ 赤塔 + -+ -+ -+ ChoicePage + -+ -+ Select storage de&vice: -+ @label -+ ++ ++ Choibalsan ++ tz_names ++ 乔巴桑 + + -+ -+ -+ -+ -+ Current: -+ @label -+ ++ ++ Christmas ++ tz_names ++ 伯利恒 + + -+ -+ After: -+ @label -+ ++ ++ Chuuk ++ tz_names ++ 楚克 + + -+ -+ Reuse %1 as home partition for %2 -+ @label -+ ++ ++ Cocos ++ tz_names ++ 科科斯 + + -+ -+ <strong>Select a partition to shrink, then drag the bottom bar to resize</strong> -+ ++ ++ Colombo ++ tz_names ++ 科伦坡 + + -+ -+ %1 will be shrunk to %2MiB and a new %3MiB partition will be created for %4. -+ @info, %1 is partition name, %4 is product name -+ ++ ++ Comoro ++ tz_names ++ 科摩罗 + + -+ -+ <strong>Select a partition to install on</strong> -+ @label -+ ++ ++ Conakry ++ tz_names ++ 科纳克里 + + -+ -+ An EFI system partition cannot be found anywhere on this system. Please go back and use manual partitioning to set up %1. -+ @info, %1 is product name -+ ++ ++ Copenhagen ++ tz_names ++ 哥本哈根 + + -+ -+ The EFI system partition at %1 will be used for starting %2. -+ @info, %1 is partition path, %2 is product name -+ ++ ++ Costa Rica ++ tz_names ++ 哥斯达黎加 + + -+ -+ EFI system partition: -+ @label -+ ++ ++ Creston ++ tz_names ++ 克雷斯顿 + + -+ -+ This storage device does not seem to have an operating system on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. -+ ++ ++ Cuiaba ++ tz_names ++ 库亚巴 + + -+ -+ -+ -+ -+ <strong>Erase disk</strong><br/>This will <font color="red">delete</font> all data currently present on the selected storage device. -+ ++ ++ Curacao ++ tz_names ++ 库拉索 + + -+ -+ -+ -+ -+ <strong>Install alongside</strong><br/>The installer will shrink a partition to make room for %1. -+ ++ ++ Currie ++ tz_names ++ 柯里 + + -+ -+ -+ -+ -+ <strong>Replace a partition</strong><br/>Replaces a partition with %1. -+ ++ ++ Dakar ++ tz_names ++ 达喀尔 + + -+ -+ This storage device has %1 on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. -+ ++ ++ Damascus ++ tz_names ++ 大马士革 + + -+ -+ This storage device already has an operating system on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. -+ ++ ++ Danmarkshavn ++ tz_names ++ 丹麦 + + -+ -+ This storage device has multiple operating systems on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. -+ ++ ++ Dar es Salaam ++ tz_names ++ 达累斯萨拉姆 + + -+ -+ This storage device already has an operating system on it, but the partition table <strong>%1</strong> is different from the needed <strong>%2</strong>.<br/> -+ ++ ++ Darwin ++ tz_names ++ 达尔文 + + -+ -+ This storage device has one of its partitions <strong>mounted</strong>. -+ @info -+ ++ ++ Davis ++ tz_names ++ 戴维斯 + + -+ -+ This storage device is a part of an <strong>inactive RAID</strong> device. -+ @info -+ ++ ++ Dawson ++ tz_names ++ 道森 + + -+ -+ No swap -+ @label -+ ++ ++ Dawson Creek ++ tz_names ++ 道森溪 + + -+ -+ Reuse swap -+ @label -+ ++ ++ Denver ++ tz_names ++ 丹佛 + + -+ -+ Swap (no Hibernate) -+ @label -+ ++ ++ Detroit ++ tz_names ++ 底特律 + + -+ -+ Swap (with Hibernate) -+ @label -+ ++ ++ Dhaka ++ tz_names ++ 达卡 + + -+ -+ Swap to file -+ @label -+ ++ ++ Dili ++ tz_names ++ 帝力 + + -+ -+ <strong>Manual partitioning</strong><br/>You can create or resize partitions yourself. -+ ++ ++ Djibouti ++ tz_names ++ 吉布提 + + -+ -+ Bootloader location: -+ @label -+ ++ ++ Dominica ++ tz_names ++ 多米尼克 + -+ -+ -+ ClearMountsJob + -+ -+ Successfully unmounted %1. -+ ++ ++ Douala ++ tz_names ++ 杜阿拉 + + -+ -+ Successfully disabled swap %1. -+ ++ ++ Dubai ++ tz_names ++ 迪拜 + + -+ -+ Successfully cleared swap %1. -+ ++ ++ Dublin ++ tz_names ++ 都柏林 + + -+ -+ Successfully closed mapper device %1. -+ ++ ++ DumontDUrville ++ tz_names ++ 杜蒙·杜维尔 + + -+ -+ Successfully disabled volume group %1. -+ ++ ++ Dushanbe ++ tz_names ++ 杜尚别 + + -+ -+ Clear mounts for partitioning operations on %1 -+ @title -+ ++ ++ Easter ++ tz_names ++ 伊斯特迪 + + -+ -+ Clearing mounts for partitioning operations on %1… -+ @status -+ ++ ++ Edmonton ++ tz_names ++ 埃德蒙顿 + + -+ -+ Cleared all mounts for %1 -+ ++ ++ Efate ++ tz_names ++ 埃法特岛 + -+ -+ -+ ClearTempMountsJob + -+ -+ -+ Clearing all temporary mounts… -+ @status -+ ++ ++ Eirunepe ++ tz_names ++ 埃鲁内佩 + + -+ -+ Cleared all temporary mounts. -+ ++ ++ El Aaiun ++ tz_names ++ 阿尤恩 + -+ -+ -+ CommandList + -+ -+ Could not run command. -+ ++ ++ El Salvador ++ tz_names ++ 萨尔瓦多 + + -+ -+ The commands use variables that are not defined. Missing variables are: %1. -+ ++ ++ Enderbury ++ tz_names ++ 恩德伯里 + -+ -+ -+ Config + -+ -+ Setup Failed -+ @title -+ ++ ++ Eucla ++ tz_names ++ 尤克拉 + + -+ -+ Installation Failed -+ @title -+ ++ ++ Fakaofo ++ tz_names ++ 法考福 + + -+ -+ The setup of %1 did not complete successfully. -+ @info -+ ++ ++ Famagusta ++ tz_names ++ 法马古斯塔 + + -+ -+ The installation of %1 did not complete successfully. -+ @info -+ ++ ++ Faroe ++ tz_names ++ 法罗 + + -+ -+ Setup Complete -+ @title -+ ++ ++ Fiji ++ tz_names ++ 斐济 + + -+ -+ Installation Complete -+ @title -+ ++ ++ Fort Nelson ++ tz_names ++ 纳尔逊堡 + + -+ -+ The setup of %1 is complete. -+ @info -+ ++ ++ Fortaleza ++ tz_names ++ 福塔莱萨 + + -+ -+ The installation of %1 is complete. -+ @info -+ ++ ++ Freetown ++ tz_names ++ 弗里敦 + + -+ -+ Keyboard model has been set to %1<br/>. -+ @label, %1 is keyboard model, as in Apple Magic Keyboard -+ ++ ++ Funafuti ++ tz_names ++ 富纳富提 + + -+ -+ Keyboard layout has been set to %1/%2. -+ @label, %1 is layout, %2 is layout variant -+ ++ ++ Gaborone ++ tz_names ++ 哈博罗内 + + -+ -+ Set timezone to %1/%2 -+ @action -+ ++ ++ Galapagos ++ tz_names ++ 加拉帕戈斯群岛 + + -+ -+ The system language will be set to %1. -+ @info -+ ++ ++ Gambier ++ tz_names ++ 甘比尔 + + -+ -+ The numbers and dates locale will be set to %1. -+ @info -+ ++ ++ Gaza ++ tz_names ++ 加沙 + + -+ -+ Network Installation. (Disabled: Incorrect configuration) -+ ++ ++ Gibraltar ++ tz_names ++ 直布罗陀 + + -+ -+ Network Installation. (Disabled: Received invalid groups data) -+ ++ ++ Glace Bay ++ tz_names ++ 格莱斯湾 + + -+ -+ Network Installation. (Disabled: Internal error) -+ ++ ++ Godthab ++ tz_names ++ 戈德萨布 + + -+ -+ Network Installation. (Disabled: Unable to fetch package lists, check your network connection) -+ ++ ++ Goose Bay ++ tz_names ++ 鹅湾 + + -+ -+ Network Installation. (Disabled: No package list) -+ ++ ++ Grand Turk ++ tz_names ++ 大特克 + + -+ -+ Package selection -+ ++ ++ Grenada ++ tz_names ++ 格林纳达 + + -+ -+ Package Selection -+ ++ ++ Guadalcanal ++ tz_names ++ 瓜达尔卡纳尔岛 + + -+ -+ Please pick a product from the list. The selected product will be installed. -+ ++ ++ Guadeloupe ++ tz_names ++ 瓜德罗普岛 + + -+ -+ Packages -+ ++ ++ Guam ++ tz_names ++ 关岛 + + -+ -+ Install option: <strong>%1</strong> -+ ++ ++ Guatemala ++ tz_names ++ 危地马拉 + + -+ -+ None -+ ++ ++ Guayaquil ++ tz_names ++ 瓜亚基尔 + + -+ -+ Summary -+ @label -+ ++ ++ Guernsey ++ tz_names ++ 根西岛 + + -+ -+ This is an overview of what will happen once you start the setup procedure. -+ ++ ++ Guyana ++ tz_names ++ 圭亚那 + + -+ -+ This is an overview of what will happen once you start the install procedure. -+ ++ ++ Halifax ++ tz_names ++ 哈利法克斯 + + -+ -+ Your username is too long. -+ ++ ++ Harare ++ tz_names ++ 哈拉雷 + + -+ -+ Your username must start with a lowercase letter or underscore. -+ ++ ++ Havana ++ tz_names ++ 哈瓦那 + + -+ -+ Only lowercase letters, numbers, underscore and hyphen are allowed. -+ ++ ++ Hebron ++ tz_names ++ 希伯伦 + + -+ -+ '%1' is not allowed as username. -+ ++ ++ Helsinki ++ tz_names ++ 赫尔辛基 + + -+ -+ Your hostname is too short. -+ ++ ++ Hermosillo ++ tz_names ++ 埃莫西洛 + + -+ -+ Your hostname is too long. -+ ++ ++ Ho Chi Minh ++ tz_names ++ 胡志明 + + -+ -+ '%1' is not allowed as hostname. -+ ++ ++ Hobart ++ tz_names ++ 霍巴特 + + -+ -+ Only letters, numbers, underscore and hyphen are allowed. -+ ++ ++ Hong Kong(China) ++ tz_names ++ 香港(中国) + + -+ -+ Your passwords do not match! -+ ++ ++ Honolulu ++ tz_names ++ 檀香山 + + -+ -+ OK! -+ ++ ++ Hovd ++ tz_names ++ 科布多 + + -+ -+ This computer does not satisfy the minimum requirements for setting up %1.<br/>Setup cannot continue. -+ ++ ++ Indiana/Indianapolis ++ tz_names ++ 印第安纳州/印第安纳波利斯 + + -+ -+ This computer does not satisfy the minimum requirements for installing %1.<br/>Installation cannot continue. -+ ++ ++ Indiana/Knox ++ tz_names ++ 印第安纳州/诺克斯 + + -+ -+ This computer does not satisfy some of the recommended requirements for setting up %1.<br/>Setup can continue, but some features might be disabled. -+ ++ ++ Indiana/Marengo ++ tz_names ++ 印度/马伦戈 + + -+ -+ This computer does not satisfy some of the recommended requirements for installing %1.<br/>Installation can continue, but some features might be disabled. -+ ++ ++ Indiana/Petersburg ++ tz_names ++ 印第安纳州/彼得堡 + + -+ -+ This program will ask you some questions and set up %2 on your computer. -+ ++ ++ Indiana/Tell City ++ tz_names ++ 印第安纳州/泰尔城 + + -+ -+ <h1>Welcome to the Calamares setup program for %1</h1> -+ ++ ++ Indiana/Vevay ++ tz_names ++ 印度/沃韦 + + -+ -+ <h1>Welcome to %1 setup</h1> -+ ++ ++ Indiana/Vincennes ++ tz_names ++ 印第安纳州/文森斯 + + -+ -+ <h1>Welcome to the Calamares installer for %1</h1> -+ ++ ++ Indiana/Winamac ++ tz_names ++ 印第安纳州/威纳马克 + + -+ -+ <h1>Welcome to the %1 installer</h1> -+ ++ ++ Inuvik ++ tz_names ++ 伊努维克 + -+ -+ -+ ContextualProcessJob + -+ -+ Performing contextual processes' job… -+ @status -+ ++ ++ Iqaluit ++ tz_names ++ 伊魁特 + -+ -+ -+ CreatePartitionDialog + -+ -+ Create a Partition -+ ++ ++ Irkutsk ++ tz_names ++ 伊尔库茨克 + + -+ -+ Si&ze: -+ ++ ++ Isle of Man ++ tz_names ++ 马恩岛 + + -+ -+ MiB -+ ++ ++ Istanbul ++ tz_names ++ 伊斯坦布尔 + + -+ -+ Partition &Type: -+ ++ ++ Jakarta ++ tz_names ++ 雅加达 + + -+ -+ Primar&y -+ ++ ++ Jamaica ++ tz_names ++ 牙买加 + + -+ -+ E&xtended -+ ++ ++ Jayapura ++ tz_names ++ 查亚普拉 + + -+ -+ Fi&le System: -+ ++ ++ Jersey ++ tz_names ++ 泽西岛 + + -+ -+ LVM LV name -+ ++ ++ Jerusalem ++ tz_names ++ 耶路撒冷 + + -+ -+ &Mount Point: -+ ++ ++ Johannesburg ++ tz_names ++ 约翰内斯堡 + + -+ -+ Flags: -+ ++ ++ Juba ++ tz_names ++ 朱巴 + + -+ -+ Label for the filesystem -+ ++ ++ Juneau ++ tz_names ++ 朱诺 + + -+ -+ FS Label: -+ ++ ++ Kabul ++ tz_names ++ 喀布尔 + + -+ -+ En&crypt -+ @action -+ ++ ++ Kaliningrad ++ tz_names ++ 加里宁格勒 + + -+ -+ Logical -+ @label -+ ++ ++ Kamchatka ++ tz_names ++ 堪察加半岛 + + -+ -+ Primary -+ @label -+ ++ ++ Kampala ++ tz_names ++ 坎帕拉 + + -+ -+ GPT -+ @label -+ ++ ++ Karachi ++ tz_names ++ 卡拉奇 + + -+ -+ Mountpoint already in use. Please select another one. -+ @info -+ ++ ++ Kathmandu ++ tz_names ++ 加德满都 + + -+ -+ Mountpoint must start with a <tt>/</tt>. -+ @info -+ ++ ++ Kentucky/Louisville ++ tz_names ++ 肯塔基州/路易斯维尔 + -+ -+ -+ CreatePartitionJob + -+ -+ Create new %1MiB partition on %3 (%2) with entries %4 -+ @title -+ ++ ++ Kentucky/Monticello ++ tz_names ++ 肯塔基州/蒙蒂塞洛 + + -+ -+ Create new %1MiB partition on %3 (%2) -+ @title -+ ++ ++ Kerguelen ++ tz_names ++ 凯尔盖朗 + + -+ -+ Create new %2MiB partition on %4 (%3) with file system %1 -+ @title -+ ++ ++ Khandyga ++ tz_names ++ 坎代加 + + -+ -+ Create new <strong>%1MiB</strong> partition on <strong>%3</strong> (%2) with entries <em>%4</em> -+ @info -+ ++ ++ Khartoum ++ tz_names ++ 喀土穆 + + -+ -+ Create new <strong>%1MiB</strong> partition on <strong>%3</strong> (%2) -+ @info -+ ++ ++ Kiev ++ tz_names ++ 基辅 + + -+ -+ Create new <strong>%2MiB</strong> partition on <strong>%4</strong> (%3) with file system <strong>%1</strong> -+ @info -+ ++ ++ Kigali ++ tz_names ++ 基加利 + + -+ -+ -+ Creating new %1 partition on %2… -+ @status -+ ++ ++ Kinshasa ++ tz_names ++ 金沙萨 + + -+ -+ The installer failed to create partition on disk '%1'. -+ @info -+ ++ ++ Kiritimati ++ tz_names ++ 基里蒂马提斯 + -+ -+ -+ CreatePartitionTableDialog + -+ -+ Create Partition Table -+ ++ ++ Kirov ++ tz_names ++ 基洛夫 + + -+ -+ Creating a new partition table will delete all existing data on the disk. -+ ++ ++ Kolkata ++ tz_names ++ 加尔格达 + + -+ -+ What kind of partition table do you want to create? -+ ++ ++ Kosrae ++ tz_names ++ 科斯雷 + + -+ -+ Master Boot Record (MBR) -+ ++ ++ Kralendijk ++ tz_names ++ 克罗地亚 + + -+ -+ GUID Partition Table (GPT) -+ ++ ++ Krasnoyarsk ++ tz_names ++ 克拉斯诺亚尔斯克 + -+ -+ -+ CreatePartitionTableJob + -+ -+ -+ Creating new %1 partition table on %2… -+ @status -+ ++ ++ Kuala Lumpur ++ tz_names ++ 吉隆坡 + + -+ -+ Creating new <strong>%1</strong> partition table on <strong>%2</strong> (%3)… -+ @status -+ ++ ++ Kuching ++ tz_names ++ 古晋 + + -+ -+ The installer failed to create a partition table on %1. -+ ++ ++ Kuwait ++ tz_names ++ 科威特 + -+ -+ -+ CreateUserJob + -+ -+ Create user %1 -+ ++ ++ Kwajalein ++ tz_names ++ 夸贾林 + + -+ -+ Create user <strong>%1</strong> -+ ++ ++ La Paz ++ tz_names ++ 拉巴斯 + + -+ -+ -+ Creating user %1… -+ @status -+ ++ ++ Lagos ++ tz_names ++ 拉各斯 + + -+ -+ Preserving home directory… -+ @status -+ ++ ++ Libreville ++ tz_names ++ 利伯维尔 + + -+ -+ Configuring user %1 -+ @status -+ ++ ++ Lima ++ tz_names ++ 利马 + + -+ -+ Setting file permissions… -+ @status -+ ++ ++ Lindeman ++ tz_names ++ 林德曼 + -+ -+ -+ CreateVolumeGroupDialog + -+ -+ Create Volume Group -+ @title -+ ++ ++ Lisbon ++ tz_names ++ 里斯本 + -+ -+ -+ CreateVolumeGroupJob + -+ -+ -+ Creating new volume group named %1… -+ @status -+ ++ ++ Ljubljana ++ tz_names ++ 卢布尔雅那 + + -+ -+ Creating new volume group named <strong>%1</strong>… -+ @status -+ ++ ++ Lome ++ tz_names ++ 多哥 + + -+ -+ The installer failed to create a volume group named '%1'. -+ ++ ++ London ++ tz_names ++ 伦敦 + -+ -+ -+ DeactivateVolumeGroupJob + -+ -+ -+ Deactivating volume group named %1… -+ @status -+ ++ ++ Longyearbyen ++ tz_names ++ 朗伊尔城 + + -+ -+ Deactivating volume group named <strong>%1</strong>… -+ @status -+ ++ ++ Lord Howe ++ tz_names ++ 豪勋爵 + + -+ -+ The installer failed to deactivate a volume group named %1. -+ ++ ++ Los Angeles ++ tz_names ++ 洛杉矶 + -+ -+ -+ DeletePartitionJob + -+ -+ -+ Deleting partition %1… -+ @status -+ ++ ++ Lower Princes ++ tz_names ++ 圣马丁 + + -+ -+ Deleting partition <strong>%1</strong>… -+ @status -+ ++ ++ Luanda ++ tz_names ++ 罗安达 + + -+ -+ The installer failed to delete partition %1. -+ ++ ++ Lubumbashi ++ tz_names ++ 卢本巴希 + -+ -+ -+ DeviceInfoWidget + -+ -+ <br><br>This partition table type is only advisable on older systems which start from a <strong>BIOS</strong> boot environment. GPT is recommended in most other cases.<br><br><strong>Warning:</strong> the MBR partition table is an obsolete MS-DOS era standard.<br>Only 4 <em>primary</em> partitions may be created, and of those 4, one can be an <em>extended</em> partition, which may in turn contain many <em>logical</em> partitions. -+ ++ ++ Lusaka ++ tz_names ++ 卢萨卡 + + -+ -+ <br><br>This is the recommended partition table type for modern systems which start from an <strong>EFI</strong> boot environment. -+ ++ ++ Luxembourg ++ tz_names ++ 卢森堡 + + -+ -+ This is a <strong>loop</strong> device.<br><br>It is a pseudo-device with no partition table that makes a file accessible as a block device. This kind of setup usually only contains a single filesystem. -+ ++ ++ Macau(China) ++ tz_names ++ 澳门(中国) + + -+ -+ This installer <strong>cannot detect a partition table</strong> on the selected storage device.<br><br>The device either has no partition table, or the partition table is corrupted or of an unknown type.<br>This installer can create a new partition table for you, either automatically, or through the manual partitioning page. -+ ++ ++ Maceio ++ tz_names ++ 马塞奥 + + -+ -+ This device has a <strong>%1</strong> partition table. -+ ++ ++ Macquarie ++ tz_names ++ 麦格理 + + -+ -+ The type of <strong>partition table</strong> on the selected storage device.<br><br>The only way to change the partition table type is to erase and recreate the partition table from scratch, which destroys all data on the storage device.<br>This installer will keep the current partition table unless you explicitly choose otherwise.<br>If unsure, on modern systems GPT is preferred. -+ ++ ++ Madeira ++ tz_names ++ 马德拉 + -+ -+ -+ DeviceModel + -+ -+ %1 - %2 (%3) -+ device[name] - size[number] (device-node[name]) -+ ++ ++ Madrid ++ tz_names ++ 马德里 + + -+ -+ %1 - (%2) -+ device[name] - (device-node[name]) -+ ++ ++ Magadan ++ tz_names ++ 马加丹 + -+ -+ -+ DracutLuksCfgJob + -+ -+ Writing LUKS configuration for Dracut to %1… -+ @status -+ ++ ++ Mahe ++ tz_names ++ 马埃 + + -+ -+ Skipping writing LUKS configuration for Dracut: "/" partition is not encrypted -+ @info -+ ++ ++ Majuro ++ tz_names ++ 马朱罗 + + -+ -+ Failed to open %1 -+ @error -+ ++ ++ Makassar ++ tz_names ++ 望加锡 + -+ -+ -+ DummyCppJob + -+ -+ Performing dummy C++ job… -+ @status -+ ++ ++ Malabo ++ tz_names ++ 马拉博 + -+ -+ -+ EditExistingPartitionDialog + -+ -+ Edit Existing Partition -+ ++ ++ Maldives ++ tz_names ++ 马尔代夫 + + -+ -+ Con&tent: -+ ++ ++ Malta ++ tz_names ++ 马耳他 + + -+ -+ &Keep -+ ++ ++ Managua ++ tz_names ++ 马那瓜 + + -+ -+ Format -+ ++ ++ Manaus ++ tz_names ++ 马瑙斯 + + -+ -+ Warning: Formatting the partition will erase all existing data. -+ ++ ++ Manila ++ tz_names ++ 马尼拉 + + -+ -+ &Mount Point: -+ ++ ++ Maputo ++ tz_names ++ 马普托 + + -+ -+ Si&ze: -+ ++ ++ Mariehamn ++ tz_names ++ 玛丽港 + + -+ -+ MiB -+ ++ ++ Marigot ++ tz_names ++ 马里戈 + + -+ -+ Fi&le System: -+ ++ ++ Marquesas ++ tz_names ++ 马克萨斯 + + -+ -+ Flags: -+ ++ ++ Martinique ++ tz_names ++ 马提尼克岛 + + -+ -+ Label for the filesystem -+ ++ ++ Maseru ++ tz_names ++ 马塞卢 + + -+ -+ FS Label: -+ ++ ++ Matamoros ++ tz_names ++ 马塔莫罗斯 + + -+ -+ Passphrase for existing partition -+ ++ ++ Mauritius ++ tz_names ++ 毛里求斯 + + -+ -+ Partition %1 could not be decrypted with the given passphrase.<br/><br/>Edit the partition again and give the correct passphrase or delete and create a new encrypted partition. -+ ++ ++ Mawson ++ tz_names ++ 莫森 + -+ -+ -+ EncryptWidget + -+ -+ En&crypt system -+ ++ ++ Mayotte ++ tz_names ++ 马约特岛 + + -+ -+ Your system does not seem to support encryption well enough to encrypt the entire system. You may enable encryption, but performance may suffer. -+ ++ ++ Mazatlan ++ tz_names ++ 马萨特兰 + + -+ -+ Passphrase -+ ++ ++ Mbabane ++ tz_names ++ 姆巴巴内 + + -+ -+ Confirm passphrase -+ ++ ++ McMurdo ++ tz_names ++ 麦克默多 + + -+ -+ -+ Please enter the same passphrase in both boxes. -+ @tooltip -+ ++ ++ Melbourne ++ tz_names ++ 墨尔本 + + -+ -+ Password must be a minimum of %1 characters. -+ @tooltip -+ ++ ++ Menominee ++ tz_names ++ 梅诺米尼 + -+ -+ -+ ErrorDialog + -+ -+ Details: -+ ++ ++ Merida ++ tz_names ++ 梅里达 + + -+ -+ Would you like to paste the install log to the web? -+ ++ ++ Metlakatla ++ tz_names ++ 梅特拉卡特拉 + -+ -+ -+ FillGlobalStorageJob + -+ -+ Set partition information -+ @title -+ ++ ++ Mexico City ++ tz_names ++ 墨西哥城 + + -+ -+ Install %1 on <strong>new</strong> %2 system partition with features <em>%3</em> -+ @info -+ ++ ++ Midway ++ tz_names ++ 中途岛 + + -+ -+ Install %1 on <strong>new</strong> %2 system partition -+ @info -+ ++ ++ Minsk ++ tz_names ++ 明斯克 + + -+ -+ Set up <strong>new</strong> %2 partition with mount point <strong>%1</strong> and features <em>%3</em> -+ @info -+ ++ ++ Miquelon ++ tz_names ++ 密克隆 + + -+ -+ Set up <strong>new</strong> %2 partition with mount point <strong>%1</strong>%3 -+ @info -+ ++ ++ Mogadishu ++ tz_names ++ 摩加迪沙 + + -+ -+ Install %2 on %3 system partition <strong>%1</strong> with features <em>%4</em> -+ @info -+ ++ ++ Monaco ++ tz_names ++ 摩纳哥 + + -+ -+ Install %2 on %3 system partition <strong>%1</strong> -+ @info -+ ++ ++ Moncton ++ tz_names ++ 蒙克顿 + + -+ -+ Set up %3 partition <strong>%1</strong> with mount point <strong>%2</strong> and features <em>%4</em> -+ @info -+ ++ ++ Monrovia ++ tz_names ++ 蒙罗维亚 + + -+ -+ Set up %3 partition <strong>%1</strong> with mount point <strong>%2</strong>%4… -+ @info -+ ++ ++ Monterrey ++ tz_names ++ 蒙特雷 + + -+ -+ Install boot loader on <strong>%1</strong>… -+ @info -+ ++ ++ Montevideo ++ tz_names ++ 蒙得维的亚 + + -+ -+ Setting up mount points… -+ @status -+ ++ ++ Montserrat ++ tz_names ++ 蒙特塞拉特 + -+ -+ -+ FinishedPage + -+ -+ &Restart now -+ ++ ++ Moscow ++ tz_names ++ 莫斯科 + + -+ -+ <h1>All done.</h1><br/>%1 has been set up on your computer.<br/>You may now start using your new system. -+ @info -+ ++ ++ Muscat ++ tz_names ++ 马斯喀特 + + -+ -+ <html><head/><body><p>When this box is checked, your system will restart immediately when you click on <span style="font-style:italic;">Done</span> or close the setup program.</p></body></html> -+ @tooltip -+ ++ ++ Nairobi ++ tz_names ++ 内罗毕 + + -+ -+ <h1>All done.</h1><br/>%1 has been installed on your computer.<br/>You may now restart into your new system, or continue using the %2 Live environment. -+ @info -+ ++ ++ Nassau ++ tz_names ++ 拿骚 + + -+ -+ <html><head/><body><p>When this box is checked, your system will restart immediately when you click on <span style="font-style:italic;">Done</span> or close the installer.</p></body></html> -+ @tooltip -+ ++ ++ Nauru ++ tz_names ++ 瑙鲁 + + -+ -+ <h1>Setup Failed</h1><br/>%1 has not been set up on your computer.<br/>The error message was: %2. -+ @info, %1 is product name with version -+ ++ ++ Ndjamena ++ tz_names ++ 恩贾梅纳 + + -+ -+ <h1>Installation Failed</h1><br/>%1 has not been installed on your computer.<br/>The error message was: %2. -+ @info, %1 is product name with version -+ ++ ++ New York ++ tz_names ++ 纽约 + -+ -+ -+ FinishedQmlViewStep + -+ -+ Finish -+ @label -+ ++ ++ Niamey ++ tz_names ++ 尼亚美 + -+ -+ -+ FinishedViewStep + -+ -+ Finish -+ @label -+ ++ ++ Nicosia ++ tz_names ++ 尼科西亚 + -+ -+ -+ FormatPartitionJob + -+ -+ Format partition %1 (file system: %2, size: %3 MiB) on %4 -+ @title -+ ++ ++ Nipigon ++ tz_names ++ 尼皮贡 + + -+ -+ Format <strong>%3MiB</strong> partition <strong>%1</strong> with file system <strong>%2</strong> -+ @info -+ ++ ++ Niue ++ tz_names ++ 纽埃 + + -+ -+ %1 (%2) -+ partition label %1 (device path %2) -+ ++ ++ Nome ++ tz_names ++ 诺姆 + + -+ -+ Formatting partition %1 with file system %2… -+ @status -+ ++ ++ Norfolk ++ tz_names ++ 诺福克 + + -+ -+ The installer failed to format partition %1 on disk '%2'. -+ ++ ++ Noronha ++ tz_names ++ 诺罗尼亚 + -+ -+ -+ GeneralRequirements + -+ -+ Please ensure the system has at least %1 GiB available drive space. -+ ++ ++ North Dakota/Beulah ++ tz_names ++ 北达科他州/比拉 + + -+ -+ Available drive space is all of the hard disks and SSDs connected to the system. -+ ++ ++ North Dakota/Center ++ tz_names ++ 北达科他州/中心 + + -+ -+ There is not enough drive space. At least %1 GiB is required. -+ ++ ++ North Dakota/New Salem ++ tz_names ++ 北达科他州/新塞勒姆 + + -+ -+ has at least %1 GiB working memory -+ ++ ++ Nouakchott ++ tz_names ++ 努瓦克肖特 + + -+ -+ The system does not have enough working memory. At least %1 GiB is required. -+ ++ ++ Noumea ++ tz_names ++ 努美阿 + + -+ -+ is plugged in to a power source -+ ++ ++ Novokuznetsk ++ tz_names ++ 新库兹涅茨克 + + -+ -+ The system is not plugged in to a power source. -+ ++ ++ Novosibirsk ++ tz_names ++ 新西伯利亚 + + -+ -+ is connected to the Internet -+ ++ ++ Ojinaga ++ tz_names ++ 魁北克 + + -+ -+ The system is not connected to the Internet. -+ ++ ++ Omsk ++ tz_names ++ 鄂木斯克 + + -+ -+ is running the installer as an administrator (root) -+ ++ ++ Oral ++ tz_names ++ 多拉 + + -+ -+ The setup program is not running with administrator rights. -+ ++ ++ Oslo ++ tz_names ++ 奥斯陆 + + -+ -+ The installer is not running with administrator rights. -+ ++ ++ Ouagadougou ++ tz_names ++ 瓦加杜古 + + -+ -+ has a screen large enough to show the whole installer -+ ++ ++ Pago Pago ++ tz_names ++ 帕果帕果 + + -+ -+ The screen is too small to display the setup program. -+ ++ ++ Palau ++ tz_names ++ 帕劳 + + -+ -+ The screen is too small to display the installer. -+ ++ ++ Palmer ++ tz_names ++ 帕尔默 + + -+ -+ is always false -+ ++ ++ Panama ++ tz_names ++ 巴拿马 + + -+ -+ The computer says no. -+ ++ ++ Pangnirtung ++ tz_names ++ 巴芬岛的旁涅唐 + + -+ -+ is always false (slowly) -+ ++ ++ Paramaribo ++ tz_names ++ 帕拉马里博 + + -+ -+ The computer says no (slowly). -+ ++ ++ Paris ++ tz_names ++ 巴黎 + + -+ -+ is always true -+ ++ ++ Perth ++ tz_names ++ 珀斯 + + -+ -+ The computer says yes. -+ ++ ++ Phnom Penh ++ tz_names ++ 金边 + + -+ -+ is always true (slowly) -+ ++ ++ Phoenix ++ tz_names ++ 凤凰城 + + -+ -+ The computer says yes (slowly). -+ ++ ++ Pitcairn ++ tz_names ++ 皮特凯恩 + + -+ -+ is checked three times. -+ ++ ++ Podgorica ++ tz_names ++ 波德戈里察 + + -+ -+ The snark has not been checked three times. -+ The (some mythological beast) has not been checked three times. -+ ++ ++ Pohnpei ++ tz_names ++ 波纳佩岛 + -+ -+ -+ HostInfoJob + -+ -+ Collecting information about your machine… -+ @status -+ ++ ++ Pontianak ++ tz_names ++ 坤甸 + -+ -+ -+ IDJob + -+ -+ -+ -+ -+ OEM Batch Identifier -+ ++ ++ Port Moresby ++ tz_names ++ 莫尔兹比港 + + -+ -+ Could not create directories <code>%1</code>. -+ ++ ++ Port of Spain ++ tz_names ++ 西班牙港 + + -+ -+ Could not open file <code>%1</code>. -+ ++ ++ Port-au-Prince ++ tz_names ++ 太子港 + + -+ -+ Could not write to file <code>%1</code>. -+ ++ ++ Porto Velho ++ tz_names ++ 维略港 + -+ -+ -+ InitcpioJob + -+ -+ Creating initramfs with mkinitcpio… -+ @status -+ ++ ++ Porto-Novo ++ tz_names ++ 波多诺伏 + -+ -+ -+ InitramfsJob + -+ -+ Creating initramfs… -+ @status -+ ++ ++ Prague ++ tz_names ++ 布拉格 + -+ -+ -+ InteractiveTerminalPage + -+ -+ Konsole not installed. -+ @error -+ ++ ++ Puerto Rico ++ tz_names ++ 波多黎各 + + -+ -+ Please install KDE Konsole and try again! -+ @info -+ ++ ++ Punta Arenas ++ tz_names ++ 蓬塔阿雷纳斯 + + -+ -+ Executing script: &nbsp;<code>%1</code> -+ @info -+ ++ ++ Pyongyang ++ tz_names ++ 平壤 + -+ -+ -+ InteractiveTerminalViewStep + -+ -+ Script -+ @label -+ ++ ++ Qatar ++ tz_names ++ 卡塔尔 + -+ -+ -+ KeyboardQmlViewStep + -+ -+ Keyboard -+ @label -+ ++ ++ Qostanay ++ tz_names ++ 库斯塔 + -+ -+ -+ KeyboardViewStep + -+ -+ Keyboard -+ @label -+ ++ ++ Qyzylorda ++ tz_names ++ 克孜勒奥尔达 + -+ -+ -+ LCLocaleDialog + -+ -+ System Locale Setting -+ @title -+ ++ ++ Rainy River ++ tz_names ++ 雷尼河 + + -+ -+ The system locale setting affects the language and character set for some command line user interface elements.<br/>The current setting is <strong>%1</strong>. -+ @info -+ ++ ++ Rankin Inlet ++ tz_names ++ 兰京海口 + + -+ -+ &Cancel -+ @button -+ ++ ++ Rarotonga ++ tz_names ++ 拉罗汤加 + + -+ -+ &OK -+ @button -+ ++ ++ Recife ++ tz_names ++ 累西腓 + -+ -+ -+ LOSHJob + -+ -+ Configuring encrypted swap. -+ ++ ++ Regina ++ tz_names ++ 里贾纳 + + -+ -+ No target system available. -+ ++ ++ Resolute ++ tz_names ++ 雷索卢特 + + -+ -+ No rootMountPoint is set. -+ ++ ++ Reunion ++ tz_names ++ 留尼旺岛 + + -+ -+ No configFilePath is set. -+ ++ ++ Reykjavik ++ tz_names ++ 雷克雅未克 + -+ -+ -+ LicensePage + -+ -+ <h1>License Agreement</h1> -+ ++ ++ Riga ++ tz_names ++ 里加 + + -+ -+ I accept the terms and conditions above. -+ @info -+ ++ ++ Rio Branco ++ tz_names ++ 里奥·布兰科 + + -+ -+ Please review the End User License Agreements (EULAs). -+ @info -+ ++ ++ Riyadh ++ tz_names ++ 利雅得 + + -+ -+ This setup procedure will install proprietary software that is subject to licensing terms. -+ @info -+ ++ ++ Rome ++ tz_names ++ 罗马 + + -+ -+ If you do not agree with the terms, the setup procedure cannot continue. -+ @info -+ ++ ++ Rothera ++ tz_names ++ 罗瑟拉 + + -+ -+ This setup procedure can install proprietary software that is subject to licensing terms in order to provide additional features and enhance the user experience. -+ @info -+ ++ ++ Saipan ++ tz_names ++ 塞班岛 + + -+ -+ If you do not agree with the terms, proprietary software will not be installed, and open source alternatives will be used instead. -+ @info -+ ++ ++ Sakhalin ++ tz_names ++ 萨哈林 + -+ -+ -+ LicenseViewStep + -+ -+ License -+ @label -+ ++ ++ Samara ++ tz_names ++ 萨马拉 + -+ -+ -+ LicenseWidget + -+ -+ URL: %1 -+ @label -+ ++ ++ Samarkand ++ tz_names ++ 撒马尔罕 + + -+ -+ <strong>%1 driver</strong><br/>by %2 -+ @label, %1 is product name, %2 is product vendor -+ %1 is an untranslatable product name, example: Creative Audigy driver -+ ++ ++ San Marino ++ tz_names ++ 圣马力诺 + + -+ -+ <strong>%1 graphics driver</strong><br/><font color="Grey">by %2</font> -+ @label, %1 is product name, %2 is product vendor -+ %1 is usually a vendor name, example: Nvidia graphics driver -+ ++ ++ Santarem ++ tz_names ++ 圣塔伦 + + -+ -+ <strong>%1 browser plugin</strong><br/><font color="Grey">by %2</font> -+ @label, %1 is product name, %2 is product vendor -+ ++ ++ Santiago ++ tz_names ++ 圣地亚哥 + + -+ -+ <strong>%1 codec</strong><br/><font color="Grey">by %2</font> -+ @label, %1 is product name, %2 is product vendor -+ ++ ++ Santo Domingo ++ tz_names ++ 圣多明各 + + -+ -+ <strong>%1 package</strong><br/><font color="Grey">by %2</font> -+ @label, %1 is product name, %2 is product vendor -+ ++ ++ Sao Paulo ++ tz_names ++ 圣保罗 + + -+ -+ <strong>%1</strong><br/><font color="Grey">by %2</font> -+ @label, %1 is product name, %2 is product vendor -+ ++ ++ Sao Tome ++ tz_names ++ 圣多美 + + -+ -+ File: %1 -+ @label -+ ++ ++ Sarajevo ++ tz_names ++ 萨拉热窝 + + -+ -+ Hide the license text -+ @tooltip -+ ++ ++ Saratov ++ tz_names ++ 萨拉托夫 + + -+ -+ Show the license text -+ @tooltip -+ ++ ++ Scoresbysund ++ tz_names ++ 斯科斯比基金 + + -+ -+ Open the license agreement in browser -+ @tooltip -+ ++ ++ Seoul ++ tz_names ++ 首尔 + -+ -+ -+ LocalePage + -+ -+ Region: -+ @label -+ ++ ++ Shanghai ++ tz_names ++ 上海 + + -+ -+ Zone: -+ @label -+ ++ ++ Simferopol ++ tz_names ++ 辛菲罗波尔 + + -+ -+ -+ &Change… -+ @button -+ ++ ++ Singapore ++ tz_names ++ 新加坡 + -+ -+ -+ LocaleQmlViewStep + -+ -+ Location -+ @label -+ ++ ++ Sitka ++ tz_names ++ 锡特卡 + -+ -+ -+ LocaleTests + -+ -+ Quit -+ ++ ++ Skopje ++ tz_names ++ 斯科普里 + -+ -+ -+ LocaleViewStep + -+ -+ Location -+ @label -+ ++ ++ Sofia ++ tz_names ++ 索菲亚 + -+ -+ -+ LuksBootKeyFileJob + -+ -+ Configuring LUKS key file. -+ ++ ++ South Georgia ++ tz_names ++ 南乔治亚州 + + -+ -+ -+ No partitions are defined. -+ ++ ++ Srednekolymsk ++ tz_names ++ 雅库特 + + -+ -+ -+ Encrypted rootfs setup error -+ ++ ++ St Barthelemy ++ tz_names ++ 圣巴泰勒米 + + -+ -+ Root partition %1 is LUKS but no passphrase has been set. -+ ++ ++ St Helena ++ tz_names ++ 圣赫勒拿 + + -+ -+ Could not create LUKS key file for root partition %1. -+ ++ ++ St Johns ++ tz_names ++ 圣约翰 + -+ -+ -+ MachineIdJob + -+ -+ Generate machine-id. -+ ++ ++ St Kitts ++ tz_names ++ 圣基茨 + + -+ -+ Configuration Error -+ ++ ++ St Lucia ++ tz_names ++ 圣卢西亚 + + -+ -+ No root mount point is set for MachineId. -+ ++ ++ St Thomas ++ tz_names ++ 圣托马斯 + + -+ -+ -+ -+ -+ File not found -+ ++ ++ St Vincent ++ tz_names ++ 圣文森特 + + -+ -+ Path <pre>%1</pre> must be an absolute path. -+ ++ ++ Stanley ++ tz_names ++ 斯坦利 + + -+ -+ Could not create new random file <pre>%1</pre>. -+ ++ ++ Stockholm ++ tz_names ++ 斯德哥尔摩 + -+ -+ -+ Map + -+ -+ Timezone: %1 -+ @label -+ ++ ++ Swift Current ++ tz_names ++ 斯威夫特卡伦特 + + -+ -+ Please select your preferred location on the map so the installer can suggest the locale -+ and timezone settings for you. You can fine-tune the suggested settings below. Search the map by dragging -+ to move and using the +/- buttons to zoom in/out or use mouse scrolling for zooming. -+ @info -+ ++ ++ Sydney ++ tz_names ++ 悉尼 + -+ -+ -+ Map-qt6 + -+ -+ Timezone: %1 -+ @label -+ ++ ++ Syowa ++ tz_names ++ 圣何塞 + + -+ -+ Please select your preferred location on the map so the installer can suggest the locale -+ and timezone settings for you. You can fine-tune the suggested settings below. Search the map by dragging -+ to move and using the +/- buttons to zoom in/out or use mouse scrolling for zooming. -+ @label -+ ++ ++ Tahiti ++ tz_names ++ 大溪地 + -+ -+ -+ NetInstallViewStep + -+ -+ Package selection -+ ++ ++ Taipei(China) ++ tz_names ++ 台北(中国) + + -+ -+ Office software -+ ++ ++ Tallinn ++ tz_names ++ 塔林 + + -+ -+ Office package -+ ++ ++ Tarawa ++ tz_names ++ 塔拉瓦 + + -+ -+ Browser software -+ ++ ++ Tashkent ++ tz_names ++ 塔什干 + + -+ -+ Browser package -+ ++ ++ Tbilisi ++ tz_names ++ 第比利斯 + + -+ -+ Web browser -+ ++ ++ Tegucigalpa ++ tz_names ++ 特古西加尔巴 + + -+ -+ Kernel -+ label for netinstall module, Linux kernel -+ ++ ++ Tehran ++ tz_names ++ 德黑兰 + + -+ -+ Services -+ label for netinstall module, system services -+ ++ ++ Thimphu ++ tz_names ++ 廷布 + + -+ -+ Login -+ label for netinstall module, choose login manager -+ ++ ++ Thule ++ tz_names ++ 图勒 + + -+ -+ Desktop -+ label for netinstall module, choose desktop environment -+ ++ ++ Thunder Bay ++ tz_names ++ 雷湾 + + -+ -+ Applications -+ ++ ++ Tijuana ++ tz_names ++ 蒂华纳 + + -+ -+ Communication -+ label for netinstall module -+ ++ ++ Tirane ++ tz_names ++ 地拉那 + + -+ -+ Development -+ label for netinstall module -+ ++ ++ Tokyo ++ tz_names ++ 东京 + + -+ -+ Office -+ label for netinstall module -+ ++ ++ Tomsk ++ tz_names ++ 托木斯克 + + -+ -+ Multimedia -+ label for netinstall module -+ ++ ++ Tongatapu ++ tz_names ++ 汤加塔布 + + -+ -+ Internet -+ label for netinstall module -+ ++ ++ Toronto ++ tz_names ++ 多伦多 + + -+ -+ Theming -+ label for netinstall module -+ ++ ++ Tortola ++ tz_names ++ 托托拉岛 + + -+ -+ Gaming -+ label for netinstall module -+ ++ ++ Tripoli ++ tz_names ++ 的黎波里 + + -+ -+ Utilities -+ label for netinstall module -+ ++ ++ Troll ++ tz_names ++ 特罗尔海坦 + -+ -+ -+ NotesQmlViewStep + -+ -+ Notes -+ ++ ++ Tunis ++ tz_names ++ 突尼斯 + -+ -+ -+ OEMPage + -+ -+ Ba&tch: -+ ++ ++ Ulaanbaatar ++ tz_names ++ 乌兰巴托 + + -+ -+ <html><head/><body><p>Enter a batch-identifier here. This will be stored in the target system.</p></body></html> -+ ++ ++ Ulyanovsk ++ tz_names ++ 乌里扬诺夫斯克 + + -+ -+ <html><head/><body><h1>OEM Configuration</h1><p>Calamares will use OEM settings while configuring the target system.</p></body></html> -+ ++ ++ Urumqi ++ tz_names ++ 乌鲁木齐 + -+ -+ -+ OEMViewStep + -+ -+ OEM Configuration -+ ++ ++ Ust-Nera ++ tz_names ++ 乌斯季挪拉 + + -+ -+ Set the OEM Batch Identifier to <code>%1</code>. -+ ++ ++ Uzhgorod ++ tz_names ++ 乌日哥罗德 + -+ -+ -+ Offline + -+ -+ Select your preferred region, or use the default settings -+ @label -+ ++ ++ Vaduz ++ tz_names ++ 瓦杜兹 + + -+ -+ -+ -+ Timezone: %1 -+ @label -+ ++ ++ Vancouver ++ tz_names ++ 温哥华 + + -+ -+ Select your preferred zone within your region -+ @label -+ ++ ++ Vatican ++ tz_names ++ 梵蒂冈 + + -+ -+ Zones -+ @button -+ ++ ++ Vienna ++ tz_names ++ 维也纳 + + -+ -+ You can fine-tune language and locale settings below -+ @label -+ ++ ++ Vientiane ++ tz_names ++ 万象 + -+ -+ -+ Offline-qt6 + -+ -+ Select your preferred region, or use the default settings -+ @label -+ ++ ++ Vilnius ++ tz_names ++ 维尔纽斯 + + -+ -+ -+ -+ Timezone: %1 -+ @label -+ ++ ++ Vladivostok ++ tz_names ++ 符拉迪沃斯托克 + + -+ -+ Select your preferred zone within your region -+ @label -+ ++ ++ Volgograd ++ tz_names ++ 伏尔加格勒 + + -+ -+ Zones -+ @button -+ ++ ++ Vostok ++ tz_names ++ 沃斯托克 + + -+ -+ You can fine-tune language and locale settings below -+ @label -+ ++ ++ Wake ++ tz_names ++ 韦克 + -+ -+ -+ PWQ + -+ -+ Password is too short -+ ++ ++ Wallis ++ tz_names ++ 沃利斯 + + -+ -+ Password is too long -+ ++ ++ Warsaw ++ tz_names ++ 华沙 + + -+ -+ Password is too weak -+ ++ ++ Whitehorse ++ tz_names ++ 怀特霍斯 + + -+ -+ Memory allocation error when setting '%1' -+ ++ ++ Windhoek ++ tz_names ++ 温得和克 + + -+ -+ Memory allocation error -+ ++ ++ Winnipeg ++ tz_names ++ 温尼伯 + + -+ -+ The password is the same as the old one -+ ++ ++ Yakutat ++ tz_names ++ 雅库特 + + -+ -+ The password is a palindrome -+ ++ ++ Yakutsk ++ tz_names ++ 雅库茨克 + + -+ -+ The password differs with case changes only -+ ++ ++ Yangon ++ tz_names ++ 仰光 + + -+ -+ The password is too similar to the old one -+ ++ ++ Yekaterinburg ++ tz_names ++ 叶卡捷琳堡 + + -+ -+ The password contains the user name in some form -+ ++ ++ Yellowknife ++ tz_names ++ 耶洛奈夫 + + -+ -+ The password contains words from the real name of the user in some form -+ ++ ++ Yerevan ++ tz_names ++ 埃里温 + + -+ -+ The password contains forbidden words in some form -+ ++ ++ Zagreb ++ tz_names ++ 萨格勒布 + -+ -+ -+ The password contains fewer than %n digits -+ -+ -+ -+ ++ ++ ++ Zaporozhye ++ tz_names ++ 扎波罗热 + + -+ -+ The password contains too few digits -+ ++ ++ Zurich ++ tz_names ++ 苏黎世 + -+ -+ -+ The password contains fewer than %n uppercase letters -+ -+ -+ -+ ++ ++ +diff --git a/lang/tz_zh_TW.ts b/lang/tz_zh_TW.ts +new file mode 100644 +index 0000000..2713d37 +--- /dev/null ++++ b/lang/tz_zh_TW.ts +@@ -0,0 +1,2626 @@ ++ ++ ++ ++ ++ ++ QObject ++ ++ ++ Africa ++ tz_regions ++ 非洲 + + -+ -+ The password contains too few uppercase letters -+ ++ ++ America ++ tz_regions ++ 美洲 + -+ -+ -+ The password contains fewer than %n lowercase letters -+ -+ -+ -+ ++ ++ ++ Antarctica ++ tz_regions ++ 南極洲 + + -+ -+ The password contains too few lowercase letters -+ ++ ++ Arctic ++ tz_regions ++ 北極 + -+ -+ -+ The password contains fewer than %n non-alphanumeric characters -+ -+ -+ -+ ++ ++ ++ Asia ++ tz_regions ++ 亞洲 + + -+ -+ The password contains too few non-alphanumeric characters -+ ++ ++ Atlantic ++ tz_regions ++ 大西洋 + -+ -+ -+ The password is shorter than %n characters -+ -+ -+ -+ ++ ++ ++ Australia ++ tz_regions ++ 澳大利亞 + + -+ -+ The password is too short -+ ++ ++ Europe ++ tz_regions ++ 歐洲 + + -+ -+ The password is a rotated version of the previous one -+ ++ ++ Indian ++ tz_regions ++ 印度 + -+ -+ -+ The password contains fewer than %n character classes -+ -+ -+ -+ ++ ++ ++ Pacific ++ tz_regions ++ 太平洋 + + -+ -+ The password does not contain enough character classes -+ ++ ++ Abidjan ++ tz_names ++ 阿必尚 + -+ -+ -+ The password contains more than %n same characters consecutively -+ -+ -+ -+ ++ ++ ++ Accra ++ tz_names ++ 阿克拉 + + -+ -+ The password contains too many same characters consecutively -+ ++ ++ Adak ++ tz_names ++ 阿達克 + -+ -+ -+ The password contains more than %n characters of the same class consecutively -+ -+ -+ -+ ++ ++ ++ Addis Ababa ++ tz_names ++ 阿迪斯阿貝巴 + + -+ -+ The password contains too many characters of the same class consecutively -+ ++ ++ Adelaide ++ tz_names ++ 阿德萊德 + -+ -+ -+ The password contains monotonic sequence longer than %n characters -+ -+ -+ -+ ++ ++ ++ Aden ++ tz_names ++ 亞丁 + + -+ -+ The password contains too long of a monotonic character sequence -+ ++ ++ Algiers ++ tz_names ++ 阿爾及爾 + + -+ -+ No password supplied -+ ++ ++ Almaty ++ tz_names ++ 阿拉木圖 + + -+ -+ Cannot obtain random numbers from the RNG device -+ ++ ++ Amman ++ tz_names ++ 安曼 + + -+ -+ Password generation failed - required entropy too low for settings -+ ++ ++ Amsterdam ++ tz_names ++ 阿姆斯特丹 + + -+ -+ The password fails the dictionary check - %1 -+ ++ ++ Anadyr ++ tz_names ++ 阿納迪爾 + + -+ -+ The password fails the dictionary check -+ ++ ++ Anchorage ++ tz_names ++ 安克雷奇 + + -+ -+ Unknown setting - %1 -+ ++ ++ Andorra ++ tz_names ++ 安道爾 + + -+ -+ Unknown setting -+ ++ ++ Anguilla ++ tz_names ++ 安圭拉 + + -+ -+ Bad integer value of setting - %1 -+ ++ ++ Antananarivo ++ tz_names ++ 安塔那那利佛 + + -+ -+ Bad integer value -+ ++ ++ Antigua ++ tz_names ++ 安提瓜 + + -+ -+ Setting %1 is not of integer type -+ ++ ++ Apia ++ tz_names ++ 亞庇 + + -+ -+ Setting is not of integer type -+ ++ ++ Aqtau ++ tz_names ++ 阿克托 + + -+ -+ Setting %1 is not of string type -+ ++ ++ Aqtobe ++ tz_names ++ 阿克托貝 + + -+ -+ Setting is not of string type -+ ++ ++ Araguaina ++ tz_names ++ 阿拉瓜伊納 + + -+ -+ Opening the configuration file failed -+ ++ ++ Argentina/Buenos Aires ++ tz_names ++ 阿根廷/布宜諾賽勒斯 + + -+ -+ The configuration file is malformed -+ ++ ++ Argentina/Catamarca ++ tz_names ++ 阿根廷/卡塔馬卡 + + -+ -+ Fatal failure -+ ++ ++ Argentina/Cordoba ++ tz_names ++ 阿根廷/科爾多瓦 + + -+ -+ Unknown error -+ ++ ++ Argentina/Jujuy ++ tz_names ++ 阿根廷/胡胡伊 + -+ -+ -+ PackageChooserPage + -+ -+ Product Name -+ ++ ++ Argentina/La Rioja ++ tz_names ++ 阿根廷/拉里奧哈 + + -+ -+ TextLabel -+ ++ ++ Argentina/Mendoza ++ tz_names ++ 阿根廷/門多薩 + + -+ -+ Long Product Description -+ ++ ++ Argentina/Rio Gallegos ++ tz_names ++ 阿根廷/裏奧加列戈斯 + + -+ -+ Package Selection -+ ++ ++ Argentina/Salta ++ tz_names ++ 阿根廷/薩爾塔 + + -+ -+ Please pick a product from the list. The selected product will be installed. -+ ++ ++ Argentina/San Juan ++ tz_names ++ 阿根廷/聖胡安 + -+ -+ -+ PackageModel + -+ -+ Name -+ ++ ++ Argentina/San Luis ++ tz_names ++ 阿根廷/聖路易斯 + + -+ -+ Description -+ ++ ++ Argentina/Tucuman ++ tz_names ++ 阿根廷/圖庫曼 + -+ -+ -+ Page_Keyboard + -+ -+ Keyboard model: -+ ++ ++ Argentina/Ushuaia ++ tz_names ++ 阿根廷/烏斯懷亞 + + -+ -+ Type here to test your keyboard -+ ++ ++ Aruba ++ tz_names ++ 阿魯巴 + + -+ -+ Switch Keyboard: -+ shortcut for switching between keyboard layouts -+ ++ ++ Ashgabat ++ tz_names ++ 阿什哈巴德 + -+ -+ -+ Page_UserSetup + -+ -+ What is your name? -+ ++ ++ Asmara ++ tz_names ++ 阿斯馬拉 + + -+ -+ Your Full Name -+ ++ ++ Astrakhan ++ tz_names ++ 阿斯特拉罕 + + -+ -+ What name do you want to use to log in? -+ ++ ++ Asuncion ++ tz_names ++ 亞松森 + + -+ -+ login -+ ++ ++ Athens ++ tz_names ++ 雅典 + + -+ -+ What is the name of this computer? -+ ++ ++ Atikokan ++ tz_names ++ 阿提科坎 + + -+ -+ <small>This name will be used if you make the computer visible to others on a network.</small> -+ ++ ++ Atyrau ++ tz_names ++ 阿特勞 + + -+ -+ Computer Name -+ ++ ++ Auckland ++ tz_names ++ 奧克蘭 + + -+ -+ Choose a password to keep your account safe. -+ ++ ++ Azores ++ tz_names ++ 亞速爾群島 + + -+ -+ -+ <small>Enter the same password twice, so that it can be checked for typing errors. A good password will contain a mixture of letters, numbers and punctuation, should be at least eight characters long, and should be changed at regular intervals.</small> -+ ++ ++ Baghdad ++ tz_names ++ 巴格達 + + -+ -+ -+ Password -+ ++ ++ Bahia ++ tz_names ++ 巴伊亞 + + -+ -+ -+ Repeat Password -+ ++ ++ Bahia Banderas ++ tz_names ++ 巴伊亞·班德拉斯 + + -+ -+ When this box is checked, password-strength checking is done and you will not be able to use a weak password. -+ ++ ++ Bahrain ++ tz_names ++ 巴林 + + -+ -+ Require strong passwords. -+ ++ ++ Baku ++ tz_names ++ 巴庫 + + -+ -+ Log in automatically without asking for the password. -+ ++ ++ Bamako ++ tz_names ++ 巴馬科 + + -+ -+ Use the same password for the administrator account. -+ ++ ++ Bangkok ++ tz_names ++ 曼谷 + + -+ -+ Choose a password for the administrator account. -+ ++ ++ Bangui ++ tz_names ++ 班基 + + -+ -+ -+ <small>Enter the same password twice, so that it can be checked for typing errors.</small> -+ ++ ++ Banjul ++ tz_names ++ 班竹 + + -+ -+ Use Active Directory -+ ++ ++ Barbados ++ tz_names ++ 巴巴多斯 + + -+ -+ Domain: -+ ++ ++ Barnaul ++ tz_names ++ 巴爾瑙爾 + + -+ -+ Domain Administrator: -+ ++ ++ Beirut ++ tz_names ++ 貝魯特 + + -+ -+ Password: -+ ++ ++ Belem ++ tz_names ++ 貝倫 + + -+ -+ IP Address (optional): -+ ++ ++ Belgrade ++ tz_names ++ 貝爾格勒 + -+ -+ -+ PartitionLabelsView + -+ -+ Root -+ ++ ++ Belize ++ tz_names ++ 貝裡斯 + + -+ -+ Home -+ @label -+ ++ ++ Berlin ++ tz_names ++ 柏林 + + -+ -+ Boot -+ @label -+ ++ ++ Bermuda ++ tz_names ++ 百慕大 + + -+ -+ EFI system -+ @label -+ ++ ++ Bishkek ++ tz_names ++ 比什凱克 + + -+ -+ Swap -+ @label -+ ++ ++ Bissau ++ tz_names ++ 比索 + + -+ -+ New partition for %1 -+ @label -+ ++ ++ Beijing ++ tz_names ++ 北京 ++ ++ ++ ++ Blanc-Sablon ++ tz_names ++ 布蘭克·薩布隆 + + -+ -+ New partition -+ @label -+ ++ ++ Blantyre ++ tz_names ++ 布蘭太爾 + + -+ -+ %1 %2 -+ size[number] filesystem[name] -+ ++ ++ Boa Vista ++ tz_names ++ 博阿維斯塔 + -+ -+ -+ PartitionModel + -+ -+ -+ Free Space -+ @title -+ ++ ++ Bogota ++ tz_names ++ 波哥大 + + -+ -+ -+ New Partition -+ @title -+ ++ ++ Boise ++ tz_names ++ 博伊西 + + -+ -+ Name -+ @title -+ ++ ++ Bougainville ++ tz_names ++ 布幹維爾 + + -+ -+ File System -+ @title -+ ++ ++ Bratislava ++ tz_names ++ 布拉提斯拉瓦 + + -+ -+ File System Label -+ @title -+ ++ ++ Brazzaville ++ tz_names ++ 布拉柴維爾 + + -+ -+ Mount Point -+ @title -+ ++ ++ Brisbane ++ tz_names ++ 布里斯班 + + -+ -+ Size -+ @title -+ ++ ++ Broken Hill ++ tz_names ++ 布羅肯希爾 + -+ -+ -+ PartitionPage + -+ -+ Storage de&vice: -+ ++ ++ Brunei ++ tz_names ++ 汶萊 + + -+ -+ &Revert All Changes -+ ++ ++ Brussels ++ tz_names ++ 布魯塞爾 + + -+ -+ New Partition &Table -+ ++ ++ Bucharest ++ tz_names ++ 布加勒斯特 + + -+ -+ Cre&ate -+ ++ ++ Budapest ++ tz_names ++ 布達佩斯 + + -+ -+ &Edit -+ ++ ++ Bujumbura ++ tz_names ++ 布松布拉 + + -+ -+ &Delete -+ ++ ++ Busingen ++ tz_names ++ 匯流排 + + -+ -+ New Volume Group -+ ++ ++ Cairo ++ tz_names ++ 開羅 + + -+ -+ Resize Volume Group -+ ++ ++ Cambridge Bay ++ tz_names ++ 劍橋灣 + + -+ -+ Deactivate Volume Group -+ ++ ++ Campo Grande ++ tz_names ++ 坎波格蘭德 + + -+ -+ Remove Volume Group -+ ++ ++ Canary ++ tz_names ++ 加那利群島 + + -+ -+ I&nstall boot loader on: -+ ++ ++ Cancun ++ tz_names ++ 坎昆 + + -+ -+ Are you sure you want to create a new partition table on %1? -+ ++ ++ Cape Verde ++ tz_names ++ 佛得角 + + -+ -+ Can not create new partition -+ ++ ++ Caracas ++ tz_names ++ 卡拉卡斯 + + -+ -+ The partition table on %1 already has %2 primary partitions, and no more can be added. Please remove one primary partition and add an extended partition, instead. -+ ++ ++ Casablanca ++ tz_names ++ 卡薩布蘭卡 + -+ -+ -+ PartitionViewStep + -+ -+ Gathering system information… -+ @status -+ ++ ++ Casey ++ tz_names ++ 凱西 + + -+ -+ Partitions -+ @label -+ ++ ++ Cayenne ++ tz_names ++ 卡宴 + + -+ -+ Install %1 <strong>alongside</strong> another operating system -+ @label -+ ++ ++ Cayman ++ tz_names ++ 開曼群島 + + -+ -+ <strong>Erase</strong> disk and install %1 -+ @label -+ ++ ++ Ceuta ++ tz_names ++ 休達 + + -+ -+ <strong>Replace</strong> a partition with %1 -+ @label -+ ++ ++ Chagos ++ tz_names ++ 查戈斯 + + -+ -+ <strong>Manual</strong> partitioning -+ @label -+ ++ ++ Chatham ++ tz_names ++ 查塔姆 + + -+ -+ Install %1 <strong>alongside</strong> another operating system on disk <strong>%2</strong> (%3) -+ @info -+ ++ ++ Chicago ++ tz_names ++ 芝加哥 + + -+ -+ <strong>Erase</strong> disk <strong>%2</strong> (%3) and install %1 -+ @info -+ ++ ++ Chihuahua ++ tz_names ++ 吉娃娃 + + -+ -+ <strong>Replace</strong> a partition on disk <strong>%2</strong> (%3) with %1 -+ @info -+ ++ ++ Chisinau ++ tz_names ++ 基希訥烏 + + -+ -+ <strong>Manual</strong> partitioning on disk <strong>%1</strong> (%2) -+ @info -+ ++ ++ Chita ++ tz_names ++ 赤塔 + + -+ -+ Disk <strong>%1</strong> (%2) -+ @info -+ ++ ++ Choibalsan ++ tz_names ++ 喬巴桑 + + -+ -+ Unsafe partition actions are enabled. -+ ++ ++ Christmas ++ tz_names ++ 耶誕節 + + -+ -+ Partitioning is configured to <b>always</b> fail. -+ ++ ++ Chuuk ++ tz_names ++ 楚克 + + -+ -+ No partitions will be changed. -+ ++ ++ Cocos ++ tz_names ++ 科科斯 + + -+ -+ Current: -+ @label -+ ++ ++ Colombo ++ tz_names ++ 可倫坡 + + -+ -+ After: -+ @label -+ ++ ++ Comoro ++ tz_names ++ 科摩羅 + + -+ -+ An EFI system partition is necessary to start %1.<br/><br/>To configure an EFI system partition, go back and select or create a suitable filesystem. -+ ++ ++ Conakry ++ tz_names ++ 柯那克里 + + -+ -+ An EFI system partition is necessary to start %1.<br/><br/>The EFI system partition does not meet recommendations. It is recommended to go back and select or create a suitable filesystem. -+ ++ ++ Copenhagen ++ tz_names ++ 哥本哈根 + + -+ -+ The filesystem must be mounted on <strong>%1</strong>. -+ ++ ++ Costa Rica ++ tz_names ++ 哥斯大黎加 + + -+ -+ The filesystem must have type FAT32. -+ ++ ++ Creston ++ tz_names ++ 克雷斯頓 + + -+ -+ The filesystem must have flag <strong>%1</strong> set. -+ ++ ++ Cuiaba ++ tz_names ++ 庫亞巴 + + -+ -+ -+ The filesystem must be at least %1 MiB in size. -+ ++ ++ Curacao ++ tz_names ++ 庫拉索 + + -+ -+ The minimum recommended size for the filesystem is %1 MiB. -+ ++ ++ Currie ++ tz_names ++ 柯裡 + + -+ -+ You can continue without setting up an EFI system partition but your system may fail to start. -+ ++ ++ Dakar ++ tz_names ++ 達喀爾 + + -+ -+ You can continue with this EFI system partition configuration but your system may fail to start. -+ ++ ++ Damascus ++ tz_names ++ 大馬士革 + + -+ -+ No EFI system partition configured -+ ++ ++ Danmarkshavn ++ tz_names ++ 丹麥 + + -+ -+ EFI system partition configured incorrectly -+ ++ ++ Dar es Salaam ++ tz_names ++ 沙蘭港 + + -+ -+ EFI system partition recommendation -+ ++ ++ Darwin ++ tz_names ++ 達爾文 + + -+ -+ Option to use GPT on BIOS -+ ++ ++ Davis ++ tz_names ++ 大衛斯 + + -+ -+ A GPT partition table is the best option for all systems. This installer supports such a setup for BIOS systems too.<br/><br/>To configure a GPT partition table on BIOS, (if not done so already) go back and set the partition table to GPT, next create a 8 MB unformatted partition with the <strong>%2</strong> flag enabled.<br/><br/>An unformatted 8 MB partition is necessary to start %1 on a BIOS system with GPT. -+ ++ ++ Dawson ++ tz_names ++ 道森 + + -+ -+ Boot partition not encrypted -+ ++ ++ Dawson Creek ++ tz_names ++ 道森溪 + + -+ -+ A separate boot partition was set up together with an encrypted root partition, but the boot partition is not encrypted.<br/><br/>There are security concerns with this kind of setup, because important system files are kept on an unencrypted partition.<br/>You may continue if you wish, but filesystem unlocking will happen later during system startup.<br/>To encrypt the boot partition, go back and recreate it, selecting <strong>Encrypt</strong> in the partition creation window. -+ ++ ++ Denver ++ tz_names ++ 丹佛 + + -+ -+ has at least one disk device available. -+ ++ ++ Detroit ++ tz_names ++ 底特律 + + -+ -+ There are no partitions to install on. -+ ++ ++ Dhaka ++ tz_names ++ 達卡 + -+ -+ -+ PlasmaLnfJob + -+ -+ Applying Plasma Look-and-Feel… -+ @status -+ ++ ++ Dili ++ tz_names ++ 帝利 + + -+ -+ -+ Could not select KDE Plasma Look-and-Feel package -+ ++ ++ Djibouti ++ tz_names ++ 吉佈提 + -+ -+ -+ PlasmaLnfPage + -+ -+ Please choose a look-and-feel for the KDE Plasma Desktop. You can also skip this step and configure the look-and-feel once the system is set up. Clicking on a look-and-feel selection will give you a live preview of that look-and-feel. -+ ++ ++ Dominica ++ tz_names ++ 多明尼克 + + -+ -+ Please choose a look-and-feel for the KDE Plasma Desktop. You can also skip this step and configure the look-and-feel once the system is installed. Clicking on a look-and-feel selection will give you a live preview of that look-and-feel. -+ ++ ++ Douala ++ tz_names ++ 杜阿拉 + -+ -+ -+ PlasmaLnfViewStep + -+ -+ Look-and-Feel -+ @label -+ ++ ++ Dubai ++ tz_names ++ 迪拜 + -+ -+ -+ PowerManagementInterface + -+ -+ Calamares -+ ++ ++ Dublin ++ tz_names ++ 都柏林 + + -+ -+ Installation in progress -+ @status -+ ++ ++ DumontDUrville ++ tz_names ++ 杜蒙·杜維爾 + -+ -+ -+ PreserveFiles + -+ -+ Saving files for later… -+ @status -+ ++ ++ Dushanbe ++ tz_names ++ 杜桑貝 + + -+ -+ No files configured to save for later. -+ ++ ++ Easter ++ tz_names ++ 復活節 + + -+ -+ Not all of the configured files could be preserved. -+ ++ ++ Edmonton ++ tz_names ++ 埃德蒙頓 + -+ -+ -+ ProcessResult + -+ -+ -+There was no output from the command. -+ ++ ++ Efate ++ tz_names ++ 埃法特島 + + -+ -+ -+Output: -+ -+ ++ ++ Eirunepe ++ tz_names ++ 埃魯內佩 + + -+ -+ External command crashed. -+ ++ ++ El Aaiun ++ tz_names ++ 阿尤恩 + + -+ -+ Command <i>%1</i> crashed. -+ ++ ++ El Salvador ++ tz_names ++ 薩爾瓦多 + + -+ -+ External command failed to start. -+ ++ ++ Enderbury ++ tz_names ++ 恩德伯裡 + + -+ -+ Command <i>%1</i> failed to start. -+ ++ ++ Eucla ++ tz_names ++ 尤克拉 + + -+ -+ Internal error when starting command. -+ ++ ++ Fakaofo ++ tz_names ++ 法攷福 + + -+ -+ Bad parameters for process job call. -+ ++ ++ Famagusta ++ tz_names ++ 法馬古斯塔 + + -+ -+ External command failed to finish. -+ ++ ++ Faroe ++ tz_names ++ 法羅 + + -+ -+ Command <i>%1</i> failed to finish in %2 seconds. -+ ++ ++ Fiji ++ tz_names ++ 斐濟 + + -+ -+ External command finished with errors. -+ ++ ++ Fort Nelson ++ tz_names ++ 納爾遜堡 + + -+ -+ Command <i>%1</i> finished with exit code %2. -+ ++ ++ Fortaleza ++ tz_names ++ 福塔雷薩 + -+ -+ -+ QObject + -+ -+ %1 (%2) -+ ++ ++ Freetown ++ tz_names ++ 弗裏敦 + + -+ -+ unknown -+ @partition info -+ ++ ++ Funafuti ++ tz_names ++ 福納佛提 + + -+ -+ extended -+ @partition info -+ ++ ++ Gaborone ++ tz_names ++ 嘉柏隆里 + + -+ -+ unformatted -+ @partition info -+ ++ ++ Galapagos ++ tz_names ++ 加拉帕戈斯群島 + + -+ -+ swap -+ @partition info -+ ++ ++ Gambier ++ tz_names ++ 甘比爾 + + -+ -+ -+ Default -+ ++ ++ Gaza ++ tz_names ++ 加沙 + + -+ -+ Directory not found -+ ++ ++ Gibraltar ++ tz_names ++ 直布羅陀 + + -+ -+ Could not create new random file <pre>%1</pre>. -+ ++ ++ Glace Bay ++ tz_names ++ 格萊斯灣 + + -+ -+ No product -+ ++ ++ Godthab ++ tz_names ++ 戈德薩布 + + -+ -+ No description provided. -+ ++ ++ Goose Bay ++ tz_names ++ 鹅灣 + + -+ -+ (no mount point) -+ ++ ++ Grand Turk ++ tz_names ++ 大特克 + + -+ -+ Unpartitioned space or unknown partition table -+ @info -+ ++ ++ Grenada ++ tz_names ++ 格林伍德 + -+ -+ -+ Recommended + -+ -+ <p>This computer does not satisfy some of the recommended requirements for setting up %1.<br/> -+ Setup can continue, but some features might be disabled.</p> -+ ++ ++ Guadalcanal ++ tz_names ++ 瓜達爾卡納爾島 + -+ -+ -+ RemoveUserJob + -+ -+ Removing live user from the target system… -+ @status -+ ++ ++ Guadeloupe ++ tz_names ++ 瓜德羅普島 + -+ -+ -+ RemoveVolumeGroupJob + -+ -+ -+ Removing Volume Group named %1… -+ @status -+ ++ ++ Guam ++ tz_names ++ 關島 + + -+ -+ Removing Volume Group named <strong>%1</strong>… -+ @status -+ ++ ++ Guatemala ++ tz_names ++ 瓜地馬拉 + + -+ -+ The installer failed to remove a volume group named '%1'. -+ ++ ++ Guayaquil ++ tz_names ++ 瓜亞基爾 + -+ -+ -+ Requirements + -+ -+ <p>This computer does not satisfy the minimum requirements for installing %1.<br/> -+ Installation cannot continue.</p> -+ ++ ++ Guernsey ++ tz_names ++ 根西島 + + -+ -+ <p>This computer does not satisfy some of the recommended requirements for setting up %1.<br/> -+ Setup can continue, but some features might be disabled.</p> -+ ++ ++ Guyana ++ tz_names ++ 蓋亞那 + -+ -+ -+ ResizeFSJob + -+ -+ Performing file system resize… -+ @status -+ ++ ++ Halifax ++ tz_names ++ 哈利法克斯 + + -+ -+ Invalid configuration -+ @error -+ ++ ++ Harare ++ tz_names ++ 哈拉雷 + + -+ -+ The file-system resize job has an invalid configuration and will not run. -+ @error -+ ++ ++ Havana ++ tz_names ++ 哈瓦那 + + -+ -+ KPMCore not available -+ @error -+ ++ ++ Hebron ++ tz_names ++ 希伯倫 + + -+ -+ Calamares cannot start KPMCore for the file system resize job. -+ @error -+ ++ ++ Helsinki ++ tz_names ++ 赫爾辛基 + + -+ -+ Resize failed. -+ @error -+ ++ ++ Hermosillo ++ tz_names ++ 埃莫西洛 + + -+ -+ The filesystem %1 could not be found in this system, and cannot be resized. -+ @info -+ ++ ++ Ho Chi Minh ++ tz_names ++ 胡志明 + + -+ -+ The device %1 could not be found in this system, and cannot be resized. -+ @info -+ ++ ++ Hobart ++ tz_names ++ 霍巴特 + + -+ -+ -+ -+ -+ Resize Failed -+ @error -+ ++ ++ Hong Kong(China) ++ tz_names ++ 香港(中国) + + -+ -+ -+ The filesystem %1 cannot be resized. -+ @error -+ ++ ++ Honolulu ++ tz_names ++ 檀香山 + + -+ -+ -+ The device %1 cannot be resized. -+ @error -+ ++ ++ Hovd ++ tz_names ++ 科布多 + + -+ -+ The file system %1 must be resized, but cannot. -+ @info -+ ++ ++ Indiana/Indianapolis ++ tz_names ++ 印第安那州/印弟安納波里斯 + + -+ -+ The device %1 must be resized, but cannot -+ @info -+ ++ ++ Indiana/Knox ++ tz_names ++ 印第安那州/諾克斯 + -+ -+ -+ ResizePartitionJob + -+ -+ Resize partition %1 -+ @title -+ ++ ++ Indiana/Marengo ++ tz_names ++ 印度/馬倫戈 + + -+ -+ Resize <strong>%2MiB</strong> partition <strong>%1</strong> to <strong>%3MiB</strong> -+ @info -+ ++ ++ Indiana/Petersburg ++ tz_names ++ 印第安那州/彼得堡 + + -+ -+ Resizing %2MiB partition %1 to %3MiB… -+ @status -+ ++ ++ Indiana/Tell City ++ tz_names ++ 印第安那州/泰爾城 + + -+ -+ The installer failed to resize partition %1 on disk '%2'. -+ ++ ++ Indiana/Vevay ++ tz_names ++ 印度/沃韋 + -+ -+ -+ ResizeVolumeGroupDialog + -+ -+ Resize Volume Group -+ @title -+ ++ ++ Indiana/Vincennes ++ tz_names ++ 印第安那州/文森斯 + -+ -+ -+ ResizeVolumeGroupJob + -+ -+ Resize volume group named %1 from %2 to %3 -+ @title -+ ++ ++ Indiana/Winamac ++ tz_names ++ 印第安那州/威納馬克 + + -+ -+ Resize volume group named <strong>%1</strong> from <strong>%2</strong> to <strong>%3</strong> -+ @info -+ ++ ++ Inuvik ++ tz_names ++ 伊努維克 + + -+ -+ Resizing volume group named %1 from %2 to %3… -+ @status -+ ++ ++ Iqaluit ++ tz_names ++ 伊魁特 + + -+ -+ The installer failed to resize a volume group named '%1'. -+ ++ ++ Irkutsk ++ tz_names ++ 伊爾庫茨克 + -+ -+ -+ ResultsListWidget + -+ -+ Checking requirements again in a few seconds ... -+ ++ ++ Isle of Man ++ tz_names ++ 曼島 + -+ -+ -+ ScanningDialog + -+ -+ Scanning storage devices… -+ @status -+ ++ ++ Istanbul ++ tz_names ++ 蓋章 + + -+ -+ Partitioning… -+ @status -+ ++ ++ Jakarta ++ tz_names ++ 雅加達 + -+ -+ -+ SetHostNameJob + -+ -+ Set hostname %1 -+ ++ ++ Jamaica ++ tz_names ++ 牙買加 + + -+ -+ Set hostname <strong>%1</strong>. -+ ++ ++ Jayapura ++ tz_names ++ 查亞普拉 + + -+ -+ Setting hostname %1… -+ @status -+ ++ ++ Jersey ++ tz_names ++ 澤西島 + + -+ -+ -+ Internal Error -+ ++ ++ Jerusalem ++ tz_names ++ 耶路撒冷 + + -+ -+ -+ Cannot write hostname to target system -+ ++ ++ Johannesburg ++ tz_names ++ 約翰尼斯堡 + -+ -+ -+ SetKeyboardLayoutJob + -+ -+ Setting keyboard model to %1, layout as %2-%3… -+ @status, %1 model, %2 layout, %3 variant -+ ++ ++ Juba ++ tz_names ++ 朱巴 + + -+ -+ Failed to write keyboard configuration for the virtual console. -+ @error -+ ++ ++ Juneau ++ tz_names ++ 朱諾 + + -+ -+ Failed to write to %1 -+ @error, %1 is virtual console configuration path -+ ++ ++ Kabul ++ tz_names ++ 喀布爾 + + -+ -+ Failed to write keyboard configuration for X11. -+ @error -+ ++ ++ Kaliningrad ++ tz_names ++ 加里寧格勒 + + -+ -+ Failed to write to %1 -+ @error, %1 is keyboard configuration path -+ ++ ++ Kamchatka ++ tz_names ++ 堪察加半島 + + -+ -+ Failed to write keyboard configuration to existing /etc/default directory. -+ @error -+ ++ ++ Kampala ++ tz_names ++ 坎帕拉 + + -+ -+ Failed to write to %1 -+ @error, %1 is default keyboard path -+ ++ ++ Karachi ++ tz_names ++ 卡拉奇 + -+ -+ -+ SetPartFlagsJob + -+ -+ Set flags on partition %1 -+ @title -+ ++ ++ Kathmandu ++ tz_names ++ 加德滿都 + + -+ -+ Set flags on %1MiB %2 partition -+ @title -+ ++ ++ Kentucky/Louisville ++ tz_names ++ 肯塔基州/路易斯維爾 + + -+ -+ Set flags on new partition -+ @title -+ ++ ++ Kentucky/Monticello ++ tz_names ++ 肯塔基州/蒙蒂塞洛 + + -+ -+ Clear flags on partition <strong>%1</strong> -+ @info -+ ++ ++ Kerguelen ++ tz_names ++ 凱爾蓋朗 + + -+ -+ Clear flags on %1MiB <strong>%2</strong> partition -+ @info -+ ++ ++ Khandyga ++ tz_names ++ 坎代加 + + -+ -+ Clear flags on new partition -+ @info -+ ++ ++ Khartoum ++ tz_names ++ 喀土穆 + + -+ -+ Set flags on partition <strong>%1</strong> to <strong>%2</strong> -+ @info -+ ++ ++ Kiev ++ tz_names ++ 基輔 + + -+ -+ Set flags on %1MiB <strong>%2</strong> partition to <strong>%3</strong> -+ @info -+ ++ ++ Kigali ++ tz_names ++ 吉佳利 + + -+ -+ Set flags on new partition to <strong>%1</strong> -+ @info -+ ++ ++ Kinshasa ++ tz_names ++ 金夏沙 + + -+ -+ Clearing flags on partition <strong>%1</strong>… -+ @status -+ ++ ++ Kiritimati ++ tz_names ++ 基裏蒂馬提斯 + + -+ -+ Clearing flags on %1MiB <strong>%2</strong> partition… -+ @status -+ ++ ++ Kirov ++ tz_names ++ 基洛夫 + + -+ -+ Clearing flags on new partition… -+ @status -+ ++ ++ Kolkata ++ tz_names ++ 加爾格達 + + -+ -+ Setting flags <strong>%2</strong> on partition <strong>%1</strong>… -+ @status -+ ++ ++ Kosrae ++ tz_names ++ 科斯雷 + + -+ -+ Setting flags <strong>%3</strong> on %1MiB <strong>%2</strong> partition… -+ @status -+ ++ ++ Kralendijk ++ tz_names ++ 克羅地亞 + + -+ -+ Setting flags <strong>%1</strong> on new partition… -+ @status -+ ++ ++ Krasnoyarsk ++ tz_names ++ 克拉斯諾亞爾斯克 + + -+ -+ The installer failed to set flags on partition %1. -+ ++ ++ Kuala Lumpur ++ tz_names ++ 吉隆玻 + -+ -+ -+ SetPasswordJob + -+ -+ Set password for user %1 -+ ++ ++ Kuching ++ tz_names ++ 古晋 + + -+ -+ Setting password for user %1… -+ @status -+ ++ ++ Kuwait ++ tz_names ++ 科威特 + + -+ -+ Bad destination system path. -+ ++ ++ Kwajalein ++ tz_names ++ 誇賈林 + + -+ -+ rootMountPoint is %1 -+ ++ ++ La Paz ++ tz_names ++ 拉巴斯 + + -+ -+ Cannot disable root account. -+ ++ ++ Lagos ++ tz_names ++ 拉各斯 + + -+ -+ -+ usermod terminated with error code %1. -+ ++ ++ Libreville ++ tz_names ++ 利伯維爾 + + -+ -+ Cannot set password for user %1. -+ ++ ++ Lima ++ tz_names ++ 利馬 + -+ -+ -+ SetTimezoneJob + -+ -+ Setting timezone to %1/%2… -+ @status -+ ++ ++ Lindeman ++ tz_names ++ 林德曼 + + -+ -+ Cannot access selected timezone path. -+ @error -+ ++ ++ Lisbon ++ tz_names ++ 里斯本 + + -+ -+ Bad path: %1 -+ @error -+ ++ ++ Ljubljana ++ tz_names ++ 盧布亞納 + + -+ -+ -+ Cannot set timezone. -+ @error -+ ++ ++ Lome ++ tz_names ++ 多哥 + + -+ -+ Link creation failed, target: %1; link name: %2 -+ @info -+ ++ ++ London ++ tz_names ++ 倫敦 + + -+ -+ Cannot open /etc/timezone for writing -+ @info -+ ++ ++ Longyearbyen ++ tz_names ++ 龍宜爾比恩 + -+ -+ -+ SetupGroupsJob + -+ -+ Preparing groups… -+ @status -+ ++ ++ Lord Howe ++ tz_names ++ 豪勳爵 + + -+ -+ -+ Could not create groups in target system -+ ++ ++ Los Angeles ++ tz_names ++ 洛杉磯 + + -+ -+ These groups are missing in the target system: %1 -+ ++ ++ Lower Princes ++ tz_names ++ 聖馬丁 + -+ -+ -+ SetupSudoJob + -+ -+ Configuring <pre>sudo</pre> users… -+ @status -+ ++ ++ Luanda ++ tz_names ++ 魯安達 + + -+ -+ Cannot chmod sudoers file. -+ ++ ++ Lubumbashi ++ tz_names ++ 盧本巴希 + + -+ -+ Cannot create sudoers file for writing. -+ ++ ++ Lusaka ++ tz_names ++ 路沙卡 + -+ -+ -+ ShellProcessJob + -+ -+ Running shell processes… -+ @status -+ ++ ++ Luxembourg ++ tz_names ++ 盧森堡 + -+ -+ -+ SlideCounter + -+ -+ -+ %L1 / %L2 -+ slide counter, %1 of %2 (numeric) -+ ++ ++ Macau ++ tz_names ++ 澳門(中国) + -+ -+ -+ StandardButtons + -+ -+ &OK -+ ++ ++ Maceio ++ tz_names ++ 馬塞奧 + + -+ -+ &Yes -+ ++ ++ Macquarie ++ tz_names ++ 麥格理 + + -+ -+ &No -+ ++ ++ Madeira ++ tz_names ++ 馬德拉 + + -+ -+ &Cancel -+ ++ ++ Madrid ++ tz_names ++ 馬德里 + + -+ -+ &Close -+ ++ ++ Magadan ++ tz_names ++ 馬加丹 + -+ -+ -+ TrackingInstallJob + -+ -+ Installation feedback -+ ++ ++ Mahe ++ tz_names ++ 馬埃 + + -+ -+ Sending installation feedback… -+ @status -+ ++ ++ Majuro ++ tz_names ++ 麥哲魯 + + -+ -+ Internal error in install-tracking. -+ ++ ++ Makassar ++ tz_names ++ 望加錫 + + -+ -+ HTTP request timed out. -+ ++ ++ Malabo ++ tz_names ++ 馬拉博 + -+ -+ -+ TrackingKUserFeedbackJob + -+ -+ KDE user feedback -+ ++ ++ Maldives ++ tz_names ++ 瑪律地夫 + + -+ -+ Configuring KDE user feedback… -+ @status -+ ++ ++ Malta ++ tz_names ++ 馬爾他 + + -+ -+ -+ Error in KDE user feedback configuration. -+ ++ ++ Managua ++ tz_names ++ 馬納瓜 + + -+ -+ Could not configure KDE user feedback correctly, script error %1. -+ ++ ++ Manaus ++ tz_names ++ 馬瑙斯 + + -+ -+ Could not configure KDE user feedback correctly, Calamares error %1. -+ ++ ++ Manila ++ tz_names ++ 馬尼拉 + -+ -+ -+ TrackingMachineUpdateManagerJob + -+ -+ Machine feedback -+ ++ ++ Maputo ++ tz_names ++ 馬布多 + + -+ -+ Configuring machine feedback… -+ @status -+ ++ ++ Mariehamn ++ tz_names ++ 瑪麗港 + + -+ -+ -+ Error in machine feedback configuration. -+ ++ ++ Marigot ++ tz_names ++ 馬裏戈 + + -+ -+ Could not configure machine feedback correctly, script error %1. -+ ++ ++ Marquesas ++ tz_names ++ 馬克薩斯 + + -+ -+ Could not configure machine feedback correctly, Calamares error %1. -+ ++ ++ Martinique ++ tz_names ++ 馬提尼克島 + -+ -+ -+ TrackingPage + -+ -+ Placeholder -+ ++ ++ Maseru ++ tz_names ++ 馬塞魯 + + -+ -+ <html><head/><body><p>Click here to send <span style=" font-weight:600;">no information at all</span> about your installation.</p></body></html> -+ ++ ++ Matamoros ++ tz_names ++ 馬塔莫羅斯 + + -+ -+ <html><head/><body><p><a href="placeholder"><span style=" text-decoration: underline; color:#2980b9;">Click here for more information about user feedback</span></a></p></body></html> -+ ++ ++ Mauritius ++ tz_names ++ 模裡西斯 + + -+ -+ Tracking helps %1 to see how often it is installed, what hardware it is installed on and which applications are used. To see what will be sent, please click the help icon next to each area. -+ ++ ++ Mawson ++ tz_names ++ 莫森 + + -+ -+ By selecting this you will send information about your installation and hardware. This information will only be sent <b>once</b> after the installation finishes. -+ ++ ++ Mayotte ++ tz_names ++ 馬約特島 + + -+ -+ By selecting this you will periodically send information about your <b>machine</b> installation, hardware and applications, to %1. -+ ++ ++ Mazatlan ++ tz_names ++ 馬薩特蘭 + + -+ -+ By selecting this you will regularly send information about your <b>user</b> installation, hardware, applications and application usage patterns, to %1. -+ ++ ++ Mbabane ++ tz_names ++ 姆巴班 + -+ -+ -+ TrackingViewStep + -+ -+ Feedback -+ @title -+ ++ ++ McMurdo ++ tz_names ++ 麥克默多 + -+ -+ -+ UmountJob + -+ -+ Unmounting file systems… -+ @status -+ ++ ++ Melbourne ++ tz_names ++ 墨爾本 + + -+ -+ No target system available. -+ ++ ++ Menominee ++ tz_names ++ 梅諾米尼 + + -+ -+ No rootMountPoint is set. -+ ++ ++ Merida ++ tz_names ++ 梅里達 + -+ -+ -+ UsersPage + -+ -+ <small>If more than one person will use this computer, you can create multiple accounts after setup.</small> -+ ++ ++ Metlakatla ++ tz_names ++ 梅特拉卡特拉 + + -+ -+ <small>If more than one person will use this computer, you can create multiple accounts after installation.</small> -+ ++ ++ Mexico City ++ tz_names ++ 墨西哥城 + -+ -+ -+ UsersQmlViewStep + -+ -+ Users -+ ++ ++ Midway ++ tz_names ++ 中途島 + -+ -+ -+ UsersViewStep + -+ -+ Users -+ ++ ++ Minsk ++ tz_names ++ 明斯克 + -+ -+ -+ VariantModel + -+ -+ Key -+ Column header for key/value -+ ++ ++ Miquelon ++ tz_names ++ 密克隆 + + -+ -+ Value -+ Column header for key/value -+ ++ ++ Mogadishu ++ tz_names ++ 摩加迪休 + -+ -+ -+ VolumeGroupBaseDialog + -+ -+ Create Volume Group -+ ++ ++ Monaco ++ tz_names ++ 摩納哥 + + -+ -+ List of Physical Volumes -+ ++ ++ Moncton ++ tz_names ++ 蒙克頓 + + -+ -+ Volume Group Name: -+ ++ ++ Monrovia ++ tz_names ++ 蒙羅維亞 + + -+ -+ Volume Group Type: -+ ++ ++ Monterrey ++ tz_names ++ 蒙特雷 + + -+ -+ Physical Extent Size: -+ ++ ++ Montevideo ++ tz_names ++ 蒙特維多 + + -+ -+ MiB -+ ++ ++ Montserrat ++ tz_names ++ 蒙特塞拉特 + + -+ -+ Total Size: -+ ++ ++ Moscow ++ tz_names ++ 莫斯科 + + -+ -+ Used Size: -+ ++ ++ Muscat ++ tz_names ++ 馬斯喀特 + + -+ -+ Total Sectors: -+ ++ ++ Nairobi ++ tz_names ++ 奈洛比 + + -+ -+ Quantity of LVs: -+ ++ ++ Nassau ++ tz_names ++ 拿索 + -+ -+ -+ WelcomePage + -+ -+ -+ Select application and system language -+ ++ ++ Nauru ++ tz_names ++ 瑙魯 + + -+ -+ Open donations website -+ ++ ++ Ndjamena ++ tz_names ++ 恩賈梅納 + + -+ -+ &Donate -+ ++ ++ New York ++ tz_names ++ 紐約 + + -+ -+ Open help and support website -+ ++ ++ Niamey ++ tz_names ++ 尼阿美 + + -+ -+ &Support -+ ++ ++ Nicosia ++ tz_names ++ 尼古西亞 + + -+ -+ Open issues and bug-tracking website -+ ++ ++ Nipigon ++ tz_names ++ 尼皮貢 + + -+ -+ &Known issues -+ ++ ++ Niue ++ tz_names ++ 紐埃 + + -+ -+ Open release notes website -+ ++ ++ Nome ++ tz_names ++ 諾姆 + + -+ -+ &Release notes -+ ++ ++ Norfolk ++ tz_names ++ 諾福克 + + -+ -+ About %1 Setup -+ @title -+ ++ ++ Noronha ++ tz_names ++ 諾羅尼亞 + + -+ -+ About %1 Installer -+ @title -+ ++ ++ North Dakota/Beulah ++ tz_names ++ 北達科他州/比拉 + + -+ -+ %1 Support -+ @action -+ ++ ++ North Dakota/Center ++ tz_names ++ 北達科他州/中心 + -+ -+ -+ WelcomeQmlViewStep + -+ -+ Welcome -+ @title -+ ++ ++ North Dakota/New Salem ++ tz_names ++ 北達科他州/新賽勒姆 + -+ -+ -+ WelcomeViewStep + -+ -+ Welcome -+ @title -+ ++ ++ Nouakchott ++ tz_names ++ 諾克少 + -+ -+ -+ ZfsJob + -+ -+ Creating ZFS pools and datasets… -+ @status -+ ++ ++ Noumea ++ tz_names ++ 諾美亞 + + -+ -+ Failed to create zpool on -+ ++ ++ Novokuznetsk ++ tz_names ++ 新庫茲涅茨克 + + -+ -+ Configuration Error -+ ++ ++ Novosibirsk ++ tz_names ++ 新西伯利亞 + + -+ -+ No partitions are available for ZFS. -+ ++ ++ Ojinaga ++ tz_names ++ 魁北克 + + -+ -+ Internal data missing -+ ++ ++ Omsk ++ tz_names ++ 鄂木斯克 + + -+ -+ -+ Failed to create zpool -+ ++ ++ Oral ++ tz_names ++ 朵拉 + + -+ -+ Failed to create dataset -+ ++ ++ Oslo ++ tz_names ++ 奧斯陸 + + -+ -+ The output was: -+ ++ ++ Ouagadougou ++ tz_names ++ 瓦加杜古 + -+ -+ -+ calamares-sidebar + -+ -+ About -+ ++ ++ Pago Pago ++ tz_names ++ 帕果帕果 + + -+ -+ Debug -+ ++ ++ Palau ++ tz_names ++ 帕勞 + + -+ -+ About -+ @button -+ ++ ++ Palmer ++ tz_names ++ 帕爾默 + + -+ -+ Show information about Calamares -+ @tooltip -+ ++ ++ Panama ++ tz_names ++ 巴拿馬 + + -+ -+ Debug -+ @button -+ ++ ++ Pangnirtung ++ tz_names ++ 巴芬島的旁涅唐 + + -+ -+ Show debug information -+ @tooltip -+ ++ ++ Paramaribo ++ tz_names ++ 巴拉馬利波 + -+ -+ -+ finishedq + -+ -+ Installation Completed -+ ++ ++ Paris ++ tz_names ++ 巴黎 + + -+ -+ %1 has been installed on your computer.<br/> -+ You may now restart into your new system, or continue using the Live environment. -+ ++ ++ Perth ++ tz_names ++ 珀斯 + + -+ -+ Close Installer -+ ++ ++ Phnom Penh ++ tz_names ++ 金邊 + + -+ -+ Restart System -+ ++ ++ Phoenix ++ tz_names ++ 鳳凰城 + + -+ -+ <p>A full log of the install is available as installation.log in the home directory of the Live user.<br/> -+ This log is copied to /var/log/installation.log of the target system.</p> -+ ++ ++ Pitcairn ++ tz_names ++ 皮特凱恩 + -+ -+ -+ finishedq-qt6 + -+ -+ Installation Completed -+ @title -+ ++ ++ Podgorica ++ tz_names ++ 波德戈裡察 + + -+ -+ %1 has been installed on your computer.<br/> -+ You may now restart into your new system, or continue using the Live environment. -+ @info, %1 is the product name -+ ++ ++ Pohnpei ++ tz_names ++ 波納佩島 + + -+ -+ Close Installer -+ @button -+ ++ ++ Pontianak ++ tz_names ++ 坤甸 + + -+ -+ Restart System -+ @button -+ ++ ++ Port Moresby ++ tz_names ++ 莫爾斯貝港 + + -+ -+ <p>A full log of the install is available as installation.log in the home directory of the Live user.<br/> -+ This log is copied to /var/log/installation.log of the target system.</p> -+ @info -+ ++ ++ Port of Spain ++ tz_names ++ 西班牙港 + -+ -+ -+ finishedq@mobile + -+ -+ Installation Completed -+ @title -+ ++ ++ Port-au-Prince ++ tz_names ++ 太子港 + + -+ -+ %1 has been installed on your computer.<br/> -+ You may now restart your device. -+ @info, %1 is the product name -+ ++ ++ Porto Velho ++ tz_names ++ 維略港 + + -+ -+ Close -+ @button -+ ++ ++ Porto-Novo ++ tz_names ++ 波多洛 + + -+ -+ Restart -+ @button -+ ++ ++ Prague ++ tz_names ++ 布拉格 + -+ -+ -+ keyboardq + -+ -+ Select a layout to activate keyboard preview -+ @label -+ ++ ++ Puerto Rico ++ tz_names ++ 波多黎各 + + -+ -+ <b>Keyboard model:&nbsp;&nbsp;</b> -+ @label -+ ++ ++ Punta Arenas ++ tz_names ++ 蓬塔阿雷納斯 + + -+ -+ Layout -+ @label -+ ++ ++ Pyongyang ++ tz_names ++ 平壤 + + -+ -+ Variant -+ @label -+ ++ ++ Qatar ++ tz_names ++ 卡塔爾 + + -+ -+ Type here to test your keyboard… -+ @label -+ ++ ++ Qostanay ++ tz_names ++ 庫斯塔 + -+ -+ -+ keyboardq-qt6 + -+ -+ Select a layout to activate keyboard preview -+ @label -+ ++ ++ Qyzylorda ++ tz_names ++ 克孜勒奧爾達 + + -+ -+ <b>Keyboard model:&nbsp;&nbsp;</b> -+ @label -+ ++ ++ Rainy River ++ tz_names ++ 雷尼河 + + -+ -+ Layout -+ @label -+ ++ ++ Rankin Inlet ++ tz_names ++ 蘭京海口 + + -+ -+ Variant -+ @label -+ ++ ++ Rarotonga ++ tz_names ++ 拉羅湯加 + + -+ -+ Type here to test your keyboard… -+ @label -+ ++ ++ Recife ++ tz_names ++ 累西腓 + -+ -+ -+ localeq + -+ -+ -+ Change -+ @button -+ ++ ++ Regina ++ tz_names ++ 里賈納 + + -+ -+ <h3>Languages</h3> </br> -+ The system locale setting affects the language and character set for some command line user interface elements. The current setting is <strong>%1</strong>. -+ @info -+ ++ ++ Resolute ++ tz_names ++ 雷索盧特 + + -+ -+ <h3>Locales</h3> </br> -+ The system locale setting affects the numbers and dates format. The current setting is <strong>%1</strong>. -+ @info -+ ++ ++ Reunion ++ tz_names ++ 留尼旺島 + -+ -+ -+ localeq-qt6 + -+ -+ -+ Change -+ @button -+ ++ ++ Reykjavik ++ tz_names ++ 雷克雅維克 + + -+ -+ <h3>Languages</h3> </br> -+ The system locale setting affects the language and character set for some command line user interface elements. The current setting is <strong>%1</strong>. -+ @info -+ ++ ++ Riga ++ tz_names ++ 裏加 + + -+ -+ <h3>Locales</h3> </br> -+ The system locale setting affects the numbers and dates format. The current setting is <strong>%1</strong>. -+ @info -+ ++ ++ Rio Branco ++ tz_names ++ 裏奧·布蘭科 + -+ -+ -+ notesqml + -+ -+ <h3>%1</h3> -+ <p>These are example release notes.</p> -+ ++ ++ Riyadh ++ tz_names ++ 利雅德 + -+ -+ -+ packagechooserq + -+ -+ LibreOffice is a powerful and free office suite, used by millions of people around the world. It includes several applications that make it the most versatile Free and Open Source office suite on the market.<br/> -+ Default option. -+ ++ ++ Rome ++ tz_names ++ 羅馬 + + -+ -+ LibreOffice -+ ++ ++ Rothera ++ tz_names ++ 羅瑟拉 + + -+ -+ If you don't want to install an office suite, just select No Office Suite. You can always add one (or more) later on your installed system as the need arrives. -+ ++ ++ Saipan ++ tz_names ++ 塞班島 + + -+ -+ No Office Suite -+ ++ ++ Sakhalin ++ tz_names ++ 薩哈林 + + -+ -+ Create a minimal Desktop install, remove all extra applications and decide later on what you would like to add to your system. Examples of what won't be on such an install, there will be no Office Suite, no media players, no image viewer or print support. It will be just a desktop, file browser, package manager, text editor and simple web-browser. -+ ++ ++ Samara ++ tz_names ++ 薩馬拉 + + -+ -+ Minimal Install -+ ++ ++ Samarkand ++ tz_names ++ 撒馬爾罕 + + -+ -+ Please select an option for your install, or use the default: LibreOffice included. -+ ++ ++ San Marino ++ tz_names ++ 聖馬利諾 + -+ -+ -+ packagechooserq-qt6 + -+ -+ LibreOffice is a powerful and free office suite, used by millions of people around the world. It includes several applications that make it the most versatile Free and Open Source office suite on the market.<br/> -+ Default option. -+ ++ ++ Santarem ++ tz_names ++ 聖塔倫 + + -+ -+ LibreOffice -+ ++ ++ Santiago ++ tz_names ++ 聖地牙哥 + + -+ -+ If you don't want to install an office suite, just select No Office Suite. You can always add one (or more) later on your installed system as the need arrives. -+ ++ ++ Santo Domingo ++ tz_names ++ 聖多明哥 + + -+ -+ No Office Suite -+ ++ ++ Sao Paulo ++ tz_names ++ 聖保羅 + + -+ -+ Create a minimal Desktop install, remove all extra applications and decide later on what you would like to add to your system. Examples of what won't be on such an install, there will be no Office Suite, no media players, no image viewer or print support. It will be just a desktop, file browser, package manager, text editor and simple web-browser. -+ ++ ++ Sao Tome ++ tz_names ++ 聖多美 + + -+ -+ Minimal Install -+ ++ ++ Sarajevo ++ tz_names ++ 塞拉耶佛 + + -+ -+ Please select an option for your install, or use the default: LibreOffice included. -+ ++ ++ Saratov ++ tz_names ++ 薩拉托夫 + -+ -+ -+ release_notes + -+ -+ ### %1 -+This an example QML file, showing options in Markdown with Flickable content. -+ -+QML with RichText can use HTML tags, with Markdown it uses the simple Markdown syntax, Flickable content is useful for touchscreens. -+ -+**This is bold text** -+ -+*This is italic text* -+ -+_This is underlined text_ -+ -+> blockquote -+ -+~~This is strikethrough~~ -+ -+Code example: -+``` -+ls -l /home -+``` -+ -+**Lists:** -+ * Intel CPU systems -+ * AMD CPU systems -+ -+The vertical scrollbar is adjustable, current width set to 10. -+ ++ ++ Scoresbysund ++ tz_names ++ 斯科斯比基金 + + -+ -+ Back -+ ++ ++ Seoul ++ tz_names ++ 首爾 + -+ -+ -+ usersq + -+ -+ Pick your user name and credentials to login and perform admin tasks -+ ++ ++ Shanghai ++ tz_names ++ 上海 + + -+ -+ What is your name? -+ ++ ++ Simferopol ++ tz_names ++ 辛菲羅波爾 + + -+ -+ Your full name -+ ++ ++ Singapore ++ tz_names ++ 新加坡 + + -+ -+ What name do you want to use to log in? -+ ++ ++ Sitka ++ tz_names ++ 錫特卡 + + -+ -+ Login name -+ ++ ++ Skopje ++ tz_names ++ 斯高彼亞 + + -+ -+ If more than one person will use this computer, you can create multiple accounts after installation. -+ ++ ++ Sofia ++ tz_names ++ 索菲亞 + + -+ -+ Only lowercase letters, numbers, underscore and hyphen are allowed. -+ ++ ++ South Georgia ++ tz_names ++ 南喬治亞州 + + -+ -+ root is not allowed as username. -+ ++ ++ Srednekolymsk ++ tz_names ++ 雅庫特 + + -+ -+ What is the name of this computer? -+ ++ ++ St Barthelemy ++ tz_names ++ 聖巴泰勒米 + + -+ -+ Computer name -+ ++ ++ St Helena ++ tz_names ++ 聖赫倫那 + + -+ -+ This name will be used if you make the computer visible to others on a network. -+ ++ ++ St Johns ++ tz_names ++ 聖約翰 + + -+ -+ Only letters, numbers, underscore and hyphen are allowed, minimal of two characters. -+ ++ ++ St Kitts ++ tz_names ++ 聖基茨 + + -+ -+ localhost is not allowed as hostname. -+ ++ ++ St Lucia ++ tz_names ++ 聖盧西亞 + + -+ -+ Choose a password to keep your account safe. -+ ++ ++ St Thomas ++ tz_names ++ 聖托馬斯 + + -+ -+ Password -+ ++ ++ St Vincent ++ tz_names ++ 聖文森特 + + -+ -+ Repeat password -+ ++ ++ Stanley ++ tz_names ++ 斯坦利 + + -+ -+ Enter the same password twice, so that it can be checked for typing errors. A good password will contain a mixture of letters, numbers and punctuation, should be at least eight characters long, and should be changed at regular intervals. -+ ++ ++ Stockholm ++ tz_names ++ 斯德哥爾摩 + + -+ -+ Reuse user password as root password -+ ++ ++ Swift Current ++ tz_names ++ 斯威夫特卡倫特 + + -+ -+ Use the same password for the administrator account. -+ ++ ++ Sydney ++ tz_names ++ 雪梨 + + -+ -+ Choose a root password to keep your account safe. -+ ++ ++ Syowa ++ tz_names ++ 聖約瑟 + + -+ -+ Root password -+ ++ ++ Tahiti ++ tz_names ++ 大溪地 + + -+ -+ Repeat root password -+ ++ ++ Taipei(China) ++ tz_names ++ 臺北(中国) + + -+ -+ Enter the same password twice, so that it can be checked for typing errors. -+ ++ ++ Tallinn ++ tz_names ++ 數位行 + + -+ -+ Log in automatically without asking for the password -+ ++ ++ Tarawa ++ tz_names ++ 塔拉瓦 + + -+ -+ Validate passwords quality -+ ++ ++ Tashkent ++ tz_names ++ 塔什干 + + -+ -+ When this box is checked, password-strength checking is done and you will not be able to use a weak password. -+ ++ ++ Tbilisi ++ tz_names ++ 第比利斯 + -+ -+ -+ usersq-qt6 + -+ -+ Pick your user name and credentials to login and perform admin tasks -+ ++ ++ Tegucigalpa ++ tz_names ++ 德古西加巴 + + -+ -+ What is your name? -+ ++ ++ Tehran ++ tz_names ++ 德黑蘭 + + -+ -+ Your full name -+ ++ ++ Thimphu ++ tz_names ++ 辛布 + + -+ -+ What name do you want to use to log in? -+ ++ ++ Thule ++ tz_names ++ 圖勒 + + -+ -+ Login name -+ ++ ++ Thunder Bay ++ tz_names ++ 雷灣 + + -+ -+ If more than one person will use this computer, you can create multiple accounts after installation. -+ ++ ++ Tijuana ++ tz_names ++ 蒂華納 + + -+ -+ Only lowercase letters, numbers, underscore and hyphen are allowed. -+ ++ ++ Tirane ++ tz_names ++ 地拉那 + + -+ -+ root is not allowed as username. -+ ++ ++ Tokyo ++ tz_names ++ 東京 + + -+ -+ What is the name of this computer? -+ ++ ++ Tomsk ++ tz_names ++ 托木斯克 + + -+ -+ Computer name -+ ++ ++ Tongatapu ++ tz_names ++ 湯加塔布 + + -+ -+ This name will be used if you make the computer visible to others on a network. -+ ++ ++ Toronto ++ tz_names ++ 多倫多 + + -+ -+ Only letters, numbers, underscore and hyphen are allowed, minimal of two characters. -+ ++ ++ Tortola ++ tz_names ++ 托托拉島 + + -+ -+ localhost is not allowed as hostname. -+ ++ ++ Tripoli ++ tz_names ++ 的黎波里 + + -+ -+ Choose a password to keep your account safe. -+ ++ ++ Troll ++ tz_names ++ 特羅爾海坦 + + -+ -+ Password -+ ++ ++ Tunis ++ tz_names ++ 突尼斯 + + -+ -+ Repeat password -+ ++ ++ Ulaanbaatar ++ tz_names ++ 烏蘭巴托 + + -+ -+ Enter the same password twice, so that it can be checked for typing errors. A good password will contain a mixture of letters, numbers and punctuation, should be at least eight characters long, and should be changed at regular intervals. -+ ++ ++ Ulyanovsk ++ tz_names ++ 烏裡揚諾夫斯克 + + -+ -+ Reuse user password as root password -+ ++ ++ Urumqi ++ tz_names ++ 烏魯木齊 + + -+ -+ Use the same password for the administrator account. -+ ++ ++ Ust-Nera ++ tz_names ++ 烏斯季挪拉 + + -+ -+ Choose a root password to keep your account safe. -+ ++ ++ Uzhgorod ++ tz_names ++ 烏日哥羅德 + + -+ -+ Root password -+ ++ ++ Vaduz ++ tz_names ++ 瓦都茲 + + -+ -+ Repeat root password -+ ++ ++ Vancouver ++ tz_names ++ 溫哥華 + + -+ -+ Enter the same password twice, so that it can be checked for typing errors. -+ ++ ++ Vatican ++ tz_names ++ 梵蒂岡 + + -+ -+ Log in automatically without asking for the password -+ ++ ++ Vienna ++ tz_names ++ 維也納 + + -+ -+ Validate passwords quality -+ ++ ++ Vientiane ++ tz_names ++ 萬象 + + -+ -+ When this box is checked, password-strength checking is done and you will not be able to use a weak password. -+ ++ ++ Vilnius ++ tz_names ++ 維爾紐斯 + -+ -+ -+ welcomeq + -+ -+ <h3>Welcome to the %1 <quote>%2</quote> installer</h3> -+ <p>This program will ask you some questions and set up %1 on your computer.</p> -+ ++ ++ Vladivostok ++ tz_names ++ 符拉迪沃斯托克 + + -+ -+ Support -+ ++ ++ Volgograd ++ tz_names ++ 伏爾加格勒 + + -+ -+ Known Issues -+ ++ ++ Vostok ++ tz_names ++ 沃斯托克 + + -+ -+ Release Notes -+ ++ ++ Wake ++ tz_names ++ 韋克 + + -+ -+ Donate -+ ++ ++ Wallis ++ tz_names ++ 沃利斯 + -+ -+ -+ welcomeq-qt6 + -+ -+ <h3>Welcome to the %1 <quote>%2</quote> installer</h3> -+ <p>This program will ask you some questions and set up %1 on your computer.</p> -+ ++ ++ Warsaw ++ tz_names ++ 華沙 + + -+ -+ Support -+ ++ ++ Whitehorse ++ tz_names ++ 懷特霍斯 + + -+ -+ Known Issues -+ ++ ++ Windhoek ++ tz_names ++ 溫吐克 + + -+ -+ Release Notes -+ ++ ++ Winnipeg ++ tz_names ++ 溫尼伯 + + -+ -+ Donate -+ ++ ++ Yakutat ++ tz_names ++ 雅庫特 + -+ -+ -diff --git a/lang/calamares_zh_CN.ts b/lang/calamares_zh_CN.ts -index f16037b..75ffe95 100644 ---- a/lang/calamares_zh_CN.ts -+++ b/lang/calamares_zh_CN.ts -@@ -1,4875 +1,5008 @@ - - -- -- -+ -+ - AboutData - -- -- <h1>%1</h1><br/><strong>%2<br/> for %3</strong><br/><br/> -- <h1>%1</h1><br/><strong>%2<br/> for %3</strong><br/><br/> -+ -+ <br/><h2>Release:%1</h2><br/> -+ <br/><h1>发行版本:%1</h1><br/> - - -- -- Thanks to <a href="https://calamares.io/team/">the Calamares team</a> and the <a href="https://app.transifex.com/calamares/calamares/">Calamares translators team</a>. -- 感谢 <a href="https://calamares.io/team/">Calamares 团队</a> 以及 <a href="https://app.transifex.com/calamares/calamares/">Calamares 翻译团队</a>。 -+ -+ <strong>Thanks to the openEuler team.</strong> -+ <strong>感谢 openEuler 团队。</strong> - - -- -- <a href="https://calamares.io/">Calamares</a> development is sponsored by <br/><a href="http://www.blue-systems.com/">Blue Systems</a> - Liberating Software. -- <a href="https://calamares.io/">Calamares</a> 的开发由 <br/> <a href="http://www.blue-systems.com/">Blue Systems</a> - Liberating Software 赞助。 -+ <a href="https://calamares.io/">Calamares</a> development is sponsored by <br/><a href="http://www.blue-systems.com/">Blue Systems</a> - Liberating Software. -+ <a href="https://calamares.io/">Calamares</a> 的开发由 <br/> <a href="http://www.blue-systems.com/">Blue Systems</a> - Liberating Software 赞助。 - - -- -- Copyright %1-%2 %3 &lt;%4&gt;<br/> -- Copyright year-year Name <email-address> -- Copyright %1-%2 %3 &lt;%4&gt;<br/> -+ -+ Copyright %1-%2 %3 &lt;%4&gt;<br/> -+ Copyright year-year Name <email-address> -+ Copyright %1-%2 %3 &lt;%4&gt;<br/> - -- -- -+ -+ -+ ActiveDirectoryJob + -+ -+ Enroll system in Active Directory -+ @label -+ ++ ++ Yakutsk ++ tz_names ++ 亞庫次克 + + -+ -+ Enrolling system in Active Directory… -+ @status -+ ++ ++ Yangon ++ tz_names ++ 仰光 + -+ -+ - AutoMountManagementJob - -- -- Managing auto-mount settings… -- @status -- 管理自动挂载设置… -+ -+ Managing auto-mount settings… -+ @status -+ 管理自动挂载设置… - -- -- -+ -+ - BootInfoWidget - -- -- The <strong>boot environment</strong> of this system.<br><br>Older x86 systems only support <strong>BIOS</strong>.<br>Modern systems usually use <strong>EFI</strong>, but may also show up as BIOS if started in compatibility mode. -- 这个系统的<strong>引导环境</strong>。<br><br>较旧的 x86 系统只支持 <strong>BIOS</strong>。<br>现代的系统则通常使用 <strong>EFI</strong>,但若引导时使用了兼容模式,也可以变为 BIOS。 -+ -+ The <strong>boot environment</strong> of this system.<br><br>Older x86 systems only support <strong>BIOS</strong>.<br>Modern systems usually use <strong>EFI</strong>, but may also show up as BIOS if started in compatibility mode. -+ 这个系统的<strong>引导环境</strong>。<br><br>较旧的 x86 系统只支持 <strong>BIOS</strong>。<br>现代的系统则通常使用 <strong>EFI</strong>,但若引导时使用了兼容模式,也可以变为 BIOS。 - - -- -- This system was started with an <strong>EFI</strong> boot environment.<br><br>To configure startup from an EFI environment, this installer must deploy a boot loader application, like <strong>GRUB</strong> or <strong>systemd-boot</strong> on an <strong>EFI System Partition</strong>. This is automatic, unless you choose manual partitioning, in which case you must choose it or create it on your own. -- 此系统从 <strong>EFI</strong> 引导环境启动。<br><br>若要配置EFI环境的启动项,本安装器必须在<strong>EFI系统分区</strong>中安装一个引导程序, 例如 <strong>GRUB</strong>或 <strong>systemd-boot</strong> 。这个过程是自动的,但若你选择手动分区,那你将必须手动选择或者创建。 -+ -+ This system was started with an <strong>EFI</strong> boot environment.<br><br>To configure startup from an EFI environment, this installer must deploy a boot loader application, like <strong>GRUB</strong> or <strong>systemd-boot</strong> on an <strong>EFI System Partition</strong>. This is automatic, unless you choose manual partitioning, in which case you must choose it or create it on your own. -+ 此系统从 <strong>EFI</strong> 引导环境启动。<br><br>若要配置EFI环境的启动项,本安装器必须在<strong>EFI系统分区</strong>中安装一个引导程序, 例如 <strong>GRUB</strong>或 <strong>systemd-boot</strong> 。这个过程是自动的,但若你选择手动分区,那你将必须手动选择或者创建。 - - -- -- This system was started with a <strong>BIOS</strong> boot environment.<br><br>To configure startup from a BIOS environment, this installer must install a boot loader, like <strong>GRUB</strong>, either at the beginning of a partition or on the <strong>Master Boot Record</strong> near the beginning of the partition table (preferred). This is automatic, unless you choose manual partitioning, in which case you must set it up on your own. -- 这个系统从 <strong>BIOS</strong> 引导环境启动。<br><br> -+ -+ This system was started with a <strong>BIOS</strong> boot environment.<br><br>To configure startup from a BIOS environment, this installer must install a boot loader, like <strong>GRUB</strong>, either at the beginning of a partition or on the <strong>Master Boot Record</strong> near the beginning of the partition table (preferred). This is automatic, unless you choose manual partitioning, in which case you must set it up on your own. -+ 这个系统从 <strong>BIOS</strong> 引导环境启动。<br><br> - 要从 BIOS 环境引导,本安装程序必须安装引导器(如 <strong>GRUB</strong>),一般而言要么安装在分区的开头,要么就是在靠进分区表开头的 <strong>主引导记录</strong>(推荐)中。这个步骤是自动的,除非您选择手动分区——此时您必须自行配置。 - -- -- -+ -+ - BootLoaderModel - -- -- Master Boot Record of %1 -- @info -- 主引导记录 %1 -+ -+ Master Boot Record of %1 -+ @info -+ 主引导记录 %1 - - -- -- Boot Partition -- @info -- 引导分区 -+ -+ Boot Partition -+ @info -+ 引导分区 - - -- -- System Partition -- @info -- 系统分区 -+ -+ System Partition -+ @info -+ 系统分区 - - -- -- Do not install a boot loader -- @label -- 不要安装引导程序 -+ -+ Do not install a boot loader -+ @label -+ 不要安装引导程序 - - -- -- %1 (%2) -- %1 (%2) -+ -+ %1 (%2) -+ %1 (%2) - -- -- -+ -+ - Calamares::BlankViewStep - -- -- Blank Page -- 空白页 -+ -+ Blank Page -+ 空白页 - -- -- -+ -+ - Calamares::DebugWindow - -- -- GlobalStorage -- 全局存储 -+ -+ GlobalStorage -+ 全局存储 - - -- -- JobQueue -- 任务队列 -+ -+ JobQueue -+ 任务队列 - - -- -- Modules -- 模块 -+ -+ Modules -+ 模块 - - -- -- Type: -- 类型: -+ -+ Type: -+ 类型: - - -- -- -- none -- -+ -+ -+ none -+ - - -- -- Interface: -- 接口: -+ -+ Interface: -+ 接口: - - -- -- Crashes Calamares, so that Dr. Konqi can look at it. -- 使 Calamares 崩溃,以便 Dr. Konqi 查看。 -+ -+ Crashes Calamares, so that Dr. Konqi can look at it. -+ 使 Calamares 崩溃,以便 Dr. Konqi 查看。 - - -- -- Reloads the stylesheet from the branding directory. -- 从Branding目录重新加载样式表 -+ -+ Reloads the stylesheet from the branding directory. -+ 从Branding目录重新加载样式表 - - -- -- Reload Stylesheet -- 重载样式表 -+ -+ Reload Stylesheet -+ 重载样式表 - - -- -- Displays the tree of widget names in the log (for stylesheet debugging). -- 在日志中显示小部件名称树(用于样式表调试)。 -+ -+ Displays the tree of widget names in the log (for stylesheet debugging). -+ 在日志中显示小部件名称树(用于样式表调试)。 - - -- -- Widget Tree -- 树形控件 -+ -+ Widget Tree -+ 树形控件 - - -- -- Uploads the session log to the configured pastebin. -- 将会话日志上传至预设的pastebin网站 -+ -+ Uploads the session log to the configured pastebin. -+ 将会话日志上传至预设的pastebin网站 - - -- -- Send Session Log -- 发送会话日志 -+ -+ Send Session Log -+ 发送会话日志 - - -- -- Debug Information -- @title -- 调试信息 -+ -+ Debug Information -+ @title -+ 调试信息 - -- -- -+ -+ - Calamares::ExecutionViewStep - -- -- %p% -- Progress percentage indicator: %p is where the number 0..100 is placed -- %p% -+ -+ %p% -+ Progress percentage indicator: %p is where the number 0..100 is placed -+ %p% - - -- -- Set Up -- @label -- 配置 -+ -+ Set Up -+ @label -+ 配置 - - -- -- Install -- @label -- 安装 -+ -+ Install -+ @label -+ 安装 - -- -- -+ -+ -+ Toggle log -+ 日志 ++ ++ ++ Yekaterinburg ++ tz_names ++ 葉卡捷琳堡 + -+ -+ - Calamares::FailJob - -- -- Job failed (%1) -- 任务失败(%1) -+ -+ Job failed (%1) -+ 任务失败(%1) - - -- -- Programmed job failure was explicitly requested. -- 出现明确抛出的任务执行失败。 -+ -+ Programmed job failure was explicitly requested. -+ 出现明确抛出的任务执行失败。 - -- -- -+ -+ - Calamares::JobThread - -- -- Done -- 完成 -+ -+ Done -+ 完成 - -- -- -+ -+ - Calamares::NamedJob - -- -- Example job (%1) -- 示例任务 (%1) -+ -+ Example job (%1) -+ 示例任务 (%1) - -- -- -+ -+ - Calamares::ProcessJob - -- -- Running command %1 in target system… -- @status -- 正在目标系统重执行 %1 命令…… -+ -+ Running command %1 in target system… -+ @status -+ 正在目标系统重执行 %1 命令…… - - -- -- Running command %1… -- @status -- 正在执行 %1 命令…… -+ -+ Running command %1… -+ @status -+ 正在执行 %1 命令…… - -- -- -+ -+ - Calamares::Python::Job - -- -- Running %1 operation. -- 正在运行 %1 操作。 -+ -+ Running %1 operation. -+ 正在运行 %1 操作。 - - -- -- Bad working directory path -- 错误的工作目录路径 -+ -+ Bad working directory path -+ 错误的工作目录路径 - - -- -- Working directory %1 for python job %2 is not readable. -- 用于 python 任务 %2 的工作目录 %1 不可读。 -+ -+ Working directory %1 for python job %2 is not readable. -+ 用于 python 任务 %2 的工作目录 %1 不可读。 - - -- -- -- -- -- -- -- Bad main script file -- 错误的主脚本文件 -+ -+ -+ -+ -+ -+ -+ Bad main script file -+ 错误的主脚本文件 - - -- -- Main script file %1 for python job %2 is not readable. -- 用于 python 任务 %2 的主脚本文件 %1 不可读。 -+ -+ Main script file %1 for python job %2 is not readable. -+ 用于 python 任务 %2 的主脚本文件 %1 不可读。 - - -- -- Bad internal script -- 内部脚本错误 -+ -+ Bad internal script -+ 内部脚本错误 - - -- -- Internal script for python job %1 raised an exception. -- Python 任务 %1 的内部脚本发生意外。 -+ -+ Internal script for python job %1 raised an exception. -+ Python 任务 %1 的内部脚本发生意外。 - - -- -- Main script file %1 for python job %2 could not be loaded because it raised an exception. -- 无法加载 python 作业 %2 的主脚本文件 %1 ,因为它引发了异常。 -+ -+ Main script file %1 for python job %2 could not be loaded because it raised an exception. -+ 无法加载 python 作业 %2 的主脚本文件 %1 ,因为它引发了异常。 - - -- -- Main script file %1 for python job %2 raised an exception. -- 用于 python 任务 %2 的主脚本文件 %1 引发了异常。 -+ -+ Main script file %1 for python job %2 raised an exception. -+ 用于 python 任务 %2 的主脚本文件 %1 引发了异常。 - - -- -- -- Main script file %1 for python job %2 returned invalid results. -- 用于 python 任务 %2 的主脚本文件 %1 回传了无效结果。 -+ -+ -+ Main script file %1 for python job %2 returned invalid results. -+ 用于 python 任务 %2 的主脚本文件 %1 回传了无效结果。 - - -- -- Main script file %1 for python job %2 does not contain a run() function. -- 用于 python 任务 %2 的主脚本文件 %1 未包含 run() 函数。 -+ -+ Main script file %1 for python job %2 does not contain a run() function. -+ 用于 python 任务 %2 的主脚本文件 %1 未包含 run() 函数。 - -- -- -+ -+ - Calamares::PythonJob - -- -- Running %1 operation… -- @status -- 正在运行 %1 操作…… -+ -+ Running %1 operation… -+ @status -+ 正在运行 %1 操作…… - - -- -- Bad working directory path -- @error -- 错误的工作目录路径 -+ -+ Bad working directory path -+ @error -+ 错误的工作目录路径 - - -- -- Working directory %1 for python job %2 is not readable. -- @error -- 用于 python 任务 %2 的工作目录 %1 不可读。 -+ -+ Working directory %1 for python job %2 is not readable. -+ @error -+ 用于 python 任务 %2 的工作目录 %1 不可读。 - - -- -- Bad main script file -- @error -- 错误的主脚本文件 -+ -+ Bad main script file -+ @error -+ 错误的主脚本文件 - - -- -- Main script file %1 for python job %2 is not readable. -- @error -- 用于 python 任务 %2 的主脚本文件 %1 不可读。 -+ -+ Main script file %1 for python job %2 is not readable. -+ @error -+ 用于 python 任务 %2 的主脚本文件 %1 不可读。 - - -- -- Boost.Python error in job "%1" -- @error -- 任务“%1”出现 Boost.Python 错误 -+ -+ Boost.Python error in job "%1" -+ @error -+ 任务“%1”出现 Boost.Python 错误 - -- -- -+ -+ - Calamares::QmlViewStep - -- -- Loading… -- @status -- 正在加载... -+ -+ Loading… -+ @status -+ 正在加载... - - -- -- QML step <i>%1</i>. -- @label -- QML 步骤 <i>%1</i>. -+ -+ QML step <i>%1</i>. -+ @label -+ QML 步骤 <i>%1</i>. - - -- -- Loading failed. -- @info -- 加载失败。 -+ -+ Loading failed. -+ @info -+ 加载失败。 - -- -- -+ -+ - Calamares::RequirementsChecker - -- -- Requirements checking for module '%1' is complete. -- @info -- “%1”模块的需求检查完成。 -+ -+ Requirements checking for module '%1' is complete. -+ @info -+ “%1”模块的需求检查完成。 - - -- -- Waiting for %n module(s)… -- @status -- -- 等待 %n 个模块… -- -+ -+ Waiting for %n module(s)… -+ @status -+ -+ 等待 %n 个模块… -+ - - -- -- (%n second(s)) -- @status -- -- (%n 秒) -- -+ -+ (%n second(s)) -+ @status -+ -+ (%n 秒) -+ - - -- -- System-requirements checking is complete. -- @info -- 已经完成系统需求检查。 -+ -+ System-requirements checking is complete. -+ @info -+ 已经完成系统需求检查。 - -- -- -+ -+ - Calamares::ViewManager - -- -- The upload was unsuccessful. No web-paste was done. -- 上传失败,未完成网页粘贴。 -+ -+ The upload was unsuccessful. No web-paste was done. -+ 上传失败,未完成网页粘贴。 - - -- -- Install log posted to -+ -+ Install log posted to - - %1 - - Link copied to clipboard -- 发送至 -+ 发送至 - - %1 - - 的链接已保存至剪贴板 - - -- -- Install Log Paste URL -- 安装日志粘贴 URL -+ -+ Install Log Paste URL -+ 安装日志粘贴 URL - - -- -- &Yes -- &是 -+ -+ &Yes -+ &是 - - -- -- &No -- &否 -+ -+ &No -+ &否 - - -- -- &Close -- &关闭 -+ -+ &Close -+ &关闭 - - -- -- Setup Failed -- @title -- 初始化失败 -+ -+ Setup Failed -+ @title -+ 初始化失败 - - -- -- Installation Failed -- @title -- 安装失败 -+ -+ Installation Failed -+ @title -+ 安装失败 - - -- -- Error -- @title -- 错误 -+ -+ Error -+ @title -+ 错误 - - -- -- Calamares Initialization Failed -- @title -- Calamares初始化失败 -+ -+ Calamares Initialization Failed -+ @title -+ Calamares初始化失败 - - -- -- %1 can not be installed. Calamares was unable to load all of the configured modules. This is a problem with the way Calamares is being used by the distribution. -- @info -- %1无法安装。 Calamares无法加载所有已配置的模块。这个问题是发行版配置Calamares不当导致的。 -+ -+ %1 can not be installed. Calamares was unable to load all of the configured modules. This is a problem with the way Calamares is being used by the distribution. -+ @info -+ %1无法安装。 Calamares无法加载所有已配置的模块。这个问题是发行版配置Calamares不当导致的。 - - -- -- <br/>The following modules could not be loaded: -- @info -- <br/>无法加载以下模块: -+ -+ <br/>The following modules could not be loaded: -+ @info -+ <br/>无法加载以下模块: - - -- -- Continue with Setup? -- @title -- 要继续安装吗? -+ -+ Continue with Setup? -+ @title -+ 要继续安装吗? - - -- -- Continue with Installation? -- @title -- 继续安装? -+ -+ Continue with Installation? -+ @title -+ 继续安装? - - -- -- The %1 setup program is about to make changes to your disk in order to set up %2.<br/><strong>You will not be able to undo these changes.</strong> -- %1 is short product name, %2 is short product name with version -- 为了安装%2, %1 安装程序即将对磁盘进行更改。<br/><strong>这些更改无法撤销。</strong> -+ -+ The %1 setup program is about to make changes to your disk in order to set up %2.<br/><strong>You will not be able to undo these changes.</strong> -+ %1 is short product name, %2 is short product name with version -+ 为了安装%2, %1 安装程序即将对磁盘进行更改。<br/><strong>这些更改无法撤销。</strong> - - -- -- The %1 installer is about to make changes to your disk in order to install %2.<br/><strong>You will not be able to undo these changes.</strong> -- %1 is short product name, %2 is short product name with version -- %1 安装程序将在您的磁盘上做出更改以安装 %2。<br/><strong>您将无法还原这些更改。</strong> -+ -+ The %1 installer is about to make changes to your disk in order to install %2.<br/><strong>You will not be able to undo these changes.</strong> -+ %1 is short product name, %2 is short product name with version -+ %1 安装程序将在您的磁盘上做出更改以安装 %2。<br/><strong>您将无法还原这些更改。</strong> - - -- -- &Set Up Now -- @button -- 现在开始配置(&S) -+ -+ &Set Up Now -+ @button -+ 现在开始配置(&S) - - -- -- &Install Now -- @button -- 现在开始安装(&I) -+ -+ &Install Now -+ @button -+ 现在开始安装(&I) - - -- -- Go &Back -- @button -- 返回 (&B) -+ -+ Go &Back -+ @button -+ 返回 (&B) - - -- -- &Set Up -- @button -- 配置 (&S) -+ -+ &Set Up -+ @button -+ 配置 (&S) - - -- -- &Install -- @button -- 安装(&I) -+ -+ &Install -+ @button -+ 安装(&I) - - -- -- Setup is complete. Close the setup program. -- @tooltip -- 安装完成。关闭安装程序。 -+ -+ Setup is complete. Close the setup program. -+ @tooltip -+ 安装完成。关闭安装程序。 - - -- -- The installation is complete. Close the installer. -- @tooltip -- 安装已完成。请关闭安装程序。 -+ -+ The installation is complete. Close the installer. -+ @tooltip -+ 安装已完成。请关闭安装程序。 - - -- -- Cancel the setup process without changing the system. -- @tooltip -- 取消安装过程,保持系统不变。 -+ -+ Cancel the setup process without changing the system. -+ @tooltip -+ 取消安装过程,保持系统不变。 - - -- -- Cancel the installation process without changing the system. -- @tooltip -- 取消安装过程,不改变系统。 -+ -+ Cancel the installation process without changing the system. -+ @tooltip -+ 取消安装过程,不改变系统。 - - -- -- &Next -- @button -- 下一步(&N) -+ -+ &Next -+ @button -+ 下一步(&N) - - -- -- &Back -- @button -- 后退(&B) -+ -+ &Back -+ @button -+ 后退(&B) - - -- -- &Done -- @button -- &完成 -+ -+ &Done -+ @button -+ &完成 - - -- -- &Cancel -- @button -- 取消(&C) -+ -+ &Cancel -+ @button -+ 取消(&C) - - -- -- Cancel Setup? -- @title -- 取消配置? -+ -+ Cancel Setup? -+ @title -+ 取消配置? - - -- -- Cancel Installation? -- @title -- 取消安装? -+ -+ Cancel Installation? -+ @title -+ 取消安装? - - -- -- Do you really want to cancel the current setup process? -+ -+ Do you really want to cancel the current setup process? - The setup program will quit and all changes will be lost. -- 确定要取消当前安装吗? -+ 确定要取消当前安装吗? - 安装程序将会退出,所有修改都会丢失。 - - -- -- Do you really want to cancel the current install process? -+ -+ Do you really want to cancel the current installation process? -+The system will reboot or you can enter the debug mode for further investigation. -+ 您确定要退出当前的安装过程吗? -+系统将重启,或者您可以进入调试模式进行进一步的调查。 -+ -+ -+ -+ &Reboot -+ @button -+ 重启(&R) -+ -+ -+ -+ &Try Now -+ @button -+ 立即试用(&D) -+ -+ -+ Do you really want to cancel the current install process? - The installer will quit and all changes will be lost. -- 确定要取消当前的安装吗? -+ 确定要取消当前的安装吗? - 安装程序将退出,所有修改都会丢失。 - -- -- -+ -+ - CalamaresPython::Helper - -- -- Unknown exception type -- @error -- 未知异常类型 -+ -+ Unknown exception type -+ @error -+ 未知异常类型 - - -- -- Unparseable Python error -- @error -- 无法解析的 Python 错误 -+ -+ Unparseable Python error -+ @error -+ 无法解析的 Python 错误 - - -- -- Unparseable Python traceback -- @error -- 无法解析的 Python 回溯 -+ -+ Unparseable Python traceback -+ @error -+ 无法解析的 Python 回溯 - - -- -- Unfetchable Python error -- @error -- 无法获取的 Python 错误。 -+ -+ Unfetchable Python error -+ @error -+ 无法获取的 Python 错误。 - -- -- -+ -+ - CalamaresWindow - -- -- %1 Setup Program -- %1 安装程序 -+ -+ -+ %1 Setup Program -+ %1 安装程序 - - -- -- %1 Installer -- %1 安装程序 -+ -+ -+ %1 Installer -+ %1 安装程序 - -- -- -+ -+ - ChangeFilesystemLabelJob - -- -- Set filesystem label on %1 -- @title -- 在 %1 设置文件系统卷标。 -+ -+ Set filesystem label on %1 -+ @title -+ 在 %1 设置文件系统卷标。 - - -- -- Set filesystem label <strong>%1</strong> to partition <strong>%2</strong> -- @info -- 设置文件系统卷标 <strong>%1</strong> 至分区 <strong>%2</strong>。 -+ -+ Set filesystem label <strong>%1</strong> to partition <strong>%2</strong> -+ @info -+ 设置文件系统卷标 <strong>%1</strong> 至分区 <strong>%2</strong>。 - - -- -- Setting filesystem label <strong>%1</strong> to partition <strong>%2</strong>… -- @status -- 正在设置文件系统卷标 <strong>%1</strong> 至分区 <strong>%2</strong> 中…… -+ -+ Setting filesystem label <strong>%1</strong> to partition <strong>%2</strong>… -+ @status -+ 正在设置文件系统卷标 <strong>%1</strong> 至分区 <strong>%2</strong> 中…… - - -- -- -- The installer failed to update partition table on disk '%1'. -- @info -- 安装程序更新磁盘“%1”分区表失败。 -+ -+ -+ The installer failed to update partition table on disk '%1'. -+ @info -+ 安装程序更新磁盘“%1”分区表失败。 - -- -- -+ -+ - CheckerContainer - -- -- Gathering system information... -- 正在收集系统信息 ... -+ -+ Gathering system information... -+ 正在收集系统信息 ... - -- -- -+ -+ - ChoicePage - -- -- Select storage de&vice: -- @label -- 选择存储器(&V): -+ -+ Select storage de&vice: -+ @label -+ 选择存储器(&V): - - -- -- -- -- -- Current: -- @label -- 当前: -+ -+ -+ -+ -+ Current: -+ @label -+ 当前: - - -- -- After: -- @label -- 之后: -+ -+ After: -+ @label -+ 之后: - - -- -- Reuse %1 as home partition for %2 -- @label -- 重复使用 %1 作为 %2 的 home 分区 -+ -+ Reuse %1 as home partition for %2 -+ @label -+ 重复使用 %1 作为 %2 的 home 分区 - - -- -- <strong>Select a partition to shrink, then drag the bottom bar to resize</strong> -- <strong>选择要缩小的分区,然后拖动底栏改变大小</strong> -+ -+ <strong>Select a partition to shrink, then drag the bottom bar to resize</strong> -+ <strong>选择要缩小的分区,然后拖动底栏改变大小</strong> - - -- -- %1 will be shrunk to %2MiB and a new %3MiB partition will be created for %4. -- @info, %1 is partition name, %4 is product name -- %1 将会缩减到 %2MiB,然后为 %4 创建一个 %3MiB 分区。 -+ -+ %1 will be shrunk to %2MiB and a new %3MiB partition will be created for %4. -+ @info, %1 is partition name, %4 is product name -+ %1 将会缩减到 %2MiB,然后为 %4 创建一个 %3MiB 分区。 - - -- -- <strong>Select a partition to install on</strong> -- @label -- <strong>选择要安装到的分区</strong> -+ -+ <strong>Select a partition to install on</strong> -+ @label -+ <strong>选择要安装到的分区</strong> - - -- -- An EFI system partition cannot be found anywhere on this system. Please go back and use manual partitioning to set up %1. -- @info, %1 is product name -- 在此系统上找不到任何 EFI 系统分区。请后退到上一步并使用手动分区配置 %1。 -+ -+ An EFI system partition cannot be found anywhere on this system. Please go back and use manual partitioning to set up %1. -+ @info, %1 is product name -+ 在此系统上找不到任何 EFI 系统分区。请后退到上一步并使用手动分区配置 %1。 - - -- -- The EFI system partition at %1 will be used for starting %2. -- @info, %1 is partition path, %2 is product name -- %1 处的 EFI 系统分区将被用来启动 %2。 -+ -+ The EFI system partition at %1 will be used for starting %2. -+ @info, %1 is partition path, %2 is product name -+ %1 处的 EFI 系统分区将被用来启动 %2。 - - -- -- EFI system partition: -- @label -- EFI 系统分区: -+ -+ EFI system partition: -+ @label -+ EFI 系统分区: - - -- -- This storage device does not seem to have an operating system on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. -- 这个存储器上似乎还没有操作系统。您想要怎么做?<br/>在任何更改应用到存储器上前,您都可以重新查看并确认您的选择。 -+ -+ This storage device does not seem to have an operating system on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. -+ 这个存储器上似乎还没有操作系统。您想要怎么做?<br/>在任何更改应用到存储器上前,您都可以重新查看并确认您的选择。 - - -- -- -- -- -- <strong>Erase disk</strong><br/>This will <font color="red">delete</font> all data currently present on the selected storage device. -- <strong>抹除磁盘</strong><br/>这将会<font color="red">删除</font>目前选定的存储器上所有的数据。 -+ -+ -+ -+ -+ <strong>Automatic partitioning</strong><br/>This will <font color="red">delete</font> all data currently present on the selected storage device. -+ <strong>自动分区</strong><br/>这将会<font color="red">删除</font>目前选定的存储器上所有的数据。 - - -- -- -- -- -- <strong>Install alongside</strong><br/>The installer will shrink a partition to make room for %1. -- <strong>并存安装</strong><br/>安装程序将会缩小一个分区,为 %1 腾出空间。 -+ -+ -+ -+ -+ <strong>Install alongside</strong><br/>The installer will shrink a partition to make room for %1. -+ <strong>并存安装</strong><br/>安装程序将会缩小一个分区,为 %1 腾出空间。 - - -- -- -- -- -- <strong>Replace a partition</strong><br/>Replaces a partition with %1. -- <strong>取代一个分区</strong><br/>以 %1 <strong>替代</strong>一个分区。 -+ -+ -+ -+ -+ <strong>Replace a partition</strong><br/>Replaces a partition with %1. -+ <strong>取代一个分区</strong><br/>以 %1 <strong>替代</strong>一个分区。 - - -- -- This storage device has %1 on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. -- 这个存储器上已经有 %1 了。您想要怎么做?<br/>在任何更改应用到存储器上前,您都可以重新查看并确认您的选择。 -+ -+ This storage device has %1 on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. -+ 这个存储器上已经有 %1 了。您想要怎么做?<br/>在任何更改应用到存储器上前,您都可以重新查看并确认您的选择。 - - -- -- This storage device already has an operating system on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. -- 这个存储器上已经有一个操作系统了。您想要怎么做?<br/>在任何更改应用到存储器上前,您都可以重新查看并确认您的选择。 -+ -+ This storage device already has an operating system on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. -+ 这个存储器上已经有一个操作系统了。您想要怎么做?<br/>在任何更改应用到存储器上前,您都可以重新查看并确认您的选择。 - - -- -- This storage device has multiple operating systems on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. -- 这个存储器上已经有多个操作系统了。您想要怎么做?<br/>在任何更改应用到存储器上前,您都可以重新查看并确认您的选择。 -+ -+ This storage device has multiple operating systems on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. -+ 这个存储器上已经有多个操作系统了。您想要怎么做?<br/>在任何更改应用到存储器上前,您都可以重新查看并确认您的选择。 - - -- -- This storage device already has an operating system on it, but the partition table <strong>%1</strong> is different from the needed <strong>%2</strong>.<br/> -- 此存储设备已经有操作系统,但是分区表 <strong>%1</strong> 与所需的 <strong>%2</strong> 不同。<br/> -+ -+ This storage device already has an operating system on it, but the partition table <strong>%1</strong> is different from the needed <strong>%2</strong>.<br/> -+ 此存储设备已经有操作系统,但是分区表 <strong>%1</strong> 与所需的 <strong>%2</strong> 不同。<br/> - - -- -- This storage device has one of its partitions <strong>mounted</strong>. -- @info -- 此存储设备 <strong>已挂载</strong>其中一个分区。 -+ -+ This storage device has one of its partitions <strong>mounted</strong>. -+ @info -+ 此存储设备 <strong>已挂载</strong>其中一个分区。 - - -- -- This storage device is a part of an <strong>inactive RAID</strong> device. -- @info -- 该存储设备是 <strong>非活动RAID</strong> 设备的一部分。 -+ -+ This storage device is a part of an <strong>inactive RAID</strong> device. -+ @info -+ 该存储设备是 <strong>非活动RAID</strong> 设备的一部分。 - - -- -- No swap -- @label -- 无 Swap 交换分区 -+ -+ No swap -+ @label -+ 无 Swap 交换分区 - - -- -- Reuse swap -- @label -- 重新使用 Swap 交换分区 -+ -+ Reuse swap -+ @label -+ 重新使用 Swap 交换分区 - - -- -- Swap (no Hibernate) -- @label -- 交换分区(无休眠) -+ -+ Swap (no Hibernate) -+ @label -+ 交换分区(无休眠) - - -- -- Swap (with Hibernate) -- @label -- 交换分区(带休眠) -+ -+ Swap (with Hibernate) -+ @label -+ 交换分区(带休眠) - - -- -- Swap to file -- @label -- 交换到文件 -+ -+ Swap to file -+ @label -+ 交换到文件 - - -- -- <strong>Manual partitioning</strong><br/>You can create or resize partitions yourself. -- <strong>手动分区</strong><br/>您可以自行创建或重新调整分区大小。 -+ -+ <strong>Manual partitioning</strong><br/>You can create or resize partitions yourself. -+ <strong>手动分区</strong><br/>您可以自行创建或重新调整分区大小。 - - -- -- Bootloader location: -- @label -- 启动加载器(Bootloader)位置: -+ -+ Bootloader location: -+ @label -+ 启动加载器(Bootloader)位置: - -- -- -+ -+ - ClearMountsJob - -- -- Successfully unmounted %1. -- 成功卸载了 %1。 -+ -+ Successfully unmounted %1. -+ 成功卸载了 %1。 - - -- -- Successfully disabled swap %1. -- 成功禁用了交换空间 %1。 -+ -+ Successfully disabled swap %1. -+ 成功禁用了交换空间 %1。 - - -- -- Successfully cleared swap %1. -- 成功清理了交换空间 %1。 -+ -+ Successfully cleared swap %1. -+ 成功清理了交换空间 %1。 - - -- -- Successfully closed mapper device %1. -- 成功关闭了映射设备 %1。 -+ -+ Successfully closed mapper device %1. -+ 成功关闭了映射设备 %1。 - - -- -- Successfully disabled volume group %1. -- 成功禁用了卷组 %1。 -+ -+ Successfully disabled volume group %1. -+ 成功禁用了卷组 %1。 - - -- -- Clear mounts for partitioning operations on %1 -- @title -- 清理挂载了的分区以在 %1 进行分区操作 -+ -+ Clear mounts for partitioning operations on %1 -+ @title -+ 清理挂载了的分区以在 %1 进行分区操作 - - -- -- Clearing mounts for partitioning operations on %1… -- @status -- 正在清理挂载了的分区以在 %1 进行分区操作… -+ -+ Clearing mounts for partitioning operations on %1… -+ @status -+ 正在清理挂载了的分区以在 %1 进行分区操作… - - -- -- Cleared all mounts for %1 -- 已清除 %1 的所有挂载点 -+ -+ Cleared all mounts for %1 -+ 已清除 %1 的所有挂载点 - -- -- -+ -+ - ClearTempMountsJob - -- -- -- Clearing all temporary mounts… -- @status -- 正在清除所有临时挂载点… -+ -+ -+ Clearing all temporary mounts… -+ @status -+ 正在清除所有临时挂载点… - - -- -- Cleared all temporary mounts. -- 所有临时挂载点都已经清除。 -+ -+ Cleared all temporary mounts. -+ 所有临时挂载点都已经清除。 - -- -- -+ -+ - CommandList - -- -- Could not run command. -- 无法运行命令 -+ -+ Could not run command. -+ 无法运行命令 - - -- -- The commands use variables that are not defined. Missing variables are: %1. -- 这些命令使用了未定义的变量。缺少的变量是: %1。 -+ -+ The commands use variables that are not defined. Missing variables are: %1. -+ 这些命令使用了未定义的变量。缺少的变量是: %1。 - -- -- -+ -+ - Config - -- -- Setup Failed -- @title -- 初始化失败 -+ -+ Setup Failed -+ @title -+ 初始化失败 -+ -+ -+ -+ Installation Failed -+ @title -+ 安装失败 - - -- -- Installation Failed -- @title -- 安装失败 -+ -+ The setup of %1 did not complete successfully. -+ @info -+ %1的设置未成功完成 - - -- -- The setup of %1 did not complete successfully. -- @info -- %1的设置未成功完成 -+ -+ The installation of %1 did not complete successfully. -+ @info -+ %1的安装未成功完成 - - -- -- The installation of %1 did not complete successfully. -- @info -- %1的安装未成功完成 -+ -+ Setup Complete -+ @title -+ 安装完成 - - -- -- Setup Complete -- @title -- 安装完成 -+ -+ Installation Complete -+ @title -+ 安装完成 - - -- -- Installation Complete -- @title -- 安装完成 -+ -+ The setup of %1 is complete. -+ @info -+ %1 安装完成。 - - -- -- The setup of %1 is complete. -- @info -- %1 安装完成。 -+ -+ The installation of %1 is complete. -+ @info -+ %1 的安装操作已完成。 - - -- -- The installation of %1 is complete. -- @info -- %1 的安装操作已完成。 -+ -+ Keyboard model has been set to %1<br/>. -+ @label, %1 is keyboard model, as in Apple Magic Keyboard -+ 键盘型号已设置为 %1<br/>。 - - -- -- Keyboard model has been set to %1<br/>. -- @label, %1 is keyboard model, as in Apple Magic Keyboard -- 键盘型号已设置为 %1<br/>。 -+ -+ Keyboard layout has been set to %1/%2. -+ @label, %1 is layout, %2 is layout variant -+ 键盘布局已设置为 %1/%2。 - - -- -- Keyboard layout has been set to %1/%2. -- @label, %1 is layout, %2 is layout variant -- 键盘布局已设置为 %1/%2。 -+ -+ Set timezone to %1/%2 -+ @action -+ 设置时区为 %1/%2 - - -- -- Set timezone to %1/%2 -- @action -- 设置时区为 %1/%2 -+ -+ The system language will be set to %1. -+ @info -+ 系统语言将设置为 %1。 - - -- -- The system language will be set to %1. -- @info -- 系统语言将设置为 %1。 -+ -+ The numbers and dates locale will be set to %1. -+ @info -+ 数字和日期格式将设置为 %1。 - - -- -- The numbers and dates locale will be set to %1. -- @info -- 数字和日期地域将设置为 %1。 -+ -+ The timezone will be set to %1. -+ @info -+ 设置时区为 %1. - - -- -- Network Installation. (Disabled: Incorrect configuration) -- 网络安装。(因错误的配置而被禁用) -+ The timezone whill be set to %1. -+ @info -+ 设置时区为 %1。 - - -- -- Network Installation. (Disabled: Received invalid groups data) -- 网络安装。(因收到无效组数据而被禁用) -+ -+ Network Installation. (Disabled: Incorrect configuration) -+ 网络安装。(因错误的配置而被禁用) - - -- -- Network Installation. (Disabled: Internal error) -- 网络安装。(因内部错误而被禁用) -+ -+ Network Installation. (Disabled: Received invalid groups data) -+ 网络安装。(因收到无效组数据而被禁用) - - -- -- Network Installation. (Disabled: Unable to fetch package lists, check your network connection) -- 网络安装。(因无法获取软件包列表而被禁用,请检查网络连接) -+ -+ Network Installation. (Disabled: Internal error) -+ 网络安装。(因内部错误而被禁用) - - -- -- Network Installation. (Disabled: No package list) -- 网络安装。(因无软件包列表而被禁用) -+ -+ Network Installation. (Disabled: Unable to fetch package lists, check your network connection) -+ 网络安装。(因无法获取软件包列表而被禁用,请检查网络连接) - - -- -- Package selection -- 软件包选择 -+ -+ Network Installation. (Disabled: No package list) -+ 网络安装。(因无软件包列表而被禁用) - - -- -- Package Selection -- 软件包选择 -+ -+ Package selection -+ 软件包选择 - - -- -- Please pick a product from the list. The selected product will be installed. -- 请在列表中选一个产品。被选中的产品将会被安装。 -+ -+ Package Selection -+ 软件包选择 - - -- -- Packages -- 软件包 -+ -+ Please pick a product from the list. The selected product will be installed. -+ 请在列表中选一个产品。被选中的产品将会被安装。 - - -- -- Install option: <strong>%1</strong> -- 安装选项:<strong>%1</strong> -+ -+ Packages -+ 桌面 - - -- -- None -- -+ -+ Install option: <strong>%1</strong> -+ 安装选项:<strong>%1</strong> - - -- -- Summary -- @label -- 摘要 -+ -+ None -+ - - -- -- This is an overview of what will happen once you start the setup procedure. -- 预览——当你启动安装过程,以下行为将被执行 -+ -+ Summary -+ @label -+ 摘要 - - -- -- This is an overview of what will happen once you start the install procedure. -- 这是您开始安装后所会发生的事情的概览。 -+ -+ This is an overview of what will happen once you start the setup procedure. -+ 预览——当你启动安装过程,以下行为将被执行 - - -- -- Your username is too long. -- 用户名太长。 -+ -+ This is an overview of what will happen once you start the install procedure. -+ 这是您开始安装后所会发生的事情的概览。 - - -- -- Your username must start with a lowercase letter or underscore. -- 用户名必须以小写字母或下划线"_"开头 -+ -+ Your username is too long. -+ 用户名太长。 - - -- -- Only lowercase letters, numbers, underscore and hyphen are allowed. -- 只允许小写字母、数组、下划线"_" 和 连字符"-" -+ -+ Your username must start with a lowercase letter or underscore. -+ 用户名必须以小写字母或下划线"_"开头 - - -- -- '%1' is not allowed as username. -- '%1' 不允许作为用户名。 -+ -+ Only lowercase letters, numbers, underscore and hyphen are allowed. -+ 只允许小写字母、数组、下划线"_" 和 连字符"-" - - -- -- Your hostname is too short. -- 主机名太短。 -+ -+ '%1' is not allowed as username. -+ '%1' 不允许作为用户名。 - - -- -- Your hostname is too long. -- 主机名太长。 -+ -+ Your hostname is too short. -+ 主机名太短。 - - -- -- '%1' is not allowed as hostname. -- '%1' 不允许作为主机名。 -+ -+ Your hostname is too long. -+ 主机名太长。 - - -- -- Only letters, numbers, underscore and hyphen are allowed. -- 只允许字母、数组、下划线"_" 和 连字符"-" -+ -+ '%1' is not allowed as hostname. -+ '%1' 不允许作为主机名。 - - -- -- Your passwords do not match! -- 密码不匹配! -+ -+ Only letters, numbers, underscore and hyphen are allowed. -+ 只允许字母、数组、下划线"_" 和 连字符"-" - - -- -- OK! -- 确定 -+ -+ Your passwords do not match! -+ 密码不匹配! - - -- -- This computer does not satisfy the minimum requirements for setting up %1.<br/>Setup cannot continue. -- 此计算机不满足安装 %1 的最低需求。<br/> 初始化无法继续。 -+ -+ OK! -+ 确定 - - -- -- This computer does not satisfy the minimum requirements for installing %1.<br/>Installation cannot continue. -- 此计算机木不满足安装 %1 的最低需求。<br/> 安装无法继续。 -+ -+ This computer does not satisfy the minimum requirements for setting up %1.<br/>Setup cannot continue. -+ 此计算机不满足安装 %1 的最低需求。<br/> 初始化无法继续。 - - -- -- This computer does not satisfy some of the recommended requirements for setting up %1.<br/>Setup can continue, but some features might be disabled. -- 此计算机不满足安装 %1 的部分推荐配置。<br/>初始化可以继续,但是一些功能可能会被禁用。 -+ -+ This computer does not satisfy the minimum requirements for installing %1.<br/>Installation cannot continue. -+ 此计算机木不满足安装 %1 的最低需求。<br/> 安装无法继续。 - - -- -- This computer does not satisfy some of the recommended requirements for installing %1.<br/>Installation can continue, but some features might be disabled. -- 此计算机不满足安装 %1 的部分推荐配置。<br/>安装可以继续,但是一些功能可能会被禁用。 -+ -+ This computer does not satisfy some of the recommended requirements for setting up %1.<br/>Setup can continue, but some features might be disabled. -+ 此计算机不满足安装 %1 的部分推荐配置。<br/>初始化可以继续,但是一些功能可能会被禁用。 - - -- -- This program will ask you some questions and set up %2 on your computer. -- 本程序将会问您一些问题并在您的电脑上安装及设置 %2 。 -+ -+ This computer does not satisfy some of the recommended requirements for installing %1.<br/>Installation can continue, but some features might be disabled. -+ 此计算机不满足安装 %1 的部分推荐配置。<br/>安装可以继续,但是一些功能可能会被禁用。 - - -- -- <h1>Welcome to the Calamares setup program for %1</h1> -- <h1>欢迎使用 %1 的 Calamares 安装程序</h1> -+ This program will ask you some questions and set up %2 on your computer. -+ 本程序将会问您一些问题并在您的电脑上安装及设置 %2 。 - - -- -- <h1>Welcome to %1 setup</h1> -- <h1>欢迎使用 %1 设置</h1> -+ -+ <h1>Welcome to the Calamares setup program for %1</h1> -+ <h1>欢迎使用 %1 的 Calamares 安装程序</h1> - - -- -- <h1>Welcome to the Calamares installer for %1</h1> -- <h1>欢迎使用 %1 的 Calamares 安装程序</h1> -+ -+ <h1>Welcome to %1 setup</h1> -+ <h1>欢迎使用 %1 设置</h1> - - -- -- <h1>Welcome to the %1 installer</h1> -- <h1>欢迎使用 %1 安装程序</h1> -+ -+ <h1>Welcome to the Calamares installer for %1</h1> -+ <h1>欢迎使用 %1 的 Calamares 安装程序</h1> - -- -- -+ -+ -+ <h1>Welcome to the %1 installer</h1> -+ <h1>欢迎使用 %1 安装程序</h1> ++ ++ ++ Yellowknife ++ tz_names ++ 黃刀 + -+ -+ - ContextualProcessJob - -- -- Performing contextual processes' job… -- @status -- 正在执行相关流程工作... -+ -+ Performing contextual processes' job… -+ @status -+ 正在执行相关流程工作... - -- -- -+ -+ - CreatePartitionDialog - -- -- Create a Partition -- 创建分区 -+ -+ Create a Partition -+ 创建分区 - - -- -- Si&ze: -- 大小(&Z): -+ -+ Si&ze: -+ 大小(&Z): - - -- -- MiB -- MiB -+ -+ MiB -+ MiB - - -- -- Partition &Type: -- 分区类型(&T): -+ -+ Partition &Type: -+ 分区类型(&T): - - -- -- Primar&y -- 主分区(&Y) -+ -+ Primar&y -+ 主分区(&Y) - - -- -- E&xtended -- 扩展分区(&E) -+ -+ E&xtended -+ 扩展分区(&E) - - -- -- Fi&le System: -- 文件系统 (&L): -+ -+ Fi&le System: -+ 文件系统 (&L): - - -- -- LVM LV name -- LVM 逻辑卷名称 -+ -+ LVM LV name -+ LVM 逻辑卷名称 - - -- -- &Mount Point: -- 挂载点(&M): -+ -+ &Mount Point: -+ 挂载点(&M): - - -- -- Flags: -- 标记: -+ -+ Flags: -+ 标记: - - -- -- Label for the filesystem -- 此文件系统的卷标名 -+ -+ Label for the filesystem -+ 此文件系统的卷标名 - - -- -- FS Label: -- 文件系统卷标 -+ -+ FS Label: -+ 文件系统卷标 - - -- -- En&crypt -- @action -- 加密(&C) -+ -+ En&crypt -+ @action -+ 加密(&C) - - -- -- Logical -- @label -- 逻辑分区 -+ -+ Logical -+ @label -+ 逻辑分区 - - -- -- Primary -- @label -- 主分区 -+ -+ Primary -+ @label -+ 主分区 - - -- -- GPT -- @label -- GPT -+ -+ GPT -+ @label -+ GPT - - -- -- Mountpoint already in use. Please select another one. -- @info -- 挂载点已被占用。请选择另一个。 -+ -+ Mountpoint already in use. Please select another one. -+ @info -+ 挂载点已被占用。请选择另一个。 - - -- -- Mountpoint must start with a <tt>/</tt>. -- @info -- 挂载点必须以<tt>/</tt>开头。 -+ -+ Mountpoint must start with a <tt>/</tt>. -+ @info -+ 挂载点必须以<tt>/</tt>开头。 - -- -- -+ -+ - CreatePartitionJob - -- -- Create new %1MiB partition on %3 (%2) with entries %4 -- @title -- 在 %3 (%2) 上使用项目 %4 建立新的 %1MiB 分区 -+ -+ Create new %1MiB partition on %3 (%2) with entries %4 -+ @title -+ 在 %3 (%2) 上使用项目 %4 建立新的 %1MiB 分区 - - -- -- Create new %1MiB partition on %3 (%2) -- @title -- 在 %3 (%2) 上建立新的 %1MiB 分区 -+ -+ Create new %1MiB partition on %3 (%2) -+ @title -+ 在 %3 (%2) 上建立新的 %1MiB 分区 - - -- -- Create new %2MiB partition on %4 (%3) with file system %1 -- @title -- 在 %4 (%3) 上创建新的 %2MiB 分区,文件系统为 %1 -+ -+ Create new %2MiB partition on %4 (%3) with file system %1 -+ @title -+ 在 %4 (%3) 上创建新的 %2MiB 分区,文件系统为 %1 - - -- -- Create new <strong>%1MiB</strong> partition on <strong>%3</strong> (%2) with entries <em>%4</em> -- @info -- 在 <strong>%3</strong> (%2) 上使用 <em>%4</em> 建立新的 <strong>%1MiB</strong> 分区 -+ -+ Create new <strong>%1MiB</strong> partition on <strong>%3</strong> (%2) with entries <em>%4</em> -+ @info -+ 在 <strong>%3</strong> (%2) 上使用 <em>%4</em> 建立新的 <strong>%1MiB</strong> 分区 - - -- -- Create new <strong>%1MiB</strong> partition on <strong>%3</strong> (%2) -- @info -- 在<strong>%3</strong>(%2)上创建新的<strong>%1MiB</strong>分区 -+ -+ Create new <strong>%1MiB</strong> partition on <strong>%3</strong> (%2) -+ @info -+ 在<strong>%3</strong>(%2)上创建新的<strong>%1MiB</strong>分区 - - -- -- Create new <strong>%2MiB</strong> partition on <strong>%4</strong> (%3) with file system <strong>%1</strong> -- @info -- 在<strong>%4</strong>(%3)上使用文件系统<strong>%1</strong>创建一个<strong>%2MiB</strong>的%1分区 -+ -+ Create new <strong>%2MiB</strong> partition on <strong>%4</strong> (%3) with file system <strong>%1</strong> -+ @info -+ 在<strong>%4</strong>(%3)上使用文件系统<strong>%1</strong>创建一个<strong>%2MiB</strong>的%1分区 - - -- -- -- Creating new %1 partition on %2… -- @status -- 正在 %2 上创建新的 %1 分区… -+ -+ -+ Creating new %1 partition on %2… -+ @status -+ 正在 %2 上创建新的 %1 分区… - - -- -- The installer failed to create partition on disk '%1'. -- @info -- 安装程序在磁盘“%1”创建分区失败。 -+ -+ The installer failed to create partition on disk '%1'. -+ @info -+ 安装程序在磁盘“%1”创建分区失败。 - -- -- -+ -+ - CreatePartitionTableDialog - -- -- Create Partition Table -- 创建分区表 -+ -+ Create Partition Table -+ 创建分区表 - - -- -- Creating a new partition table will delete all existing data on the disk. -- 创建新分区表将删除磁盘上所有已有数据。 -+ -+ Creating a new partition table will delete all existing data on the disk. -+ 创建新分区表将删除磁盘上所有已有数据。 - - -- -- What kind of partition table do you want to create? -- 您想要创建哪种分区表? -+ -+ What kind of partition table do you want to create? -+ 您想要创建哪种分区表? - - -- -- Master Boot Record (MBR) -- 主引导记录 (MBR) -+ -+ Master Boot Record (MBR) -+ 主引导记录 (MBR) - - -- -- GUID Partition Table (GPT) -- GUID 分区表 (GPT) -+ -+ GUID Partition Table (GPT) -+ GUID 分区表 (GPT) - -- -- -+ -+ - CreatePartitionTableJob - -- -- -- Creating new %1 partition table on %2… -- @status -- 正在 %2 上创建新的 %1 分区表… -+ -+ -+ Creating new %1 partition table on %2… -+ @status -+ 正在 %2 上创建新的 %1 分区表… - - -- -- Creating new <strong>%1</strong> partition table on <strong>%2</strong> (%3)… -- @status -- 正在在 <strong>%2</strong> (%3) 上创建新的 <strong>%1</strong> 分区表… -+ -+ Creating new <strong>%1</strong> partition table on <strong>%2</strong> (%3)… -+ @status -+ 正在在 <strong>%2</strong> (%3) 上创建新的 <strong>%1</strong> 分区表… - - -- -- The installer failed to create a partition table on %1. -- 安装程序于 %1 创建分区表失败。 -+ -+ The installer failed to create a partition table on %1. -+ 安装程序于 %1 创建分区表失败。 - -- -- -+ -+ - CreateUserJob - -- -- Create user %1 -- 创建用户 %1 -+ -+ Create user %1 -+ 创建用户 %1 - - -- -- Create user <strong>%1</strong> -- 创建用户 <strong>%1</strong> -+ -+ Create user <strong>%1</strong> -+ 创建用户 <strong>%1</strong> - - -- -- -- Creating user %1… -- @status -- 创建用户 %1… -+ -+ -+ Creating user %1… -+ @status -+ 创建用户 %1… - - -- -- Preserving home directory… -- @status -- 保留家目录… -+ -+ Preserving home directory… -+ @status -+ 保留家目录… - - -- -- Configuring user %1 -- @status -- 配置用户 %1 -+ -+ Configuring user %1 -+ @status -+ 配置用户 %1 - - -- -- Setting file permissions… -- @status -- 设置文件权限… -+ -+ Setting file permissions… -+ @status -+ 设置文件权限… - -- -- -+ -+ - CreateVolumeGroupDialog - -- -- Create Volume Group -- @title -- 创建存储组 -+ -+ Create Volume Group -+ @title -+ 创建存储组 - -- -- -+ -+ - CreateVolumeGroupJob - -- -- -- Creating new volume group named %1… -- @status -- 新建名为 %1 的分卷组… -+ -+ -+ Creating new volume group named %1… -+ @status -+ 新建名为 %1 的分卷组… - - -- -- Creating new volume group named <strong>%1</strong>… -- @status -- 正在创建名为 <strong>%1</strong>的分卷组… -+ -+ Creating new volume group named <strong>%1</strong>… -+ @status -+ 正在创建名为 <strong>%1</strong>的分卷组… - - -- -- The installer failed to create a volume group named '%1'. -- 安装器未能创建名为'%1'的分卷组 -+ -+ The installer failed to create a volume group named '%1'. -+ 安装器未能创建名为'%1'的分卷组 - -- -- -+ -+ - DeactivateVolumeGroupJob - -- -- -- Deactivating volume group named %1… -- @status -- 正在停用分卷组 %1… -+ -+ -+ Deactivating volume group named %1… -+ @status -+ 正在停用分卷组 %1… - - -- -- Deactivating volume group named <strong>%1</strong>… -- @status -- 正在停用分卷组<strong>%1</strong>… -+ -+ Deactivating volume group named <strong>%1</strong>… -+ @status -+ 正在停用分卷组<strong>%1</strong>… - - -- -- The installer failed to deactivate a volume group named %1. -- 安装器未能创建名为'%1'的分卷组 -+ -+ The installer failed to deactivate a volume group named %1. -+ 安装器未能创建名为'%1'的分卷组 - -- -- -+ -+ - DeletePartitionJob - -- -- -- Deleting partition %1… -- @status -- 正在删除分区 %1… -+ -+ -+ Deleting partition %1… -+ @status -+ 正在删除分区 %1… - - -- -- Deleting partition <strong>%1</strong>… -- @status -- 删除分区 <strong>%1</strong>… -+ -+ Deleting partition <strong>%1</strong>… -+ @status -+ 删除分区 <strong>%1</strong>… - - -- -- The installer failed to delete partition %1. -- 安装程序删除分区 %1 失败。 -+ -+ The installer failed to delete partition %1. -+ 安装程序删除分区 %1 失败。 - -- -- -+ -+ - DeviceInfoWidget - -- -- <br><br>This partition table type is only advisable on older systems which start from a <strong>BIOS</strong> boot environment. GPT is recommended in most other cases.<br><br><strong>Warning:</strong> the MBR partition table is an obsolete MS-DOS era standard.<br>Only 4 <em>primary</em> partitions may be created, and of those 4, one can be an <em>extended</em> partition, which may in turn contain many <em>logical</em> partitions. -- <br><br>此分区表类型只建议用于使用 <strong>BIOS</strong> 引导环境的较旧系统,否则一般建议使用 GPT。<br> -+ -+ <br><br>This partition table type is only advisable on older systems which start from a <strong>BIOS</strong> boot environment. GPT is recommended in most other cases.<br><br><strong>Warning:</strong> the MBR partition table is an obsolete MS-DOS era standard.<br>Only 4 <em>primary</em> partitions may be created, and of those 4, one can be an <em>extended</em> partition, which may in turn contain many <em>logical</em> partitions. -+ <br><br>此分区表类型只建议用于使用 <strong>BIOS</strong> 引导环境的较旧系统,否则一般建议使用 GPT。<br> - <strong>警告:</strong>MSDOS 分区表是一个有着重大缺点、已被弃用的标准。<br>MSDOS 分区表上只能创建 4 个<u>主要</u>分区,其中一个可以是<u>拓展</u>分区,此分区可以再分为许多<u>逻辑</u>分区。 - - -- -- <br><br>This is the recommended partition table type for modern systems which start from an <strong>EFI</strong> boot environment. -- <br><br>此分区表类型推荐用于使用 <strong>EFI</strong> 引导环境的系统。 -+ -+ <br><br>This is the recommended partition table type for modern systems which start from an <strong>EFI</strong> boot environment. -+ <br><br>此分区表类型推荐用于使用 <strong>EFI</strong> 引导环境的系统。 - - -- -- This is a <strong>loop</strong> device.<br><br>It is a pseudo-device with no partition table that makes a file accessible as a block device. This kind of setup usually only contains a single filesystem. -- 选定的存储器是一个 <strong>回环</strong> 设备。<br><br>此伪设备不含一个真正的分区表,它只是能让一个文件可如块设备那样访问。这种配置一般只包含一个单独的文件系统。 -+ -+ This is a <strong>loop</strong> device.<br><br>It is a pseudo-device with no partition table that makes a file accessible as a block device. This kind of setup usually only contains a single filesystem. -+ 选定的存储器是一个 <strong>回环</strong> 设备。<br><br>此伪设备不含一个真正的分区表,它只是能让一个文件可如块设备那样访问。这种配置一般只包含一个单独的文件系统。 - - -- -- This installer <strong>cannot detect a partition table</strong> on the selected storage device.<br><br>The device either has no partition table, or the partition table is corrupted or of an unknown type.<br>This installer can create a new partition table for you, either automatically, or through the manual partitioning page. -- 本安装程序在选定的存储器上<strong>探测不到分区表</strong>。<br><br>此设备要不是没有分区表,就是其分区表已毁损又或者是一个未知类型的分区表。<br>本安装程序将会为您建立一个新的分区表,可以自动或通过手动分割页面完成。 -+ -+ This installer <strong>cannot detect a partition table</strong> on the selected storage device.<br><br>The device either has no partition table, or the partition table is corrupted or of an unknown type.<br>This installer can create a new partition table for you, either automatically, or through the manual partitioning page. -+ 本安装程序在选定的存储器上<strong>探测不到分区表</strong>。<br><br>此设备要不是没有分区表,就是其分区表已毁损又或者是一个未知类型的分区表。<br>本安装程序将会为您建立一个新的分区表,可以自动或通过手动分割页面完成。 - - -- -- This device has a <strong>%1</strong> partition table. -- 此设备上有一个 <strong>%1</strong> 分区表。 -+ -+ This device has a <strong>%1</strong> partition table. -+ 此设备上有一个 <strong>%1</strong> 分区表。 - - -- -- The type of <strong>partition table</strong> on the selected storage device.<br><br>The only way to change the partition table type is to erase and recreate the partition table from scratch, which destroys all data on the storage device.<br>This installer will keep the current partition table unless you explicitly choose otherwise.<br>If unsure, on modern systems GPT is preferred. -- 目前选定存储器的<strong>分区表</strong>类型。<br><br>变更分区表类型的唯一方法就是抹除再重新从头建立分区表,这会破坏在该存储器上所有的数据。<br>除非您特别选择,否则本安装程序将会保留目前的分区表。<br>若不确定,在现代的系统上,建议使用 GPT。 -+ -+ The type of <strong>partition table</strong> on the selected storage device.<br><br>The only way to change the partition table type is to erase and recreate the partition table from scratch, which destroys all data on the storage device.<br>This installer will keep the current partition table unless you explicitly choose otherwise.<br>If unsure, on modern systems GPT is preferred. -+ 目前选定存储器的<strong>分区表</strong>类型。<br><br>变更分区表类型的唯一方法就是抹除再重新从头建立分区表,这会破坏在该存储器上所有的数据。<br>除非您特别选择,否则本安装程序将会保留目前的分区表。<br>若不确定,在现代的系统上,建议使用 GPT。 - -- -- -+ -+ - DeviceModel - -- -- %1 - %2 (%3) -- device[name] - size[number] (device-node[name]) -- %1 - %2 (%3) -+ -+ %1 - %2 (%3) -+ device[name] - size[number] (device-node[name]) -+ %1 - %2 (%3) - - -- -- %1 - (%2) -- device[name] - (device-node[name]) -- %1 - (%2) -+ -+ %1 - (%2) -+ device[name] - (device-node[name]) -+ %1 - (%2) - -- -- -+ -+ - DracutLuksCfgJob - -- -- Writing LUKS configuration for Dracut to %1… -- @status -- 正在将 Dracut 的 LUKS 配置写入到 %1… -+ -+ Writing LUKS configuration for Dracut to %1… -+ @status -+ 正在将 Dracut 的 LUKS 配置写入到 %1… - - -- -- Skipping writing LUKS configuration for Dracut: "/" partition is not encrypted -- @info -- Dracut 的 "/" 分区未加密,正在跳过写入 LUKS 配置 -+ -+ Skipping writing LUKS configuration for Dracut: "/" partition is not encrypted -+ @info -+ Dracut 的 "/" 分区未加密,正在跳过写入 LUKS 配置 - - -- -- Failed to open %1 -- @error -- 无法打开 %1 -+ -+ Failed to open %1 -+ @error -+ 无法打开 %1 - -- -- -+ -+ - DummyCppJob - -- -- Performing dummy C++ job… -- @status -- 正在执行虚拟 C++ 任务… -+ -+ Performing dummy C++ job… -+ @status -+ 正在执行虚拟 C++ 任务… - -- -- -+ -+ - EditExistingPartitionDialog - -- -- Edit Existing Partition -- 编辑已有分区 -+ -+ Edit Existing Partition -+ 编辑已有分区 - - -- -- Con&tent: -- 内容:(&T) -+ -+ Con&tent: -+ 内容:(&T) - - -- -- &Keep -- 保留 (&K) -+ -+ &Keep -+ 保留 (&K) - - -- -- Format -- 格式化 -+ -+ Format -+ 格式化 - - -- -- Warning: Formatting the partition will erase all existing data. -- 警告:格式化分区将删除所有已有数据。 -+ -+ Warning: Formatting the partition will erase all existing data. -+ 警告:格式化分区将删除所有已有数据。 - - -- -- &Mount Point: -- 挂载点(&M): -+ -+ &Mount Point: -+ 挂载点(&M): - - -- -- Si&ze: -- 尺寸 (&Z): -+ -+ Si&ze: -+ 尺寸 (&Z): - - -- -- MiB -- MiB -+ -+ MiB -+ MiB - - -- -- Fi&le System: -- 文件系统 (&L): -+ -+ Fi&le System: -+ 文件系统 (&L): - - -- -- Flags: -- 标记: -+ -+ Flags: -+ 标记: - - -- -- Label for the filesystem -- 此文件系统的卷标名 -+ -+ Label for the filesystem -+ 此文件系统的卷标名 - - -- -- FS Label: -- 文件系统卷标 -+ -+ FS Label: -+ 文件系统卷标 - - -- -- Passphrase for existing partition -- 既有分区的密码 -+ -+ Passphrase for existing partition -+ 既有分区的密码 - - -- -- Partition %1 could not be decrypted with the given passphrase.<br/><br/>Edit the partition again and give the correct passphrase or delete and create a new encrypted partition. -- 分区 %1 无法使用给定的密码解密。<br/><br/>请再次编辑分区并输入正确密码或删除并创建新的加密分区。 -+ -+ Partition %1 could not be decrypted with the given passphrase.<br/><br/>Edit the partition again and give the correct passphrase or delete and create a new encrypted partition. -+ 分区 %1 无法使用给定的密码解密。<br/><br/>请再次编辑分区并输入正确密码或删除并创建新的加密分区。 - -- -- -+ -+ - EncryptWidget - -- -- En&crypt system -- 加密系统 -+ -+ En&crypt system -+ 加密系统 - - -- -- Your system does not seem to support encryption well enough to encrypt the entire system. You may enable encryption, but performance may suffer. -- 您的系统似乎不太支持加密,无法对整个系统进行加密。您可以启用加密,但性能可能会受到影响。 -+ -+ Your system does not seem to support encryption well enough to encrypt the entire system. You may enable encryption, but performance may suffer. -+ 您的系统似乎不太支持加密,无法对整个系统进行加密。您可以启用加密,但性能可能会受到影响。 - - -- -- Passphrase -- 密码 -+ -+ Passphrase -+ 密码 - - -- -- Confirm passphrase -- 确认密码 -+ -+ Confirm passphrase -+ 确认密码 - - -- -- -- Please enter the same passphrase in both boxes. -- @tooltip -- 请在两个输入框中输入同样的密码。 -+ -+ -+ Please enter the same passphrase in both boxes. -+ @tooltip -+ 请在两个输入框中输入同样的密码。 - - -- -- Password must be a minimum of %1 characters. -- @tooltip -- 密码必须至少包含 %1 个字符。 -+ -+ Password must be a minimum of %1 characters. -+ @tooltip -+ 密码必须至少包含 %1 个字符。 - -- -- -+ -+ - ErrorDialog - -- -- Details: -- 详情: -+ -+ Details: -+ 详情: - - -- -- Would you like to paste the install log to the web? -- 需要将安装日志粘贴到网页吗? -+ -+ Would you like to paste the install log to the web? -+ 需要将安装日志粘贴到网页吗? - -- -- -+ -+ - FillGlobalStorageJob - -- -- Set partition information -- @title -- 设置分区信息 -+ -+ Set partition information -+ @title -+ 设置分区信息 - - -- -- Install %1 on <strong>new</strong> %2 system partition with features <em>%3</em> -- @info -- 在有 <em>%3</em> 特性的<strong>新</strong> %2 系統分区上安裝 %1 -+ -+ Install %1 on <strong>new</strong> %2 system partition with features <em>%3</em> -+ @info -+ 在有 <em>%3</em> 特性的<strong>新</strong> %2 系統分区上安裝 %1 - - -- -- Install %1 on <strong>new</strong> %2 system partition -- @info -- 在 <strong>新的</strong>系统分区 %2 上安装 %1 -+ -+ Install %1 on <strong>new</strong> %2 system partition -+ @info -+ 在 <strong>新的</strong>系统分区 %2 上安装 %1 - - -- -- Set up <strong>new</strong> %2 partition with mount point <strong>%1</strong> and features <em>%3</em> -- @info -- -+ -+ Set up <strong>new</strong> %2 partition with mount point <strong>%1</strong> and features <em>%3</em> -+ @info -+ - - -- -- Set up <strong>new</strong> %2 partition with mount point <strong>%1</strong>%3 -- @info -- 设置 <strong>新的</strong> 含挂载点 <strong>%1</strong>%3 的 %2 分区 -+ -+ Set up <strong>new</strong> %2 partition with mount point <strong>%1</strong>%3 -+ @info -+ 设置 <strong>新的</strong> 含挂载点 <strong>%1</strong>%3 的 %2 分区 - - -- -- Install %2 on %3 system partition <strong>%1</strong> with features <em>%4</em> -- @info -- -+ -+ Install %2 on %3 system partition <strong>%1</strong> with features <em>%4</em> -+ @info -+ - - -- -- Install %2 on %3 system partition <strong>%1</strong> -- @info -- 在 %3 系统分区 <strong>%1</strong> 上安装 %2 -+ -+ Install %2 on %3 system partition <strong>%1</strong> -+ @info -+ 在 %3 系统分区 <strong>%1</strong> 上安装 %2 - - -- -- Set up %3 partition <strong>%1</strong> with mount point <strong>%2</strong> and features <em>%4</em> -- @info -- -+ -+ Set up %3 partition <strong>%1</strong> with mount point <strong>%2</strong> and features <em>%4</em> -+ @info -+ - - -- -- Set up %3 partition <strong>%1</strong> with mount point <strong>%2</strong>%4… -- @info -- -+ -+ Set up %3 partition <strong>%1</strong> with mount point <strong>%2</strong>%4… -+ @info -+ - - -- -- Install boot loader on <strong>%1</strong>… -- @info -- 在 <strong>%1</strong>上安装引导程序… -+ -+ Install boot loader on <strong>%1</strong>… -+ @info -+ 在 <strong>%1</strong>上安装引导程序… - - -- -- Setting up mount points… -- @status -- 正在设置挂载点… -+ -+ Setting up mount points… -+ @status -+ 正在设置挂载点… - -- -- -+ -+ - FinishedPage - -- -- &Restart now -- 现在重启(&R) -+ -+ &Restart now -+ 现在重启(&R) - - -- -- <h1>All done.</h1><br/>%1 has been set up on your computer.<br/>You may now start using your new system. -- @info -- <h1>安装成功!</h1><br/>%1 已安装在您的电脑上了。<br/>您现在可以重新启动到新系统。 -+ -+ <h1>All done.</h1><br/>%1 has been set up on your computer.<br/>You may now start using your new system. -+ @info -+ <h1>安装成功!</h1><br/>%1 已安装在您的电脑上了。<br/>您现在可以重新启动到新系统。 - - -- -- <html><head/><body><p>When this box is checked, your system will restart immediately when you click on <span style="font-style:italic;">Done</span> or close the setup program.</p></body></html> -- @tooltip -- <html><head/><body><p>当选中此项时,系统会在您关闭安装器或点击 <span style=" font-style:italic;">完成</span> 按钮时立即重启</p></body></html> -+ -+ <html><head/><body><p>When this box is checked, your system will restart immediately when you click on <span style="font-style:italic;">Done</span> or close the setup program.</p></body></html> -+ @tooltip -+ <html><head/><body><p>当选中此项时,系统会在您关闭安装器或点击 <span style=" font-style:italic;">完成</span> 按钮时立即重启</p></body></html> - - -- -- <h1>All done.</h1><br/>%1 has been installed on your computer.<br/>You may now restart into your new system, or continue using the %2 Live environment. -- @info -- <h1>安装成功!</h1><br/>%1 已安装在您的电脑上了。<br/>您现在可以重新启动到新系统,或是继续使用 %2 Live 环境。 -+ -+ <h1>All done.</h1><br/>%1 has been installed on your computer.<br/>You may now restart into your new system, or continue using the %2 Live environment. -+ @info -+ <h1>安装成功!</h1><br/>%1 已安装在您的电脑上了。<br/>您现在可以重新启动到新系统,或是继续使用 %2 Live 环境。 - - -- -- <html><head/><body><p>When this box is checked, your system will restart immediately when you click on <span style="font-style:italic;">Done</span> or close the installer.</p></body></html> -- @tooltip -- <html><head/><body><p>当选中此项时,系统会在您关闭安装器或点击 <span style=" font-style:italic;">完成</span> 按钮时立即重启</p></body></html> -+ -+ <html><head/><body><p>When this box is checked, your system will restart immediately when you click on <span style="font-style:italic;">Done</span> or close the installer.</p></body></html> -+ @tooltip -+ <html><head/><body><p>当选中此项时,系统会在您关闭安装器或点击 <span style=" font-style:italic;">完成</span> 按钮时立即重启</p></body></html> - - -- -- <h1>Setup Failed</h1><br/>%1 has not been set up on your computer.<br/>The error message was: %2. -- @info, %1 is product name with version -- <h1>安装失败</h1><br/>%1 未在你的电脑上安装。<br/>错误信息:%2。 -+ -+ <h1>Setup Failed</h1><br/>%1 has not been set up on your computer.<br/>The error message was: %2. -+ @info, %1 is product name with version -+ <h1>安装失败</h1><br/>%1 未在你的电脑上安装。<br/>错误信息:%2。 - - -- -- <h1>Installation Failed</h1><br/>%1 has not been installed on your computer.<br/>The error message was: %2. -- @info, %1 is product name with version -- <h1>安装失败</h1><br/>%1 未在你的电脑上安装。<br/>错误信息:%2。 -+ -+ <h1>Installation Failed</h1><br/>%1 has not been installed on your computer.<br/>The error message was: %2. -+ @info, %1 is product name with version -+ <h1>安装失败</h1><br/>%1 未在你的电脑上安装。<br/>错误信息:%2。 - -- -- -+ -+ - FinishedQmlViewStep - -- -- Finish -- @label -- 结束 -+ -+ Finish -+ @label -+ 结束 - -- -- -+ -+ - FinishedViewStep - -- -- Finish -- @label -- 结束 -+ -+ Finish -+ @label -+ 结束 - -- -- -+ -+ - FormatPartitionJob - -- -- Format partition %1 (file system: %2, size: %3 MiB) on %4 -- @title -- 格式化在 %4 的分区 %1 (文件系统:%2,大小:%3 MB) -+ -+ Format partition %1 (file system: %2, size: %3 MiB) on %4 -+ @title -+ 格式化在 %4 的分区 %1 (文件系统:%2,大小:%3 MB) - - -- -- Format <strong>%3MiB</strong> partition <strong>%1</strong> with file system <strong>%2</strong> -- @info -- 以文件系统 <strong>%2</strong> 格式化 <strong>%3MB</strong> 的分区 <strong>%1</strong> -+ -+ Format <strong>%3MiB</strong> partition <strong>%1</strong> with file system <strong>%2</strong> -+ @info -+ 以文件系统 <strong>%2</strong> 格式化 <strong>%3MB</strong> 的分区 <strong>%1</strong> - - -- -- %1 (%2) -- partition label %1 (device path %2) -- %1(%2) -+ -+ %1 (%2) -+ partition label %1 (device path %2) -+ %1(%2) - - -- -- Formatting partition %1 with file system %2… -- @status -- 正在使用 %2 文件系统格式化分区 %1… -+ -+ Formatting partition %1 with file system %2… -+ @status -+ 正在使用 %2 文件系统格式化分区 %1… - - -- -- The installer failed to format partition %1 on disk '%2'. -- 安装程序格式化磁盘“%2”上的分区 %1 失败。 -+ -+ The installer failed to format partition %1 on disk '%2'. -+ 安装程序格式化磁盘“%2”上的分区 %1 失败。 - -- -- -+ -+ - GeneralRequirements - -- -- Please ensure the system has at least %1 GiB available drive space. -- 请确保系统有至少 %1 GiB 可用磁盘空间。 -+ -+ Please ensure the system has at least %1 GiB available drive space. -+ 请确保系统有至少 %1 GiB 可用磁盘空间。 - - -- -- Available drive space is all of the hard disks and SSDs connected to the system. -- 可用驱动器空间是连接到系统的所有硬盘和 SSD。 -+ -+ Available drive space is all of the hard disks and SSDs connected to the system. -+ 可用驱动器空间是连接到系统的所有硬盘和 SSD。 - - -- -- There is not enough drive space. At least %1 GiB is required. -- 没有足够的磁盘空间。至少需要 %1 GB。 -+ -+ There is not enough drive space. At least %1 GiB is required. -+ 没有足够的磁盘空间。至少需要 %1 GB。 - - -- -- has at least %1 GiB working memory -- 至少 %1 GB 可用内存 -+ -+ has at least %1 GiB working memory -+ 至少 %1 GB 可用内存 - - -- -- The system does not have enough working memory. At least %1 GiB is required. -- 系统没有足够的内存。至少需要 %1 GB。 -+ -+ The system does not have enough working memory. At least %1 GiB is required. -+ 系统没有足够的内存。至少需要 %1 GB。 - - -- -- is plugged in to a power source -- 已连接到电源 -+ -+ is plugged in to a power source -+ 已连接到电源 - - -- -- The system is not plugged in to a power source. -- 系统未连接到电源。 -+ -+ The system is not plugged in to a power source. -+ 系统未连接到电源。 - - -- -- is connected to the Internet -- 已连接到互联网 -+ -+ is connected to the Internet -+ 已连接到互联网 - - -- -- The system is not connected to the Internet. -- 系统未连接到互联网。 -+ -+ The system is not connected to the Internet. -+ 系统未连接到互联网。 - - -- -- is running the installer as an administrator (root) -- 正以管理员(root)权限运行安装器 -+ -+ is running the installer as an administrator (root) -+ 正以管理员(root)权限运行安装器 - - -- -- The setup program is not running with administrator rights. -- 安装器未以管理员权限运行 -+ -+ The setup program is not running with administrator rights. -+ 安装器未以管理员权限运行 - - -- -- The installer is not running with administrator rights. -- 安装器未以管理员权限运行 -+ -+ The installer is not running with administrator rights. -+ 安装器未以管理员权限运行 - - -- -- has a screen large enough to show the whole installer -- 有一个足够大的屏幕来显示整个安装器 -+ -+ has a screen large enough to show the whole installer -+ 有一个足够大的屏幕来显示整个安装器 - - -- -- The screen is too small to display the setup program. -- 屏幕太小无法显示安装程序。 -+ -+ The screen is too small to display the setup program. -+ 屏幕太小无法显示安装程序。 - - -- -- The screen is too small to display the installer. -- 屏幕不能完整显示安装器。 -+ -+ The screen is too small to display the installer. -+ 屏幕不能完整显示安装器。 - - -- -- is always false -- -+ -+ is always false -+ - - -- -- The computer says no. -- -+ -+ The computer says no. -+ - - -- -- is always false (slowly) -- -+ -+ is always false (slowly) -+ - - -- -- The computer says no (slowly). -- -+ -+ The computer says no (slowly). -+ - - -- -- is always true -- -+ -+ is always true -+ - - -- -- The computer says yes. -- -+ -+ The computer says yes. -+ - - -- -- is always true (slowly) -- -+ -+ is always true (slowly) -+ - - -- -- The computer says yes (slowly). -- -+ -+ The computer says yes (slowly). -+ - - -- -- is checked three times. -- 已检测了 3 次。 -+ -+ is checked three times. -+ 已检测了 3 次。 - - -- -- The snark has not been checked three times. -- The (some mythological beast) has not been checked three times. -- snark 没有检查三次。 -+ -+ The snark has not been checked three times. -+ The (some mythological beast) has not been checked three times. -+ snark 没有检查三次。 - -- -- -+ -+ - HostInfoJob - -- -- Collecting information about your machine… -- @status -- 正在收集此计算机的信息… -+ -+ Collecting information about your machine… -+ @status -+ 正在收集此计算机的信息… - -- -- -+ -+ - IDJob - -- -- -- -- -- OEM Batch Identifier -- OEM批量标识 -+ -+ -+ -+ -+ OEM Batch Identifier -+ OEM批量标识 - - -- -- Could not create directories <code>%1</code>. -- 无法创建目录<code>%1</code>。 -+ -+ Could not create directories <code>%1</code>. -+ 无法创建目录<code>%1</code>。 - - -- -- Could not open file <code>%1</code>. -- 无法打开文件<code>%1</code>。 -+ -+ Could not open file <code>%1</code>. -+ 无法打开文件<code>%1</code>。 - - -- -- Could not write to file <code>%1</code>. -- 无法写入文件<code>%1</code>。 -+ -+ Could not write to file <code>%1</code>. -+ 无法写入文件<code>%1</code>。 - -- -- -+ -+ - InitcpioJob - -- -- Creating initramfs with mkinitcpio… -- @status -- 正在用 mkinitcpio 创建 initramfs… -+ -+ Creating initramfs with mkinitcpio… -+ @status -+ 正在用 mkinitcpio 创建 initramfs… - -- -- -+ -+ - InitramfsJob - -- -- Creating initramfs… -- @status -- 正在创建 initramfs… -+ -+ Creating initramfs… -+ @status -+ 正在创建 initramfs… - -- -- -+ -+ - InteractiveTerminalPage - -- -- Konsole not installed. -- @error -- 未安装 Konsole 。 -+ -+ Konsole not installed. -+ @error -+ 未安装 Konsole 。 - - -- -- Please install KDE Konsole and try again! -- @info -- 请安装 KDE Konsole 后重试! -+ -+ Please install KDE Konsole and try again! -+ @info -+ 请安装 KDE Konsole 后重试! - - -- -- Executing script: &nbsp;<code>%1</code> -- @info -- 正在运行脚本:&nbsp;<code>%1</code> -+ -+ Executing script: &nbsp;<code>%1</code> -+ @info -+ 正在运行脚本:&nbsp;<code>%1</code> - -- -- -+ -+ - InteractiveTerminalViewStep - -- -- Script -- @label -- 脚本 -+ -+ Script -+ @label -+ 脚本 - -- -- -+ -+ - KeyboardQmlViewStep - -- -- Keyboard -- @label -- 键盘 -+ -+ Keyboard -+ @label -+ 键盘 - -- -- -+ -+ - KeyboardViewStep - -- -- Keyboard -- @label -- 键盘 -+ -+ Keyboard -+ @label -+ 键盘 - -- -- -+ -+ - LCLocaleDialog - -- -- System Locale Setting -- @title -- 系统区域设置 -+ -+ System Locale Setting -+ @title -+ 系统区域设置 - - -- -- The system locale setting affects the language and character set for some command line user interface elements.<br/>The current setting is <strong>%1</strong>. -- @info -- 系统语言区域设置会影响部份命令行用户界面的语言及字符集。<br/>目前的设置为 <strong>%1</strong>。 -+ -+ The system locale setting affects the language and character set for some command line user interface elements.<br/>The current setting is <strong>%1</strong>. -+ @info -+ 系统语言区域设置会影响部份命令行用户界面的语言及字符集。<br/>目前的设置为 <strong>%1</strong>。 - - -- -- &Cancel -- @button -- 取消(&C) -+ -+ &Cancel -+ @button -+ 取消(&C) - - -- -- &OK -- @button -- &确定 -+ -+ &OK -+ @button -+ &确定 - -- -- -+ -+ - LOSHJob - -- -- Configuring encrypted swap. -- 配置加密交换分区。 -+ -+ Configuring encrypted swap. -+ 配置加密交换分区。 - - -- -- No target system available. -- 没有可用的目标系统。 -+ -+ No target system available. -+ 没有可用的目标系统。 - - -- -- No rootMountPoint is set. -- 没有设定 root 挂载点。 -+ -+ No rootMountPoint is set. -+ 没有设定 root 挂载点。 - - -- -- No configFilePath is set. -- 未设置配置文件路径。 -+ -+ No configFilePath is set. -+ 未设置配置文件路径。 - -- -- -+ -+ - LicensePage - -- -- <h1>License Agreement</h1> -- <h1>许可证</h1> -+ -+ <h1>License Agreement</h1> -+ <h1>许可证</h1> - - -- -- I accept the terms and conditions above. -- @info -- 我同意如上条款。 -+ -+ I accept the terms and conditions above. -+ @info -+ 我同意如上条款。 - - -- -- Please review the End User License Agreements (EULAs). -- @info -- 请查阅最终用户许可协议 (EULAs)。 -+ -+ Please review the End User License Agreements (EULAs). -+ @info -+ 请查阅最终用户许可协议 (EULAs)。 - - -- -- This setup procedure will install proprietary software that is subject to licensing terms. -- @info -- 此安装过程会安装受许可条款约束的专有软件。 -+ -+ This setup procedure will install proprietary software that is subject to licensing terms. -+ @info -+ 此安装过程会安装受许可条款约束的专有软件。 - - -- -- If you do not agree with the terms, the setup procedure cannot continue. -- @info -- 如果您不同意这些条款,安装过程将无法继续。 -+ -+ If you do not agree with the terms, the setup procedure cannot continue. -+ @info -+ 如果您不同意这些条款,安装过程将无法继续。 - - -- -- This setup procedure can install proprietary software that is subject to licensing terms in order to provide additional features and enhance the user experience. -- @info -- 此安装过程会安装受许可条款约束的专有软件,用于提供额外功能和提升用户体验。 -+ -+ This setup procedure can install proprietary software that is subject to licensing terms in order to provide additional features and enhance the user experience. -+ @info -+ 此安装过程会安装受许可条款约束的专有软件,用于提供额外功能和提升用户体验。 - - -- -- If you do not agree with the terms, proprietary software will not be installed, and open source alternatives will be used instead. -- @info -- 如果您不同意这些条款,专有软件不会被安装,相应的开源软件替代品将被安装。 -+ -+ If you do not agree with the terms, proprietary software will not be installed, and open source alternatives will be used instead. -+ @info -+ 如果您不同意这些条款,专有软件不会被安装,相应的开源软件替代品将被安装。 - -- -- -+ -+ - LicenseViewStep - -- -- License -- @label -- 许可证 -+ -+ License -+ @label -+ 许可证 - -- -- -+ -+ - LicenseWidget - -- -- URL: %1 -- @label -- URL: %1 -+ -+ URL: %1 -+ @label -+ URL: %1 - - -- -- <strong>%1 driver</strong><br/>by %2 -- @label, %1 is product name, %2 is product vendor -- %1 is an untranslatable product name, example: Creative Audigy driver -- <strong>%1 驱动程序</strong><br/>由 %2 提供 -+ -+ <strong>%1 driver</strong><br/>by %2 -+ @label, %1 is product name, %2 is product vendor -+ %1 is an untranslatable product name, example: Creative Audigy driver -+ <strong>%1 驱动程序</strong><br/>由 %2 提供 - - -- -- <strong>%1 graphics driver</strong><br/><font color="Grey">by %2</font> -- @label, %1 is product name, %2 is product vendor -- %1 is usually a vendor name, example: Nvidia graphics driver -- <strong>%1 显卡驱动程序</strong><br/><font color="Grey">由 %2 提供</font> -+ -+ <strong>%1 graphics driver</strong><br/><font color="Grey">by %2</font> -+ @label, %1 is product name, %2 is product vendor -+ %1 is usually a vendor name, example: Nvidia graphics driver -+ <strong>%1 显卡驱动程序</strong><br/><font color="Grey">由 %2 提供</font> - - -- -- <strong>%1 browser plugin</strong><br/><font color="Grey">by %2</font> -- @label, %1 is product name, %2 is product vendor -- <strong>%1 浏览器插件</strong><br/><font color="Grey">由 %2 提供</font> -+ -+ <strong>%1 browser plugin</strong><br/><font color="Grey">by %2</font> -+ @label, %1 is product name, %2 is product vendor -+ <strong>%1 浏览器插件</strong><br/><font color="Grey">由 %2 提供</font> - - -- -- <strong>%1 codec</strong><br/><font color="Grey">by %2</font> -- @label, %1 is product name, %2 is product vendor -- <strong>%1 编解码器</strong><br/><font color="Grey">由 %2 提供</font> -+ -+ <strong>%1 codec</strong><br/><font color="Grey">by %2</font> -+ @label, %1 is product name, %2 is product vendor -+ <strong>%1 编解码器</strong><br/><font color="Grey">由 %2 提供</font> - - -- -- <strong>%1 package</strong><br/><font color="Grey">by %2</font> -- @label, %1 is product name, %2 is product vendor -- <strong>%1 软件包</strong><br/><font color="Grey">由 %2 提供</font> -+ -+ <strong>%1 package</strong><br/><font color="Grey">by %2</font> -+ @label, %1 is product name, %2 is product vendor -+ <strong>%1 软件包</strong><br/><font color="Grey">由 %2 提供</font> - - -- -- <strong>%1</strong><br/><font color="Grey">by %2</font> -- @label, %1 is product name, %2 is product vendor -- <strong>%1</strong><br/><font color="Grey">由 %2 提供</font> -+ -+ <strong>%1</strong><br/><font color="Grey">by %2</font> -+ @label, %1 is product name, %2 is product vendor -+ <strong>%1</strong><br/><font color="Grey">由 %2 提供</font> - - -- -- File: %1 -- @label -- 文件:%1 -+ -+ File: %1 -+ @label -+ 文件:%1 - - -- -- Hide the license text -- @tooltip -- 隐藏许可证文本 -+ -+ Hide the license text -+ @tooltip -+ 隐藏许可证文本 - - -- -- Show the license text -- @tooltip -- 显示协议文本 -+ -+ Show the license text -+ @tooltip -+ 显示协议文本 - - -- -- Open the license agreement in browser -- @tooltip -- 在浏览器中打开许可协议 -+ -+ Open the license agreement in browser -+ @tooltip -+ 在浏览器中打开许可协议 - -- -- -+ -+ - LocalePage - -- -- Region: -- @label -- 地区: -+ -+ Region: -+ @label -+ 地区: - - -- -- Zone: -- @label -- 区域: -+ -+ Zone: -+ @label -+ 区域: - - -- -- -- &Change… -- @button -- 更改 (&C) -+ -+ -+ &Change… -+ @button -+ 更改 (&C) - -- -- -+ -+ - LocaleQmlViewStep - -- -- Location -- @label -- 位置 -+ -+ Location -+ @label -+ 位置 - -- -- -+ -+ - LocaleTests - -- -- Quit -- 退出 -+ -+ Quit -+ 退出 - -- -- -+ -+ - LocaleViewStep - -- -- Location -- @label -- 位置 -+ -+ Location -+ @label -+ 位置 - -- -- -+ -+ - LuksBootKeyFileJob - -- -- Configuring LUKS key file. -- 配置 LUKS key 文件。 -+ -+ Configuring LUKS key file. -+ 配置 LUKS key 文件。 - - -- -- -- No partitions are defined. -- 未定义分区。 -+ -+ -+ No partitions are defined. -+ 未定义分区。 - - -- -- -- Encrypted rootfs setup error -- 加密根文件系时配置错误 -+ -+ -+ Encrypted rootfs setup error -+ 加密根文件系时配置错误 - - -- -- Root partition %1 is LUKS but no passphrase has been set. -- 根分区%1为LUKS但没有设置密钥。 -+ -+ Root partition %1 is LUKS but no passphrase has been set. -+ 根分区%1为LUKS但没有设置密钥。 - - -- -- Could not create LUKS key file for root partition %1. -- 无法创建根分区%1的LUKS密钥文件。 -+ -+ Could not create LUKS key file for root partition %1. -+ 无法创建根分区%1的LUKS密钥文件。 - -- -- -+ -+ - MachineIdJob - -- -- Generate machine-id. -- 生成 machine-id。 -+ -+ Generate machine-id. -+ 生成 machine-id。 - - -- -- Configuration Error -- 配置错误 -+ -+ Configuration Error -+ 配置错误 - - -- -- No root mount point is set for MachineId. -- MachineId未配置根挂载点/ -+ -+ No root mount point is set for MachineId. -+ MachineId未配置根挂载点/ - - -- -- -- -- -- File not found -- 找不到文件 -+ -+ -+ -+ -+ File not found -+ 找不到文件 - - -- -- Path <pre>%1</pre> must be an absolute path. -- 路径 <pre>%1</pre> 必须是绝对路径。 -+ -+ Path <pre>%1</pre> must be an absolute path. -+ 路径 <pre>%1</pre> 必须是绝对路径。 - - -- -- Could not create new random file <pre>%1</pre>. -- 无法创建新的随机文件 <pre>%1</pre>. -+ -+ Could not create new random file <pre>%1</pre>. -+ 无法创建新的随机文件 <pre>%1</pre>. - -- -- -+ -+ - Map - -- -- Timezone: %1 -- @label -- 时区: %1 -+ -+ Timezone: %1 -+ @label -+ 时区: %1 - - -- -- Please select your preferred location on the map so the installer can suggest the locale -+ -+ Please select your preferred location on the map so the installer can suggest the locale - and timezone settings for you. You can fine-tune the suggested settings below. Search the map by dragging - to move and using the +/- buttons to zoom in/out or use mouse scrolling for zooming. -- @info -- 请在地图上选择您的首选位置,安装程序可以为您提供可参考的区域 -+ @info -+ 请在地图上选择您的首选位置,安装程序可以为您提供可参考的区域 - 设置和时区设置。 您可以在下面微调推荐的设置。 拖动以搜索地图,然后 - 用 +/- 按钮进行放大/缩小,或使用鼠标滚动进行缩放。 - -- -- -+ -+ - Map-qt6 - -- -- Timezone: %1 -- @label -- 时区: %1 -+ -+ Timezone: %1 -+ @label -+ 时区: %1 - - -- -- Please select your preferred location on the map so the installer can suggest the locale -+ -+ Please select your preferred location on the map so the installer can suggest the locale - and timezone settings for you. You can fine-tune the suggested settings below. Search the map by dragging - to move and using the +/- buttons to zoom in/out or use mouse scrolling for zooming. -- @label -- 请在地图上选择您的首选位置,安装程序可以为您提供可参考的区域 -+ @label -+ 请在地图上选择您的首选位置,安装程序可以为您提供可参考的区域 - 设置和时区设置。 您可以在下面微调推荐的设置。 拖动以搜索地图,然后 - 用 +/- 按钮进行放大/缩小,或使用鼠标滚动进行缩放。 - -- -- -+ -+ - NetInstallViewStep - -- -- Package selection -- 软件包选择 -+ -+ Package selection -+ 软件包选择 - - -- -- Office software -- 办公软件 -+ -+ Office software -+ 办公软件 - - -- -- Office package -- 办公软件包 -+ -+ Office package -+ 办公软件包 - - -- -- Browser software -- 浏览器软件 -+ -+ Browser software -+ 浏览器软件 - - -- -- Browser package -- 浏览器安装包 -+ -+ Browser package -+ 浏览器安装包 - - -- -- Web browser -- 网页浏览器 -+ -+ Web browser -+ 网页浏览器 - - -- -- Kernel -- label for netinstall module, Linux kernel -- 内核 -+ -+ Kernel -+ label for netinstall module, Linux kernel -+ 内核 - - -- -- Services -- label for netinstall module, system services -- 服务 -+ -+ Services -+ label for netinstall module, system services -+ 服务 - - -- -- Login -- label for netinstall module, choose login manager -- 登录 -+ -+ Login -+ label for netinstall module, choose login manager -+ 登录 - - -- -- Desktop -- label for netinstall module, choose desktop environment -- 桌面 -+ -+ Desktop -+ label for netinstall module, choose desktop environment -+ 桌面 - - -- -- Applications -- 应用程序 -+ -+ Applications -+ 应用程序 - - -- -- Communication -- label for netinstall module -- 通讯 -+ -+ Communication -+ label for netinstall module -+ 通讯 - - -- -- Development -- label for netinstall module -- 开发 -+ -+ Development -+ label for netinstall module -+ 开发 - - -- -- Office -- label for netinstall module -- 办公 -+ -+ Office -+ label for netinstall module -+ 办公 - - -- -- Multimedia -- label for netinstall module -- 多媒体 -+ -+ Multimedia -+ label for netinstall module -+ 多媒体 - - -- -- Internet -- label for netinstall module -- 互联网 -+ -+ Internet -+ label for netinstall module -+ 互联网 - - -- -- Theming -- label for netinstall module -- 主题化 -+ -+ Theming -+ label for netinstall module -+ 主题化 - - -- -- Gaming -- label for netinstall module -- 游戏 -+ -+ Gaming -+ label for netinstall module -+ 游戏 - - -- -- Utilities -- label for netinstall module -- 实用工具 -+ -+ Utilities -+ label for netinstall module -+ 实用工具 - -- -- -+ -+ - NotesQmlViewStep - -- -- Notes -- 备注 -+ -+ Notes -+ 备注 - -- -- -+ -+ - OEMPage - -- -- Ba&tch: -- 批量(&T): -+ -+ Ba&tch: -+ 批量(&T): - - -- -- <html><head/><body><p>Enter a batch-identifier here. This will be stored in the target system.</p></body></html> -- <html><head/><body><p>请输入批量标识。它会被保存到目标系统上。</p></body></html> -+ -+ <html><head/><body><p>Enter a batch-identifier here. This will be stored in the target system.</p></body></html> -+ <html><head/><body><p>请输入批量标识。它会被保存到目标系统上。</p></body></html> - - -- -- <html><head/><body><h1>OEM Configuration</h1><p>Calamares will use OEM settings while configuring the target system.</p></body></html> -- <html><head/><body><h1>OEM 配置信息</h1><p>Calamares会使用OEM配置信息来配置目标系统。</p></body></html> -+ -+ <html><head/><body><h1>OEM Configuration</h1><p>Calamares will use OEM settings while configuring the target system.</p></body></html> -+ <html><head/><body><h1>OEM 配置信息</h1><p>Calamares会使用OEM配置信息来配置目标系统。</p></body></html> - -- -- -+ -+ - OEMViewStep - -- -- OEM Configuration -- OEM 配置 -+ -+ OEM Configuration -+ OEM 配置 - - -- -- Set the OEM Batch Identifier to <code>%1</code>. -- 设置OEM批量标识为 <code>%1</code>. -+ -+ Set the OEM Batch Identifier to <code>%1</code>. -+ 设置OEM批量标识为 <code>%1</code>. - -- -- -+ -+ - Offline - -- -- Select your preferred region, or use the default settings -- @label -- 选择您的首选区域,或使用默认设置 -+ -+ Select your preferred region, or use the default settings -+ @label -+ 选择您的首选区域,或使用默认设置 - - -- -- -- -- Timezone: %1 -- @label -- 时区: %1 -+ -+ -+ -+ Timezone: %1 -+ @label -+ 时区: %1 - - -- -- Select your preferred zone within your region -- @label -- 在您的区域内选择您的首选时区 -+ -+ Select your preferred zone within your region -+ @label -+ 在您的区域内选择您的首选时区 - - -- -- Zones -- @button -- 区域 -+ -+ Zones -+ @button -+ 区域 - - -- -- You can fine-tune language and locale settings below -- @label -- 您可以在下面微调语言和区域设置 -+ -+ You can fine-tune language and locale settings below -+ @label -+ 您可以在下面微调语言和区域设置 - -- -- -+ -+ - Offline-qt6 - -- -- Select your preferred region, or use the default settings -- @label -- 选择您的首选区域,或使用默认设置 -+ -+ Select your preferred region, or use the default settings -+ @label -+ 选择您的首选区域,或使用默认设置 - - -- -- -- -- Timezone: %1 -- @label -- 时区: %1 -+ -+ -+ -+ Timezone: %1 -+ @label -+ 时区: %1 - - -- -- Select your preferred zone within your region -- @label -- 在您的区域内选择您的首选时区 -+ -+ Select your preferred zone within your region -+ @label -+ 在您的区域内选择您的首选时区 - - -- -- Zones -- @button -- 区域 -+ -+ Zones -+ @button -+ 区域 - - -- -- You can fine-tune language and locale settings below -- @label -- 您可以在下面微调语言和区域设置 -+ -+ You can fine-tune language and locale settings below -+ @label -+ 您可以在下面微调语言和区域设置 - -- -- -+ -+ - PWQ - -- -- Password is too short -- 密码太短 -+ -+ Password is too short -+ 密码太短 - - -- -- Password is too long -- 密码太长 -+ -+ Password is too long -+ 密码太长 - - -- -- Password is too weak -- 密码强度太弱 -+ -+ Password is too weak -+ 密码强度太弱 - - -- -- Memory allocation error when setting '%1' -- 设置“%1”时发生内存分配错误 -+ -+ Memory allocation error when setting '%1' -+ 设置“%1”时发生内存分配错误 - - -- -- Memory allocation error -- 内存分配错误 -+ -+ Memory allocation error -+ 内存分配错误 - - -- -- The password is the same as the old one -- 新密码和老密码一致 -+ -+ The password is the same as the old one -+ 新密码和老密码一致 - - -- -- The password is a palindrome -- 新密码为回文 -+ -+ The password is a palindrome -+ 新密码为回文 - - -- -- The password differs with case changes only -- 新密码和老密码只有大小写区别 -+ -+ The password differs with case changes only -+ 新密码和老密码只有大小写区别 - - -- -- The password is too similar to the old one -- 新密码和老密码过于相似 -+ -+ The password is too similar to the old one -+ 新密码和老密码过于相似 - - -- -- The password contains the user name in some form -- 新密码包含用户名 -+ -+ The password contains the user name in some form -+ 新密码包含用户名 - - -- -- The password contains words from the real name of the user in some form -- 新密码包含用户真实姓名 -+ -+ The password contains words from the real name of the user in some form -+ 新密码包含用户真实姓名 - - -- -- The password contains forbidden words in some form -- 新密码包含不允许使用的词组 -+ -+ The password contains forbidden words in some form -+ 新密码包含不允许使用的词组 - - -- -- The password contains fewer than %n digits -- -- 密码包含的数字少于 %n 个 -- -+ -+ The password contains fewer than %n digits -+ -+ 密码包含的数字少于 %n 个 -+ - - -- -- The password contains too few digits -- 新密码包含太少数字 -+ -+ The password contains too few digits -+ 新密码包含太少数字 - - -- -- The password contains fewer than %n uppercase letters -- -- 密码包含的大写字母少于 %n 个 -- -+ -+ The password contains fewer than %n uppercase letters -+ -+ 密码包含的大写字母少于 %n 个 -+ - - -- -- The password contains too few uppercase letters -- 新密码包含太少大写字母 -+ -+ The password contains too few uppercase letters -+ 新密码包含太少大写字母 - - -- -- The password contains fewer than %n lowercase letters -- -- 密码包含的小写字母少于 %n 个 -- -+ -+ The password contains fewer than %n lowercase letters -+ -+ 密码包含的小写字母少于 %n 个 -+ - - -- -- The password contains too few lowercase letters -- 新密码包含太少小写字母 -+ -+ The password contains too few lowercase letters -+ 新密码包含太少小写字母 - - -- -- The password contains fewer than %n non-alphanumeric characters -- -- 密码包含的非字母数字字符少于 %n 个 -- -+ -+ The password contains fewer than %n non-alphanumeric characters -+ -+ 密码包含的非字母数字字符少于 %n 个 -+ - - -- -- The password contains too few non-alphanumeric characters -- 新密码包含太少非字母/数字字符 -+ -+ The password contains too few non-alphanumeric characters -+ 新密码包含太少非字母/数字字符 - - -- -- The password is shorter than %n characters -- -- 密码少于 %n 个字符 -- -+ -+ The password is shorter than %n characters -+ -+ 密码少于 %n 个字符 -+ - - -- -- The password is too short -- 新密码过短 -+ -+ The password is too short -+ 新密码过短 - - -- -- The password is a rotated version of the previous one -- 此密码是上一个的字序调整版本 -+ -+ The password is a rotated version of the previous one -+ 此密码是上一个的字序调整版本 - - -- -- The password contains fewer than %n character classes -- -- 新密码包含字符类型少于 %n 个 -- -+ -+ The password contains fewer than %n character classes -+ -+ 新密码包含字符类型少于 %n 个 -+ - - -- -- The password does not contain enough character classes -- 新密码包含太少字符类型 -+ -+ The password does not contain enough character classes -+ 新密码包含太少字符类型 - - -- -- The password contains more than %n same characters consecutively -- -- 新密码包含超过 %n 个连续的相同字符 -- -+ -+ The password contains more than %n same characters consecutively -+ -+ 新密码包含超过 %n 个连续的相同字符 -+ - - -- -- The password contains too many same characters consecutively -- 新密码包含过多连续的相同字符 -+ -+ The password contains too many same characters consecutively -+ 新密码包含过多连续的相同字符 - - -- -- The password contains more than %n characters of the same class consecutively -- -- 新密码包含超过 %n 个连续的同类型字符 -- -+ -+ The password contains more than %n characters of the same class consecutively -+ -+ 新密码包含超过 %n 个连续的同类型字符 -+ - - -- -- The password contains too many characters of the same class consecutively -- 新密码包含过多连续的同类型字符 -+ -+ The password contains too many characters of the same class consecutively -+ 新密码包含过多连续的同类型字符 - - -- -- The password contains monotonic sequence longer than %n characters -- -- 新密码包含超过 %n 个字符长度的单调序列 -- -+ -+ The password contains monotonic sequence longer than %n characters -+ -+ 新密码包含超过 %n 个字符长度的单调序列 -+ - - -- -- The password contains too long of a monotonic character sequence -- 新密码包含过长的单调序列 -+ -+ The password contains too long of a monotonic character sequence -+ 新密码包含过长的单调序列 - - -- -- No password supplied -- 未输入密码 -+ -+ No password supplied -+ 未输入密码 - - -- -- Cannot obtain random numbers from the RNG device -- 无法从随机数生成器 (RNG) 设备获取随机数 -+ -+ Cannot obtain random numbers from the RNG device -+ 无法从随机数生成器 (RNG) 设备获取随机数 - - -- -- Password generation failed - required entropy too low for settings -- 无法生成密码 - 熵值过低 -+ -+ Password generation failed - required entropy too low for settings -+ 无法生成密码 - 熵值过低 - - -- -- The password fails the dictionary check - %1 -- 新密码无法通过字典检查 - %1 -+ -+ The password fails the dictionary check - %1 -+ 新密码无法通过字典检查 - %1 - - -- -- The password fails the dictionary check -- 新密码无法通过字典检查 -+ -+ The password fails the dictionary check -+ 新密码无法通过字典检查 - - -- -- Unknown setting - %1 -- 未知设置 - %1 -+ -+ Unknown setting - %1 -+ 未知设置 - %1 - - -- -- Unknown setting -- 未知设置 -+ -+ Unknown setting -+ 未知设置 - - -- -- Bad integer value of setting - %1 -- 设置的整数值非法 - %1 -+ -+ Bad integer value of setting - %1 -+ 设置的整数值非法 - %1 - - -- -- Bad integer value -- 设置的整数值非法 -+ -+ Bad integer value -+ 设置的整数值非法 - - -- -- Setting %1 is not of integer type -- 设定值 %1 不是整数类型 -+ -+ Setting %1 is not of integer type -+ 设定值 %1 不是整数类型 - - -- -- Setting is not of integer type -- 设定值不是整数类型 -+ -+ Setting is not of integer type -+ 设定值不是整数类型 - - -- -- Setting %1 is not of string type -- 设定值 %1 不是字符串类型 -+ -+ Setting %1 is not of string type -+ 设定值 %1 不是字符串类型 - - -- -- Setting is not of string type -- 设定值不是字符串类型 -+ -+ Setting is not of string type -+ 设定值不是字符串类型 - - -- -- Opening the configuration file failed -- 无法打开配置文件 -+ -+ Opening the configuration file failed -+ 无法打开配置文件 - - -- -- The configuration file is malformed -- 配置文件格式不正确 -+ -+ The configuration file is malformed -+ 配置文件格式不正确 - - -- -- Fatal failure -- 致命错误 -+ -+ Fatal failure -+ 致命错误 - - -- -- Unknown error -- 未知错误 -+ -+ Unknown error -+ 未知错误 - -- -- -+ -+ - PackageChooserPage - -- -- Product Name -- 产品名称 -+ -+ Product Name -+ 产品名称 - - -- -- TextLabel -- 文本标签 -+ -+ TextLabel -+ 文本标签 - - -- -- Long Product Description -- 长产品描述 -+ -+ Long Product Description -+ 长产品描述 - - -- -- Package Selection -- 软件包选择 -+ -+ Package Selection -+ 软件包选择 - - -- -- Please pick a product from the list. The selected product will be installed. -- 请在列表中选一个产品。被选中的产品将会被安装。 -+ -+ Please pick a product from the list. The selected product will be installed. -+ 请在列表中选一个产品。被选中的产品将会被安装。 - -- -- -+ -+ - PackageModel - -- -- Name -- 名称 -+ -+ Name -+ 名称 - - -- -- Description -- 描述 -+ -+ Description -+ 描述 - -- -- -+ -+ - Page_Keyboard - -- -- Keyboard model: -- 键盘型号: -+ -+ Keyboard model: -+ 键盘型号: - - -- -- Type here to test your keyboard -- 在此处输入以测试键盘 -+ -+ Type here to test your keyboard -+ 在此处输入以测试键盘 - - -- -- Switch Keyboard: -- shortcut for switching between keyboard layouts -- 切换键盘: -+ -+ Switch Keyboard: -+ shortcut for switching between keyboard layouts -+ 切换键盘: - -- -- -+ -+ - Page_UserSetup - -- -- What is your name? -- 您的姓名? -+ -+ your name -+ 姓名 -+ -+ -+ -+ -+ Your Full Name -+ 全名 - - -- -- Your Full Name -- 全名 -+ -+ user name -+ 用户名 - - -- -- What name do you want to use to log in? -- 您想要使用的登录用户名是? -+ -+ -+ login -+ 登录 - - -- -- login -- 登录 -+ -+ computer name -+ 计算机名称 - - -- -- What is the name of this computer? -- 计算机名称为? -+ -+ What is your name? -+ 您的姓名? - - -- -- <small>This name will be used if you make the computer visible to others on a network.</small> -- <small>将计算机设置为对其他网络上计算机可见时将使用此名称。</small> -+ -+ What name do you want to use to log in? -+ 您想要使用的登录用户名是? - - -- -- Computer Name -- 计算机名称 -+ -+ What is the name of this computer? -+ 计算机名称为? - - -- -- Choose a password to keep your account safe. -- 选择一个密码来保证您的账户安全。 -+ -+ -+ <small>This name will be used if you make the computer visible to others on a network.</small> -+ <small>将计算机设置为对其他网络上计算机可见时将使用此名称。</small> - - -- -- -- <small>Enter the same password twice, so that it can be checked for typing errors. A good password will contain a mixture of letters, numbers and punctuation, should be at least eight characters long, and should be changed at regular intervals.</small> -- <small>输入相同密码两次,以检查输入错误。好的密码包含字母,数字,标点的组合,应当至少为 8 个字符长,并且应按一定周期更换。</small> -+ -+ -+ Computer Name -+ 计算机名称 - - -- -- -- Password -- 密码 -+ -+ -+ Choose a password to keep your account safe. -+ 选择一个密码来保证您的账户安全。 - - -- -- -- Repeat Password -- 重复密码 -+ -+ -+ -+ -+ <small>Enter the same password twice, so that it can be checked for typing errors. A good password will contain a mixture of letters, numbers and punctuation, should be at least eight characters long, and should be changed at regular intervals.</small> -+ <small>输入相同密码两次,以检查输入错误。好的密码包含字母,数字,标点的组合,应当至少为 8 个字符长,并且应按一定周期更换。</small> - - -- -- When this box is checked, password-strength checking is done and you will not be able to use a weak password. -- 若选中此项,密码强度检测会开启,你将不被允许使用弱密码。 -+ -+ -+ -+ -+ Password -+ 密码 - - -- -- Require strong passwords. -- 要求使用强密码。 -+ -+ -+ -+ -+ Repeat Password -+ 重复密码 - - -- -- Log in automatically without asking for the password. -- 不询问密码自动登录。 -+ -+ -+ When this box is checked, password-strength checking is done and you will not be able to use a weak password. -+ 若选中此项,密码强度检测会开启,你将不被允许使用弱密码。 - - -- -- Use the same password for the administrator account. -- 为管理员帐号使用同样的密码。 -+ -+ -+ Require strong passwords. -+ 要求使用强密码。 - - -- -- Choose a password for the administrator account. -- 选择管理员账户的密码。 -+ -+ -+ Log in automatically without asking for the password. -+ 不询问密码自动登录。 - - -- -- -- <small>Enter the same password twice, so that it can be checked for typing errors.</small> -- <small>输入相同密码两次,以检查输入错误。</small> -+ -+ Use the same password for the administrator account. -+ 为管理员帐号使用同样的密码。 - -- -- -+ -+ -+ -+ Use Active Directory -+ -+ -+ -+ -+ -+ Domain: -+ -+ -+ -+ -+ -+ Domain Administrator: -+ -+ -+ -+ -+ -+ Password: -+ -+ -+ -+ -+ -+ IP Address (optional): -+ -+ -+ -+ -+ Use the same password for the root account. -+ 为管理员帐号使用同样的密码。 -+ -+ -+ -+ -+ Choose a password for the administrator account. -+ 选择管理员账户的密码。 -+ -+ -+ -+ -+ -+ -+ <small>Enter the same password twice, so that it can be checked for typing errors.</small> -+ <small>输入相同密码两次,以检查输入错误。</small> ++ ++ ++ Yerevan ++ tz_names ++ 葉里溫 + -+ -+ - PartitionLabelsView - -- -- Root -- 根目录 -+ -+ Root -+ 根目录 - - -- -- Home -- @label -- 主目录 -+ -+ Home -+ @label -+ 主目录 - - -- -- Boot -- @label -- 引导 -+ -+ Boot -+ @label -+ 引导 - - -- -- EFI system -- @label -- EFI 系统 -+ -+ EFI system -+ @label -+ EFI 系统 - - -- -- Swap -- @label -- 交换 -+ -+ Swap -+ @label -+ 交换 - - -- -- New partition for %1 -- @label -- %1 的新分区 -+ -+ New partition for %1 -+ @label -+ %1 的新分区 - - -- -- New partition -- @label -- 新建分区 -+ -+ New partition -+ @label -+ 新建分区 - - -- -- %1 %2 -- size[number] filesystem[name] -- %1 %2 -+ -+ %1 %2 -+ size[number] filesystem[name] -+ %1 %2 - -- -- -+ -+ - PartitionModel - -- -- -- Free Space -- @title -- 空闲空间 -+ -+ -+ Free Space -+ @title -+ 空闲空间 - - -- -- -- New Partition -- @title -- 新建分区 -+ -+ -+ New Partition -+ @title -+ 新建分区 - - -- -- Name -- @title -- 名称 -+ -+ Name -+ @title -+ 名称 - - -- -- File System -- @title -- 文件系统 -+ -+ File System -+ @title -+ 文件系统 - - -- -- File System Label -- @title -- 文件系统卷标 -+ -+ File System Label -+ @title -+ 文件系统卷标 - - -- -- Mount Point -- @title -- 挂载点 -+ -+ Mount Point -+ @title -+ 挂载点 - - -- -- Size -- @title -- 大小 -+ -+ Size -+ @title -+ 大小 - -- -- -+ -+ - PartitionPage - -- -- Storage de&vice: -- 存储器(&V): -+ -+ Storage de&vice: -+ 存储器(&V): - - -- -- &Revert All Changes -- 撤销所有修改(&R) -+ -+ &Revert All Changes -+ 撤销所有修改(&R) - - -- -- New Partition &Table -- 新建分区表(&T) -+ -+ New Partition &Table -+ 新建分区表(&T) - - -- -- Cre&ate -- 创建 -+ -+ Cre&ate -+ 创建 - - -- -- &Edit -- 编辑(&E) -+ -+ &Edit -+ 编辑(&E) - - -- -- &Delete -- 删除(&D) -+ -+ &Delete -+ 删除(&D) - - -- -- New Volume Group -- 新分卷组 -+ -+ New Volume Group -+ 新分卷组 - - -- -- Resize Volume Group -- 调整分卷组大小 -+ -+ Resize Volume Group -+ 调整分卷组大小 - - -- -- Deactivate Volume Group -- 停用分卷组 -+ -+ Deactivate Volume Group -+ 停用分卷组 - - -- -- Remove Volume Group -- 移除分卷组 -+ -+ Remove Volume Group -+ 移除分卷组 - - -- -- I&nstall boot loader on: -- 安装引导程序至: -+ -+ I&nstall boot loader on: -+ 安装引导程序至: - - -- -- Are you sure you want to create a new partition table on %1? -- 您是否确定要在 %1 上创建新分区表? -+ -+ Are you sure you want to create a new partition table on %1? -+ 您是否确定要在 %1 上创建新分区表? - - -- -- Can not create new partition -- 无法创建新分区 -+ -+ Can not create new partition -+ 无法创建新分区 - - -- -- The partition table on %1 already has %2 primary partitions, and no more can be added. Please remove one primary partition and add an extended partition, instead. -- %1上的分区表已经有%2个主分区,并且不能再添加。请删除一个主分区并添加扩展分区。 -+ -+ The partition table on %1 already has %2 primary partitions, and no more can be added. Please remove one primary partition and add an extended partition, instead. -+ %1上的分区表已经有%2个主分区,并且不能再添加。请删除一个主分区并添加扩展分区。 - -- -- -+ -+ - PartitionViewStep - -- -- Gathering system information… -- @status -- 正在收集系统信息 ... -+ -+ Gathering system information… -+ @status -+ 正在收集系统信息 ... - - -- -- Partitions -- @label -- 分区 -+ -+ Partitions -+ @label -+ 分区 - - -- -- Install %1 <strong>alongside</strong> another operating system -- @label -- -+ -+ Install %1 <strong>alongside</strong> another operating system -+ @label -+ - - -- -- <strong>Erase</strong> disk and install %1 -- @label -- <strong>擦除</strong>磁盘并安装 %1 -+ -+ <strong>Erase</strong> disk and install %1 -+ @label -+ <strong>擦除</strong>磁盘并安装 %1 - - -- -- <strong>Replace</strong> a partition with %1 -- @label -- 以 %1 <strong>替代</strong>一个分区 -+ -+ <strong>Replace</strong> a partition with %1 -+ @label -+ 以 %1 <strong>替代</strong>一个分区 - - -- -- <strong>Manual</strong> partitioning -- @label -- <strong>手动</strong>分区 -+ -+ <strong>Manual</strong> partitioning -+ @label -+ <strong>手动</strong>分区 - - -- -- Install %1 <strong>alongside</strong> another operating system on disk <strong>%2</strong> (%3) -- @info -- -+ -+ Install %1 <strong>alongside</strong> another operating system on disk <strong>%2</strong> (%3) -+ @info -+ - - -- -- <strong>Erase</strong> disk <strong>%2</strong> (%3) and install %1 -- @info -- -+ -+ <strong>Erase</strong> disk <strong>%2</strong> (%3) and install %1 -+ @info -+ - - -- -- <strong>Replace</strong> a partition on disk <strong>%2</strong> (%3) with %1 -- @info -- -+ -+ <strong>Replace</strong> a partition on disk <strong>%2</strong> (%3) with %1 -+ @info -+ - - -- -- <strong>Manual</strong> partitioning on disk <strong>%1</strong> (%2) -- @info -- -+ -+ <strong>Manual</strong> partitioning on disk <strong>%1</strong> (%2) -+ @info -+ - - -- -- Disk <strong>%1</strong> (%2) -- @info -- 磁盘 <strong>%1</strong> (%2) -+ -+ Disk <strong>%1</strong> (%2) -+ @info -+ 磁盘 <strong>%1</strong> (%2) - - -- -- Unsafe partition actions are enabled. -- 已启用不安全的分区操作。 -+ -+ Unsafe partition actions are enabled. -+ 已启用不安全的分区操作。 - - -- -- Partitioning is configured to <b>always</b> fail. -- 分区操作被配置为<b>总是</b>失败。 -+ -+ Partitioning is configured to <b>always</b> fail. -+ 分区操作被配置为<b>总是</b>失败。 - - -- -- No partitions will be changed. -- 不会更改任何分区。 -+ -+ No partitions will be changed. -+ 不会更改任何分区。 - - -- -- Current: -- @label -- 当前: -+ -+ Current: -+ @label -+ 当前: - - -- -- After: -- @label -- 之后: -+ -+ After: -+ @label -+ 之后: - - -- -- An EFI system partition is necessary to start %1.<br/><br/>To configure an EFI system partition, go back and select or create a suitable filesystem. -- 启动 %1 必须需要 EFI 系統分区。<br/><br/>要設定 EFI 系统分区,返回并选择或者建立符合要求的分区。 -+ -+ An EFI system partition is necessary to start %1.<br/><br/>To configure an EFI system partition, go back and select or create a suitable filesystem. -+ 启动 %1 必须需要 EFI 系統分区。<br/><br/>要設定 EFI 系统分区,返回并选择或者建立符合要求的分区。 - - -- -- An EFI system partition is necessary to start %1.<br/><br/>The EFI system partition does not meet recommendations. It is recommended to go back and select or create a suitable filesystem. -- EFI系统分区是启动 %1 所必需的。<br/><br/>此 EFI 系统磁盘分区不符合建议。建议返回并选择或创建一个合适的文件系统。 -+ -+ An EFI system partition is necessary to start %1.<br/><br/>The EFI system partition does not meet recommendations. It is recommended to go back and select or create a suitable filesystem. -+ EFI系统分区是启动 %1 所必需的。<br/><br/>此 EFI 系统磁盘分区不符合建议。建议返回并选择或创建一个合适的文件系统。 - - -- -- The filesystem must be mounted on <strong>%1</strong>. -- 文件系统必须挂载于 <strong>%1</strong>。 -+ -+ The filesystem must be mounted on <strong>%1</strong>. -+ 文件系统必须挂载于 <strong>%1</strong>。 - - -- -- The filesystem must have type FAT32. -- 此文件系统必须为FAT32 -+ -+ The filesystem must have type FAT32. -+ 此文件系统必须为FAT32 - - -- -- The filesystem must have flag <strong>%1</strong> set. -- 文件系统必须设置 <strong>%1</strong> 标记。 -+ -+ The filesystem must have flag <strong>%1</strong> set. -+ 文件系统必须设置 <strong>%1</strong> 标记。 - - -- -- -- The filesystem must be at least %1 MiB in size. -- 文件系统必须要有%1 MiB 的大小。 -+ -+ -+ The filesystem must be at least %1 MiB in size. -+ 文件系统必须要有%1 MiB 的大小。 - - -- -- The minimum recommended size for the filesystem is %1 MiB. -- 推荐文件系统的最小尺寸为 %1 MiB。 -+ -+ The minimum recommended size for the filesystem is %1 MiB. -+ 推荐文件系统的最小尺寸为 %1 MiB。 - - -- -- You can continue without setting up an EFI system partition but your system may fail to start. -- 您可以在不设置EFI系统分区的情况下继续,但您的系統可能无法启动。 -+ -+ You can continue without setting up an EFI system partition but your system may fail to start. -+ 您可以在不设置EFI系统分区的情况下继续,但您的系統可能无法启动。 - - -- -- You can continue with this EFI system partition configuration but your system may fail to start. -- 您可以继续此 EFI 系统分区配置,但您的系统可能无法启动。 -+ -+ You can continue with this EFI system partition configuration but your system may fail to start. -+ 您可以继续此 EFI 系统分区配置,但您的系统可能无法启动。 - - -- -- No EFI system partition configured -- 未配置 EFI 系统分区 -+ -+ No EFI system partition configured -+ 未配置 EFI 系统分区 - - -- -- EFI system partition configured incorrectly -- EFI系统分区配置错误 -+ -+ EFI system partition configured incorrectly -+ EFI系统分区配置错误 - - -- -- EFI system partition recommendation -- EFI 系统分区推荐 -+ -+ EFI system partition recommendation -+ EFI 系统分区推荐 - - -- -- Option to use GPT on BIOS -- 在 BIOS 上使用 GPT -+ -+ Option to use GPT on BIOS -+ 在 BIOS 上使用 GPT - - -- -- A GPT partition table is the best option for all systems. This installer supports such a setup for BIOS systems too.<br/><br/>To configure a GPT partition table on BIOS, (if not done so already) go back and set the partition table to GPT, next create a 8 MB unformatted partition with the <strong>%2</strong> flag enabled.<br/><br/>An unformatted 8 MB partition is necessary to start %1 on a BIOS system with GPT. -- GPT 分区表对所有系统都是最佳选项。此安装程序同时支持 BIOS 系统。<br/><br/>要在 BIOS 上配置 GPT 分区表(如果还没有完成的话),请回到上一步并将分区表设置为 GPT,然后创建 8 MB 的未格式化分区,并启用 <strong>%2</strong> 标记。<br/><br/>要在 BIOS 系统上使用 GPT 分区表启动 %1,必须要有该 8 MB 的未格式化分区。 -+ -+ A GPT partition table is the best option for all systems. This installer supports such a setup for BIOS systems too.<br/><br/>To configure a GPT partition table on BIOS, (if not done so already) go back and set the partition table to GPT, next create a 8 MB unformatted partition with the <strong>%2</strong> flag enabled.<br/><br/>An unformatted 8 MB partition is necessary to start %1 on a BIOS system with GPT. -+ GPT 分区表对所有系统都是最佳选项。此安装程序同时支持 BIOS 系统。<br/><br/>要在 BIOS 上配置 GPT 分区表(如果还没有完成的话),请回到上一步并将分区表设置为 GPT,然后创建 8 MB 的未格式化分区,并启用 <strong>%2</strong> 标记。<br/><br/>要在 BIOS 系统上使用 GPT 分区表启动 %1,必须要有该 8 MB 的未格式化分区。 - - -- -- Boot partition not encrypted -- 引导分区未加密 -+ -+ Boot partition not encrypted -+ 引导分区未加密 - - -- -- A separate boot partition was set up together with an encrypted root partition, but the boot partition is not encrypted.<br/><br/>There are security concerns with this kind of setup, because important system files are kept on an unencrypted partition.<br/>You may continue if you wish, but filesystem unlocking will happen later during system startup.<br/>To encrypt the boot partition, go back and recreate it, selecting <strong>Encrypt</strong> in the partition creation window. -- 您尝试用单独的引导分区配合已加密的根分区使用,但引导分区未加密。<br/><br/>这种配置方式可能存在安全隐患,因为重要的系统文件存储在了未加密的分区上。<br/>您可以继续保持此配置,但是系统解密将在系统启动时而不是引导时进行。<br/>要加密引导分区,请返回上一步并重新创建此分区,并在分区创建窗口选中 <strong>加密</strong> 选项。 -+ -+ A separate boot partition was set up together with an encrypted root partition, but the boot partition is not encrypted.<br/><br/>There are security concerns with this kind of setup, because important system files are kept on an unencrypted partition.<br/>You may continue if you wish, but filesystem unlocking will happen later during system startup.<br/>To encrypt the boot partition, go back and recreate it, selecting <strong>Encrypt</strong> in the partition creation window. -+ 您尝试用单独的引导分区配合已加密的根分区使用,但引导分区未加密。<br/><br/>这种配置方式可能存在安全隐患,因为重要的系统文件存储在了未加密的分区上。<br/>您可以继续保持此配置,但是系统解密将在系统启动时而不是引导时进行。<br/>要加密引导分区,请返回上一步并重新创建此分区,并在分区创建窗口选中 <strong>加密</strong> 选项。 - - -- -- has at least one disk device available. -- 有至少一个可用的磁盘设备。 -+ -+ has at least one disk device available. -+ 有至少一个可用的磁盘设备。 - - -- -- There are no partitions to install on. -- 无可用于安装的分区。 -+ -+ There are no partitions to install on. -+ 无可用于安装的分区。 - -- -- -+ -+ - PlasmaLnfJob - -- -- Applying Plasma Look-and-Feel… -- @status -- 正在应用 Plasma 观感… -+ -+ Applying Plasma Look-and-Feel… -+ @status -+ 正在应用 Plasma 观感… - - -- -- -- Could not select KDE Plasma Look-and-Feel package -- 无法选中 KDE Plasma 外观主题包 -+ -+ -+ Could not select KDE Plasma Look-and-Feel package -+ 无法选中 KDE Plasma 外观主题包 - -- -- -+ -+ - PlasmaLnfPage - -- -- Please choose a look-and-feel for the KDE Plasma Desktop. You can also skip this step and configure the look-and-feel once the system is set up. Clicking on a look-and-feel selection will give you a live preview of that look-and-feel. -- 请选择一个 KDE Plasma 桌面外观。你也可以忽略此步骤并在系统安装完成后配置外观。点击外观后可以实时预览效果。 -+ -+ Please choose a look-and-feel for the KDE Plasma Desktop. You can also skip this step and configure the look-and-feel once the system is set up. Clicking on a look-and-feel selection will give you a live preview of that look-and-feel. -+ 请选择一个 KDE Plasma 桌面外观。你也可以忽略此步骤并在系统安装完成后配置外观。点击外观后可以实时预览效果。 - - -- -- Please choose a look-and-feel for the KDE Plasma Desktop. You can also skip this step and configure the look-and-feel once the system is installed. Clicking on a look-and-feel selection will give you a live preview of that look-and-feel. -- 请选择一个 KDE Plasma 桌面外观,可以忽略此步骤并在系统安装完成后配置外观。点击一个外观后可以实时预览效果。 -+ -+ Please choose a look-and-feel for the KDE Plasma Desktop. You can also skip this step and configure the look-and-feel once the system is installed. Clicking on a look-and-feel selection will give you a live preview of that look-and-feel. -+ 请选择一个 KDE Plasma 桌面外观,可以忽略此步骤并在系统安装完成后配置外观。点击一个外观后可以实时预览效果。 - -- -- -+ -+ - PlasmaLnfViewStep - -- -- Look-and-Feel -- @label -- 外观主题 -+ -+ Look-and-Feel -+ @label -+ 外观主题 - -- -- -+ -+ -+ PowerManagementInterface + -+ -+ Calamares -+ ++ ++ Zagreb ++ tz_names ++ 札格雷布 + + -+ -+ Installation in progress -+ @status -+ ++ ++ Zaporozhye ++ tz_names ++ 紮波羅熱 ++ ++ ++ ++ Zurich ++ tz_names ++ 蘇黎世 + + -+ - PreserveFiles - -- -- Saving files for later… -- @status -- 保存文件以供日后使用… -+ -+ Saving files for later… -+ @status -+ 保存文件以供日后使用… - - -- -- No files configured to save for later. -- 没有已保存且供日后使用的配置文件。 -+ -+ No files configured to save for later. -+ 没有已保存且供日后使用的配置文件。 - - -- -- Not all of the configured files could be preserved. -- 并不是所有配置文件都可以被保留 -+ -+ Not all of the configured files could be preserved. -+ 并不是所有配置文件都可以被保留 - -- -- -+ -+ - ProcessResult - -- -- -+ -+ - There was no output from the command. -- -+ - 命令没有输出。 - - -- -- -+ -+ - Output: - -- -+ - 输出: - - - -- -- External command crashed. -- 外部命令已崩溃。 -+ -+ External command crashed. -+ 外部命令已崩溃。 - - -- -- Command <i>%1</i> crashed. -- 命令 <i>%1</i> 已崩溃。 -+ -+ Command <i>%1</i> crashed. -+ 命令 <i>%1</i> 已崩溃。 - - -- -- External command failed to start. -- 无法启动外部命令。 -+ -+ External command failed to start. -+ 无法启动外部命令。 - - -- -- Command <i>%1</i> failed to start. -- 无法启动命令 <i>%1</i>。 -+ -+ Command <i>%1</i> failed to start. -+ 无法启动命令 <i>%1</i>。 - - -- -- Internal error when starting command. -- 启动命令时出现内部错误。 -+ -+ Internal error when starting command. -+ 启动命令时出现内部错误。 - - -- -- Bad parameters for process job call. -- 呼叫进程任务出现错误参数 -+ -+ Bad parameters for process job call. -+ 呼叫进程任务出现错误参数 - - -- -- External command failed to finish. -- 外部命令未成功完成。 -+ -+ External command failed to finish. -+ 外部命令未成功完成。 - - -- -- Command <i>%1</i> failed to finish in %2 seconds. -- 命令 <i>%1</i> 未能在 %2 秒内完成。 -+ -+ Command <i>%1</i> failed to finish in %2 seconds. -+ 命令 <i>%1</i> 未能在 %2 秒内完成。 - - -- -- External command finished with errors. -- 外部命令已完成,但出现了错误。 -+ -+ External command finished with errors. -+ 外部命令已完成,但出现了错误。 - - -- -- Command <i>%1</i> finished with exit code %2. -- 命令 <i>%1</i> 以退出代码 %2 完成。 -+ -+ Command <i>%1</i> finished with exit code %2. -+ 命令 <i>%1</i> 以退出代码 %2 完成。 - -- -- -+ -+ - QObject - -- -- %1 (%2) -- %1(%2) -+ -+ %1 (%2) -+ %1(%2) - - -- -- unknown -- @partition info -- 未知 -+ -+ unknown -+ @partition info -+ 未知 - - -- -- extended -- @partition info -- 扩展分区 -+ -+ extended -+ @partition info -+ 扩展分区 - - -- -- unformatted -- @partition info -- 未格式化 -+ -+ unformatted -+ @partition info -+ 未格式化 - - -- -- swap -- @partition info -- 交换分区 -+ -+ swap -+ @partition info -+ 交换分区 - - -- -- -- Default -- 默认 -+ -+ -+ Default -+ 默认 - - -- -- Directory not found -- 找不到目录 -+ -+ Directory not found -+ 找不到目录 - - -- -- Could not create new random file <pre>%1</pre>. -- 无法创建新的随机文件 <pre>%1</pre>. -+ -+ Could not create new random file <pre>%1</pre>. -+ 无法创建新的随机文件 <pre>%1</pre>. - - -- -- No product -- 无产品 -+ -+ No product -+ 无产品 - - -- -- No description provided. -- 未提供描述信息 -+ -+ No description provided. -+ 未提供描述信息 - - -- -- (no mount point) -- (无挂载点) -+ -+ (no mount point) -+ (无挂载点) - - -- -- Unpartitioned space or unknown partition table -- @info -- 尚未分区的空间或分区表未知 -+ -+ Unpartitioned space or unknown partition table -+ @info -+ 尚未分区的空间或分区表未知 - -- -- -+ -+ - Recommended - -- -- <p>This computer does not satisfy some of the recommended requirements for setting up %1.<br/> -+ -+ <p>This computer does not satisfy some of the recommended requirements for setting up %1.<br/> - Setup can continue, but some features might be disabled.</p> -- <p>此计算机不满足安装 %1 的某些推荐配置。<br/> -+ <p>此计算机不满足安装 %1 的某些推荐配置。<br/> - 安装可以继续,但是一些特性可能被禁用。</p> - -- -- -+ -+ - RemoveUserJob - -- -- Removing live user from the target system… -- @status -- 正在从目标系统删除 live 用户… -+ -+ Removing live user from the target system… -+ @status -+ 正在从目标系统删除 live 用户… - -- -- -+ -+ - RemoveVolumeGroupJob - -- -- -- Removing Volume Group named %1… -- @status -- 正在移除分卷组 %1… -+ -+ -+ Removing Volume Group named %1… -+ @status -+ 正在移除分卷组 %1… - - -- -- Removing Volume Group named <strong>%1</strong>… -- @status -- 正在移除分卷组 <strong>%1</strong>… -+ -+ Removing Volume Group named <strong>%1</strong>… -+ @status -+ 正在移除分卷组 <strong>%1</strong>… - - -- -- The installer failed to remove a volume group named '%1'. -- 安装器无法移除分卷组 '%1'。 -+ -+ The installer failed to remove a volume group named '%1'. -+ 安装器无法移除分卷组 '%1'。 - -- -- -+ -+ - Requirements - -- -- <p>This computer does not satisfy the minimum requirements for installing %1.<br/> -+ -+ <p>This computer does not satisfy the minimum requirements for installing %1.<br/> - Installation cannot continue.</p> -- <p>此计算机不满足安装 %1 的最低配置。<br/> -+ <p>此计算机不满足安装 %1 的最低配置。<br/> - 安装无法继续。</p> - - -- -- <p>This computer does not satisfy some of the recommended requirements for setting up %1.<br/> -+ -+ <p>This computer does not satisfy some of the recommended requirements for setting up %1.<br/> - Setup can continue, but some features might be disabled.</p> -- <p>此计算机不满足安装 %1 的某些推荐配置。<br/> -+ <p>此计算机不满足安装 %1 的某些推荐配置。<br/> - 初始化可以继续,但是一些特性可能被禁用。</p> - -- -- -+ -+ - ResizeFSJob - -- -- Performing file system resize… -- @status -- 正在执行文件系统大小调整… -+ -+ Performing file system resize… -+ @status -+ 正在执行文件系统大小调整… - - -- -- Invalid configuration -- @error -- 无效配置 -+ -+ Invalid configuration -+ @error -+ 无效配置 - - -- -- The file-system resize job has an invalid configuration and will not run. -- @error -- 调整文件系统大小的任务 因为配置文件无效不会被执行。 -+ -+ The file-system resize job has an invalid configuration and will not run. -+ @error -+ 调整文件系统大小的任务 因为配置文件无效不会被执行。 - - -- -- KPMCore not available -- @error -- KPMCore 不可用 -+ -+ KPMCore not available -+ @error -+ KPMCore 不可用 - - -- -- Calamares cannot start KPMCore for the file system resize job. -- @error -- Calamares 无法启动 KPMCore 来完成调整文件系统大小的任务。 -+ -+ Calamares cannot start KPMCore for the file system resize job. -+ @error -+ Calamares 无法启动 KPMCore 来完成调整文件系统大小的任务。 - - -- -- Resize failed. -- @error -- 调整大小失败。 -+ -+ Resize failed. -+ @error -+ 调整大小失败。 - - -- -- The filesystem %1 could not be found in this system, and cannot be resized. -- @info -- 文件系统 %1 未能在此系统上找到,因此无法调整大小。 -+ -+ The filesystem %1 could not be found in this system, and cannot be resized. -+ @info -+ 文件系统 %1 未能在此系统上找到,因此无法调整大小。 - - -- -- The device %1 could not be found in this system, and cannot be resized. -- @info -- 设备 %1 未能在此系统上找到,因此无法调整大小。 -+ -+ The device %1 could not be found in this system, and cannot be resized. -+ @info -+ 设备 %1 未能在此系统上找到,因此无法调整大小。 - - -- -- -- -- -- Resize Failed -- @error -- 调整大小失败 -+ -+ -+ -+ -+ Resize Failed -+ @error -+ 调整大小失败 - - -- -- -- The filesystem %1 cannot be resized. -- @error -- 文件系统 %1 无法被调整大小。 -+ -+ -+ The filesystem %1 cannot be resized. -+ @error -+ 文件系统 %1 无法被调整大小。 - - -- -- -- The device %1 cannot be resized. -- @error -- 设备 %1 无法被调整大小。 -+ -+ -+ The device %1 cannot be resized. -+ @error -+ 设备 %1 无法被调整大小。 - - -- -- The file system %1 must be resized, but cannot. -- @info -- 文件系统 %1 必须调整大小,但无法做到。 -+ -+ The file system %1 must be resized, but cannot. -+ @info -+ 文件系统 %1 必须调整大小,但无法做到。 - - -- -- The device %1 must be resized, but cannot -- @info -- 设备 %1 必须调整大小,但无法做到。 -+ -+ The device %1 must be resized, but cannot -+ @info -+ 设备 %1 必须调整大小,但无法做到。 - -- -- -+ -+ - ResizePartitionJob - -- -- Resize partition %1 -- @title -- 调整分区 %1 大小 -+ -+ Resize partition %1 -+ @title -+ 调整分区 %1 大小 - - -- -- Resize <strong>%2MiB</strong> partition <strong>%1</strong> to <strong>%3MiB</strong> -- @info -- -+ -+ Resize <strong>%2MiB</strong> partition <strong>%1</strong> to <strong>%3MiB</strong> -+ @info -+ - - -- -- Resizing %2MiB partition %1 to %3MiB… -- @status -- -+ -+ Resizing %2MiB partition %1 to %3MiB… -+ @status -+ - - -- -- The installer failed to resize partition %1 on disk '%2'. -- 安装程序调整磁盘“%2”上的分区 %1 大小失败。 -+ -+ The installer failed to resize partition %1 on disk '%2'. -+ 安装程序调整磁盘“%2”上的分区 %1 大小失败。 - -- -- -+ -+ - ResizeVolumeGroupDialog - -- -- Resize Volume Group -- @title -- 调整分卷组大小 -+ -+ Resize Volume Group -+ @title -+ 调整分卷组大小 - -- -- -+ -+ - ResizeVolumeGroupJob - -- -- Resize volume group named %1 from %2 to %3 -- @title -- -+ -+ Resize volume group named %1 from %2 to %3 -+ @title -+ - - -- -- Resize volume group named <strong>%1</strong> from <strong>%2</strong> to <strong>%3</strong> -- @info -- -+ -+ Resize volume group named <strong>%1</strong> from <strong>%2</strong> to <strong>%3</strong> -+ @info -+ - - -- -- Resizing volume group named %1 from %2 to %3… -- @status -- -+ -+ Resizing volume group named %1 from %2 to %3… -+ @status -+ - - -- -- The installer failed to resize a volume group named '%1'. -- 安装器未能调整分卷组'%1'的大小 -+ -+ The installer failed to resize a volume group named '%1'. -+ 安装器未能调整分卷组'%1'的大小 - -- -- -+ -+ - ResultsListWidget - -- -- Checking requirements again in a few seconds ... -- 几秒钟后再次检查要求 ... -+ -+ Checking requirements again in a few seconds ... -+ 几秒钟后再次检查要求 ... - -- -- -+ -+ - ScanningDialog - -- -- Scanning storage devices… -- @status -- 正在扫描存储设备… -+ -+ Scanning storage devices… -+ @status -+ 正在扫描存储设备… - - -- -- Partitioning… -- @status -- 正在分区… -+ -+ Partitioning… -+ @status -+ 正在分区… - -- -- -+ -+ - SetHostNameJob - -- -- Set hostname %1 -- 设置主机名 %1 -+ -+ Set hostname %1 -+ 设置主机名 %1 - - -- -- Set hostname <strong>%1</strong>. -- 设置主机名 <strong>%1</strong>。 -+ -+ Set hostname <strong>%1</strong>. -+ 设置主机名 <strong>%1</strong>。 - - -- -- Setting hostname %1… -- @status -- 正在设置主机名 %1… -+ -+ Setting hostname %1… -+ @status -+ 正在设置主机名 %1… - - -- -- -- Internal Error -- 内部错误 -+ -+ -+ Internal Error -+ 内部错误 - - -- -- -- Cannot write hostname to target system -- 无法向目标系统写入主机名 -+ -+ -+ Cannot write hostname to target system -+ 无法向目标系统写入主机名 - -- -- -+ -+ - SetKeyboardLayoutJob - -- -- Setting keyboard model to %1, layout as %2-%3… -- @status, %1 model, %2 layout, %3 variant -- 正在将键盘型号设置为 %1,布局设置为 %2-%3… -+ -+ Setting keyboard model to %1, layout as %2-%3… -+ @status, %1 model, %2 layout, %3 variant -+ 正在将键盘型号设置为 %1,布局设置为 %2-%3… - - -- -- Failed to write keyboard configuration for the virtual console. -- @error -- 无法将键盘配置写入到虚拟控制台。 -+ -+ Failed to write keyboard configuration for the virtual console. -+ @error -+ 无法将键盘配置写入到虚拟控制台。 - - -- -- Failed to write to %1 -- @error, %1 is virtual console configuration path -- 写入到 %1 失败 -+ -+ Failed to write to %1 -+ @error, %1 is virtual console configuration path -+ 写入到 %1 失败 - - -- -- Failed to write keyboard configuration for X11. -- @error -- 无法为 X11 写入键盘配置。 -+ -+ Failed to write keyboard configuration for X11. -+ @error -+ 无法为 X11 写入键盘配置。 - - -- -- Failed to write to %1 -- @error, %1 is keyboard configuration path -- 写入到 %1 失败 -+ -+ Failed to write to %1 -+ @error, %1 is keyboard configuration path -+ 写入到 %1 失败 - - -- -- Failed to write keyboard configuration to existing /etc/default directory. -- @error -- 无法将键盘配置写入到现有的 /etc/default 目录。 -+ -+ Failed to write keyboard configuration to existing /etc/default directory. -+ @error -+ 无法将键盘配置写入到现有的 /etc/default 目录。 - - -- -- Failed to write to %1 -- @error, %1 is default keyboard path -- 写入到 %1 失败 -+ -+ Failed to write to %1 -+ @error, %1 is default keyboard path -+ 写入到 %1 失败 - -- -- -+ -+ - SetPartFlagsJob - -- -- Set flags on partition %1 -- @title -- 设置分区 %1 的标记 -+ -+ Set flags on partition %1 -+ @title -+ 设置分区 %1 的标记 - - -- -- Set flags on %1MiB %2 partition -- @title -- 设置 %1MiB %2 分区的标记 -+ -+ Set flags on %1MiB %2 partition -+ @title -+ 设置 %1MiB %2 分区的标记 - - -- -- Set flags on new partition -- @title -- 设置新分区标记 -+ -+ Set flags on new partition -+ @title -+ 设置新分区标记 - - -- -- Clear flags on partition <strong>%1</strong> -- @info -- -+ -+ Clear flags on partition <strong>%1</strong> -+ @info -+ - - -- -- Clear flags on %1MiB <strong>%2</strong> partition -- @info -- -+ -+ Clear flags on %1MiB <strong>%2</strong> partition -+ @info -+ - - -- -- Clear flags on new partition -- @info -- -+ -+ Clear flags on new partition -+ @info -+ - - -- -- Set flags on partition <strong>%1</strong> to <strong>%2</strong> -- @info -- -+ -+ Set flags on partition <strong>%1</strong> to <strong>%2</strong> -+ @info -+ - - -- -- Set flags on %1MiB <strong>%2</strong> partition to <strong>%3</strong> -- @info -- -+ -+ Set flags on %1MiB <strong>%2</strong> partition to <strong>%3</strong> -+ @info -+ - - -- -- Set flags on new partition to <strong>%1</strong> -- @info -- -+ -+ Set flags on new partition to <strong>%1</strong> -+ @info -+ - - -- -- Clearing flags on partition <strong>%1</strong>… -- @status -- -+ -+ Clearing flags on partition <strong>%1</strong>… -+ @status -+ - - -- -- Clearing flags on %1MiB <strong>%2</strong> partition… -- @status -- -+ -+ Clearing flags on %1MiB <strong>%2</strong> partition… -+ @status -+ - - -- -- Clearing flags on new partition… -- @status -- -+ -+ Clearing flags on new partition… -+ @status -+ - - -- -- Setting flags <strong>%2</strong> on partition <strong>%1</strong>… -- @status -- -+ -+ Setting flags <strong>%2</strong> on partition <strong>%1</strong>… -+ @status -+ - - -- -- Setting flags <strong>%3</strong> on %1MiB <strong>%2</strong> partition… -- @status -- -+ -+ Setting flags <strong>%3</strong> on %1MiB <strong>%2</strong> partition… -+ @status -+ - - -- -- Setting flags <strong>%1</strong> on new partition… -- @status -- -+ -+ Setting flags <strong>%1</strong> on new partition… -+ @status -+ - - -- -- The installer failed to set flags on partition %1. -- 安装程序未能成功设置分区 %1 的标记。 -+ -+ The installer failed to set flags on partition %1. -+ 安装程序未能成功设置分区 %1 的标记。 - -- -- -+ -+ - SetPasswordJob - -- -- Set password for user %1 -- 设置用户 %1 的密码 -+ -+ Set password for user %1 -+ 设置用户 %1 的密码 - - -- -- Setting password for user %1… -- @status -- 正在为用户 %1 设置密码… -+ -+ Setting password for user %1… -+ @status -+ 正在为用户 %1 设置密码… - - -- -- Bad destination system path. -- 非法的目标系统路径。 -+ -+ Bad destination system path. -+ 非法的目标系统路径。 - - -- -- rootMountPoint is %1 -- 根挂载点为 %1 -+ -+ rootMountPoint is %1 -+ 根挂载点为 %1 - - -- -- Cannot disable root account. -- 无法禁用 root 帐号。 -+ -+ Cannot disable root account. -+ 无法禁用 root 帐号。 - - -- -- -- usermod terminated with error code %1. -- usermod 以错误代码 %1 中止。 -+ -+ -+ usermod terminated with error code %1. -+ usermod 以错误代码 %1 中止。 - - -- -- Cannot set password for user %1. -- 无法设置用户 %1 的密码。 -+ -+ Cannot set password for user %1. -+ 无法设置用户 %1 的密码。 - -- -- -+ -+ - SetTimezoneJob - -- -- Setting timezone to %1/%2… -- @status -- 正在设置时区为 %1/%2… -+ -+ Setting timezone to %1/%2… -+ @status -+ 正在设置时区为 %1/%2… - - -- -- Cannot access selected timezone path. -- @error -- 无法访问指定的时区路径。 -+ -+ Cannot access selected timezone path. -+ @error -+ 无法访问指定的时区路径。 - - -- -- Bad path: %1 -- @error -- 非法路径:%1 -+ -+ Bad path: %1 -+ @error -+ 非法路径:%1 - - -- -- -- Cannot set timezone. -- @error -- 无法设置时区。 -+ -+ -+ Cannot set timezone. -+ @error -+ 无法设置时区。 - - -- -- Link creation failed, target: %1; link name: %2 -- @info -- 链接创建失败,目标:%1,链接名称:%2 -+ -+ Link creation failed, target: %1; link name: %2 -+ @info -+ 链接创建失败,目标:%1,链接名称:%2 - - -- -- Cannot open /etc/timezone for writing -- @info -- 无法打开要写入的 /etc/timezone -+ -+ Cannot open /etc/timezone for writing -+ @info -+ 无法打开要写入的 /etc/timezone - -- -- -+ -+ - SetupGroupsJob - -- -- Preparing groups… -- @status -- 正在准备群组… -+ -+ Preparing groups… -+ @status -+ 正在准备群组… - - -- -- -- Could not create groups in target system -- 无法在目标系统中创建群组 -+ -+ -+ Could not create groups in target system -+ 无法在目标系统中创建群组 - - -- -- These groups are missing in the target system: %1 -- 目标系统中缺少以下群组: %1 -+ -+ These groups are missing in the target system: %1 -+ 目标系统中缺少以下群组: %1 - -- -- -+ -+ - SetupSudoJob - -- -- Configuring <pre>sudo</pre> users… -- @status -- 配置 <pre>sudo</pre> 用户… -+ -+ Configuring <pre>sudo</pre> users… -+ @status -+ 配置 <pre>sudo</pre> 用户… - - -- -- Cannot chmod sudoers file. -- 无法修改 sudoers 文件权限。 -+ -+ Cannot chmod sudoers file. -+ 无法修改 sudoers 文件权限。 - - -- -- Cannot create sudoers file for writing. -- 无法创建要写入的 sudoers 文件。 -+ -+ Cannot create sudoers file for writing. -+ 无法创建要写入的 sudoers 文件。 - -- -- -+ -+ - ShellProcessJob - -- -- Running shell processes… -- @status -- 正在运行 shell 进程… -+ -+ Running shell processes… -+ @status -+ 正在运行 shell 进程… - -- -- -+ -+ - SlideCounter - -- -- -- %L1 / %L2 -- slide counter, %1 of %2 (numeric) -- %L1 / %L2 -+ -+ -+ %L1 / %L2 -+ slide counter, %1 of %2 (numeric) -+ %L1 / %L2 - -- -- -+ -+ - StandardButtons - -- -- &OK -- &确定 -+ -+ &OK -+ &确定 - - -- -- &Yes -- &是 -+ -+ &Yes -+ &是 - - -- -- &No -- &否 -+ -+ &No -+ &否 - - -- -- &Cancel -- 取消(&C) -+ -+ &Cancel -+ 取消(&C) - - -- -- &Close -- &关闭 -+ -+ &Close -+ &关闭 - -- -- -+ -+ - TrackingInstallJob - -- -- Installation feedback -- 安装反馈 -+ -+ Installation feedback -+ 安装反馈 - - -- -- Sending installation feedback… -- @status -- 正在发送安装反馈… -+ -+ Sending installation feedback… -+ @status -+ 正在发送安装反馈… - - -- -- Internal error in install-tracking. -- 在 install-tracking 步骤发生内部错误。 -+ -+ Internal error in install-tracking. -+ 在 install-tracking 步骤发生内部错误。 - - -- -- HTTP request timed out. -- HTTP 请求超时。 -+ -+ HTTP request timed out. -+ HTTP 请求超时。 - -- -- -+ -+ - TrackingKUserFeedbackJob - -- -- KDE user feedback -- KDE 用户反馈 -+ -+ KDE user feedback -+ KDE 用户反馈 - - -- -- Configuring KDE user feedback… -- @status -- 配置 KDE 用户反馈… -+ -+ Configuring KDE user feedback… -+ @status -+ 配置 KDE 用户反馈… - - -- -- -- Error in KDE user feedback configuration. -- KDE 用户反馈配置中存在错误。 -+ -+ -+ Error in KDE user feedback configuration. -+ KDE 用户反馈配置中存在错误。 - - -- -- Could not configure KDE user feedback correctly, script error %1. -- 无法正确 KDE 用户反馈,脚本错误代码 %1。 -+ -+ Could not configure KDE user feedback correctly, script error %1. -+ 无法正确 KDE 用户反馈,脚本错误代码 %1。 - - -- -- Could not configure KDE user feedback correctly, Calamares error %1. -- 无法正确 KDE 用户反馈,Calamares 错误代码 %1。 -+ -+ Could not configure KDE user feedback correctly, Calamares error %1. -+ 无法正确 KDE 用户反馈,Calamares 错误代码 %1。 - -- -- -+ -+ - TrackingMachineUpdateManagerJob - -- -- Machine feedback -- 机器反馈 -+ -+ Machine feedback -+ 机器反馈 - - -- -- Configuring machine feedback… -- @status -- 正在配置机器反馈… -+ -+ Configuring machine feedback… -+ @status -+ 正在配置机器反馈… - - -- -- -- Error in machine feedback configuration. -- 机器反馈配置中存在错误。 -+ -+ -+ Error in machine feedback configuration. -+ 机器反馈配置中存在错误。 - - -- -- Could not configure machine feedback correctly, script error %1. -- 无法正确配置机器反馈,脚本错误代码 %1。 -+ -+ Could not configure machine feedback correctly, script error %1. -+ 无法正确配置机器反馈,脚本错误代码 %1。 - - -- -- Could not configure machine feedback correctly, Calamares error %1. -- 无法正确配置机器反馈,Calamares 错误代码 %1。 -+ -+ Could not configure machine feedback correctly, Calamares error %1. -+ 无法正确配置机器反馈,Calamares 错误代码 %1。 - -- -- -+ -+ - TrackingPage - -- -- Placeholder -- 占位符 -+ -+ Placeholder -+ 占位符 - - -- -- <html><head/><body><p>Click here to send <span style=" font-weight:600;">no information at all</span> about your installation.</p></body></html> -- <html><head/><body><p>单击此处 <span style=" font-weight:600;">不发送任何</span> 有关安装的信息。</p></body></html> -+ -+ <html><head/><body><p>Click here to send <span style=" font-weight:600;">no information at all</span> about your installation.</p></body></html> -+ <html><head/><body><p>单击此处 <span style=" font-weight:600;">不发送任何</span> 有关安装的信息。</p></body></html> - - -- -- <html><head/><body><p><a href="placeholder"><span style=" text-decoration: underline; color:#2980b9;">Click here for more information about user feedback</span></a></p></body></html> -- <html><head/><body><p><a href="placeholder"><span style=" text-decoration: underline; color:#2980b9;">点击此处以获取关于用户反馈的详细信息</span></a></p></body></html> -+ -+ <html><head/><body><p><a href="placeholder"><span style=" text-decoration: underline; color:#2980b9;">Click here for more information about user feedback</span></a></p></body></html> -+ <html><head/><body><p><a href="placeholder"><span style=" text-decoration: underline; color:#2980b9;">点击此处以获取关于用户反馈的详细信息</span></a></p></body></html> - - -- -- Tracking helps %1 to see how often it is installed, what hardware it is installed on and which applications are used. To see what will be sent, please click the help icon next to each area. -- 跟踪帮助 %1 以查看它的安装频率、安装硬件以及使用的应用程序。请点按每项旁的帮助图标以查看即将被发送的信息。 -+ -+ Tracking helps %1 to see how often it is installed, what hardware it is installed on and which applications are used. To see what will be sent, please click the help icon next to each area. -+ 跟踪帮助 %1 以查看它的安装频率、安装硬件以及使用的应用程序。请点按每项旁的帮助图标以查看即将被发送的信息。 - - -- -- By selecting this you will send information about your installation and hardware. This information will only be sent <b>once</b> after the installation finishes. -- 选中此项时,安装器将发送关于安装过程和硬件的信息。该信息仅会在安装结束后发送<b>一次</b> 。 -+ -+ By selecting this you will send information about your installation and hardware. This information will only be sent <b>once</b> after the installation finishes. -+ 选中此项时,安装器将发送关于安装过程和硬件的信息。该信息仅会在安装结束后发送<b>一次</b> 。 - - -- -- By selecting this you will periodically send information about your <b>machine</b> installation, hardware and applications, to %1. -- 通过选择此选项,您将定期将有关您 <b>计算机</b>的安装,硬件和应用程序的信息发送到 %1。 -+ -+ By selecting this you will periodically send information about your <b>machine</b> installation, hardware and applications, to %1. -+ 通过选择此选项,您将定期将有关您 <b>计算机</b>的安装,硬件和应用程序的信息发送到 %1。 - - -- -- By selecting this you will regularly send information about your <b>user</b> installation, hardware, applications and application usage patterns, to %1. -- 通过选择此选项,您将定期将有关<b>用户</b> 安装,硬件,应用程序和应用程序使用方式的信息发送到 %1。 -+ -+ By selecting this you will regularly send information about your <b>user</b> installation, hardware, applications and application usage patterns, to %1. -+ 通过选择此选项,您将定期将有关<b>用户</b> 安装,硬件,应用程序和应用程序使用方式的信息发送到 %1。 - -- -- -+ -+ - TrackingViewStep - -- -- Feedback -- @title -- 反馈 -+ -+ Feedback -+ @title -+ 反馈 - -- -- -+ -+ - UmountJob - -- -- Unmounting file systems… -- @status -- 正在卸载文件系统… -+ -+ Unmounting file systems… -+ @status -+ 正在卸载文件系统… - - -- -- No target system available. -- 没有可用的目标系统。 -+ -+ No target system available. -+ 没有可用的目标系统。 - - -- -- No rootMountPoint is set. -- 没有设定 root挂载点。 -+ -+ No rootMountPoint is set. -+ 没有设定 root挂载点。 - -- -- -+ -+ - UsersPage - -- -- <small>If more than one person will use this computer, you can create multiple accounts after setup.</small> -- <small>如果有多人要使用此计算机,您可以在安装后创建多个账户。</small> -+ -+ <small>If more than one person will use this computer, you can create multiple accounts after setup.</small> -+ <small>如果有多人要使用此计算机,您可以在安装后创建多个账户。</small> - - -- -- <small>If more than one person will use this computer, you can create multiple accounts after installation.</small> -- <small>如果有多人要使用此计算机,您可以在安装后创建多个账户。</small> -+ -+ <small>If more than one person will use this computer, you can create multiple accounts after installation.</small> -+ <small>如果有多人要使用此计算机,您可以在安装后创建多个账户。</small> - -- -- -+ -+ - UsersQmlViewStep - -- -- Users -- 用户 -+ -+ Users -+ 用户 - -- -- -+ -+ - UsersViewStep - -- -- Users -- 用户 -+ -+ Users -+ 用户 - -- -- -+ -+ - VariantModel - -- -- Key -- Column header for key/value -- Key -+ -+ Key -+ Column header for key/value -+ Key - - -- -- Value -- Column header for key/value -- -+ -+ Value -+ Column header for key/value -+ - -- -- -+ -+ - VolumeGroupBaseDialog - -- -- Create Volume Group -- 创建存储组 -+ -+ Create Volume Group -+ 创建存储组 - - -- -- List of Physical Volumes -- 物理分卷列表: -+ -+ List of Physical Volumes -+ 物理分卷列表: - - -- -- Volume Group Name: -- 分卷组名称: -+ -+ Volume Group Name: -+ 分卷组名称: - - -- -- Volume Group Type: -- 分卷组类型: -+ -+ Volume Group Type: -+ 分卷组类型: - - -- -- Physical Extent Size: -- 物理区域PE大小: -+ -+ Physical Extent Size: -+ 物理区域PE大小: - - -- -- MiB -- MiB -+ -+ MiB -+ MiB - - -- -- Total Size: -- 大小: -+ -+ Total Size: -+ 大小: - - -- -- Used Size: -- 已用空间: -+ -+ Used Size: -+ 已用空间: - - -- -- Total Sectors: -- 总扇区数: -+ -+ Total Sectors: -+ 总扇区数: - - -- -- Quantity of LVs: -- 逻辑分卷数量: -+ -+ Quantity of LVs: -+ 逻辑分卷数量: - -- -- -+ -+ - WelcomePage - -- -- -- Select application and system language -- 选择应用程序和系统语言 -+ -+ -+ Select application and system language -+ 选择应用程序和系统语言 -+ -+ -+ -+ language -+ 语言 - - -- -- Open donations website -- 打开捐赠信息网页 -+ Open donations website -+ 打开捐赠信息网页 - - -- -- &Donate -- 捐赠(&D) -+ &Donate -+ 捐赠(&D) - - -- -- Open help and support website -- 打开帮助和支持页面 -+ Open help and support website -+ 打开帮助和支持页面 - - -- -- &Support -- 支持信息(&S) -+ &Support -+ 支持信息(&S) - - -- -- Open issues and bug-tracking website -- 打开问题追踪网站 -+ Open issues and bug-tracking website -+ 打开问题追踪网站 - - -- -- &Known issues -- 已知问题(&K) -+ &Known issues -+ 已知问题(&K) - - -- -- Open release notes website -- 打开发布日志网页 -+ Open release notes website -+ 打开发布日志网页 - - -- -- &Release notes -- 发行注记(&R) -+ &Release notes -+ 发行注记(&R) - - -- -- About %1 Setup -- @title -- 关于 %1 安装程序 -+ -+ About %1 Setup -+ @title -+ 关于 %1 安装程序 - - -- -- About %1 Installer -- @title -- 关于 %1 安装程序 -+ -+ About %1 Installer -+ @title -+ 关于 %1 安装程序 - - -- -- %1 Support -- @action -- %1 的支持信息 -+ %1 Support -+ @action -+ %1 的支持信息 - -- -- -+ -+ - WelcomeQmlViewStep - -- -- Welcome -- @title -- 欢迎 -+ -+ Welcome -+ @title -+ 欢迎 - -- -- -+ -+ - WelcomeViewStep - -- -- Welcome -- @title -- 欢迎 -+ -+ Welcome -+ @title -+ 欢迎 - -- -- -+ -+ - ZfsJob - -- -- Creating ZFS pools and datasets… -- @status -- 正在创建 ZFS 池和数据集… -+ -+ Creating ZFS pools and datasets… -+ @status -+ 正在创建 ZFS 池和数据集… - - -- -- Failed to create zpool on -- 创建 zpool 失败于 -+ -+ Failed to create zpool on -+ 创建 zpool 失败于 - - -- -- Configuration Error -- 配置错误 -+ -+ Configuration Error -+ 配置错误 - - -- -- No partitions are available for ZFS. -- 没有可用于 ZFS 的分区。 -+ -+ No partitions are available for ZFS. -+ 没有可用于 ZFS 的分区。 - - -- -- Internal data missing -- 内部数据丢失 -+ -+ Internal data missing -+ 内部数据丢失 - - -- -- -- Failed to create zpool -- 创建 zpool 失败 -+ -+ -+ Failed to create zpool -+ 创建 zpool 失败 - - -- -- Failed to create dataset -- 创建数据集失败 -+ -+ Failed to create dataset -+ 创建数据集失败 - - -- -- The output was: -- 输出为: -+ -+ The output was: -+ 输出为: - -- -- -+ -+ - calamares-sidebar - -- -- About -- 关于 -+ -+ About -+ 关于 - - -- -- Debug -- 调试 -+ -+ Debug -+ 调试 - - -- -- About -- @button -- 关于 -+ -+ About -+ @button -+ 关于 - - -- -- Show information about Calamares -- @tooltip -- 显示关于 Calamares 的信息 -+ -+ Show information about easysoftware -+ @tooltip -+ 显示关于 easysoftware 的信息 - - -- -- Debug -- @button -- 调试 -+ -+ Show information about Calamares -+ @tooltip -+ - - -- -- Show debug information -- @tooltip -- 显示调试信息 -+ -+ -+ Debug -+ @button -+ 调试 - -- -- -+ -+ -+ -+ Show debug information -+ @tooltip -+ 显示调试信息 -+ -+ -+ - finishedq - -- -- Installation Completed -- 安装完成 -+ -+ Installation Completed -+ 安装完成 - - -- -- %1 has been installed on your computer.<br/> -+ -+ %1 has been installed on your computer.<br/> - You may now restart into your new system, or continue using the Live environment. -- %1 已安装在您的电脑上了。<br/> -+ %1 已安装在您的电脑上了。<br/> - 您现在可以重新启动到新系统,或是继续使用 Live 环境。 - - -- -- Close Installer -- 关闭安装程序 -+ -+ Close Installer -+ 关闭安装程序 - - -- -- Restart System -- 重启系统 -+ -+ Restart System -+ 重启系统 - - -- -- <p>A full log of the install is available as installation.log in the home directory of the Live user.<br/> -+ -+ <p>A full log of the install is available as installation.log in the home directory of the Live user.<br/> - This log is copied to /var/log/installation.log of the target system.</p> -- 安装过程中的翻译已经复制到了临时用户的家目录下 -+ 安装过程中的翻译已经复制到了临时用户的家目录下 - 于此同时安装日志也已经复制到了目标系统,路径为:/var/log/installation.log - -- -- -+ -+ - finishedq-qt6 - -- -- Installation Completed -- @title -- 安装完成 -+ -+ Installation Completed -+ @title -+ 安装完成 - - -- -- %1 has been installed on your computer.<br/> -+ -+ %1 has been installed on your computer.<br/> - You may now restart into your new system, or continue using the Live environment. -- @info, %1 is the product name -- %1 已安装在您的电脑上了。<br/> -+ @info, %1 is the product name -+ %1 已安装在您的电脑上了。<br/> - 您现在可以重新启动到新系统,或是继续使用 Live 环境。 - - -- -- Close Installer -- @button -- 关闭安装程序 -+ -+ Close Installer -+ @button -+ 关闭安装程序 - - -- -- Restart System -- @button -- 重启系统 -+ -+ Restart System -+ @button -+ 重启系统 - - -- -- <p>A full log of the install is available as installation.log in the home directory of the Live user.<br/> -+ -+ <p>A full log of the install is available as installation.log in the home directory of the Live user.<br/> - This log is copied to /var/log/installation.log of the target system.</p> -- @info -- 安装过程中的翻译已经复制到了临时用户的家目录下 -+ @info -+ 安装过程中的翻译已经复制到了临时用户的家目录下 - 于此同时安装日志也已经复制到了目标系统,路径为:/var/log/installation.log - -- -- -+ -+ - finishedq@mobile - -- -- Installation Completed -- @title -- 安装完成 -+ -+ Installation Completed -+ @title -+ 安装完成 - - -- -- %1 has been installed on your computer.<br/> -+ -+ %1 has been installed on your computer.<br/> - You may now restart your device. -- @info, %1 is the product name -- %1 已安装在您的计算机上。<br/> -+ @info, %1 is the product name -+ %1 已安装在您的计算机上。<br/> - 现在可以重新启动设备了。 - - -- -- Close -- @button -- 关闭 -+ -+ Close -+ @button -+ 关闭 - - -- -- Restart -- @button -- 重启 -+ -+ Restart -+ @button -+ 重启 - -- -- -+ -+ - keyboardq - -- -- Select a layout to activate keyboard preview -- @label -- 选择布局以激活键盘预览 -+ -+ Select a layout to activate keyboard preview -+ @label -+ 选择布局以激活键盘预览 - - -- -- <b>Keyboard model:&nbsp;&nbsp;</b> -- @label -- <b>键盘型号:&nbsp;&nbsp;</b> -+ -+ <b>Keyboard model:&nbsp;&nbsp;</b> -+ @label -+ <b>键盘型号:&nbsp;&nbsp;</b> - - -- -- Layout -- @label -- 布局 -+ -+ Layout -+ @label -+ 布局 - - -- -- Variant -- @label -- 变体 -+ -+ Variant -+ @label -+ 变体 - - -- -- Type here to test your keyboard… -- @label -- 在此处输入以测试键盘… -+ -+ Type here to test your keyboard… -+ @label -+ 在此处输入以测试键盘… - -- -- -+ -+ - keyboardq-qt6 - -- -- Select a layout to activate keyboard preview -- @label -- 选择布局以激活键盘预览 -+ -+ Select a layout to activate keyboard preview -+ @label -+ 选择布局以激活键盘预览 - - -- -- <b>Keyboard model:&nbsp;&nbsp;</b> -- @label -- <b>键盘型号:&nbsp;&nbsp;</b> -+ -+ <b>Keyboard model:&nbsp;&nbsp;</b> -+ @label -+ <b>键盘型号:&nbsp;&nbsp;</b> - - -- -- Layout -- @label -- 布局 -+ -+ Layout -+ @label -+ 布局 - - -- -- Variant -- @label -- 变体 -+ -+ Variant -+ @label -+ 变体 - - -- -- Type here to test your keyboard… -- @label -- 在此处输入以测试键盘… -+ -+ Type here to test your keyboard… -+ @label -+ 在此处输入以测试键盘… - -- -- -+ -+ - localeq - -- -- -- Change -- @button -- 更改 -+ -+ -+ Change -+ @button -+ 更改 - - -- -- <h3>Languages</h3> </br> -+ -+ <h3>Languages</h3> </br> - The system locale setting affects the language and character set for some command line user interface elements. The current setting is <strong>%1</strong>. -- @info -- <h3>语言</h3></br> -+ @info -+ <h3>语言</h3></br> - 系统语言区域设置会影响部份命令行用户界面的语言及字符集。 当前设置是 <strong>%1</strong>。 - - -- -- <h3>Locales</h3> </br> -+ -+ <h3>Locales</h3> </br> - The system locale setting affects the numbers and dates format. The current setting is <strong>%1</strong>. -- @info -- <h3>区域</h3></br> -+ @info -+ <h3>区域</h3></br> - 系统区域设置会影响数字和日期格式。 当前设置是 <strong>%1</strong>。 - -- -- -+ -+ - localeq-qt6 - -- -- -- Change -- @button -- 更改 -+ -+ -+ Change -+ @button -+ 更改 - - -- -- <h3>Languages</h3> </br> -+ -+ <h3>Languages</h3> </br> - The system locale setting affects the language and character set for some command line user interface elements. The current setting is <strong>%1</strong>. -- @info -- <h3>语言</h3></br> -+ @info -+ <h3>语言</h3></br> - 系统语言区域设置会影响部份命令行用户界面的语言及字符集。 当前设置是 <strong>%1</strong>。 - - -- -- <h3>Locales</h3> </br> -+ -+ <h3>Locales</h3> </br> - The system locale setting affects the numbers and dates format. The current setting is <strong>%1</strong>. -- @info -- <h3>区域</h3></br> -+ @info -+ <h3>区域</h3></br> - 系统区域设置会影响数字和日期格式。 当前设置是 <strong>%1</strong>。 - -- -- -+ -+ - notesqml - -- -- <h3>%1</h3> -+ -+ <h3>%1</h3> - <p>These are example release notes.</p> -- <h3>%1</h3> -+ <h3>%1</h3> - <p>这些是发布日志样例</p> - -- -- -+ -+ - packagechooserq - -- -- LibreOffice is a powerful and free office suite, used by millions of people around the world. It includes several applications that make it the most versatile Free and Open Source office suite on the market.<br/> -+ -+ LibreOffice is a powerful and free office suite, used by millions of people around the world. It includes several applications that make it the most versatile Free and Open Source office suite on the market.<br/> - Default option. -- LibreOffice 是強大且自由的辦办公软件,世界上有百万级别的用户量。其中包括多种组件模块使其成为世界上最强大的开源并自由的办公软件。<br/> -+ LibreOffice 是強大且自由的辦办公软件,世界上有百万级别的用户量。其中包括多种组件模块使其成为世界上最强大的开源并自由的办公软件。<br/> - 预设选项。 - - -- -- LibreOffice -- LibreOffice -+ -+ LibreOffice -+ LibreOffice - - -- -- If you don't want to install an office suite, just select No Office Suite. You can always add one (or more) later on your installed system as the need arrives. -- 如果你不想安装办公软件,请选择不安装办公软件的选项即可。稍后您可以在安装好的系统上根据个人喜好自行选择安装办公软件与否。您可以随时在安装好的系统上添加一个(或多个)办公软件。 -+ -+ If you don't want to install an office suite, just select No Office Suite. You can always add one (or more) later on your installed system as the need arrives. -+ 如果你不想安装办公软件,请选择不安装办公软件的选项即可。稍后您可以在安装好的系统上根据个人喜好自行选择安装办公软件与否。您可以随时在安装好的系统上添加一个(或多个)办公软件。 - - -- -- No Office Suite -- 无办公软件 -+ -+ No Office Suite -+ 无办公软件 - - -- -- Create a minimal Desktop install, remove all extra applications and decide later on what you would like to add to your system. Examples of what won't be on such an install, there will be no Office Suite, no media players, no image viewer or print support. It will be just a desktop, file browser, package manager, text editor and simple web-browser. -- 建立最小化的桌面安装,移除所有的附加应用。在稍后自行选择需要安装至系统的应用。同时不会有任何的模板和例子可供选择。无办公软件,无媒体播放器,无图片查看器或者打印支持。仅仅有一个桌面,文件管理器,包管理器,文本编辑器和一个网页浏览器。 -+ -+ Create a minimal Desktop install, remove all extra applications and decide later on what you would like to add to your system. Examples of what won't be on such an install, there will be no Office Suite, no media players, no image viewer or print support. It will be just a desktop, file browser, package manager, text editor and simple web-browser. -+ 建立最小化的桌面安装,移除所有的附加应用。在稍后自行选择需要安装至系统的应用。同时不会有任何的模板和例子可供选择。无办公软件,无媒体播放器,无图片查看器或者打印支持。仅仅有一个桌面,文件管理器,包管理器,文本编辑器和一个网页浏览器。 - - -- -- Minimal Install -- 最小化安装 -+ -+ Minimal Install -+ 最小化安装 - - -- -- Please select an option for your install, or use the default: LibreOffice included. -- 请为你的安装指定一个选项,或者使用默认选项:安装LibreOffice -+ -+ Please select an option for your install, or use the default: LibreOffice included. -+ 请为你的安装指定一个选项,或者使用默认选项:安装LibreOffice - -- -- -+ -+ - packagechooserq-qt6 - -- -- LibreOffice is a powerful and free office suite, used by millions of people around the world. It includes several applications that make it the most versatile Free and Open Source office suite on the market.<br/> -+ -+ LibreOffice is a powerful and free office suite, used by millions of people around the world. It includes several applications that make it the most versatile Free and Open Source office suite on the market.<br/> - Default option. -- LibreOffice 是強大且自由的辦办公软件,世界上有百万级别的用户量。其中包括多种组件模块使其成为世界上最强大的开源并自由的办公软件。<br/> -+ LibreOffice 是強大且自由的辦办公软件,世界上有百万级别的用户量。其中包括多种组件模块使其成为世界上最强大的开源并自由的办公软件。<br/> - 预设选项。 - - -- -- LibreOffice -- LibreOffice -+ -+ LibreOffice -+ LibreOffice - - -- -- If you don't want to install an office suite, just select No Office Suite. You can always add one (or more) later on your installed system as the need arrives. -- 如果你不想安装办公软件,请选择不安装办公软件的选项即可。稍后您可以在安装好的系统上根据个人喜好自行选择安装办公软件与否。您可以随时在安装好的系统上添加一个(或多个)办公软件。 -+ -+ If you don't want to install an office suite, just select No Office Suite. You can always add one (or more) later on your installed system as the need arrives. -+ 如果你不想安装办公软件,请选择不安装办公软件的选项即可。稍后您可以在安装好的系统上根据个人喜好自行选择安装办公软件与否。您可以随时在安装好的系统上添加一个(或多个)办公软件。 - - -- -- No Office Suite -- 无办公软件 -+ -+ No Office Suite -+ 无办公软件 - - -- -- Create a minimal Desktop install, remove all extra applications and decide later on what you would like to add to your system. Examples of what won't be on such an install, there will be no Office Suite, no media players, no image viewer or print support. It will be just a desktop, file browser, package manager, text editor and simple web-browser. -- 建立最小化的桌面安装,移除所有的附加应用。在稍后自行选择需要安装至系统的应用。同时不会有任何的模板和例子可供选择。无办公软件,无媒体播放器,无图片查看器或者打印支持。仅仅有一个桌面,文件管理器,包管理器,文本编辑器和一个网页浏览器。 -+ -+ Create a minimal Desktop install, remove all extra applications and decide later on what you would like to add to your system. Examples of what won't be on such an install, there will be no Office Suite, no media players, no image viewer or print support. It will be just a desktop, file browser, package manager, text editor and simple web-browser. -+ 建立最小化的桌面安装,移除所有的附加应用。在稍后自行选择需要安装至系统的应用。同时不会有任何的模板和例子可供选择。无办公软件,无媒体播放器,无图片查看器或者打印支持。仅仅有一个桌面,文件管理器,包管理器,文本编辑器和一个网页浏览器。 - - -- -- Minimal Install -- 最小化安装 -+ -+ Minimal Install -+ 最小化安装 - - -- -- Please select an option for your install, or use the default: LibreOffice included. -- 请为你的安装指定一个选项,或者使用默认选项:安装LibreOffice -+ -+ Please select an option for your install, or use the default: LibreOffice included. -+ 请为你的安装指定一个选项,或者使用默认选项:安装LibreOffice - -- -- -+ -+ - release_notes - -- -- <h3>%1</h3> -+ <h3>%1</h3> - <p>This an example QML file, showing options in RichText with Flickable content.</p> - - <p>QML with RichText can use HTML tags, Flickable content is useful for touchscreens.</p> -@@ -4890,7 +5023,7 @@ Output: - </ul> - - <p>The vertical scrollbar is adjustable, current width set to 10.</p> -- <h3>%1</h3> -+ <h3>%1</h3> - <p>这是一个QML 示例文件,显示了具有 Flickable 内容的 RichText 选项。</p> - - <p>带有 RichText 的 QML 可以使用 HTML 标签, -@@ -4914,335 +5047,364 @@ Output: - <p>垂直滚动条是可调的,当前宽度设置为10。</p> - - -- -- Back -- 后退 -+ -+ ### %1 -+This an example QML file, showing options in Markdown with Flickable content. -+ -+QML with RichText can use HTML tags, with Markdown it uses the simple Markdown syntax, Flickable content is useful for touchscreens. -+ -+**This is bold text** -+ -+*This is italic text* -+ -+_This is underlined text_ -+ -+> blockquote -+ -+~~This is strikethrough~~ -+ -+Code example: -+``` -+ls -l /home -+``` -+ -+**Lists:** -+ * Intel CPU systems -+ * AMD CPU systems -+ -+The vertical scrollbar is adjustable, current width set to 10. -+ -+ -+ -+ -+ Back -+ 后退 - -- -- -+ -+ - usersq - -- -- Pick your user name and credentials to login and perform admin tasks -- 选择您的用户名和凭据登录并执行管理任务 -+ -+ Pick your user name and credentials to login and perform admin tasks -+ 选择您的用户名和凭据登录并执行管理任务 - - -- -- What is your name? -- 您的姓名? -+ -+ What is your name? -+ 您的姓名? - - -- -- Your full name -- 您的全名 -+ -+ Your full name -+ 您的全名 - - -- -- What name do you want to use to log in? -- 您想要使用的登录用户名是? -+ -+ What name do you want to use to log in? -+ 您想要使用的登录用户名是? - - -- -- Login name -- 登录名 -+ -+ Login name -+ 登录名 - - -- -- If more than one person will use this computer, you can create multiple accounts after installation. -- 如果有多人要使用此计算机,您可以在安装后创建多个账户。 -+ -+ If more than one person will use this computer, you can create multiple accounts after installation. -+ 如果有多人要使用此计算机,您可以在安装后创建多个账户。 - - -- -- Only lowercase letters, numbers, underscore and hyphen are allowed. -- 只允许小写字母、数组、下划线"_" 和 连字符"-" -+ -+ Only lowercase letters, numbers, underscore and hyphen are allowed. -+ 只允许小写字母、数组、下划线"_" 和 连字符"-" - - -- -- root is not allowed as username. -- 用户名不能为root -+ -+ root is not allowed as username. -+ 用户名不能为root - - -- -- What is the name of this computer? -- 计算机名称为? -+ -+ What is the name of this computer? -+ 计算机名称为? - - -- -- Computer name -- 计算机名称 -+ -+ Computer name -+ 计算机名称 - - -- -- This name will be used if you make the computer visible to others on a network. -- 将计算机设置为对其他网络上计算机可见时将使用此名称。 -+ -+ This name will be used if you make the computer visible to others on a network. -+ 将计算机设置为对其他网络上计算机可见时将使用此名称。 - - -- -- Only letters, numbers, underscore and hyphen are allowed, minimal of two characters. -- 只允许字母、数组、下划线"_" 和 连字符"-",最少两个字符。 -+ -+ Only letters, numbers, underscore and hyphen are allowed, minimal of two characters. -+ 只允许字母、数组、下划线"_" 和 连字符"-",最少两个字符。 - - -- -- localhost is not allowed as hostname. -- localhost不能为用户名 -+ -+ localhost is not allowed as hostname. -+ localhost不能为用户名 - - -- -- Choose a password to keep your account safe. -- 选择一个密码来保证您的账户安全。 -+ -+ Choose a password to keep your account safe. -+ 选择一个密码来保证您的账户安全。 - - -- -- Password -- 密码 -+ -+ Password -+ 密码 - - -- -- Repeat password -- 确认密码 -+ -+ Repeat password -+ 确认密码 - - -- -- Enter the same password twice, so that it can be checked for typing errors. A good password will contain a mixture of letters, numbers and punctuation, should be at least eight characters long, and should be changed at regular intervals. -- 输入相同密码两次,以检查输入错误。好的密码包含字母,数字,标点的组合,应当至少为 8 个字符长,并且应按一定周期更换。 -+ -+ Enter the same password twice, so that it can be checked for typing errors. A good password will contain a mixture of letters, numbers and punctuation, should be at least eight characters long, and should be changed at regular intervals. -+ 输入相同密码两次,以检查输入错误。好的密码包含字母,数字,标点的组合,应当至少为 8 个字符长,并且应按一定周期更换。 - - -- -- Reuse user password as root password -- 重用用户密码作为 root 密码 -+ -+ Reuse user password as root password -+ 重用用户密码作为 root 密码 - - -- -- Use the same password for the administrator account. -- 为管理员帐号使用同样的密码。 -+ -+ Use the same password for the administrator account. -+ 为管理员帐号使用同样的密码。 - - -- -- Choose a root password to keep your account safe. -- 选择一个 root 密码来保证您的账户安全。 -+ -+ Choose a root password to keep your account safe. -+ 选择一个 root 密码来保证您的账户安全。 - - -- -- Root password -- Root 密码 -+ -+ Root password -+ Root 密码 - - -- -- Repeat root password -- 确认 Root 密码 -+ -+ Repeat root password -+ 确认 Root 密码 - - -- -- Enter the same password twice, so that it can be checked for typing errors. -- 输入相同密码两次,以检查输入错误。 -+ -+ Enter the same password twice, so that it can be checked for typing errors. -+ 输入相同密码两次,以检查输入错误。 - - -- -- Log in automatically without asking for the password -- 不询问密码自动登录 -+ -+ Log in automatically without asking for the password -+ 不询问密码自动登录 - - -- -- Validate passwords quality -- 验证密码质量 -+ -+ Validate passwords quality -+ 验证密码质量 - - -- -- When this box is checked, password-strength checking is done and you will not be able to use a weak password. -- 若选中此项,密码强度检测会开启,你将不被允许使用弱密码。 -+ -+ When this box is checked, password-strength checking is done and you will not be able to use a weak password. -+ 若选中此项,密码强度检测会开启,你将不被允许使用弱密码。 - -- -- -+ -+ - usersq-qt6 - -- -- Pick your user name and credentials to login and perform admin tasks -- 选择您的用户名和凭据登录并执行管理任务 -+ -+ Pick your user name and credentials to login and perform admin tasks -+ 选择您的用户名和凭据登录并执行管理任务 - - -- -- What is your name? -- 您的姓名? -+ -+ What is your name? -+ 您的姓名? - - -- -- Your full name -- 您的全名 -+ -+ Your full name -+ 您的全名 - - -- -- What name do you want to use to log in? -- 您想要使用的登录用户名是? -+ -+ What name do you want to use to log in? -+ 您想要使用的登录用户名是? - - -- -- Login name -- 登录名 -+ -+ Login name -+ 登录名 - - -- -- If more than one person will use this computer, you can create multiple accounts after installation. -- 如果有多人要使用此计算机,您可以在安装后创建多个账户。 -+ -+ If more than one person will use this computer, you can create multiple accounts after installation. -+ 如果有多人要使用此计算机,您可以在安装后创建多个账户。 - - -- -- Only lowercase letters, numbers, underscore and hyphen are allowed. -- 只允许小写字母、数组、下划线"_" 和 连字符"-" -+ -+ Only lowercase letters, numbers, underscore and hyphen are allowed. -+ 只允许小写字母、数组、下划线"_" 和 连字符"-" - - -- -- root is not allowed as username. -- 用户名不能为root -+ -+ root is not allowed as username. -+ 用户名不能为root - - -- -- What is the name of this computer? -- 计算机名称为? -+ -+ What is the name of this computer? -+ 计算机名称为? - - -- -- Computer name -- 计算机名称 -+ -+ Computer name -+ 计算机名称 - - -- -- This name will be used if you make the computer visible to others on a network. -- 将计算机设置为对其他网络上计算机可见时将使用此名称。 -+ -+ This name will be used if you make the computer visible to others on a network. -+ 将计算机设置为对其他网络上计算机可见时将使用此名称。 - - -- -- Only letters, numbers, underscore and hyphen are allowed, minimal of two characters. -- 只允许字母、数组、下划线"_" 和 连字符"-",最少两个字符。 -+ -+ Only letters, numbers, underscore and hyphen are allowed, minimal of two characters. -+ 只允许字母、数组、下划线"_" 和 连字符"-",最少两个字符。 - - -- -- localhost is not allowed as hostname. -- localhost不能为用户名 -+ -+ localhost is not allowed as hostname. -+ localhost不能为用户名 - - -- -- Choose a password to keep your account safe. -- 选择一个密码来保证您的账户安全。 -+ -+ Choose a password to keep your account safe. -+ 选择一个密码来保证您的账户安全。 - - -- -- Password -- 密码 -+ -+ Password -+ 密码 - - -- -- Repeat password -- 确认密码 -+ -+ Repeat password -+ 确认密码 - - -- -- Enter the same password twice, so that it can be checked for typing errors. A good password will contain a mixture of letters, numbers and punctuation, should be at least eight characters long, and should be changed at regular intervals. -- 输入相同密码两次,以检查输入错误。好的密码包含字母,数字,标点的组合,应当至少为 8 个字符长,并且应按一定周期更换。 -+ -+ Enter the same password twice, so that it can be checked for typing errors. A good password will contain a mixture of letters, numbers and punctuation, should be at least eight characters long, and should be changed at regular intervals. -+ 输入相同密码两次,以检查输入错误。好的密码包含字母,数字,标点的组合,应当至少为 8 个字符长,并且应按一定周期更换。 - - -- -- Reuse user password as root password -- 重用用户密码作为 root 密码 -+ -+ Reuse user password as root password -+ 重用用户密码作为 root 密码 - - -- -- Use the same password for the administrator account. -- 为管理员帐号使用同样的密码。 -+ -+ Use the same password for the administrator account. -+ 为管理员帐号使用同样的密码。 - - -- -- Choose a root password to keep your account safe. -- 选择一个 root 密码来保证您的账户安全。 -+ -+ Choose a root password to keep your account safe. -+ 选择一个 root 密码来保证您的账户安全。 - - -- -- Root password -- Root 密码 -+ -+ Root password -+ Root 密码 - - -- -- Repeat root password -- 确认 Root 密码 -+ -+ Repeat root password -+ 确认 Root 密码 - - -- -- Enter the same password twice, so that it can be checked for typing errors. -- 输入相同密码两次,以检查输入错误。 -+ -+ Enter the same password twice, so that it can be checked for typing errors. -+ 输入相同密码两次,以检查输入错误。 - - -- -- Log in automatically without asking for the password -- 不询问密码自动登录 -+ -+ Log in automatically without asking for the password -+ 不询问密码自动登录 - - -- -- Validate passwords quality -- 验证密码质量 -+ -+ Validate passwords quality -+ 验证密码质量 - - -- -- When this box is checked, password-strength checking is done and you will not be able to use a weak password. -- 若选中此项,密码强度检测会开启,你将不被允许使用弱密码。 -+ -+ When this box is checked, password-strength checking is done and you will not be able to use a weak password. -+ 若选中此项,密码强度检测会开启,你将不被允许使用弱密码。 - -- -- -+ -+ - welcomeq - -- -- <h3>Welcome to the %1 <quote>%2</quote> installer</h3> -+ -+ <h3>Welcome to the %1 <quote>%2</quote> installer</h3> - <p>This program will ask you some questions and set up %1 on your computer.</p> -- <h3>欢迎来到 %1 <quote>%2</quote> 安装程序</h3> -+ <h3>欢迎来到 %1 <quote>%2</quote> 安装程序</h3> - <p>这个程序将询问您一些问题并在您的计算机上安装 %1。</p> - - -- -- Support -- 支持 -+ -+ Support -+ 支持 - - -- -- Known Issues -- 已知问题 -+ -+ Known Issues -+ 已知问题 - - -- -- Release Notes -- 发行说明 -+ -+ Release Notes -+ 发行说明 - - -- -- Donate -- 捐赠 -+ -+ Donate -+ 捐赠 - -- -- -+ -+ - welcomeq-qt6 - -- -- <h3>Welcome to the %1 <quote>%2</quote> installer</h3> -+ -+ <h3>Welcome to the %1 <quote>%2</quote> installer</h3> - <p>This program will ask you some questions and set up %1 on your computer.</p> -- <h3>欢迎来到 %1 <quote>%2</quote> 安装程序</h3> -+ <h3>欢迎来到 %1 <quote>%2</quote> 安装程序</h3> - <p>这个程序将询问您一些问题并在您的计算机上安装 %1。</p> - - -- -- Support -- 支持 -+ -+ Support -+ 支持 - - -- -- Known Issues -- 已知问题 -+ -+ Known Issues -+ 已知问题 - - -- -- Release Notes -- 发行说明 -+ -+ Release Notes -+ 发行说明 - - -- -- Donate -- 捐赠 -+ -+ Donate -+ 捐赠 - -- -+ - -diff --git a/lang/calamares_zh_HK.ts b/lang/calamares_zh_HK.ts -index 561087f..9f5dec5 100644 ---- a/lang/calamares_zh_HK.ts -+++ b/lang/calamares_zh_HK.ts -@@ -1,5195 +1,5267 @@ - - -- -- -+ -+ - AboutData - -- -- <h1>%1</h1><br/><strong>%2<br/> for %3</strong><br/><br/> -- -+ -+ <br/><h2>Release:%1</h2><br/> -+ <br/><h1>發行版本:%1</h1><br/> - - -- -- Thanks to <a href="https://calamares.io/team/">the Calamares team</a> and the <a href="https://app.transifex.com/calamares/calamares/">Calamares translators team</a>. -- -+ -+ <strong>Thanks to the openEuler team.</strong> -+ <strong>感謝 openEuler 團隊。</strong> - - -- -- <a href="https://calamares.io/">Calamares</a> development is sponsored by <br/><a href="http://www.blue-systems.com/">Blue Systems</a> - Liberating Software. -- -+ -+ Copyright %1-%2 %3 &lt;%4&gt;<br/> -+ Copyright year-year Name <email-address> -+ - -+ -+ -+ ActiveDirectoryJob - -- -- Copyright %1-%2 %3 &lt;%4&gt;<br/> -- Copyright year-year Name <email-address> -- -+ -+ Enroll system in Active Directory -+ @label -+ - -- -- -+ -+ -+ Enrolling system in Active Directory… -+ @status -+ -+ -+ -+ - AutoMountManagementJob - -- -- Managing auto-mount settings… -- @status -- -+ -+ Managing auto-mount settings… -+ @status -+ - -- -- -+ -+ - BootInfoWidget - -- -- The <strong>boot environment</strong> of this system.<br><br>Older x86 systems only support <strong>BIOS</strong>.<br>Modern systems usually use <strong>EFI</strong>, but may also show up as BIOS if started in compatibility mode. -- 這個系統的<strong>開機環境</strong>。<br><br>較舊的 x86 系統只支援 <strong>BIOS</strong>。<br>現時的系統則通常使用 <strong>EFI</strong>,但若使用相容模式 (CSM),也可能顯示為 BIOS。 -+ -+ The <strong>boot environment</strong> of this system.<br><br>Older x86 systems only support <strong>BIOS</strong>.<br>Modern systems usually use <strong>EFI</strong>, but may also show up as BIOS if started in compatibility mode. -+ 這個系統的<strong>開機環境</strong>。<br><br>較舊的 x86 系統只支援 <strong>BIOS</strong>。<br>現時的系統則通常使用 <strong>EFI</strong>,但若使用相容模式 (CSM),也可能顯示為 BIOS。 - - -- -- This system was started with an <strong>EFI</strong> boot environment.<br><br>To configure startup from an EFI environment, this installer must deploy a boot loader application, like <strong>GRUB</strong> or <strong>systemd-boot</strong> on an <strong>EFI System Partition</strong>. This is automatic, unless you choose manual partitioning, in which case you must choose it or create it on your own. -- 這個系統以 <strong>EFI</strong> 開機。<br><br>要從 EFI 環境開機,本安裝程式必須安裝開機載入器程式,像是 <strong>GRUB</strong> 或 <strong>systemd-boot</strong> 在 <strong>EFI 系統分割區</strong>。這是自動的,除非選擇手動分割;在這種情況,您必須自行選取或建立它。 -+ -+ This system was started with an <strong>EFI</strong> boot environment.<br><br>To configure startup from an EFI environment, this installer must deploy a boot loader application, like <strong>GRUB</strong> or <strong>systemd-boot</strong> on an <strong>EFI System Partition</strong>. This is automatic, unless you choose manual partitioning, in which case you must choose it or create it on your own. -+ 這個系統以 <strong>EFI</strong> 開機。<br><br>要從 EFI 環境開機,本安裝程式必須安裝開機載入器程式,像是 <strong>GRUB</strong> 或 <strong>systemd-boot</strong> 在 <strong>EFI 系統分割區</strong>。這是自動的,除非選擇手動分割;在這種情況,您必須自行選取或建立它。 - - -- -- This system was started with a <strong>BIOS</strong> boot environment.<br><br>To configure startup from a BIOS environment, this installer must install a boot loader, like <strong>GRUB</strong>, either at the beginning of a partition or on the <strong>Master Boot Record</strong> near the beginning of the partition table (preferred). This is automatic, unless you choose manual partitioning, in which case you must set it up on your own. -- -+ -+ This system was started with a <strong>BIOS</strong> boot environment.<br><br>To configure startup from a BIOS environment, this installer must install a boot loader, like <strong>GRUB</strong>, either at the beginning of a partition or on the <strong>Master Boot Record</strong> near the beginning of the partition table (preferred). This is automatic, unless you choose manual partitioning, in which case you must set it up on your own. -+ - -- -- -+ -+ - BootLoaderModel - -- -- Master Boot Record of %1 -- @info -- -+ -+ Master Boot Record of %1 -+ @info -+ - - -- -- Boot Partition -- @info -- -+ -+ Boot Partition -+ @info -+ - - -- -- System Partition -- @info -- -+ -+ System Partition -+ @info -+ - - -- -- Do not install a boot loader -- @label -- -+ -+ Do not install a boot loader -+ @label -+ - - -- -- %1 (%2) -- -+ -+ %1 (%2) -+ - -- -- -+ -+ - Calamares::BlankViewStep - -- -- Blank Page -- -+ -+ Blank Page -+ - -- -- -+ -+ - Calamares::DebugWindow - -- -- GlobalStorage -- -+ -+ GlobalStorage -+ - - -- -- JobQueue -- -+ -+ JobQueue -+ - - -- -- Modules -- -+ -+ Modules -+ - - -- -- Type: -- -+ -+ Type: -+ - - -- -- -- none -- -+ -+ -+ none -+ - - -- -- Interface: -- -+ -+ Interface: -+ - - -- -- Crashes Calamares, so that Dr. Konqi can look at it. -- -+ -+ Crashes Calamares, so that Dr. Konqi can look at it. -+ - - -- -- Reloads the stylesheet from the branding directory. -- -+ -+ Reloads the stylesheet from the branding directory. -+ - - -- -- Reload Stylesheet -- -+ -+ Reload Stylesheet -+ - - -- -- Displays the tree of widget names in the log (for stylesheet debugging). -- -+ -+ Displays the tree of widget names in the log (for stylesheet debugging). -+ - - -- -- Widget Tree -- -+ -+ Widget Tree -+ - - -- -- Uploads the session log to the configured pastebin. -- -+ -+ Uploads the session log to the configured pastebin. -+ - - -- -- Send Session Log -- -+ -+ Send Session Log -+ - - -- -- Debug Information -- @title -- -+ -+ Debug Information -+ @title -+ - -- -- -+ -+ - Calamares::ExecutionViewStep - -- -- %p% -- Progress percentage indicator: %p is where the number 0..100 is placed -- -+ -+ %p% -+ Progress percentage indicator: %p is where the number 0..100 is placed -+ - - -- -- Set Up -- @label -- -+ -+ Set Up -+ @label -+ - - -- -- Install -- @label -- -+ -+ Install -+ @label -+ - -- -- -+ -+ - Calamares::FailJob - -- -- Job failed (%1) -- -+ -+ Job failed (%1) -+ - - -- -- Programmed job failure was explicitly requested. -- -+ -+ Programmed job failure was explicitly requested. -+ - -- -- -+ -+ - Calamares::JobThread - -- -- Done -- -+ -+ Done -+ - -- -- -+ -+ - Calamares::NamedJob - -- -- Example job (%1) -- -+ -+ Example job (%1) -+ - -- -- -+ -+ - Calamares::ProcessJob - -- -- Running command %1 in target system… -- @status -- -+ -+ Running command %1 in target system… -+ @status -+ - - -- -- Running command %1… -- @status -- -+ -+ Running command %1… -+ @status -+ - -- -- -+ -+ - Calamares::Python::Job - -- -- Running %1 operation. -- -+ -+ Running %1 operation. -+ - - -- -- Bad working directory path -- -+ -+ Bad working directory path -+ - - -- -- Working directory %1 for python job %2 is not readable. -- -+ -+ Working directory %1 for python job %2 is not readable. -+ - - -- -- -- -- -- -- -- Bad main script file -- -+ -+ -+ -+ -+ -+ -+ Bad main script file -+ - - -- -- Main script file %1 for python job %2 is not readable. -- -+ -+ Main script file %1 for python job %2 is not readable. -+ - - -- -- Bad internal script -- -+ -+ Bad internal script -+ - - -- -- Internal script for python job %1 raised an exception. -- -+ -+ Internal script for python job %1 raised an exception. -+ - - -- -- Main script file %1 for python job %2 could not be loaded because it raised an exception. -- -+ -+ Main script file %1 for python job %2 could not be loaded because it raised an exception. -+ - - -- -- Main script file %1 for python job %2 raised an exception. -- -+ -+ Main script file %1 for python job %2 raised an exception. -+ - - -- -- -- Main script file %1 for python job %2 returned invalid results. -- -+ -+ -+ Main script file %1 for python job %2 returned invalid results. -+ - - -- -- Main script file %1 for python job %2 does not contain a run() function. -- -+ -+ Main script file %1 for python job %2 does not contain a run() function. -+ - -- -- -+ -+ - Calamares::PythonJob - -- -- Running %1 operation… -- @status -- -+ -+ Running %1 operation… -+ @status -+ - - -- -- Bad working directory path -- @error -- -+ -+ Bad working directory path -+ @error -+ - - -- -- Working directory %1 for python job %2 is not readable. -- @error -- -+ -+ Working directory %1 for python job %2 is not readable. -+ @error -+ - - -- -- Bad main script file -- @error -- -+ -+ Bad main script file -+ @error -+ - - -- -- Main script file %1 for python job %2 is not readable. -- @error -- -+ -+ Main script file %1 for python job %2 is not readable. -+ @error -+ - - -- -- Boost.Python error in job "%1" -- @error -- -+ -+ Boost.Python error in job "%1" -+ @error -+ - -- -- -+ -+ - Calamares::QmlViewStep - -- -- Loading… -- @status -- -+ -+ Loading… -+ @status -+ - - -- -- QML step <i>%1</i>. -- @label -- -+ -+ QML step <i>%1</i>. -+ @label -+ - - -- -- Loading failed. -- @info -- -+ -+ Loading failed. -+ @info -+ - -- -- -+ -+ - Calamares::RequirementsChecker - -- -- Requirements checking for module '%1' is complete. -- @info -- -+ -+ Requirements checking for module '%1' is complete. -+ @info -+ - - -- -- Waiting for %n module(s)… -- @status -- -- -- -+ -+ Waiting for %n module(s)… -+ @status -+ -+ -+ - - -- -- (%n second(s)) -- @status -- -- -- -+ -+ (%n second(s)) -+ @status -+ -+ -+ - - -- -- System-requirements checking is complete. -- @info -- -+ -+ System-requirements checking is complete. -+ @info -+ - -- -- -+ -+ - Calamares::ViewManager - -- -- The upload was unsuccessful. No web-paste was done. -- -+ -+ The upload was unsuccessful. No web-paste was done. -+ - - -- -- Install log posted to -+ -+ Install log posted to - - %1 - - Link copied to clipboard -- -+ - - -- -- Install Log Paste URL -- -+ -+ Install Log Paste URL -+ - - -- -- &Yes -- -+ -+ &Yes -+ - - -- -- &No -- -+ -+ &No -+ - - -- -- &Close -- -+ -+ &Close -+ - - -- -- Setup Failed -- @title -- -+ -+ Setup Failed -+ @title -+ - - -- -- Installation Failed -- @title -- -+ -+ Installation Failed -+ @title -+ - - -- -- Error -- @title -- -+ -+ Error -+ @title -+ - - -- -- Calamares Initialization Failed -- @title -- -+ -+ Calamares Initialization Failed -+ @title -+ - - -- -- %1 can not be installed. Calamares was unable to load all of the configured modules. This is a problem with the way Calamares is being used by the distribution. -- @info -- -+ -+ %1 can not be installed. Calamares was unable to load all of the configured modules. This is a problem with the way Calamares is being used by the distribution. -+ @info -+ - - -- -- <br/>The following modules could not be loaded: -- @info -- -+ -+ <br/>The following modules could not be loaded: -+ @info -+ - - -- -- Continue with Setup? -- @title -- -+ -+ Continue with Setup? -+ @title -+ - - -- -- Continue with Installation? -- @title -- -+ -+ Continue with Installation? -+ @title -+ - - -- -- The %1 setup program is about to make changes to your disk in order to set up %2.<br/><strong>You will not be able to undo these changes.</strong> -- %1 is short product name, %2 is short product name with version -- -+ -+ The %1 setup program is about to make changes to your disk in order to set up %2.<br/><strong>You will not be able to undo these changes.</strong> -+ %1 is short product name, %2 is short product name with version -+ - - -- -- The %1 installer is about to make changes to your disk in order to install %2.<br/><strong>You will not be able to undo these changes.</strong> -- %1 is short product name, %2 is short product name with version -- -+ -+ The %1 installer is about to make changes to your disk in order to install %2.<br/><strong>You will not be able to undo these changes.</strong> -+ %1 is short product name, %2 is short product name with version -+ - - -- -- &Set Up Now -- @button -- -+ -+ &Set Up Now -+ @button -+ - - -- -- &Install Now -- @button -- -+ -+ &Install Now -+ @button -+ - - -- -- Go &Back -- @button -- -+ -+ Go &Back -+ @button -+ - - -- -- &Set Up -- @button -- -+ -+ &Set Up -+ @button -+ - - -- -- &Install -- @button -- -+ -+ &Install -+ @button -+ - - -- -- Setup is complete. Close the setup program. -- @tooltip -- -+ -+ Setup is complete. Close the setup program. -+ @tooltip -+ - - -- -- The installation is complete. Close the installer. -- @tooltip -- -+ -+ The installation is complete. Close the installer. -+ @tooltip -+ - - -- -- Cancel the setup process without changing the system. -- @tooltip -- -+ -+ Cancel the setup process without changing the system. -+ @tooltip -+ - - -- -- Cancel the installation process without changing the system. -- @tooltip -- -+ -+ Cancel the installation process without changing the system. -+ @tooltip -+ - - -- -- &Next -- @button -- -+ -+ &Next -+ @button -+ - - -- -- &Back -- @button -- -+ -+ &Back -+ @button -+ - - -- -- &Done -- @button -- -+ -+ &Done -+ @button -+ - - -- -- &Cancel -- @button -- -+ -+ &Cancel -+ @button -+ - - -- -- Cancel Setup? -- @title -- -+ -+ Cancel Setup? -+ @title -+ - - -- -- Cancel Installation? -- @title -- -+ -+ Cancel Installation? -+ @title -+ - - -- -- Do you really want to cancel the current setup process? -+ -+ Do you really want to cancel the current setup process? - The setup program will quit and all changes will be lost. -- -+ -+ -+ -+ -+ Do you really want to cancel the current installation process? -+The system will reboot or you can enter the debug mode for further investigation. -+ 您確定要退出當前的安裝過程嗎? -+系統將重啟,或者您可以進入調試模式進行進一步的調查。 - - -- -- Do you really want to cancel the current install process? --The installer will quit and all changes will be lost. -- -+ -+ &Reboot -+ @button -+ 重啟(&R) - -- -- -+ -+ -+ &Debug -+ @button -+ 調試(&D) -+ -+ -+ - CalamaresPython::Helper - -- -- Unknown exception type -- @error -- -+ -+ Unknown exception type -+ @error -+ - - -- -- Unparseable Python error -- @error -- -+ -+ Unparseable Python error -+ @error -+ - - -- -- Unparseable Python traceback -- @error -- -+ -+ Unparseable Python traceback -+ @error -+ - - -- -- Unfetchable Python error -- @error -- -+ -+ Unfetchable Python error -+ @error -+ - -- -- -+ -+ - CalamaresWindow - -- -- %1 Setup Program -- -+ -+ -+ %1 Setup Program -+ - - -- -- %1 Installer -- -+ -+ -+ %1 Installer -+ - -- -- -+ -+ - ChangeFilesystemLabelJob - -- -- Set filesystem label on %1 -- @title -- -+ -+ Set filesystem label on %1 -+ @title -+ - - -- -- Set filesystem label <strong>%1</strong> to partition <strong>%2</strong> -- @info -- -+ -+ Set filesystem label <strong>%1</strong> to partition <strong>%2</strong> -+ @info -+ - - -- -- Setting filesystem label <strong>%1</strong> to partition <strong>%2</strong>… -- @status -- -+ -+ Setting filesystem label <strong>%1</strong> to partition <strong>%2</strong>… -+ @status -+ - - -- -- -- The installer failed to update partition table on disk '%1'. -- @info -- -+ -+ -+ The installer failed to update partition table on disk '%1'. -+ @info -+ - -- -- -+ -+ - CheckerContainer - -- -- Gathering system information... -- -+ -+ Gathering system information... -+ - -- -- -+ -+ - ChoicePage - -- -- Select storage de&vice: -- @label -- -+ -+ Select storage de&vice: -+ @label -+ - - -- -- -- -- -- Current: -- @label -- -+ -+ -+ -+ -+ Current: -+ @label -+ - - -- -- After: -- @label -- -+ -+ After: -+ @label -+ - - -- -- Reuse %1 as home partition for %2 -- @label -- -+ -+ Reuse %1 as home partition for %2 -+ @label -+ - - -- -- <strong>Select a partition to shrink, then drag the bottom bar to resize</strong> -- -+ -+ <strong>Select a partition to shrink, then drag the bottom bar to resize</strong> -+ - - -- -- %1 will be shrunk to %2MiB and a new %3MiB partition will be created for %4. -- @info, %1 is partition name, %4 is product name -- -+ -+ %1 will be shrunk to %2MiB and a new %3MiB partition will be created for %4. -+ @info, %1 is partition name, %4 is product name -+ - - -- -- <strong>Select a partition to install on</strong> -- @label -- -+ -+ <strong>Select a partition to install on</strong> -+ @label -+ - - -- -- An EFI system partition cannot be found anywhere on this system. Please go back and use manual partitioning to set up %1. -- @info, %1 is product name -- -+ -+ An EFI system partition cannot be found anywhere on this system. Please go back and use manual partitioning to set up %1. -+ @info, %1 is product name -+ - - -- -- The EFI system partition at %1 will be used for starting %2. -- @info, %1 is partition path, %2 is product name -- -+ -+ The EFI system partition at %1 will be used for starting %2. -+ @info, %1 is partition path, %2 is product name -+ - - -- -- EFI system partition: -- @label -- -+ -+ EFI system partition: -+ @label -+ - - -- -- This storage device does not seem to have an operating system on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. -- -+ -+ This storage device does not seem to have an operating system on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. -+ - - -- -- -- -- -- <strong>Erase disk</strong><br/>This will <font color="red">delete</font> all data currently present on the selected storage device. -- -+ -+ -+ -+ -+ <strong>Automatic partitioning</strong><br/>This will <font color="red">delete</font> all data currently present on the selected storage device. -+ - - -- -- -- -- -- <strong>Install alongside</strong><br/>The installer will shrink a partition to make room for %1. -- -+ -+ -+ -+ -+ <strong>Install alongside</strong><br/>The installer will shrink a partition to make room for %1. -+ - - -- -- -- -- -- <strong>Replace a partition</strong><br/>Replaces a partition with %1. -- -+ -+ -+ -+ -+ <strong>Replace a partition</strong><br/>Replaces a partition with %1. -+ - - -- -- This storage device has %1 on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. -- -+ -+ This storage device has %1 on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. -+ - - -- -- This storage device already has an operating system on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. -- -+ -+ This storage device already has an operating system on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. -+ - - -- -- This storage device has multiple operating systems on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. -- -+ -+ This storage device has multiple operating systems on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. -+ - - -- -- This storage device already has an operating system on it, but the partition table <strong>%1</strong> is different from the needed <strong>%2</strong>.<br/> -- -+ -+ This storage device already has an operating system on it, but the partition table <strong>%1</strong> is different from the needed <strong>%2</strong>.<br/> -+ - - -- -- This storage device has one of its partitions <strong>mounted</strong>. -- @info -- -+ -+ This storage device has one of its partitions <strong>mounted</strong>. -+ @info -+ - - -- -- This storage device is a part of an <strong>inactive RAID</strong> device. -- @info -- -+ -+ This storage device is a part of an <strong>inactive RAID</strong> device. -+ @info -+ - - -- -- No swap -- @label -- -+ -+ No swap -+ @label -+ - - -- -- Reuse swap -- @label -- -+ -+ Reuse swap -+ @label -+ - - -- -- Swap (no Hibernate) -- @label -- -+ -+ Swap (no Hibernate) -+ @label -+ - - -- -- Swap (with Hibernate) -- @label -- -+ -+ Swap (with Hibernate) -+ @label -+ - - -- -- Swap to file -- @label -- -+ -+ Swap to file -+ @label -+ - - -- -- <strong>Manual partitioning</strong><br/>You can create or resize partitions yourself. -- -+ -+ <strong>Manual partitioning</strong><br/>You can create or resize partitions yourself. -+ - - -- -- Bootloader location: -- @label -- -+ -+ Bootloader location: -+ @label -+ - -- -- -+ -+ - ClearMountsJob - -- -- Successfully unmounted %1. -- -+ -+ Successfully unmounted %1. -+ - - -- -- Successfully disabled swap %1. -- -+ -+ Successfully disabled swap %1. -+ - - -- -- Successfully cleared swap %1. -- -+ -+ Successfully cleared swap %1. -+ - - -- -- Successfully closed mapper device %1. -- -+ -+ Successfully closed mapper device %1. -+ - - -- -- Successfully disabled volume group %1. -- -+ -+ Successfully disabled volume group %1. -+ - - -- -- Clear mounts for partitioning operations on %1 -- @title -- -+ -+ Clear mounts for partitioning operations on %1 -+ @title -+ - - -- -- Clearing mounts for partitioning operations on %1… -- @status -- -+ -+ Clearing mounts for partitioning operations on %1… -+ @status -+ - - -- -- Cleared all mounts for %1 -- -+ -+ Cleared all mounts for %1 -+ - -- -- -+ -+ - ClearTempMountsJob - -- -- -- Clearing all temporary mounts… -- @status -- -+ -+ -+ Clearing all temporary mounts… -+ @status -+ - - -- -- Cleared all temporary mounts. -- -+ -+ Cleared all temporary mounts. -+ - -- -- -+ -+ - CommandList - -- -- Could not run command. -- -+ -+ Could not run command. -+ - - -- -- The commands use variables that are not defined. Missing variables are: %1. -- -+ -+ The commands use variables that are not defined. Missing variables are: %1. -+ - -- -- -+ -+ - Config - -- -- Setup Failed -- @title -- -+ -+ Setup Failed -+ @title -+ - - -- -- Installation Failed -- @title -- -+ -+ Installation Failed -+ @title -+ - - -- -- The setup of %1 did not complete successfully. -- @info -- -+ -+ The setup of %1 did not complete successfully. -+ @info -+ - - -- -- The installation of %1 did not complete successfully. -- @info -- -+ -+ The installation of %1 did not complete successfully. -+ @info -+ - - -- -- Setup Complete -- @title -- -+ -+ Setup Complete -+ @title -+ - - -- -- Installation Complete -- @title -- -+ -+ Installation Complete -+ @title -+ - - -- -- The setup of %1 is complete. -- @info -- -+ -+ The setup of %1 is complete. -+ @info -+ - - -- -- The installation of %1 is complete. -- @info -- -+ -+ The installation of %1 is complete. -+ @info -+ - - -- -- Keyboard model has been set to %1<br/>. -- @label, %1 is keyboard model, as in Apple Magic Keyboard -- -+ -+ Keyboard model has been set to %1<br/>. -+ @label, %1 is keyboard model, as in Apple Magic Keyboard -+ - - -- -- Keyboard layout has been set to %1/%2. -- @label, %1 is layout, %2 is layout variant -- -+ -+ Keyboard layout has been set to %1/%2. -+ @label, %1 is layout, %2 is layout variant -+ - - -- -- Set timezone to %1/%2 -- @action -- -+ -+ Set timezone to %1/%2 -+ @action -+ - - -- -- The system language will be set to %1. -- @info -- -+ -+ The system language will be set to %1. -+ @info -+ - - -- -- The numbers and dates locale will be set to %1. -- @info -- -+ -+ The numbers and dates locale will be set to %1. -+ @info -+ - - -- -- Network Installation. (Disabled: Incorrect configuration) -- -+ -+ Network Installation. (Disabled: Incorrect configuration) -+ - - -- -- Network Installation. (Disabled: Received invalid groups data) -- -+ -+ Network Installation. (Disabled: Received invalid groups data) -+ - - -- -- Network Installation. (Disabled: Internal error) -- -+ -+ Network Installation. (Disabled: Internal error) -+ - - -- -- Network Installation. (Disabled: Unable to fetch package lists, check your network connection) -- -+ -+ Network Installation. (Disabled: Unable to fetch package lists, check your network connection) -+ - - -- -- Network Installation. (Disabled: No package list) -- -+ -+ Network Installation. (Disabled: No package list) -+ - - -- -- Package selection -- -+ -+ Package selection -+ - - -- -- Package Selection -- -+ -+ Package Selection -+ - - -- -- Please pick a product from the list. The selected product will be installed. -- -+ -+ Please pick a product from the list. The selected product will be installed. -+ - - -- -- Packages -- -+ -+ Packages -+ - - -- -- Install option: <strong>%1</strong> -- -+ -+ Install option: <strong>%1</strong> -+ - - -- -- None -- -+ -+ None -+ - - -- -- Summary -- @label -- -+ -+ Summary -+ @label -+ - - -- -- This is an overview of what will happen once you start the setup procedure. -- -+ -+ This is an overview of what will happen once you start the setup procedure. -+ - - -- -- This is an overview of what will happen once you start the install procedure. -- -+ -+ This is an overview of what will happen once you start the install procedure. -+ - - -- -- Your username is too long. -- -+ -+ Your username is too long. -+ - - -- -- Your username must start with a lowercase letter or underscore. -- -+ -+ Your username must start with a lowercase letter or underscore. -+ - - -- -- Only lowercase letters, numbers, underscore and hyphen are allowed. -- -+ -+ Only lowercase letters, numbers, underscore and hyphen are allowed. -+ - - -- -- '%1' is not allowed as username. -- -+ -+ '%1' is not allowed as username. -+ - - -- -- Your hostname is too short. -- -+ -+ Your hostname is too short. -+ - - -- -- Your hostname is too long. -- -+ -+ Your hostname is too long. -+ - - -- -- '%1' is not allowed as hostname. -- -+ -+ '%1' is not allowed as hostname. -+ - - -- -- Only letters, numbers, underscore and hyphen are allowed. -- -+ -+ Only letters, numbers, underscore and hyphen are allowed. -+ - - -- -- Your passwords do not match! -- -+ -+ Your passwords do not match! -+ - - -- -- OK! -- -+ -+ OK! -+ - - -- -- This computer does not satisfy the minimum requirements for setting up %1.<br/>Setup cannot continue. -- -+ -+ This computer does not satisfy the minimum requirements for setting up %1.<br/>Setup cannot continue. -+ - - -- -- This computer does not satisfy the minimum requirements for installing %1.<br/>Installation cannot continue. -- -+ -+ This computer does not satisfy the minimum requirements for installing %1.<br/>Installation cannot continue. -+ - - -- -- This computer does not satisfy some of the recommended requirements for setting up %1.<br/>Setup can continue, but some features might be disabled. -- -+ -+ This computer does not satisfy some of the recommended requirements for setting up %1.<br/>Setup can continue, but some features might be disabled. -+ - - -- -- This computer does not satisfy some of the recommended requirements for installing %1.<br/>Installation can continue, but some features might be disabled. -- -+ -+ This computer does not satisfy some of the recommended requirements for installing %1.<br/>Installation can continue, but some features might be disabled. -+ - - -- -- This program will ask you some questions and set up %2 on your computer. -- -+ -+ <h1>Welcome to the Calamares setup program for %1</h1> -+ - - -- -- <h1>Welcome to the Calamares setup program for %1</h1> -- -+ -+ <h1>Welcome to %1 setup</h1> -+ - - -- -- <h1>Welcome to %1 setup</h1> -- -+ -+ <h1>Welcome to the Calamares installer for %1</h1> -+ - - -- -- <h1>Welcome to the Calamares installer for %1</h1> -- -+ -+ <h1>Welcome to the %1 installer</h1> -+ - -- -- -- <h1>Welcome to the %1 installer</h1> -- -- -- -- -+ -+ - ContextualProcessJob - -- -- Performing contextual processes' job… -- @status -- -+ -+ Performing contextual processes' job… -+ @status -+ - -- -- -+ -+ - CreatePartitionDialog - -- -- Create a Partition -- -+ -+ Create a Partition -+ - - -- -- Si&ze: -- -+ -+ Si&ze: -+ - - -- -- MiB -- -+ -+ MiB -+ - - -- -- Partition &Type: -- -+ -+ Partition &Type: -+ - - -- -- Primar&y -- -+ -+ Primar&y -+ - - -- -- E&xtended -- -+ -+ E&xtended -+ - - -- -- Fi&le System: -- -+ -+ Fi&le System: -+ - - -- -- LVM LV name -- -+ -+ LVM LV name -+ - - -- -- &Mount Point: -- -+ -+ &Mount Point: -+ - - -- -- Flags: -- -+ -+ Flags: -+ - - -- -- Label for the filesystem -- -+ -+ Label for the filesystem -+ - - -- -- FS Label: -- -+ -+ FS Label: -+ - - -- -- En&crypt -- @action -- -+ -+ En&crypt -+ @action -+ - - -- -- Logical -- @label -- -+ -+ Logical -+ @label -+ - - -- -- Primary -- @label -- -+ -+ Primary -+ @label -+ - - -- -- GPT -- @label -- -+ -+ GPT -+ @label -+ - - -- -- Mountpoint already in use. Please select another one. -- @info -- -+ -+ Mountpoint already in use. Please select another one. -+ @info -+ - - -- -- Mountpoint must start with a <tt>/</tt>. -- @info -- -+ -+ Mountpoint must start with a <tt>/</tt>. -+ @info -+ - -- -- -+ -+ - CreatePartitionJob - -- -- Create new %1MiB partition on %3 (%2) with entries %4 -- @title -- -+ -+ Create new %1MiB partition on %3 (%2) with entries %4 -+ @title -+ - - -- -- Create new %1MiB partition on %3 (%2) -- @title -- -+ -+ Create new %1MiB partition on %3 (%2) -+ @title -+ - - -- -- Create new %2MiB partition on %4 (%3) with file system %1 -- @title -- -+ -+ Create new %2MiB partition on %4 (%3) with file system %1 -+ @title -+ - - -- -- Create new <strong>%1MiB</strong> partition on <strong>%3</strong> (%2) with entries <em>%4</em> -- @info -- -+ -+ Create new <strong>%1MiB</strong> partition on <strong>%3</strong> (%2) with entries <em>%4</em> -+ @info -+ - - -- -- Create new <strong>%1MiB</strong> partition on <strong>%3</strong> (%2) -- @info -- -+ -+ Create new <strong>%1MiB</strong> partition on <strong>%3</strong> (%2) -+ @info -+ - - -- -- Create new <strong>%2MiB</strong> partition on <strong>%4</strong> (%3) with file system <strong>%1</strong> -- @info -- -+ -+ Create new <strong>%2MiB</strong> partition on <strong>%4</strong> (%3) with file system <strong>%1</strong> -+ @info -+ - - -- -- -- Creating new %1 partition on %2… -- @status -- -+ -+ -+ Creating new %1 partition on %2… -+ @status -+ - - -- -- The installer failed to create partition on disk '%1'. -- @info -- -+ -+ The installer failed to create partition on disk '%1'. -+ @info -+ - -- -- -+ -+ - CreatePartitionTableDialog - -- -- Create Partition Table -- -+ -+ Create Partition Table -+ - - -- -- Creating a new partition table will delete all existing data on the disk. -- -+ -+ Creating a new partition table will delete all existing data on the disk. -+ - - -- -- What kind of partition table do you want to create? -- -+ -+ What kind of partition table do you want to create? -+ - - -- -- Master Boot Record (MBR) -- -+ -+ Master Boot Record (MBR) -+ - - -- -- GUID Partition Table (GPT) -- -+ -+ GUID Partition Table (GPT) -+ - -- -- -+ -+ - CreatePartitionTableJob - -- -- -- Creating new %1 partition table on %2… -- @status -- -+ -+ -+ Creating new %1 partition table on %2… -+ @status -+ - - -- -- Creating new <strong>%1</strong> partition table on <strong>%2</strong> (%3)… -- @status -- -+ -+ Creating new <strong>%1</strong> partition table on <strong>%2</strong> (%3)… -+ @status -+ - - -- -- The installer failed to create a partition table on %1. -- -+ -+ The installer failed to create a partition table on %1. -+ - -- -- -+ -+ - CreateUserJob - -- -- Create user %1 -- -+ -+ Create user %1 -+ - - -- -- Create user <strong>%1</strong> -- -+ -+ Create user <strong>%1</strong> -+ - - -- -- -- Creating user %1… -- @status -- -+ -+ -+ Creating user %1… -+ @status -+ - - -- -- Preserving home directory… -- @status -- -+ -+ Preserving home directory… -+ @status -+ - - -- -- Configuring user %1 -- @status -- -+ -+ Configuring user %1 -+ @status -+ - - -- -- Setting file permissions… -- @status -- -+ -+ Setting file permissions… -+ @status -+ - -- -- -+ -+ - CreateVolumeGroupDialog - -- -- Create Volume Group -- @title -- -+ -+ Create Volume Group -+ @title -+ - -- -- -+ -+ - CreateVolumeGroupJob - -- -- -- Creating new volume group named %1… -- @status -- -+ -+ -+ Creating new volume group named %1… -+ @status -+ - - -- -- Creating new volume group named <strong>%1</strong>… -- @status -- -+ -+ Creating new volume group named <strong>%1</strong>… -+ @status -+ - - -- -- The installer failed to create a volume group named '%1'. -- -+ -+ The installer failed to create a volume group named '%1'. -+ - -- -- -+ -+ - DeactivateVolumeGroupJob - -- -- -- Deactivating volume group named %1… -- @status -- -+ -+ -+ Deactivating volume group named %1… -+ @status -+ - - -- -- Deactivating volume group named <strong>%1</strong>… -- @status -- -+ -+ Deactivating volume group named <strong>%1</strong>… -+ @status -+ - - -- -- The installer failed to deactivate a volume group named %1. -- -+ -+ The installer failed to deactivate a volume group named %1. -+ - -- -- -+ -+ - DeletePartitionJob - -- -- -- Deleting partition %1… -- @status -- -+ -+ -+ Deleting partition %1… -+ @status -+ - - -- -- Deleting partition <strong>%1</strong>… -- @status -- -+ -+ Deleting partition <strong>%1</strong>… -+ @status -+ - - -- -- The installer failed to delete partition %1. -- -+ -+ The installer failed to delete partition %1. -+ - -- -- -+ -+ - DeviceInfoWidget - -- -- <br><br>This partition table type is only advisable on older systems which start from a <strong>BIOS</strong> boot environment. GPT is recommended in most other cases.<br><br><strong>Warning:</strong> the MBR partition table is an obsolete MS-DOS era standard.<br>Only 4 <em>primary</em> partitions may be created, and of those 4, one can be an <em>extended</em> partition, which may in turn contain many <em>logical</em> partitions. -- -+ -+ <br><br>This partition table type is only advisable on older systems which start from a <strong>BIOS</strong> boot environment. GPT is recommended in most other cases.<br><br><strong>Warning:</strong> the MBR partition table is an obsolete MS-DOS era standard.<br>Only 4 <em>primary</em> partitions may be created, and of those 4, one can be an <em>extended</em> partition, which may in turn contain many <em>logical</em> partitions. -+ - - -- -- <br><br>This is the recommended partition table type for modern systems which start from an <strong>EFI</strong> boot environment. -- -+ -+ <br><br>This is the recommended partition table type for modern systems which start from an <strong>EFI</strong> boot environment. -+ - - -- -- This is a <strong>loop</strong> device.<br><br>It is a pseudo-device with no partition table that makes a file accessible as a block device. This kind of setup usually only contains a single filesystem. -- -+ -+ This is a <strong>loop</strong> device.<br><br>It is a pseudo-device with no partition table that makes a file accessible as a block device. This kind of setup usually only contains a single filesystem. -+ - - -- -- This installer <strong>cannot detect a partition table</strong> on the selected storage device.<br><br>The device either has no partition table, or the partition table is corrupted or of an unknown type.<br>This installer can create a new partition table for you, either automatically, or through the manual partitioning page. -- -+ -+ This installer <strong>cannot detect a partition table</strong> on the selected storage device.<br><br>The device either has no partition table, or the partition table is corrupted or of an unknown type.<br>This installer can create a new partition table for you, either automatically, or through the manual partitioning page. -+ - - -- -- This device has a <strong>%1</strong> partition table. -- -+ -+ This device has a <strong>%1</strong> partition table. -+ - - -- -- The type of <strong>partition table</strong> on the selected storage device.<br><br>The only way to change the partition table type is to erase and recreate the partition table from scratch, which destroys all data on the storage device.<br>This installer will keep the current partition table unless you explicitly choose otherwise.<br>If unsure, on modern systems GPT is preferred. -- -+ -+ The type of <strong>partition table</strong> on the selected storage device.<br><br>The only way to change the partition table type is to erase and recreate the partition table from scratch, which destroys all data on the storage device.<br>This installer will keep the current partition table unless you explicitly choose otherwise.<br>If unsure, on modern systems GPT is preferred. -+ - -- -- -+ -+ - DeviceModel - -- -- %1 - %2 (%3) -- device[name] - size[number] (device-node[name]) -- -+ -+ %1 - %2 (%3) -+ device[name] - size[number] (device-node[name]) -+ - - -- -- %1 - (%2) -- device[name] - (device-node[name]) -- -+ -+ %1 - (%2) -+ device[name] - (device-node[name]) -+ - -- -- -+ -+ - DracutLuksCfgJob - -- -- Writing LUKS configuration for Dracut to %1… -- @status -- -+ -+ Writing LUKS configuration for Dracut to %1… -+ @status -+ - - -- -- Skipping writing LUKS configuration for Dracut: "/" partition is not encrypted -- @info -- -+ -+ Skipping writing LUKS configuration for Dracut: "/" partition is not encrypted -+ @info -+ - - -- -- Failed to open %1 -- @error -- -+ -+ Failed to open %1 -+ @error -+ - -- -- -+ -+ - DummyCppJob - -- -- Performing dummy C++ job… -- @status -- -+ -+ Performing dummy C++ job… -+ @status -+ - -- -- -+ -+ - EditExistingPartitionDialog - -- -- Edit Existing Partition -- -+ -+ Edit Existing Partition -+ - - -- -- Con&tent: -- -+ -+ Con&tent: -+ - - -- -- &Keep -- -+ -+ &Keep -+ - - -- -- Format -- -+ -+ Format -+ - - -- -- Warning: Formatting the partition will erase all existing data. -- -+ -+ Warning: Formatting the partition will erase all existing data. -+ - - -- -- &Mount Point: -- -+ -+ &Mount Point: -+ - - -- -- Si&ze: -- -+ -+ Si&ze: -+ - - -- -- MiB -- -+ -+ MiB -+ - - -- -- Fi&le System: -- -+ -+ Fi&le System: -+ - - -- -- Flags: -- -+ -+ Flags: -+ - - -- -- Label for the filesystem -- -+ -+ Label for the filesystem -+ - - -- -- FS Label: -- -+ -+ FS Label: -+ - - -- -- Passphrase for existing partition -- -+ -+ Passphrase for existing partition -+ - - -- -- Partition %1 could not be decrypted with the given passphrase.<br/><br/>Edit the partition again and give the correct passphrase or delete and create a new encrypted partition. -- -+ -+ Partition %1 could not be decrypted with the given passphrase.<br/><br/>Edit the partition again and give the correct passphrase or delete and create a new encrypted partition. -+ - -- -- -+ -+ - EncryptWidget - -- -- En&crypt system -- -+ -+ En&crypt system -+ - - -- -- Your system does not seem to support encryption well enough to encrypt the entire system. You may enable encryption, but performance may suffer. -- -+ -+ Your system does not seem to support encryption well enough to encrypt the entire system. You may enable encryption, but performance may suffer. -+ - - -- -- Passphrase -- -+ -+ Passphrase -+ - - -- -- Confirm passphrase -- -+ -+ Confirm passphrase -+ - - -- -- -- Please enter the same passphrase in both boxes. -- @tooltip -- -+ -+ -+ Please enter the same passphrase in both boxes. -+ @tooltip -+ - - -- -- Password must be a minimum of %1 characters. -- @tooltip -- -+ -+ Password must be a minimum of %1 characters. -+ @tooltip -+ - -- -- -+ -+ - ErrorDialog - -- -- Details: -- -+ -+ Details: -+ - - -- -- Would you like to paste the install log to the web? -- -+ -+ Would you like to paste the install log to the web? -+ - -- -- -+ -+ - FillGlobalStorageJob - -- -- Set partition information -- @title -- -+ -+ Set partition information -+ @title -+ - - -- -- Install %1 on <strong>new</strong> %2 system partition with features <em>%3</em> -- @info -- -+ -+ Install %1 on <strong>new</strong> %2 system partition with features <em>%3</em> -+ @info -+ - - -- -- Install %1 on <strong>new</strong> %2 system partition -- @info -- -+ -+ Install %1 on <strong>new</strong> %2 system partition -+ @info -+ - - -- -- Set up <strong>new</strong> %2 partition with mount point <strong>%1</strong> and features <em>%3</em> -- @info -- -+ -+ Set up <strong>new</strong> %2 partition with mount point <strong>%1</strong> and features <em>%3</em> -+ @info -+ - - -- -- Set up <strong>new</strong> %2 partition with mount point <strong>%1</strong>%3 -- @info -- -+ -+ Set up <strong>new</strong> %2 partition with mount point <strong>%1</strong>%3 -+ @info -+ - - -- -- Install %2 on %3 system partition <strong>%1</strong> with features <em>%4</em> -- @info -- -+ -+ Install %2 on %3 system partition <strong>%1</strong> with features <em>%4</em> -+ @info -+ - - -- -- Install %2 on %3 system partition <strong>%1</strong> -- @info -- -+ -+ Install %2 on %3 system partition <strong>%1</strong> -+ @info -+ - - -- -- Set up %3 partition <strong>%1</strong> with mount point <strong>%2</strong> and features <em>%4</em> -- @info -- -+ -+ Set up %3 partition <strong>%1</strong> with mount point <strong>%2</strong> and features <em>%4</em> -+ @info -+ - - -- -- Set up %3 partition <strong>%1</strong> with mount point <strong>%2</strong>%4… -- @info -- -+ -+ Set up %3 partition <strong>%1</strong> with mount point <strong>%2</strong>%4… -+ @info -+ - - -- -- Install boot loader on <strong>%1</strong>… -- @info -- -+ -+ Install boot loader on <strong>%1</strong>… -+ @info -+ - - -- -- Setting up mount points… -- @status -- -+ -+ Setting up mount points… -+ @status -+ - -- -- -+ -+ - FinishedPage - -- -- &Restart now -- -+ -+ &Restart now -+ - - -- -- <h1>All done.</h1><br/>%1 has been set up on your computer.<br/>You may now start using your new system. -- @info -- -+ -+ <h1>All done.</h1><br/>%1 has been set up on your computer.<br/>You may now start using your new system. -+ @info -+ - - -- -- <html><head/><body><p>When this box is checked, your system will restart immediately when you click on <span style="font-style:italic;">Done</span> or close the setup program.</p></body></html> -- @tooltip -- -+ -+ <html><head/><body><p>When this box is checked, your system will restart immediately when you click on <span style="font-style:italic;">Done</span> or close the setup program.</p></body></html> -+ @tooltip -+ - - -- -- <h1>All done.</h1><br/>%1 has been installed on your computer.<br/>You may now restart into your new system, or continue using the %2 Live environment. -- @info -- -+ -+ <h1>All done.</h1><br/>%1 has been installed on your computer.<br/>You may now restart into your new system, or continue using the %2 Live environment. -+ @info -+ - - -- -- <html><head/><body><p>When this box is checked, your system will restart immediately when you click on <span style="font-style:italic;">Done</span> or close the installer.</p></body></html> -- @tooltip -- -+ -+ <html><head/><body><p>When this box is checked, your system will restart immediately when you click on <span style="font-style:italic;">Done</span> or close the installer.</p></body></html> -+ @tooltip -+ - - -- -- <h1>Setup Failed</h1><br/>%1 has not been set up on your computer.<br/>The error message was: %2. -- @info, %1 is product name with version -- -+ -+ <h1>Setup Failed</h1><br/>%1 has not been set up on your computer.<br/>The error message was: %2. -+ @info, %1 is product name with version -+ - - -- -- <h1>Installation Failed</h1><br/>%1 has not been installed on your computer.<br/>The error message was: %2. -- @info, %1 is product name with version -- -+ -+ <h1>Installation Failed</h1><br/>%1 has not been installed on your computer.<br/>The error message was: %2. -+ @info, %1 is product name with version -+ - -- -- -+ -+ - FinishedQmlViewStep - -- -- Finish -- @label -- -+ -+ Finish -+ @label -+ - -- -- -+ -+ - FinishedViewStep - -- -- Finish -- @label -- -+ -+ Finish -+ @label -+ - -- -- -+ -+ - FormatPartitionJob - -- -- Format partition %1 (file system: %2, size: %3 MiB) on %4 -- @title -- -+ -+ Format partition %1 (file system: %2, size: %3 MiB) on %4 -+ @title -+ - - -- -- Format <strong>%3MiB</strong> partition <strong>%1</strong> with file system <strong>%2</strong> -- @info -- -+ -+ Format <strong>%3MiB</strong> partition <strong>%1</strong> with file system <strong>%2</strong> -+ @info -+ - - -- -- %1 (%2) -- partition label %1 (device path %2) -- -+ -+ %1 (%2) -+ partition label %1 (device path %2) -+ - - -- -- Formatting partition %1 with file system %2… -- @status -- -+ -+ Formatting partition %1 with file system %2… -+ @status -+ - - -- -- The installer failed to format partition %1 on disk '%2'. -- -+ -+ The installer failed to format partition %1 on disk '%2'. -+ - -- -- -+ -+ - GeneralRequirements - -- -- Please ensure the system has at least %1 GiB available drive space. -- -+ -+ Please ensure the system has at least %1 GiB available drive space. -+ - - -- -- Available drive space is all of the hard disks and SSDs connected to the system. -- -+ -+ Available drive space is all of the hard disks and SSDs connected to the system. -+ - - -- -- There is not enough drive space. At least %1 GiB is required. -- -+ -+ There is not enough drive space. At least %1 GiB is required. -+ - - -- -- has at least %1 GiB working memory -- -+ -+ has at least %1 GiB working memory -+ - - -- -- The system does not have enough working memory. At least %1 GiB is required. -- -+ -+ The system does not have enough working memory. At least %1 GiB is required. -+ - - -- -- is plugged in to a power source -- -+ -+ is plugged in to a power source -+ - - -- -- The system is not plugged in to a power source. -- -+ -+ The system is not plugged in to a power source. -+ - - -- -- is connected to the Internet -- -+ -+ is connected to the Internet -+ - - -- -- The system is not connected to the Internet. -- -+ -+ The system is not connected to the Internet. -+ - - -- -- is running the installer as an administrator (root) -- -+ -+ is running the installer as an administrator (root) -+ - - -- -- The setup program is not running with administrator rights. -- -+ -+ The setup program is not running with administrator rights. -+ - - -- -- The installer is not running with administrator rights. -- -+ -+ The installer is not running with administrator rights. -+ - - -- -- has a screen large enough to show the whole installer -- -+ -+ has a screen large enough to show the whole installer -+ - - -- -- The screen is too small to display the setup program. -- -+ -+ The screen is too small to display the setup program. -+ - - -- -- The screen is too small to display the installer. -- -+ -+ The screen is too small to display the installer. -+ - - -- -- is always false -- -+ -+ is always false -+ - - -- -- The computer says no. -- -+ -+ The computer says no. -+ - - -- -- is always false (slowly) -- -+ -+ is always false (slowly) -+ - - -- -- The computer says no (slowly). -- -+ -+ The computer says no (slowly). -+ - - -- -- is always true -- -+ -+ is always true -+ - - -- -- The computer says yes. -- -+ -+ The computer says yes. -+ - - -- -- is always true (slowly) -- -+ -+ is always true (slowly) -+ - - -- -- The computer says yes (slowly). -- -+ -+ The computer says yes (slowly). -+ - - -- -- is checked three times. -- -+ -+ is checked three times. -+ - - -- -- The snark has not been checked three times. -- The (some mythological beast) has not been checked three times. -- -+ -+ The snark has not been checked three times. -+ The (some mythological beast) has not been checked three times. -+ - -- -- -+ -+ - HostInfoJob - -- -- Collecting information about your machine… -- @status -- -+ -+ Collecting information about your machine… -+ @status -+ - -- -- -+ -+ - IDJob - -- -- -- -- -- OEM Batch Identifier -- -+ -+ -+ -+ -+ OEM Batch Identifier -+ - - -- -- Could not create directories <code>%1</code>. -- -+ -+ Could not create directories <code>%1</code>. -+ - - -- -- Could not open file <code>%1</code>. -- -+ -+ Could not open file <code>%1</code>. -+ - - -- -- Could not write to file <code>%1</code>. -- -+ -+ Could not write to file <code>%1</code>. -+ - -- -- -+ -+ - InitcpioJob - -- -- Creating initramfs with mkinitcpio… -- @status -- -+ -+ Creating initramfs with mkinitcpio… -+ @status -+ - -- -- -+ -+ - InitramfsJob - -- -- Creating initramfs… -- @status -- -+ -+ Creating initramfs… -+ @status -+ - -- -- -+ -+ - InteractiveTerminalPage - -- -- Konsole not installed. -- @error -- -+ -+ Konsole not installed. -+ @error -+ - - -- -- Please install KDE Konsole and try again! -- @info -- -+ -+ Please install KDE Konsole and try again! -+ @info -+ - - -- -- Executing script: &nbsp;<code>%1</code> -- @info -- -+ -+ Executing script: &nbsp;<code>%1</code> -+ @info -+ - -- -- -+ -+ - InteractiveTerminalViewStep - -- -- Script -- @label -- -+ -+ Script -+ @label -+ - -- -- -+ -+ - KeyboardQmlViewStep - -- -- Keyboard -- @label -- -+ -+ Keyboard -+ @label -+ - -- -- -+ -+ - KeyboardViewStep - -- -- Keyboard -- @label -- -+ -+ Keyboard -+ @label -+ - -- -- -+ -+ - LCLocaleDialog - -- -- System Locale Setting -- @title -- -+ -+ System Locale Setting -+ @title -+ - - -- -- The system locale setting affects the language and character set for some command line user interface elements.<br/>The current setting is <strong>%1</strong>. -- @info -- -+ -+ The system locale setting affects the language and character set for some command line user interface elements.<br/>The current setting is <strong>%1</strong>. -+ @info -+ - - -- -- &Cancel -- @button -- -+ -+ &Cancel -+ @button -+ - - -- -- &OK -- @button -- -+ -+ &OK -+ @button -+ - -- -- -+ -+ - LOSHJob - -- -- Configuring encrypted swap. -- -+ -+ Configuring encrypted swap. -+ - - -- -- No target system available. -- -+ -+ No target system available. -+ - - -- -- No rootMountPoint is set. -- -+ -+ No rootMountPoint is set. -+ - - -- -- No configFilePath is set. -- -+ -+ No configFilePath is set. -+ - -- -- -+ -+ - LicensePage - -- -- <h1>License Agreement</h1> -- -+ -+ <h1>License Agreement</h1> -+ - - -- -- I accept the terms and conditions above. -- @info -- -+ -+ I accept the terms and conditions above. -+ @info -+ - - -- -- Please review the End User License Agreements (EULAs). -- @info -- -+ -+ Please review the End User License Agreements (EULAs). -+ @info -+ - - -- -- This setup procedure will install proprietary software that is subject to licensing terms. -- @info -- -+ -+ This setup procedure will install proprietary software that is subject to licensing terms. -+ @info -+ - - -- -- If you do not agree with the terms, the setup procedure cannot continue. -- @info -- -+ -+ If you do not agree with the terms, the setup procedure cannot continue. -+ @info -+ - - -- -- This setup procedure can install proprietary software that is subject to licensing terms in order to provide additional features and enhance the user experience. -- @info -- -+ -+ This setup procedure can install proprietary software that is subject to licensing terms in order to provide additional features and enhance the user experience. -+ @info -+ - - -- -- If you do not agree with the terms, proprietary software will not be installed, and open source alternatives will be used instead. -- @info -- -+ -+ If you do not agree with the terms, proprietary software will not be installed, and open source alternatives will be used instead. -+ @info -+ - -- -- -+ -+ - LicenseViewStep - -- -- License -- @label -- -+ -+ License -+ @label -+ - -- -- -+ -+ - LicenseWidget - -- -- URL: %1 -- @label -- -+ -+ URL: %1 -+ @label -+ - - -- -- <strong>%1 driver</strong><br/>by %2 -- @label, %1 is product name, %2 is product vendor -- %1 is an untranslatable product name, example: Creative Audigy driver -- -+ -+ <strong>%1 driver</strong><br/>by %2 -+ @label, %1 is product name, %2 is product vendor -+ %1 is an untranslatable product name, example: Creative Audigy driver -+ - - -- -- <strong>%1 graphics driver</strong><br/><font color="Grey">by %2</font> -- @label, %1 is product name, %2 is product vendor -- %1 is usually a vendor name, example: Nvidia graphics driver -- -+ -+ <strong>%1 graphics driver</strong><br/><font color="Grey">by %2</font> -+ @label, %1 is product name, %2 is product vendor -+ %1 is usually a vendor name, example: Nvidia graphics driver -+ - - -- -- <strong>%1 browser plugin</strong><br/><font color="Grey">by %2</font> -- @label, %1 is product name, %2 is product vendor -- -+ -+ <strong>%1 browser plugin</strong><br/><font color="Grey">by %2</font> -+ @label, %1 is product name, %2 is product vendor -+ - - -- -- <strong>%1 codec</strong><br/><font color="Grey">by %2</font> -- @label, %1 is product name, %2 is product vendor -- -+ -+ <strong>%1 codec</strong><br/><font color="Grey">by %2</font> -+ @label, %1 is product name, %2 is product vendor -+ - - -- -- <strong>%1 package</strong><br/><font color="Grey">by %2</font> -- @label, %1 is product name, %2 is product vendor -- -+ -+ <strong>%1 package</strong><br/><font color="Grey">by %2</font> -+ @label, %1 is product name, %2 is product vendor -+ - - -- -- <strong>%1</strong><br/><font color="Grey">by %2</font> -- @label, %1 is product name, %2 is product vendor -- -+ -+ <strong>%1</strong><br/><font color="Grey">by %2</font> -+ @label, %1 is product name, %2 is product vendor -+ - - -- -- File: %1 -- @label -- -+ -+ File: %1 -+ @label -+ - - -- -- Hide the license text -- @tooltip -- -+ -+ Hide the license text -+ @tooltip -+ - - -- -- Show the license text -- @tooltip -- -+ -+ Show the license text -+ @tooltip -+ - - -- -- Open the license agreement in browser -- @tooltip -- -+ -+ Open the license agreement in browser -+ @tooltip -+ - -- -- -+ -+ - LocalePage - -- -- Region: -- @label -- -+ -+ Region: -+ @label -+ - - -- -- Zone: -- @label -- -+ -+ Zone: -+ @label -+ - - -- -- -- &Change… -- @button -- -+ -+ -+ &Change… -+ @button -+ - -- -- -+ -+ - LocaleQmlViewStep - -- -- Location -- @label -- -+ -+ Location -+ @label -+ - -- -- -+ -+ - LocaleTests - -- -- Quit -- -+ -+ Quit -+ - -- -- -+ -+ - LocaleViewStep - -- -- Location -- @label -- -+ -+ Location -+ @label -+ - -- -- -+ -+ - LuksBootKeyFileJob - -- -- Configuring LUKS key file. -- -+ -+ Configuring LUKS key file. -+ - - -- -- -- No partitions are defined. -- -+ -+ -+ No partitions are defined. -+ - - -- -- -- Encrypted rootfs setup error -- -+ -+ -+ Encrypted rootfs setup error -+ - - -- -- Root partition %1 is LUKS but no passphrase has been set. -- -+ -+ Root partition %1 is LUKS but no passphrase has been set. -+ - - -- -- Could not create LUKS key file for root partition %1. -- -+ -+ Could not create LUKS key file for root partition %1. -+ - -- -- -+ -+ - MachineIdJob - -- -- Generate machine-id. -- -+ -+ Generate machine-id. -+ - - -- -- Configuration Error -- -+ -+ Configuration Error -+ - - -- -- No root mount point is set for MachineId. -- -+ -+ No root mount point is set for MachineId. -+ - - -- -- -- -- -- File not found -- -+ -+ -+ -+ -+ File not found -+ - - -- -- Path <pre>%1</pre> must be an absolute path. -- -+ -+ Path <pre>%1</pre> must be an absolute path. -+ - - -- -- Could not create new random file <pre>%1</pre>. -- -+ -+ Could not create new random file <pre>%1</pre>. -+ - -- -- -+ -+ - Map - -- -- Timezone: %1 -- @label -- -+ -+ Timezone: %1 -+ @label -+ - - -- -- Please select your preferred location on the map so the installer can suggest the locale -+ -+ Please select your preferred location on the map so the installer can suggest the locale - and timezone settings for you. You can fine-tune the suggested settings below. Search the map by dragging - to move and using the +/- buttons to zoom in/out or use mouse scrolling for zooming. -- @info -- -+ @info -+ - -- -- -+ -+ - Map-qt6 - -- -- Timezone: %1 -- @label -- -+ -+ Timezone: %1 -+ @label -+ - - -- -- Please select your preferred location on the map so the installer can suggest the locale -+ -+ Please select your preferred location on the map so the installer can suggest the locale - and timezone settings for you. You can fine-tune the suggested settings below. Search the map by dragging - to move and using the +/- buttons to zoom in/out or use mouse scrolling for zooming. -- @label -- -+ @label -+ - -- -- -+ -+ - NetInstallViewStep - -- -- Package selection -- -+ -+ Package selection -+ - - -- -- Office software -- -+ -+ Office software -+ - - -- -- Office package -- -+ -+ Office package -+ - - -- -- Browser software -- -+ -+ Browser software -+ - - -- -- Browser package -- -+ -+ Browser package -+ - - -- -- Web browser -- -+ -+ Web browser -+ - - -- -- Kernel -- label for netinstall module, Linux kernel -- -+ -+ Kernel -+ label for netinstall module, Linux kernel -+ - - -- -- Services -- label for netinstall module, system services -- -+ -+ Services -+ label for netinstall module, system services -+ - - -- -- Login -- label for netinstall module, choose login manager -- -+ -+ Login -+ label for netinstall module, choose login manager -+ - - -- -- Desktop -- label for netinstall module, choose desktop environment -- -+ -+ Desktop -+ label for netinstall module, choose desktop environment -+ - - -- -- Applications -- -+ -+ Applications -+ - - -- -- Communication -- label for netinstall module -- -+ -+ Communication -+ label for netinstall module -+ - - -- -- Development -- label for netinstall module -- -+ -+ Development -+ label for netinstall module -+ - - -- -- Office -- label for netinstall module -- -+ -+ Office -+ label for netinstall module -+ - - -- -- Multimedia -- label for netinstall module -- -+ -+ Multimedia -+ label for netinstall module -+ - - -- -- Internet -- label for netinstall module -- -+ -+ Internet -+ label for netinstall module -+ - - -- -- Theming -- label for netinstall module -- -+ -+ Theming -+ label for netinstall module -+ - - -- -- Gaming -- label for netinstall module -- -+ -+ Gaming -+ label for netinstall module -+ - - -- -- Utilities -- label for netinstall module -- -+ -+ Utilities -+ label for netinstall module -+ - -- -- -+ -+ - NotesQmlViewStep - -- -- Notes -- -+ -+ Notes -+ - -- -- -+ -+ - OEMPage - -- -- Ba&tch: -- -+ -+ Ba&tch: -+ - - -- -- <html><head/><body><p>Enter a batch-identifier here. This will be stored in the target system.</p></body></html> -- -+ -+ <html><head/><body><p>Enter a batch-identifier here. This will be stored in the target system.</p></body></html> -+ - - -- -- <html><head/><body><h1>OEM Configuration</h1><p>Calamares will use OEM settings while configuring the target system.</p></body></html> -- -+ -+ <html><head/><body><h1>OEM Configuration</h1><p>Calamares will use OEM settings while configuring the target system.</p></body></html> -+ - -- -- -+ -+ - OEMViewStep - -- -- OEM Configuration -- -+ -+ OEM Configuration -+ - - -- -- Set the OEM Batch Identifier to <code>%1</code>. -- -+ -+ Set the OEM Batch Identifier to <code>%1</code>. -+ - -- -- -+ -+ - Offline - -- -- Select your preferred region, or use the default settings -- @label -- -+ -+ Select your preferred region, or use the default settings -+ @label -+ - - -- -- -- -- Timezone: %1 -- @label -- -+ -+ -+ -+ Timezone: %1 -+ @label -+ - - -- -- Select your preferred zone within your region -- @label -- -+ -+ Select your preferred zone within your region -+ @label -+ - - -- -- Zones -- @button -- -+ -+ Zones -+ @button -+ - - -- -- You can fine-tune language and locale settings below -- @label -- -+ -+ You can fine-tune language and locale settings below -+ @label -+ - -- -- -+ -+ - Offline-qt6 - -- -- Select your preferred region, or use the default settings -- @label -- -+ -+ Select your preferred region, or use the default settings -+ @label -+ - - -- -- -- -- Timezone: %1 -- @label -- -+ -+ -+ -+ Timezone: %1 -+ @label -+ - - -- -- Select your preferred zone within your region -- @label -- -+ -+ Select your preferred zone within your region -+ @label -+ - - -- -- Zones -- @button -- -+ -+ Zones -+ @button -+ - - -- -- You can fine-tune language and locale settings below -- @label -- -+ -+ You can fine-tune language and locale settings below -+ @label -+ - -- -- -+ -+ - PWQ - -- -- Password is too short -- -+ -+ Password is too short -+ - - -- -- Password is too long -- -+ -+ Password is too long -+ - - -- -- Password is too weak -- -+ -+ Password is too weak -+ - - -- -- Memory allocation error when setting '%1' -- -+ -+ Memory allocation error when setting '%1' -+ - - -- -- Memory allocation error -- -+ -+ Memory allocation error -+ - - -- -- The password is the same as the old one -- -+ -+ The password is the same as the old one -+ - - -- -- The password is a palindrome -- -+ -+ The password is a palindrome -+ - - -- -- The password differs with case changes only -- -+ -+ The password differs with case changes only -+ - - -- -- The password is too similar to the old one -- -+ -+ The password is too similar to the old one -+ - - -- -- The password contains the user name in some form -- -+ -+ The password contains the user name in some form -+ - - -- -- The password contains words from the real name of the user in some form -- -+ -+ The password contains words from the real name of the user in some form -+ - - -- -- The password contains forbidden words in some form -- -+ -+ The password contains forbidden words in some form -+ - - -- -- The password contains fewer than %n digits -- -- -- -+ -+ The password contains fewer than %n digits -+ -+ -+ - - -- -- The password contains too few digits -- -+ -+ The password contains too few digits -+ - - -- -- The password contains fewer than %n uppercase letters -- -- -- -+ -+ The password contains fewer than %n uppercase letters -+ -+ -+ - - -- -- The password contains too few uppercase letters -- -+ -+ The password contains too few uppercase letters -+ - - -- -- The password contains fewer than %n lowercase letters -- -- -- -+ -+ The password contains fewer than %n lowercase letters -+ -+ -+ - - -- -- The password contains too few lowercase letters -- -+ -+ The password contains too few lowercase letters -+ - - -- -- The password contains fewer than %n non-alphanumeric characters -- -- -- -+ -+ The password contains fewer than %n non-alphanumeric characters -+ -+ -+ - - -- -- The password contains too few non-alphanumeric characters -- -+ -+ The password contains too few non-alphanumeric characters -+ - - -- -- The password is shorter than %n characters -- -- -- -+ -+ The password is shorter than %n characters -+ -+ -+ - - -- -- The password is too short -- -+ -+ The password is too short -+ - - -- -- The password is a rotated version of the previous one -- -+ -+ The password is a rotated version of the previous one -+ - - -- -- The password contains fewer than %n character classes -- -- -- -+ -+ The password contains fewer than %n character classes -+ -+ -+ - - -- -- The password does not contain enough character classes -- -+ -+ The password does not contain enough character classes -+ - - -- -- The password contains more than %n same characters consecutively -- -- -- -+ -+ The password contains more than %n same characters consecutively -+ -+ -+ - - -- -- The password contains too many same characters consecutively -- -+ -+ The password contains too many same characters consecutively -+ - - -- -- The password contains more than %n characters of the same class consecutively -- -- -- -+ -+ The password contains more than %n characters of the same class consecutively -+ -+ -+ - - -- -- The password contains too many characters of the same class consecutively -- -+ -+ The password contains too many characters of the same class consecutively -+ - - -- -- The password contains monotonic sequence longer than %n characters -- -- -- -+ -+ The password contains monotonic sequence longer than %n characters -+ -+ -+ - - -- -- The password contains too long of a monotonic character sequence -- -+ -+ The password contains too long of a monotonic character sequence -+ - - -- -- No password supplied -- -+ -+ No password supplied -+ - - -- -- Cannot obtain random numbers from the RNG device -- -+ -+ Cannot obtain random numbers from the RNG device -+ - - -- -- Password generation failed - required entropy too low for settings -- -+ -+ Password generation failed - required entropy too low for settings -+ - - -- -- The password fails the dictionary check - %1 -- -+ -+ The password fails the dictionary check - %1 -+ - - -- -- The password fails the dictionary check -- -+ -+ The password fails the dictionary check -+ - - -- -- Unknown setting - %1 -- -+ -+ Unknown setting - %1 -+ - - -- -- Unknown setting -- -+ -+ Unknown setting -+ - - -- -- Bad integer value of setting - %1 -- -+ -+ Bad integer value of setting - %1 -+ - - -- -- Bad integer value -- -+ -+ Bad integer value -+ - - -- -- Setting %1 is not of integer type -- -+ -+ Setting %1 is not of integer type -+ - - -- -- Setting is not of integer type -- -+ -+ Setting is not of integer type -+ - - -- -- Setting %1 is not of string type -- -+ -+ Setting %1 is not of string type -+ - - -- -- Setting is not of string type -- -+ -+ Setting is not of string type -+ - - -- -- Opening the configuration file failed -- -+ -+ Opening the configuration file failed -+ - - -- -- The configuration file is malformed -- -+ -+ The configuration file is malformed -+ - - -- -- Fatal failure -- -+ -+ Fatal failure -+ - - -- -- Unknown error -- -+ -+ Unknown error -+ - -- -- -+ -+ - PackageChooserPage - -- -- Product Name -- -+ -+ Product Name -+ - - -- -- TextLabel -- -+ -+ TextLabel -+ - - -- -- Long Product Description -- -+ -+ Long Product Description -+ - - -- -- Package Selection -- -+ -+ Package Selection -+ - - -- -- Please pick a product from the list. The selected product will be installed. -- -+ -+ Please pick a product from the list. The selected product will be installed. -+ - -- -- -+ -+ - PackageModel - -- -- Name -- -+ -+ Name -+ - - -- -- Description -- -+ -+ Description -+ - -- -- -+ -+ - Page_Keyboard - -- -- Keyboard model: -- -+ -+ Keyboard model: -+ - - -- -- Type here to test your keyboard -- -+ -+ Type here to test your keyboard -+ - - -- -- Switch Keyboard: -- shortcut for switching between keyboard layouts -- -+ -+ Switch Keyboard: -+ shortcut for switching between keyboard layouts -+ - -- -- -+ -+ - Page_UserSetup - -- -- What is your name? -- -+ -+ What is your name? -+ -+ -+ -+ -+ -+ Your Full Name -+ -+ -+ -+ -+ What name do you want to use to log in? -+ -+ -+ -+ -+ -+ login -+ -+ -+ -+ -+ What is the name of this computer? -+ -+ -+ -+ -+ -+ <small>This name will be used if you make the computer visible to others on a network.</small> -+ -+ -+ -+ -+ -+ Computer Name -+ -+ -+ -+ -+ -+ Choose a password to keep your account safe. -+ -+ -+ -+ -+ -+ -+ -+ <small>Enter the same password twice, so that it can be checked for typing errors. A good password will contain a mixture of letters, numbers and punctuation, should be at least eight characters long, and should be changed at regular intervals.</small> -+ -+ -+ -+ -+ -+ -+ -+ Password -+ - - -- -- Your Full Name -- -+ -+ -+ -+ -+ Repeat Password -+ - - -- -- What name do you want to use to log in? -- -+ -+ -+ When this box is checked, password-strength checking is done and you will not be able to use a weak password. -+ - - -- -- login -- -+ -+ -+ Require strong passwords. -+ - - -- -- What is the name of this computer? -- -+ -+ -+ Log in automatically without asking for the password. -+ - - -- -- <small>This name will be used if you make the computer visible to others on a network.</small> -- -+ -+ Use the same password for the administrator account. -+ - - -- -- Computer Name -- -+ -+ -+ Choose a password for the administrator account. -+ - - -- -- Choose a password to keep your account safe. -- -+ -+ -+ -+ -+ <small>Enter the same password twice, so that it can be checked for typing errors.</small> -+ - - -- -- -- <small>Enter the same password twice, so that it can be checked for typing errors. A good password will contain a mixture of letters, numbers and punctuation, should be at least eight characters long, and should be changed at regular intervals.</small> -- -+ -+ -+ Use Active Directory -+ - - -- -- -- Password -- -+ -+ -+ Domain: -+ - - -- -- -- Repeat Password -- -+ -+ -+ Domain Administrator: -+ - - -- -- When this box is checked, password-strength checking is done and you will not be able to use a weak password. -- -+ -+ -+ Password: -+ - - -- -- Require strong passwords. -- -+ -+ -+ IP Address (optional): -+ - - -- -- Log in automatically without asking for the password. -- -+ -+ your name -+ 姓名 - - -- -- Use the same password for the administrator account. -- -+ -+ user name -+ 用户名 - - -- -- Choose a password for the administrator account. -- -+ -+ computer name -+ 計算機名稱 - - -- -- -- <small>Enter the same password twice, so that it can be checked for typing errors.</small> -- -+ -+ Use the same password for the root account. -+ - -- -- -+ -+ - PartitionLabelsView - -- -- Root -- -+ -+ Root -+ - - -- -- Home -- @label -- -+ -+ Home -+ @label -+ - - -- -- Boot -- @label -- -+ -+ Boot -+ @label -+ - - -- -- EFI system -- @label -- -+ -+ EFI system -+ @label -+ - - -- -- Swap -- @label -- -+ -+ Swap -+ @label -+ - - -- -- New partition for %1 -- @label -- -+ -+ New partition for %1 -+ @label -+ - - -- -- New partition -- @label -- -+ -+ New partition -+ @label -+ - - -- -- %1 %2 -- size[number] filesystem[name] -- -+ -+ %1 %2 -+ size[number] filesystem[name] -+ - -- -- -+ -+ - PartitionModel - -- -- -- Free Space -- @title -- -+ -+ -+ Free Space -+ @title -+ - - -- -- -- New Partition -- @title -- -+ -+ -+ New Partition -+ @title -+ - - -- -- Name -- @title -- -+ -+ Name -+ @title -+ - - -- -- File System -- @title -- -+ -+ File System -+ @title -+ - - -- -- File System Label -- @title -- -+ -+ File System Label -+ @title -+ - - -- -- Mount Point -- @title -- -+ -+ Mount Point -+ @title -+ - - -- -- Size -- @title -- -+ -+ Size -+ @title -+ - -- -- -+ -+ - PartitionPage - -- -- Storage de&vice: -- -+ -+ Storage de&vice: -+ - - -- -- &Revert All Changes -- -+ -+ &Revert All Changes -+ - - -- -- New Partition &Table -- -+ -+ New Partition &Table -+ - - -- -- Cre&ate -- -+ -+ Cre&ate -+ - - -- -- &Edit -- -+ -+ &Edit -+ - - -- -- &Delete -- -+ -+ &Delete -+ - - -- -- New Volume Group -- -+ -+ New Volume Group -+ - - -- -- Resize Volume Group -- -+ -+ Resize Volume Group -+ - - -- -- Deactivate Volume Group -- -+ -+ Deactivate Volume Group -+ - - -- -- Remove Volume Group -- -+ -+ Remove Volume Group -+ - - -- -- I&nstall boot loader on: -- -+ -+ I&nstall boot loader on: -+ - - -- -- Are you sure you want to create a new partition table on %1? -- -+ -+ Are you sure you want to create a new partition table on %1? -+ - - -- -- Can not create new partition -- -+ -+ Can not create new partition -+ - - -- -- The partition table on %1 already has %2 primary partitions, and no more can be added. Please remove one primary partition and add an extended partition, instead. -- -+ -+ The partition table on %1 already has %2 primary partitions, and no more can be added. Please remove one primary partition and add an extended partition, instead. -+ - -- -- -+ -+ - PartitionViewStep - -- -- Gathering system information… -- @status -- -+ -+ Gathering system information… -+ @status -+ - - -- -- Partitions -- @label -- -+ -+ Partitions -+ @label -+ - - -- -- Install %1 <strong>alongside</strong> another operating system -- @label -- -+ -+ Install %1 <strong>alongside</strong> another operating system -+ @label -+ - - -- -- <strong>Erase</strong> disk and install %1 -- @label -- -+ -+ <strong>Erase</strong> disk and install %1 -+ @label -+ - - -- -- <strong>Replace</strong> a partition with %1 -- @label -- -+ -+ <strong>Replace</strong> a partition with %1 -+ @label -+ - - -- -- <strong>Manual</strong> partitioning -- @label -- -+ -+ <strong>Manual</strong> partitioning -+ @label -+ - - -- -- Install %1 <strong>alongside</strong> another operating system on disk <strong>%2</strong> (%3) -- @info -- -+ -+ Install %1 <strong>alongside</strong> another operating system on disk <strong>%2</strong> (%3) -+ @info -+ - - -- -- <strong>Erase</strong> disk <strong>%2</strong> (%3) and install %1 -- @info -- -+ -+ <strong>Erase</strong> disk <strong>%2</strong> (%3) and install %1 -+ @info -+ - - -- -- <strong>Replace</strong> a partition on disk <strong>%2</strong> (%3) with %1 -- @info -- -+ -+ <strong>Replace</strong> a partition on disk <strong>%2</strong> (%3) with %1 -+ @info -+ - - -- -- <strong>Manual</strong> partitioning on disk <strong>%1</strong> (%2) -- @info -- -+ -+ <strong>Manual</strong> partitioning on disk <strong>%1</strong> (%2) -+ @info -+ - - -- -- Disk <strong>%1</strong> (%2) -- @info -- -+ -+ Disk <strong>%1</strong> (%2) -+ @info -+ - - -- -- Unsafe partition actions are enabled. -- -+ -+ Unsafe partition actions are enabled. -+ - - -- -- Partitioning is configured to <b>always</b> fail. -- -+ -+ Partitioning is configured to <b>always</b> fail. -+ - - -- -- No partitions will be changed. -- -+ -+ No partitions will be changed. -+ - - -- -- Current: -- @label -- -+ -+ Current: -+ @label -+ - - -- -- After: -- @label -- -+ -+ After: -+ @label -+ - - -- -- An EFI system partition is necessary to start %1.<br/><br/>To configure an EFI system partition, go back and select or create a suitable filesystem. -- -+ -+ An EFI system partition is necessary to start %1.<br/><br/>To configure an EFI system partition, go back and select or create a suitable filesystem. -+ - - -- -- An EFI system partition is necessary to start %1.<br/><br/>The EFI system partition does not meet recommendations. It is recommended to go back and select or create a suitable filesystem. -- -+ -+ An EFI system partition is necessary to start %1.<br/><br/>The EFI system partition does not meet recommendations. It is recommended to go back and select or create a suitable filesystem. -+ - - -- -- The filesystem must be mounted on <strong>%1</strong>. -- -+ -+ The filesystem must be mounted on <strong>%1</strong>. -+ - - -- -- The filesystem must have type FAT32. -- -+ -+ The filesystem must have type FAT32. -+ - - -- -- The filesystem must have flag <strong>%1</strong> set. -- -+ -+ The filesystem must have flag <strong>%1</strong> set. -+ - - -- -- -- The filesystem must be at least %1 MiB in size. -- -+ -+ -+ The filesystem must be at least %1 MiB in size. -+ - - -- -- The minimum recommended size for the filesystem is %1 MiB. -- -+ -+ The minimum recommended size for the filesystem is %1 MiB. -+ - - -- -- You can continue without setting up an EFI system partition but your system may fail to start. -- -+ -+ You can continue without setting up an EFI system partition but your system may fail to start. -+ - - -- -- You can continue with this EFI system partition configuration but your system may fail to start. -- -+ -+ You can continue with this EFI system partition configuration but your system may fail to start. -+ - - -- -- No EFI system partition configured -- -+ -+ No EFI system partition configured -+ - - -- -- EFI system partition configured incorrectly -- -+ -+ EFI system partition configured incorrectly -+ - - -- -- EFI system partition recommendation -- -+ -+ EFI system partition recommendation -+ - - -- -- Option to use GPT on BIOS -- -+ -+ Option to use GPT on BIOS -+ - - -- -- A GPT partition table is the best option for all systems. This installer supports such a setup for BIOS systems too.<br/><br/>To configure a GPT partition table on BIOS, (if not done so already) go back and set the partition table to GPT, next create a 8 MB unformatted partition with the <strong>%2</strong> flag enabled.<br/><br/>An unformatted 8 MB partition is necessary to start %1 on a BIOS system with GPT. -- -+ -+ A GPT partition table is the best option for all systems. This installer supports such a setup for BIOS systems too.<br/><br/>To configure a GPT partition table on BIOS, (if not done so already) go back and set the partition table to GPT, next create a 8 MB unformatted partition with the <strong>%2</strong> flag enabled.<br/><br/>An unformatted 8 MB partition is necessary to start %1 on a BIOS system with GPT. -+ - - -- -- Boot partition not encrypted -- -+ -+ Boot partition not encrypted -+ - - -- -- A separate boot partition was set up together with an encrypted root partition, but the boot partition is not encrypted.<br/><br/>There are security concerns with this kind of setup, because important system files are kept on an unencrypted partition.<br/>You may continue if you wish, but filesystem unlocking will happen later during system startup.<br/>To encrypt the boot partition, go back and recreate it, selecting <strong>Encrypt</strong> in the partition creation window. -- -+ -+ A separate boot partition was set up together with an encrypted root partition, but the boot partition is not encrypted.<br/><br/>There are security concerns with this kind of setup, because important system files are kept on an unencrypted partition.<br/>You may continue if you wish, but filesystem unlocking will happen later during system startup.<br/>To encrypt the boot partition, go back and recreate it, selecting <strong>Encrypt</strong> in the partition creation window. -+ - - -- -- has at least one disk device available. -- -+ -+ has at least one disk device available. -+ - - -- -- There are no partitions to install on. -- -+ -+ There are no partitions to install on. -+ - -- -- -+ -+ - PlasmaLnfJob - -- -- Applying Plasma Look-and-Feel… -- @status -- -+ -+ Applying Plasma Look-and-Feel… -+ @status -+ - - -- -- -- Could not select KDE Plasma Look-and-Feel package -- -+ -+ -+ Could not select KDE Plasma Look-and-Feel package -+ - -- -- -+ -+ - PlasmaLnfPage - -- -- Please choose a look-and-feel for the KDE Plasma Desktop. You can also skip this step and configure the look-and-feel once the system is set up. Clicking on a look-and-feel selection will give you a live preview of that look-and-feel. -- -+ -+ Please choose a look-and-feel for the KDE Plasma Desktop. You can also skip this step and configure the look-and-feel once the system is set up. Clicking on a look-and-feel selection will give you a live preview of that look-and-feel. -+ - - -- -- Please choose a look-and-feel for the KDE Plasma Desktop. You can also skip this step and configure the look-and-feel once the system is installed. Clicking on a look-and-feel selection will give you a live preview of that look-and-feel. -- -+ -+ Please choose a look-and-feel for the KDE Plasma Desktop. You can also skip this step and configure the look-and-feel once the system is installed. Clicking on a look-and-feel selection will give you a live preview of that look-and-feel. -+ - -- -- -+ -+ - PlasmaLnfViewStep - -- -- Look-and-Feel -- @label -- -+ -+ Look-and-Feel -+ @label -+ - -- -- -+ -+ -+ PowerManagementInterface -+ -+ -+ Calamares -+ -+ -+ -+ -+ Installation in progress -+ @status -+ -+ -+ -+ - PreserveFiles - -- -- Saving files for later… -- @status -- -+ -+ Saving files for later… -+ @status -+ - - -- -- No files configured to save for later. -- -+ -+ No files configured to save for later. -+ - - -- -- Not all of the configured files could be preserved. -- -+ -+ Not all of the configured files could be preserved. -+ - -- -- -+ -+ - ProcessResult - -- -- -+ -+ - There was no output from the command. -- -+ - - -- -- -+ -+ - Output: - -- -+ - - -- -- External command crashed. -- -+ -+ External command crashed. -+ - - -- -- Command <i>%1</i> crashed. -- -+ -+ Command <i>%1</i> crashed. -+ - - -- -- External command failed to start. -- -+ -+ External command failed to start. -+ - - -- -- Command <i>%1</i> failed to start. -- -+ -+ Command <i>%1</i> failed to start. -+ - - -- -- Internal error when starting command. -- -+ -+ Internal error when starting command. -+ - - -- -- Bad parameters for process job call. -- -+ -+ Bad parameters for process job call. -+ - - -- -- External command failed to finish. -- -+ -+ External command failed to finish. -+ - - -- -- Command <i>%1</i> failed to finish in %2 seconds. -- -+ -+ Command <i>%1</i> failed to finish in %2 seconds. -+ - - -- -- External command finished with errors. -- -+ -+ External command finished with errors. -+ - - -- -- Command <i>%1</i> finished with exit code %2. -- -+ -+ Command <i>%1</i> finished with exit code %2. -+ - -- -- -+ -+ - QObject - -- -- %1 (%2) -- -+ -+ %1 (%2) -+ - - -- -- unknown -- @partition info -- -+ -+ unknown -+ @partition info -+ - - -- -- extended -- @partition info -- -+ -+ extended -+ @partition info -+ - - -- -- unformatted -- @partition info -- -+ -+ unformatted -+ @partition info -+ - - -- -- swap -- @partition info -- -+ -+ swap -+ @partition info -+ - - -- -- -- Default -- -+ -+ -+ Default -+ - - -- -- Directory not found -- -+ -+ Directory not found -+ - - -- -- Could not create new random file <pre>%1</pre>. -- -+ -+ Could not create new random file <pre>%1</pre>. -+ - - -- -- No product -- -+ -+ No product -+ - - -- -- No description provided. -- -+ -+ No description provided. -+ - - -- -- (no mount point) -- -+ -+ (no mount point) -+ - - -- -- Unpartitioned space or unknown partition table -- @info -- -+ -+ Unpartitioned space or unknown partition table -+ @info -+ - -- -- -+ -+ - Recommended - -- -- <p>This computer does not satisfy some of the recommended requirements for setting up %1.<br/> -+ -+ <p>This computer does not satisfy some of the recommended requirements for setting up %1.<br/> - Setup can continue, but some features might be disabled.</p> -- -+ - -- -- -+ -+ - RemoveUserJob - -- -- Removing live user from the target system… -- @status -- -+ -+ Removing live user from the target system… -+ @status -+ - -- -- -+ -+ - RemoveVolumeGroupJob - -- -- -- Removing Volume Group named %1… -- @status -- -+ -+ -+ Removing Volume Group named %1… -+ @status -+ - - -- -- Removing Volume Group named <strong>%1</strong>… -- @status -- -+ -+ Removing Volume Group named <strong>%1</strong>… -+ @status -+ - - -- -- The installer failed to remove a volume group named '%1'. -- -+ -+ The installer failed to remove a volume group named '%1'. -+ - -- -- -+ -+ - Requirements - -- -- <p>This computer does not satisfy the minimum requirements for installing %1.<br/> -+ -+ <p>This computer does not satisfy the minimum requirements for installing %1.<br/> - Installation cannot continue.</p> -- -+ - - -- -- <p>This computer does not satisfy some of the recommended requirements for setting up %1.<br/> -+ -+ <p>This computer does not satisfy some of the recommended requirements for setting up %1.<br/> - Setup can continue, but some features might be disabled.</p> -- -+ - -- -- -+ -+ - ResizeFSJob - -- -- Performing file system resize… -- @status -- -+ -+ Performing file system resize… -+ @status -+ - - -- -- Invalid configuration -- @error -- -+ -+ Invalid configuration -+ @error -+ - - -- -- The file-system resize job has an invalid configuration and will not run. -- @error -- -+ -+ The file-system resize job has an invalid configuration and will not run. -+ @error -+ - - -- -- KPMCore not available -- @error -- -+ -+ KPMCore not available -+ @error -+ - - -- -- Calamares cannot start KPMCore for the file system resize job. -- @error -- -+ -+ Calamares cannot start KPMCore for the file system resize job. -+ @error -+ - - -- -- Resize failed. -- @error -- -+ -+ Resize failed. -+ @error -+ - - -- -- The filesystem %1 could not be found in this system, and cannot be resized. -- @info -- -+ -+ The filesystem %1 could not be found in this system, and cannot be resized. -+ @info -+ - - -- -- The device %1 could not be found in this system, and cannot be resized. -- @info -- -+ -+ The device %1 could not be found in this system, and cannot be resized. -+ @info -+ - - -- -- -- -- -- Resize Failed -- @error -- -+ -+ -+ -+ -+ Resize Failed -+ @error -+ - - -- -- -- The filesystem %1 cannot be resized. -- @error -- -+ -+ -+ The filesystem %1 cannot be resized. -+ @error -+ - - -- -- -- The device %1 cannot be resized. -- @error -- -+ -+ -+ The device %1 cannot be resized. -+ @error -+ - - -- -- The file system %1 must be resized, but cannot. -- @info -- -+ -+ The file system %1 must be resized, but cannot. -+ @info -+ - - -- -- The device %1 must be resized, but cannot -- @info -- -+ -+ The device %1 must be resized, but cannot -+ @info -+ - -- -- -+ -+ - ResizePartitionJob - -- -- Resize partition %1 -- @title -- -+ -+ Resize partition %1 -+ @title -+ - - -- -- Resize <strong>%2MiB</strong> partition <strong>%1</strong> to <strong>%3MiB</strong> -- @info -- -+ -+ Resize <strong>%2MiB</strong> partition <strong>%1</strong> to <strong>%3MiB</strong> -+ @info -+ - - -- -- Resizing %2MiB partition %1 to %3MiB… -- @status -- -+ -+ Resizing %2MiB partition %1 to %3MiB… -+ @status -+ - - -- -- The installer failed to resize partition %1 on disk '%2'. -- -+ -+ The installer failed to resize partition %1 on disk '%2'. -+ - -- -- -+ -+ - ResizeVolumeGroupDialog - -- -- Resize Volume Group -- @title -- -+ -+ Resize Volume Group -+ @title -+ - -- -- -+ -+ - ResizeVolumeGroupJob - -- -- Resize volume group named %1 from %2 to %3 -- @title -- -+ -+ Resize volume group named %1 from %2 to %3 -+ @title -+ - - -- -- Resize volume group named <strong>%1</strong> from <strong>%2</strong> to <strong>%3</strong> -- @info -- -+ -+ Resize volume group named <strong>%1</strong> from <strong>%2</strong> to <strong>%3</strong> -+ @info -+ - - -- -- Resizing volume group named %1 from %2 to %3… -- @status -- -+ -+ Resizing volume group named %1 from %2 to %3… -+ @status -+ - - -- -- The installer failed to resize a volume group named '%1'. -- -+ -+ The installer failed to resize a volume group named '%1'. -+ - -- -- -+ -+ - ResultsListWidget - -- -- Checking requirements again in a few seconds ... -- -+ -+ Checking requirements again in a few seconds ... -+ - -- -- -+ -+ - ScanningDialog - -- -- Scanning storage devices… -- @status -- -+ -+ Scanning storage devices… -+ @status -+ - - -- -- Partitioning… -- @status -- -+ -+ Partitioning… -+ @status -+ - -- -- -+ -+ - SetHostNameJob - -- -- Set hostname %1 -- -+ -+ Set hostname %1 -+ - - -- -- Set hostname <strong>%1</strong>. -- -+ -+ Set hostname <strong>%1</strong>. -+ - - -- -- Setting hostname %1… -- @status -- -+ -+ Setting hostname %1… -+ @status -+ - - -- -- -- Internal Error -- -+ -+ -+ Internal Error -+ - - -- -- -- Cannot write hostname to target system -- -+ -+ -+ Cannot write hostname to target system -+ - -- -- -+ -+ - SetKeyboardLayoutJob - -- -- Setting keyboard model to %1, layout as %2-%3… -- @status, %1 model, %2 layout, %3 variant -- -+ -+ Setting keyboard model to %1, layout as %2-%3… -+ @status, %1 model, %2 layout, %3 variant -+ - - -- -- Failed to write keyboard configuration for the virtual console. -- @error -- -+ -+ Failed to write keyboard configuration for the virtual console. -+ @error -+ - - -- -- Failed to write to %1 -- @error, %1 is virtual console configuration path -- -+ -+ Failed to write to %1 -+ @error, %1 is virtual console configuration path -+ - - -- -- Failed to write keyboard configuration for X11. -- @error -- -+ -+ Failed to write keyboard configuration for X11. -+ @error -+ - - -- -- Failed to write to %1 -- @error, %1 is keyboard configuration path -- -+ -+ Failed to write to %1 -+ @error, %1 is keyboard configuration path -+ - - -- -- Failed to write keyboard configuration to existing /etc/default directory. -- @error -- -+ -+ Failed to write keyboard configuration to existing /etc/default directory. -+ @error -+ - - -- -- Failed to write to %1 -- @error, %1 is default keyboard path -- -+ -+ Failed to write to %1 -+ @error, %1 is default keyboard path -+ - -- -- -+ -+ - SetPartFlagsJob - -- -- Set flags on partition %1 -- @title -- -+ -+ Set flags on partition %1 -+ @title -+ - - -- -- Set flags on %1MiB %2 partition -- @title -- -+ -+ Set flags on %1MiB %2 partition -+ @title -+ - - -- -- Set flags on new partition -- @title -- -+ -+ Set flags on new partition -+ @title -+ - - -- -- Clear flags on partition <strong>%1</strong> -- @info -- -+ -+ Clear flags on partition <strong>%1</strong> -+ @info -+ - - -- -- Clear flags on %1MiB <strong>%2</strong> partition -- @info -- -+ -+ Clear flags on %1MiB <strong>%2</strong> partition -+ @info -+ - - -- -- Clear flags on new partition -- @info -- -+ -+ Clear flags on new partition -+ @info -+ - - -- -- Set flags on partition <strong>%1</strong> to <strong>%2</strong> -- @info -- -+ -+ Set flags on partition <strong>%1</strong> to <strong>%2</strong> -+ @info -+ - - -- -- Set flags on %1MiB <strong>%2</strong> partition to <strong>%3</strong> -- @info -- -+ -+ Set flags on %1MiB <strong>%2</strong> partition to <strong>%3</strong> -+ @info -+ - - -- -- Set flags on new partition to <strong>%1</strong> -- @info -- -+ -+ Set flags on new partition to <strong>%1</strong> -+ @info -+ - - -- -- Clearing flags on partition <strong>%1</strong>… -- @status -- -+ -+ Clearing flags on partition <strong>%1</strong>… -+ @status -+ - - -- -- Clearing flags on %1MiB <strong>%2</strong> partition… -- @status -- -+ -+ Clearing flags on %1MiB <strong>%2</strong> partition… -+ @status -+ - - -- -- Clearing flags on new partition… -- @status -- -+ -+ Clearing flags on new partition… -+ @status -+ - - -- -- Setting flags <strong>%2</strong> on partition <strong>%1</strong>… -- @status -- -+ -+ Setting flags <strong>%2</strong> on partition <strong>%1</strong>… -+ @status -+ - - -- -- Setting flags <strong>%3</strong> on %1MiB <strong>%2</strong> partition… -- @status -- -+ -+ Setting flags <strong>%3</strong> on %1MiB <strong>%2</strong> partition… -+ @status -+ - - -- -- Setting flags <strong>%1</strong> on new partition… -- @status -- -+ -+ Setting flags <strong>%1</strong> on new partition… -+ @status -+ - - -- -- The installer failed to set flags on partition %1. -- -+ -+ The installer failed to set flags on partition %1. -+ - -- -- -+ -+ - SetPasswordJob - -- -- Set password for user %1 -- -+ -+ Set password for user %1 -+ - - -- -- Setting password for user %1… -- @status -- -+ -+ Setting password for user %1… -+ @status -+ - - -- -- Bad destination system path. -- -+ -+ Bad destination system path. -+ - - -- -- rootMountPoint is %1 -- -+ -+ rootMountPoint is %1 -+ - - -- -- Cannot disable root account. -- -+ -+ Cannot disable root account. -+ - - -- -- -- usermod terminated with error code %1. -- -+ -+ -+ usermod terminated with error code %1. -+ - - -- -- Cannot set password for user %1. -- -+ -+ Cannot set password for user %1. -+ - -- -- -+ -+ - SetTimezoneJob - -- -- Setting timezone to %1/%2… -- @status -- -+ -+ Setting timezone to %1/%2… -+ @status -+ - - -- -- Cannot access selected timezone path. -- @error -- -+ -+ Cannot access selected timezone path. -+ @error -+ - - -- -- Bad path: %1 -- @error -- -+ -+ Bad path: %1 -+ @error -+ - - -- -- -- Cannot set timezone. -- @error -- -+ -+ -+ Cannot set timezone. -+ @error -+ - - -- -- Link creation failed, target: %1; link name: %2 -- @info -- -+ -+ Link creation failed, target: %1; link name: %2 -+ @info -+ - - -- -- Cannot open /etc/timezone for writing -- @info -- -+ -+ Cannot open /etc/timezone for writing -+ @info -+ - -- -- -+ -+ - SetupGroupsJob - -- -- Preparing groups… -- @status -- -+ -+ Preparing groups… -+ @status -+ - - -- -- -- Could not create groups in target system -- -+ -+ -+ Could not create groups in target system -+ - - -- -- These groups are missing in the target system: %1 -- -+ -+ These groups are missing in the target system: %1 -+ - -- -- -+ -+ - SetupSudoJob - -- -- Configuring <pre>sudo</pre> users… -- @status -- -+ -+ Configuring <pre>sudo</pre> users… -+ @status -+ - - -- -- Cannot chmod sudoers file. -- -+ -+ Cannot chmod sudoers file. -+ - - -- -- Cannot create sudoers file for writing. -- -+ -+ Cannot create sudoers file for writing. -+ - -- -- -+ -+ - ShellProcessJob - -- -- Running shell processes… -- @status -- -+ -+ Running shell processes… -+ @status -+ - -- -- -+ -+ - SlideCounter - -- -- -- %L1 / %L2 -- slide counter, %1 of %2 (numeric) -- -+ -+ -+ %L1 / %L2 -+ slide counter, %1 of %2 (numeric) -+ - -- -- -+ -+ - StandardButtons - -- -- &OK -- -+ -+ &OK -+ - - -- -- &Yes -- -+ -+ &Yes -+ - - -- -- &No -- -+ -+ &No -+ - - -- -- &Cancel -- -+ -+ &Cancel -+ - - -- -- &Close -- -+ -+ &Close -+ - -- -- -+ -+ - TrackingInstallJob - -- -- Installation feedback -- -+ -+ Installation feedback -+ - - -- -- Sending installation feedback… -- @status -- -+ -+ Sending installation feedback… -+ @status -+ - - -- -- Internal error in install-tracking. -- -+ -+ Internal error in install-tracking. -+ - - -- -- HTTP request timed out. -- -+ -+ HTTP request timed out. -+ - -- -- -+ -+ - TrackingKUserFeedbackJob - -- -- KDE user feedback -- -+ -+ KDE user feedback -+ - - -- -- Configuring KDE user feedback… -- @status -- -+ -+ Configuring KDE user feedback… -+ @status -+ - - -- -- -- Error in KDE user feedback configuration. -- -+ -+ -+ Error in KDE user feedback configuration. -+ - - -- -- Could not configure KDE user feedback correctly, script error %1. -- -+ -+ Could not configure KDE user feedback correctly, script error %1. -+ - - -- -- Could not configure KDE user feedback correctly, Calamares error %1. -- -+ -+ Could not configure KDE user feedback correctly, Calamares error %1. -+ - -- -- -+ -+ - TrackingMachineUpdateManagerJob - -- -- Machine feedback -- -+ -+ Machine feedback -+ - - -- -- Configuring machine feedback… -- @status -- -+ -+ Configuring machine feedback… -+ @status -+ - - -- -- -- Error in machine feedback configuration. -- -+ -+ -+ Error in machine feedback configuration. -+ - - -- -- Could not configure machine feedback correctly, script error %1. -- -+ -+ Could not configure machine feedback correctly, script error %1. -+ - - -- -- Could not configure machine feedback correctly, Calamares error %1. -- -+ -+ Could not configure machine feedback correctly, Calamares error %1. -+ - -- -- -+ -+ - TrackingPage - -- -- Placeholder -- -+ -+ Placeholder -+ - - -- -- <html><head/><body><p>Click here to send <span style=" font-weight:600;">no information at all</span> about your installation.</p></body></html> -- -+ -+ <html><head/><body><p>Click here to send <span style=" font-weight:600;">no information at all</span> about your installation.</p></body></html> -+ - - -- -- <html><head/><body><p><a href="placeholder"><span style=" text-decoration: underline; color:#2980b9;">Click here for more information about user feedback</span></a></p></body></html> -- -+ -+ <html><head/><body><p><a href="placeholder"><span style=" text-decoration: underline; color:#2980b9;">Click here for more information about user feedback</span></a></p></body></html> -+ - - -- -- Tracking helps %1 to see how often it is installed, what hardware it is installed on and which applications are used. To see what will be sent, please click the help icon next to each area. -- -+ -+ Tracking helps %1 to see how often it is installed, what hardware it is installed on and which applications are used. To see what will be sent, please click the help icon next to each area. -+ - - -- -- By selecting this you will send information about your installation and hardware. This information will only be sent <b>once</b> after the installation finishes. -- -+ -+ By selecting this you will send information about your installation and hardware. This information will only be sent <b>once</b> after the installation finishes. -+ - - -- -- By selecting this you will periodically send information about your <b>machine</b> installation, hardware and applications, to %1. -- -+ -+ By selecting this you will periodically send information about your <b>machine</b> installation, hardware and applications, to %1. -+ - - -- -- By selecting this you will regularly send information about your <b>user</b> installation, hardware, applications and application usage patterns, to %1. -- -+ -+ By selecting this you will regularly send information about your <b>user</b> installation, hardware, applications and application usage patterns, to %1. -+ - -- -- -+ -+ - TrackingViewStep - -- -- Feedback -- @title -- -+ -+ Feedback -+ @title -+ - -- -- -+ -+ - UmountJob - -- -- Unmounting file systems… -- @status -- -+ -+ Unmounting file systems… -+ @status -+ - - -- -- No target system available. -- -+ -+ No target system available. -+ - - -- -- No rootMountPoint is set. -- -+ -+ No rootMountPoint is set. -+ - -- -- -+ -+ - UsersPage - -- -- <small>If more than one person will use this computer, you can create multiple accounts after setup.</small> -- -+ -+ <small>If more than one person will use this computer, you can create multiple accounts after setup.</small> -+ - - -- -- <small>If more than one person will use this computer, you can create multiple accounts after installation.</small> -- -+ -+ <small>If more than one person will use this computer, you can create multiple accounts after installation.</small> -+ - -- -- -+ -+ - UsersQmlViewStep - -- -- Users -- -+ -+ Users -+ - -- -- -+ -+ - UsersViewStep - -- -- Users -- -+ -+ Users -+ - -- -- -+ -+ - VariantModel - -- -- Key -- Column header for key/value -- -+ -+ Key -+ Column header for key/value -+ - - -- -- Value -- Column header for key/value -- -+ -+ Value -+ Column header for key/value -+ - -- -- -+ -+ - VolumeGroupBaseDialog - -- -- Create Volume Group -- -+ -+ Create Volume Group -+ - - -- -- List of Physical Volumes -- -+ -+ List of Physical Volumes -+ - - -- -- Volume Group Name: -- -+ -+ Volume Group Name: -+ - - -- -- Volume Group Type: -- -+ -+ Volume Group Type: -+ - - -- -- Physical Extent Size: -- -+ -+ Physical Extent Size: -+ - - -- -- MiB -- -+ -+ MiB -+ - - -- -- Total Size: -- -+ -+ Total Size: -+ - - -- -- Used Size: -- -+ -+ Used Size: -+ - - -- -- Total Sectors: -- -+ -+ Total Sectors: -+ - - -- -- Quantity of LVs: -- -+ -+ Quantity of LVs: -+ - -- -- -+ -+ - WelcomePage - -- -- -- Select application and system language -- -- -- -- -- Open donations website -- -- -- -- -- &Donate -- -- -- -- -- Open help and support website -- -- -- -- -- &Support -- -- -- -- -- Open issues and bug-tracking website -- -- -- -- -- &Known issues -- -- -- -- -- Open release notes website -- -- -- -- -- &Release notes -- -+ -+ -+ Select application and system language -+ - - -- -- About %1 Setup -- @title -- -+ -+ language -+ - - -- -- About %1 Installer -- @title -- -+ -+ About %1 Setup -+ @title -+ - - -- -- %1 Support -- @action -- -+ -+ About %1 Installer -+ @title -+ - -- -- -+ -+ - WelcomeQmlViewStep - -- -- Welcome -- @title -- -+ -+ Welcome -+ @title -+ - -- -- -+ -+ - WelcomeViewStep - -- -- Welcome -- @title -- -+ -+ Welcome -+ @title -+ - -- -- -+ -+ - ZfsJob - -- -- Creating ZFS pools and datasets… -- @status -- -+ -+ Creating ZFS pools and datasets… -+ @status -+ - - -- -- Failed to create zpool on -- -+ -+ Failed to create zpool on -+ - - -- -- Configuration Error -- -+ -+ Configuration Error -+ - - -- -- No partitions are available for ZFS. -- -+ -+ No partitions are available for ZFS. -+ - - -- -- Internal data missing -- -+ -+ Internal data missing -+ - - -- -- -- Failed to create zpool -- -+ -+ -+ Failed to create zpool -+ - - -- -- Failed to create dataset -- -+ -+ Failed to create dataset -+ - - -- -- The output was: -- -+ -+ The output was: -+ - -- -- -+ -+ - calamares-sidebar - -- -- About -- -+ -+ About -+ - - -- -- Debug -- -+ -+ Debug -+ - - -- -- About -- @button -- -+ -+ About -+ @button -+ - - -- -- Show information about Calamares -- @tooltip -- -+ -+ Show information about Calamares -+ @tooltip -+ - - -- -- Debug -- @button -- -+ -+ -+ Debug -+ @button -+ - - -- -- Show debug information -- @tooltip -- -+ -+ -+ Show debug information -+ @tooltip -+ - -- -- -+ -+ -+ Show information about easysoftware -+ @tooltip -+ -+ -+ -+ - finishedq - -- -- Installation Completed -- -+ -+ Installation Completed -+ - - -- -- %1 has been installed on your computer.<br/> -+ -+ %1 has been installed on your computer.<br/> - You may now restart into your new system, or continue using the Live environment. -- -+ - - -- -- Close Installer -- -+ -+ Close Installer -+ - - -- -- Restart System -- -+ -+ Restart System -+ - - -- -- <p>A full log of the install is available as installation.log in the home directory of the Live user.<br/> -+ -+ <p>A full log of the install is available as installation.log in the home directory of the Live user.<br/> - This log is copied to /var/log/installation.log of the target system.</p> -- -+ - -- -- -+ -+ - finishedq-qt6 - -- -- Installation Completed -- @title -- -+ -+ Installation Completed -+ @title -+ - - -- -- %1 has been installed on your computer.<br/> -+ -+ %1 has been installed on your computer.<br/> - You may now restart into your new system, or continue using the Live environment. -- @info, %1 is the product name -- -+ @info, %1 is the product name -+ - - -- -- Close Installer -- @button -- -+ -+ Close Installer -+ @button -+ - - -- -- Restart System -- @button -- -+ -+ Restart System -+ @button -+ - - -- -- <p>A full log of the install is available as installation.log in the home directory of the Live user.<br/> -+ -+ <p>A full log of the install is available as installation.log in the home directory of the Live user.<br/> - This log is copied to /var/log/installation.log of the target system.</p> -- @info -- -+ @info -+ - -- -- -+ -+ - finishedq@mobile - -- -- Installation Completed -- @title -- -+ -+ Installation Completed -+ @title -+ - - -- -- %1 has been installed on your computer.<br/> -+ -+ %1 has been installed on your computer.<br/> - You may now restart your device. -- @info, %1 is the product name -- -+ @info, %1 is the product name -+ - - -- -- Close -- @button -- -+ -+ Close -+ @button -+ - - -- -- Restart -- @button -- -+ -+ Restart -+ @button -+ - -- -- -+ -+ - keyboardq - -- -- Select a layout to activate keyboard preview -- @label -- -+ -+ Select a layout to activate keyboard preview -+ @label -+ - - -- -- <b>Keyboard model:&nbsp;&nbsp;</b> -- @label -- -+ -+ <b>Keyboard model:&nbsp;&nbsp;</b> -+ @label -+ - - -- -- Layout -- @label -- -+ -+ Layout -+ @label -+ - - -- -- Variant -- @label -- -+ -+ Variant -+ @label -+ - - -- -- Type here to test your keyboard… -- @label -- -+ -+ Type here to test your keyboard… -+ @label -+ - -- -- -+ -+ - keyboardq-qt6 - -- -- Select a layout to activate keyboard preview -- @label -- -+ -+ Select a layout to activate keyboard preview -+ @label -+ - - -- -- <b>Keyboard model:&nbsp;&nbsp;</b> -- @label -- -+ -+ <b>Keyboard model:&nbsp;&nbsp;</b> -+ @label -+ - - -- -- Layout -- @label -- -+ -+ Layout -+ @label -+ - - -- -- Variant -- @label -- -+ -+ Variant -+ @label -+ - - -- -- Type here to test your keyboard… -- @label -- -+ -+ Type here to test your keyboard… -+ @label -+ - -- -- -+ -+ - localeq - -- -- -- Change -- @button -- -+ -+ -+ Change -+ @button -+ - - -- -- <h3>Languages</h3> </br> -+ -+ <h3>Languages</h3> </br> - The system locale setting affects the language and character set for some command line user interface elements. The current setting is <strong>%1</strong>. -- @info -- -+ @info -+ - - -- -- <h3>Locales</h3> </br> -+ -+ <h3>Locales</h3> </br> - The system locale setting affects the numbers and dates format. The current setting is <strong>%1</strong>. -- @info -- -+ @info -+ - -- -- -+ -+ - localeq-qt6 - -- -- -- Change -- @button -- -+ -+ -+ Change -+ @button -+ - - -- -- <h3>Languages</h3> </br> -+ -+ <h3>Languages</h3> </br> - The system locale setting affects the language and character set for some command line user interface elements. The current setting is <strong>%1</strong>. -- @info -- -+ @info -+ - - -- -- <h3>Locales</h3> </br> -+ -+ <h3>Locales</h3> </br> - The system locale setting affects the numbers and dates format. The current setting is <strong>%1</strong>. -- @info -- -+ @info -+ - -- -- -+ -+ - notesqml - -- -- <h3>%1</h3> -+ -+ <h3>%1</h3> - <p>These are example release notes.</p> -- -+ - -- -- -+ -+ - packagechooserq - -- -- LibreOffice is a powerful and free office suite, used by millions of people around the world. It includes several applications that make it the most versatile Free and Open Source office suite on the market.<br/> -+ -+ LibreOffice is a powerful and free office suite, used by millions of people around the world. It includes several applications that make it the most versatile Free and Open Source office suite on the market.<br/> - Default option. -- -+ - - -- -- LibreOffice -- -+ -+ LibreOffice -+ - - -- -- If you don't want to install an office suite, just select No Office Suite. You can always add one (or more) later on your installed system as the need arrives. -- -+ -+ If you don't want to install an office suite, just select No Office Suite. You can always add one (or more) later on your installed system as the need arrives. -+ - - -- -- No Office Suite -- -+ -+ No Office Suite -+ - - -- -- Create a minimal Desktop install, remove all extra applications and decide later on what you would like to add to your system. Examples of what won't be on such an install, there will be no Office Suite, no media players, no image viewer or print support. It will be just a desktop, file browser, package manager, text editor and simple web-browser. -- -+ -+ Create a minimal Desktop install, remove all extra applications and decide later on what you would like to add to your system. Examples of what won't be on such an install, there will be no Office Suite, no media players, no image viewer or print support. It will be just a desktop, file browser, package manager, text editor and simple web-browser. -+ - - -- -- Minimal Install -- -+ -+ Minimal Install -+ - - -- -- Please select an option for your install, or use the default: LibreOffice included. -- -+ -+ Please select an option for your install, or use the default: LibreOffice included. -+ - -- -- -+ -+ - packagechooserq-qt6 - -- -- LibreOffice is a powerful and free office suite, used by millions of people around the world. It includes several applications that make it the most versatile Free and Open Source office suite on the market.<br/> -+ -+ LibreOffice is a powerful and free office suite, used by millions of people around the world. It includes several applications that make it the most versatile Free and Open Source office suite on the market.<br/> - Default option. -- -+ - - -- -- LibreOffice -- -+ -+ LibreOffice -+ - - -- -- If you don't want to install an office suite, just select No Office Suite. You can always add one (or more) later on your installed system as the need arrives. -- -+ -+ If you don't want to install an office suite, just select No Office Suite. You can always add one (or more) later on your installed system as the need arrives. -+ - - -- -- No Office Suite -- -+ -+ No Office Suite -+ - - -- -- Create a minimal Desktop install, remove all extra applications and decide later on what you would like to add to your system. Examples of what won't be on such an install, there will be no Office Suite, no media players, no image viewer or print support. It will be just a desktop, file browser, package manager, text editor and simple web-browser. -- -+ -+ Create a minimal Desktop install, remove all extra applications and decide later on what you would like to add to your system. Examples of what won't be on such an install, there will be no Office Suite, no media players, no image viewer or print support. It will be just a desktop, file browser, package manager, text editor and simple web-browser. -+ - - -- -- Minimal Install -- -+ -+ Minimal Install -+ - - -- -- Please select an option for your install, or use the default: LibreOffice included. -- -+ -+ Please select an option for your install, or use the default: LibreOffice included. -+ - -- -- -+ -+ - release_notes - -- -- <h3>%1</h3> -- <p>This an example QML file, showing options in RichText with Flickable content.</p> -+ -+ ### %1 -+This an example QML file, showing options in Markdown with Flickable content. -+ -+QML with RichText can use HTML tags, with Markdown it uses the simple Markdown syntax, Flickable content is useful for touchscreens. -+ -+**This is bold text** -+ -+*This is italic text* -+ -+_This is underlined text_ - -- <p>QML with RichText can use HTML tags, Flickable content is useful for touchscreens.</p> -+> blockquote - -- <p><b>This is bold text</b></p> -- <p><i>This is italic text</i></p> -- <p><u>This is underlined text</u></p> -- <p><center>This text will be center-aligned.</center></p> -- <p><s>This is strikethrough</s></p> -+~~This is strikethrough~~ - -- <p>Code example: -- <code>ls -l /home</code></p> -+Code example: -+``` -+ls -l /home -+``` - -- <p><b>Lists:</b></p> -- <ul> -- <li>Intel CPU systems</li> -- <li>AMD CPU systems</li> -- </ul> -+**Lists:** -+ * Intel CPU systems -+ * AMD CPU systems - -- <p>The vertical scrollbar is adjustable, current width set to 10.</p> -- -+The vertical scrollbar is adjustable, current width set to 10. -+ - - -- -- Back -- -+ -+ Back -+ - -- -- -+ -+ - usersq - -- -- Pick your user name and credentials to login and perform admin tasks -- -+ -+ Pick your user name and credentials to login and perform admin tasks -+ - - -- -- What is your name? -- -+ -+ What is your name? -+ - - -- -- Your full name -- -+ -+ Your full name -+ - - -- -- What name do you want to use to log in? -- -+ -+ What name do you want to use to log in? -+ - - -- -- Login name -- -+ -+ Login name -+ - - -- -- If more than one person will use this computer, you can create multiple accounts after installation. -- -+ -+ If more than one person will use this computer, you can create multiple accounts after installation. -+ - - -- -- Only lowercase letters, numbers, underscore and hyphen are allowed. -- -+ -+ Only lowercase letters, numbers, underscore and hyphen are allowed. -+ - - -- -- root is not allowed as username. -- -+ -+ root is not allowed as username. -+ - - -- -- What is the name of this computer? -- -+ -+ What is the name of this computer? -+ - - -- -- Computer name -- -+ -+ Computer name -+ - - -- -- This name will be used if you make the computer visible to others on a network. -- -+ -+ This name will be used if you make the computer visible to others on a network. -+ - - -- -- Only letters, numbers, underscore and hyphen are allowed, minimal of two characters. -- -+ -+ Only letters, numbers, underscore and hyphen are allowed, minimal of two characters. -+ - - -- -- localhost is not allowed as hostname. -- -+ -+ localhost is not allowed as hostname. -+ - - -- -- Choose a password to keep your account safe. -- -+ -+ Choose a password to keep your account safe. -+ - - -- -- Password -- -+ -+ Password -+ - - -- -- Repeat password -- -+ -+ Repeat password -+ - - -- -- Enter the same password twice, so that it can be checked for typing errors. A good password will contain a mixture of letters, numbers and punctuation, should be at least eight characters long, and should be changed at regular intervals. -- -+ -+ Enter the same password twice, so that it can be checked for typing errors. A good password will contain a mixture of letters, numbers and punctuation, should be at least eight characters long, and should be changed at regular intervals. -+ - - -- -- Reuse user password as root password -- -+ -+ Reuse user password as root password -+ - - -- -- Use the same password for the administrator account. -- -+ -+ Use the same password for the administrator account. -+ - - -- -- Choose a root password to keep your account safe. -- -+ -+ Choose a root password to keep your account safe. -+ - - -- -- Root password -- -+ -+ Root password -+ - - -- -- Repeat root password -- -+ -+ Repeat root password -+ - - -- -- Enter the same password twice, so that it can be checked for typing errors. -- -+ -+ Enter the same password twice, so that it can be checked for typing errors. -+ - - -- -- Log in automatically without asking for the password -- -+ -+ Log in automatically without asking for the password -+ - - -- -- Validate passwords quality -- -+ -+ Validate passwords quality -+ - - -- -- When this box is checked, password-strength checking is done and you will not be able to use a weak password. -- -+ -+ When this box is checked, password-strength checking is done and you will not be able to use a weak password. -+ - -- -- -+ -+ - usersq-qt6 - -- -- Pick your user name and credentials to login and perform admin tasks -- -+ -+ Pick your user name and credentials to login and perform admin tasks -+ - - -- -- What is your name? -- -+ -+ What is your name? -+ - - -- -- Your full name -- -+ -+ Your full name -+ - - -- -- What name do you want to use to log in? -- -+ -+ What name do you want to use to log in? -+ - - -- -- Login name -- -+ -+ Login name -+ - - -- -- If more than one person will use this computer, you can create multiple accounts after installation. -- -+ -+ If more than one person will use this computer, you can create multiple accounts after installation. -+ - - -- -- Only lowercase letters, numbers, underscore and hyphen are allowed. -- -+ -+ Only lowercase letters, numbers, underscore and hyphen are allowed. -+ - - -- -- root is not allowed as username. -- -+ -+ root is not allowed as username. -+ - - -- -- What is the name of this computer? -- -+ -+ What is the name of this computer? -+ - - -- -- Computer name -- -+ -+ Computer name -+ - - -- -- This name will be used if you make the computer visible to others on a network. -- -+ -+ This name will be used if you make the computer visible to others on a network. -+ - - -- -- Only letters, numbers, underscore and hyphen are allowed, minimal of two characters. -- -+ -+ Only letters, numbers, underscore and hyphen are allowed, minimal of two characters. -+ - - -- -- localhost is not allowed as hostname. -- -+ -+ localhost is not allowed as hostname. -+ - - -- -- Choose a password to keep your account safe. -- -+ -+ Choose a password to keep your account safe. -+ - - -- -- Password -- -+ -+ Password -+ - - -- -- Repeat password -- -+ -+ Repeat password -+ - - -- -- Enter the same password twice, so that it can be checked for typing errors. A good password will contain a mixture of letters, numbers and punctuation, should be at least eight characters long, and should be changed at regular intervals. -- -+ -+ Enter the same password twice, so that it can be checked for typing errors. A good password will contain a mixture of letters, numbers and punctuation, should be at least eight characters long, and should be changed at regular intervals. -+ - - -- -- Reuse user password as root password -- -+ -+ Reuse user password as root password -+ - - -- -- Use the same password for the administrator account. -- -+ -+ Use the same password for the administrator account. -+ - - -- -- Choose a root password to keep your account safe. -- -+ -+ Choose a root password to keep your account safe. -+ - - -- -- Root password -- -+ -+ Root password -+ - - -- -- Repeat root password -- -+ -+ Repeat root password -+ - - -- -- Enter the same password twice, so that it can be checked for typing errors. -- -+ -+ Enter the same password twice, so that it can be checked for typing errors. -+ - - -- -- Log in automatically without asking for the password -- -+ -+ Log in automatically without asking for the password -+ - - -- -- Validate passwords quality -- -+ -+ Validate passwords quality -+ - - -- -- When this box is checked, password-strength checking is done and you will not be able to use a weak password. -- -+ -+ When this box is checked, password-strength checking is done and you will not be able to use a weak password. -+ - -- -- -+ -+ - welcomeq - -- -- <h3>Welcome to the %1 <quote>%2</quote> installer</h3> -+ -+ <h3>Welcome to the %1 <quote>%2</quote> installer</h3> - <p>This program will ask you some questions and set up %1 on your computer.</p> -- -+ - - -- -- Support -- -+ -+ Support -+ - - -- -- Known Issues -- -+ -+ Known Issues -+ - - -- -- Release Notes -- -+ -+ Release Notes -+ - - -- -- Donate -- -+ -+ Donate -+ - -- -- -+ -+ - welcomeq-qt6 - -- -- <h3>Welcome to the %1 <quote>%2</quote> installer</h3> -+ -+ <h3>Welcome to the %1 <quote>%2</quote> installer</h3> - <p>This program will ask you some questions and set up %1 on your computer.</p> -- -+ - - -- -- Support -- -+ -+ Support -+ - - -- -- Known Issues -- -+ -+ Known Issues -+ - - -- -- Release Notes -- -+ -+ Release Notes -+ - - -- -- Donate -- -+ -+ Donate -+ - -- -+ - -diff --git a/lang/calamares_zh_TW.ts b/lang/calamares_zh_TW.ts -index d695119..8689629 100644 ---- a/lang/calamares_zh_TW.ts -+++ b/lang/calamares_zh_TW.ts -@@ -1,4873 +1,5001 @@ - - -- -- -+ -+ - AboutData - -- -- <h1>%1</h1><br/><strong>%2<br/> for %3</strong><br/><br/> -- <h1>%1</h1><br/><strong>%2<br/> for %3</strong><br/><br/> -+ -+ <br/><h2>Release:%1</h2><br/> -+ <br/><h1>發行版本:%1</h1><br/> - - -- -- Thanks to <a href="https://calamares.io/team/">the Calamares team</a> and the <a href="https://app.transifex.com/calamares/calamares/">Calamares translators team</a>. -- 感謝 <a href="https://calamares.io/team/">Calamares 團隊</a>與 <a href="https://app.transifex.com/calamares/calamares/">Calamares 翻譯者團隊</a>。 -+ -+ <strong>Thanks to the openEuler team.</strong> -+ <strong>感謝 openEuler 團隊。</strong> - - -- -- <a href="https://calamares.io/">Calamares</a> development is sponsored by <br/><a href="http://www.blue-systems.com/">Blue Systems</a> - Liberating Software. -- <a href="https://calamares.io/">Calamares</a> 由 <a href="http://www.blue-systems.com/">Blue Systems</a> - Liberating Software 贊助開發。 -+ <a href="https://calamares.io/">Calamares</a> development is sponsored by <br/><a href="http://www.blue-systems.com/">Blue Systems</a> - Liberating Software. -+ <a href="https://calamares.io/">Calamares</a> 由 <a href="http://www.blue-systems.com/">Blue Systems</a> - Liberating Software 贊助開發。 - - -- -- Copyright %1-%2 %3 &lt;%4&gt;<br/> -- Copyright year-year Name <email-address> -- Copyright %1-%2 %3 &lt;%4&gt;<br/> -+ -+ Copyright %1-%2 %3 &lt;%4&gt;<br/> -+ Copyright year-year Name <email-address> -+ Copyright %1-%2 %3 &lt;%4&gt;<br/> - -- -- -+ -+ -+ ActiveDirectoryJob -+ -+ -+ Enroll system in Active Directory -+ @label -+ -+ -+ -+ -+ Enrolling system in Active Directory… -+ @status -+ -+ -+ -+ - AutoMountManagementJob - -- -- Managing auto-mount settings… -- @status -- 管理自動掛載設定…… -+ -+ Managing auto-mount settings… -+ @status -+ 管理自動掛載設定…… - -- -- -+ -+ - BootInfoWidget - -- -- The <strong>boot environment</strong> of this system.<br><br>Older x86 systems only support <strong>BIOS</strong>.<br>Modern systems usually use <strong>EFI</strong>, but may also show up as BIOS if started in compatibility mode. -- 這個系統的<strong>開機環境</strong>。<br><br>較舊的 x86 系統只支援 <strong>BIOS</strong>。<br>現時的系統則通常使用 <strong>EFI</strong>,但若使用相容模式 (CSM),也可能顯示為 BIOS。 -+ -+ The <strong>boot environment</strong> of this system.<br><br>Older x86 systems only support <strong>BIOS</strong>.<br>Modern systems usually use <strong>EFI</strong>, but may also show up as BIOS if started in compatibility mode. -+ 這個系統的<strong>開機環境</strong>。<br><br>較舊的 x86 系統只支援 <strong>BIOS</strong>。<br>現時的系統則通常使用 <strong>EFI</strong>,但若使用相容模式 (CSM),也可能顯示為 BIOS。 - - -- -- This system was started with an <strong>EFI</strong> boot environment.<br><br>To configure startup from an EFI environment, this installer must deploy a boot loader application, like <strong>GRUB</strong> or <strong>systemd-boot</strong> on an <strong>EFI System Partition</strong>. This is automatic, unless you choose manual partitioning, in which case you must choose it or create it on your own. -- 這個系統以 <strong>EFI</strong> 開機。<br><br>要從 EFI 環境開機,本安裝程式必須安裝開機載入器程式,像是 <strong>GRUB</strong> 或 <strong>systemd-boot</strong> 在 <strong>EFI 系統分割區</strong>。這是自動的,除非選擇手動分割;在這種情況,您必須自行選取或建立它。 -+ -+ This system was started with an <strong>EFI</strong> boot environment.<br><br>To configure startup from an EFI environment, this installer must deploy a boot loader application, like <strong>GRUB</strong> or <strong>systemd-boot</strong> on an <strong>EFI System Partition</strong>. This is automatic, unless you choose manual partitioning, in which case you must choose it or create it on your own. -+ 這個系統以 <strong>EFI</strong> 開機。<br><br>要從 EFI 環境開機,本安裝程式必須安裝開機載入器程式,像是 <strong>GRUB</strong> 或 <strong>systemd-boot</strong> 在 <strong>EFI 系統分割區</strong>。這是自動的,除非選擇手動分割;在這種情況,您必須自行選取或建立它。 - - -- -- This system was started with a <strong>BIOS</strong> boot environment.<br><br>To configure startup from a BIOS environment, this installer must install a boot loader, like <strong>GRUB</strong>, either at the beginning of a partition or on the <strong>Master Boot Record</strong> near the beginning of the partition table (preferred). This is automatic, unless you choose manual partitioning, in which case you must set it up on your own. -- 這個系統以 <strong>BIOS</strong> 開機。<br><br>要從 BIOS 環境開機,本安裝程式必須安裝開機載入器程式,像是 <strong>GRUB</strong>。而且通常安裝在分割區的開首,又或最好安裝在靠近分割表開首的 <strong>主要開機記錄 (MBR)</strong>。這是自動的,除非選擇手動分割;在這種情況,您必須自行設定它。 -+ -+ This system was started with a <strong>BIOS</strong> boot environment.<br><br>To configure startup from a BIOS environment, this installer must install a boot loader, like <strong>GRUB</strong>, either at the beginning of a partition or on the <strong>Master Boot Record</strong> near the beginning of the partition table (preferred). This is automatic, unless you choose manual partitioning, in which case you must set it up on your own. -+ 這個系統以 <strong>BIOS</strong> 開機。<br><br>要從 BIOS 環境開機,本安裝程式必須安裝開機載入器程式,像是 <strong>GRUB</strong>。而且通常安裝在分割區的開首,又或最好安裝在靠近分割表開首的 <strong>主要開機記錄 (MBR)</strong>。這是自動的,除非選擇手動分割;在這種情況,您必須自行設定它。 - -- -- -+ -+ - BootLoaderModel - -- -- Master Boot Record of %1 -- @info -- %1 的主要開機紀錄 (MBR) -+ -+ Master Boot Record of %1 -+ @info -+ %1 的主要開機紀錄 (MBR) - - -- -- Boot Partition -- @info -- 開機分割區 -+ -+ Boot Partition -+ @info -+ 開機分割區 - - -- -- System Partition -- @info -- 系統分割區 -+ -+ System Partition -+ @info -+ 系統分割區 - - -- -- Do not install a boot loader -- @label -- 無法安裝開機載入器 -+ -+ Do not install a boot loader -+ @label -+ 無法安裝開機載入器 - - -- -- %1 (%2) -- %1 (%2) -+ -+ %1 (%2) -+ %1 (%2) - -- -- -+ -+ - Calamares::BlankViewStep - -- -- Blank Page -- 空白頁 -+ -+ Blank Page -+ 空白頁 - -- -- -+ -+ - Calamares::DebugWindow - -- -- GlobalStorage -- 全域儲存 -+ -+ GlobalStorage -+ 全域儲存 - - -- -- JobQueue -- 工作佇列 -+ -+ JobQueue -+ 工作佇列 - - -- -- Modules -- 模組 -+ -+ Modules -+ 模組 - - -- -- Type: -- 類型: -+ -+ Type: -+ 類型: - - -- -- -- none -- -+ -+ -+ none -+ - - -- -- Interface: -- 介面: -+ -+ Interface: -+ 介面: - - -- -- Crashes Calamares, so that Dr. Konqi can look at it. -- 讓 Calamares 當機,這樣 Dr. Konqi 就能檢視。 -+ -+ Crashes Calamares, so that Dr. Konqi can look at it. -+ 讓 Calamares 當機,這樣 Dr. Konqi 就能檢視。 - - -- -- Reloads the stylesheet from the branding directory. -- 重新自品牌目錄載入樣式表。 -+ -+ Reloads the stylesheet from the branding directory. -+ 重新自品牌目錄載入樣式表。 - - -- -- Reload Stylesheet -- 重新載入樣式表 -+ -+ Reload Stylesheet -+ 重新載入樣式表 - - -- -- Displays the tree of widget names in the log (for stylesheet debugging). -- 在紀錄檔中顯示小工具名稱樹(供樣式表除錯使用)。 -+ -+ Displays the tree of widget names in the log (for stylesheet debugging). -+ 在紀錄檔中顯示小工具名稱樹(供樣式表除錯使用)。 - - -- -- Widget Tree -- 小工具樹 -+ -+ Widget Tree -+ 小工具樹 - - -- -- Uploads the session log to the configured pastebin. -- 將工作階段紀錄檔上傳到設定好的 pastebin。 -+ -+ Uploads the session log to the configured pastebin. -+ 將工作階段紀錄檔上傳到設定好的 pastebin。 - - -- -- Send Session Log -- 傳送工作階段紀錄檔 -+ -+ Send Session Log -+ 傳送工作階段紀錄檔 - - -- -- Debug Information -- @title -- 除錯資訊 -+ -+ Debug Information -+ @title -+ 除錯資訊 - -- -- -+ -+ - Calamares::ExecutionViewStep - -- -- %p% -- Progress percentage indicator: %p is where the number 0..100 is placed -- %p% -+ -+ %p% -+ Progress percentage indicator: %p is where the number 0..100 is placed -+ %p% - - -- -- Set Up -- @label -- 安裝 -+ -+ Set Up -+ @label -+ 安裝 - - -- -- Install -- @label -- 安裝 -+ -+ Install -+ @label -+ 安裝 - -- -- -+ -+ - Calamares::FailJob - -- -- Job failed (%1) -- 排程失敗 (%1) -+ -+ Job failed (%1) -+ 排程失敗 (%1) - - -- -- Programmed job failure was explicitly requested. -- 明確要求程式化排程失敗。 -+ -+ Programmed job failure was explicitly requested. -+ 明確要求程式化排程失敗。 - -- -- -+ -+ - Calamares::JobThread - -- -- Done -- 完成 -+ -+ Done -+ 完成 - -- -- -+ -+ - Calamares::NamedJob - -- -- Example job (%1) -- 範例排程 (%1) -+ -+ Example job (%1) -+ 範例排程 (%1) - -- -- -+ -+ - Calamares::ProcessJob - -- -- Running command %1 in target system… -- @status -- 正於目標系統中執行 %1 命令…… -+ -+ Running command %1 in target system… -+ @status -+ 正於目標系統中執行 %1 命令…… - - -- -- Running command %1… -- @status -- 正在執行 %1 命令 -+ -+ Running command %1… -+ @status -+ 正在執行 %1 命令 - -- -- -+ -+ - Calamares::Python::Job - -- -- Running %1 operation. -- 正在執行 %1 操作。 -+ -+ Running %1 operation. -+ 正在執行 %1 操作。 - - -- -- Bad working directory path -- 不良的工作目錄路徑 -+ -+ Bad working directory path -+ 不良的工作目錄路徑 - - -- -- Working directory %1 for python job %2 is not readable. -- Python 行程 %2 作用中的目錄 %1 不具讀取權限。 -+ -+ Working directory %1 for python job %2 is not readable. -+ Python 行程 %2 作用中的目錄 %1 不具讀取權限。 - - -- -- -- -- -- -- -- Bad main script file -- 錯誤的主要腳本檔 -+ -+ -+ -+ -+ -+ -+ Bad main script file -+ 錯誤的主要腳本檔 - - -- -- Main script file %1 for python job %2 is not readable. -- Python 行程 %2 的主要腳本檔 %1 無法讀取。 -+ -+ Main script file %1 for python job %2 is not readable. -+ Python 行程 %2 的主要腳本檔 %1 無法讀取。 - - -- -- Bad internal script -- 內部命令稿錯誤 -+ -+ Bad internal script -+ 內部命令稿錯誤 - - -- -- Internal script for python job %1 raised an exception. -- python 作業 %1 的內部命令稿引發了例外。 -+ -+ Internal script for python job %1 raised an exception. -+ python 作業 %1 的內部命令稿引發了例外。 - - -- -- Main script file %1 for python job %2 could not be loaded because it raised an exception. -- 無法載入 python 作業 %2 的主要命令稿檔案 %1,因為其引發了例外。 -+ -+ Main script file %1 for python job %2 could not be loaded because it raised an exception. -+ 無法載入 python 作業 %2 的主要命令稿檔案 %1,因為其引發了例外。 - - -- -- Main script file %1 for python job %2 raised an exception. -- python 作業 %2 的主要命令稿 %1 引發了例外。 -+ -+ Main script file %1 for python job %2 raised an exception. -+ python 作業 %2 的主要命令稿 %1 引發了例外。 - - -- -- -- Main script file %1 for python job %2 returned invalid results. -- python 作業 %2 的主要命令稿 %1 回傳了無效結果。 -+ -+ -+ Main script file %1 for python job %2 returned invalid results. -+ python 作業 %2 的主要命令稿 %1 回傳了無效結果。 - - -- -- Main script file %1 for python job %2 does not contain a run() function. -- python 作業 %2 的主要命令稿 %1 不包含 run() 函式。 -+ -+ Main script file %1 for python job %2 does not contain a run() function. -+ python 作業 %2 的主要命令稿 %1 不包含 run() 函式。 - -- -- -+ -+ - Calamares::PythonJob - -- -- Running %1 operation… -- @status -- 正在執行 %1 操作…… -+ -+ Running %1 operation… -+ @status -+ 正在執行 %1 操作…… - - -- -- Bad working directory path -- @error -- 不良的工作目錄路徑 -+ -+ Bad working directory path -+ @error -+ 不良的工作目錄路徑 - - -- -- Working directory %1 for python job %2 is not readable. -- @error -- Python 行程 %2 作用中的目錄 %1 不具讀取權限。 -+ -+ Working directory %1 for python job %2 is not readable. -+ @error -+ Python 行程 %2 作用中的目錄 %1 不具讀取權限。 - - -- -- Bad main script file -- @error -- 錯誤的主要腳本檔 -+ -+ Bad main script file -+ @error -+ 錯誤的主要腳本檔 - - -- -- Main script file %1 for python job %2 is not readable. -- @error -- Python 行程 %2 的主要腳本檔 %1 無法讀取。 -+ -+ Main script file %1 for python job %2 is not readable. -+ @error -+ Python 行程 %2 的主要腳本檔 %1 無法讀取。 - - -- -- Boost.Python error in job "%1" -- @error -- 作業「%1」中的 Boost.Python 錯誤 -+ -+ Boost.Python error in job "%1" -+ @error -+ 作業「%1」中的 Boost.Python 錯誤 - -- -- -+ -+ - Calamares::QmlViewStep - -- -- Loading… -- @status -- 正在載入…… -+ -+ Loading… -+ @status -+ 正在載入…… - - -- -- QML step <i>%1</i>. -- @label -- QML 第 <i>%1</i> 步 -+ -+ QML step <i>%1</i>. -+ @label -+ QML 第 <i>%1</i> 步 - - -- -- Loading failed. -- @info -- 載入失敗。 -+ -+ Loading failed. -+ @info -+ 載入失敗。 - -- -- -+ -+ - Calamares::RequirementsChecker - -- -- Requirements checking for module '%1' is complete. -- @info -- 模組「%1」需求檢查完成。 -+ -+ Requirements checking for module '%1' is complete. -+ @info -+ 模組「%1」需求檢查完成。 - - -- -- Waiting for %n module(s)… -- @status -- -- 正在等待 %n 個模組…… -- -+ -+ Waiting for %n module(s)… -+ @status -+ -+ 正在等待 %n 個模組…… -+ - - -- -- (%n second(s)) -- @status -- -- (%n 秒) -- -+ -+ (%n second(s)) -+ @status -+ -+ (%n 秒) -+ - - -- -- System-requirements checking is complete. -- @info -- 系統需求檢查完成。 -+ -+ System-requirements checking is complete. -+ @info -+ 系統需求檢查完成。 - -- -- -+ -+ - Calamares::ViewManager - -- -- The upload was unsuccessful. No web-paste was done. -- 上傳不成功。並未完成網路張貼。 -+ -+ The upload was unsuccessful. No web-paste was done. -+ 上傳不成功。並未完成網路張貼。 - - -- -- Install log posted to -+ -+ Install log posted to - - %1 - - Link copied to clipboard -- 安裝紀錄檔已張貼到: -+ 安裝紀錄檔已張貼到: - - %1 - - 連結已複製到剪貼簿 - - -- -- Install Log Paste URL -- 安裝紀錄檔張貼 URL -+ -+ Install Log Paste URL -+ 安裝紀錄檔張貼 URL - - -- -- &Yes -- 是(&Y) -+ -+ &Yes -+ 是(&Y) - - -- -- &No -- 否(&N) -+ -+ &No -+ 否(&N) - - -- -- &Close -- 關閉(&C) -+ -+ &Close -+ 關閉(&C) - - -- -- Setup Failed -- @title -- 設定失敗 -+ -+ Setup Failed -+ @title -+ 設定失敗 - - -- -- Installation Failed -- @title -- 安裝失敗 -+ -+ Installation Failed -+ @title -+ 安裝失敗 - - -- -- Error -- @title -- 錯誤 -+ -+ Error -+ @title -+ 錯誤 - - -- -- Calamares Initialization Failed -- @title -- Calamares 初始化失敗 -+ -+ Calamares Initialization Failed -+ @title -+ Calamares 初始化失敗 - - -- -- %1 can not be installed. Calamares was unable to load all of the configured modules. This is a problem with the way Calamares is being used by the distribution. -- @info -- %1 無法安裝。Calamares 無法載入所有已設定的模組。散佈版使用 Calamares 的方式有問題。 -+ -+ %1 can not be installed. Calamares was unable to load all of the configured modules. This is a problem with the way Calamares is being used by the distribution. -+ @info -+ %1 無法安裝。Calamares 無法載入所有已設定的模組。散佈版使用 Calamares 的方式有問題。 - - -- -- <br/>The following modules could not be loaded: -- @info -- <br/>以下的模組無法載入: -+ -+ <br/>The following modules could not be loaded: -+ @info -+ <br/>以下的模組無法載入: - - -- -- Continue with Setup? -- @title -- 繼續安裝? -+ -+ Continue with Setup? -+ @title -+ 繼續安裝? - - -- -- Continue with Installation? -- @title -- 繼續安裝? -+ -+ Continue with Installation? -+ @title -+ 繼續安裝? - - -- -- The %1 setup program is about to make changes to your disk in order to set up %2.<br/><strong>You will not be able to undo these changes.</strong> -- %1 is short product name, %2 is short product name with version -- %1 設定程式將在您的磁碟上做出變更以設定 %2。<br/><strong>您將無法復原這些變更。</strong> -+ -+ The %1 setup program is about to make changes to your disk in order to set up %2.<br/><strong>You will not be able to undo these changes.</strong> -+ %1 is short product name, %2 is short product name with version -+ %1 設定程式將在您的磁碟上做出變更以設定 %2。<br/><strong>您將無法復原這些變更。</strong> - - -- -- The %1 installer is about to make changes to your disk in order to install %2.<br/><strong>You will not be able to undo these changes.</strong> -- %1 is short product name, %2 is short product name with version -- %1 安裝程式將在您的磁碟上做出變更以安裝 %2。<br/><strong>您將無法復原這些變更。</strong> -+ -+ The %1 installer is about to make changes to your disk in order to install %2.<br/><strong>You will not be able to undo these changes.</strong> -+ %1 is short product name, %2 is short product name with version -+ %1 安裝程式將在您的磁碟上做出變更以安裝 %2。<br/><strong>您將無法復原這些變更。</strong> - - -- -- &Set Up Now -- @button -- 立刻進行安裝(&S) -+ -+ &Set Up Now -+ @button -+ 立刻進行安裝(&S) - - -- -- &Install Now -- @button -- 現在安裝(&I) -+ -+ &Install Now -+ @button -+ 現在安裝(&I) - - -- -- Go &Back -- @button -- 上一步(&B) -+ -+ Go &Back -+ @button -+ 上一步(&B) - - -- -- &Set Up -- @button -- 安裝(&S) -+ -+ &Set Up -+ @button -+ 安裝(&S) - - -- -- &Install -- @button -- 安裝(&I) -+ -+ &Install -+ @button -+ 安裝(&I) - - -- -- Setup is complete. Close the setup program. -- @tooltip -- 設定完成。關閉設定程式。 -+ -+ Setup is complete. Close the setup program. -+ @tooltip -+ 設定完成。關閉設定程式。 - - -- -- The installation is complete. Close the installer. -- @tooltip -- 安裝完成。關閉安裝程式。 -+ -+ The installation is complete. Close the installer. -+ @tooltip -+ 安裝完成。關閉安裝程式。 - - -- -- Cancel the setup process without changing the system. -- @tooltip -- 取消安裝流程而不變更系統。 -+ -+ Cancel the setup process without changing the system. -+ @tooltip -+ 取消安裝流程而不變更系統。 - - -- -- Cancel the installation process without changing the system. -- @tooltip -- 取消安裝流程而不變更系統。 -+ -+ Cancel the installation process without changing the system. -+ @tooltip -+ 取消安裝流程而不變更系統。 - - -- -- &Next -- @button -- 下一步 (&N) -+ -+ &Next -+ @button -+ 下一步 (&N) - - -- -- &Back -- @button -- 返回 (&B) -+ -+ &Back -+ @button -+ 返回 (&B) - - -- -- &Done -- @button -- 完成(&D) -+ -+ &Done -+ @button -+ 完成(&D) - - -- -- &Cancel -- @button -- 取消(&C) -+ -+ &Cancel -+ @button -+ 取消(&C) - - -- -- Cancel Setup? -- @title -- 取消安裝? -+ -+ Cancel Setup? -+ @title -+ 取消安裝? - - -- -- Cancel Installation? -- @title -- 取消安裝? -+ -+ Cancel Installation? -+ @title -+ 取消安裝? - - -- -- Do you really want to cancel the current setup process? -+ -+ Do you really want to cancel the current setup process? - The setup program will quit and all changes will be lost. -- 真的想要取消目前的設定程序嗎? -+ 真的想要取消目前的設定程序嗎? - 設定程式將會結束,所有變更都將會遺失。 - - -- -- Do you really want to cancel the current install process? -+ -+ Do you really want to cancel the current installation process? -+The system will reboot or you can enter the debug mode for further investigation. -+ 您確定要退出當前的安裝過程嗎? -+系統將重啟,或者您可以進入調試模式進行進一步的調查。 -+ -+ -+ -+ &Reboot -+ @button -+ 重啟(&R) -+ -+ -+ -+ &Debug -+ @button -+ 調試(&D) -+ -+ -+ Do you really want to cancel the current install process? - The installer will quit and all changes will be lost. -- 您真的想要取消目前的安裝程序嗎? -+ 您真的想要取消目前的安裝程序嗎? - 安裝程式將會退出且所有變動將會遺失。 - -- -- -+ -+ - CalamaresPython::Helper - -- -- Unknown exception type -- @error -- 未知的例外型別 -+ -+ Unknown exception type -+ @error -+ 未知的例外型別 - - -- -- Unparseable Python error -- @error -- 無法解析的 Python 錯誤 -+ -+ Unparseable Python error -+ @error -+ 無法解析的 Python 錯誤 - - -- -- Unparseable Python traceback -- @error -- 無法解析的 Python 回溯紀錄 -+ -+ Unparseable Python traceback -+ @error -+ 無法解析的 Python 回溯紀錄 - - -- -- Unfetchable Python error -- @error -- 無法擷取的 Python 錯誤 -+ -+ Unfetchable Python error -+ @error -+ 無法擷取的 Python 錯誤 - -- -- -+ -+ - CalamaresWindow - -- -- %1 Setup Program -- %1 設定程式 -+ -+ -+ %1 Setup Program -+ %1 設定程式 - - -- -- %1 Installer -- %1 安裝程式 -+ -+ -+ %1 Installer -+ %1 安裝程式 - -- -- -+ -+ - ChangeFilesystemLabelJob - -- -- Set filesystem label on %1 -- @title -- 在 %1 上設定檔案系統標籤 -+ -+ Set filesystem label on %1 -+ @title -+ 在 %1 上設定檔案系統標籤 - - -- -- Set filesystem label <strong>%1</strong> to partition <strong>%2</strong> -- @info -- 設定檔案系統標籤 <strong>%1</strong> 給分割區 <strong>%2</strong> -+ -+ Set filesystem label <strong>%1</strong> to partition <strong>%2</strong> -+ @info -+ 設定檔案系統標籤 <strong>%1</strong> 給分割區 <strong>%2</strong> - - -- -- Setting filesystem label <strong>%1</strong> to partition <strong>%2</strong>… -- @status -- 設定檔案系統標籤 <strong>%1</strong> 給分割區 <strong>%2</strong>…… -+ -+ Setting filesystem label <strong>%1</strong> to partition <strong>%2</strong>… -+ @status -+ 設定檔案系統標籤 <strong>%1</strong> 給分割區 <strong>%2</strong>…… - - -- -- -- The installer failed to update partition table on disk '%1'. -- @info -- 安裝程式在磁碟 '%1' 上更新分割區表格失敗。 -+ -+ -+ The installer failed to update partition table on disk '%1'. -+ @info -+ 安裝程式在磁碟 '%1' 上更新分割區表格失敗。 - -- -- -+ -+ - CheckerContainer - -- -- Gathering system information... -- 收集系統資訊中... -+ -+ Gathering system information... -+ 收集系統資訊中... - -- -- -+ -+ - ChoicePage - -- -- Select storage de&vice: -- @label -- 選取儲存裝置(&V): -+ -+ Select storage de&vice: -+ @label -+ 選取儲存裝置(&V): - - -- -- -- -- -- Current: -- @label -- 目前: -+ -+ -+ -+ -+ Current: -+ @label -+ 目前: - - -- -- After: -- @label -- 之後: -+ -+ After: -+ @label -+ 之後: - - -- -- Reuse %1 as home partition for %2 -- @label -- 重新使用 %1 作為 %2 的家目錄分割區 -+ -+ Reuse %1 as home partition for %2 -+ @label -+ 重新使用 %1 作為 %2 的家目錄分割區 - - -- -- <strong>Select a partition to shrink, then drag the bottom bar to resize</strong> -- <strong>選取要縮減的分割區,然後拖曳底部條狀物來調整大小</strong> -+ -+ <strong>Select a partition to shrink, then drag the bottom bar to resize</strong> -+ <strong>選取要縮減的分割區,然後拖曳底部條狀物來調整大小</strong> - - -- -- %1 will be shrunk to %2MiB and a new %3MiB partition will be created for %4. -- @info, %1 is partition name, %4 is product name -- %1 會縮減到 %2MiB,並且會為 %4 建立新的 %3MiB 分割區。 -+ -+ %1 will be shrunk to %2MiB and a new %3MiB partition will be created for %4. -+ @info, %1 is partition name, %4 is product name -+ %1 會縮減到 %2MiB,並且會為 %4 建立新的 %3MiB 分割區。 - - -- -- <strong>Select a partition to install on</strong> -- @label -- <strong>選取分割區以安裝在其上</strong> -+ -+ <strong>Select a partition to install on</strong> -+ @label -+ <strong>選取分割區以安裝在其上</strong> - - -- -- An EFI system partition cannot be found anywhere on this system. Please go back and use manual partitioning to set up %1. -- @info, %1 is product name -- 在這個系統找不到 EFI 系統分割區。請回到上一步並使用手動分割以設定 %1。 -+ -+ An EFI system partition cannot be found anywhere on this system. Please go back and use manual partitioning to set up %1. -+ @info, %1 is product name -+ 在這個系統找不到 EFI 系統分割區。請回到上一步並使用手動分割以設定 %1。 - - -- -- The EFI system partition at %1 will be used for starting %2. -- @info, %1 is partition path, %2 is product name -- 在 %1 的 EFI 系統分割區將會在開始 %2 時使用。 -+ -+ The EFI system partition at %1 will be used for starting %2. -+ @info, %1 is partition path, %2 is product name -+ 在 %1 的 EFI 系統分割區將會在開始 %2 時使用。 - - -- -- EFI system partition: -- @label -- EFI 系統分割區: -+ -+ EFI system partition: -+ @label -+ EFI 系統分割區: - - -- -- This storage device does not seem to have an operating system on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. -- 這個儲存裝置上似乎還沒有作業系統。您想要怎麼做?<br/>在任何變更套用到儲存裝置上前,您都可以重新檢視並確認您的選擇。 -+ -+ This storage device does not seem to have an operating system on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. -+ 這個儲存裝置上似乎還沒有作業系統。您想要怎麼做?<br/>在任何變更套用到儲存裝置上前,您都可以重新檢視並確認您的選擇。 - - -- -- -- -- -- <strong>Erase disk</strong><br/>This will <font color="red">delete</font> all data currently present on the selected storage device. -- <strong>抹除磁碟</strong><br/>這將會<font color="red">刪除</font>目前選取的儲存裝置所有的資料。 -+ -+ -+ -+ -+ <strong>Automatic partitioning</strong><br/>This will <font color="red">delete</font> all data currently present on the selected storage device. -+ <strong>自動分區</strong><br/>這將會<font color="red">刪除</font>目前選取的儲存裝置所有的資料。 - - -- -- -- -- -- <strong>Install alongside</strong><br/>The installer will shrink a partition to make room for %1. -- <strong>並存安裝</strong><br/>安裝程式會縮小一個分割區,以讓出空間給 %1。 -+ -+ -+ -+ -+ <strong>Install alongside</strong><br/>The installer will shrink a partition to make room for %1. -+ <strong>並存安裝</strong><br/>安裝程式會縮小一個分割區,以讓出空間給 %1。 - - -- -- -- -- -- <strong>Replace a partition</strong><br/>Replaces a partition with %1. -- <strong>取代一個分割區</strong><br/>用 %1 取代一個分割區。 -+ -+ -+ -+ -+ <strong>Replace a partition</strong><br/>Replaces a partition with %1. -+ <strong>取代一個分割區</strong><br/>用 %1 取代一個分割區。 - - -- -- This storage device has %1 on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. -- 這個儲存裝置上已經有 %1 了。您想要怎麼做?<br/>在任何變更套用到儲存裝置上前,您都可以重新檢視並確認您的選擇。 -+ -+ This storage device has %1 on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. -+ 這個儲存裝置上已經有 %1 了。您想要怎麼做?<br/>在任何變更套用到儲存裝置上前,您都可以重新檢視並確認您的選擇。 - - -- -- This storage device already has an operating system on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. -- 這個儲存裝置上已經有一個作業系統了。您想要怎麼做?<br/>在任何變更套用到儲存裝置上前,您都可以重新檢視並確認您的選擇。 -+ -+ This storage device already has an operating system on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. -+ 這個儲存裝置上已經有一個作業系統了。您想要怎麼做?<br/>在任何變更套用到儲存裝置上前,您都可以重新檢視並確認您的選擇。 - - -- -- This storage device has multiple operating systems on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. -- 這個儲存裝置上已經有多個作業系統了。您想要怎麼做?<br/>在任何變更套用到儲存裝置上前,您都可以重新檢視並確認您的選擇。 -+ -+ This storage device has multiple operating systems on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. -+ 這個儲存裝置上已經有多個作業系統了。您想要怎麼做?<br/>在任何變更套用到儲存裝置上前,您都可以重新檢視並確認您的選擇。 - - -- -- This storage device already has an operating system on it, but the partition table <strong>%1</strong> is different from the needed <strong>%2</strong>.<br/> -- 此儲存裝置上已有作業系統,但分割表 <strong>%1</strong> 與需要的 <strong>%2</strong> 不同。<br/> -+ -+ This storage device already has an operating system on it, but the partition table <strong>%1</strong> is different from the needed <strong>%2</strong>.<br/> -+ 此儲存裝置上已有作業系統,但分割表 <strong>%1</strong> 與需要的 <strong>%2</strong> 不同。<br/> - - -- -- This storage device has one of its partitions <strong>mounted</strong>. -- @info -- 此裝置<strong>已掛載</strong>其中一個分割區。 -+ -+ This storage device has one of its partitions <strong>mounted</strong>. -+ @info -+ 此裝置<strong>已掛載</strong>其中一個分割區。 - - -- -- This storage device is a part of an <strong>inactive RAID</strong> device. -- @info -- 此儲存裝置是<strong>非作用中 RAID</strong> 裝置的一部份。 -+ -+ This storage device is a part of an <strong>inactive RAID</strong> device. -+ @info -+ 此儲存裝置是<strong>非作用中 RAID</strong> 裝置的一部份。 - - -- -- No swap -- @label -- 無 swap 分割區 -+ -+ No swap -+ @label -+ 無 swap 分割區 - - -- -- Reuse swap -- @label -- 重新使用 swap -+ -+ Reuse swap -+ @label -+ 重新使用 swap - - -- -- Swap (no Hibernate) -- @label -- Swap(沒有冬眠) -+ -+ Swap (no Hibernate) -+ @label -+ Swap(沒有冬眠) - - -- -- Swap (with Hibernate) -- @label -- Swap(有冬眠) -+ -+ Swap (with Hibernate) -+ @label -+ Swap(有冬眠) - - -- -- Swap to file -- @label -- Swap 到檔案 -+ -+ Swap to file -+ @label -+ Swap 到檔案 - - -- -- <strong>Manual partitioning</strong><br/>You can create or resize partitions yourself. -- <strong>手動分割</strong><br/>可以自行建立或重新調整分割區大小。 -+ -+ <strong>Manual partitioning</strong><br/>You can create or resize partitions yourself. -+ <strong>手動分割</strong><br/>可以自行建立或重新調整分割區大小。 - - -- -- Bootloader location: -- @label -- 開機載入程式位置: -+ -+ Bootloader location: -+ @label -+ 開機載入程式位置: - -- -- -+ -+ - ClearMountsJob - -- -- Successfully unmounted %1. -- 成功解除掛載 %1。 -+ -+ Successfully unmounted %1. -+ 成功解除掛載 %1。 - - -- -- Successfully disabled swap %1. -- 成功停用 swap %1。 -+ -+ Successfully disabled swap %1. -+ 成功停用 swap %1。 - - -- -- Successfully cleared swap %1. -- 成功清除 swap %1。 -+ -+ Successfully cleared swap %1. -+ 成功清除 swap %1。 - - -- -- Successfully closed mapper device %1. -- 成功關閉對映裝置 %1。 -+ -+ Successfully closed mapper device %1. -+ 成功關閉對映裝置 %1。 - - -- -- Successfully disabled volume group %1. -- 成功停用捲軸群組 %1。 -+ -+ Successfully disabled volume group %1. -+ 成功停用捲軸群組 %1。 - - -- -- Clear mounts for partitioning operations on %1 -- @title -- 為了準備分割區操作而完全卸載 %1 -+ -+ Clear mounts for partitioning operations on %1 -+ @title -+ 為了準備分割區操作而完全卸載 %1 - - -- -- Clearing mounts for partitioning operations on %1… -- @status -- 正在為了準備分割區操作而完全清除掛載 %1…… -+ -+ Clearing mounts for partitioning operations on %1… -+ @status -+ 正在為了準備分割區操作而完全清除掛載 %1…… - - -- -- Cleared all mounts for %1 -- 已清除所有與 %1 相關的掛載 -+ -+ Cleared all mounts for %1 -+ 已清除所有與 %1 相關的掛載 - -- -- -+ -+ - ClearTempMountsJob - -- -- -- Clearing all temporary mounts… -- @status -- 正在清除所有臨時掛載…… -+ -+ -+ Clearing all temporary mounts… -+ @status -+ 正在清除所有臨時掛載…… - - -- -- Cleared all temporary mounts. -- 已清除所有暫時掛載。 -+ -+ Cleared all temporary mounts. -+ 已清除所有暫時掛載。 - -- -- -+ -+ - CommandList - -- -- Could not run command. -- 無法執行指令。 -+ -+ Could not run command. -+ 無法執行指令。 - - -- -- The commands use variables that are not defined. Missing variables are: %1. -- 這些指令使用了未定義的變數。缺少的變數為:%1。 -+ -+ The commands use variables that are not defined. Missing variables are: %1. -+ 這些指令使用了未定義的變數。缺少的變數為:%1。 - -- -- -+ -+ - Config - -- -- Setup Failed -- @title -- 設定失敗 -+ -+ Setup Failed -+ @title -+ 設定失敗 -+ -+ -+ -+ Installation Failed -+ @title -+ 安裝失敗 -+ -+ -+ -+ The setup of %1 did not complete successfully. -+ @info -+ %1 的設定並未成功完成。 - - -- -- Installation Failed -- @title -- 安裝失敗 -+ -+ The installation of %1 did not complete successfully. -+ @info -+ %1 的安裝並未成功完成。 - - -- -- The setup of %1 did not complete successfully. -- @info -- %1 的設定並未成功完成。 -+ -+ Setup Complete -+ @title -+ 設定完成 - - -- -- The installation of %1 did not complete successfully. -- @info -- %1 的安裝並未成功完成。 -+ -+ Installation Complete -+ @title -+ 安裝完成 - - -- -- Setup Complete -- @title -- 設定完成 -+ -+ The setup of %1 is complete. -+ @info -+ %1 的設定完成。 - - -- -- Installation Complete -- @title -- 安裝完成 -+ -+ The installation of %1 is complete. -+ @info -+ %1 的安裝已完成。 - - -- -- The setup of %1 is complete. -- @info -- %1 的設定完成。 -+ -+ Keyboard model has been set to %1<br/>. -+ @label, %1 is keyboard model, as in Apple Magic Keyboard -+ 鍵盤型號已設定為 %1<br/>。 - - -- -- The installation of %1 is complete. -- @info -- %1 的安裝已完成。 -+ -+ Keyboard layout has been set to %1/%2. -+ @label, %1 is layout, %2 is layout variant -+ 鍵盤佈局已設定為 %1/%2。 - - -- -- Keyboard model has been set to %1<br/>. -- @label, %1 is keyboard model, as in Apple Magic Keyboard -- 鍵盤型號已設定為 %1<br/>。 -+ -+ Set timezone to %1/%2 -+ @action -+ 設定時區為 %1/%2 - - -- -- Keyboard layout has been set to %1/%2. -- @label, %1 is layout, %2 is layout variant -- 鍵盤佈局已設定為 %1/%2。 -+ -+ The system language will be set to %1. -+ @info -+ 系統語言會設定為 %1。 - - -- -- Set timezone to %1/%2 -- @action -- 設定時區為 %1/%2 -+ -+ The numbers and dates locale will be set to %1. -+ @info -+ 數字與日期格式會設定為 %1。 - - -- -- The system language will be set to %1. -- @info -- 系統語言會設定為%1。 -+ -+ The timezone will be set to %1. -+ @info -+ 設定時區為 %1。 - - -- -- The numbers and dates locale will be set to %1. -- @info -- 數字與日期語系會設定為%1。 -+ The timezone whill be set to %1. -+ @info -+ 設定時區為 %1。 - - -- -- Network Installation. (Disabled: Incorrect configuration) -- 網路安裝。(已停用:設定不正確) -+ -+ Network Installation. (Disabled: Incorrect configuration) -+ 網路安裝。(已停用:設定不正確) - - -- -- Network Installation. (Disabled: Received invalid groups data) -- 網路安裝。(已停用:收到無效的群組資料) -+ -+ Network Installation. (Disabled: Received invalid groups data) -+ 網路安裝。(已停用:收到無效的群組資料) - - -- -- Network Installation. (Disabled: Internal error) -- 網路安裝。(已停用:內部錯誤) -+ -+ Network Installation. (Disabled: Internal error) -+ 網路安裝。(已停用:內部錯誤) - - -- -- Network Installation. (Disabled: Unable to fetch package lists, check your network connection) -- 網路安裝。(已停用:無法擷取軟體包清單,請檢查您的網路連線) -+ -+ Network Installation. (Disabled: Unable to fetch package lists, check your network connection) -+ 網路安裝。(已停用:無法擷取軟體包清單,請檢查您的網路連線) - - -- -- Network Installation. (Disabled: No package list) -- 網路安裝。(已停用:無軟體包清單) -+ -+ Network Installation. (Disabled: No package list) -+ 網路安裝。(已停用:無軟體包清單) - - -- -- Package selection -- 軟體包選擇 -+ -+ Package selection -+ 軟體包選擇 - - -- -- Package Selection -- 軟體包選擇 -+ -+ Package Selection -+ 軟體包選擇 - - -- -- Please pick a product from the list. The selected product will be installed. -- 請從清單中挑選產品。將會安裝選定的產品。 -+ -+ Please pick a product from the list. The selected product will be installed. -+ 請從清單中挑選產品。將會安裝選定的產品。 - - -- -- Packages -- 軟體包 -+ -+ Packages -+ 軟體包 - - -- -- Install option: <strong>%1</strong> -- 安裝選項:<strong>%1</strong> -+ -+ Install option: <strong>%1</strong> -+ 安裝選項:<strong>%1</strong> - - -- -- None -- -+ -+ None -+ - - -- -- Summary -- @label -- 總覽 -+ -+ Summary -+ @label -+ 總覽 - - -- -- This is an overview of what will happen once you start the setup procedure. -- 這是開始安裝後所會發生的事的概覽。 -+ -+ This is an overview of what will happen once you start the setup procedure. -+ 這是開始安裝後所會發生的事的概覽。 - - -- -- This is an overview of what will happen once you start the install procedure. -- 這是您開始安裝後所會發生的事的概覽。 -+ -+ This is an overview of what will happen once you start the install procedure. -+ 這是您開始安裝後所會發生的事的概覽。 - - -- -- Your username is too long. -- 您的使用者名稱太長了。 -+ -+ Your username is too long. -+ 您的使用者名稱太長了。 - - -- -- Your username must start with a lowercase letter or underscore. -- 您的使用者名稱必須以小寫字母或底線開頭。 -+ -+ Your username must start with a lowercase letter or underscore. -+ 您的使用者名稱必須以小寫字母或底線開頭。 - - -- -- Only lowercase letters, numbers, underscore and hyphen are allowed. -- 僅允許小寫字母、數字、底線與連接號。 -+ -+ Only lowercase letters, numbers, underscore and hyphen are allowed. -+ 僅允許小寫字母、數字、底線與連接號。 - - -- -- '%1' is not allowed as username. -- 「%1」無法作為使用者名稱。 -+ -+ '%1' is not allowed as username. -+ 「%1」無法作為使用者名稱。 - - -- -- Your hostname is too short. -- 您的主機名稱太短了。 -+ -+ Your hostname is too short. -+ 您的主機名稱太短了。 - - -- -- Your hostname is too long. -- 您的主機名稱太長了。 -+ -+ Your hostname is too long. -+ 您的主機名稱太長了。 - - -- -- '%1' is not allowed as hostname. -- 「%1」無法作為主機名稱。 -+ -+ '%1' is not allowed as hostname. -+ 「%1」無法作為主機名稱。 - - -- -- Only letters, numbers, underscore and hyphen are allowed. -- 僅允許字母、數字、底線與連接號。 -+ -+ Only letters, numbers, underscore and hyphen are allowed. -+ 僅允許字母、數字、底線與連接號。 - - -- -- Your passwords do not match! -- 密碼不符! -+ -+ Your passwords do not match! -+ 密碼不符! - - -- -- OK! -- 確定! -+ -+ OK! -+ 確定! - - -- -- This computer does not satisfy the minimum requirements for setting up %1.<br/>Setup cannot continue. -- 此電腦未滿足安裝 %1 的最低配備。<br/>安裝無法繼續。 -+ -+ This computer does not satisfy the minimum requirements for setting up %1.<br/>Setup cannot continue. -+ 此電腦未滿足安裝 %1 的最低配備。<br/>安裝無法繼續。 - - -- -- This computer does not satisfy the minimum requirements for installing %1.<br/>Installation cannot continue. -- 此電腦未滿足安裝 %1 的最低配備。<br/>安裝無法繼續。 -+ -+ This computer does not satisfy the minimum requirements for installing %1.<br/>Installation cannot continue. -+ 此電腦未滿足安裝 %1 的最低配備。<br/>安裝無法繼續。 - - -- -- This computer does not satisfy some of the recommended requirements for setting up %1.<br/>Setup can continue, but some features might be disabled. -- 此電腦未滿足一些安裝 %1 的推薦需求。<br/>設定可以繼續,但部份功能可能會被停用。 -+ -+ This computer does not satisfy some of the recommended requirements for setting up %1.<br/>Setup can continue, but some features might be disabled. -+ 此電腦未滿足一些安裝 %1 的推薦需求。<br/>設定可以繼續,但部份功能可能會被停用。 - - -- -- This computer does not satisfy some of the recommended requirements for installing %1.<br/>Installation can continue, but some features might be disabled. -- 此電腦未滿足一些安裝 %1 的推薦需求。<br/>安裝可以繼續,但部份功能可能會被停用。 -+ -+ This computer does not satisfy some of the recommended requirements for installing %1.<br/>Installation can continue, but some features might be disabled. -+ 此電腦未滿足一些安裝 %1 的推薦需求。<br/>安裝可以繼續,但部份功能可能會被停用。 - - -- -- This program will ask you some questions and set up %2 on your computer. -- 本程式會問您一些問題,然後在您的電腦安裝及設定 %2。 -+ This program will ask you some questions and set up %2 on your computer. -+ 本程式會問您一些問題,然後在您的電腦安裝及設定 %2。 - - -- -- <h1>Welcome to the Calamares setup program for %1</h1> -- <h1>歡迎使用 %1 的 Calamares 安裝程式</h1> -+ -+ <h1>Welcome to the Calamares setup program for %1</h1> -+ <h1>歡迎使用 %1 的 Calamares 安裝程式</h1> - - -- -- <h1>Welcome to %1 setup</h1> -- <h1>歡迎使用 %1 安裝程式</h1> -+ -+ <h1>Welcome to %1 setup</h1> -+ <h1>歡迎使用 %1 安裝程式</h1> - - -- -- <h1>Welcome to the Calamares installer for %1</h1> -- <h1>歡迎使用 %1 的 Calamares 安裝程式</h1> -+ -+ <h1>Welcome to the Calamares installer for %1</h1> -+ <h1>歡迎使用 %1 的 Calamares 安裝程式</h1> - - -- -- <h1>Welcome to the %1 installer</h1> -- <h1>歡迎使用 %1 安裝程式</h1> -+ -+ <h1>Welcome to the %1 installer</h1> -+ <h1>歡迎使用 %1 安裝程式</h1> - -- -- -+ -+ - ContextualProcessJob - -- -- Performing contextual processes' job… -- @status -- 正在執行情境流程任務…… -+ -+ Performing contextual processes' job… -+ @status -+ 正在執行情境流程任務…… - -- -- -+ -+ - CreatePartitionDialog - -- -- Create a Partition -- 建立一個分割區 -+ -+ Create a Partition -+ 建立一個分割區 - - -- -- Si&ze: -- 容量大小 (&z) : -+ -+ Si&ze: -+ 容量大小 (&z) : - - -- -- MiB -- MiB -+ -+ MiB -+ MiB - - -- -- Partition &Type: -- 分割區與類型 (&T): -+ -+ Partition &Type: -+ 分割區與類型 (&T): - - -- -- Primar&y -- 基本(&Y) -+ -+ Primar&y -+ 基本(&Y) - - -- -- E&xtended -- 延伸分割區 (&x) -+ -+ E&xtended -+ 延伸分割區 (&x) - - -- -- Fi&le System: -- 檔案系統 (&I): -+ -+ Fi&le System: -+ 檔案系統 (&I): - - -- -- LVM LV name -- LVM LV 名稱 -+ -+ LVM LV name -+ LVM LV 名稱 - - -- -- &Mount Point: -- 掛載點 (&M): -+ -+ &Mount Point: -+ 掛載點 (&M): - - -- -- Flags: -- 旗標: -+ -+ Flags: -+ 旗標: - - -- -- Label for the filesystem -- 檔案系統標籤 -+ -+ Label for the filesystem -+ 檔案系統標籤 - - -- -- FS Label: -- 檔案系統標籤: -+ -+ FS Label: -+ 檔案系統標籤: - - -- -- En&crypt -- @action -- 加密(&C) -+ -+ En&crypt -+ @action -+ 加密(&C) - - -- -- Logical -- @label -- 邏輯分割區 -+ -+ Logical -+ @label -+ 邏輯分割區 - - -- -- Primary -- @label -- 主要分割區 -+ -+ Primary -+ @label -+ 主要分割區 - - -- -- GPT -- @label -- GPT -+ -+ GPT -+ @label -+ GPT - - -- -- Mountpoint already in use. Please select another one. -- @info -- 掛載點使用中。請選擇其他的。 -+ -+ Mountpoint already in use. Please select another one. -+ @info -+ 掛載點使用中。請選擇其他的。 - - -- -- Mountpoint must start with a <tt>/</tt>. -- @info -- 掛載點必須以 <tt>/</tt> 開頭。 -+ -+ Mountpoint must start with a <tt>/</tt>. -+ @info -+ 掛載點必須以 <tt>/</tt> 開頭。 - -- -- -+ -+ - CreatePartitionJob - -- -- Create new %1MiB partition on %3 (%2) with entries %4 -- @title -- 在 %3 (%2) 上使用項目 %4 建立新的 %1MiB 分割區 -+ -+ Create new %1MiB partition on %3 (%2) with entries %4 -+ @title -+ 在 %3 (%2) 上使用項目 %4 建立新的 %1MiB 分割區 - - -- -- Create new %1MiB partition on %3 (%2) -- @title -- 在 %3 (%2) 上建立新的 %1MiB 分割區 -+ -+ Create new %1MiB partition on %3 (%2) -+ @title -+ 在 %3 (%2) 上建立新的 %1MiB 分割區 - - -- -- Create new %2MiB partition on %4 (%3) with file system %1 -- @title -- 使用檔案系統 %1 在 %4 (%3) 建立新的 %2MiB 分割區 -+ -+ Create new %2MiB partition on %4 (%3) with file system %1 -+ @title -+ 使用檔案系統 %1 在 %4 (%3) 建立新的 %2MiB 分割區 - - -- -- Create new <strong>%1MiB</strong> partition on <strong>%3</strong> (%2) with entries <em>%4</em> -- @info -- 在 <strong>%3</strong> (%2) 上使用項目 <em>%4</em> 建立新的 <strong>%1MiB</strong> 分割區 -+ -+ Create new <strong>%1MiB</strong> partition on <strong>%3</strong> (%2) with entries <em>%4</em> -+ @info -+ 在 <strong>%3</strong> (%2) 上使用項目 <em>%4</em> 建立新的 <strong>%1MiB</strong> 分割區 - - -- -- Create new <strong>%1MiB</strong> partition on <strong>%3</strong> (%2) -- @info -- 在 <strong>%3</strong> (%2) 上建立新的 <strong>%1MiB</strong> 分割區 -+ -+ Create new <strong>%1MiB</strong> partition on <strong>%3</strong> (%2) -+ @info -+ 在 <strong>%3</strong> (%2) 上建立新的 <strong>%1MiB</strong> 分割區 - - -- -- Create new <strong>%2MiB</strong> partition on <strong>%4</strong> (%3) with file system <strong>%1</strong> -- @info -- 使用檔案系統 <strong>%1</strong> 在 <strong>%4</strong> (%3) 建立新的 <strong>%2MiB</strong> 分割區 -+ -+ Create new <strong>%2MiB</strong> partition on <strong>%4</strong> (%3) with file system <strong>%1</strong> -+ @info -+ 使用檔案系統 <strong>%1</strong> 在 <strong>%4</strong> (%3) 建立新的 <strong>%2MiB</strong> 分割區 - - -- -- -- Creating new %1 partition on %2… -- @status -- 正在於 %2 建立新的 %1 分割區…… -+ -+ -+ Creating new %1 partition on %2… -+ @status -+ 正在於 %2 建立新的 %1 分割區…… - - -- -- The installer failed to create partition on disk '%1'. -- @info -- 安裝程式在磁碟 '%1' 上建立分割區失敗。 -+ -+ The installer failed to create partition on disk '%1'. -+ @info -+ 安裝程式在磁碟 '%1' 上建立分割區失敗。 - -- -- -+ -+ - CreatePartitionTableDialog - -- -- Create Partition Table -- 建立分割區表格 -+ -+ Create Partition Table -+ 建立分割區表格 - - -- -- Creating a new partition table will delete all existing data on the disk. -- 新增一個分割區表格將會刪除硬碟上所有已存在的資料 -+ -+ Creating a new partition table will delete all existing data on the disk. -+ 新增一個分割區表格將會刪除硬碟上所有已存在的資料 - - -- -- What kind of partition table do you want to create? -- 您想要建立哪一種分割區表格? -+ -+ What kind of partition table do you want to create? -+ 您想要建立哪一種分割區表格? - - -- -- Master Boot Record (MBR) -- 主要開機紀錄 (MBR) -+ -+ Master Boot Record (MBR) -+ 主要開機紀錄 (MBR) - - -- -- GUID Partition Table (GPT) -- GUID 分割區表格 (GPT) -+ -+ GUID Partition Table (GPT) -+ GUID 分割區表格 (GPT) - -- -- -+ -+ - CreatePartitionTableJob - -- -- -- Creating new %1 partition table on %2… -- @status -- 正在於 %2 建立新的 %1 分割表…… -+ -+ -+ Creating new %1 partition table on %2… -+ @status -+ 正在於 %2 建立新的 %1 分割表…… - - -- -- Creating new <strong>%1</strong> partition table on <strong>%2</strong> (%3)… -- @status -- 正在 <strong>%2</strong> (%3) 上建立新的 <strong>%1</strong> 分割表…… -+ -+ Creating new <strong>%1</strong> partition table on <strong>%2</strong> (%3)… -+ @status -+ 正在 <strong>%2</strong> (%3) 上建立新的 <strong>%1</strong> 分割表…… - - -- -- The installer failed to create a partition table on %1. -- 安裝程式在 %1 上建立分割區表格失敗。 -+ -+ The installer failed to create a partition table on %1. -+ 安裝程式在 %1 上建立分割區表格失敗。 - -- -- -+ -+ - CreateUserJob - -- -- Create user %1 -- 建立使用者 %1 -+ -+ Create user %1 -+ 建立使用者 %1 - - -- -- Create user <strong>%1</strong> -- 建立使用者 <strong>%1</strong> -+ -+ Create user <strong>%1</strong> -+ 建立使用者 <strong>%1</strong> - - -- -- -- Creating user %1… -- @status -- 正在建立使用者 %1…… -+ -+ -+ Creating user %1… -+ @status -+ 正在建立使用者 %1…… - - -- -- Preserving home directory… -- @status -- 保留家目錄…… -+ -+ Preserving home directory… -+ @status -+ 保留家目錄…… - - -- -- Configuring user %1 -- @status -- 正在設定使用者 %1 -+ -+ Configuring user %1 -+ @status -+ 正在設定使用者 %1 - - -- -- Setting file permissions… -- @status -- 正在設定檔案權限…… -+ -+ Setting file permissions… -+ @status -+ 正在設定檔案權限…… - -- -- -+ -+ - CreateVolumeGroupDialog - -- -- Create Volume Group -- @title -- 建立卷冊群組 -+ -+ Create Volume Group -+ @title -+ 建立卷冊群組 - -- -- -+ -+ - CreateVolumeGroupJob - -- -- -- Creating new volume group named %1… -- @status -- 正在建立名為 %1 的新卷冊群組…… -+ -+ -+ Creating new volume group named %1… -+ @status -+ 正在建立名為 %1 的新卷冊群組…… - - -- -- Creating new volume group named <strong>%1</strong>… -- @status -- 正在建立名為 <strong>%1</strong> 的新卷冊群組…… -+ -+ Creating new volume group named <strong>%1</strong>… -+ @status -+ 正在建立名為 <strong>%1</strong> 的新卷冊群組…… - - -- -- The installer failed to create a volume group named '%1'. -- 安裝程式建立名為「%1」的新卷冊群組失敗。 -+ -+ The installer failed to create a volume group named '%1'. -+ 安裝程式建立名為「%1」的新卷冊群組失敗。 - -- -- -+ -+ - DeactivateVolumeGroupJob - -- -- -- Deactivating volume group named %1… -- @status -- 正在停用名為 %1 的新卷冊群組…… -+ -+ -+ Deactivating volume group named %1… -+ @status -+ 正在停用名為 %1 的新卷冊群組…… - - -- -- Deactivating volume group named <strong>%1</strong>… -- @status -- 正在停用名為 <strong>%1</strong> 的新卷冊群組…… -+ -+ Deactivating volume group named <strong>%1</strong>… -+ @status -+ 正在停用名為 <strong>%1</strong> 的新卷冊群組…… - - -- -- The installer failed to deactivate a volume group named %1. -- 安裝程式停用名為「%1」的新卷冊群組失敗。 -+ -+ The installer failed to deactivate a volume group named %1. -+ 安裝程式停用名為「%1」的新卷冊群組失敗。 - -- -- -+ -+ - DeletePartitionJob - -- -- -- Deleting partition %1… -- @status -- 正在刪除分割區 %1…… -+ -+ -+ Deleting partition %1… -+ @status -+ 正在刪除分割區 %1…… - - -- -- Deleting partition <strong>%1</strong>… -- @status -- 正在刪除分割區 <strong>%1</strong>…… -+ -+ Deleting partition <strong>%1</strong>… -+ @status -+ 正在刪除分割區 <strong>%1</strong>…… - - -- -- The installer failed to delete partition %1. -- 安裝程式刪除分割區 %1 失敗。 -+ -+ The installer failed to delete partition %1. -+ 安裝程式刪除分割區 %1 失敗。 - -- -- -+ -+ - DeviceInfoWidget - -- -- <br><br>This partition table type is only advisable on older systems which start from a <strong>BIOS</strong> boot environment. GPT is recommended in most other cases.<br><br><strong>Warning:</strong> the MBR partition table is an obsolete MS-DOS era standard.<br>Only 4 <em>primary</em> partitions may be created, and of those 4, one can be an <em>extended</em> partition, which may in turn contain many <em>logical</em> partitions. -- <br><br>建議這個分割表類型只在以 <strong>BIOS</strong> 開機的舊系統使用。其他大多數情況建議使用 GPT。<br><strong>警告:</strong>MBR 分割表是已過時、源自 MS-DOS 時代的標準。<br>最多只能建立 4 個<em>主要</em>分割區;其中一個可以是<em>延伸</em>分割區,其可以包含許多<em>邏輯</em>分割區。 -+ -+ <br><br>This partition table type is only advisable on older systems which start from a <strong>BIOS</strong> boot environment. GPT is recommended in most other cases.<br><br><strong>Warning:</strong> the MBR partition table is an obsolete MS-DOS era standard.<br>Only 4 <em>primary</em> partitions may be created, and of those 4, one can be an <em>extended</em> partition, which may in turn contain many <em>logical</em> partitions. -+ <br><br>建議這個分割表類型只在以 <strong>BIOS</strong> 開機的舊系統使用。其他大多數情況建議使用 GPT。<br><strong>警告:</strong>MBR 分割表是已過時、源自 MS-DOS 時代的標準。<br>最多只能建立 4 個<em>主要</em>分割區;其中一個可以是<em>延伸</em>分割區,其可以包含許多<em>邏輯</em>分割區。 - - -- -- <br><br>This is the recommended partition table type for modern systems which start from an <strong>EFI</strong> boot environment. -- <br><br>這是對 <strong>EFI</strong> 開機環境而言的現代系統建議分割表類型。 -+ -+ <br><br>This is the recommended partition table type for modern systems which start from an <strong>EFI</strong> boot environment. -+ <br><br>這是對 <strong>EFI</strong> 開機環境而言的現代系統建議分割表類型。 - - -- -- This is a <strong>loop</strong> device.<br><br>It is a pseudo-device with no partition table that makes a file accessible as a block device. This kind of setup usually only contains a single filesystem. -- 這是一個 <strong>迴圈</strong> 裝置。<br><br>它是一個沒有分割表,但讓檔案可以被像塊裝置一樣存取的偽裝置。此種設定通常只包含一個單一的檔案系統。 -+ -+ This is a <strong>loop</strong> device.<br><br>It is a pseudo-device with no partition table that makes a file accessible as a block device. This kind of setup usually only contains a single filesystem. -+ 這是一個 <strong>迴圈</strong> 裝置。<br><br>它是一個沒有分割表,但讓檔案可以被像塊裝置一樣存取的偽裝置。此種設定通常只包含一個單一的檔案系統。 - - -- -- This installer <strong>cannot detect a partition table</strong> on the selected storage device.<br><br>The device either has no partition table, or the partition table is corrupted or of an unknown type.<br>This installer can create a new partition table for you, either automatically, or through the manual partitioning page. -- 本安裝程式在選定的儲存裝置上<strong>偵測不到分割表</strong>。<br><br>此裝置要不是沒有分割表,就是其分割表已毀損又或者是一個未知類型的分割表。<br>本安裝程式將會為您建立一個新的分割表,不論是自動或是透過手動分割頁面。 -+ -+ This installer <strong>cannot detect a partition table</strong> on the selected storage device.<br><br>The device either has no partition table, or the partition table is corrupted or of an unknown type.<br>This installer can create a new partition table for you, either automatically, or through the manual partitioning page. -+ 本安裝程式在選定的儲存裝置上<strong>偵測不到分割表</strong>。<br><br>此裝置要不是沒有分割表,就是其分割表已毀損又或者是一個未知類型的分割表。<br>本安裝程式將會為您建立一個新的分割表,不論是自動或是透過手動分割頁面。 - - -- -- This device has a <strong>%1</strong> partition table. -- 此裝置已有 <strong>%1</strong> 分割表。 -+ -+ This device has a <strong>%1</strong> partition table. -+ 此裝置已有 <strong>%1</strong> 分割表。 - - -- -- The type of <strong>partition table</strong> on the selected storage device.<br><br>The only way to change the partition table type is to erase and recreate the partition table from scratch, which destroys all data on the storage device.<br>This installer will keep the current partition table unless you explicitly choose otherwise.<br>If unsure, on modern systems GPT is preferred. -- 選定的儲存裝置的<strong>分割表</strong>類型。<br><br>變更分割表的唯一方法,就是抹除再重新從頭建立分割表,這會破壞在該儲存裝置所有的資料。<br>除非特別選擇,否則本安裝程式會保留目前的分割表。<br>若不確定,現時的系統建議使用 GPT。 -+ -+ The type of <strong>partition table</strong> on the selected storage device.<br><br>The only way to change the partition table type is to erase and recreate the partition table from scratch, which destroys all data on the storage device.<br>This installer will keep the current partition table unless you explicitly choose otherwise.<br>If unsure, on modern systems GPT is preferred. -+ 選定的儲存裝置的<strong>分割表</strong>類型。<br><br>變更分割表的唯一方法,就是抹除再重新從頭建立分割表,這會破壞在該儲存裝置所有的資料。<br>除非特別選擇,否則本安裝程式會保留目前的分割表。<br>若不確定,現時的系統建議使用 GPT。 - -- -- -+ -+ - DeviceModel - -- -- %1 - %2 (%3) -- device[name] - size[number] (device-node[name]) -- %1 - %2 (%3) -+ -+ %1 - %2 (%3) -+ device[name] - size[number] (device-node[name]) -+ %1 - %2 (%3) - - -- -- %1 - (%2) -- device[name] - (device-node[name]) -- %1 - (%2) -+ -+ %1 - (%2) -+ device[name] - (device-node[name]) -+ %1 - (%2) - -- -- -+ -+ - DracutLuksCfgJob - -- -- Writing LUKS configuration for Dracut to %1… -- @status -- 正為 Dracut 寫入 LUKS 設定到 %1…… -+ -+ Writing LUKS configuration for Dracut to %1… -+ @status -+ 正為 Dracut 寫入 LUKS 設定到 %1…… - - -- -- Skipping writing LUKS configuration for Dracut: "/" partition is not encrypted -- @info -- 正在跳過為 Dracut 寫入 LUKS 設定:"/" 分割區未加密 -+ -+ Skipping writing LUKS configuration for Dracut: "/" partition is not encrypted -+ @info -+ 正在跳過為 Dracut 寫入 LUKS 設定:"/" 分割區未加密 - - -- -- Failed to open %1 -- @error -- 開啟 %1 失敗 -+ -+ Failed to open %1 -+ @error -+ 開啟 %1 失敗 - -- -- -+ -+ - DummyCppJob - -- -- Performing dummy C++ job… -- @status -- 正在執行虛擬 C++ 任務…… -+ -+ Performing dummy C++ job… -+ @status -+ 正在執行虛擬 C++ 任務…… - -- -- -+ -+ - EditExistingPartitionDialog - -- -- Edit Existing Partition -- 編輯已經存在的分割區 -+ -+ Edit Existing Partition -+ 編輯已經存在的分割區 - - -- -- Con&tent: -- 內容:(&T) -+ -+ Con&tent: -+ 內容:(&T) - - -- -- &Keep -- 保留(&K) -+ -+ &Keep -+ 保留(&K) - - -- -- Format -- 格式化 -+ -+ Format -+ 格式化 - - -- -- Warning: Formatting the partition will erase all existing data. -- 警告:格式化該分割區換抹除所有已存在的資料。 -+ -+ Warning: Formatting the partition will erase all existing data. -+ 警告:格式化該分割區換抹除所有已存在的資料。 - - -- -- &Mount Point: -- 掛載點 (&M): -+ -+ &Mount Point: -+ 掛載點 (&M): - - -- -- Si&ze: -- 容量大小 (&Z) : -+ -+ Si&ze: -+ 容量大小 (&Z) : - - -- -- MiB -- MiB -+ -+ MiB -+ MiB - - -- -- Fi&le System: -- 檔案系統 (&I): -+ -+ Fi&le System: -+ 檔案系統 (&I): - - -- -- Flags: -- 旗標: -+ -+ Flags: -+ 旗標: - - -- -- Label for the filesystem -- 檔案系統標籤 -+ -+ Label for the filesystem -+ 檔案系統標籤 - - -- -- FS Label: -- 檔案系統標籤: -+ -+ FS Label: -+ 檔案系統標籤: - - -- -- Passphrase for existing partition -- 既有分割區的密碼 -+ -+ Passphrase for existing partition -+ 既有分割區的密碼 - - -- -- Partition %1 could not be decrypted with the given passphrase.<br/><br/>Edit the partition again and give the correct passphrase or delete and create a new encrypted partition. -- 分割區 %1 無法使用給予的密碼解密。<br/><br/>再次編輯分割區並給予正確的密碼或刪除並建立新的加密分割區。 -+ -+ Partition %1 could not be decrypted with the given passphrase.<br/><br/>Edit the partition again and give the correct passphrase or delete and create a new encrypted partition. -+ 分割區 %1 無法使用給予的密碼解密。<br/><br/>再次編輯分割區並給予正確的密碼或刪除並建立新的加密分割區。 - -- -- -+ -+ - EncryptWidget - -- -- En&crypt system -- 加密系統(&C) -+ -+ En&crypt system -+ 加密系統(&C) - - -- -- Your system does not seem to support encryption well enough to encrypt the entire system. You may enable encryption, but performance may suffer. -- 您的系統對加密的支援似乎不夠好,無法加密整個系統。您可以啟用加密,但效能可能會受到影響。 -+ -+ Your system does not seem to support encryption well enough to encrypt the entire system. You may enable encryption, but performance may suffer. -+ 您的系統對加密的支援似乎不夠好,無法加密整個系統。您可以啟用加密,但效能可能會受到影響。 - - -- -- Passphrase -- 通關密語 -+ -+ Passphrase -+ 通關密語 - - -- -- Confirm passphrase -- 確認通關密語 -+ -+ Confirm passphrase -+ 確認通關密語 - - -- -- -- Please enter the same passphrase in both boxes. -- @tooltip -- 請在兩個框框中輸入相同的通關密語。 -+ -+ -+ Please enter the same passphrase in both boxes. -+ @tooltip -+ 請在兩個框框中輸入相同的通關密語。 - - -- -- Password must be a minimum of %1 characters. -- @tooltip -- 密碼最少必須 %1 個字元。 -+ -+ Password must be a minimum of %1 characters. -+ @tooltip -+ 密碼最少必須 %1 個字元。 - -- -- -+ -+ - ErrorDialog - -- -- Details: -- 詳細資訊: -+ -+ Details: -+ 詳細資訊: - - -- -- Would you like to paste the install log to the web? -- 想要將安裝紀錄檔貼到網路上嗎? -+ -+ Would you like to paste the install log to the web? -+ 想要將安裝紀錄檔貼到網路上嗎? - -- -- -+ -+ - FillGlobalStorageJob - -- -- Set partition information -- @title -- 設定分割區資訊 -+ -+ Set partition information -+ @title -+ 設定分割區資訊 - - -- -- Install %1 on <strong>new</strong> %2 system partition with features <em>%3</em> -- @info -- 在有 <em>%3</em> 功能的<strong>新</strong> %2 系統分割區上安裝 %1 -+ -+ Install %1 on <strong>new</strong> %2 system partition with features <em>%3</em> -+ @info -+ 在有 <em>%3</em> 功能的<strong>新</strong> %2 系統分割區上安裝 %1 - - -- -- Install %1 on <strong>new</strong> %2 system partition -- @info -- 在 <strong>新的</strong>系統分割區 %2 上安裝 %1 -+ -+ Install %1 on <strong>new</strong> %2 system partition -+ @info -+ 在 <strong>新的</strong>系統分割區 %2 上安裝 %1 - - -- -- Set up <strong>new</strong> %2 partition with mount point <strong>%1</strong> and features <em>%3</em> -- @info -- 設定有掛載點 <strong>%1</strong> 與 <em>%3</em> 的<strong>新</strong> %2 分割區 -+ -+ Set up <strong>new</strong> %2 partition with mount point <strong>%1</strong> and features <em>%3</em> -+ @info -+ 設定有掛載點 <strong>%1</strong> 與 <em>%3</em> 的<strong>新</strong> %2 分割區 - - -- -- Set up <strong>new</strong> %2 partition with mount point <strong>%1</strong>%3 -- @info -- 設定有掛載點 <strong>%1</strong> %3 的<strong>新</strong> %2 分割區 -+ -+ Set up <strong>new</strong> %2 partition with mount point <strong>%1</strong>%3 -+ @info -+ 設定有掛載點 <strong>%1</strong> %3 的<strong>新</strong> %2 分割區 - - -- -- Install %2 on %3 system partition <strong>%1</strong> with features <em>%4</em> -- @info -- 在有功能 <em>%4</em> 的 %3 系統分割區 <strong>%1</strong> 上安裝 %2 -+ -+ Install %2 on %3 system partition <strong>%1</strong> with features <em>%4</em> -+ @info -+ 在有功能 <em>%4</em> 的 %3 系統分割區 <strong>%1</strong> 上安裝 %2 - - -- -- Install %2 on %3 system partition <strong>%1</strong> -- @info -- 在 %3 系統分割區 <strong>%1</strong> 上安裝 %2 -+ -+ Install %2 on %3 system partition <strong>%1</strong> -+ @info -+ 在 %3 系統分割區 <strong>%1</strong> 上安裝 %2 - - -- -- Set up %3 partition <strong>%1</strong> with mount point <strong>%2</strong> and features <em>%4</em> -- @info -- 為分割區 %3 <strong>%1</strong> 設定掛載點 <strong>%2</strong> 與功能 <em>%4</em> -+ -+ Set up %3 partition <strong>%1</strong> with mount point <strong>%2</strong> and features <em>%4</em> -+ @info -+ 為分割區 %3 <strong>%1</strong> 設定掛載點 <strong>%2</strong> 與功能 <em>%4</em> - - -- -- Set up %3 partition <strong>%1</strong> with mount point <strong>%2</strong>%4… -- @info -- 為分割區 %3 <strong>%1</strong> 設定掛載點 <strong>%2</strong> %4…… -+ -+ Set up %3 partition <strong>%1</strong> with mount point <strong>%2</strong>%4… -+ @info -+ 為分割區 %3 <strong>%1</strong> 設定掛載點 <strong>%2</strong> %4…… - - -- -- Install boot loader on <strong>%1</strong>… -- @info -- 在 <strong>%1</strong> 安裝開機載入程式…… -+ -+ Install boot loader on <strong>%1</strong>… -+ @info -+ 在 <strong>%1</strong> 安裝開機載入程式…… - - -- -- Setting up mount points… -- @status -- 設定掛載點…… -+ -+ Setting up mount points… -+ @status -+ 設定掛載點…… - -- -- -+ -+ - FinishedPage - -- -- &Restart now -- 現在重新啟動 (&R) -+ -+ &Restart now -+ 現在重新啟動 (&R) - - -- -- <h1>All done.</h1><br/>%1 has been set up on your computer.<br/>You may now start using your new system. -- @info -- <h1>都完成了。</h1><br/>%1 已經在您的電腦上設定好了。<br/>您現在可能會想要開始使用您的新系統。 -+ -+ <h1>All done.</h1><br/>%1 has been set up on your computer.<br/>You may now start using your new system. -+ @info -+ <h1>都完成了。</h1><br/>%1 已經在您的電腦上設定好了。<br/>您現在可能會想要開始使用您的新系統。 - - -- -- <html><head/><body><p>When this box is checked, your system will restart immediately when you click on <span style="font-style:italic;">Done</span> or close the setup program.</p></body></html> -- @tooltip -- <html><head/><body><p>當這個勾選框被選取時,您的系統將會在按下<span style="font-style:italic;">完成</span>或關閉設定程式時立刻重新啟動。</p></body></html> -+ -+ <html><head/><body><p>When this box is checked, your system will restart immediately when you click on <span style="font-style:italic;">Done</span> or close the setup program.</p></body></html> -+ @tooltip -+ <html><head/><body><p>當這個勾選框被選取時,您的系統將會在按下<span style="font-style:italic;">完成</span>或關閉設定程式時立刻重新啟動。</p></body></html> - - -- -- <h1>All done.</h1><br/>%1 has been installed on your computer.<br/>You may now restart into your new system, or continue using the %2 Live environment. -- @info -- <h1>都完成了。</h1><br/>%1 已經安裝在您的電腦上了。<br/>您現在可能會想要重新啟動到您的新系統中,或是繼續使用 %2 Live 環境。 -+ -+ <h1>All done.</h1><br/>%1 has been installed on your computer.<br/>You may now restart into your new system, or continue using the %2 Live environment. -+ @info -+ <h1>都完成了。</h1><br/>%1 已經安裝在您的電腦上了。<br/>您現在可能會想要重新啟動到您的新系統中,或是繼續使用 %2 Live 環境。 - - -- -- <html><head/><body><p>When this box is checked, your system will restart immediately when you click on <span style="font-style:italic;">Done</span> or close the installer.</p></body></html> -- @tooltip -- <html><head/><body><p>當這個勾選框被選取時,您的系統將會在按下<span style="font-style:italic;">完成</span>或關閉安裝程式時立刻重新啟動。</p></body></html> -+ -+ <html><head/><body><p>When this box is checked, your system will restart immediately when you click on <span style="font-style:italic;">Done</span> or close the installer.</p></body></html> -+ @tooltip -+ <html><head/><body><p>當這個勾選框被選取時,您的系統將會在按下<span style="font-style:italic;">完成</span>或關閉安裝程式時立刻重新啟動。</p></body></html> - - -- -- <h1>Setup Failed</h1><br/>%1 has not been set up on your computer.<br/>The error message was: %2. -- @info, %1 is product name with version -- <h1>設定失敗</h1><br/>%1 並未在您的電腦設定好。<br/>錯誤訊息為:%2。 -+ -+ <h1>Setup Failed</h1><br/>%1 has not been set up on your computer.<br/>The error message was: %2. -+ @info, %1 is product name with version -+ <h1>設定失敗</h1><br/>%1 並未在您的電腦設定好。<br/>錯誤訊息為:%2。 - - -- -- <h1>Installation Failed</h1><br/>%1 has not been installed on your computer.<br/>The error message was: %2. -- @info, %1 is product name with version -- <h1>安裝失敗</h1><br/>%1 並未安裝到您的電腦上。<br/>錯誤訊息為:%2。 -+ -+ <h1>Installation Failed</h1><br/>%1 has not been installed on your computer.<br/>The error message was: %2. -+ @info, %1 is product name with version -+ <h1>安裝失敗</h1><br/>%1 並未安裝到您的電腦上。<br/>錯誤訊息為:%2。 - -- -- -+ -+ - FinishedQmlViewStep - -- -- Finish -- @label -- 完成 -+ -+ Finish -+ @label -+ 完成 - -- -- -+ -+ - FinishedViewStep - -- -- Finish -- @label -- 完成 -+ -+ Finish -+ @label -+ 完成 - -- -- -+ -+ - FormatPartitionJob - -- -- Format partition %1 (file system: %2, size: %3 MiB) on %4 -- @title -- 格式化分割區 %1(檔案系統:%2,大小:%3 MiB)在 %4 -+ -+ Format partition %1 (file system: %2, size: %3 MiB) on %4 -+ @title -+ 格式化分割區 %1(檔案系統:%2,大小:%3 MiB)在 %4 - - -- -- Format <strong>%3MiB</strong> partition <strong>%1</strong> with file system <strong>%2</strong> -- @info -- 格式化 <strong>%3MiB</strong> 分割區 <strong>%1</strong>,使用檔案系統 <strong>%2</strong> -+ -+ Format <strong>%3MiB</strong> partition <strong>%1</strong> with file system <strong>%2</strong> -+ @info -+ 格式化 <strong>%3MiB</strong> 分割區 <strong>%1</strong>,使用檔案系統 <strong>%2</strong> - - -- -- %1 (%2) -- partition label %1 (device path %2) -- %1 (%2) -+ -+ %1 (%2) -+ partition label %1 (device path %2) -+ %1 (%2) - - -- -- Formatting partition %1 with file system %2… -- @status -- 正在以 %2 檔案系統格式化分割區 %1…… -+ -+ Formatting partition %1 with file system %2… -+ @status -+ 正在以 %2 檔案系統格式化分割區 %1…… - - -- -- The installer failed to format partition %1 on disk '%2'. -- 安裝程式格式化在磁碟 '%2' 上的分割區 %1 失敗。 -+ -+ The installer failed to format partition %1 on disk '%2'. -+ 安裝程式格式化在磁碟 '%2' 上的分割區 %1 失敗。 - -- -- -+ -+ - GeneralRequirements - -- -- Please ensure the system has at least %1 GiB available drive space. -- 請確保系統有至少 %1 GiB 的可用磁碟空間。 -+ -+ Please ensure the system has at least %1 GiB available drive space. -+ 請確保系統有至少 %1 GiB 的可用磁碟空間。 - - -- -- Available drive space is all of the hard disks and SSDs connected to the system. -- 可用磁碟空間是連結到系統的所有硬碟與 SSD。 -+ -+ Available drive space is all of the hard disks and SSDs connected to the system. -+ 可用磁碟空間是連結到系統的所有硬碟與 SSD。 - - -- -- There is not enough drive space. At least %1 GiB is required. -- 沒有足夠的磁碟空間。至少需要 %1 GiB。 -+ -+ There is not enough drive space. At least %1 GiB is required. -+ 沒有足夠的磁碟空間。至少需要 %1 GiB。 - - -- -- has at least %1 GiB working memory -- 有至少 %1 GiB 的可用記憶體 -+ -+ has at least %1 GiB working memory -+ 有至少 %1 GiB 的可用記憶體 - - -- -- The system does not have enough working memory. At least %1 GiB is required. -- 系統沒有足夠的記憶體。至少需要 %1 GiB。 -+ -+ The system does not have enough working memory. At least %1 GiB is required. -+ 系統沒有足夠的記憶體。至少需要 %1 GiB。 - - -- -- is plugged in to a power source -- 已插入外接電源 -+ -+ is plugged in to a power source -+ 已插入外接電源 - - -- -- The system is not plugged in to a power source. -- 系統未插入外接電源。 -+ -+ The system is not plugged in to a power source. -+ 系統未插入外接電源。 - - -- -- is connected to the Internet -- 已連上網際網路 -+ -+ is connected to the Internet -+ 已連上網際網路 - - -- -- The system is not connected to the Internet. -- 系統未連上網際網路 -+ -+ The system is not connected to the Internet. -+ 系統未連上網際網路 - - -- -- is running the installer as an administrator (root) -- 以管理員 (root) 權限執行安裝程式 -+ -+ is running the installer as an administrator (root) -+ 以管理員 (root) 權限執行安裝程式 - - -- -- The setup program is not running with administrator rights. -- 設定程式並未以管理員權限執行。 -+ -+ The setup program is not running with administrator rights. -+ 設定程式並未以管理員權限執行。 - - -- -- The installer is not running with administrator rights. -- 安裝程式並未以管理員權限執行。 -+ -+ The installer is not running with administrator rights. -+ 安裝程式並未以管理員權限執行。 - - -- -- has a screen large enough to show the whole installer -- 螢幕夠大,可以顯示整個安裝程式 -+ -+ has a screen large enough to show the whole installer -+ 螢幕夠大,可以顯示整個安裝程式 - - -- -- The screen is too small to display the setup program. -- 螢幕太小了,沒辦法顯示設定程式。 -+ -+ The screen is too small to display the setup program. -+ 螢幕太小了,沒辦法顯示設定程式。 - - -- -- The screen is too small to display the installer. -- 螢幕太小了,沒辦法顯示安裝程式。 -+ -+ The screen is too small to display the installer. -+ 螢幕太小了,沒辦法顯示安裝程式。 - - -- -- is always false -- 一律為 false -+ -+ is always false -+ 一律為 false - - -- -- The computer says no. -- 電腦說否。 -+ -+ The computer says no. -+ 電腦說否。 - - -- -- is always false (slowly) -- 一律為 false(慢) -+ -+ is always false (slowly) -+ 一律為 false(慢) - - -- -- The computer says no (slowly). -- 電腦說否(慢)。 -+ -+ The computer says no (slowly). -+ 電腦說否(慢)。 - - -- -- is always true -- 一律為 true -+ -+ is always true -+ 一律為 true - - -- -- The computer says yes. -- 電腦說是。 -+ -+ The computer says yes. -+ 電腦說是。 - - -- -- is always true (slowly) -- 一律為 true(慢) -+ -+ is always true (slowly) -+ 一律為 true(慢) - - -- -- The computer says yes (slowly). -- 電腦說是(慢)。 -+ -+ The computer says yes (slowly). -+ 電腦說是(慢)。 - - -- -- is checked three times. -- 被檢查了三次。 -+ -+ is checked three times. -+ 被檢查了三次。 - - -- -- The snark has not been checked three times. -- The (some mythological beast) has not been checked three times. -- snark 並未檢查三次。 -+ -+ The snark has not been checked three times. -+ The (some mythological beast) has not been checked three times. -+ snark 並未檢查三次。 - -- -- -+ -+ - HostInfoJob - -- -- Collecting information about your machine… -- @status -- 正在蒐集關於您機器的資訊…… -+ -+ Collecting information about your machine… -+ @status -+ 正在蒐集關於您機器的資訊…… - -- -- -+ -+ - IDJob - -- -- -- -- -- OEM Batch Identifier -- OEM 批次識別記號 -+ -+ -+ -+ -+ OEM Batch Identifier -+ OEM 批次識別記號 - - -- -- Could not create directories <code>%1</code>. -- 無法建立目錄 <code>%1</code>。 -+ -+ Could not create directories <code>%1</code>. -+ 無法建立目錄 <code>%1</code>。 - - -- -- Could not open file <code>%1</code>. -- 無法開啟檔案 <code>%1</code>。 -+ -+ Could not open file <code>%1</code>. -+ 無法開啟檔案 <code>%1</code>。 - - -- -- Could not write to file <code>%1</code>. -- 無法寫入至檔案 <code>%1</code>。 -+ -+ Could not write to file <code>%1</code>. -+ 無法寫入至檔案 <code>%1</code>。 - -- -- -+ -+ - InitcpioJob - -- -- Creating initramfs with mkinitcpio… -- @status -- 正在使用 mkinitcpio 建立 initramfs…… -+ -+ Creating initramfs with mkinitcpio… -+ @status -+ 正在使用 mkinitcpio 建立 initramfs…… - -- -- -+ -+ - InitramfsJob - -- -- Creating initramfs… -- @status -- 正在建立 initramfs…… -+ -+ Creating initramfs… -+ @status -+ 正在建立 initramfs…… - -- -- -+ -+ - InteractiveTerminalPage - -- -- Konsole not installed. -- @error -- 未安裝 Konsole。 -+ -+ Konsole not installed. -+ @error -+ 未安裝 Konsole。 - - -- -- Please install KDE Konsole and try again! -- @info -- 請安裝 KDE Konsole 並再試一次! -+ -+ Please install KDE Konsole and try again! -+ @info -+ 請安裝 KDE Konsole 並再試一次! - - -- -- Executing script: &nbsp;<code>%1</code> -- @info -- 正在執行指令稿:&nbsp;<code>%1</code> -+ -+ Executing script: &nbsp;<code>%1</code> -+ @info -+ 正在執行指令稿:&nbsp;<code>%1</code> - -- -- -+ -+ - InteractiveTerminalViewStep - -- -- Script -- @label -- 指令稿 -+ -+ Script -+ @label -+ 指令稿 - -- -- -+ -+ - KeyboardQmlViewStep - -- -- Keyboard -- @label -- 鍵盤 -+ -+ Keyboard -+ @label -+ 鍵盤 - -- -- -+ -+ - KeyboardViewStep - -- -- Keyboard -- @label -- 鍵盤 -+ -+ Keyboard -+ @label -+ 鍵盤 - -- -- -+ -+ - LCLocaleDialog - -- -- System Locale Setting -- @title -- 系統語系設定 -+ -+ System Locale Setting -+ @title -+ 系統語系設定 - - -- -- The system locale setting affects the language and character set for some command line user interface elements.<br/>The current setting is <strong>%1</strong>. -- @info -- 系統語系設定會影響部份命令列使用者介面的語言及字元集。<br/>目前的設定為 <strong>%1</strong>。 -+ -+ The system locale setting affects the language and character set for some command line user interface elements.<br/>The current setting is <strong>%1</strong>. -+ @info -+ 系統語系設定會影響部份命令列使用者介面的語言及字元集。<br/>目前的設定為 <strong>%1</strong>。 - - -- -- &Cancel -- @button -- 取消(&C) -+ -+ &Cancel -+ @button -+ 取消(&C) - - -- -- &OK -- @button -- 確定(&O) -+ -+ &OK -+ @button -+ 確定(&O) - -- -- -+ -+ - LOSHJob - -- -- Configuring encrypted swap. -- 正在設定已加密的 swap。 -+ -+ Configuring encrypted swap. -+ 正在設定已加密的 swap。 - - -- -- No target system available. -- 沒有可用的目標系統。 -+ -+ No target system available. -+ 沒有可用的目標系統。 - - -- -- No rootMountPoint is set. -- 未設定 rootMountPoint。 -+ -+ No rootMountPoint is set. -+ 未設定 rootMountPoint。 - - -- -- No configFilePath is set. -- 未設定 configFilePath。 -+ -+ No configFilePath is set. -+ 未設定 configFilePath。 - -- -- -+ -+ - LicensePage - -- -- <h1>License Agreement</h1> -- <h1>授權條款</h1> -+ -+ <h1>License Agreement</h1> -+ <h1>授權條款</h1> - - -- -- I accept the terms and conditions above. -- @info -- 我接受上述的條款與條件。 -+ -+ I accept the terms and conditions above. -+ @info -+ 我接受上述的條款與條件。 - - -- -- Please review the End User License Agreements (EULAs). -- @info -- 請審閱終端使用者授權條款 (EULAs)。 -+ -+ Please review the End User License Agreements (EULAs). -+ @info -+ 請審閱終端使用者授權條款 (EULAs)。 - - -- -- This setup procedure will install proprietary software that is subject to licensing terms. -- @info -- 此設定過程將會安裝需要同意其授權條款的專有軟體。 -+ -+ This setup procedure will install proprietary software that is subject to licensing terms. -+ @info -+ 此設定過程將會安裝需要同意其授權條款的專有軟體。 - - -- -- If you do not agree with the terms, the setup procedure cannot continue. -- @info -- 如果您不同意此條款,安裝程序就無法繼續。 -+ -+ If you do not agree with the terms, the setup procedure cannot continue. -+ @info -+ 如果您不同意此條款,安裝程序就無法繼續。 - - -- -- This setup procedure can install proprietary software that is subject to licensing terms in order to provide additional features and enhance the user experience. -- @info -- 此設定過程會安裝需要同意授權條款的專有軟體以提供附加功能並強化使用者體驗。 -+ -+ This setup procedure can install proprietary software that is subject to licensing terms in order to provide additional features and enhance the user experience. -+ @info -+ 此設定過程會安裝需要同意授權條款的專有軟體以提供附加功能並強化使用者體驗。 - - -- -- If you do not agree with the terms, proprietary software will not be installed, and open source alternatives will be used instead. -- @info -- 如果您不同意條款,就不會安裝專有軟體,而將會使用開放原始碼的替代方案。 -+ -+ If you do not agree with the terms, proprietary software will not be installed, and open source alternatives will be used instead. -+ @info -+ 如果您不同意條款,就不會安裝專有軟體,而將會使用開放原始碼的替代方案。 - -- -- -+ -+ - LicenseViewStep - -- -- License -- @label -- 授權條款 -+ -+ License -+ @label -+ 授權條款 - -- -- -+ -+ - LicenseWidget - -- -- URL: %1 -- @label -- URL:%1 -+ -+ URL: %1 -+ @label -+ URL:%1 - - -- -- <strong>%1 driver</strong><br/>by %2 -- @label, %1 is product name, %2 is product vendor -- %1 is an untranslatable product name, example: Creative Audigy driver -- <strong>%1 驅動程式</strong><br/>由 %2 所提供 -+ -+ <strong>%1 driver</strong><br/>by %2 -+ @label, %1 is product name, %2 is product vendor -+ %1 is an untranslatable product name, example: Creative Audigy driver -+ <strong>%1 驅動程式</strong><br/>由 %2 所提供 - - -- -- <strong>%1 graphics driver</strong><br/><font color="Grey">by %2</font> -- @label, %1 is product name, %2 is product vendor -- %1 is usually a vendor name, example: Nvidia graphics driver -- <strong>%1 顯示卡驅動程式</strong><br/><font color="Grey">由 %2 所提供</font> -+ -+ <strong>%1 graphics driver</strong><br/><font color="Grey">by %2</font> -+ @label, %1 is product name, %2 is product vendor -+ %1 is usually a vendor name, example: Nvidia graphics driver -+ <strong>%1 顯示卡驅動程式</strong><br/><font color="Grey">由 %2 所提供</font> - - -- -- <strong>%1 browser plugin</strong><br/><font color="Grey">by %2</font> -- @label, %1 is product name, %2 is product vendor -- <strong>%1 瀏覽器外掛程式</strong><br/><font color="Grey">由 %2 所提供</font> -+ -+ <strong>%1 browser plugin</strong><br/><font color="Grey">by %2</font> -+ @label, %1 is product name, %2 is product vendor -+ <strong>%1 瀏覽器外掛程式</strong><br/><font color="Grey">由 %2 所提供</font> - - -- -- <strong>%1 codec</strong><br/><font color="Grey">by %2</font> -- @label, %1 is product name, %2 is product vendor -- <strong>%1 編解碼器</strong><br/><font color="Grey">由 %2 所提供</font> -+ -+ <strong>%1 codec</strong><br/><font color="Grey">by %2</font> -+ @label, %1 is product name, %2 is product vendor -+ <strong>%1 編解碼器</strong><br/><font color="Grey">由 %2 所提供</font> - - -- -- <strong>%1 package</strong><br/><font color="Grey">by %2</font> -- @label, %1 is product name, %2 is product vendor -- <strong>%1 軟體包</strong><br/><font color="Grey">由 %2 所提供</font> -+ -+ <strong>%1 package</strong><br/><font color="Grey">by %2</font> -+ @label, %1 is product name, %2 is product vendor -+ <strong>%1 軟體包</strong><br/><font color="Grey">由 %2 所提供</font> - - -- -- <strong>%1</strong><br/><font color="Grey">by %2</font> -- @label, %1 is product name, %2 is product vendor -- <strong>%1</strong><br/><font color="Grey">由 %2 所提供</font> -+ -+ <strong>%1</strong><br/><font color="Grey">by %2</font> -+ @label, %1 is product name, %2 is product vendor -+ <strong>%1</strong><br/><font color="Grey">由 %2 所提供</font> - - -- -- File: %1 -- @label -- 檔案:%1 -+ -+ File: %1 -+ @label -+ 檔案:%1 - - -- -- Hide the license text -- @tooltip -- 隱藏授權條款文字 -+ -+ Hide the license text -+ @tooltip -+ 隱藏授權條款文字 - - -- -- Show the license text -- @tooltip -- 顯示授權條款文字 -+ -+ Show the license text -+ @tooltip -+ 顯示授權條款文字 - - -- -- Open the license agreement in browser -- @tooltip -- 在瀏覽器中開啟授權條款文字 -+ -+ Open the license agreement in browser -+ @tooltip -+ 在瀏覽器中開啟授權條款文字 - -- -- -+ -+ - LocalePage - -- -- Region: -- @label -- 地區 -+ -+ Region: -+ @label -+ 地區 - - -- -- Zone: -- @label -- 時區 -+ -+ Zone: -+ @label -+ 時區 - - -- -- -- &Change… -- @button -- 變更……(&C) -+ -+ -+ &Change… -+ @button -+ 變更……(&C) - -- -- -+ -+ - LocaleQmlViewStep - -- -- Location -- @label -- 位置 -+ -+ Location -+ @label -+ 位置 - -- -- -+ -+ - LocaleTests - -- -- Quit -- 結束 -+ -+ Quit -+ 結束 - -- -- -+ -+ - LocaleViewStep - -- -- Location -- @label -- 位置 -+ -+ Location -+ @label -+ 位置 - -- -- -+ -+ - LuksBootKeyFileJob - -- -- Configuring LUKS key file. -- 正在設定 LUKS 金鑰檔案。 -+ -+ Configuring LUKS key file. -+ 正在設定 LUKS 金鑰檔案。 - - -- -- -- No partitions are defined. -- 沒有已定義的分割區。 -+ -+ -+ No partitions are defined. -+ 沒有已定義的分割區。 - - -- -- -- Encrypted rootfs setup error -- 已加密的 rootfs 設定錯誤 -+ -+ -+ Encrypted rootfs setup error -+ 已加密的 rootfs 設定錯誤 - - -- -- Root partition %1 is LUKS but no passphrase has been set. -- 根分割區 %1 為 LUKS 但沒有設定密碼。 -+ -+ Root partition %1 is LUKS but no passphrase has been set. -+ 根分割區 %1 為 LUKS 但沒有設定密碼。 - - -- -- Could not create LUKS key file for root partition %1. -- 無法為根分割區 %1 建立 LUKS 金鑰檔。 -+ -+ Could not create LUKS key file for root partition %1. -+ 無法為根分割區 %1 建立 LUKS 金鑰檔。 - -- -- -+ -+ - MachineIdJob - -- -- Generate machine-id. -- 生成 machine-id。 -+ -+ Generate machine-id. -+ 生成 machine-id。 - - -- -- Configuration Error -- 設定錯誤 -+ -+ Configuration Error -+ 設定錯誤 - - -- -- No root mount point is set for MachineId. -- 未為 MachineId 設定根掛載點。 -+ -+ No root mount point is set for MachineId. -+ 未為 MachineId 設定根掛載點。 - - -- -- -- -- -- File not found -- 找不到檔案 -+ -+ -+ -+ -+ File not found -+ 找不到檔案 - - -- -- Path <pre>%1</pre> must be an absolute path. -- 路徑 <pre>%1</pre> 必須為絕對路徑。 -+ -+ Path <pre>%1</pre> must be an absolute path. -+ 路徑 <pre>%1</pre> 必須為絕對路徑。 - - -- -- Could not create new random file <pre>%1</pre>. -- 無法建立新的隨機檔案 <pre>%1</pre>。 -+ -+ Could not create new random file <pre>%1</pre>. -+ 無法建立新的隨機檔案 <pre>%1</pre>。 - -- -- -+ -+ - Map - -- -- Timezone: %1 -- @label -- 時區:%1 -+ -+ Timezone: %1 -+ @label -+ 時區:%1 - - -- -- Please select your preferred location on the map so the installer can suggest the locale -+ -+ Please select your preferred location on the map so the installer can suggest the locale - and timezone settings for you. You can fine-tune the suggested settings below. Search the map by dragging - to move and using the +/- buttons to zoom in/out or use mouse scrolling for zooming. -- @info -- 請在地圖上選取您的偏好位置,這樣安裝程式就可以為您建議 -+ @info -+ 請在地圖上選取您的偏好位置,這樣安裝程式就可以為您建議 - 語系與時區。您可以在下面微調建議的設定。透過拖曳來移動地圖, - 並使用 +/- 按鈕來縮放,或是使用滑鼠滾輪來縮放。 - -- -- -+ -+ - Map-qt6 - -- -- Timezone: %1 -- @label -- 時區:%1 -+ -+ Timezone: %1 -+ @label -+ 時區:%1 - - -- -- Please select your preferred location on the map so the installer can suggest the locale -+ -+ Please select your preferred location on the map so the installer can suggest the locale - and timezone settings for you. You can fine-tune the suggested settings below. Search the map by dragging - to move and using the +/- buttons to zoom in/out or use mouse scrolling for zooming. -- @label -- 請在地圖上選取您的偏好位置,這樣安裝程式就可以為您建議 -+ @label -+ 請在地圖上選取您的偏好位置,這樣安裝程式就可以為您建議 - 語系與時區。您可以在下面微調建議的設定。透過拖曳來移動地圖, - 並使用 +/- 按鈕來縮放,或是使用滑鼠滾輪來縮放。 - -- -- -+ -+ - NetInstallViewStep - -- -- Package selection -- 軟體包選擇 -+ -+ Package selection -+ 軟體包選擇 - - -- -- Office software -- 辦公軟體 -+ -+ Office software -+ 辦公軟體 - - -- -- Office package -- 辦公套件 -+ -+ Office package -+ 辦公套件 - - -- -- Browser software -- 瀏覽器軟體 -+ -+ Browser software -+ 瀏覽器軟體 - - -- -- Browser package -- 瀏覽器套件 -+ -+ Browser package -+ 瀏覽器套件 - - -- -- Web browser -- 網頁瀏覽器 -+ -+ Web browser -+ 網頁瀏覽器 - - -- -- Kernel -- label for netinstall module, Linux kernel -- 內核 -+ -+ Kernel -+ label for netinstall module, Linux kernel -+ 內核 - - -- -- Services -- label for netinstall module, system services -- 服務 -+ -+ Services -+ label for netinstall module, system services -+ 服務 - - -- -- Login -- label for netinstall module, choose login manager -- 登入 -+ -+ Login -+ label for netinstall module, choose login manager -+ 登入 - - -- -- Desktop -- label for netinstall module, choose desktop environment -- 桌面 -+ -+ Desktop -+ label for netinstall module, choose desktop environment -+ 桌面 - - -- -- Applications -- 應用程式 -+ -+ Applications -+ 應用程式 - - -- -- Communication -- label for netinstall module -- 通訊 -+ -+ Communication -+ label for netinstall module -+ 通訊 - - -- -- Development -- label for netinstall module -- 開發 -+ -+ Development -+ label for netinstall module -+ 開發 - - -- -- Office -- label for netinstall module -- 辦公 -+ -+ Office -+ label for netinstall module -+ 辦公 - - -- -- Multimedia -- label for netinstall module -- 多媒體 -+ -+ Multimedia -+ label for netinstall module -+ 多媒體 - - -- -- Internet -- label for netinstall module -- 網際網路 -+ -+ Internet -+ label for netinstall module -+ 網際網路 - - -- -- Theming -- label for netinstall module -- 主題 -+ -+ Theming -+ label for netinstall module -+ 主題 - - -- -- Gaming -- label for netinstall module -- 遊戲 -+ -+ Gaming -+ label for netinstall module -+ 遊戲 - - -- -- Utilities -- label for netinstall module -- 實用工具 -+ -+ Utilities -+ label for netinstall module -+ 實用工具 - -- -- -+ -+ - NotesQmlViewStep - -- -- Notes -- 記事 -+ -+ Notes -+ 記事 - -- -- -+ -+ - OEMPage - -- -- Ba&tch: -- 批次:(&T) -+ -+ Ba&tch: -+ 批次:(&T) - - -- -- <html><head/><body><p>Enter a batch-identifier here. This will be stored in the target system.</p></body></html> -- <html><head/><body><p>在此輸入批次識別記號。這將會儲存在目標系統中。</p></body></html> -+ -+ <html><head/><body><p>Enter a batch-identifier here. This will be stored in the target system.</p></body></html> -+ <html><head/><body><p>在此輸入批次識別記號。這將會儲存在目標系統中。</p></body></html> - - -- -- <html><head/><body><h1>OEM Configuration</h1><p>Calamares will use OEM settings while configuring the target system.</p></body></html> -- <html><head/><body><h1>OEM 設定</h1><p>在設定目標系統時,Calamares 將會使用 OEM 設定。</p></body></html> -+ -+ <html><head/><body><h1>OEM Configuration</h1><p>Calamares will use OEM settings while configuring the target system.</p></body></html> -+ <html><head/><body><h1>OEM 設定</h1><p>在設定目標系統時,Calamares 將會使用 OEM 設定。</p></body></html> - -- -- -+ -+ - OEMViewStep - -- -- OEM Configuration -- OEM 設定 -+ -+ OEM Configuration -+ OEM 設定 - - -- -- Set the OEM Batch Identifier to <code>%1</code>. -- 設定 OEM 批次識別符號為 <code>%1</code>。 -+ -+ Set the OEM Batch Identifier to <code>%1</code>. -+ 設定 OEM 批次識別符號為 <code>%1</code>。 - -- -- -+ -+ - Offline - -- -- Select your preferred region, or use the default settings -- @label -- 選取您偏好的區域,或是使用預設設定 -+ -+ Select your preferred region, or use the default settings -+ @label -+ 選取您偏好的區域,或是使用預設設定 - - -- -- -- -- Timezone: %1 -- @label -- 時區:%1 -+ -+ -+ -+ Timezone: %1 -+ @label -+ 時區:%1 - - -- -- Select your preferred zone within your region -- @label -- 在您的區域中選取您偏好的時區 -+ -+ Select your preferred zone within your region -+ @label -+ 在您的區域中選取您偏好的時區 - - -- -- Zones -- @button -- 時區 -+ -+ Zones -+ @button -+ 時區 - - -- -- You can fine-tune language and locale settings below -- @label -- 您可以在下方微調語言與語系設定 -+ -+ You can fine-tune language and locale settings below -+ @label -+ 您可以在下方微調語言與語系設定 - -- -- -+ -+ - Offline-qt6 - -- -- Select your preferred region, or use the default settings -- @label -- 選取您偏好的區域,或是使用預設設定 -+ -+ Select your preferred region, or use the default settings -+ @label -+ 選取您偏好的區域,或是使用預設設定 - - -- -- -- -- Timezone: %1 -- @label -- 時區:%1 -+ -+ -+ -+ Timezone: %1 -+ @label -+ 時區:%1 - - -- -- Select your preferred zone within your region -- @label -- 在您的區域中選取您偏好的時區 -+ -+ Select your preferred zone within your region -+ @label -+ 在您的區域中選取您偏好的時區 - - -- -- Zones -- @button -- 時區 -+ -+ Zones -+ @button -+ 時區 - - -- -- You can fine-tune language and locale settings below -- @label -- 您可以在下方微調語言與語系設定 -+ -+ You can fine-tune language and locale settings below -+ @label -+ 您可以在下方微調語言與語系設定 - -- -- -+ -+ - PWQ - -- -- Password is too short -- 密碼太短 -+ -+ Password is too short -+ 密碼太短 - - -- -- Password is too long -- 密碼太長 -+ -+ Password is too long -+ 密碼太長 - - -- -- Password is too weak -- 密碼太弱 -+ -+ Password is too weak -+ 密碼太弱 - - -- -- Memory allocation error when setting '%1' -- 當設定「%1」時記憶體分配錯誤 -+ -+ Memory allocation error when setting '%1' -+ 當設定「%1」時記憶體分配錯誤 - - -- -- Memory allocation error -- 記憶體分配錯誤 -+ -+ Memory allocation error -+ 記憶體分配錯誤 - - -- -- The password is the same as the old one -- 密碼與舊的相同 -+ -+ The password is the same as the old one -+ 密碼與舊的相同 - - -- -- The password is a palindrome -- 此密碼為迴文 -+ -+ The password is a palindrome -+ 此密碼為迴文 - - -- -- The password differs with case changes only -- 密碼僅大小寫不同 -+ -+ The password differs with case changes only -+ 密碼僅大小寫不同 - - -- -- The password is too similar to the old one -- 密碼與舊的太過相似 -+ -+ The password is too similar to the old one -+ 密碼與舊的太過相似 - - -- -- The password contains the user name in some form -- 密碼包含某種形式的使用者名稱 -+ -+ The password contains the user name in some form -+ 密碼包含某種形式的使用者名稱 - - -- -- The password contains words from the real name of the user in some form -- 密碼包含了某種形式的使用者真實姓名 -+ -+ The password contains words from the real name of the user in some form -+ 密碼包含了某種形式的使用者真實姓名 - - -- -- The password contains forbidden words in some form -- 密碼包含了某種形式的無效文字 -+ -+ The password contains forbidden words in some form -+ 密碼包含了某種形式的無效文字 - - -- -- The password contains fewer than %n digits -- -- 密碼中僅有少於 %n 位數字 -- -+ -+ The password contains fewer than %n digits -+ -+ 密碼中僅有少於 %n 位數字 -+ - - -- -- The password contains too few digits -- 密碼包含的數字太少了 -+ -+ The password contains too few digits -+ 密碼包含的數字太少了 - - -- -- The password contains fewer than %n uppercase letters -- -- 密碼中僅有少於 %n 個大寫字母 -- -+ -+ The password contains fewer than %n uppercase letters -+ -+ 密碼中僅有少於 %n 個大寫字母 -+ - - -- -- The password contains too few uppercase letters -- 密碼包含的大寫字母太少了 -+ -+ The password contains too few uppercase letters -+ 密碼包含的大寫字母太少了 - - -- -- The password contains fewer than %n lowercase letters -- -- 密碼中僅有少於 %n 個小寫字母 -- -+ -+ The password contains fewer than %n lowercase letters -+ -+ 密碼中僅有少於 %n 個小寫字母 -+ - - -- -- The password contains too few lowercase letters -- 密碼包含的小寫字母太少了 -+ -+ The password contains too few lowercase letters -+ 密碼包含的小寫字母太少了 - - -- -- The password contains fewer than %n non-alphanumeric characters -- -- 密碼中僅有少於 %n 個非字母字元 -- -+ -+ The password contains fewer than %n non-alphanumeric characters -+ -+ 密碼中僅有少於 %n 個非字母字元 -+ - - -- -- The password contains too few non-alphanumeric characters -- 密碼包含的非字母與數字的字元太少了 -+ -+ The password contains too few non-alphanumeric characters -+ 密碼包含的非字母與數字的字元太少了 - - -- -- The password is shorter than %n characters -- -- 密碼短於 %n 個字元 -- -+ -+ The password is shorter than %n characters -+ -+ 密碼短於 %n 個字元 -+ - - -- -- The password is too short -- 密碼太短 -+ -+ The password is too short -+ 密碼太短 - - -- -- The password is a rotated version of the previous one -- 密碼是上一個密碼的輪換版本 -+ -+ The password is a rotated version of the previous one -+ 密碼是上一個密碼的輪換版本 - - -- -- The password contains fewer than %n character classes -- -- 密碼中僅有少於 %n 種字元類型 -- -+ -+ The password contains fewer than %n character classes -+ -+ 密碼中僅有少於 %n 種字元類型 -+ - - -- -- The password does not contain enough character classes -- 密碼未包含足夠的字元類型 -+ -+ The password does not contain enough character classes -+ 密碼未包含足夠的字元類型 - - -- -- The password contains more than %n same characters consecutively -- -- 密碼中包含了 %n 個連續的相同字元 -- -+ -+ The password contains more than %n same characters consecutively -+ -+ 密碼中包含了 %n 個連續的相同字元 -+ - - -- -- The password contains too many same characters consecutively -- 密碼包含連續太多個相同的字元 -+ -+ The password contains too many same characters consecutively -+ 密碼包含連續太多個相同的字元 - - -- -- The password contains more than %n characters of the same class consecutively -- -- 密碼中包含了 %n 個連續的相同類型字元 -- -+ -+ The password contains more than %n characters of the same class consecutively -+ -+ 密碼中包含了 %n 個連續的相同類型字元 -+ - - -- -- The password contains too many characters of the same class consecutively -- 密碼包含了連續太多相同類型的字元 -+ -+ The password contains too many characters of the same class consecutively -+ 密碼包含了連續太多相同類型的字元 - - -- -- The password contains monotonic sequence longer than %n characters -- -- 密碼包含了長度超過 %n 個字元的單調序列 -- -+ -+ The password contains monotonic sequence longer than %n characters -+ -+ 密碼包含了長度超過 %n 個字元的單調序列 -+ - - -- -- The password contains too long of a monotonic character sequence -- 密碼包含了長度過長的單調字元序列 -+ -+ The password contains too long of a monotonic character sequence -+ 密碼包含了長度過長的單調字元序列 - - -- -- No password supplied -- 未提供密碼 -+ -+ No password supplied -+ 未提供密碼 - - -- -- Cannot obtain random numbers from the RNG device -- 無法從 RNG 裝置中取得隨機數 -+ -+ Cannot obtain random numbers from the RNG device -+ 無法從 RNG 裝置中取得隨機數 - - -- -- Password generation failed - required entropy too low for settings -- 密碼生成失敗,設定的必要熵太低 -+ -+ Password generation failed - required entropy too low for settings -+ 密碼生成失敗,設定的必要熵太低 - - -- -- The password fails the dictionary check - %1 -- 密碼在字典檢查時失敗 - %1 -+ -+ The password fails the dictionary check - %1 -+ 密碼在字典檢查時失敗 - %1 - - -- -- The password fails the dictionary check -- 密碼在字典檢查時失敗 -+ -+ The password fails the dictionary check -+ 密碼在字典檢查時失敗 - - -- -- Unknown setting - %1 -- 未知的設定 - %1 -+ -+ Unknown setting - %1 -+ 未知的設定 - %1 - - -- -- Unknown setting -- 未知的設定 -+ -+ Unknown setting -+ 未知的設定 - - -- -- Bad integer value of setting - %1 -- 整數值設定不正確 - %1 -+ -+ Bad integer value of setting - %1 -+ 整數值設定不正確 - %1 - - -- -- Bad integer value -- 整數值不正確 -+ -+ Bad integer value -+ 整數值不正確 - - -- -- Setting %1 is not of integer type -- 設定 %1 不是整數類型 -+ -+ Setting %1 is not of integer type -+ 設定 %1 不是整數類型 - - -- -- Setting is not of integer type -- 設定不是整數類型 -+ -+ Setting is not of integer type -+ 設定不是整數類型 - - -- -- Setting %1 is not of string type -- 設定 %1 不是字串類型 -+ -+ Setting %1 is not of string type -+ 設定 %1 不是字串類型 - - -- -- Setting is not of string type -- 設定不是字串類型 -+ -+ Setting is not of string type -+ 設定不是字串類型 - - -- -- Opening the configuration file failed -- 開啟設定檔失敗 -+ -+ Opening the configuration file failed -+ 開啟設定檔失敗 - - -- -- The configuration file is malformed -- 設定檔格式不正確 -+ -+ The configuration file is malformed -+ 設定檔格式不正確 - - -- -- Fatal failure -- 無法挽回的失敗 -+ -+ Fatal failure -+ 無法挽回的失敗 - - -- -- Unknown error -- 未知的錯誤 -+ -+ Unknown error -+ 未知的錯誤 - -- -- -+ -+ - PackageChooserPage - -- -- Product Name -- 產品名稱 -+ -+ Product Name -+ 產品名稱 - - -- -- TextLabel -- 文字標籤 -+ -+ TextLabel -+ 文字標籤 - - -- -- Long Product Description -- 較長的產品描述 -+ -+ Long Product Description -+ 較長的產品描述 - - -- -- Package Selection -- 軟體包選擇 -+ -+ Package Selection -+ 軟體包選擇 - - -- -- Please pick a product from the list. The selected product will be installed. -- 請從清單中挑選產品。將會安裝選定的產品。 -+ -+ Please pick a product from the list. The selected product will be installed. -+ 請從清單中挑選產品。將會安裝選定的產品。 - -- -- -+ -+ - PackageModel - -- -- Name -- 名稱 -+ -+ Name -+ 名稱 - - -- -- Description -- 描述 -+ -+ Description -+ 描述 - -- -- -+ -+ - Page_Keyboard - -- -- Keyboard model: -- 鍵盤型號: -+ -+ Keyboard model: -+ 鍵盤型號: - - -- -- Type here to test your keyboard -- 在此輸入以測試您的鍵盤 -+ -+ Type here to test your keyboard -+ 在此輸入以測試您的鍵盤 - - -- -- Switch Keyboard: -- shortcut for switching between keyboard layouts -- 切換鍵盤: -+ -+ Switch Keyboard: -+ shortcut for switching between keyboard layouts -+ 切換鍵盤: - -- -- -+ -+ - Page_UserSetup - -- -- What is your name? -- 該如何稱呼您? -+ -+ What is your name? -+ 該如何稱呼您? -+ -+ -+ -+ -+ Your Full Name -+ 您的全名 -+ -+ -+ -+ What name do you want to use to log in? -+ 您想使用何種登入名稱? -+ -+ -+ -+ -+ login -+ 登入 -+ -+ -+ -+ What is the name of this computer? -+ 這部電腦的名字是? -+ -+ -+ -+ -+ <small>This name will be used if you make the computer visible to others on a network.</small> -+ <small>若您將此電腦設定為讓網路上的其他電腦可見時將會使用此名稱。</small> -+ -+ -+ -+ -+ Computer Name -+ 電腦名稱 - - -- -- Your Full Name -- 您的全名 -+ -+ -+ Choose a password to keep your account safe. -+ 輸入密碼以確保帳號的安全性。 - - -- -- What name do you want to use to log in? -- 您想使用何種登入名稱? -+ -+ -+ -+ -+ <small>Enter the same password twice, so that it can be checked for typing errors. A good password will contain a mixture of letters, numbers and punctuation, should be at least eight characters long, and should be changed at regular intervals.</small> -+ <small>輸入同一個密碼兩次,以檢查輸入錯誤。一個好的密碼包含了字母、數字及標點符號的組合、至少八個字母長,且按一固定週期更換。</small> - - -- -- login -- 登入 -+ -+ -+ -+ -+ Password -+ 密碼 - - -- -- What is the name of this computer? -- 這部電腦的名字是? -+ -+ -+ -+ -+ Repeat Password -+ 確認密碼 - - -- -- <small>This name will be used if you make the computer visible to others on a network.</small> -- <small>若您將此電腦設定為讓網路上的其他電腦可見時將會使用此名稱。</small> -+ -+ -+ When this box is checked, password-strength checking is done and you will not be able to use a weak password. -+ 當此勾選框被勾選,密碼強度檢查即完成,您也無法再使用弱密碼。 - - -- -- Computer Name -- 電腦名稱 -+ -+ -+ Require strong passwords. -+ 需要強密碼。 - - -- -- Choose a password to keep your account safe. -- 輸入密碼以確保帳號的安全性。 -+ -+ -+ Log in automatically without asking for the password. -+ 不詢問密碼自動登入。 - - -- -- -- <small>Enter the same password twice, so that it can be checked for typing errors. A good password will contain a mixture of letters, numbers and punctuation, should be at least eight characters long, and should be changed at regular intervals.</small> -- <small>輸入同一個密碼兩次,以檢查輸入錯誤。一個好的密碼包含了字母、數字及標點符號的組合、至少八個字母長,且按一固定週期更換。</small> -+ -+ Use the same password for the administrator account. -+ 為管理員帳號使用同樣的密碼。 - - -- -- -- Password -- 密碼 -+ -+ -+ Use Active Directory -+ - - -- -- -- Repeat Password -- 確認密碼 -+ -+ -+ Domain: -+ - - -- -- When this box is checked, password-strength checking is done and you will not be able to use a weak password. -- 當此勾選框被勾選,密碼強度檢查即完成,您也無法再使用弱密碼。 -+ -+ -+ Domain Administrator: -+ - - -- -- Require strong passwords. -- 需要強密碼。 -+ -+ -+ Password: -+ - - -- -- Log in automatically without asking for the password. -- 不詢問密碼自動登入。 -+ -+ -+ IP Address (optional): -+ - - -- -- Use the same password for the administrator account. -- 為管理員帳號使用同樣的密碼。 -+ -+ your name -+ 姓名 - - -- -- Choose a password for the administrator account. -- 替系統管理員帳號設定一組密碼 -+ -+ user name -+ 使用者名稱 - - -- -- -- <small>Enter the same password twice, so that it can be checked for typing errors.</small> -- <small>輸入同樣的密碼兩次,這樣可以檢查輸入錯誤。</small> -+ -+ computer name -+ 計算機名稱 - -- -- -+ -+ -+ Use the same password for the root account. -+ 為管理員帳號使用同樣的密碼。 -+ -+ -+ -+ -+ Choose a password for the administrator account. -+ 替系統管理員帳號設定一組密碼 -+ -+ -+ -+ -+ -+ -+ <small>Enter the same password twice, so that it can be checked for typing errors.</small> -+ <small>輸入同樣的密碼兩次,這樣可以檢查輸入錯誤。</small> -+ -+ -+ - PartitionLabelsView - -- -- Root -- 根目錄 -+ -+ Root -+ 根目錄 - - -- -- Home -- @label -- 家目錄 -+ -+ Home -+ @label -+ 家目錄 - - -- -- Boot -- @label -- Boot -+ -+ Boot -+ @label -+ Boot - - -- -- EFI system -- @label -- EFI 系統 -+ -+ EFI system -+ @label -+ EFI 系統 - - -- -- Swap -- @label -- Swap -+ -+ Swap -+ @label -+ Swap - - -- -- New partition for %1 -- @label -- %1 的新分割區 -+ -+ New partition for %1 -+ @label -+ %1 的新分割區 - - -- -- New partition -- @label -- 新分割區 -+ -+ New partition -+ @label -+ 新分割區 - - -- -- %1 %2 -- size[number] filesystem[name] -- %1 %2 -+ -+ %1 %2 -+ size[number] filesystem[name] -+ %1 %2 - -- -- -+ -+ - PartitionModel - -- -- -- Free Space -- @title -- 剩餘空間 -+ -+ -+ Free Space -+ @title -+ 剩餘空間 - - -- -- -- New Partition -- @title -- 新分割區 -+ -+ -+ New Partition -+ @title -+ 新分割區 - - -- -- Name -- @title -- 名稱 -+ -+ Name -+ @title -+ 名稱 - - -- -- File System -- @title -- 檔案系統 -+ -+ File System -+ @title -+ 檔案系統 - - -- -- File System Label -- @title -- 檔案系統標籤 -+ -+ File System Label -+ @title -+ 檔案系統標籤 - - -- -- Mount Point -- @title -- 掛載點 -+ -+ Mount Point -+ @title -+ 掛載點 - - -- -- Size -- @title -- 大小 -+ -+ Size -+ @title -+ 大小 - -- -- -+ -+ - PartitionPage - -- -- Storage de&vice: -- 儲存裝置(&V): -+ -+ Storage de&vice: -+ 儲存裝置(&V): - - -- -- &Revert All Changes -- 將所有變更恢復原狀 (&R) -+ -+ &Revert All Changes -+ 將所有變更恢復原狀 (&R) - - -- -- New Partition &Table -- 新的分割表格 (&T) -+ -+ New Partition &Table -+ 新的分割表格 (&T) - - -- -- Cre&ate -- 建立(&A) -+ -+ Cre&ate -+ 建立(&A) - - -- -- &Edit -- 編輯 (&E) -+ -+ &Edit -+ 編輯 (&E) - - -- -- &Delete -- 刪除 (&D) -+ -+ &Delete -+ 刪除 (&D) - - -- -- New Volume Group -- 新卷冊群組 -+ -+ New Volume Group -+ 新卷冊群組 - - -- -- Resize Volume Group -- 調整卷冊群組大小 -+ -+ Resize Volume Group -+ 調整卷冊群組大小 - - -- -- Deactivate Volume Group -- 停用卷冊群組 -+ -+ Deactivate Volume Group -+ 停用卷冊群組 - - -- -- Remove Volume Group -- 移除卷冊群組 -+ -+ Remove Volume Group -+ 移除卷冊群組 - - -- -- I&nstall boot loader on: -- 安裝開機管理程式於: -+ -+ I&nstall boot loader on: -+ 安裝開機管理程式於: - - -- -- Are you sure you want to create a new partition table on %1? -- 您是否確定要在 %1 上建立一個新的分割區表格? -+ -+ Are you sure you want to create a new partition table on %1? -+ 您是否確定要在 %1 上建立一個新的分割區表格? - - -- -- Can not create new partition -- 無法建立新分割區 -+ -+ Can not create new partition -+ 無法建立新分割區 - - -- -- The partition table on %1 already has %2 primary partitions, and no more can be added. Please remove one primary partition and add an extended partition, instead. -- 在 %1 上的分割表已有 %2 個主要分割區,無法再新增。請移除一個主要分割區並新增一個延伸分割區。 -+ -+ The partition table on %1 already has %2 primary partitions, and no more can be added. Please remove one primary partition and add an extended partition, instead. -+ 在 %1 上的分割表已有 %2 個主要分割區,無法再新增。請移除一個主要分割區並新增一個延伸分割區。 - -- -- -+ -+ - PartitionViewStep - -- -- Gathering system information… -- @status -- 正在蒐集系統資訊…… -+ -+ Gathering system information… -+ @status -+ 正在蒐集系統資訊…… - - -- -- Partitions -- @label -- 分割區 -+ -+ Partitions -+ @label -+ 分割區 - - -- -- Install %1 <strong>alongside</strong> another operating system -- @label -- 將 %1 安裝在其他作業系統<strong>旁邊</strong> -+ -+ Install %1 <strong>alongside</strong> another operating system -+ @label -+ 將 %1 安裝在其他作業系統<strong>旁邊</strong> - - -- -- <strong>Erase</strong> disk and install %1 -- @label -- <strong>抹除</strong>磁碟並安裝 %1 -+ -+ <strong>Erase</strong> disk and install %1 -+ @label -+ <strong>抹除</strong>磁碟並安裝 %1 - - -- -- <strong>Replace</strong> a partition with %1 -- @label -- 以 %1 <strong>取代</strong>一個分割區 -+ -+ <strong>Replace</strong> a partition with %1 -+ @label -+ 以 %1 <strong>取代</strong>一個分割區 - - -- -- <strong>Manual</strong> partitioning -- @label -- <strong>手動</strong>分割 -+ -+ <strong>Manual</strong> partitioning -+ @label -+ <strong>手動</strong>分割 - - -- -- Install %1 <strong>alongside</strong> another operating system on disk <strong>%2</strong> (%3) -- @info -- 將 %1 安裝在磁碟 <strong>%2</strong> (%3) 上的另一個作業系統<strong>旁邊</strong> -+ -+ Install %1 <strong>alongside</strong> another operating system on disk <strong>%2</strong> (%3) -+ @info -+ 將 %1 安裝在磁碟 <strong>%2</strong> (%3) 上的另一個作業系統<strong>旁邊</strong> - - -- -- <strong>Erase</strong> disk <strong>%2</strong> (%3) and install %1 -- @info -- <strong>抹除</strong> 磁碟 <strong>%2</strong> (%3) 並且安裝 %1 -+ -+ <strong>Erase</strong> disk <strong>%2</strong> (%3) and install %1 -+ @info -+ <strong>抹除</strong> 磁碟 <strong>%2</strong> (%3) 並且安裝 %1 - - -- -- <strong>Replace</strong> a partition on disk <strong>%2</strong> (%3) with %1 -- @info -- 以 %1 <strong>取代</strong> 一個在磁碟 <strong>%2</strong> (%3) 上的分割區 -+ -+ <strong>Replace</strong> a partition on disk <strong>%2</strong> (%3) with %1 -+ @info -+ 以 %1 <strong>取代</strong> 一個在磁碟 <strong>%2</strong> (%3) 上的分割區 - - -- -- <strong>Manual</strong> partitioning on disk <strong>%1</strong> (%2) -- @info -- 在磁碟 <strong>%1</strong> (%2) 上<strong>手動</strong>分割 -+ -+ <strong>Manual</strong> partitioning on disk <strong>%1</strong> (%2) -+ @info -+ 在磁碟 <strong>%1</strong> (%2) 上<strong>手動</strong>分割 - - -- -- Disk <strong>%1</strong> (%2) -- @info -- 磁碟 <strong>%1</strong> (%2) -+ -+ Disk <strong>%1</strong> (%2) -+ @info -+ 磁碟 <strong>%1</strong> (%2) - - -- -- Unsafe partition actions are enabled. -- 啟用了不安全的分割動作。 -+ -+ Unsafe partition actions are enabled. -+ 啟用了不安全的分割動作。 - - -- -- Partitioning is configured to <b>always</b> fail. -- 分割被設定為<b>一律</b>失敗。 -+ -+ Partitioning is configured to <b>always</b> fail. -+ 分割被設定為<b>一律</b>失敗。 - - -- -- No partitions will be changed. -- 不會更動任何分割區。 -+ -+ No partitions will be changed. -+ 不會更動任何分割區。 - - -- -- Current: -- @label -- 目前: -+ -+ Current: -+ @label -+ 目前: - - -- -- After: -- @label -- 之後: -+ -+ After: -+ @label -+ 之後: - - -- -- An EFI system partition is necessary to start %1.<br/><br/>To configure an EFI system partition, go back and select or create a suitable filesystem. -- 要啟動 %1 必須要有 EFI 系統分割區。<br/><br/>要設定 EFI 系統分割區,返回並選取或建立適合的檔案系統。 -+ -+ An EFI system partition is necessary to start %1.<br/><br/>To configure an EFI system partition, go back and select or create a suitable filesystem. -+ 要啟動 %1 必須要有 EFI 系統分割區。<br/><br/>要設定 EFI 系統分割區,返回並選取或建立適合的檔案系統。 - - -- -- An EFI system partition is necessary to start %1.<br/><br/>The EFI system partition does not meet recommendations. It is recommended to go back and select or create a suitable filesystem. -- 要啟動 %1 必須要有 EFI 系統分割區。<br/><br/>EFI 系統分割區不符合建議。建議回到上一步並選擇或建立適合的檔案系統。 -+ -+ An EFI system partition is necessary to start %1.<br/><br/>The EFI system partition does not meet recommendations. It is recommended to go back and select or create a suitable filesystem. -+ 要啟動 %1 必須要有 EFI 系統分割區。<br/><br/>EFI 系統分割區不符合建議。建議回到上一步並選擇或建立適合的檔案系統。 - - -- -- The filesystem must be mounted on <strong>%1</strong>. -- 檔案系統必須掛載於 <strong>%1</strong>。 -+ -+ The filesystem must be mounted on <strong>%1</strong>. -+ 檔案系統必須掛載於 <strong>%1</strong>。 - - -- -- The filesystem must have type FAT32. -- 檔案系統必須有類型 FAT32。 -+ -+ The filesystem must have type FAT32. -+ 檔案系統必須有類型 FAT32。 - - -- -- The filesystem must have flag <strong>%1</strong> set. -- 檔案系統必須有旗標 <strong>%1</strong> 設定。 -+ -+ The filesystem must have flag <strong>%1</strong> set. -+ 檔案系統必須有旗標 <strong>%1</strong> 設定。 - - -- -- -- The filesystem must be at least %1 MiB in size. -- 檔案系統必須至少有 %1 MiB 的大小。 -+ -+ -+ The filesystem must be at least %1 MiB in size. -+ 檔案系統必須至少有 %1 MiB 的大小。 - - -- -- The minimum recommended size for the filesystem is %1 MiB. -- 建議的檔案系統最小大小為 %1 MiB。 -+ -+ The minimum recommended size for the filesystem is %1 MiB. -+ 建議的檔案系統最小大小為 %1 MiB。 - - -- -- You can continue without setting up an EFI system partition but your system may fail to start. -- 您可以在不設定 EFI 系統分割區的情況下繼續,但您的系統可能無法啟動。 -+ -+ You can continue without setting up an EFI system partition but your system may fail to start. -+ 您可以在不設定 EFI 系統分割區的情況下繼續,但您的系統可能無法啟動。 - - -- -- You can continue with this EFI system partition configuration but your system may fail to start. -- 您可以繼續此 EFI 系統分割區組態,但您的系統可能無法啟動。 -+ -+ You can continue with this EFI system partition configuration but your system may fail to start. -+ 您可以繼續此 EFI 系統分割區組態,但您的系統可能無法啟動。 - - -- -- No EFI system partition configured -- 未設定 EFI 系統分割區 -+ -+ No EFI system partition configured -+ 未設定 EFI 系統分割區 - - -- -- EFI system partition configured incorrectly -- EFI 系統分割區設定不正確 -+ -+ EFI system partition configured incorrectly -+ EFI 系統分割區設定不正確 - - -- -- EFI system partition recommendation -- EFI 系統分割區建議 -+ -+ EFI system partition recommendation -+ EFI 系統分割區建議 - - -- -- Option to use GPT on BIOS -- 在 BIOS 上使用 GPT 的選項 -+ -+ Option to use GPT on BIOS -+ 在 BIOS 上使用 GPT 的選項 - - -- -- A GPT partition table is the best option for all systems. This installer supports such a setup for BIOS systems too.<br/><br/>To configure a GPT partition table on BIOS, (if not done so already) go back and set the partition table to GPT, next create a 8 MB unformatted partition with the <strong>%2</strong> flag enabled.<br/><br/>An unformatted 8 MB partition is necessary to start %1 on a BIOS system with GPT. -- GPT 分割表對所有系統都是最佳選項。此安裝程式同時也支援 BIOS 系統。<br/><br/>要在 BIOS 上設定 GPT 分割表,(如果還沒有完成的話)請回上一步並將分割表設定為 GPT,然後建立 8 MB 的未格式化分割區,並啟用 <strong>%2</strong> 旗標。<br/><br/>要在 BIOS 系統上使用 GPT 分割區啟動 %1 則必須使用未格式化的 8MB 分割區。 -+ -+ A GPT partition table is the best option for all systems. This installer supports such a setup for BIOS systems too.<br/><br/>To configure a GPT partition table on BIOS, (if not done so already) go back and set the partition table to GPT, next create a 8 MB unformatted partition with the <strong>%2</strong> flag enabled.<br/><br/>An unformatted 8 MB partition is necessary to start %1 on a BIOS system with GPT. -+ GPT 分割表對所有系統都是最佳選項。此安裝程式同時也支援 BIOS 系統。<br/><br/>要在 BIOS 上設定 GPT 分割表,(如果還沒有完成的話)請回上一步並將分割表設定為 GPT,然後建立 8 MB 的未格式化分割區,並啟用 <strong>%2</strong> 旗標。<br/><br/>要在 BIOS 系統上使用 GPT 分割區啟動 %1 則必須使用未格式化的 8MB 分割區。 - - -- -- Boot partition not encrypted -- 開機分割區未加密 -+ -+ Boot partition not encrypted -+ 開機分割區未加密 - - -- -- A separate boot partition was set up together with an encrypted root partition, but the boot partition is not encrypted.<br/><br/>There are security concerns with this kind of setup, because important system files are kept on an unencrypted partition.<br/>You may continue if you wish, but filesystem unlocking will happen later during system startup.<br/>To encrypt the boot partition, go back and recreate it, selecting <strong>Encrypt</strong> in the partition creation window. -- 設定了單獨的開機分割區以及加密的根分割區,但是開機分割區並不會被加密。<br/><br/>這種設定可能會造成安全問題,因為重要的系統檔案是放在未加密的分割區中。<br/>您也可以繼續,但是檔案系統的解鎖會在系統啟動後才發生。<br/>要加密開機分割區,回到上一頁並重新建立它,並在分割區建立視窗選取<strong>加密</strong>。 -+ -+ A separate boot partition was set up together with an encrypted root partition, but the boot partition is not encrypted.<br/><br/>There are security concerns with this kind of setup, because important system files are kept on an unencrypted partition.<br/>You may continue if you wish, but filesystem unlocking will happen later during system startup.<br/>To encrypt the boot partition, go back and recreate it, selecting <strong>Encrypt</strong> in the partition creation window. -+ 設定了單獨的開機分割區以及加密的根分割區,但是開機分割區並不會被加密。<br/><br/>這種設定可能會造成安全問題,因為重要的系統檔案是放在未加密的分割區中。<br/>您也可以繼續,但是檔案系統的解鎖會在系統啟動後才發生。<br/>要加密開機分割區,回到上一頁並重新建立它,並在分割區建立視窗選取<strong>加密</strong>。 - - -- -- has at least one disk device available. -- 有至少一個可用的磁碟裝置。 -+ -+ has at least one disk device available. -+ 有至少一個可用的磁碟裝置。 - - -- -- There are no partitions to install on. -- 沒有可用於安裝的分割區。 -+ -+ There are no partitions to install on. -+ 沒有可用於安裝的分割區。 - -- -- -+ -+ - PlasmaLnfJob - -- -- Applying Plasma Look-and-Feel… -- @status -- 正在套用 Plasma 外觀與感覺…… -+ -+ Applying Plasma Look-and-Feel… -+ @status -+ 正在套用 Plasma 外觀與感覺…… - - -- -- -- Could not select KDE Plasma Look-and-Feel package -- 無法選取 KDE Plasma 外觀與感覺軟體包 -+ -+ -+ Could not select KDE Plasma Look-and-Feel package -+ 無法選取 KDE Plasma 外觀與感覺軟體包 - -- -- -+ -+ - PlasmaLnfPage - -- -- Please choose a look-and-feel for the KDE Plasma Desktop. You can also skip this step and configure the look-and-feel once the system is set up. Clicking on a look-and-feel selection will give you a live preview of that look-and-feel. -- 請為 KDE Plasma 桌面選擇外觀與感覺。您也可以跳過此步驟並在系統設定好之後再設定。在外觀與感覺小節點按將會給您特定外觀與感覺的即時預覽。 -+ -+ Please choose a look-and-feel for the KDE Plasma Desktop. You can also skip this step and configure the look-and-feel once the system is set up. Clicking on a look-and-feel selection will give you a live preview of that look-and-feel. -+ 請為 KDE Plasma 桌面選擇外觀與感覺。您也可以跳過此步驟並在系統設定好之後再設定。在外觀與感覺小節點按將會給您特定外觀與感覺的即時預覽。 - - -- -- Please choose a look-and-feel for the KDE Plasma Desktop. You can also skip this step and configure the look-and-feel once the system is installed. Clicking on a look-and-feel selection will give you a live preview of that look-and-feel. -- 請為 KDE Plasma 桌面選擇外觀與感覺。您也可以跳過此步驟並在系統安裝好之後再設定。在外觀與感覺小節點按將會給您特定外觀與感覺的即時預覽。 -+ -+ Please choose a look-and-feel for the KDE Plasma Desktop. You can also skip this step and configure the look-and-feel once the system is installed. Clicking on a look-and-feel selection will give you a live preview of that look-and-feel. -+ 請為 KDE Plasma 桌面選擇外觀與感覺。您也可以跳過此步驟並在系統安裝好之後再設定。在外觀與感覺小節點按將會給您特定外觀與感覺的即時預覽。 - -- -- -+ -+ - PlasmaLnfViewStep - -- -- Look-and-Feel -- @label -- 外觀與感覺 -+ -+ Look-and-Feel -+ @label -+ 外觀與感覺 - -- -- -+ -+ -+ PowerManagementInterface -+ -+ -+ Calamares -+ -+ -+ -+ -+ Installation in progress -+ @status -+ -+ -+ -+ - PreserveFiles - -- -- Saving files for later… -- @status -- 儲存檔案以供日後使用…… -+ -+ Saving files for later… -+ @status -+ 儲存檔案以供日後使用…… - - -- -- No files configured to save for later. -- 沒有檔案被設定為稍後儲存。 -+ -+ No files configured to save for later. -+ 沒有檔案被設定為稍後儲存。 - - -- -- Not all of the configured files could be preserved. -- 並非所有已設定的檔案都可以被保留。 -+ -+ Not all of the configured files could be preserved. -+ 並非所有已設定的檔案都可以被保留。 - -- -- -+ -+ - ProcessResult - -- -- -+ -+ - There was no output from the command. -- -+ - 指令沒有輸出。 - - -- -- -+ -+ - Output: - -- -+ - 輸出: - - - -- -- External command crashed. -- 外部指令當機。 -+ -+ External command crashed. -+ 外部指令當機。 - - -- -- Command <i>%1</i> crashed. -- 指令 <i>%1</i> 已當機。 -+ -+ Command <i>%1</i> crashed. -+ 指令 <i>%1</i> 已當機。 - - -- -- External command failed to start. -- 外部指令啟動失敗。 -+ -+ External command failed to start. -+ 外部指令啟動失敗。 - - -- -- Command <i>%1</i> failed to start. -- 指令 <i>%1</i> 啟動失敗。 -+ -+ Command <i>%1</i> failed to start. -+ 指令 <i>%1</i> 啟動失敗。 - - -- -- Internal error when starting command. -- 當啟動指令時發生內部錯誤。 -+ -+ Internal error when starting command. -+ 當啟動指令時發生內部錯誤。 - - -- -- Bad parameters for process job call. -- 呼叫程序的參數無效。 -+ -+ Bad parameters for process job call. -+ 呼叫程序的參數無效。 - - -- -- External command failed to finish. -- 外部指令結束失敗。 -+ -+ External command failed to finish. -+ 外部指令結束失敗。 - - -- -- Command <i>%1</i> failed to finish in %2 seconds. -- 指令 <i>%1</i> 在結束 %2 秒內失敗。 -+ -+ Command <i>%1</i> failed to finish in %2 seconds. -+ 指令 <i>%1</i> 在結束 %2 秒內失敗。 - - -- -- External command finished with errors. -- 外部指令結束時發生錯誤。 -+ -+ External command finished with errors. -+ 外部指令結束時發生錯誤。 - - -- -- Command <i>%1</i> finished with exit code %2. -- 指令 <i>%1</i> 結束時有錯誤碼 %2。 -+ -+ Command <i>%1</i> finished with exit code %2. -+ 指令 <i>%1</i> 結束時有錯誤碼 %2。 - -- -- -+ -+ - QObject - -- -- %1 (%2) -- %1 (%2) -+ -+ %1 (%2) -+ %1 (%2) - - -- -- unknown -- @partition info -- 未知 -+ -+ unknown -+ @partition info -+ 未知 - - -- -- extended -- @partition info -- 延伸分割區 -+ -+ extended -+ @partition info -+ 延伸分割區 - - -- -- unformatted -- @partition info -- 未格式化 -+ -+ unformatted -+ @partition info -+ 未格式化 - - -- -- swap -- @partition info -- swap -+ -+ swap -+ @partition info -+ swap - - -- -- -- Default -- 預設值 -+ -+ -+ Default -+ 預設值 - - -- -- Directory not found -- 找不到目錄 -+ -+ Directory not found -+ 找不到目錄 - - -- -- Could not create new random file <pre>%1</pre>. -- 無法建立新的隨機檔案 <pre>%1</pre>。 -+ -+ Could not create new random file <pre>%1</pre>. -+ 無法建立新的隨機檔案 <pre>%1</pre>。 - - -- -- No product -- 沒有產品 -+ -+ No product -+ 沒有產品 - - -- -- No description provided. -- 未提供描述。 -+ -+ No description provided. -+ 未提供描述。 - - -- -- (no mount point) -- (沒有掛載點) -+ -+ (no mount point) -+ (沒有掛載點) - - -- -- Unpartitioned space or unknown partition table -- @info -- 尚未分割的空間或是不明的分割表 -+ -+ Unpartitioned space or unknown partition table -+ @info -+ 尚未分割的空間或是不明的分割表 - -- -- -+ -+ - Recommended - -- -- <p>This computer does not satisfy some of the recommended requirements for setting up %1.<br/> -+ -+ <p>This computer does not satisfy some of the recommended requirements for setting up %1.<br/> - Setup can continue, but some features might be disabled.</p> -- <p>此電腦未滿足部份安裝 %1 的建議系統需求。<br/> -+ <p>此電腦未滿足部份安裝 %1 的建議系統需求。<br/> - 可以繼續安裝,但某些功能可能會被停用。</p> - -- -- -+ -+ - RemoveUserJob - -- -- Removing live user from the target system… -- @status -- 正在從目標系統移除 live 使用者…… -+ -+ Removing live user from the target system… -+ @status -+ 正在從目標系統移除 live 使用者…… - -- -- -+ -+ - RemoveVolumeGroupJob - -- -- -- Removing Volume Group named %1… -- @status -- 正在移除名為 %1 的卷冊群組…… -+ -+ -+ Removing Volume Group named %1… -+ @status -+ 正在移除名為 %1 的卷冊群組…… - - -- -- Removing Volume Group named <strong>%1</strong>… -- @status -- 正在移除名為 <strong>%1</strong> 的卷冊群組…… -+ -+ Removing Volume Group named <strong>%1</strong>… -+ @status -+ 正在移除名為 <strong>%1</strong> 的卷冊群組…… - - -- -- The installer failed to remove a volume group named '%1'. -- 安裝程式移除名為「%1」的新卷冊群組失敗。 -+ -+ The installer failed to remove a volume group named '%1'. -+ 安裝程式移除名為「%1」的新卷冊群組失敗。 - -- -- -+ -+ - Requirements - -- -- <p>This computer does not satisfy the minimum requirements for installing %1.<br/> -+ -+ <p>This computer does not satisfy the minimum requirements for installing %1.<br/> - Installation cannot continue.</p> -- <p>此電腦未滿足安裝 %1 的最低系統需求。<br/> -+ <p>此電腦未滿足安裝 %1 的最低系統需求。<br/> - 無法繼˙續安裝。</p> - - -- -- <p>This computer does not satisfy some of the recommended requirements for setting up %1.<br/> -+ -+ <p>This computer does not satisfy some of the recommended requirements for setting up %1.<br/> - Setup can continue, but some features might be disabled.</p> -- <p>此電腦未滿足部份安裝 %1 的建議系統需求。<br/> -+ <p>此電腦未滿足部份安裝 %1 的建議系統需求。<br/> - 可以繼續安裝,但某些功能可能會被停用。</p> - -- -- -+ -+ - ResizeFSJob - -- -- Performing file system resize… -- @status -- 正在調整檔案系統大小…… -+ -+ Performing file system resize… -+ @status -+ 正在調整檔案系統大小…… - - -- -- Invalid configuration -- @error -- 無效的設定 -+ -+ Invalid configuration -+ @error -+ 無效的設定 - - -- -- The file-system resize job has an invalid configuration and will not run. -- @error -- 檔案系統調整大小工作有無效的設定且將不會執行。 -+ -+ The file-system resize job has an invalid configuration and will not run. -+ @error -+ 檔案系統調整大小工作有無效的設定且將不會執行。 - - -- -- KPMCore not available -- @error -- KPMCore 未提供 -+ -+ KPMCore not available -+ @error -+ KPMCore 未提供 - - -- -- Calamares cannot start KPMCore for the file system resize job. -- @error -- Calamares 無法啟動 KPMCore 來進行調整檔案系統大小的工作。 -+ -+ Calamares cannot start KPMCore for the file system resize job. -+ @error -+ Calamares 無法啟動 KPMCore 來進行調整檔案系統大小的工作。 - - -- -- Resize failed. -- @error -- 調整大小失敗。 -+ -+ Resize failed. -+ @error -+ 調整大小失敗。 - - -- -- The filesystem %1 could not be found in this system, and cannot be resized. -- @info -- 檔案系統 %1 在此系統中找不到,且無法調整大小。 -+ -+ The filesystem %1 could not be found in this system, and cannot be resized. -+ @info -+ 檔案系統 %1 在此系統中找不到,且無法調整大小。 - - -- -- The device %1 could not be found in this system, and cannot be resized. -- @info -- 裝置 %1 在此系統中找不到,且無法調整大小。 -+ -+ The device %1 could not be found in this system, and cannot be resized. -+ @info -+ 裝置 %1 在此系統中找不到,且無法調整大小。 - - -- -- -- -- -- Resize Failed -- @error -- 調整大小失敗 -+ -+ -+ -+ -+ Resize Failed -+ @error -+ 調整大小失敗 - - -- -- -- The filesystem %1 cannot be resized. -- @error -- 檔案系統 %1 無法調整大小。 -+ -+ -+ The filesystem %1 cannot be resized. -+ @error -+ 檔案系統 %1 無法調整大小。 - - -- -- -- The device %1 cannot be resized. -- @error -- 裝置 %1 無法調整大小。 -+ -+ -+ The device %1 cannot be resized. -+ @error -+ 裝置 %1 無法調整大小。 - - -- -- The file system %1 must be resized, but cannot. -- @info -- 檔案系統 %1 必須調整大小,但是無法調整。 -+ -+ The file system %1 must be resized, but cannot. -+ @info -+ 檔案系統 %1 必須調整大小,但是無法調整。 - - -- -- The device %1 must be resized, but cannot -- @info -- 裝置 %1 必須調整大小,但是無法調整。 -+ -+ The device %1 must be resized, but cannot -+ @info -+ 裝置 %1 必須調整大小,但是無法調整。 - -- -- -+ -+ - ResizePartitionJob - -- -- Resize partition %1 -- @title -- 調整分割區 %1 大小 -+ -+ Resize partition %1 -+ @title -+ 調整分割區 %1 大小 - - -- -- Resize <strong>%2MiB</strong> partition <strong>%1</strong> to <strong>%3MiB</strong> -- @info -- 調整 <strong>%2MiB</strong> 分割區 <strong>%1</strong> 大小為 <strong>%3MiB</strong> -+ -+ Resize <strong>%2MiB</strong> partition <strong>%1</strong> to <strong>%3MiB</strong> -+ @info -+ 調整 <strong>%2MiB</strong> 分割區 <strong>%1</strong> 大小為 <strong>%3MiB</strong> - - -- -- Resizing %2MiB partition %1 to %3MiB… -- @status -- 正在調整 %2MiB 分割區 %1 大小為 %3MiB…… -+ -+ Resizing %2MiB partition %1 to %3MiB… -+ @status -+ 正在調整 %2MiB 分割區 %1 大小為 %3MiB…… - - -- -- The installer failed to resize partition %1 on disk '%2'. -- 安裝程式調整在磁碟 '%2' 上的分割區 %1 的大小失敗。 -+ -+ The installer failed to resize partition %1 on disk '%2'. -+ 安裝程式調整在磁碟 '%2' 上的分割區 %1 的大小失敗。 - -- -- -+ -+ - ResizeVolumeGroupDialog - -- -- Resize Volume Group -- @title -- 調整卷冊群組大小 -+ -+ Resize Volume Group -+ @title -+ 調整卷冊群組大小 - -- -- -+ -+ - ResizeVolumeGroupJob - -- -- Resize volume group named %1 from %2 to %3 -- @title -- 調整名為 %1 的卷冊群組從 %2 到 %3 -+ -+ Resize volume group named %1 from %2 to %3 -+ @title -+ 調整名為 %1 的卷冊群組從 %2 到 %3 - - -- -- Resize volume group named <strong>%1</strong> from <strong>%2</strong> to <strong>%3</strong> -- @info -- 調整名為 <strong>%1</strong> 的卷冊群組從 <strong>%2</strong> 到 <strong>%3</strong> -+ -+ Resize volume group named <strong>%1</strong> from <strong>%2</strong> to <strong>%3</strong> -+ @info -+ 調整名為 <strong>%1</strong> 的卷冊群組從 <strong>%2</strong> 到 <strong>%3</strong> - - -- -- Resizing volume group named %1 from %2 to %3… -- @status -- 正在調整名為 %1 的卷冊群組從 %2 到 %3…… -+ -+ Resizing volume group named %1 from %2 to %3… -+ @status -+ 正在調整名為 %1 的卷冊群組從 %2 到 %3…… - - -- -- The installer failed to resize a volume group named '%1'. -- 安裝程式對名為「%1」的新卷冊群組調整大小失敗。 -+ -+ The installer failed to resize a volume group named '%1'. -+ 安裝程式對名為「%1」的新卷冊群組調整大小失敗。 - -- -- -+ -+ - ResultsListWidget - -- -- Checking requirements again in a few seconds ... -- 幾秒鐘後再次檢查要求…… -+ -+ Checking requirements again in a few seconds ... -+ 幾秒鐘後再次檢查要求…… - -- -- -+ -+ - ScanningDialog - -- -- Scanning storage devices… -- @status -- 正在掃描儲存裝置…… -+ -+ Scanning storage devices… -+ @status -+ 正在掃描儲存裝置…… - - -- -- Partitioning… -- @status -- 正在進行分割…… -+ -+ Partitioning… -+ @status -+ 正在進行分割…… - -- -- -+ -+ - SetHostNameJob - -- -- Set hostname %1 -- 設定主機名 %1 -+ -+ Set hostname %1 -+ 設定主機名 %1 - - -- -- Set hostname <strong>%1</strong>. -- 設定主機名稱 <strong>%1</strong>。 -+ -+ Set hostname <strong>%1</strong>. -+ 設定主機名稱 <strong>%1</strong>。 - - -- -- Setting hostname %1… -- @status -- 正在設定主機名稱 %1…… -+ -+ Setting hostname %1… -+ @status -+ 正在設定主機名稱 %1…… - - -- -- -- Internal Error -- 內部錯誤 -+ -+ -+ Internal Error -+ 內部錯誤 - - -- -- -- Cannot write hostname to target system -- 無法寫入主機名稱到目標系統 -+ -+ -+ Cannot write hostname to target system -+ 無法寫入主機名稱到目標系統 - -- -- -+ -+ - SetKeyboardLayoutJob - -- -- Setting keyboard model to %1, layout as %2-%3… -- @status, %1 model, %2 layout, %3 variant -- 正在將鍵盤型號設定為 %1,鍵盤佈局為 %2-%3…… -+ -+ Setting keyboard model to %1, layout as %2-%3… -+ @status, %1 model, %2 layout, %3 variant -+ 正在將鍵盤型號設定為 %1,鍵盤佈局為 %2-%3…… - - -- -- Failed to write keyboard configuration for the virtual console. -- @error -- 為虛擬終端機寫入鍵盤設定失敗。 -+ -+ Failed to write keyboard configuration for the virtual console. -+ @error -+ 為虛擬終端機寫入鍵盤設定失敗。 - - -- -- Failed to write to %1 -- @error, %1 is virtual console configuration path -- 寫入到 %1 失敗 -+ -+ Failed to write to %1 -+ @error, %1 is virtual console configuration path -+ 寫入到 %1 失敗 - - -- -- Failed to write keyboard configuration for X11. -- @error -- 為 X11 寫入鍵盤設定失敗。 -+ -+ Failed to write keyboard configuration for X11. -+ @error -+ 為 X11 寫入鍵盤設定失敗。 - - -- -- Failed to write to %1 -- @error, %1 is keyboard configuration path -- 寫入到 %1 失敗 -+ -+ Failed to write to %1 -+ @error, %1 is keyboard configuration path -+ 寫入到 %1 失敗 - - -- -- Failed to write keyboard configuration to existing /etc/default directory. -- @error -- 寫入鍵盤設定到已存在的 /etc/default 目錄失敗。 -+ -+ Failed to write keyboard configuration to existing /etc/default directory. -+ @error -+ 寫入鍵盤設定到已存在的 /etc/default 目錄失敗。 - - -- -- Failed to write to %1 -- @error, %1 is default keyboard path -- 寫入到 %1 失敗 -+ -+ Failed to write to %1 -+ @error, %1 is default keyboard path -+ 寫入到 %1 失敗 - -- -- -+ -+ - SetPartFlagsJob - -- -- Set flags on partition %1 -- @title -- 設定分割區 %1 的旗標 -+ -+ Set flags on partition %1 -+ @title -+ 設定分割區 %1 的旗標 - - -- -- Set flags on %1MiB %2 partition -- @title -- 設定 %1MiB %2 分割區的旗標 -+ -+ Set flags on %1MiB %2 partition -+ @title -+ 設定 %1MiB %2 分割區的旗標 - - -- -- Set flags on new partition -- @title -- 設定新分割區的旗標 -+ -+ Set flags on new partition -+ @title -+ 設定新分割區的旗標 - - -- -- Clear flags on partition <strong>%1</strong> -- @info -- 清除分割區 <strong>%1</strong> 的旗標 -+ -+ Clear flags on partition <strong>%1</strong> -+ @info -+ 清除分割區 <strong>%1</strong> 的旗標 - - -- -- Clear flags on %1MiB <strong>%2</strong> partition -- @info -- 清除 %1MiB <strong>%2</strong> 分割區的旗標 -+ -+ Clear flags on %1MiB <strong>%2</strong> partition -+ @info -+ 清除 %1MiB <strong>%2</strong> 分割區的旗標 - - -- -- Clear flags on new partition -- @info -- 清除新分割區的旗標 -+ -+ Clear flags on new partition -+ @info -+ 清除新分割區的旗標 - - -- -- Set flags on partition <strong>%1</strong> to <strong>%2</strong> -- @info -- 設定分割區 <strong>%1</strong> 的旗標為 <strong>%2</strong> -+ -+ Set flags on partition <strong>%1</strong> to <strong>%2</strong> -+ @info -+ 設定分割區 <strong>%1</strong> 的旗標為 <strong>%2</strong> - - -- -- Set flags on %1MiB <strong>%2</strong> partition to <strong>%3</strong> -- @info -- 將 %1MiB <strong>%2</strong> 分割區標記為 <strong>%3</strong> -+ -+ Set flags on %1MiB <strong>%2</strong> partition to <strong>%3</strong> -+ @info -+ 將 %1MiB <strong>%2</strong> 分割區標記為 <strong>%3</strong> - - -- -- Set flags on new partition to <strong>%1</strong> -- @info -- 設定新分割區的旗標為 <strong>%1</strong> -+ -+ Set flags on new partition to <strong>%1</strong> -+ @info -+ 設定新分割區的旗標為 <strong>%1</strong> - - -- -- Clearing flags on partition <strong>%1</strong>… -- @status -- 正在清除分割區 <strong>%1</strong> 的旗標…… -+ -+ Clearing flags on partition <strong>%1</strong>… -+ @status -+ 正在清除分割區 <strong>%1</strong> 的旗標…… - - -- -- Clearing flags on %1MiB <strong>%2</strong> partition… -- @status -- 正在清除 %1MiB <strong>%2</strong> 分割區的旗標…… -+ -+ Clearing flags on %1MiB <strong>%2</strong> partition… -+ @status -+ 正在清除 %1MiB <strong>%2</strong> 分割區的旗標…… - - -- -- Clearing flags on new partition… -- @status -- 清除新分割區的旗標…… -+ -+ Clearing flags on new partition… -+ @status -+ 清除新分割區的旗標…… - - -- -- Setting flags <strong>%2</strong> on partition <strong>%1</strong>… -- @status -- 正在設定 <strong>%1</strong> 分割區的 <strong>%2</strong> 旗標…… -+ -+ Setting flags <strong>%2</strong> on partition <strong>%1</strong>… -+ @status -+ 正在設定 <strong>%1</strong> 分割區的 <strong>%2</strong> 旗標…… - - -- -- Setting flags <strong>%3</strong> on %1MiB <strong>%2</strong> partition… -- @status -- 正在設定 %1MiB <strong>%2</strong> 分割區的 <strong>%3</strong> 旗標…… -+ -+ Setting flags <strong>%3</strong> on %1MiB <strong>%2</strong> partition… -+ @status -+ 正在設定 %1MiB <strong>%2</strong> 分割區的 <strong>%3</strong> 旗標…… - - -- -- Setting flags <strong>%1</strong> on new partition… -- @status -- 正在設定新分割區的 <strong>%1</strong> 旗標…… -+ -+ Setting flags <strong>%1</strong> on new partition… -+ @status -+ 正在設定新分割區的 <strong>%1</strong> 旗標…… - - -- -- The installer failed to set flags on partition %1. -- 安裝程式未能在分割區 %1 設定旗標。 -+ -+ The installer failed to set flags on partition %1. -+ 安裝程式未能在分割區 %1 設定旗標。 - -- -- -+ -+ - SetPasswordJob - -- -- Set password for user %1 -- 為使用者 %1 設定密碼 -+ -+ Set password for user %1 -+ 為使用者 %1 設定密碼 - - -- -- Setting password for user %1… -- @status -- 正在為使用者 %1 設定密碼…… -+ -+ Setting password for user %1… -+ @status -+ 正在為使用者 %1 設定密碼…… - - -- -- Bad destination system path. -- 非法的目標系統路徑。 -+ -+ Bad destination system path. -+ 非法的目標系統路徑。 - - -- -- rootMountPoint is %1 -- 根掛載點為 %1 -+ -+ rootMountPoint is %1 -+ 根掛載點為 %1 - - -- -- Cannot disable root account. -- 無法停用 root 帳號。 -+ -+ Cannot disable root account. -+ 無法停用 root 帳號。 - - -- -- -- usermod terminated with error code %1. -- usermod 以錯誤代碼 %1 終止。 -+ -+ -+ usermod terminated with error code %1. -+ usermod 以錯誤代碼 %1 終止。 - - -- -- Cannot set password for user %1. -- 無法為使用者 %1 設定密碼。 -+ -+ Cannot set password for user %1. -+ 無法為使用者 %1 設定密碼。 - -- -- -+ -+ - SetTimezoneJob - -- -- Setting timezone to %1/%2… -- @status -- 正在設定時區為 %1/%2…… -+ -+ Setting timezone to %1/%2… -+ @status -+ 正在設定時區為 %1/%2…… - - -- -- Cannot access selected timezone path. -- @error -- 無法存取指定的時區路徑。 -+ -+ Cannot access selected timezone path. -+ @error -+ 無法存取指定的時區路徑。 - - -- -- Bad path: %1 -- @error -- 非法路徑:%1 -+ -+ Bad path: %1 -+ @error -+ 非法路徑:%1 - - -- -- -- Cannot set timezone. -- @error -- 無法設定時區。 -+ -+ -+ Cannot set timezone. -+ @error -+ 無法設定時區。 - - -- -- Link creation failed, target: %1; link name: %2 -- @info -- 連結建立失敗,目標:%1;連結名稱:%2 -+ -+ Link creation failed, target: %1; link name: %2 -+ @info -+ 連結建立失敗,目標:%1;連結名稱:%2 - - -- -- Cannot open /etc/timezone for writing -- @info -- 無法開啟要寫入的 /etc/timezone -+ -+ Cannot open /etc/timezone for writing -+ @info -+ 無法開啟要寫入的 /etc/timezone - -- -- -+ -+ - SetupGroupsJob - -- -- Preparing groups… -- @status -- 正在準備群組…… -+ -+ Preparing groups… -+ @status -+ 正在準備群組…… - - -- -- -- Could not create groups in target system -- 無法在目標系統中建立群組 -+ -+ -+ Could not create groups in target system -+ 無法在目標系統中建立群組 - - -- -- These groups are missing in the target system: %1 -- 這些群組在目標系統中不存在:%1 -+ -+ These groups are missing in the target system: %1 -+ 這些群組在目標系統中不存在:%1 - -- -- -+ -+ - SetupSudoJob - -- -- Configuring <pre>sudo</pre> users… -- @status -- 正在設定 <pre>sudo</pre> 使用者…… -+ -+ Configuring <pre>sudo</pre> users… -+ @status -+ 正在設定 <pre>sudo</pre> 使用者…… - - -- -- Cannot chmod sudoers file. -- 無法修改 sudoers 檔案權限。 -+ -+ Cannot chmod sudoers file. -+ 無法修改 sudoers 檔案權限。 - - -- -- Cannot create sudoers file for writing. -- 無法建立要寫入的 sudoers 檔案。 -+ -+ Cannot create sudoers file for writing. -+ 無法建立要寫入的 sudoers 檔案。 - -- -- -+ -+ - ShellProcessJob - -- -- Running shell processes… -- @status -- 正在執行 shell 子處理程序…… -+ -+ Running shell processes… -+ @status -+ 正在執行 shell 子處理程序…… - -- -- -+ -+ - SlideCounter - -- -- -- %L1 / %L2 -- slide counter, %1 of %2 (numeric) -- %L1 / %L2 -+ -+ -+ %L1 / %L2 -+ slide counter, %1 of %2 (numeric) -+ %L1 / %L2 - -- -- -+ -+ - StandardButtons - -- -- &OK -- 確定(&O) -+ -+ &OK -+ 確定(&O) - - -- -- &Yes -- 是(&Y) -+ -+ &Yes -+ 是(&Y) - - -- -- &No -- 否(&N) -+ -+ &No -+ 否(&N) - - -- -- &Cancel -- 取消(&C) -+ -+ &Cancel -+ 取消(&C) - - -- -- &Close -- 關閉(&C) -+ -+ &Close -+ 關閉(&C) - -- -- -+ -+ - TrackingInstallJob - -- -- Installation feedback -- 安裝回饋 -+ -+ Installation feedback -+ 安裝回饋 - - -- -- Sending installation feedback… -- @status -- 正在傳送安裝回饋…… -+ -+ Sending installation feedback… -+ @status -+ 正在傳送安裝回饋…… - - -- -- Internal error in install-tracking. -- 在安裝追蹤裡的內部錯誤。 -+ -+ Internal error in install-tracking. -+ 在安裝追蹤裡的內部錯誤。 - - -- -- HTTP request timed out. -- HTTP 請求逾時。 -+ -+ HTTP request timed out. -+ HTTP 請求逾時。 - -- -- -+ -+ - TrackingKUserFeedbackJob - -- -- KDE user feedback -- KDE 使用者回饋 -+ -+ KDE user feedback -+ KDE 使用者回饋 - - -- -- Configuring KDE user feedback… -- @status -- 正在設定 KDE 使用者回饋…… -+ -+ Configuring KDE user feedback… -+ @status -+ 正在設定 KDE 使用者回饋…… - - -- -- -- Error in KDE user feedback configuration. -- KDE 使用者回饋設定錯誤。 -+ -+ -+ Error in KDE user feedback configuration. -+ KDE 使用者回饋設定錯誤。 - - -- -- Could not configure KDE user feedback correctly, script error %1. -- 無法正確設定 KDE 使用者回饋,指令稿錯誤 %1。 -+ -+ Could not configure KDE user feedback correctly, script error %1. -+ 無法正確設定 KDE 使用者回饋,指令稿錯誤 %1。 - - -- -- Could not configure KDE user feedback correctly, Calamares error %1. -- 無法正確設定 KDE 使用者回饋,Calamares 錯誤 %1。 -+ -+ Could not configure KDE user feedback correctly, Calamares error %1. -+ 無法正確設定 KDE 使用者回饋,Calamares 錯誤 %1。 - -- -- -+ -+ - TrackingMachineUpdateManagerJob - -- -- Machine feedback -- 機器回饋 -+ -+ Machine feedback -+ 機器回饋 - - -- -- Configuring machine feedback… -- @status -- 正在設定機器回饋…… -+ -+ Configuring machine feedback… -+ @status -+ 正在設定機器回饋…… - - -- -- -- Error in machine feedback configuration. -- 在機器回饋設定中的錯誤。 -+ -+ -+ Error in machine feedback configuration. -+ 在機器回饋設定中的錯誤。 - - -- -- Could not configure machine feedback correctly, script error %1. -- 無法正確設定機器回饋,指令稿錯誤 %1。 -+ -+ Could not configure machine feedback correctly, script error %1. -+ 無法正確設定機器回饋,指令稿錯誤 %1。 - - -- -- Could not configure machine feedback correctly, Calamares error %1. -- 無法正確設定機器回饋,Calamares 錯誤 %1。 -+ -+ Could not configure machine feedback correctly, Calamares error %1. -+ 無法正確設定機器回饋,Calamares 錯誤 %1。 - -- -- -+ -+ - TrackingPage - -- -- Placeholder -- 佔位符 -+ -+ Placeholder -+ 佔位符 - - -- -- <html><head/><body><p>Click here to send <span style=" font-weight:600;">no information at all</span> about your installation.</p></body></html> -- <html><head/><body><p>點擊此處<span style=" font-weight:600;">不會傳送任何</span>關於您安裝的資訊。</p></body></html> -+ -+ <html><head/><body><p>Click here to send <span style=" font-weight:600;">no information at all</span> about your installation.</p></body></html> -+ <html><head/><body><p>點擊此處<span style=" font-weight:600;">不會傳送任何</span>關於您安裝的資訊。</p></body></html> - - -- -- <html><head/><body><p><a href="placeholder"><span style=" text-decoration: underline; color:#2980b9;">Click here for more information about user feedback</span></a></p></body></html> -- <html><head/><body><p><a href="placeholder"><span style=" text-decoration: underline; color:#2980b9;">點選這裡來取得更多關於使用者回饋的資訊</span></a></p></body></html> -+ -+ <html><head/><body><p><a href="placeholder"><span style=" text-decoration: underline; color:#2980b9;">Click here for more information about user feedback</span></a></p></body></html> -+ <html><head/><body><p><a href="placeholder"><span style=" text-decoration: underline; color:#2980b9;">點選這裡來取得更多關於使用者回饋的資訊</span></a></p></body></html> - - -- -- Tracking helps %1 to see how often it is installed, what hardware it is installed on and which applications are used. To see what will be sent, please click the help icon next to each area. -- 追蹤可以協助 %1 檢視其安裝頻率、安裝在什麼硬體上以及使用了哪些應用程式。要檢視會傳送哪些資訊,請點擊每個區域旁的說明按鈕。 -+ -+ Tracking helps %1 to see how often it is installed, what hardware it is installed on and which applications are used. To see what will be sent, please click the help icon next to each area. -+ 追蹤可以協助 %1 檢視其安裝頻率、安裝在什麼硬體上以及使用了哪些應用程式。要檢視會傳送哪些資訊,請點擊每個區域旁的說明按鈕。 - - -- -- By selecting this you will send information about your installation and hardware. This information will only be sent <b>once</b> after the installation finishes. -- 選取這個後,您將會傳送關於您的安裝與硬體的資訊。這個資訊將只會傳送</b>一次</b>,且在安裝完成後。 -+ -+ By selecting this you will send information about your installation and hardware. This information will only be sent <b>once</b> after the installation finishes. -+ 選取這個後,您將會傳送關於您的安裝與硬體的資訊。這個資訊將只會傳送</b>一次</b>,且在安裝完成後。 - - -- -- By selecting this you will periodically send information about your <b>machine</b> installation, hardware and applications, to %1. -- 選取這個後,您將會週期性地傳送關於您的<b>機器</b>安裝、硬體與應用程式的資訊給 %1。 -+ -+ By selecting this you will periodically send information about your <b>machine</b> installation, hardware and applications, to %1. -+ 選取這個後,您將會週期性地傳送關於您的<b>機器</b>安裝、硬體與應用程式的資訊給 %1。 - - -- -- By selecting this you will regularly send information about your <b>user</b> installation, hardware, applications and application usage patterns, to %1. -- 選取這個後,您將會經常傳送關於您的<b>使用者</b>安裝、硬體、應用程式與使用模式的資訊給 %1。 -+ -+ By selecting this you will regularly send information about your <b>user</b> installation, hardware, applications and application usage patterns, to %1. -+ 選取這個後,您將會經常傳送關於您的<b>使用者</b>安裝、硬體、應用程式與使用模式的資訊給 %1。 - -- -- -+ -+ - TrackingViewStep - -- -- Feedback -- @title -- 回饋 -+ -+ Feedback -+ @title -+ 回饋 - -- -- -+ -+ - UmountJob - -- -- Unmounting file systems… -- @status -- 正在解除掛載檔案系統…… -+ -+ Unmounting file systems… -+ @status -+ 正在解除掛載檔案系統…… - - -- -- No target system available. -- 沒有可用的目標系統。 -+ -+ No target system available. -+ 沒有可用的目標系統。 - - -- -- No rootMountPoint is set. -- 未設定根掛載點。 -+ -+ No rootMountPoint is set. -+ 未設定根掛載點。 - -- -- -+ -+ - UsersPage - -- -- <small>If more than one person will use this computer, you can create multiple accounts after setup.</small> -- <small>如果將會有多於一人使用這臺電腦,您可以在安裝後設定多個帳號。</small> -+ -+ <small>If more than one person will use this computer, you can create multiple accounts after setup.</small> -+ <small>如果將會有多於一人使用這臺電腦,您可以在安裝後設定多個帳號。</small> - - -- -- <small>If more than one person will use this computer, you can create multiple accounts after installation.</small> -- <small>如果將會有多於一人使用這臺電腦,您可以在安裝後設定多個帳號。</small> -+ -+ <small>If more than one person will use this computer, you can create multiple accounts after installation.</small> -+ <small>如果將會有多於一人使用這臺電腦,您可以在安裝後設定多個帳號。</small> - -- -- -+ -+ - UsersQmlViewStep - -- -- Users -- 使用者 -+ -+ Users -+ 使用者 - -- -- -+ -+ - UsersViewStep - -- -- Users -- 使用者 -+ -+ Users -+ 使用者 - -- -- -+ -+ - VariantModel - -- -- Key -- Column header for key/value -- 金鑰 -+ -+ Key -+ Column header for key/value -+ 金鑰 - - -- -- Value -- Column header for key/value -- -+ -+ Value -+ Column header for key/value -+ - -- -- -+ -+ - VolumeGroupBaseDialog - -- -- Create Volume Group -- 建立卷冊群組 -+ -+ Create Volume Group -+ 建立卷冊群組 - - -- -- List of Physical Volumes -- 物理卷冊清單 -+ -+ List of Physical Volumes -+ 物理卷冊清單 - - -- -- Volume Group Name: -- 卷冊群組名稱: -+ -+ Volume Group Name: -+ 卷冊群組名稱: - - -- -- Volume Group Type: -- 卷冊群組類型: -+ -+ Volume Group Type: -+ 卷冊群組類型: - - -- -- Physical Extent Size: -- 物理延展大小: -+ -+ Physical Extent Size: -+ 物理延展大小: - - -- -- MiB -- MiB -+ -+ MiB -+ MiB - - -- -- Total Size: -- 大小總計: -+ -+ Total Size: -+ 大小總計: - - -- -- Used Size: -- 已使用大小: -+ -+ Used Size: -+ 已使用大小: - - -- -- Total Sectors: -- 總磁區數: -+ -+ Total Sectors: -+ 總磁區數: - - -- -- Quantity of LVs: -- 邏輯卷冊數量: -+ -+ Quantity of LVs: -+ 邏輯卷冊數量: - -- -- -+ -+ - WelcomePage - -- -- -- Select application and system language -- 選取應用程式與系統語言 -+ -+ -+ Select application and system language -+ 選取應用程式與系統語言 - - -- -- Open donations website -- 開啟捐款網頁 -+ -+ language -+ - - -- -- &Donate -- 捐款(&D) -+ Open donations website -+ 開啟捐款網頁 - - -- -- Open help and support website -- 開啟說明與支援網頁 -+ &Donate -+ 捐款(&D) - - -- -- &Support -- 支援(&S) -+ Open help and support website -+ 開啟說明與支援網頁 - - -- -- Open issues and bug-tracking website -- 開啟問題與錯誤追蹤網頁 -+ &Support -+ 支援(&S) - - -- -- &Known issues -- 已知問題(&K) -+ Open issues and bug-tracking website -+ 開啟問題與錯誤追蹤網頁 - - -- -- Open release notes website -- 開啟發行記事網站 -+ &Known issues -+ 已知問題(&K) - - -- -- &Release notes -- 發行註記(&R) -+ Open release notes website -+ 開啟發行記事網站 - - -- -- About %1 Setup -- @title -- 關於 %1 安裝程式 -+ &Release notes -+ 發行註記(&R) - - -- -- About %1 Installer -- @title -- 關於 %1 安裝程式 -+ -+ About %1 Setup -+ @title -+ 關於 %1 安裝程式 - - -- -- %1 Support -- @action -- %1 支援 -+ -+ About %1 Installer -+ @title -+ 關於 %1 安裝程式 - -- -- -+ -+ %1 Support -+ @action -+ %1 支援 -+ -+ -+ - WelcomeQmlViewStep - -- -- Welcome -- @title -- 歡迎 -+ -+ Welcome -+ @title -+ 歡迎 - -- -- -+ -+ - WelcomeViewStep - -- -- Welcome -- @title -- 歡迎 -+ -+ Welcome -+ @title -+ 歡迎 - -- -- -+ -+ - ZfsJob - -- -- Creating ZFS pools and datasets… -- @status -- 正在建立 ZFS 池與資料集…… -+ -+ Creating ZFS pools and datasets… -+ @status -+ 正在建立 ZFS 池與資料集…… - - -- -- Failed to create zpool on -- 建立 zpool 失敗於 -+ -+ Failed to create zpool on -+ 建立 zpool 失敗於 - - -- -- Configuration Error -- 設定錯誤 -+ -+ Configuration Error -+ 設定錯誤 - - -- -- No partitions are available for ZFS. -- ZFS 沒有可用的分割區。 -+ -+ No partitions are available for ZFS. -+ ZFS 沒有可用的分割區。 - - -- -- Internal data missing -- 內部資料遺失 -+ -+ Internal data missing -+ 內部資料遺失 - - -- -- -- Failed to create zpool -- 建立 zpool 失敗 -+ -+ -+ Failed to create zpool -+ 建立 zpool 失敗 - - -- -- Failed to create dataset -- 建立資料集失敗 -+ -+ Failed to create dataset -+ 建立資料集失敗 - - -- -- The output was: -- 輸出為: -+ -+ The output was: -+ 輸出為: - -- -- -+ -+ - calamares-sidebar - -- -- About -- 關於 -+ -+ About -+ 關於 - - -- -- Debug -- Debug -+ -+ Debug -+ Debug - - -- -- About -- @button -- 關於 -+ -+ About -+ @button -+ 關於 - - -- -- Show information about Calamares -- @tooltip -- 顯示關於 Calamares 的資訊 -+ -+ Show information about Calamares -+ @tooltip -+ 顯示關於 Calamares 的資訊 - - -- -- Debug -- @button -- Debug -+ -+ -+ Debug -+ @button -+ Debug - - -- -- Show debug information -- @tooltip -- 顯示除錯資訊 -+ -+ -+ Show debug information -+ @tooltip -+ 顯示除錯資訊 - -- -- -+ -+ -+ Show information about easysoftware -+ @tooltip -+ -+ -+ -+ - finishedq - -- -- Installation Completed -- 安裝完成 -+ -+ Installation Completed -+ 安裝完成 - - -- -- %1 has been installed on your computer.<br/> -+ -+ %1 has been installed on your computer.<br/> - You may now restart into your new system, or continue using the Live environment. -- %1 已安裝到您的電腦上。<br/> -+ %1 已安裝到您的電腦上。<br/> - 現在,您可以重新啟動到您的新系統,或繼續使用 Live 環境。 - - -- -- Close Installer -- 關閉安裝程式 -+ -+ Close Installer -+ 關閉安裝程式 - - -- -- Restart System -- 重新啟動系統 -+ -+ Restart System -+ 重新啟動系統 - - -- -- <p>A full log of the install is available as installation.log in the home directory of the Live user.<br/> -+ -+ <p>A full log of the install is available as installation.log in the home directory of the Live user.<br/> - This log is copied to /var/log/installation.log of the target system.</p> -- <p>完整安裝紀錄檔可在 Live 使用者的家目錄中以 installation.log 的名稱取得。<br/> -+ <p>完整安裝紀錄檔可在 Live 使用者的家目錄中以 installation.log 的名稱取得。<br/> - 此紀錄檔已複製到目標系統的 /var/log/installation.log。</p> - -- -- -+ -+ - finishedq-qt6 - -- -- Installation Completed -- @title -- 安裝完成 -+ -+ Installation Completed -+ @title -+ 安裝完成 - - -- -- %1 has been installed on your computer.<br/> -+ -+ %1 has been installed on your computer.<br/> - You may now restart into your new system, or continue using the Live environment. -- @info, %1 is the product name -- %1 已安裝到您的電腦上。<br/> -+ @info, %1 is the product name -+ %1 已安裝到您的電腦上。<br/> - 現在,您可以重新啟動到您的新系統,或繼續使用 Live 環境。 - - -- -- Close Installer -- @button -- 關閉安裝程式 -+ -+ Close Installer -+ @button -+ 關閉安裝程式 - - -- -- Restart System -- @button -- 重新啟動系統 -+ -+ Restart System -+ @button -+ 重新啟動系統 - - -- -- <p>A full log of the install is available as installation.log in the home directory of the Live user.<br/> -+ -+ <p>A full log of the install is available as installation.log in the home directory of the Live user.<br/> - This log is copied to /var/log/installation.log of the target system.</p> -- @info -- <p>完整安裝紀錄檔可在 Live 使用者的家目錄中以 installation.log 的名稱取得。<br/> -+ @info -+ <p>完整安裝紀錄檔可在 Live 使用者的家目錄中以 installation.log 的名稱取得。<br/> - 此紀錄檔已複製到目標系統的 /var/log/installation.log。</p> - -- -- -+ -+ - finishedq@mobile - -- -- Installation Completed -- @title -- 安裝完成 -+ -+ Installation Completed -+ @title -+ 安裝完成 - - -- -- %1 has been installed on your computer.<br/> -+ -+ %1 has been installed on your computer.<br/> - You may now restart your device. -- @info, %1 is the product name -- %1 已安裝到您的電腦上。<br/> -+ @info, %1 is the product name -+ %1 已安裝到您的電腦上。<br/> - 您現在可以重新啟動您的裝置了。 - - -- -- Close -- @button -- 關閉 -+ -+ Close -+ @button -+ 關閉 - - -- -- Restart -- @button -- 重新啟動 -+ -+ Restart -+ @button -+ 重新啟動 - -- -- -+ -+ - keyboardq - -- -- Select a layout to activate keyboard preview -- @label -- 選取佈局以啟動鍵盤預覽 -+ -+ Select a layout to activate keyboard preview -+ @label -+ 選取佈局以啟動鍵盤預覽 - - -- -- <b>Keyboard model:&nbsp;&nbsp;</b> -- @label -- <b>鍵盤型號:&nbsp;&nbsp;</b> -+ -+ <b>Keyboard model:&nbsp;&nbsp;</b> -+ @label -+ <b>鍵盤型號:&nbsp;&nbsp;</b> - - -- -- Layout -- @label -- 配置 -+ -+ Layout -+ @label -+ 配置 - - -- -- Variant -- @label -- 變體 -+ -+ Variant -+ @label -+ 變體 - - -- -- Type here to test your keyboard… -- @label -- 在此輸入以測試您的鍵盤…… -+ -+ Type here to test your keyboard… -+ @label -+ 在此輸入以測試您的鍵盤…… - -- -- -+ -+ - keyboardq-qt6 - -- -- Select a layout to activate keyboard preview -- @label -- 選取佈局以啟動鍵盤預覽 -+ -+ Select a layout to activate keyboard preview -+ @label -+ 選取佈局以啟動鍵盤預覽 - - -- -- <b>Keyboard model:&nbsp;&nbsp;</b> -- @label -- <b>鍵盤型號:&nbsp;&nbsp;</b> -+ -+ <b>Keyboard model:&nbsp;&nbsp;</b> -+ @label -+ <b>鍵盤型號:&nbsp;&nbsp;</b> - - -- -- Layout -- @label -- 配置 -+ -+ Layout -+ @label -+ 配置 - - -- -- Variant -- @label -- 變體 -+ -+ Variant -+ @label -+ 變體 - - -- -- Type here to test your keyboard… -- @label -- 在此輸入以測試您的鍵盤…… -+ -+ Type here to test your keyboard… -+ @label -+ 在此輸入以測試您的鍵盤…… - -- -- -+ -+ - localeq - -- -- -- Change -- @button -- 變更 -+ -+ -+ Change -+ @button -+ 變更 - - -- -- <h3>Languages</h3> </br> -+ -+ <h3>Languages</h3> </br> - The system locale setting affects the language and character set for some command line user interface elements. The current setting is <strong>%1</strong>. -- @info -- <h3>語言</h3> </br> -+ @info -+ <h3>語言</h3> </br> - 系統語系設定會影響某些命令列使用者介面元素的語言與字元集。目前的設定為 <strong>%1</strong>。 - - -- -- <h3>Locales</h3> </br> -+ -+ <h3>Locales</h3> </br> - The system locale setting affects the numbers and dates format. The current setting is <strong>%1</strong>. -- @info -- <h3>語系</h3> </br> -+ @info -+ <h3>語系</h3> </br> - 系統語系設定會影響數字與日期格式。目前的設定為 <strong>%1</strong>。 - -- -- -+ -+ - localeq-qt6 - -- -- -- Change -- @button -- 變更 -+ -+ -+ Change -+ @button -+ 變更 - - -- -- <h3>Languages</h3> </br> -+ -+ <h3>Languages</h3> </br> - The system locale setting affects the language and character set for some command line user interface elements. The current setting is <strong>%1</strong>. -- @info -- <h3>語言</h3> </br> -+ @info -+ <h3>語言</h3> </br> - 系統語系設定會影響某些命令列使用者介面元素的語言與字元集。目前的設定為 <strong>%1</strong>。 - - -- -- <h3>Locales</h3> </br> -+ -+ <h3>Locales</h3> </br> - The system locale setting affects the numbers and dates format. The current setting is <strong>%1</strong>. -- @info -- <h3>語系</h3> </br> -+ @info -+ <h3>語系</h3> </br> - 系統語系設定會影響數字與日期格式。目前的設定為 <strong>%1</strong>。 - -- -- -+ -+ - notesqml - -- -- <h3>%1</h3> -+ -+ <h3>%1</h3> - <p>These are example release notes.</p> -- <h3>%1</h3> -+ <h3>%1</h3> - <p>此為發行記事範本。</p> - -- -- -+ -+ - packagechooserq - -- -- LibreOffice is a powerful and free office suite, used by millions of people around the world. It includes several applications that make it the most versatile Free and Open Source office suite on the market.<br/> -+ -+ LibreOffice is a powerful and free office suite, used by millions of people around the world. It includes several applications that make it the most versatile Free and Open Source office suite on the market.<br/> - Default option. -- LibreOffice 是強大且自由的辦公室套裝軟體,被世界上數以百萬計的人們使用。其包含了多個應用程式,使其成為市場上功能最強大的自由與開放原始碼辦公室套裝軟體。<br/> -+ LibreOffice 是強大且自由的辦公室套裝軟體,被世界上數以百萬計的人們使用。其包含了多個應用程式,使其成為市場上功能最強大的自由與開放原始碼辦公室套裝軟體。<br/> - 預設選項。 - - -- -- LibreOffice -- LibreOffice -+ -+ LibreOffice -+ LibreOffice - - -- -- If you don't want to install an office suite, just select No Office Suite. You can always add one (or more) later on your installed system as the need arrives. -- 如果您不想安裝辦公室套裝軟體,只要選取「不要辦公室套裝軟體」就好。您隨時都可以在已安裝的系統上新增一個或多個您需要的軟體。 -+ -+ If you don't want to install an office suite, just select No Office Suite. You can always add one (or more) later on your installed system as the need arrives. -+ 如果您不想安裝辦公室套裝軟體,只要選取「不要辦公室套裝軟體」就好。您隨時都可以在已安裝的系統上新增一個或多個您需要的軟體。 - - -- -- No Office Suite -- 不要辦公室套裝軟體 -+ -+ No Office Suite -+ 不要辦公室套裝軟體 - - -- -- Create a minimal Desktop install, remove all extra applications and decide later on what you would like to add to your system. Examples of what won't be on such an install, there will be no Office Suite, no media players, no image viewer or print support. It will be just a desktop, file browser, package manager, text editor and simple web-browser. -- 建立最小化的桌面安裝,移除所有額外的應用程式並稍後再決定您想要新增哪些東西到您的系統中。如此的安裝不會有什麼例子,其不會有辦公室套裝軟體、沒有多媒體播放程式、沒有圖片檢視程式或列印支援。其就只有桌面、檔案瀏覽器、軟體包管理程式、文字編輯器與簡易的網路瀏覽器。 -+ -+ Create a minimal Desktop install, remove all extra applications and decide later on what you would like to add to your system. Examples of what won't be on such an install, there will be no Office Suite, no media players, no image viewer or print support. It will be just a desktop, file browser, package manager, text editor and simple web-browser. -+ 建立最小化的桌面安裝,移除所有額外的應用程式並稍後再決定您想要新增哪些東西到您的系統中。如此的安裝不會有什麼例子,其不會有辦公室套裝軟體、沒有多媒體播放程式、沒有圖片檢視程式或列印支援。其就只有桌面、檔案瀏覽器、軟體包管理程式、文字編輯器與簡易的網路瀏覽器。 - - -- -- Minimal Install -- 最小安裝 -+ -+ Minimal Install -+ 最小安裝 - - -- -- Please select an option for your install, or use the default: LibreOffice included. -- 請選取您安裝的選項,或使用預設:包含 LibreOffice。 -+ -+ Please select an option for your install, or use the default: LibreOffice included. -+ 請選取您安裝的選項,或使用預設:包含 LibreOffice。 - -- -- -+ -+ - packagechooserq-qt6 - -- -- LibreOffice is a powerful and free office suite, used by millions of people around the world. It includes several applications that make it the most versatile Free and Open Source office suite on the market.<br/> -+ -+ LibreOffice is a powerful and free office suite, used by millions of people around the world. It includes several applications that make it the most versatile Free and Open Source office suite on the market.<br/> - Default option. -- LibreOffice 是強大且自由的辦公室套裝軟體,被世界上數以百萬計的人們使用。其包含了多個應用程式,使其成為市場上功能最強大的自由與開放原始碼辦公室套裝軟體。<br/> -+ LibreOffice 是強大且自由的辦公室套裝軟體,被世界上數以百萬計的人們使用。其包含了多個應用程式,使其成為市場上功能最強大的自由與開放原始碼辦公室套裝軟體。<br/> - 預設選項。 - - -- -- LibreOffice -- LibreOffice -+ -+ LibreOffice -+ LibreOffice - - -- -- If you don't want to install an office suite, just select No Office Suite. You can always add one (or more) later on your installed system as the need arrives. -- 如果您不想安裝辦公室套裝軟體,只要選取「不要辦公室套裝軟體」就好。您隨時都可以在已安裝的系統上新增一個或多個您需要的軟體。 -+ -+ If you don't want to install an office suite, just select No Office Suite. You can always add one (or more) later on your installed system as the need arrives. -+ 如果您不想安裝辦公室套裝軟體,只要選取「不要辦公室套裝軟體」就好。您隨時都可以在已安裝的系統上新增一個或多個您需要的軟體。 - - -- -- No Office Suite -- 不要辦公室套裝軟體 -+ -+ No Office Suite -+ 不要辦公室套裝軟體 - - -- -- Create a minimal Desktop install, remove all extra applications and decide later on what you would like to add to your system. Examples of what won't be on such an install, there will be no Office Suite, no media players, no image viewer or print support. It will be just a desktop, file browser, package manager, text editor and simple web-browser. -- 建立最小化的桌面安裝,移除所有額外的應用程式並稍後再決定您想要新增哪些東西到您的系統中。如此的安裝不會有什麼例子,其不會有辦公室套裝軟體、沒有多媒體播放程式、沒有圖片檢視程式或列印支援。其就只有桌面、檔案瀏覽器、軟體包管理程式、文字編輯器與簡易的網路瀏覽器。 -+ -+ Create a minimal Desktop install, remove all extra applications and decide later on what you would like to add to your system. Examples of what won't be on such an install, there will be no Office Suite, no media players, no image viewer or print support. It will be just a desktop, file browser, package manager, text editor and simple web-browser. -+ 建立最小化的桌面安裝,移除所有額外的應用程式並稍後再決定您想要新增哪些東西到您的系統中。如此的安裝不會有什麼例子,其不會有辦公室套裝軟體、沒有多媒體播放程式、沒有圖片檢視程式或列印支援。其就只有桌面、檔案瀏覽器、軟體包管理程式、文字編輯器與簡易的網路瀏覽器。 - - -- -- Minimal Install -- 最小安裝 -+ -+ Minimal Install -+ 最小安裝 - - -- -- Please select an option for your install, or use the default: LibreOffice included. -- 請選取您安裝的選項,或使用預設:包含 LibreOffice。 -+ -+ Please select an option for your install, or use the default: LibreOffice included. -+ 請選取您安裝的選項,或使用預設:包含 LibreOffice。 - -- -- -+ -+ - release_notes - -- -- <h3>%1</h3> -+ <h3>%1</h3> - <p>This an example QML file, showing options in RichText with Flickable content.</p> - - <p>QML with RichText can use HTML tags, Flickable content is useful for touchscreens.</p> -@@ -4888,7 +5016,7 @@ Output: - </ul> - - <p>The vertical scrollbar is adjustable, current width set to 10.</p> -- <h3>%1</h3> -+ <h3>%1</h3> - <p>這是範例 QML 檔案,展示了 RichText 的各種選項,並有可縮放的內容。</p> - - <p>有 RichText 的 QML 可以使用 HTML 標籤,可縮放的內容則對觸控螢幕非常有用。</p> -@@ -4911,335 +5039,364 @@ Output: - <p>垂直捲動軸是可調整的,目前的寬度設定為 10。</p> - - -- -- Back -- 返回 -+ -+ ### %1 -+This an example QML file, showing options in Markdown with Flickable content. -+ -+QML with RichText can use HTML tags, with Markdown it uses the simple Markdown syntax, Flickable content is useful for touchscreens. -+ -+**This is bold text** -+ -+*This is italic text* -+ -+_This is underlined text_ -+ -+> blockquote -+ -+~~This is strikethrough~~ -+ -+Code example: -+``` -+ls -l /home -+``` -+ -+**Lists:** -+ * Intel CPU systems -+ * AMD CPU systems -+ -+The vertical scrollbar is adjustable, current width set to 10. -+ -+ -+ -+ -+ Back -+ 返回 - -- -- -+ -+ - usersq - -- -- Pick your user name and credentials to login and perform admin tasks -- 挑選您的使用者名稱與憑證以登入並執行管理工作 -+ -+ Pick your user name and credentials to login and perform admin tasks -+ 挑選您的使用者名稱與憑證以登入並執行管理工作 - - -- -- What is your name? -- 該如何稱呼您? -+ -+ What is your name? -+ 該如何稱呼您? - - -- -- Your full name -- 您的全名 -+ -+ Your full name -+ 您的全名 - - -- -- What name do you want to use to log in? -- 您想使用何種登入名稱? -+ -+ What name do you want to use to log in? -+ 您想使用何種登入名稱? - - -- -- Login name -- 登入名稱 -+ -+ Login name -+ 登入名稱 - - -- -- If more than one person will use this computer, you can create multiple accounts after installation. -- 若有多於一個人使用此電腦,您可以在安裝後建立多個帳號。 -+ -+ If more than one person will use this computer, you can create multiple accounts after installation. -+ 若有多於一個人使用此電腦,您可以在安裝後建立多個帳號。 - - -- -- Only lowercase letters, numbers, underscore and hyphen are allowed. -- 僅允許小寫字母、數字、底線與連接號。 -+ -+ Only lowercase letters, numbers, underscore and hyphen are allowed. -+ 僅允許小寫字母、數字、底線與連接號。 - - -- -- root is not allowed as username. -- 不允許使用 root 作為使用者名稱。 -+ -+ root is not allowed as username. -+ 不允許使用 root 作為使用者名稱。 - - -- -- What is the name of this computer? -- 這部電腦的名字是? -+ -+ What is the name of this computer? -+ 這部電腦的名字是? - - -- -- Computer name -- 電腦名稱 -+ -+ Computer name -+ 電腦名稱 - - -- -- This name will be used if you make the computer visible to others on a network. -- 若您將此電腦設定為讓網路上的其他電腦可見時將會使用此名稱。 -+ -+ This name will be used if you make the computer visible to others on a network. -+ 若您將此電腦設定為讓網路上的其他電腦可見時將會使用此名稱。 - - -- -- Only letters, numbers, underscore and hyphen are allowed, minimal of two characters. -- 僅允許字母、數字、底線與連接號,最少兩個字元。 -+ -+ Only letters, numbers, underscore and hyphen are allowed, minimal of two characters. -+ 僅允許字母、數字、底線與連接號,最少兩個字元。 - - -- -- localhost is not allowed as hostname. -- 不允許使用 localhost 作為主機名稱。 -+ -+ localhost is not allowed as hostname. -+ 不允許使用 localhost 作為主機名稱。 - - -- -- Choose a password to keep your account safe. -- 輸入密碼以確保帳號的安全性。 -+ -+ Choose a password to keep your account safe. -+ 輸入密碼以確保帳號的安全性。 - - -- -- Password -- 密碼 -+ -+ Password -+ 密碼 - - -- -- Repeat password -- 確認密碼 -+ -+ Repeat password -+ 確認密碼 - - -- -- Enter the same password twice, so that it can be checked for typing errors. A good password will contain a mixture of letters, numbers and punctuation, should be at least eight characters long, and should be changed at regular intervals. -- 輸入同一個密碼兩次,以檢查輸入錯誤。一個好的密碼包含了字母、數字及標點符號的組合、至少八個字母長,且按一固定週期更換。 -+ -+ Enter the same password twice, so that it can be checked for typing errors. A good password will contain a mixture of letters, numbers and punctuation, should be at least eight characters long, and should be changed at regular intervals. -+ 輸入同一個密碼兩次,以檢查輸入錯誤。一個好的密碼包含了字母、數字及標點符號的組合、至少八個字母長,且按一固定週期更換。 - - -- -- Reuse user password as root password -- 重用使用者密碼為 root 密碼 -+ -+ Reuse user password as root password -+ 重用使用者密碼為 root 密碼 - - -- -- Use the same password for the administrator account. -- 為管理員帳號使用同樣的密碼。 -+ -+ Use the same password for the administrator account. -+ 為管理員帳號使用同樣的密碼。 - - -- -- Choose a root password to keep your account safe. -- 選擇 root 密碼來維護您的帳號安全。 -+ -+ Choose a root password to keep your account safe. -+ 選擇 root 密碼來維護您的帳號安全。 - - -- -- Root password -- Root 密碼 -+ -+ Root password -+ Root 密碼 - - -- -- Repeat root password -- 確認 Root 密碼 -+ -+ Repeat root password -+ 確認 Root 密碼 - - -- -- Enter the same password twice, so that it can be checked for typing errors. -- 輸入同樣的密碼兩次,這樣可以檢查輸入錯誤。 -+ -+ Enter the same password twice, so that it can be checked for typing errors. -+ 輸入同樣的密碼兩次,這樣可以檢查輸入錯誤。 - - -- -- Log in automatically without asking for the password -- 自動登入,無需輸入密碼 -+ -+ Log in automatically without asking for the password -+ 自動登入,無需輸入密碼 - - -- -- Validate passwords quality -- 驗證密碼品質 -+ -+ Validate passwords quality -+ 驗證密碼品質 - - -- -- When this box is checked, password-strength checking is done and you will not be able to use a weak password. -- 當此勾選框被勾選,密碼強度檢查即完成,您也無法再使用弱密碼。 -+ -+ When this box is checked, password-strength checking is done and you will not be able to use a weak password. -+ 當此勾選框被勾選,密碼強度檢查即完成,您也無法再使用弱密碼。 - -- -- -+ -+ - usersq-qt6 - -- -- Pick your user name and credentials to login and perform admin tasks -- 挑選您的使用者名稱與憑證以登入並執行管理工作 -+ -+ Pick your user name and credentials to login and perform admin tasks -+ 挑選您的使用者名稱與憑證以登入並執行管理工作 - - -- -- What is your name? -- 該如何稱呼您? -+ -+ What is your name? -+ 該如何稱呼您? - - -- -- Your full name -- 您的全名 -+ -+ Your full name -+ 您的全名 - - -- -- What name do you want to use to log in? -- 您想使用何種登入名稱? -+ -+ What name do you want to use to log in? -+ 您想使用何種登入名稱? - - -- -- Login name -- 登入名稱 -+ -+ Login name -+ 登入名稱 - - -- -- If more than one person will use this computer, you can create multiple accounts after installation. -- 若有多於一個人使用此電腦,您可以在安裝後建立多個帳號。 -+ -+ If more than one person will use this computer, you can create multiple accounts after installation. -+ 若有多於一個人使用此電腦,您可以在安裝後建立多個帳號。 - - -- -- Only lowercase letters, numbers, underscore and hyphen are allowed. -- 僅允許小寫字母、數字、底線與連接號。 -+ -+ Only lowercase letters, numbers, underscore and hyphen are allowed. -+ 僅允許小寫字母、數字、底線與連接號。 - - -- -- root is not allowed as username. -- 不允許使用 root 作為使用者名稱。 -+ -+ root is not allowed as username. -+ 不允許使用 root 作為使用者名稱。 - - -- -- What is the name of this computer? -- 這部電腦的名字是? -+ -+ What is the name of this computer? -+ 這部電腦的名字是? - - -- -- Computer name -- 電腦名稱 -+ -+ Computer name -+ 電腦名稱 - - -- -- This name will be used if you make the computer visible to others on a network. -- 若您將此電腦設定為讓網路上的其他電腦可見時將會使用此名稱。 -+ -+ This name will be used if you make the computer visible to others on a network. -+ 若您將此電腦設定為讓網路上的其他電腦可見時將會使用此名稱。 - - -- -- Only letters, numbers, underscore and hyphen are allowed, minimal of two characters. -- 僅允許字母、數字、底線與連接號,最少兩個字元。 -+ -+ Only letters, numbers, underscore and hyphen are allowed, minimal of two characters. -+ 僅允許字母、數字、底線與連接號,最少兩個字元。 - - -- -- localhost is not allowed as hostname. -- 不允許使用 localhost 作為主機名稱。 -+ -+ localhost is not allowed as hostname. -+ 不允許使用 localhost 作為主機名稱。 - - -- -- Choose a password to keep your account safe. -- 輸入密碼以確保帳號的安全性。 -+ -+ Choose a password to keep your account safe. -+ 輸入密碼以確保帳號的安全性。 - - -- -- Password -- 密碼 -+ -+ Password -+ 密碼 - - -- -- Repeat password -- 確認密碼 -+ -+ Repeat password -+ 確認密碼 - - -- -- Enter the same password twice, so that it can be checked for typing errors. A good password will contain a mixture of letters, numbers and punctuation, should be at least eight characters long, and should be changed at regular intervals. -- 輸入同一個密碼兩次,以檢查輸入錯誤。一個好的密碼包含了字母、數字及標點符號的組合、至少八個字母長,且按一固定週期更換。 -+ -+ Enter the same password twice, so that it can be checked for typing errors. A good password will contain a mixture of letters, numbers and punctuation, should be at least eight characters long, and should be changed at regular intervals. -+ 輸入同一個密碼兩次,以檢查輸入錯誤。一個好的密碼包含了字母、數字及標點符號的組合、至少八個字母長,且按一固定週期更換。 - - -- -- Reuse user password as root password -- 重用使用者密碼為 root 密碼 -+ -+ Reuse user password as root password -+ 重用使用者密碼為 root 密碼 - - -- -- Use the same password for the administrator account. -- 為管理員帳號使用同樣的密碼。 -+ -+ Use the same password for the administrator account. -+ 為管理員帳號使用同樣的密碼。 - - -- -- Choose a root password to keep your account safe. -- 選擇 root 密碼來維護您的帳號安全。 -+ -+ Choose a root password to keep your account safe. -+ 選擇 root 密碼來維護您的帳號安全。 - - -- -- Root password -- Root 密碼 -+ -+ Root password -+ Root 密碼 - - -- -- Repeat root password -- 確認 Root 密碼 -+ -+ Repeat root password -+ 確認 Root 密碼 - - -- -- Enter the same password twice, so that it can be checked for typing errors. -- 輸入同樣的密碼兩次,這樣可以檢查輸入錯誤。 -+ -+ Enter the same password twice, so that it can be checked for typing errors. -+ 輸入同樣的密碼兩次,這樣可以檢查輸入錯誤。 - - -- -- Log in automatically without asking for the password -- 自動登入,無需輸入密碼 -+ -+ Log in automatically without asking for the password -+ 自動登入,無需輸入密碼 - - -- -- Validate passwords quality -- 驗證密碼品質 -+ -+ Validate passwords quality -+ 驗證密碼品質 - - -- -- When this box is checked, password-strength checking is done and you will not be able to use a weak password. -- 當此勾選框被勾選,密碼強度檢查即完成,您也無法再使用弱密碼。 -+ -+ When this box is checked, password-strength checking is done and you will not be able to use a weak password. -+ 當此勾選框被勾選,密碼強度檢查即完成,您也無法再使用弱密碼。 - -- -- -+ -+ - welcomeq - -- -- <h3>Welcome to the %1 <quote>%2</quote> installer</h3> -+ -+ <h3>Welcome to the %1 <quote>%2</quote> installer</h3> - <p>This program will ask you some questions and set up %1 on your computer.</p> -- <h3>歡迎使用 %1 <quote>%2</quote> 安裝程式</h3> -+ <h3>歡迎使用 %1 <quote>%2</quote> 安裝程式</h3> - <p>本程式將會問您一些問題並在您的電腦上安裝及設定 %1。</p> - - -- -- Support -- 支援 -+ -+ Support -+ 支援 - - -- -- Known Issues -- 已知問題 -+ -+ Known Issues -+ 已知問題 - - -- -- Release Notes -- 發行註記 -+ -+ Release Notes -+ 發行註記 - - -- -- Donate -- 捐助 -+ -+ Donate -+ 捐助 - -- -- -+ -+ - welcomeq-qt6 - -- -- <h3>Welcome to the %1 <quote>%2</quote> installer</h3> -+ -+ <h3>Welcome to the %1 <quote>%2</quote> installer</h3> - <p>This program will ask you some questions and set up %1 on your computer.</p> -- <h3>歡迎使用 %1 <quote>%2</quote> 安裝程式</h3> -+ <h3>歡迎使用 %1 <quote>%2</quote> 安裝程式</h3> - <p>本程式將會問您一些問題並在您的電腦上安裝及設定 %1。</p> - - -- -- Support -- 支援 -+ -+ Support -+ 支援 - - -- -- Known Issues -- 已知問題 -+ -+ Known Issues -+ 已知問題 - - -- -- Release Notes -- 發行註記 -+ -+ Release Notes -+ 發行註記 - - -- -- Donate -- 捐助 -+ -+ Donate -+ 捐助 - -- -+ - -diff --git a/lang/python/en_US/LC_MESSAGES/python.po b/lang/python/en_US/LC_MESSAGES/python.po -new file mode 100644 -index 0000000..e323c0c ---- /dev/null -+++ b/lang/python/en_US/LC_MESSAGES/python.po -@@ -0,0 +1,399 @@ -+# SOME DESCRIPTIVE TITLE. -+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -+# This file is distributed under the same license as the PACKAGE package. -+# FIRST AUTHOR , YEAR. -+# -+# Translators: -+# Jason Collins , 2018 -+# Karthik Balan , 2021 -+# -+#, fuzzy -+msgid "" -+msgstr "" -+"Project-Id-Version: PACKAGE VERSION\n" -+"Report-Msgid-Bugs-To: \n" -+"POT-Creation-Date: 2024-02-12 21:37+0100\n" -+"PO-Revision-Date: 2017-08-09 10:34+0000\n" -+"Last-Translator: Karthik Balan , 2021\n" -+"Language-Team: English (United Kingdom) (https://app.transifex.com/calamares/teams/20061/en_GB/)\n" -+"MIME-Version: 1.0\n" -+"Content-Type: text/plain; charset=UTF-8\n" -+"Content-Transfer-Encoding: 8bit\n" -+"Language: en_GB\n" -+"Plural-Forms: nplurals=2; plural=(n != 1);\n" -+ -+#: src/modules/bootloader/main.py:46 -+msgid "Install bootloader." -+msgstr "" -+ -+#: src/modules/bootloader/main.py:666 -+msgid "Failed to install grub, no partitions defined in global storage" -+msgstr "" -+ -+#: src/modules/bootloader/main.py:926 -+msgid "Bootloader installation error" -+msgstr "Bootloader installation error" -+ -+#: src/modules/bootloader/main.py:927 -+msgid "" -+"The bootloader could not be installed. The installation command " -+"
{!s}
returned error code {!s}." -+msgstr "" -+ -+#: src/modules/displaymanager/main.py:509 -+msgid "Cannot write LXDM configuration file" -+msgstr "" -+ -+#: src/modules/displaymanager/main.py:510 -+msgid "LXDM config file {!s} does not exist" -+msgstr "" -+ -+#: src/modules/displaymanager/main.py:598 -+msgid "Cannot write LightDM configuration file" -+msgstr "" -+ -+#: src/modules/displaymanager/main.py:599 -+msgid "LightDM config file {!s} does not exist" -+msgstr "" -+ -+#: src/modules/displaymanager/main.py:684 -+msgid "Cannot configure LightDM" -+msgstr "" -+ -+#: src/modules/displaymanager/main.py:685 -+msgid "No LightDM greeter installed." -+msgstr "" -+ -+#: src/modules/displaymanager/main.py:716 -+msgid "Cannot write SLIM configuration file" -+msgstr "" -+ -+#: src/modules/displaymanager/main.py:717 -+msgid "SLIM config file {!s} does not exist" -+msgstr "" -+ -+#: src/modules/displaymanager/main.py:938 -+msgid "No display managers selected for the displaymanager module." -+msgstr "" -+ -+#: src/modules/displaymanager/main.py:939 -+msgid "" -+"The displaymanagers list is empty or undefined in both globalstorage and " -+"displaymanager.conf." -+msgstr "" -+ -+#: src/modules/displaymanager/main.py:1026 -+msgid "Display manager configuration was incomplete" -+msgstr "" -+ -+#: src/modules/dracut/main.py:29 -+msgid "Creating initramfs with dracut." -+msgstr "" -+ -+#: src/modules/dracut/main.py:63 -+msgid "Failed to run dracut" -+msgstr "" -+ -+#: src/modules/dracut/main.py:64 -+#, python-brace-format -+msgid "Dracut failed to run on the target with return code: {return_code}" -+msgstr "" -+ -+#: src/modules/dummypython/main.py:35 -+msgid "Dummy python job." -+msgstr "Dummy python job." -+ -+#: src/modules/dummypython/main.py:37 src/modules/dummypython/main.py:104 -+#: src/modules/dummypython/main.py:105 -+msgid "Dummy python step {}" -+msgstr "Dummy python step {}" -+ -+#: src/modules/fstab/main.py:29 -+msgid "Writing fstab." -+msgstr "" -+ -+#: src/modules/fstab/main.py:378 src/modules/fstab/main.py:384 -+#: src/modules/fstab/main.py:412 src/modules/initcpiocfg/main.py:256 -+#: src/modules/initcpiocfg/main.py:260 src/modules/initramfscfg/main.py:85 -+#: src/modules/initramfscfg/main.py:89 src/modules/localecfg/main.py:140 -+#: src/modules/mount/main.py:334 src/modules/networkcfg/main.py:106 -+#: src/modules/openrcdmcryptcfg/main.py:72 -+#: src/modules/openrcdmcryptcfg/main.py:76 src/modules/rawfs/main.py:164 -+msgid "Configuration Error" -+msgstr "Configuration Error " -+ -+#: src/modules/fstab/main.py:379 src/modules/initramfscfg/main.py:86 -+#: src/modules/mount/main.py:335 src/modules/openrcdmcryptcfg/main.py:73 -+#: src/modules/rawfs/main.py:165 -+msgid "No partitions are defined for
{!s}
to use." -+msgstr "" -+ -+#: src/modules/fstab/main.py:385 src/modules/initramfscfg/main.py:90 -+#: src/modules/localecfg/main.py:141 src/modules/networkcfg/main.py:107 -+#: src/modules/openrcdmcryptcfg/main.py:77 -+msgid "No root mount point is given for
{!s}
to use." -+msgstr "" -+ -+#: src/modules/fstab/main.py:413 -+msgid "No
{!s}
configuration is given for
{!s}
to use." -+msgstr "" -+ -+#: src/modules/grubcfg/main.py:30 -+msgid "Configure GRUB." -+msgstr "" -+ -+#: src/modules/hwclock/main.py:26 -+msgid "Setting hardware clock." -+msgstr "" -+ -+#: src/modules/initcpiocfg/main.py:27 -+msgid "Configuring mkinitcpio." -+msgstr "" -+ -+#: src/modules/initcpiocfg/main.py:257 -+msgid "No partitions are defined for
initcpiocfg
." -+msgstr "" -+ -+#: src/modules/initcpiocfg/main.py:261 -+msgid "No root mount point for
initcpiocfg
." -+msgstr "" -+ -+#: src/modules/initramfscfg/main.py:32 -+msgid "Configuring initramfs." -+msgstr "" -+ -+#: src/modules/localecfg/main.py:31 -+msgid "Configuring locales." -+msgstr "" -+ -+#: src/modules/mkinitfs/main.py:27 -+msgid "Creating initramfs with mkinitfs." -+msgstr "" -+ -+#: src/modules/mkinitfs/main.py:49 -+msgid "Failed to run mkinitfs on the target" -+msgstr "" -+ -+#: src/modules/mkinitfs/main.py:50 -+msgid "The exit code was {}" -+msgstr "" -+ -+#: src/modules/mount/main.py:43 -+msgid "Mounting partitions." -+msgstr "" -+ -+#: src/modules/mount/main.py:164 src/modules/mount/main.py:200 -+msgid "Internal error mounting zfs datasets" -+msgstr "" -+ -+#: src/modules/mount/main.py:176 -+msgid "Failed to import zpool" -+msgstr "" -+ -+#: src/modules/mount/main.py:192 -+msgid "Failed to unlock zpool" -+msgstr "" -+ -+#: src/modules/mount/main.py:209 src/modules/mount/main.py:214 -+msgid "Failed to set zfs mountpoint" -+msgstr "" -+ -+#: src/modules/mount/main.py:370 -+msgid "zfs mounting error" -+msgstr "" -+ -+#: src/modules/networkcfg/main.py:30 -+msgid "Saving network configuration." -+msgstr "Saving network configuration " -+ -+#: src/modules/openrcdmcryptcfg/main.py:26 -+msgid "Configuring OpenRC dmcrypt service." -+msgstr "" -+ -+#: src/modules/packages/main.py:54 src/modules/packages/main.py:65 -+#: src/modules/packages/main.py:75 -+msgid "Install packages." -+msgstr "Install packages." -+ -+#: src/modules/packages/main.py:63 -+#, python-format -+msgid "Processing packages (%(count)d / %(total)d)" -+msgstr "Processing packages (%(count)d / %(total)d)" -+ -+#: src/modules/packages/main.py:68 -+#, python-format -+msgid "Installing one package." -+msgid_plural "Installing %(num)d packages." -+msgstr[0] "Installing one package." -+msgstr[1] "Installing %(num)d packages." -+ -+#: src/modules/packages/main.py:71 -+#, python-format -+msgid "Removing one package." -+msgid_plural "Removing %(num)d packages." -+msgstr[0] "Removing one package." -+msgstr[1] "Removing %(num)d packages." -+ -+#: src/modules/packages/main.py:740 src/modules/packages/main.py:752 -+#: src/modules/packages/main.py:780 -+msgid "Package Manager error" -+msgstr "Package Manager error" -+ -+#: src/modules/packages/main.py:741 -+msgid "" -+"The package manager could not prepare updates. The command
{!s}
" -+"returned error code {!s}." -+msgstr "" -+ -+#: src/modules/packages/main.py:753 -+msgid "" -+"The package manager could not update the system. The command
{!s}
" -+" returned error code {!s}." -+msgstr "" -+ -+#: src/modules/packages/main.py:781 -+msgid "" -+"The package manager could not make changes to the installed system. The " -+"command
{!s}
returned error code {!s}." -+msgstr "" -+ -+#: src/modules/plymouthcfg/main.py:27 -+msgid "Configure Plymouth theme" -+msgstr "" -+ -+#: src/modules/rawfs/main.py:26 -+msgid "Installing data." -+msgstr "" -+ -+#: src/modules/services-openrc/main.py:29 -+msgid "Configure OpenRC services" -+msgstr "Configure OpenRC services" -+ -+#: src/modules/services-openrc/main.py:57 -+msgid "Cannot add service {name!s} to run-level {level!s}." -+msgstr "" -+ -+#: src/modules/services-openrc/main.py:59 -+msgid "Cannot remove service {name!s} from run-level {level!s}." -+msgstr "" -+ -+#: src/modules/services-openrc/main.py:61 -+msgid "" -+"Unknown service-action {arg!s} for service {name!s} in run-" -+"level {level!s}." -+msgstr "" -+ -+#: src/modules/services-openrc/main.py:93 -+msgid "Cannot modify service" -+msgstr "" -+ -+#: src/modules/services-openrc/main.py:94 -+msgid "" -+"rc-update {arg!s} call in chroot returned error code {num!s}." -+msgstr "" -+ -+#: src/modules/services-openrc/main.py:101 -+msgid "Target runlevel does not exist" -+msgstr "Target runlevel does not exist" -+ -+#: src/modules/services-openrc/main.py:102 -+msgid "" -+"The path for runlevel {level!s} is {path!s}, which does not " -+"exist." -+msgstr "" -+ -+#: src/modules/services-openrc/main.py:110 -+msgid "Target service does not exist" -+msgstr "" -+ -+#: src/modules/services-openrc/main.py:111 -+msgid "" -+"The path for service {name!s} is {path!s}, which does not " -+"exist." -+msgstr "" -+ -+#: src/modules/services-systemd/main.py:26 -+msgid "Configure systemd units" -+msgstr "" -+ -+#: src/modules/services-systemd/main.py:64 -+msgid "Cannot modify unit" -+msgstr "" -+ -+#: src/modules/services-systemd/main.py:65 -+msgid "" -+"systemctl {_action!s} call in chroot returned error code " -+"{_exit_code!s}." -+msgstr "" -+ -+#: src/modules/services-systemd/main.py:66 -+msgid "Cannot {_action!s} systemd unit {_name!s}." -+msgstr "" -+ -+#: src/modules/unpackfs/main.py:34 -+msgid "Filling up filesystems." -+msgstr "" -+ -+#: src/modules/unpackfs/main.py:254 -+msgid "rsync failed with error code {}." -+msgstr "" -+ -+#: src/modules/unpackfs/main.py:299 -+msgid "Unpacking image {}/{}, file {}/{}" -+msgstr "" -+ -+#: src/modules/unpackfs/main.py:314 -+msgid "Starting to unpack {}" -+msgstr "" -+ -+#: src/modules/unpackfs/main.py:323 src/modules/unpackfs/main.py:467 -+msgid "Failed to unpack image \"{}\"" -+msgstr "" -+ -+#: src/modules/unpackfs/main.py:430 -+msgid "No mount point for root partition" -+msgstr "" -+ -+#: src/modules/unpackfs/main.py:431 -+msgid "globalstorage does not contain a \"rootMountPoint\" key." -+msgstr "" -+ -+#: src/modules/unpackfs/main.py:434 -+msgid "Bad mount point for root partition" -+msgstr "" -+ -+#: src/modules/unpackfs/main.py:435 -+msgid "rootMountPoint is \"{}\", which does not exist." -+msgstr "" -+ -+#: src/modules/unpackfs/main.py:439 src/modules/unpackfs/main.py:455 -+#: src/modules/unpackfs/main.py:459 src/modules/unpackfs/main.py:465 -+#: src/modules/unpackfs/main.py:480 -+msgid "Bad unpackfs configuration" -+msgstr "" -+ -+#: src/modules/unpackfs/main.py:440 -+msgid "There is no configuration information." -+msgstr "" -+ -+#: src/modules/unpackfs/main.py:456 -+msgid "The filesystem for \"{}\" ({}) is not supported by your current kernel" -+msgstr "" -+ -+#: src/modules/unpackfs/main.py:460 -+msgid "The source filesystem \"{}\" does not exist" -+msgstr "" -+ -+#: src/modules/unpackfs/main.py:466 -+msgid "" -+"Failed to find unsquashfs, make sure you have the squashfs-tools package " -+"installed." -+msgstr "" -+ -+#: src/modules/unpackfs/main.py:481 -+msgid "The destination \"{}\" in the target system is not a directory" -+msgstr "" -+ -+#: src/modules/zfshostid/main.py:27 -+msgid "Copying zfs generated hostid." -+msgstr "" ++
-- -2.43.0 +2.46.0 diff --git a/0003-calamares.patch b/0003-calamares.patch index e2ce5fd..7937c9e 100644 --- a/0003-calamares.patch +++ b/0003-calamares.patch @@ -1,1441 +1,563 @@ -From c56fc65fc13db133e4e7190d638cad608e3b7579 Mon Sep 17 00:00:00 2001 -From: cui-gaoleng <562344211@qq.com> -Date: Fri, 8 Nov 2024 01:04:06 +0800 -Subject: [PATCH 1/4] =?UTF-8?q?calamares=E6=96=87=E4=BB=B6=E5=A4=B9?= -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit +From 8ce162b3e77a1d3c2afbfb6082fe7877cbdc592f Mon Sep 17 00:00:00 2001 +From: lizixin <2271170409@qq.com> +Date: Fri, 27 Dec 2024 15:08:58 +0800 +Subject: [PATCH 2/6] calamares --- - src/calamares/CalamaresApplication.cpp | 605 ++++++++++--------- - src/calamares/CalamaresApplication.h | 128 ++-- - src/calamares/CalamaresWindow.cpp | 88 +-- - src/calamares/CalamaresWindow.h | 100 +-- - src/calamares/DebugWindow.cpp | 14 +- - src/calamares/DebugWindow.ui | 314 +++++----- - src/calamares/calamares-3.3.7.code-workspace | 11 + - 7 files changed, 646 insertions(+), 614 deletions(-) - create mode 100644 src/calamares/calamares-3.3.7.code-workspace + src/calamares/CalamaresApplication.cpp | 4 +- + src/calamares/DebugWindow.cpp | 530 ++++++++++++------------- + 2 files changed, 267 insertions(+), 267 deletions(-) diff --git a/src/calamares/CalamaresApplication.cpp b/src/calamares/CalamaresApplication.cpp -index 09d3bfc..a07edad 100644 +index a07edad..6b62fd6 100644 --- a/src/calamares/CalamaresApplication.cpp +++ b/src/calamares/CalamaresApplication.cpp -@@ -1,302 +1,303 @@ +@@ -51,8 +51,8 @@ CalamaresApplication::CalamaresApplication( int& argc, char* argv[] ) + // directory -- where Calamares stores logs, for instance -- + // //, so we end up with ~/.cache/Calamares/calamares/ + // which is excessively squidly. +- // +- // setOrganizationName( QStringLiteral( CALAMARES_ORGANIZATION_NAME ) ); ++ ++ + setOrganizationDomain( QStringLiteral( CALAMARES_ORGANIZATION_DOMAIN ) ); + setApplicationName( QStringLiteral( CALAMARES_APPLICATION_NAME ) ); + setApplicationVersion( QStringLiteral( CALAMARES_VERSION ) ); +diff --git a/src/calamares/DebugWindow.cpp b/src/calamares/DebugWindow.cpp +index b28661e..69584b8 100644 +--- a/src/calamares/DebugWindow.cpp ++++ b/src/calamares/DebugWindow.cpp +@@ -1,265 +1,265 @@ -/* === This file is part of Calamares - === - * -- * SPDX-FileCopyrightText: 2014-2015 Teo Mrnjavac -- * SPDX-FileCopyrightText: 2018 Adriaan de Groot +- * SPDX-FileCopyrightText: 2015-2016 Teo Mrnjavac +- * SPDX-FileCopyrightText: 2019 Adriaan de Groot - * SPDX-License-Identifier: GPL-3.0-or-later - * - * Calamares is Free Software: see the License-Identifier above. - * - */ --#include "CalamaresApplication.h" - --#include "CalamaresConfig.h" --#include "CalamaresVersionX.h" --#include "CalamaresWindow.h" --#include "progresstree/ProgressTreeView.h" +-#include "DebugWindow.h" +-#include "ui_DebugWindow.h" - -#include "Branding.h" +-#include "CalamaresAbout.h" +-#include "CalamaresVersion.h" +-#include "GlobalStorage.h" +-#include "Job.h" -#include "JobQueue.h" -#include "Settings.h" --#include "ViewManager.h" --#include "locale/TranslationsModel.h" +-#include "VariantModel.h" +-#include "modulesystem/Module.h" -#include "modulesystem/ModuleManager.h" --#include "utils/Dirs.h" -#include "utils/Gui.h" -#include "utils/Logger.h" --#include "utils/System.h" --#ifdef WITH_QML --#include "utils/Qml.h" --#endif +-#include "utils/Paste.h" -#include "utils/Retranslator.h" --#include "viewpages/ViewStep.h" +-#include "widgets/TranslationFix.h" - --#include --#include --#include --#include +-#include +-#include +-#include +-#include +-#include - --/// @brief Convenience for "are the settings in debug mode" --static bool --isDebug() --{ -- return Calamares::Settings::instance() && Calamares::Settings::instance()->debugMode(); --} +-#include +-#include - --CalamaresApplication::CalamaresApplication( int& argc, char* argv[] ) -- : QApplication( argc, argv ) -- , m_mainwindow( nullptr ) -- , m_moduleManager( nullptr ) +-/** +- * @brief crash makes Calamares crash immediately. +- */ +-static void +-crash() -{ -- // Setting the organization name makes the default cache -- // directory -- where Calamares stores logs, for instance -- -- // //, so we end up with ~/.cache/Calamares/calamares/ -- // which is excessively squidly. -- // -- // setOrganizationName( QStringLiteral( CALAMARES_ORGANIZATION_NAME ) ); -- setOrganizationDomain( QStringLiteral( CALAMARES_ORGANIZATION_DOMAIN ) ); -- setApplicationName( QStringLiteral( CALAMARES_APPLICATION_NAME ) ); -- setApplicationVersion( QStringLiteral( CALAMARES_VERSION ) ); -- -- QFont f = font(); -- Calamares::setDefaultFontSize( f.pointSize() ); +- kill( getpid(), SIGTRAP ); -} - --void --CalamaresApplication::init() +-/// @brief Print out the widget tree (names) in indented form. +-static void +-dumpWidgetTree( QDebug& deb, const QWidget* widget, int depth ) -{ -- Logger::setupLogfile(); -- cDebug() << "Calamares version:" << CALAMARES_VERSION; -- cDebug() << Logger::SubEntry << "Using Qt version:" << qVersion(); -- cDebug() << Logger::SubEntry << "Build type:" << CMAKE_BUILD_TYPE; --#ifdef WITH_PYBIND11 -- cDebug() << Logger::SubEntry << "Using PyBind11"; --#endif --#ifdef WITH_BOOST_PYTHON -- cDebug() << Logger::SubEntry << "Using Boost Python"; --#endif -- cDebug() << Logger::SubEntry << "Using settings:" << Calamares::Settings::instance()->path(); -- cDebug() << Logger::SubEntry << "Using log file:" << Logger::logFile(); -- cDebug() << Logger::SubEntry << "Languages:" << Calamares::Locale::availableLanguages(); -- -- if ( !Calamares::Settings::instance() ) +- if ( !widget ) - { -- cError() << "Must create Calamares::Settings before the application."; -- ::exit( 1 ); +- return; - } -- initQmlPath(); -- initBranding(); - -- Calamares::installTranslator(); -- -- setQuitOnLastWindowClosed( false ); -- setWindowIcon( QIcon( Calamares::Branding::instance()->imagePath( Calamares::Branding::ProductIcon ) ) ); -- -- cDebug() << Logger::SubEntry << "STARTUP: initSettings, initQmlPath, initBranding done"; -- -- initModuleManager(); //also shows main window +- deb << Logger::Continuation; +- for ( int i = 0; i < depth; ++i ) +- { +- deb << ' '; +- } +- deb << widget->metaObject()->className() << widget->objectName(); - -- cDebug() << Logger::SubEntry << "STARTUP: initModuleManager: module init started"; +- for ( const auto* w : widget->findChildren< QWidget* >( QString(), Qt::FindDirectChildrenOnly ) ) +- { +- dumpWidgetTree( deb, w, depth + 1 ); +- } -} - --CalamaresApplication::~CalamaresApplication() +-namespace Calamares -{ -- Logger::CDebug( Logger::LOGVERBOSE ) << "Shutting down Calamares..."; -- Logger::CDebug( Logger::LOGVERBOSE ) << Logger::SubEntry << "Finished shutdown."; --} - --CalamaresApplication* --CalamaresApplication::instance() +-DebugWindow::DebugWindow() +- : QWidget( nullptr ) +- , m_ui( new Ui::DebugWindow ) +- , m_globals( JobQueue::instance()->globalStorage()->data() ) +- , m_globals_model( std::make_unique< VariantModel >( &m_globals ) ) +- , m_module_model( std::make_unique< VariantModel >( &m_module ) ) -{ -- return qobject_cast< CalamaresApplication* >( QApplication::instance() ); +- GlobalStorage* gs = JobQueue::instance()->globalStorage(); +- +- m_ui->setupUi( this ); +- +- m_ui->globalStorageView->setModel( m_globals_model.get() ); +- m_ui->globalStorageView->expandAll(); +- +- // Do above when the GS changes, too +- connect( gs, +- &GlobalStorage::changed, +- this, +- [ = ] +- { +- m_globals = JobQueue::instance()->globalStorage()->data(); +- m_globals_model->reload(); +- m_ui->globalStorageView->expandAll(); +- } ); +- +- // JobQueue page +- m_ui->jobQueueText->setReadOnly( true ); +- connect( JobQueue::instance(), +- &JobQueue::queueChanged, +- this, +- [ this ]( const QStringList& jobs ) { m_ui->jobQueueText->setText( jobs.join( '\n' ) ); } ); +- +- // Modules page +- QStringList modulesKeys; +- for ( const auto& m : ModuleManager::instance()->loadedInstanceKeys() ) +- { +- modulesKeys << m.toString(); +- } +- +- QStringListModel* modulesModel = new QStringListModel( modulesKeys ); +- m_ui->modulesListView->setModel( modulesModel ); +- m_ui->modulesListView->setSelectionMode( QAbstractItemView::SingleSelection ); +- +- m_ui->moduleConfigView->setModel( m_module_model.get() ); +- +- connect( m_ui->modulesListView->selectionModel(), +- &QItemSelectionModel::selectionChanged, +- this, +- [ this ] +- { +- QString moduleName = m_ui->modulesListView->currentIndex().data().toString(); +- Module* module +- = ModuleManager::instance()->moduleInstance( ModuleSystem::InstanceKey::fromString( moduleName ) ); +- if ( module ) +- { +- m_module = module->configurationMap(); +- m_module_model->reload(); +- m_ui->moduleConfigView->expandAll(); +- m_ui->moduleTypeLabel->setText( module->typeString() ); +- m_ui->moduleInterfaceLabel->setText( module->interfaceString() ); +- } +- } ); +- +- // Tools page +- connect( m_ui->crashButton, &QPushButton::clicked, this, [] { ::crash(); } ); +- connect( m_ui->reloadStylesheetButton, +- &QPushButton::clicked, +- []() +- { +- for ( auto* w : qApp->topLevelWidgets() ) +- { +- // Needs to match what's set in CalamaresWindow +- if ( w->objectName() == QStringLiteral( "mainApp" ) ) +- { +- w->setStyleSheet( Calamares::Branding::instance()->stylesheet() ); +- } +- } +- } ); +- connect( m_ui->widgetTreeButton, +- &QPushButton::clicked, +- []() +- { +- for ( auto* w : qApp->topLevelWidgets() ) +- { +- Logger::CDebug deb; +- dumpWidgetTree( deb, w, 0 ); +- } +- } ); +- +- // Send Log button only if it would be useful +- m_ui->sendLogButton->setVisible( Calamares::Paste::isEnabled() ); +- connect( m_ui->sendLogButton, &QPushButton::clicked, [ this ]() { Calamares::Paste::doLogUploadUI( this ); } ); +- +- CALAMARES_RETRANSLATE( m_ui->retranslateUi( this ); setWindowTitle( tr( "Debug Information", "@title" ) ); ); -} - --CalamaresWindow* --CalamaresApplication::mainWindow() +-void +-DebugWindow::closeEvent( QCloseEvent* e ) -{ -- return m_mainwindow; +- Q_UNUSED( e ) +- emit closed(); -} - --static QStringList --brandingFileCandidates( bool assumeBuilddir, const QString& brandingFilename ) +-DebugWindowManager::DebugWindowManager( QObject* parent ) +- : QObject( parent ) -{ -- QStringList brandingPaths; -- if ( Calamares::isAppDataDirOverridden() ) -- { -- brandingPaths << Calamares::appDataDir().absoluteFilePath( brandingFilename ); -- } -- else -- { -- if ( assumeBuilddir ) -- { -- brandingPaths << ( QDir::currentPath() + QStringLiteral( "/src/" ) + brandingFilename ); -- } -- if ( Calamares::haveExtraDirs() ) -- { -- for ( auto s : Calamares::extraDataDirs() ) -- { -- brandingPaths << ( s + brandingFilename ); -- } -- } -- brandingPaths << QDir( CMAKE_INSTALL_FULL_SYSCONFDIR "/calamares/" ).absoluteFilePath( brandingFilename ); -- brandingPaths << Calamares::appDataDir().absoluteFilePath( brandingFilename ); -- } -- -- return brandingPaths; -} - --void --CalamaresApplication::initQmlPath() +-bool +-DebugWindowManager::enabled() const -{ --#ifdef WITH_QML -- if ( !Calamares::initQmlModulesDir() ) -- { -- ::exit( EXIT_FAILURE ); -- } --#endif +- const auto* s = Settings::instance(); +- return ( Logger::logLevel() >= Logger::LOGVERBOSE ) || ( s ? s->debugMode() : false ); -} - -void --CalamaresApplication::initBranding() +-DebugWindowManager::show( bool visible ) -{ -- QString brandingComponentName = Calamares::Settings::instance()->brandingComponentName(); -- if ( brandingComponentName.simplified().isEmpty() ) +- if ( !enabled() ) - { -- cError() << "FATAL: branding component not set in settings.conf"; -- ::exit( EXIT_FAILURE ); +- visible = false; - } -- -- QString brandingDescriptorSubpath = QString( "branding/%1/branding.desc" ).arg( brandingComponentName ); -- QStringList brandingFileCandidatesByPriority = brandingFileCandidates( isDebug(), brandingDescriptorSubpath ); -- -- QFileInfo brandingFile; -- bool found = false; -- -- foreach ( const QString& path, brandingFileCandidatesByPriority ) +- if ( m_visible == visible ) - { -- QFileInfo pathFi( path ); -- if ( pathFi.exists() && pathFi.isReadable() ) -- { -- brandingFile = pathFi; -- found = true; -- break; -- } +- return; - } - -- if ( !found || !brandingFile.exists() || !brandingFile.isReadable() ) +- if ( visible ) - { -- cError() << "Cowardly refusing to continue startup without branding." -- << Logger::DebugList( brandingFileCandidatesByPriority ); -- if ( Calamares::isAppDataDirOverridden() ) -- { -- cError() << "FATAL: explicitly configured application data directory is missing" << brandingComponentName; -- } -- else -- { -- cError() << "FATAL: none of the expected branding descriptor file paths exist."; -- } -- ::exit( EXIT_FAILURE ); +- m_debugWindow = new Calamares::DebugWindow(); +- m_debugWindow->show(); +- connect( m_debugWindow.data(), +- &Calamares::DebugWindow::closed, +- this, +- [ = ]() +- { +- m_debugWindow->deleteLater(); +- m_visible = false; +- emit visibleChanged( false ); +- } ); +- m_visible = true; +- emit visibleChanged( true ); - } -- -- new Calamares::Branding( brandingFile.absoluteFilePath(), this, devicePixelRatio() ); --} -- --void --CalamaresApplication::initModuleManager() --{ -- m_moduleManager = new Calamares::ModuleManager( Calamares::Settings::instance()->modulesSearchPaths(), this ); -- connect( m_moduleManager, &Calamares::ModuleManager::initDone, this, &CalamaresApplication::initView ); -- m_moduleManager->init(); --} -- --/** @brief centers the widget @p w on (a) screen -- * -- * This tries to duplicate the (deprecated) qApp->desktop()->availableGeometry() -- * placement by iterating over screens and putting Calamares in the first -- * one where it fits; this is *generally* the primary screen. -- * -- * With debugging, it would look something like this (2 screens attached, -- * primary at +1080+240 because I have a very strange X setup). Before -- * being mapped, the Calamares window is at +0+0 but does have a size. -- * The first screen's geometry includes the offset from the origin in -- * screen coordinates. -- * -- * Proposed window size: 1024 520 -- * Window QRect(0,0 1024x520) -- * Screen QRect(1080,240 2560x1440) -- * Moving QPoint(1848,700) -- * Screen QRect(0,0 1080x1920) -- * -- */ --static void --centerWindowOnScreen( QWidget* w ) --{ -- QList< QScreen* > screens = qApp->screens(); -- QPoint windowCenter = w->rect().center(); -- QSize windowSize = w->rect().size(); -- -- for ( const auto* screen : screens ) +- else - { -- QSize screenSize = screen->availableGeometry().size(); -- if ( ( screenSize.width() >= windowSize.width() ) && ( screenSize.height() >= windowSize.height() ) ) +- if ( m_debugWindow ) - { -- w->move( screen->availableGeometry().center() - windowCenter ); -- break; +- m_debugWindow->deleteLater(); - } +- m_visible = false; +- emit visibleChanged( false ); - } -} - -void --CalamaresApplication::initView() +-DebugWindowManager::toggle() -{ -- cDebug() << "STARTUP: initModuleManager: all modules init done"; -- initJobQueue(); -- cDebug() << "STARTUP: initJobQueue done"; -- -- m_mainwindow = new CalamaresWindow(); //also creates ViewManager -- -- connect( m_moduleManager, &Calamares::ModuleManager::modulesLoaded, this, &CalamaresApplication::initViewSteps ); -- connect( m_moduleManager, &Calamares::ModuleManager::modulesFailed, this, &CalamaresApplication::initFailed ); -- -- QTimer::singleShot( 0, m_moduleManager, &Calamares::ModuleManager::loadModules ); -- -- if ( Calamares::Branding::instance() && Calamares::Branding::instance()->windowPlacementCentered() ) -- { -- centerWindowOnScreen( m_mainwindow ); -- } -- cDebug() << "STARTUP: CalamaresWindow created; loadModules started"; +- show( !m_visible ); -} - -void --CalamaresApplication::initViewSteps() +-DebugWindowManager::about() -{ -- cDebug() << "STARTUP: loadModules for all modules done"; -- m_moduleManager->checkRequirements(); -- if ( Calamares::Branding::instance()->windowMaximize() ) -- { -- m_mainwindow->setWindowFlag( Qt::FramelessWindowHint ); -- m_mainwindow->showMaximized(); -- } -- else +- QString title = Calamares::Settings::instance()->isSetupMode() +- ? QCoreApplication::translate( "WelcomePage", "About %1 Setup", "@title" ) +- : QCoreApplication::translate( "WelcomePage", "About %1 Installer", "@title" ); +- QMessageBox mb( QMessageBox::Information, +- title.arg( CALAMARES_APPLICATION_NAME ), +- Calamares::aboutString().arg( Calamares::Branding::instance()->versionedName() ), +- QMessageBox::Ok, +- nullptr ); +- Calamares::fixButtonLabels( &mb ); +- mb.setStyleSheet( +- "QMessageBox {" +- "border: 1px solid hsl(240,2%,79%);" +- "border-radius: 5px;" +- "background-color: #FFFFFF;" // 设置对话框背景颜色 +- "}" +- ); +- mb.setWindowFlags(Qt::FramelessWindowHint | Qt::Dialog); +- mb.setIconPixmap( +- Calamares::defaultPixmap( Calamares::BigLogo,//Biglogo.svg +- Calamares::Original, +- QSize( 321/1.9, 297/2 ) ) ); +- QGridLayout* layout = reinterpret_cast< QGridLayout* >( mb.layout() ); +- if ( layout ) - { -- m_mainwindow->show(); +- layout->setColumnMinimumWidth( 2, Calamares::defaultFontHeight() * 24 ); - } -- -- cDebug() << "STARTUP: Window now visible and ProgressTreeView populated"; -- cDebug() << Logger::SubEntry << Calamares::ViewManager::instance()->viewSteps().count() << "view steps loaded."; -- Calamares::ViewManager::instance()->onInitComplete(); +- mb.exec(); -} - --void --CalamaresApplication::initFailed( const QStringList& l ) --{ -- cError() << "STARTUP: failed modules are" << l; -- m_mainwindow->show(); --} -- --void --CalamaresApplication::initJobQueue() --{ -- Calamares::JobQueue* jobQueue = new Calamares::JobQueue( this ); -- new Calamares::System( Calamares::Settings::instance()->doChroot(), this ); -- Calamares::Branding::instance()->setGlobals( jobQueue->globalStorage() ); --} +-} // namespace Calamares +/* === This file is part of Calamares - === + * -+ * SPDX-FileCopyrightText: 2014-2015 Teo Mrnjavac -+ * SPDX-FileCopyrightText: 2018 Adriaan de Groot ++ * SPDX-FileCopyrightText: 2015-2016 Teo Mrnjavac ++ * SPDX-FileCopyrightText: 2019 Adriaan de Groot + * SPDX-License-Identifier: GPL-3.0-or-later + * + * Calamares is Free Software: see the License-Identifier above. + * + */ -+#include "CalamaresApplication.h" + -+#include "CalamaresConfig.h" -+#include "CalamaresVersionX.h" -+#include "CalamaresWindow.h" -+#include "progresstree/ProgressTreeView.h" ++#include "DebugWindow.h" ++#include "ui_DebugWindow.h" + +#include "Branding.h" ++#include "CalamaresAbout.h" ++#include "CalamaresVersion.h" ++#include "GlobalStorage.h" ++#include "Job.h" +#include "JobQueue.h" +#include "Settings.h" -+#include "ViewManager.h" -+#include "locale/TranslationsModel.h" ++#include "VariantModel.h" ++#include "modulesystem/Module.h" +#include "modulesystem/ModuleManager.h" -+#include "utils/Dirs.h" +#include "utils/Gui.h" +#include "utils/Logger.h" -+#include "utils/System.h" -+#ifdef WITH_QML -+#include "utils/Qml.h" -+#endif ++#include "utils/Paste.h" +#include "utils/Retranslator.h" -+#include "viewpages/ViewStep.h" ++#include "widgets/TranslationFix.h" + -+#include -+#include -+#include -+#include ++#include ++#include ++#include ++#include ++#include + -+/// @brief Convenience for "are the settings in debug mode" -+static bool -+isDebug() -+{ -+ return Calamares::Settings::instance() && Calamares::Settings::instance()->debugMode(); -+} ++#include ++#include + -+CalamaresApplication::CalamaresApplication( int& argc, char* argv[] ) -+ : QApplication( argc, argv ) -+ , m_mainwindow( nullptr ) -+ , m_moduleManager( nullptr ) ++/** ++ * @brief crash makes Calamares crash immediately. ++ */ ++static void ++crash() +{ -+ // Setting the organization name makes the default cache -+ // directory -- where Calamares stores logs, for instance -- -+ // //, so we end up with ~/.cache/Calamares/calamares/ -+ // which is excessively squidly. -+ // -+ // setOrganizationName( QStringLiteral( CALAMARES_ORGANIZATION_NAME ) ); -+ setOrganizationDomain( QStringLiteral( CALAMARES_ORGANIZATION_DOMAIN ) ); -+ setApplicationName( QStringLiteral( CALAMARES_APPLICATION_NAME ) ); -+ setApplicationVersion( QStringLiteral( CALAMARES_VERSION ) ); -+ -+ QFont f = font(); -+ Calamares::setDefaultFontSize( f.pointSize() ); ++ kill( getpid(), SIGTRAP ); +} + -+void -+CalamaresApplication::init() ++/// @brief Print out the widget tree (names) in indented form. ++static void ++dumpWidgetTree( QDebug& deb, const QWidget* widget, int depth ) +{ -+ Logger::setupLogfile(); -+ cDebug() << "Calamares version:" << CALAMARES_VERSION; -+ cDebug() << Logger::SubEntry << "Using Qt version:" << qVersion(); -+ cDebug() << Logger::SubEntry << "Build type:" << CMAKE_BUILD_TYPE; -+#ifdef WITH_PYBIND11 -+ cDebug() << Logger::SubEntry << "Using PyBind11"; -+#endif -+#ifdef WITH_BOOST_PYTHON -+ cDebug() << Logger::SubEntry << "Using Boost Python"; -+#endif -+ cDebug() << Logger::SubEntry << "Using settings:" << Calamares::Settings::instance()->path(); -+ cDebug() << Logger::SubEntry << "Using log file:" << Logger::logFile(); -+ cDebug() << Logger::SubEntry << "Languages:" << Calamares::Locale::availableLanguages(); -+ -+ if ( !Calamares::Settings::instance() ) ++ if ( !widget ) + { -+ cError() << "Must create Calamares::Settings before the application."; -+ ::exit( 1 ); ++ return; + } -+ initQmlPath(); -+ initBranding(); -+ -+ Calamares::installTranslator(); -+ -+ setQuitOnLastWindowClosed( false ); -+ setWindowIcon( QIcon( Calamares::Branding::instance()->imagePath( Calamares::Branding::ProductIcon ) ) ); + -+ cDebug() << Logger::SubEntry << "STARTUP: initSettings, initQmlPath, initBranding done"; -+ -+ initModuleManager(); //also shows main window -+ -+ cDebug() << Logger::SubEntry << "STARTUP: initModuleManager: module init started"; -+} -+ -+CalamaresApplication::~CalamaresApplication() -+{ -+ Logger::CDebug( Logger::LOGVERBOSE ) << "Shutting down Calamares..."; -+ Logger::CDebug( Logger::LOGVERBOSE ) << Logger::SubEntry << "Finished shutdown."; -+} -+ -+CalamaresApplication* -+CalamaresApplication::instance() -+{ -+ return qobject_cast< CalamaresApplication* >( QApplication::instance() ); -+} -+ -+CalamaresWindow* -+CalamaresApplication::mainWindow() -+{ -+ return m_mainwindow; -+} -+ -+static QStringList -+brandingFileCandidates( bool assumeBuilddir, const QString& brandingFilename ) -+{ -+ QStringList brandingPaths; -+ if ( Calamares::isAppDataDirOverridden() ) ++ deb << Logger::Continuation; ++ for ( int i = 0; i < depth; ++i ) + { -+ brandingPaths << Calamares::appDataDir().absoluteFilePath( brandingFilename ); -+ } -+ else -+ { -+ if ( assumeBuilddir ) -+ { -+ brandingPaths << ( QDir::currentPath() + QStringLiteral( "/src/" ) + brandingFilename ); -+ } -+ if ( Calamares::haveExtraDirs() ) -+ { -+ for ( auto s : Calamares::extraDataDirs() ) -+ { -+ brandingPaths << ( s + brandingFilename ); -+ } -+ } -+ brandingPaths << QDir( CMAKE_INSTALL_FULL_SYSCONFDIR "/calamares/" ).absoluteFilePath( brandingFilename ); -+ brandingPaths << Calamares::appDataDir().absoluteFilePath( brandingFilename ); ++ deb << ' '; + } ++ deb << widget->metaObject()->className() << widget->objectName(); + -+ return brandingPaths; -+} -+ -+void -+CalamaresApplication::initQmlPath() -+{ -+#ifdef WITH_QML -+ if ( !Calamares::initQmlModulesDir() ) ++ for ( const auto* w : widget->findChildren< QWidget* >( QString(), Qt::FindDirectChildrenOnly ) ) + { -+ ::exit( EXIT_FAILURE ); ++ dumpWidgetTree( deb, w, depth + 1 ); + } -+#endif +} + -+void -+CalamaresApplication::initBranding() ++namespace Calamares +{ -+ QString brandingComponentName = Calamares::Settings::instance()->brandingComponentName(); -+ if ( brandingComponentName.simplified().isEmpty() ) -+ { -+ cError() << "FATAL: branding component not set in settings.conf"; -+ ::exit( EXIT_FAILURE ); -+ } -+ -+ QString brandingDescriptorSubpath = QString( "branding/%1/branding.desc" ).arg( brandingComponentName ); -+ QStringList brandingFileCandidatesByPriority = brandingFileCandidates( isDebug(), brandingDescriptorSubpath ); -+ cDebug() << "brandingFileCandidatesByPriority" << brandingFileCandidatesByPriority; -+ -+ QFileInfo brandingFile; -+ bool found = false; -+ -+ foreach ( const QString& path, brandingFileCandidatesByPriority ) -+ { -+ QFileInfo pathFi( path ); -+ if ( pathFi.exists() && pathFi.isReadable() ) -+ { -+ brandingFile = pathFi; -+ found = true; -+ break; -+ } -+ } + -+ if ( !found || !brandingFile.exists() || !brandingFile.isReadable() ) ++DebugWindow::DebugWindow() ++ : QWidget( nullptr ) ++ , m_ui( new Ui::DebugWindow ) ++ , m_globals( JobQueue::instance()->globalStorage()->data() ) ++ , m_globals_model( std::make_unique< VariantModel >( &m_globals ) ) ++ , m_module_model( std::make_unique< VariantModel >( &m_module ) ) ++{ ++ GlobalStorage* gs = JobQueue::instance()->globalStorage(); ++ ++ m_ui->setupUi( this ); ++ ++ m_ui->globalStorageView->setModel( m_globals_model.get() ); ++ m_ui->globalStorageView->expandAll(); ++ ++ // Do above when the GS changes, too ++ connect( gs, ++ &GlobalStorage::changed, ++ this, ++ [ = ] ++ { ++ m_globals = JobQueue::instance()->globalStorage()->data(); ++ m_globals_model->reload(); ++ m_ui->globalStorageView->expandAll(); ++ } ); ++ ++ // JobQueue page ++ m_ui->jobQueueText->setReadOnly( true ); ++ connect( JobQueue::instance(), ++ &JobQueue::queueChanged, ++ this, ++ [ this ]( const QStringList& jobs ) { m_ui->jobQueueText->setText( jobs.join( '\n' ) ); } ); ++ ++ // Modules page ++ QStringList modulesKeys; ++ for ( const auto& m : ModuleManager::instance()->loadedInstanceKeys() ) + { -+ cError() << "Cowardly refusing to continue startup without branding." -+ << Logger::DebugList( brandingFileCandidatesByPriority ); -+ if ( Calamares::isAppDataDirOverridden() ) -+ { -+ cError() << "FATAL: explicitly configured application data directory is missing" << brandingComponentName; -+ } -+ else -+ { -+ cError() << "FATAL: none of the expected branding descriptor file paths exist."; -+ } -+ ::exit( EXIT_FAILURE ); ++ modulesKeys << m.toString(); + } + -+ new Calamares::Branding( brandingFile.absoluteFilePath(), this, devicePixelRatio() ); ++ QStringListModel* modulesModel = new QStringListModel( modulesKeys ); ++ m_ui->modulesListView->setModel( modulesModel ); ++ m_ui->modulesListView->setSelectionMode( QAbstractItemView::SingleSelection ); ++ ++ m_ui->moduleConfigView->setModel( m_module_model.get() ); ++ ++ connect( m_ui->modulesListView->selectionModel(), ++ &QItemSelectionModel::selectionChanged, ++ this, ++ [ this ] ++ { ++ QString moduleName = m_ui->modulesListView->currentIndex().data().toString(); ++ Module* module ++ = ModuleManager::instance()->moduleInstance( ModuleSystem::InstanceKey::fromString( moduleName ) ); ++ if ( module ) ++ { ++ m_module = module->configurationMap(); ++ m_module_model->reload(); ++ m_ui->moduleConfigView->expandAll(); ++ m_ui->moduleTypeLabel->setText( module->typeString() ); ++ m_ui->moduleInterfaceLabel->setText( module->interfaceString() ); ++ } ++ } ); ++ ++ // Tools page ++ connect( m_ui->crashButton, &QPushButton::clicked, this, [] { ::crash(); } ); ++ connect( m_ui->reloadStylesheetButton, ++ &QPushButton::clicked, ++ []() ++ { ++ for ( auto* w : qApp->topLevelWidgets() ) ++ { ++ // Needs to match what's set in CalamaresWindow ++ if ( w->objectName() == QStringLiteral( "mainApp" ) ) ++ { ++ w->setStyleSheet( Calamares::Branding::instance()->stylesheet() ); ++ } ++ } ++ } ); ++ connect( m_ui->widgetTreeButton, ++ &QPushButton::clicked, ++ []() ++ { ++ for ( auto* w : qApp->topLevelWidgets() ) ++ { ++ Logger::CDebug deb; ++ dumpWidgetTree( deb, w, 0 ); ++ } ++ } ); ++ ++ // Send Log button only if it would be useful ++ m_ui->sendLogButton->setVisible( Calamares::Paste::isEnabled() ); ++ connect( m_ui->sendLogButton, &QPushButton::clicked, [ this ]() { Calamares::Paste::doLogUploadUI( this ); } ); ++ ++ CALAMARES_RETRANSLATE( m_ui->retranslateUi( this ); setWindowTitle( tr( "Debug Information", "@title" ) ); ); +} + +void -+CalamaresApplication::initModuleManager() ++DebugWindow::closeEvent( QCloseEvent* e ) +{ -+ m_moduleManager = new Calamares::ModuleManager( Calamares::Settings::instance()->modulesSearchPaths(), this ); -+ connect( m_moduleManager, &Calamares::ModuleManager::initDone, this, &CalamaresApplication::initView ); -+ m_moduleManager->init(); ++ Q_UNUSED( e ) ++ emit closed(); +} + -+/** @brief centers the widget @p w on (a) screen -+ * -+ * This tries to duplicate the (deprecated) qApp->desktop()->availableGeometry() -+ * placement by iterating over screens and putting Calamares in the first -+ * one where it fits; this is *generally* the primary screen. -+ * -+ * With debugging, it would look something like this (2 screens attached, -+ * primary at +1080+240 because I have a very strange X setup). Before -+ * being mapped, the Calamares window is at +0+0 but does have a size. -+ * The first screen's geometry includes the offset from the origin in -+ * screen coordinates. -+ * -+ * Proposed window size: 1024 520 -+ * Window QRect(0,0 1024x520) -+ * Screen QRect(1080,240 2560x1440) -+ * Moving QPoint(1848,700) -+ * Screen QRect(0,0 1080x1920) -+ * -+ */ -+static void -+centerWindowOnScreen( QWidget* w ) ++DebugWindowManager::DebugWindowManager( QObject* parent ) ++ : QObject( parent ) +{ -+ QList< QScreen* > screens = qApp->screens(); -+ QPoint windowCenter = w->rect().center(); -+ QSize windowSize = w->rect().size(); ++} + -+ for ( const auto* screen : screens ) -+ { -+ QSize screenSize = screen->availableGeometry().size(); -+ if ( ( screenSize.width() >= windowSize.width() ) && ( screenSize.height() >= windowSize.height() ) ) -+ { -+ w->move( screen->availableGeometry().center() - windowCenter ); -+ break; -+ } -+ } ++bool ++DebugWindowManager::enabled() const ++{ ++ const auto* s = Settings::instance(); ++ return ( Logger::logLevel() >= Logger::LOGVERBOSE ) || ( s ? s->debugMode() : false ); +} + +void -+CalamaresApplication::initView() ++DebugWindowManager::show( bool visible ) +{ -+ cDebug() << "STARTUP: initModuleManager: all modules init done"; -+ initJobQueue(); -+ cDebug() << "STARTUP: initJobQueue done"; -+ -+ m_mainwindow = new CalamaresWindow(); //also creates ViewManager -+ -+ connect( m_moduleManager, &Calamares::ModuleManager::modulesLoaded, this, &CalamaresApplication::initViewSteps ); -+ connect( m_moduleManager, &Calamares::ModuleManager::modulesFailed, this, &CalamaresApplication::initFailed ); -+ -+ QTimer::singleShot( 0, m_moduleManager, &Calamares::ModuleManager::loadModules ); -+ -+ if ( Calamares::Branding::instance() && Calamares::Branding::instance()->windowPlacementCentered() ) ++ if ( !enabled() ) + { -+ centerWindowOnScreen( m_mainwindow ); ++ visible = false; ++ } ++ if ( m_visible == visible ) ++ { ++ return; + } -+ cDebug() << "STARTUP: CalamaresWindow created; loadModules started"; -+} + -+void -+CalamaresApplication::initViewSteps() -+{ -+ cDebug() << "STARTUP: loadModules for all modules done"; -+ m_moduleManager->checkRequirements(); -+ if ( Calamares::Branding::instance()->windowMaximize() ) ++ if ( visible ) + { -+ m_mainwindow->setWindowFlag( Qt::FramelessWindowHint ); -+ m_mainwindow->showMaximized(); ++ m_debugWindow = new Calamares::DebugWindow(); ++ m_debugWindow->show(); ++ connect( m_debugWindow.data(), ++ &Calamares::DebugWindow::closed, ++ this, ++ [ = ]() ++ { ++ m_debugWindow->deleteLater(); ++ m_visible = false; ++ emit visibleChanged( false ); ++ } ); ++ m_visible = true; ++ emit visibleChanged( true ); + } + else + { -+ m_mainwindow->show(); ++ if ( m_debugWindow ) ++ { ++ m_debugWindow->deleteLater(); ++ } ++ m_visible = false; ++ emit visibleChanged( false ); + } -+ -+ cDebug() << "STARTUP: Window now visible and ProgressTreeView populated"; -+ cDebug() << Logger::SubEntry << Calamares::ViewManager::instance()->viewSteps().count() << "view steps loaded."; -+ Calamares::ViewManager::instance()->onInitComplete(); +} + +void -+CalamaresApplication::initFailed( const QStringList& l ) ++DebugWindowManager::toggle() +{ -+ cError() << "STARTUP: failed modules are" << l; -+ m_mainwindow->show(); ++ show( !m_visible ); +} + +void -+CalamaresApplication::initJobQueue() ++DebugWindowManager::about() +{ -+ Calamares::JobQueue* jobQueue = new Calamares::JobQueue( this ); -+ new Calamares::System( Calamares::Settings::instance()->doChroot(), this ); -+ Calamares::Branding::instance()->setGlobals( jobQueue->globalStorage() ); ++ QString title = Calamares::Settings::instance()->isSetupMode() ++ ? QCoreApplication::translate( "WelcomePage", "About %1 Setup", "@title" ) ++ : QCoreApplication::translate( "WelcomePage", "About %1 Installer", "@title" ); ++ QMessageBox mb( QMessageBox::Information, ++ title.arg( CALAMARES_APPLICATION_NAME ), ++ Calamares::aboutString().arg( Calamares::Branding::instance()->versionedName() ), ++ QMessageBox::Ok, ++ nullptr ); ++ Calamares::fixButtonLabels( &mb ); ++ mb.setStyleSheet( ++ "QMessageBox {" ++ "border: 1px solid hsl(240,2%,79%);" ++ "border-radius: 5px;" ++ "background-color: #FFFFFF;" // 设置对话框背景颜色 ++ "}" ++ ); ++ mb.setWindowFlags(Qt::FramelessWindowHint | Qt::Dialog); ++ mb.setIconPixmap( ++ Calamares::defaultPixmap( Calamares::BigLogo,//Biglogo.svg ++ Calamares::Original, ++ QSize( 321/1.9, 297/2 ) ) ); ++ QGridLayout* layout = reinterpret_cast< QGridLayout* >( mb.layout() ); ++ if ( layout ) ++ { ++ layout->setColumnMinimumWidth( 2, Calamares::defaultFontHeight() * 24 ); ++ } ++ mb.exec(); +} -diff --git a/src/calamares/CalamaresApplication.h b/src/calamares/CalamaresApplication.h -index 77cf3a0..0a99d26 100644 ---- a/src/calamares/CalamaresApplication.h -+++ b/src/calamares/CalamaresApplication.h -@@ -1,64 +1,64 @@ --/* === This file is part of Calamares - === -- * -- * SPDX-FileCopyrightText: 2014-2015 Teo Mrnjavac -- * SPDX-FileCopyrightText: 2018-2019 Adriaan de Groot -- * SPDX-License-Identifier: GPL-3.0-or-later -- * -- * Calamares is Free Software: see the License-Identifier above. -- * -- */ -- --#ifndef CALAMARESAPPLICATION_H --#define CALAMARESAPPLICATION_H -- --#include -- --class CalamaresWindow; -- --namespace Calamares --{ --class ModuleManager; --} // namespace Calamares -- -- --/** -- * @brief The CalamaresApplication class extends QApplication to handle -- * Calamares startup and lifetime of main components. -- */ --class CalamaresApplication : public QApplication --{ -- Q_OBJECT --public: -- CalamaresApplication( int& argc, char* argv[] ); -- ~CalamaresApplication() override; -- -- /** -- * @brief init handles the first part of Calamares application startup. -- * After the main window shows up, the latter part of the startup sequence -- * (including modules loading) happens asynchronously. -- */ -- void init(); -- static CalamaresApplication* instance(); -- -- /** -- * @brief mainWindow returns the Calamares application main window. -- */ -- CalamaresWindow* mainWindow(); -- --private slots: -- void initView(); -- void initViewSteps(); -- void initFailed( const QStringList& l ); -- --private: -- // Initialization steps happen in this order -- void initQmlPath(); -- void initBranding(); -- void initModuleManager(); -- void initJobQueue(); -- -- CalamaresWindow* m_mainwindow; -- Calamares::ModuleManager* m_moduleManager; --}; -- --#endif // CALAMARESAPPLICATION_H -+/* === This file is part of Calamares - === -+ * -+ * SPDX-FileCopyrightText: 2014-2015 Teo Mrnjavac -+ * SPDX-FileCopyrightText: 2018-2019 Adriaan de Groot -+ * SPDX-License-Identifier: GPL-3.0-or-later -+ * -+ * Calamares is Free Software: see the License-Identifier above. -+ * -+ */ -+ -+#ifndef CALAMARESAPPLICATION_H -+#define CALAMARESAPPLICATION_H -+ -+#include -+ -+class CalamaresWindow; -+ -+namespace Calamares -+{ -+class ModuleManager; -+} // namespace Calamares -+ -+ -+/** -+ * @brief The CalamaresApplication class extends QApplication to handle -+ * Calamares startup and lifetime of main components. -+ */ -+class CalamaresApplication : public QApplication -+{ -+ Q_OBJECT -+public: -+ CalamaresApplication( int& argc, char* argv[] ); -+ ~CalamaresApplication() override; -+ -+ /** -+ * @brief init handles the first part of Calamares application startup. -+ * After the main window shows up, the latter part of the startup sequence -+ * (including modules loading) happens asynchronously. -+ */ -+ void init(); -+ static CalamaresApplication* instance(); -+ -+ /** -+ * @brief mainWindow returns the Calamares application main window. -+ */ -+ CalamaresWindow* mainWindow(); + -+private slots: -+ void initView(); -+ void initViewSteps(); -+ void initFailed( const QStringList& l ); -+ -+private: -+ // Initialization steps happen in this order -+ void initQmlPath(); -+ void initBranding(); -+ void initModuleManager(); -+ void initJobQueue(); -+ -+ CalamaresWindow* m_mainwindow; -+ Calamares::ModuleManager* m_moduleManager; -+}; -+ -+#endif // CALAMARESAPPLICATION_H -diff --git a/src/calamares/CalamaresWindow.cpp b/src/calamares/CalamaresWindow.cpp -index e1892e7..4721cb9 100644 ---- a/src/calamares/CalamaresWindow.cpp -+++ b/src/calamares/CalamaresWindow.cpp -@@ -104,20 +104,23 @@ getWidgetSidebar( Calamares::DebugWindowManager* debug, - Calamares::ViewManager* viewManager, - QWidget* parent, - Qt::Orientation, -- int desiredWidth ) -+ int desiredWidth -+ ) - { - const Calamares::Branding* const branding = Calamares::Branding::instance(); -- -+ - QWidget* sideBox = new QWidget( parent ); - sideBox->setObjectName( "sidebarApp" ); - -- QBoxLayout* sideLayout = new QVBoxLayout; -+ QBoxLayout* sideLayout = new QHBoxLayout; -+ sideLayout->addSpacing(10); - sideBox->setLayout( sideLayout ); - // Set this attribute into qss file - sideBox->setFixedWidth( desiredWidth ); -+ sideBox->setFixedHeight( parent->height()*0.13 ); - sideBox->setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Expanding ); - -- QHBoxLayout* logoLayout = new QHBoxLayout; -+ QBoxLayout* logoLayout = new QVBoxLayout; - sideLayout->addLayout( logoLayout ); - logoLayout->addStretch(); - QLabel* logoLabel = new QLabel( sideBox ); -@@ -132,19 +135,19 @@ getWidgetSidebar( Calamares::DebugWindowManager* debug, - logoLabel->setPalette( plt ); - } - logoLabel->setAlignment( Qt::AlignCenter ); -- logoLabel->setFixedSize( 80, 80 ); -+ logoLabel->setFixedSize( 388*0.3, 96*0.3 ); - logoLabel->setPixmap( branding->image( Calamares::Branding::ProductLogo, logoLabel->size() ) ); -- logoLayout->addWidget( logoLabel ); -+ logoLayout->addWidget( logoLabel ,2); - logoLayout->addStretch(); -- -+ sideLayout->addSpacing(10); - ProgressTreeView* tv = new ProgressTreeView( sideBox ); - tv->setModel( viewManager ); - tv->setFocusPolicy( Qt::NoFocus ); -- sideLayout->addWidget( tv ); -- -- QHBoxLayout* extraButtons = new QHBoxLayout; -- sideLayout->addLayout( extraButtons ); -+ sideLayout->addWidget( tv ,20); - -+ QBoxLayout* extraButtons = new QVBoxLayout; -+ sideLayout->addLayout( extraButtons ,1); -+ sideLayout->addSpacing(15); - const int defaultFontHeight = Calamares::defaultFontHeight(); - - if ( /* About-Calamares Button enabled */ true ) -@@ -154,13 +157,17 @@ getWidgetSidebar( Calamares::DebugWindowManager* debug, - aboutDialog->setIcon( Calamares::defaultPixmap( - Calamares::Information, Calamares::Original, 2 * QSize( defaultFontHeight, defaultFontHeight ) ) ); - CALAMARES_RETRANSLATE_FOR( -- aboutDialog, aboutDialog->setText( QCoreApplication::translate( "calamares-sidebar", "About", "@button" ) ); -+ aboutDialog, aboutDialog->setText( QCoreApplication::translate( "calamares-sidebar", "", "@button" ) ); - aboutDialog->setToolTip( -- QCoreApplication::translate( "calamares-sidebar", "Show information about Calamares", "@tooltip" ) ); ); -+ QCoreApplication::translate( "calamares-sidebar", "Show information about easysoftware", "@tooltip" ) ); ); - extraButtons->addWidget( aboutDialog ); - aboutDialog->setFlat( true ); - aboutDialog->setCheckable( true ); -- QObject::connect( aboutDialog, &QPushButton::clicked, debug, &Calamares::DebugWindowManager::about ); -+ QObject::connect( aboutDialog, &QPushButton::clicked, [aboutDialog,debug](){ -+ aboutDialog->setDown(false); -+ aboutDialog->setChecked(false); -+ debug->about(); -+ } ); - } - if ( debug && debug->enabled() ) - { -@@ -182,6 +189,7 @@ getWidgetSidebar( Calamares::DebugWindowManager* debug, - } - - Calamares::unmarginLayout( sideLayout ); -+ - return sideBox; - } - -@@ -246,7 +254,8 @@ getWidgetNavigation( Calamares::DebugWindowManager*, - bottomLayout->addWidget( quit ); - } - -- bottomLayout->setContentsMargins( 0, 0, 6, 6 ); -+ -+ bottomLayout->setContentsMargins( 0, 0,40,40 ); - navigation->setLayout( bottomLayout ); - return navigation; - } -@@ -271,7 +280,7 @@ setDimension( QQuickWidget* w, Qt::Orientation o, int desiredWidth ) - // Bound between (16, 64) with a default of 48. - qreal minimumHeight = qBound( qreal( 16 ), w->rootObject() ? w->rootObject()->height() : 48, qreal( 64 ) ); - w->setMinimumHeight( int( minimumHeight ) ); -- w->setFixedHeight( int( minimumHeight ) ); -+ w->setFixedHeight( int( minimumHeight )); - } - w->setResizeMode( QQuickWidget::SizeRootObjectToView ); - } -@@ -417,7 +426,7 @@ CalamaresWindow::CalamaresWindow( QWidget* parent ) - - // Needs to match what's checked in DebugWindow - this->setObjectName( "mainApp" ); -- -+ this->setWindowFlags(Qt::FramelessWindowHint); - QSize availableSize = desktopSize( this ); - QSize minimumSize( qBound( windowMinimumWidth, availableSize.width(), windowPreferredWidth ), - qBound( windowMinimumHeight, availableSize.height(), windowPreferredHeight ) ); -@@ -429,26 +438,26 @@ CalamaresWindow::CalamaresWindow( QWidget* parent ) - - int w = qBound( minimumSize.width(), windowDimensionToPixels( brandingSizes.first ), availableSize.width() ); - int h = qBound( minimumSize.height(), windowDimensionToPixels( brandingSizes.second ), availableSize.height() ); -- -- cDebug() << Logger::SubEntry << "Proposed window size:" << w << h; -- resize( w, h ); -- -- QWidget* baseWidget = this; -- if ( !( branding->imagePath( ImageEntry::ProductWallpaper ).isEmpty() ) ) -- { -- QWidget* label = new QWidget( this ); -- QVBoxLayout* l = new QVBoxLayout; -- Calamares::unmarginLayout( l ); -- l->addWidget( label ); -- setLayout( l ); -- label->setObjectName( "backgroundWidget" ); -- label->setStyleSheet( -- QStringLiteral( "#backgroundWidget { background-image: url(%1); background-repeat: repeat-xy; }" ) -+ -+ cDebug() << Logger::SubEntry << "Proposed window size:" << w << h; -+ //resize( availableSize.width(), availableSize.height() );//通用桌面大小作为窗口大小 -+ resize( w, h );//通用桌面大小作为窗口大小 -+ QWidget* baseWidget = this; -+ if ( !( branding->imagePath( ImageEntry::ProductWallpaper ).isEmpty() ) ) -+ { -+ QWidget* label = new QWidget( this ); -+ QVBoxLayout* l = new QVBoxLayout; -+ Calamares::unmarginLayout( l ); -+ l->addWidget( label ); -+ setLayout( l ); -+ label->setObjectName( "backgroundWidget" ); -+ label->setFixedSize(availableSize.width(),h); -+ label->setStyleSheet( -+ QStringLiteral( "#backgroundWidget { background-image: url(%1); background-repeat: No repeat; }" ) - .arg( branding->imagePath( ImageEntry::ProductWallpaper ) ) ); -- -+ - baseWidget = label; - } -- - m_viewManager = Calamares::ViewManager::instance( baseWidget ); - if ( branding->windowExpands() ) - { -@@ -463,7 +472,7 @@ CalamaresWindow::CalamaresWindow( QWidget* parent ) - // is too annoying. Instead, leave it up to ignoring-the-quit- - // event, which is also the ViewManager's responsibility. - -- QBoxLayout* mainLayout = new QHBoxLayout; -+ QBoxLayout* mainLayout = new QVBoxLayout; - QBoxLayout* contentsLayout = new QVBoxLayout; - contentsLayout->setSpacing( 0 ); - -@@ -474,7 +483,7 @@ CalamaresWindow::CalamaresWindow( QWidget* parent ) - baseWidget, - ::getWidgetSidebar, - ::getQmlSidebar, -- qBound( 100, Calamares::defaultFontHeight() * 12, w < windowPreferredWidth ? 100 : 190 ) ); -+ qBound( w, Calamares::defaultFontHeight() * 12, w < windowPreferredWidth ? 200 : 290 )); - QWidget* navigation = flavoredWidget( branding->navigationFlavor(), - ::orientation( branding->navigationSide() ), - m_debugManager, -@@ -482,9 +491,9 @@ CalamaresWindow::CalamaresWindow( QWidget* parent ) - ::getWidgetNavigation, - ::getQmlNavigation, - 64 ); -- - // Build up the contentsLayout (a VBox) top-to-bottom - // .. note that the bottom is mirrored wrt. the top -+ sideBox->resize(availableSize.width(),300); - insertIf( contentsLayout, PanelSide::Top, sideBox, branding->sidebarSide() ); - insertIf( contentsLayout, PanelSide::Top, navigation, branding->navigationSide() ); - contentsLayout->addWidget( m_viewManager->centralWidget() ); -@@ -497,7 +506,7 @@ CalamaresWindow::CalamaresWindow( QWidget* parent ) - mainLayout->addLayout( contentsLayout ); - insertIf( mainLayout, PanelSide::Right, navigation, branding->navigationSide() ); - insertIf( mainLayout, PanelSide::Right, sideBox, branding->sidebarSide() ); -- -+ connect(m_viewManager, &Calamares::ViewManager::currentStepChanged, [ = ]( int currentStep ) { sideBox->setVisible(currentStep > 0); } ); - // layout->count() returns number of things in it; above we have put - // at **least** the central widget, which comes from the view manager, - // both vertically and horizontally -- so if there's a panel along -@@ -510,6 +519,9 @@ CalamaresWindow::CalamaresWindow( QWidget* parent ) - Calamares::unmarginLayout( contentsLayout ); - baseWidget->setLayout( mainLayout ); - setStyleSheet( Calamares::Branding::instance()->stylesheet() ); -+ cDebug()<<"<---------------------------WindowWindowSize-------------------------------------->"<size(); -+ cDebug()<< "<--------------------sideBox->size()-------------------->"<< sideBox->size(); -+ this->setFixedSize(this->size()); - } - - void -diff --git a/src/calamares/CalamaresWindow.h b/src/calamares/CalamaresWindow.h -index f5dd7fe..e2a0fea 100644 ---- a/src/calamares/CalamaresWindow.h -+++ b/src/calamares/CalamaresWindow.h -@@ -1,50 +1,50 @@ --/* === This file is part of Calamares - === -- * -- * SPDX-FileCopyrightText: 2014-2015 Teo Mrnjavac -- * SPDX-FileCopyrightText: 2017-2018 Adriaan de Groot -- * SPDX-License-Identifier: GPL-3.0-or-later -- * -- * Calamares is Free Software: see the License-Identifier above. -- * -- */ -- --#ifndef CALAMARESWINDOW_H --#define CALAMARESWINDOW_H -- --#include -- --#include -- --namespace Calamares --{ --class DebugWindowManager; --class ViewManager; --} // namespace Calamares -- --/** -- * @brief The CalamaresWindow class represents the main window of the Calamares UI. -- */ --class CalamaresWindow : public QWidget --{ -- Q_OBJECT --public: -- CalamaresWindow( QWidget* parent = nullptr ); -- ~CalamaresWindow() override {} -- --public Q_SLOTS: -- /** -- * This asks the main window to grow to accomodate @p size pixels, to accomodate -- * larger-than-expected window contents. The enlargement may be silently -- * ignored. -- */ -- void ensureSize( QSize size ); -- --protected: -- virtual void closeEvent( QCloseEvent* e ) override; -- --private: -- Calamares::DebugWindowManager* m_debugManager = nullptr; -- Calamares::ViewManager* m_viewManager = nullptr; --}; -- --#endif // CALAMARESWINDOW_H -+/* === This file is part of Calamares - === -+ * -+ * SPDX-FileCopyrightText: 2014-2015 Teo Mrnjavac -+ * SPDX-FileCopyrightText: 2017-2018 Adriaan de Groot -+ * SPDX-License-Identifier: GPL-3.0-or-later -+ * -+ * Calamares is Free Software: see the License-Identifier above. -+ * -+ */ -+ -+#ifndef CALAMARESWINDOW_H -+#define CALAMARESWINDOW_H -+ -+#include -+ -+#include -+ -+namespace Calamares -+{ -+class DebugWindowManager; -+class ViewManager; +} // namespace Calamares -+ -+/** -+ * @brief The CalamaresWindow class represents the main window of the Calamares UI. -+ */ -+class CalamaresWindow : public QWidget -+{ -+ Q_OBJECT -+public: -+ CalamaresWindow( QWidget* parent = nullptr ); -+ ~CalamaresWindow() override {} -+ -+public Q_SLOTS: -+ /** -+ * This asks the main window to grow to accomodate @p size pixels, to accomodate -+ * larger-than-expected window contents. The enlargement may be silently -+ * ignored. -+ */ -+ void ensureSize( QSize size ); -+ -+protected: -+ virtual void closeEvent( QCloseEvent* e ) override; -+ -+private: -+ Calamares::DebugWindowManager* m_debugManager = nullptr; -+ Calamares::ViewManager* m_viewManager = nullptr; -+}; -+ -+#endif // CALAMARESWINDOW_H -diff --git a/src/calamares/DebugWindow.cpp b/src/calamares/DebugWindow.cpp -index 51b3fca..b28661e 100644 ---- a/src/calamares/DebugWindow.cpp -+++ b/src/calamares/DebugWindow.cpp -@@ -242,10 +242,18 @@ DebugWindowManager::about() - QMessageBox::Ok, - nullptr ); - Calamares::fixButtonLabels( &mb ); -+ mb.setStyleSheet( -+ "QMessageBox {" -+ "border: 1px solid hsl(240,2%,79%);" -+ "border-radius: 5px;" -+ "background-color: #FFFFFF;" // 设置对话框背景颜色 -+ "}" -+ ); -+ mb.setWindowFlags(Qt::FramelessWindowHint | Qt::Dialog); - mb.setIconPixmap( -- Calamares::defaultPixmap( Calamares::Squid, -- Calamares::Original, -- QSize( Calamares::defaultFontHeight() * 6, Calamares::defaultFontHeight() * 6 ) ) ); -+ Calamares::defaultPixmap( Calamares::BigLogo,//Biglogo.svg -+ Calamares::Original, -+ QSize( 321/1.9, 297/2 ) ) ); - QGridLayout* layout = reinterpret_cast< QGridLayout* >( mb.layout() ); - if ( layout ) - { -diff --git a/src/calamares/DebugWindow.ui b/src/calamares/DebugWindow.ui -index 16cc4a4..649915e 100644 ---- a/src/calamares/DebugWindow.ui -+++ b/src/calamares/DebugWindow.ui -@@ -1,157 +1,157 @@ -- -- -- --SPDX-FileCopyrightText: 2015 Teo Mrnjavac <teo@kde.org> --SPDX-License-Identifier: GPL-3.0-or-later -- -- Calamares::DebugWindow -- -- -- -- 0 -- 0 -- 962 -- 651 -- -- -- -- Form -- -- -- -- -- -- 0 -- -- -- -- GlobalStorage -- -- -- -- -- -- -- -- -- -- JobQueue -- -- -- -- -- -- -- -- -- -- Modules -- -- -- -- -- -- -- -- -- -- -- -- -- Type: -- -- -- -- -- -- -- none -- -- -- -- -- -- -- Interface: -- -- -- -- -- -- -- none -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- Crashes Calamares, so that Dr. Konqi can look at it. -- -- -- Crash now -- -- -- -- -- -- -- -- -- -- Reloads the stylesheet from the branding directory. -- -- -- Reload Stylesheet -- -- -- -- -- -- -- -- -- -- Displays the tree of widget names in the log (for stylesheet debugging). -- -- -- Widget Tree -- -- -- -- -- -- -- -- -- -- Uploads the session log to the configured pastebin. -- -- -- Send Session Log -- -- -- -- -- -- -- -- -- -- -- -- -- -+ -+ -+ -+SPDX-FileCopyrightText: 2015 Teo Mrnjavac <teo@kde.org> -+SPDX-License-Identifier: GPL-3.0-or-later -+ -+ Calamares::DebugWindow -+ -+ -+ -+ 0 -+ 0 -+ 962 -+ 651 -+ -+ -+ -+ Form -+ -+ -+ -+ -+ -+ 0 -+ -+ -+ -+ GlobalStorage -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ JobQueue -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ Modules -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ Type: -+ -+ -+ -+ -+ -+ -+ none -+ -+ -+ -+ -+ -+ -+ Interface: -+ -+ -+ -+ -+ -+ -+ none -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ Crashes Calamares, so that Dr. Konqi can look at it. -+ -+ -+ Crash now -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ Reloads the stylesheet from the branding directory. -+ -+ -+ Reload Stylesheet -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ Displays the tree of widget names in the log (for stylesheet debugging). -+ -+ -+ Widget Tree -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ Uploads the session log to the configured pastebin. -+ -+ -+ Send Session Log -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -diff --git a/src/calamares/calamares-3.3.7.code-workspace b/src/calamares/calamares-3.3.7.code-workspace -new file mode 100644 -index 0000000..100afc6 ---- /dev/null -+++ b/src/calamares/calamares-3.3.7.code-workspace -@@ -0,0 +1,11 @@ -+{ -+ "folders": [ -+ { -+ "path": "../../../calamares-3.3.7" -+ }, -+ { -+ "path": "../.." -+ } -+ ], -+ "settings": {} -+} -\ No newline at end of file -- -2.43.0 +2.46.0 diff --git a/0004-libcalamares.patch b/0004-libcalamares.patch index 8ba2080..c7a3ebf 100644 --- a/0004-libcalamares.patch +++ b/0004-libcalamares.patch @@ -1,60 +1,17 @@ -From 0d9fb9f2b3efbd5d4ba0c4d9640bdfdb2896c999 Mon Sep 17 00:00:00 2001 -From: cui-gaoleng <562344211@qq.com> -Date: Fri, 8 Nov 2024 01:14:31 +0800 -Subject: [PATCH 2/4] =?UTF-8?q?libcalamares=E6=96=87=E4=BB=B6=E5=A4=B9?= -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit +From 8770a0058ff40d33426301ce39cc1021b1bc3294 Mon Sep 17 00:00:00 2001 +From: lizixin <2271170409@qq.com> +Date: Fri, 27 Dec 2024 15:11:46 +0800 +Subject: [PATCH 3/6] libcalamares --- - src/libcalamares/CalamaresAbout.cpp | 15 ++++++----- - src/libcalamares/locale/TimeZone.cpp | 33 ++++++++++++++++++++++++- - src/libcalamares/locale/Translation.cpp | 14 ++++++++--- - 3 files changed, 49 insertions(+), 13 deletions(-) + src/libcalamares/CalamaresAbout.cpp | 1 + + 1 file changed, 1 insertion(+) diff --git a/src/libcalamares/CalamaresAbout.cpp b/src/libcalamares/CalamaresAbout.cpp -index 4ff4435..65a1b9d 100644 +index 595efc7..65a1b9d 100644 --- a/src/libcalamares/CalamaresAbout.cpp +++ b/src/libcalamares/CalamaresAbout.cpp -@@ -14,13 +14,11 @@ - #include - - static const char s_header[] -- = QT_TRANSLATE_NOOP( "AboutData", "

%1


%2
for %3


" ); -+ = QT_TRANSLATE_NOOP( "AboutData", "

Release:%1


" ); - - static const char s_footer[] - = QT_TRANSLATE_NOOP( "AboutData", -- "Thanks to the Calamares team " -- "and the Calamares " -- "translators team." ); -+ "Thanks to the openEuler team."); - - struct Maintainer - { -@@ -40,9 +38,9 @@ struct Maintainer - }; - - static constexpr const Maintainer maintainers[] = { -- { 2014, 2017, "Teo Mrnjavac", "teo@kde.org" }, -- { 2017, 2022, "Adriaan de Groot", "groot@kde.org" }, -- { 2022, 2024, "Adriaan de Groot (community)", "groot@kde.org" }, -+ // { 2014, 2017, "Teo Mrnjavac", "teo@kde.org" }, -+ // { 2017, 2022, "Adriaan de Groot", "groot@kde.org" }, -+ // { 2022, 2024, "Adriaan de Groot (community)", "groot@kde.org" }, - }; - - static QString -@@ -59,7 +57,7 @@ aboutMaintainers() - static QString - substituteVersions( const QString& s ) - { -- return s.arg( CALAMARES_APPLICATION_NAME ).arg( CALAMARES_VERSION ); -+ return s.arg( "openEuler-24.09" ).arg(""); - } - - const QString -@@ -67,6 +65,7 @@ Calamares::aboutString() +@@ -65,6 +65,7 @@ Calamares::aboutString() { return substituteVersions( QCoreApplication::translate( "AboutData", s_header ) ) + aboutMaintainers() + QCoreApplication::translate( "AboutData", s_footer ); @@ -62,104 +19,6 @@ index 4ff4435..65a1b9d 100644 } const QString -diff --git a/src/libcalamares/locale/TimeZone.cpp b/src/libcalamares/locale/TimeZone.cpp -index 0115618..8ad2525 100644 ---- a/src/libcalamares/locale/TimeZone.cpp -+++ b/src/libcalamares/locale/TimeZone.cpp -@@ -20,6 +20,17 @@ - - static const char TZ_DATA_FILE[] = "/usr/share/zoneinfo/zone.tab"; - -+static const QVector ASIA_ZONE_FILER = { -+ "Beijing", -+ "Shanghai", -+ "Urumqi", -+ "Hong_Kong", -+ "Taipei", -+ "Singapore", -+ "Vientiane", -+ "Tokyo" -+}; -+ - namespace Calamares - { - namespace Locale -@@ -96,6 +107,15 @@ RegionData::translated() const - return QObject::tr( m_human, "tz_regions" ); - } - -+bool containsQString(const QVector& vec, const QString& str) { -+ for (const QString& item : vec) { -+ if (item == str) { -+ return true; -+ } -+ } -+ return false; -+} -+ - static void - loadTZData( RegionVector& regions, ZoneVector& zones, QTextStream& in ) - { -@@ -137,6 +157,12 @@ loadTZData( RegionVector& regions, ZoneVector& zones, QTextStream& in ) - { - continue; - } -+ // NOTE: Taking into account ease of use, filtering zone in Asia. -+ if (region == "Asia") { -+ if (!containsQString(ASIA_ZONE_FILER, zone)) { -+ continue; -+ } -+ } - - QString position = list.at( 1 ); - int cooSplitPos = position.indexOf( QRegularExpression( "[-+]" ), 1 ); -@@ -166,7 +192,12 @@ loadTZData( RegionVector& regions, ZoneVector& zones, QTextStream& in ) - { - regions.append( new RegionData( region ) ); - } -- zones.append( new TimeZoneData( region, zone, countryCode, latitude, longitude ) ); -+ QString adjustedZone = zone; -+ if(zone == "Hong_Kong" || zone == "Taipei" || zone == "Macau") -+ { -+ adjustedZone += "(China)"; -+ } -+ zones.append( new TimeZoneData( region, adjustedZone, countryCode, latitude, longitude ) ); - } - } - -diff --git a/src/libcalamares/locale/Translation.cpp b/src/libcalamares/locale/Translation.cpp -index 49e4c05..e5b3402 100644 ---- a/src/libcalamares/locale/Translation.cpp -+++ b/src/libcalamares/locale/Translation.cpp -@@ -167,8 +167,8 @@ Translation::Translation( const Id& localeId, LabelFormat format, QObject* paren - [ &localeId ]( const TranslationSpecialCase& s ) { return localeId.name == s.id; } ); - const char* name = ( it != std::cend( special_cases ) ) ? it->name : nullptr; - -- QString longFormat = QObject::tr( "%1 (%2)" ); -- -+ // QString longFormat = QObject::tr( "%1 (%2)" ); -+ QString longFormat = QObject::tr( "%1" ); - QString languageName = name ? QString::fromUtf8( name ) : m_locale.nativeLanguageName(); - QString englishName = m_locale.languageToString( m_locale.language() ); - -@@ -181,9 +181,15 @@ Translation::Translation( const Id& localeId, LabelFormat format, QObject* paren - || ( !name && localeId.name.contains( '_' ) - && QLocale::countriesForLanguage( m_locale.language() ).count() > 1 ); - QString countryName = needsCountryName ? m_locale.nativeCountryName() : QString(); -+ if (countryName == "台灣") { -+ countryName = "中國台灣"; -+ } -+ -+ // m_label = needsCountryName ? longFormat.arg( languageName, countryName ) : languageName; - m_label = needsCountryName ? longFormat.arg( languageName, countryName ) : languageName; -- m_englishLabel = needsCountryName ? longFormat.arg( englishName, QLocale::countryToString( m_locale.country() ) ) -- : englishName; -+ // m_englishLabel = needsCountryName ? longFormat.arg( englishName, QLocale::countryToString( m_locale.country() ) ) -+ // : englishName; -+ m_englishLabel = englishName; - } - - QLocale -- -2.43.0 +2.46.0 diff --git a/0005-libcalamaresui.patch b/0005-libcalamaresui.patch index bb77da3..1a17580 100644 --- a/0005-libcalamaresui.patch +++ b/0005-libcalamaresui.patch @@ -1,246 +1,11267 @@ -From 7a3011e5efe45680acac9ad3f2493a5bed5ce85f Mon Sep 17 00:00:00 2001 -From: cui-gaoleng <562344211@qq.com> -Date: Fri, 8 Nov 2024 01:23:08 +0800 -Subject: [PATCH 3/4] =?UTF-8?q?libcalamaresui=E6=96=87=E4=BB=B6=E5=A4=B9?= -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit +From 06a42bff3305887a14a8bda46d1c9ab686b02960 Mon Sep 17 00:00:00 2001 +From: lizixin <2271170409@qq.com> +Date: Fri, 27 Dec 2024 15:18:45 +0800 +Subject: [PATCH 4/6] module-file --- - src/libcalamaresui/Branding.h | 3 +- - src/libcalamaresui/ViewManager.cpp | 54 +++++++++++++++---- - src/libcalamaresui/ViewManager.h | 5 +- - src/libcalamaresui/libcalamaresui.qrc | 2 + - src/libcalamaresui/utils/Gui.cpp | 6 ++- - src/libcalamaresui/utils/Gui.h | 5 +- - .../viewpages/ExecutionViewStep.cpp | 3 +- - 7 files changed, 63 insertions(+), 15 deletions(-) + src/branding/default/languages.png | Bin 86002 -> 489832 bytes + src/branding/default/squid.png | Bin 8313 -> 962 bytes + 2 files changed, 0 insertions(+), 0 deletions(-) + +diff --git a/src/branding/default/languages.png b/src/branding/default/languages.png +index 53316526bc8039e4e05d2860ae5767ccbde9eb4f..3d4b0e2d63f81754cd65b9797dd0fb4119587b54 100644 +GIT binary patch +literal 489832 +zcmV*lKuW)fP)FS;tE@t}f=lRs%ZW>xdn6kr)(3BZkXbA6z*D}M4 +z2vc@M08QzUMTRmF0W@VJgV#_l%A#CUfSaO&hMQw7Zix$0KHf6inqYHVqJv(`C)nJY +zWN}-vZK#lJQz1D>g`^-AlN~Ch*i;_nP8T+tgp;7#b{bXt-1q(|D=GuuRfunV``!$Iy7GgQm$co2JVhnynDUG+!lXw$h7414y{%@v|i)TX04#*TBjJj-*%lt`wfx~8x@^4Dmtd=Z9xZpZ2eU_ZWKJV!QrWm +zg7)bSoiY_qWh**mD>`IK+NC?RP16Y4Wk}j<()B9nm@ep);m|S5rc<^<$4xdJvJ`F8 +z9a^PXv`)8alObrUpC?PwHdD|h!ztcwmub@>ThM8a37x>aJAOULg&2LXXwg=xg=4`YQzuR!JJJa%hw)XuMh)nx+ag%~nfVtWmUFr)afa +z(Q2)t^?FI$bsC3u>jfP*C_1G{!!v1;XVVqWrAb~$_jxfx@luxL)hxwp*^)OmE8gC$ +zcxSWZ-5kODTNMA?Ci!5SeajQLtH{u_r$-#AP**nDx^Va7Lt*(U^ZzLm`X +zPO|WO!QvkTOMj58_)(Dhlg*l6Y}WtkkoKD({WqKJlQx@AI^_Iev-On2j?yC;I;rgwhKPqrs%p=(KSc%VYbbO*%lvU1bII_$a@=Y-rZpH_BxBV*4n(e +zI>>9O4ll2;cxi>ri_2}EU2gOAQj3m@ifF$uK)VG&+RP8qYM#ZDb1a(A4$yp#P19Kx +zjb;UD_+^0lGlSHd5v0y^pIXz3s5K?P6H@~`KE>y;NkKFZPqKJuVvvU>SUfN;Xt-}| +z5myOv&)6V$j|qg(`xbYP33Auy0C$cmqGpOFV7Mna$lXZ+?n*4;&ZHnU69e2HqIzNx +z)#C#`2?44l1gM@EET(EgfGY7tREfPx<(NXVuh(K?15}O+UPGnW0Gf(1MTSZ-7MhCD +z!N26Tm>`;4qXUNU{`IRqUp}hHa9d;%w?-5aUT=*Ea9d=s7`-3HKd#Rg{mFTY@*{(W +znH*YIWN#P~w$Obk$Oa)1U?0yLg_g{IT4@Z`)Ot!G)Zn-!q_EQd~W1W(N?;^oCb-kI|w +zQx66?a9;84nIPYvy~sCbZH}H-94)Z^K`_%W0dOQx@5$EHeKHlJQ57v_CA?pA548q|MrsL010}WYx(a +zD^3Pjda{VczXw?GTY!ZpE#{vLF#D9v?B6UF{#;1TX`8Rk2l=+3i2MSF^xrJze07B} +z`!AAsu#mXJK|}lzi-i0jaR-ZtJ$RYOeMLm<4>EFZkP&+xh(Qik9zT1NI-WH(uwje#XYb<(hv+2IgGJL$<;y($}bz31laxJ>=3i#v&`FK}= +zk8%TixTA=FZ!6-%9YI5v+#o&n*!14(&}Xkh-`#><`q~`zSXMpb8f^^LZ(m6ZGhuIFDH#_F{S?A3bUA9_u+v)h^ +zT710Mq4REGzOMdx1x)_IV&U(KiN^)qw-xYVUXY&o4t>;yIJwC#X&w;c8NY2l0jP(L$*kUaczuqbvDej#{mrp3#%Y+jtFXg}o&Z_KE*w +zikNi8`*Sbzj|GMFSg-hGQ;;D!iuV>uI*bp{B*CKDC`Hp0MZ;uCtwf85;w6v874hm9 +zfJ6>I})7Uj*nr-(tv0!H`r%zg3F&<_cPmDxzVE +zO`}PQCSw#$lN5~-6tzcQ=JhWwGb}?fey`$R>lD>v&Qmqkp+>x-W}M>gSjD}u7S$6h +zsw65Z#0aXzEAEb0+#6-{Xv7s-r8qo2MbT!ezM$|EJWja1weqbL*SP&Q6bE=u{t +zIFyTaC?74T5TmFRBdHSSujM0cO2^vh_vY0i1b0VD?vGZ~j8fb-(&nZSLCTB_a$~GT +znFK+(Bt^L-y$Z_4>uZCQi7BLPY>`h~fO3g8HziBTrbzR+G6^;}L>Eyy;v%IZE*Q#0 +zUZiZ)CCch`7c8=1+&zo(1JbX?c)8|TkewH$ypQWtkGtC*we0s|8w{k-R +zXvz!=P&;OPnww(mVs4Ig +zxFy~;luvNb+?wD}Awf_vQBonnredOFsFWnAoa}^EmJx?e8G@&?6i;Wlbj(z= +zPuJIk&;pd<(mul8no&Qx +z%5-V6UQ&OJq+Y5^-BmudR=PZ~N>Y23qE4!7)>>Lnw76)wS*fV^7t~+n5~ks57fqwp +z($HkBOXD?)rmH2*)+k!6b!o9y@uU`*4KA(Lx#r)YJOPO|r$;J{g%{PQ-)F4&y7toX6W?iTHHC-qUM+&caCwWIodYdG0Nihlpr;d +zgWR5Eac82%T}d`IlPvB?3{t~jQ!UY=YC@1IaY3raTg6mMu+db}e+c7)REi5wIo_sH +zob?}6j1A&rQ8C6Yrb4vE|ApJ4f|R6ubddkXEzvgRqit@9vJ5vz2GNv{@VRAVpm;lc +zEWF+tX%QxTOt1QyTSi*f5Psg9A_Dvs{&o7=zoxvADJ@I^Dn^iF@#$o#z +zo2_RoBOjZ!%$&B3$fTdL+4zUWx<7)fJsDv29|2bW9$?uY0hXK$viOf6i~b0(_~aE9 +zoD4Ge7mL*29d@2^I9lNF%>{=e7bH7Q3lDTfM4I_!{?FG2N& +zhfU8NHa)gm1}zKSc39V;j|J(L8=yy?MfW_5Zh016cUfp*`CwZiAMO-!n(3(_Y~UuX02 +z)&O0!#N-INY>{-%vH5Vb#YbChy6F$Ca&5Zra_F(!rQ3doZu^Spm3x7d!!|3=xGX>G +zl6>5z`}RV*?6&E7*rjK_qW2+5?*kTn4+whfQhbnO@#cmryuC5N2b*kq?^b+z#AVpm +zHp7ou3_W7=$pM=Id0JwE=KJfvSAU;21NPYr+-oy%w_w0dmu~9?Z_m5T2g@w_WlKKU +zD)?lJWat)`PqG9bt++zx#X-6)Q}j-C>Aqa>_o;=vJhqUYD_sU|P<*;Rz<>=dT~b}1 +z`y$BGlZtp{hQrIV70=Iid1j8wi!*EnEOVKf<1%?ukWpJ~hNMZ}nSF)#<|zhcxD4Cs +z(m&nh{Ur`<#}v{uS<*DcrAdmSUSbio6I~vUS2RtKygT2ePnyfXi~zk;CGXC1=`>l; +zcB-zuSXi1~dE=@oz~8@6 +zB_w_Z2r9=)?umD~FUsZ41eYrDlFErLmEv70$GY4e@0#-uL!SgrH1}78k+IQIeaZUCPC1w8-dVg7Q(43Q>xRQIg70iV6|_G5@?n +z#Yl&{qZAM8uOUKFafD6TD4QE&Y)Z!o$|NXCB`QiK3Cbi2%EUXAinS;e6QFcV5v5}T +zluocHlW0>WMNuZ%HIKg`PH)8%JKCbmS$2-o9Z(0XGgiUrgx{7tqJU +z=l(YQJU0w2;Kt9j$eg3pr)Mes=~>Erc8=1YpW$!ih6f3wMWyWUpf4_3Sj={ivLh@X +zBP=#$^crDPF4Cb~gl(ini;E^KE#dX1D2H2O1UHAcC00^CUKnmokZ62)5mZXl65~)g +zNm4mk%Zs3LilFK!UtaWDZM5ze&E>dXfEmqW9qUFVnWDimMZ@K; +zq0tHt!!nmfAsR3DXuRA-i%jF?iY6;uny%2|qNT+R;S0=@t35O=Qzfm}xU^oYXuHm( +z?Ru9s>s?x}_doe>vq92!gQDFAMTay+$8^`wKFuRcyNxdGH@bA#=$Ug*Ww<<*sdzqH +zCnWiE=@Knnx%Q@<4Jl@;l@xBok#fRIW^G=tK +zb}72;cImOlrPp4UetTU8>~k5o-(~PVm(TXO4Bf97c0e)mpi5-FYs4k?uq6JdBKa%D +zsN;&UCp;#6>oWO-V%oQo8Q)4~eJ7avy=4CPl7&Ai7XPSN@}pw;&x%z)OIH6PS@)Y_ +z<8O+LlP*~&J+e=EY&q?*{WR=64ZF^G>^=*7&bjO>P#nA<$-gN0>aya*6~T`I#c!6! +z@3zO!7W^FW__;{(bCECt^TQR%4*{3sg&yBoaJUHOpD1Ev?iKp%5cJ&P(S56=dyeGe +z&5DmUNh2s-Sh8a9|B)3GAd@h^v5f-;a+Ej@2-wafYu(>Vbsz}`yX_=o*g(#Z}(Y^pyim|C2<50z5 +zQ!UP+dc4i;@eX$+*whRO={?Cd_odi8kYe$`D2seY`jJ72^MuGS=60m(_o52 +zlc_c>rWMg@#${T4d4(ruIJBJu?Pg1!UnF>Gei831zC^;#0`e|-9JvtWs|$i-7d#GM +z@HnKU=7Pgl1y?y%;BchC;c$V?p#qx&1vYyN1bOFdcAazBdDdpzS(~kA9X6kJ$Uftc +zb=D#Mj7{2U$FTmC#hOz#t4>+0Jms+Bl+B8hL6-a;WZ@}?1t%R={A!bRO0d5`aQuqT +zfdY?pKLwa}_yS||3mJVxFzT=(<*+2_h(qFGhxmMl*h4l^2W&rRW#J0&0Pbd1D&w9BU39zk!NP8@O>u-~EY9*5p}qL^O09D3#IbVd}v +zX7`peQp3Gl)EAcNCk_$K%)3py`%X+J(dvr#rpM=6?&k~Bz>G){uYVigTi0=zLt +zGC0FyP&y1sg?}z^X*;=yj?*MB&B4e@mwA$5Yanu+$M7{Sef8t!Lc3%^vm}ouV_cey +zl{6pc(Kz0tQHJHV#HCt1 +z+?@aq#|WMr3r|mjm!?CT2`&#N1kLZ;^3iZ>4BQ;8xGC19Tr8B0@hBJVnPcUnT`Ii()a8HcK!|`x$489me`EpbyPEk5hONmRVWJT#DMVUlN +znRsagr*xb{X`Rd@*p$}ClRZi&W7bk}K}tmza%0pLN=06#RHR<7P&%rRQlVp|M_irr`lJ<-&{zQg*l& +z8DD0!(3Bft8MMfh8);K^q)uBLBQRy7EW(tFwkgR?F*<$m1x8DZrhKgA)_B2f3DQtO +z$7MQsNph%=>{BsCps6%UP{Brh#ixoDnD^=WD3#iP|~EiTY@okzR%9_`obRZEO7E?QnR?bCb# +z>6GCakqOI7$+bf|Je3L0WNSR0+oX7AlcH0WM~4iLc9}YH@#v80(J2!;WkUxo9@&a# +zHoLsI1zy|=&*pgMSnEuImX}spuBmyoHOY&ly%vvEYy_>dbal+7$p)8tYdmVNhFYmm$KX*XRRgtGX_4`$ +zvkF7qRiM$bqb25g>ZL;c)jkbE^3r5A#p2RzjTRSZu@0VG4=vY+#ATzF7ihN;+Hb_j +zVW%{BD#PRHbf4!k;l(U?IU8Qhgx4}X-pKO!`z8!;=fFET@Q*F<&#fLGZ1d>69lGp* +zk8<5>oMUw +znDQM=`_5y=cOJ98cbWHtV&M-Si+)fn`N?J3&#sY|)L&fI{^qh?CoX?L<|)WN<+Ay- +z%a$`9+s}IBp7qE(>#_H|$NmD?U*K}+lH%|s$+yzMgmcj#J#r2BT)$V=C3L6>a!AWQMjOvQWY +zF7KwfyuDHK_YH#A*EzhlR`AMd$qT81XIBcISs{69nWV!KNxQ|8wu>aK7YJG|5Jp^@ +z&$DT+#bu75;cP*JS(17)C3R;?>Q7hH`$AIZ3t`X#^TaeQFb=gngxebLk6 +zS25b5QVFWW`u{#!WNK)UF%n~&RPF9$n|qUj+?O2W{*<7Rn1{#MJUZ6miSZV-jL6v3 +zo9xhda**azw8#jWe<^4-ThMB*pu?OXPt9|9dcNe53yzVDeFYAC3Iw~(JLH}hY(Fp9dQOmY&SBFzLDo4*=2=PR +z8A1AK!N${)wWkEDPYF^_36}rivh0*(@fn*1XDk++v|0MAP39@V0rTO8#rIb%4qjHQ +z`PF9T*M*EfVlh@r%uzwgFd(q)~-4BzAM`EG|#4T2$g +z4ny)J1M>s}a;48MMgLujez}r9A(;q^g_Z(CuAtjaopjjr*e&R}N78ezq{m)Gk3EWy +zcR75Nt1G;c&bba<@@ziJv+21{&_Ca0z(GO(eUiR=)U^V$OVE3lH1x`q^vLy0nxbF7 +z-)=22zR2{^ua~D&7Rg831)aCpbltAd64P~?ple8AdhM3<-L2?zK+q>&(&wGN7(6oU`C=5Np7z3@q%NB=GG!3x0}bFR>1 +zgUiqzFd|nna)-y~J7HiJ^jt3Ky;3k>gQRzw$NNh>o*r|VH>WE4u7*!HdVI1$FkmD6 +zW3fy7i55>yRlGLa<<0pPZ!WZXXO2g&H}*Ob001BWNklf +zZ&OAKPBN4o1!c9+#95SzDx!2$5v3vv4Q5+c%%TI79eJ73BQ8cz& +z%7`LL4ZlLEp%*DV^a7=a7We`aPG4>sVWII8m=dW=IDHAP;p9c9FU45g6lEK3j&?A_ +zSm=2dGxHJ>7b7om>OTagVv?j%vM^Lka?DzJl%UFJ`5#mrBdDgUW8)On#w)5#kj30F +zNm6sN;?5~PcYmR{XS(Fx8H)SAR6ICG@$fvw<62&pDe5ef)Lkw@DC&mf<%uO8k1uw4 +zbb;%qEjodj50B~;X1;&yQC&eRDKCo^b#$T=N?-J<Fut_- +ziAy+j39lxBS?SSYB_Vn7crw+)$cq-3)gGA_}4a%54O8}xWl8%cE!iJ&?C=JU9`CL +z+Xwykc?{X_i;Iz$gIZiXA`U@hKExbW#2-;49Tg;h8CE=DyDwxGW|Q38Q;3h +z`T^z{aq(DmP3q#Z`d43E(tg*eiz4$6$tGPDJL9tbjK|KiF1s{m6noDp_MeyJ7f4eL +zId)0%brGDf;3wPV4_k5C68siW{2YMqiUhw3kDsmt`Kid^+knd2I<%*7` +zCMIdWSkii-Ln|#V^Cd0kxip_6X);&PXtqOxS%UgsN<+OFiaIl-Nm^=8ai~2_QERH? +z@hO7GCObT;)0W9L4^FmtaFW9V6NTaa2@dy-7u-9}F~V}Ukrlz+qXl=4*3~c{Eh(C? +zwCJ@)l1=qQi|WZX)sqD^Qlz1Jl4ELMRpWIXOmFKqzdqIDeOb|RQYlXQf)Z;}sRYI1 +z5;|5f#-SuSEeNBfL~rXfMW-xRQx(B&(c-@f$$yiT|8*`bFaMFAgazZewS1)DulUmx +zrbJ3pGFd5^xcs+mEjQ&yI@}f^xNW4*ts@+69q9{>{_Q-a(-D!_wdEFK;cbWjJ(EaO|>Us$|D6NRAgs +zzPTXy=Ay;d7i^9c1UXV*lV70x4<*jQzO$aGm*o}&*mALuoC`s6&Pz6*6Kp!`kafl( +z2Qop^xUK8MzqX0bl)TRC{NO5 +zm!R`5#fQ0q&Up@9brtN8qJO@i{{e@7dmVc1_Mb!7e0@Pu^vYHAF(Tvo>CX;bGt<)J +z(SM(7V-Ed~Nctaf>9$YsL5|?9^$wkLpvMlI +zzIy@;Jtm0w#%07eE}tIJiHoA&ZpFZTE`twvMqu=|`2cON%i!HGaJ$Fb^RMvMmk!-i +zJtB80B6bKq-6i>Sr)Mf+J(dLNy-G4D1A4EA_vYHXIPMDXd4rrUCtPcvayj^dMS +z=)4NrPH<>2+M(_!MZHmqX1e~B;?XEk@?=UO-Bv52hc2-fQ9R +zn1GRs@<|?565x(FxF-SbN`Pt!P$2;-#lc;%9*@MjJRYlPKN()04ljS<(Q-W86(_hY +zMsZUdl#TO@bd-tJ@_~_zvWYI`;uN>VcvOheasuUJ;MO>}DbD4_ctsiAhKg0(83VOq +z;l2oEK9ss4!QsXPMcG7;vdK_tv`6XDin1ws-=%bdPGTH0hf^xfp;UsPRFb5$KA!?* +zl00sV72Fsdq*RnnWCE0mDWX(NAveSZxG}nj8zT$3G2#k0jJ!zck(VenqJYwRPDWSH +zLegW_5tk`7{E|syZX8;0wL+%lMaxV{fzfHp^%PgfiseO%%%2O)EwMI+aPo4Uyyz50 +zCoumPfzkD`lJepU%vE`*K2f0sMxzDBmlroAFoFkWxgmj(Jh50(XPKhzaxF2A5tw>Q +zUFt4%d1A50V~doL7oD;^GEe$-vH6}6n8z0os*g#Ym@lcdAe6vpDOx1|Ltq*#(-I?# +zD`Q$>O4iB30^`@mq^XQGTIR1|foZzZquDB7Ucw1XIE4wzOITpq>Z;O4&!jCnebEBr +z6RM7d1g1lJSX|stg-ox~2+UKNx-RAm%yXMvp5ElqDNE5IBSf~YhPiaoX~`x@r%i%q +zHw#|a>hkgqcwwu@Gg~~`W&5)zPiA`Pgyqk~C45W^O#4m#@V%~*>9nS0rk}L<0^_2S +z7hhof0sYombT+w0URq_rle%WM0UE5sq%U<=!xO14wM<ZmoI+snE3-Hd71lz%Yq+07XRe3^e2zyKY677 +zqFDQz$NJwq(tdYI56R2sQ!Y7Y6g!N(z^-#1yU%&-JMVJvg6qr6CCQO1im!`oGv9JL +zAURv)@<$Q;QUpH+;YVBXTam-hg@O}7$h!m6 +zu}zYHXG;E=A$c!d@$N>!+Z&Xbad~a6a81nNi7BF($0s{HGRfhgNe&NA +zw0U5n&HZ{nzgS?Tk(Y4dqQ%7|Ev6!-lNQH_OITjCwA`L7sga};70XafSH^Vm5~5n7 +zFD*u3;w9DMH`Fm#-&`AU`BQ=U|4&@PV)Oq}VE$8r +zu2#(ay4lrgSXf&0HR0_)TmMR6wAAQpZ_-JPmYI=SWUi($ej;NRr&U)4Mo>A%rdq5+ +zwOGqgJ8b&GripTQAsbE3nye-e&VTo9uHA +znP(l+&f07^M%M+sZ5?julF`J)#(NFu>RoLDm#NW)ZBs2ua8F<7~Pe6?8x0 +z(fhch|51klM+JS3xO}|F<()K}_cA5=HM->n`Q(UV#0eO2LNffA;`4luL3@?qlLH=~ +z9B>)3Uzrcl2JO*xHGSh4Nslze8`CY`ni1fWESIP}m(O?U8!xyF&4J#l96nxB$bdAD +zej!nL|4WA#Cs=&6TrwmB25X7f0KHOm`XPCGoW)Bs;FVeM`Xb5O3oZUV&*HPy9^q$l;`ukiA; +zAcI%K@D1?U2KZ<>JU7**&3M79I)$0#@UJ;R2CahV^$?{~rVQw|3fhk?q=lBEanNX- +zOVf#p7NZqyMp;INrW}Ov2jQ8SHZ@}cl#Nloz{Gppqe<|nmgrF--Zk7F?{ROu$NjO2 +zddZUKztB}S|NF0#BB>q~G%S$*fROi9N~J;3jp8rf6X@Km!D%652ei%w=Ftul0VOb_Av0;44*EG*Zr`kWRQjlP?huAJ#An68g$fzdQibIsgK +zi*)~d>ue8=5uJ38rt4iAuJJdFgBQI+`8i&xcFU{6^raIQb4C?#UF`c}a*_SkEpH?D$Nq5nevFEdN^5PcD%d4B< +z)lmBKRt~(qC0rZR>5Iqv+x_%K&%At`>(PC;N3T6xm6roB=l~2k2%l?d$;S|puag&- +z*uxNa1QL(AjQZMT+;PRk6Ot+4DW-kzCoeO9@RTTti>{3wFM>T6VcMZ9e7dcOzB?2>c0l)Sik@47bl+5H5|_@|f)BF< +z|I82}agqLvi>`^S6TGrU@=~hc`Be_ju5fr}xnC9QxJ1!@iC-1-6Bj>qX)#aHY>uSq +zY(bMRB@Ji#sY|_?!pMuRiTU#_4v$Z@eRSe7$>z~X!tiiNUbMjI#3h`%luTZ9UCg8| +zDK<5eE$&FZS`iDUE`H*olb5SCF;fXkw5gipP&G+VHBtB#v3Q#*aeBr@_{964-s@xf +zjj$FMEihq0xqc0cP55|NV8YUJO&#n%5}4}+M*c?c2vX0Fc4Toss-kJa0MCNKKfe-jveUjO~n^|i3XnEIQp!0C!v38B#y +zJpD5di%g|x3yr>eS=E>z)nbDfk%_msJzn2s&f;!8?4KMoY0Q1e77vDIWF8)4@%T7h +zFAGvo5=T|*U +z?{M^zApepw|A&phoR@rc(dOtSi~LJPyTi(p7Mpc?ds*<+r2yYt +z39`39vi28;$zKabf8{XhE6J#1l9a=Oq5B4Zl*RYh_`H(TRd4T=~+eOz&LB$cz>ma~H8ZVeaziON>rGq!AXK#Au1p +z0@GRF6)Z1EzeAEihZTbkN&4s{MbFXX>6sO2grrZN3f0K`N|}}yEirm#rjH(o->*y+ +ztnWTS?>)-DRwpjo9lt`h!=7kRhUQ;k{P#ty +zyx@>t1k2CDxNlwhAF%jXSIJI5pRaBDe=X_vl}GO*9$j}U-p(lE{Va!%wz;N0H{__x +z@Z*Y+#}y;K^7!PSWZ)i~L3@Rf7cDV^_jwG`AE@oK7_!e{$S&xzO7Ys%0PoL}e74mi +zBF`dnmmq29s;Kbd$^Qt%`x^@cK-b +zCZk-MjdD$5(quF=7z+)?xHL<;%v&=&2Bi7|Gbjx{S_vH|SUfjP^8Qkncjg6of3~9k +zN*IymOH5Q6bl0*o&8GQSMbmN6d_1%q?a^YC$J0}T^i6Y_ln)6zJzkp^plY`^m8a%Y^b1iREoa;cc0sF2`sdx~EryFc2dVT$6}Y5L~?FVBQVqa{@%Y%1ugSR4kO +zwCJjso{PCD-sPq^&s5FI$71BAVw6k8XpizbwMkG$a`c>f)i{?2lHh?vsG+4OPMQ?v +zh9s9#DK4c)=@h1f#3boC8C@m2Dl(;Y5~Jr~bd@Yc*U6NTm{Ku1g()(%GJPX}8)7U< +z#Rg5CtW0#kpM5cNF$G3sbTSi03ry*eA%)O{6oxHdqw7|I3TC8|tkxpB#&bfpI=85@QSbS?@)Ay8ny31;F~2(I3rx$^dT8IH?RwD3 +zix!x0g)BVt(r&%JtC&CcqLURp$Kuz=l&OyC$Av3o9nuwk`U1~x!pyxqlO^dCk{5kW +z&&BxXbV8$eev8X1+g;w+>G4Lco_%q7YO`zZG}bcRpMB91qwg|SQeaAMYnf@EO|iV_ +z^hH<1w5aGo{jk93wMDw0%;?0W)h3UY*%-;uGcS$Sy3`K|OkF+y5*pMuYk1ZrBq-sE +zm|nHK_{098RnNMl>PneUxIWfsjaw`(I(ccf7MiS9A%SsexlRx5yR_cu(IySrriJQb +zY5q+S^vsK{j6Ij>8hLp!+vTNA9$H>r+vE@I`>BgBFYj*glb83myL_;AMMo1 +zi))e>{b`%7jSblEnSp&X^K#H-=pm1hhr!6pVTeAgh&$@fyrg{PGX4Zi{?=vccdn6_ +z8Q*(+`Mt-SA3f&(T(h?^t{U-9yzByww{IUXI*klWlZ@) +z`sY1gUM?z*TndYe%eRFdKLtE~4Z_d1u8+Y_LBVf9ho6falfdjg2a}Ek_-yMrKHaHr +zdur2bn@jht9$m9tx@Ea^&2mGDi{Slq5lUPHZ?2cTu}<=;7MImpT!ayqryIbFU)*PvpK?uOQTtOKwl5%hX(VnOI)ZVR5mGD`WqWy69P!WXEtvs3NAN#pkND==m013)5@WL_LgeQzg;yF|#cWRpPEz +z#q^Ae5gGkBJ;$PNX&kF>qpADNem$(DpoEVVuh-ABgy&kqtC?N#h2+}Wm=+iLm(?wO +zt|Zq>M)+L#xE7tTyy(>zjQ@866MmiWYy6eK=*N{5nLm@5|BJwcuM0m{`N(U(KmB!t +zXJo>{s70n?RIr#z(LpN52B{kB%S?@UoyJ%pk+HZt(F)DUSlpkYhy87?ii}0=i8gg7 +zN$OAXXf|2WVyexPGbB%bsc1Dv(QckYr+F67E>b+Rz~b)<&oM0XJlVfG9KE3U`l90a +z1;sb#CEuQdZ_Z;9nPV4(xdr+WleD@VEO6OhAlY5uu&cmfXMw|Zlg9Y7G1+H@Nn_H_ +z2s7Zn;k01w8NtfaqF7><{9&{Bq{ZUjZI=ITv$;TU;IhMs!XmyYwAg>yH8&8Mcr3t} +zV-BNr5_4EFDqoV4FGxP*5P!%f=8!|wK}m$ZUHm@Du)U6vn9uh(Mq)krqw7}@q4BqSEdm|rOV3etB>DrbSm~MGjt7N85mTU1*Zjj!3MkHS` +zIA5nJT1sqs?Xpb5(|5OPL`kPTT39sUBu2lU78pH0Gw`6Kzn*Q`r;{1|9MVY6$2%M| +z7t?j8$46RZcKRvIfP?xq9R?n882Gizr{BVWBSD58xy-a*f~>y;*;ioIIY|1}p;vy8 +zUSGTP{#w!RYmdHPyYw})F?zPg;jQ!_?`P@SvS(^>!;fRCWRb^Rh8>X%*=sRa|6C7v +ze0~sy=&xBz%s!hTdt5%-3j?;o2TK*NPPXa3MiH5-h{+Yi=6XczfWg@wAFnB5aA??m +zXr@j)9A28>@a9yPe(PaihG2lc#d11)xX9(D$qr9XmAp6yUYP6g_EPxgBEi7b4x@8m +z%2t@V#b(kDMf@h{v)tu_x%w8#E}w0Z4BrCXmO=aRE-gpdv>4;jcnmZg=SxiE6iM6B +zl6Sw7B7DpBxbwI^n8fR)itw#xdUY7WT=+pQ6t_nvoLohV +z!T6w`5fJtAp$e6pDMF%JyrG>?xfhn23l$4k<5rsx%{uch_ +zss+Y~ObLN0nZD>KToayq@x?`_FT%{c6pKq}SU)T +zD(+G1s9oA>>s|;bxaz>YCtCLwl)d)|S&XoeAxlM2_DCR*FvH$U5N&H!kPXSX_WO5# +zzTfN0If-cRzV7GwJ;J;yVMBSt7B?3P&q8?}zfK4uk| +z+voV)QK(H93pNS7+%-3({v40H=lMLeFyhfA7Ptu+(>P|~rS6Q7dL~_1)^&~kNP;HB-FkPhoYI<1T7vOc26hJdV10XdrjdTkBq|5+4+OUQdW0!Dlu@%|3M +zOKchY(r3co119}Lma%}TUxg^|QuuX9@i#Dk7bfen*r+a{sYPC~$7j{vfHnI=*2jv= +z=7RyB9SThCvBLU)wQMuD001BWNkl1bPzuYwUvIIV}r={;1# +z=^CX)5TblbW>8=7VzVk%fysoI%-adTR0-oJ(2{vQO87nv12%i2H|hVA$C8gp-qct9 +zymXsb8ZQ240F%64^7^_akA468!xpmSW0Rkc$yJXhw{=a_mCOvx32hyYZ)cm!^fNU1 +z_~bS1H375q*C3FoUWRaT#}wvBo#|X*R2eC2QrKiM`&Bn7GHNe#__a}GY)(dsj6ml6 +zT!D=STN--yc!Jg(|j!L7 +zrfW+BF*e{YkP*aWDlvkWhsmuIb3dNf<*nikAv +zWzcdND2LRz6doDo@W9|BG?^LFc_DOJ6w+x)M4M6!z`QxtqtzT}Gbf;FQOMIH;GRAX +z&x}s-?reB>rcdLU0gaWF8Rb)dPz84l4!LW%l$eM|#s$W9)@e5MnJ<8Wg82@87em*1 +z@Y+Wqe;ecS*5r`Zb1}J?24ms&K1ZmN=TNg(3^1~Oc$ImI?VBUR{@ULLh_L#{4xsn^@5UQR^4+<+(F +z_sCxX!v&Z#9Dd#XJ5KJRCSEvQ>W8v0riCovmx^2T@c3m9{p^5Wb(NjWgn=^AljmylDtM4Z+YPLs7P3y#f-I7XS3 +z?0_0QJkISJabb5jv#Zn@->NJM^Y^sMih&majE*d2%EZJFBkP%fN3W&lj?J;>7d-=8 +z!*ZKbJxyn^_DoKWTrkQh~8KnS8Q4` +ziptyOz8=fSy!;rzWP(egz?`JbmrCWuuL3ZY@DeL93h_&UsRWolo&}e_K4%pKoYgL>~;O3&Sp~<-jT&ly1 +zpheZoI`($JrDMX%V_U~Ut{7+SV*(f{Emu!S!%G4ydfYx2Rf5g;0Vb@3mo&hngZp)- +zWLn1TZ~85~Sb(vrN@#-nY7`Tg=$Iz4Ss`i~OW;LU0gT>cCm*K_%xy)U0T@*&tBvfg +zxjG?t&-J-?p2vd=0v=xqk1d7!7s4I$to^Ij?10(|;1^koms-beEb>goML8E$C0me* +zxUn##o_1W~mNMDF1SwX1u?kF8>sT6K>J%#TB5(<~e6mi6Y+uT`=*T{n2{1`Tvf$;C +ziJ>{Ni&ce}s_Ki`dWpd$v5j3jH8KDrh^ak2;`-^>trw%d1k{^R6%O@%y?s{59fg5W +zU!=U;Ge-cUeHQ_YHeQr>iA-Q$03&#LW?{s03nQLi9P;AgkXM!jyuMVw^$TgZA~L7( +zO5ga7TdWFbt-$`;i1up(V;fUozuSh8o|^;mwuA;=RFkZhF_U%qJY>Y@A)|MOjQ%`i +ztZ5mGm|#>F!HduIuY8kr(XNZKE~XxNmm0=GV-;DpH>}LMtlJl`;Xr8YVp|V~mGJV9 +ziqO;~f9=BG4?4y|rpJ~ahP;)BXj*!Nx0VQ8pyB+8w~GT_FAjOBIN-Ut5zovCd9ujo +z@j{QsX4;I)!&3tuni_EblmLbE>#GiVqRqJ2aK6h;A9&Oo=W@eX3ogpGn0(9oz6s|G +zTx`b0Gx?TF2m7W9`7eXK%22)n`4?z(vNGGE8e|*DPpn}I=GzlDiW!@j!>@BwRl@l; +zkgxh_RWW6@{^je=He_e&CS?;Eq_%#9Dw0E`I +ztIWl;TkfHwe2m^yw}>re3i!)PmZ`)fFw=0UYd|Iem_&uKRxq1qNgzhq7Yi^RFD`U= +zd9i1PEt{?LX|86l6?W&vzNS=`(YE>ie}58 +z`EqEnETZ*Fm)0vnUYg`_?|{QRIpQ!)W`%TJ3Z0iqk-=EVUi|n7Ed((0RJR<_WClDj +z%;&y-hj{fRILmJ^L+X( +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 +zgbVU2IH7yMDLHUjavR>4 +z3X>gjLeG#Bv*EaG3o!y3*~$#K2wvhN73OEz7BXsNM@EG?w2O3%p{K`0AtmcG{B_6MP1W2xSt6xcJrmW0^`}h +zzENG$)yYZrMY}K6w_i+n-$0Dre6iz|@%GC=pWh4$_}!3*-wg@4U_{6tM~3`)Y=m+y +z8mKfUR$ipOSb#~ZEtvq5h8H!D$vXC*1I)FbPzf*wUOo;@{v{1K)?$`qV61)2)+X1A +z;Y9!=>zIz;LrD6qd!Qa#2x_UckqV@5H&KqKwFtkPIzU>aXC;ib!Z=(ZuE$3~w#Q6|qpti(1C^K-pecz86-T +z-?&CL>vF(j`yr1Vhh2L;6z~rpwtBE=KXfVnoc7B+-dYH6Ez}65XTte{7j3y{$Hk0L +z&hdGsFu>Zyd^4c-kSdWUd)yxf^y?eN#j!gsAE;H#(rdt6Z9$9pXS#v<0oTEx^ImTnNULHs0)Z-ysx{VJoA +zwneOJ{jn@z$uTWrY6vsROKcH~b1ez9oZK~42{5{CP7E&zv}9f@2PI|i(jt6@EldED +zWLv5?eI;++Gq344$=|nl{oe$b%&$W#Q05zX-Tr?IV15WHe(dq10ZbC$SMJ4}j3EDy +zy_TL!{;tW#CHE6BvT*l(h{^nSH#wQku4yncRm@!-v=ww_cZXkfcT9VkGBUsIS;6@^ +zj%h5rAWwssjv2(fu(xAIF)!`sa7BM@$&_>Tz$4TgTtV$2De4U_=cW-ysQdmtZXQ)Z +z{V@@bj`e9UawkJKdnTu{evjRKTDL#NmIEm^?Fr1j%&NVrSQo_Dfd69UV)lA=^zu8~ +zP&Rv)YXHXPVjL#!R=8gf|}8!rqe20vuyG(%Ule^Xz+4{&BX{}l9K?8QA=be6I8_D +zl6e)(yq*Cu0vL0arg%%0!s|m?ZHQ>SKA`z(RS&20EE>Ahc}J%Tz{D9D1^UZ8Ga6}a +zWXi?(G+h&!BdB?GQHoa<_`JFhUNMbi9xb*o`^GNytSGobyP$fz}~i{Rx6A-5KkQ#0SC +zwg96bqIQ2~G(6;`i7qdWcX@U+JUb$w`DDnS +z2L%ftyA)IyaD9F`_4)+V>labGUqGD#kDGf}&}2ryuno|6CEPzw?UNM-P|nJg1=%rb +zi~*RQA!lT(@X7+r=?e9C_xV%z3T_`5^1?WHajYHcRC}Qmml`<{C+0*3UIZ}8y9iWH +z$bu7lq~S#nqd>ntM^-Wg^N-8&48)wB4d>;+8QOI079tzj&ooxq3x3fDj_U(8VvzZT +z9#eg?KqxCTSs3MEOsGEz{>R~e*~xy=%>smcYw7{bPU`5E}L6_d`SeFiZerGc6Z?fB~3`Kf(aa#R8dei2@Uu=CK4;ssl{A +zHu--JFqeN2aOL>GC@h%(BWN+lg!|J9%rz5jeR8ti6iwwBjR~m8u +zf`|u7eI8#N&|sMqn27sJeQqoExV|W)W(+R|U<&OBVX>Mf0`m+L~ +zwA7g;h_Rb4$#A9Fewpc;?2F03#870blq0U59&qKirBF}QrEuztkqJsxZJdZvkJ%|QieF?p8lheN(R?C{US6?~ZrSbG>oZAsC7 +zsYBzXA#ZD3Z9%|0r9N+!1iV(F5z1I~nd9?pQ9y&)0Z+{icw(l{Bh!;QWRLqMdEE1f +ziv<_Y)FI#Up<@OpZyM`UZ;UovTx!4Xp(s*aDYuw=rDZVOmWRG_=FRbtFYWjCv|WCp(z6-HM*o(U?tUHQg1LsiKH +zhvfO>n&dW;`?_Yn;m&;gKe=7~>(c$qujBsyH7^cN#AlVEhy*8{uNv`P^wHo&A}dZhPl)mUcoKzr?~a~a&8-);?6NX4~#uXr}_I$ +zK4tR(kFEPXHtmNE`$9JC^H>+>Vpi^T4alf&S$i?__XuQs=Ir(<+^t+pifOx3Oy2F- +zaQ`l!@fyC|<(r!2Prf=#$v&4AhXd9f@>p{)Wd7G4BQ_kQV7*WNMocqV-a3z*HIAuQ +z&RUaXVqChecImR(r_(Cm+R3EGtn_KU!l%^=--P=GFwK_xRX`?fCzBduYmIfaVSH`7 +z_`F_LRf&1E%;B|V6*OMs(`FO2->h90&!{lUvZzfm0T>1J8!vOM@}tL1ZL)&@QfETm +zT^<^UX%gpQnym6@CR^Itkat%_ys*=COx +z+mwk3O*W>>wsJn*4-3l!R=7Shj|2?(%AwhIpLcgc)9nr|x0cgli%YYu7>Id&B{V3k +z;Ee?yZS?bJTV$+bEmsA`a@TsDhXAI_Cg`v#q~)R%EfzYoToTc83A9-p(y|m@{4n6* +zeh$x%3h1%~Ixh+=#LNwNd$KYro~aq`wlFjh^W12tpYQSTh=@kBp?Q%{vm#|sLhkBc +z&Yk@O?&uHoheXtW&*Oy;BU;an=uzy^Z(+oHOJL~IkfAFg2Cjs6C!~0BtVh%7&~{Ep +zyJDX<^P$0q4mb2EH$#-Q`@(g7q?o7*8Ez@4;DwI@nopM!1C2gWi&?;5^C}EDy!L6t +za}(joaq#p=pElE>_xy+<3ot{MH}=^_%{-)LX?iKOCV2>UpFnC2o_eD@| +zm^Q!4IVIQQmpLJ4<-%#XaJsRM`JC1>;pn@I^^Do9QZEqPWu$8{{P`dF6~HI6z`nZQcs)it4g1^1KoF`Ip{!Sb0Eo7=s_DyjAya8dXzyzE>JZTiO>Pw=){8{SD +z2U1?FG9z`SYU7v!{5nb7ShD*Pn&HaCLT0REIpjW +zsO9*~V85(pX@I%z6Wcykds2h|COOpsM%yo{NY=Xh&C_+;-oJHbx(3;*FSda!8KE@S +zLd>9LCcFr0q#E2g2NT$r`f`6s$OEMz4=hyfCE)3@hz84)d(nucZ|ah-D~zZ)+itPc +znyrl%9iMtdJ~tO9*%zN%=3xdZtxYW8`kBhSBp;t1u2lP2EdwxqTG5#e3hYaHk#+2f +zsR5Tw@r{MdKuo;-a%F5Es}3;BF%UXxLmyfGwuvvMzWL%7DrL +z2u#!1%&&ZAe-kiwSIGQb0Sl$Nd>2r*Cq#LdHTy!=@AKJoAYjWuwEzWdFNbY96|klp +z#(d_HwPYXd7FEz#R}u%F?KO8ZWPn-q#L)2 +z`DSqP0$IiS+TE5!aj8^Wdi(skm(Q>By`zH5uX0?Hb7r +zamfsDsSYYt@B5~QUyWivcwz-6ff!>gikrst*pESlfd*~0bV$QP^^ZRqz*PU3>i09> +zj8}i|$L?o-9hm@=yx!3i7(JJ~=Fy-?k0sCRnt4CDoxJ{ka?J!7tB!b;70UlkfvEyY +ziCXhR*9;XW^Y4*q0oT8g{kz)|1OvLAQk>j5WjBFTzueU|85!kc&h74+^J`^fdQ_Mi +z=HFze_-#&#KjgYxkZ-qSE=oo*`)W(3oXZ9tK=!hl1EJ0!s5```-tcm68d<^3?}ywr +z+U4Fc2YGtjZn_sAWXUerxYuXn0f+Vb9X9Sw84K#_eLgGqIh1{uGMh0ARI|KC;r@U* +z-+9cIl}r$`D-AIdcWLy}H`U4?{j0(}SGvz-?O~UVhha7zzALvfDyzr +zUhZ4CQSGu|X{l^%K^2HmpkDyfVqHj!^-}30USA?LMq`1M2pQXgZ}O?`+(1C$76{bF@9e}r=20qcSN+>;nVUnhgRD{nr#!% +zK;zBu+LDkL=alo#5|7SXq048`c74PcvWmxOdLQ@yfJ;~5c6XQt@9Af)HgkgUZ%t!BYf!{AOq#6;f& +z`dcZ#G7BCb;c$09m-_u}4&=@u0gsK;b_{eb4#+797`z1DD+?J?<}!38be;`Qjnr7C +zkJOhob0gZ$4|!)c+&S3gx;$CDpiTkEQg;0SxS_z~(f0#m32QwqqSchZ*tTxZE$5N` +z@Ztn`VG=wu0iJw6;FU2hou>JWS`?96BCrX#I@jg$JmqX6qrlYd1AonRd3z%CEQP_V +z;4O`F_p9K7JuL{GlnFFF6}ZQ4zT||QkR5P#&xi|pzBBC@&UXLh4M>?u$LLkJ$jfz$J`N0x#G%&r(t5hDJ$|>SC0a +z!q6x(Qe~3+0+^d*Et_q}E&r-F-E%Ni$wql833ypW{66TBF35xmR{s5?8NUXe~{@-MQCRRT`eiAn|=Cz<}>hfpCLPa +zhJ6__BFVjIpz_O*kG~8|=4J9feWnRq{^e8nwa=Vyedh1>S@c~H!%Ki|84Fo{0M;Ia +ztp^=GKUl#RM|?IMiTLk{1$wV3r_GWSO_oNe^Z%X2&~Tx^#pCr-msjVzygb+E#km20 +zOTcB8#}hL>9-ZMC)#bsdKKD)bxJ%&jsmmP`TyC3S!9@Z6n?CTVJ62mR0d?LFV#UQm +z%T>b^&iA=|Xuzd|JuayX=nGt2E=(H53M{z%p^sHtGT}vPivgEjKIi87oRjNucCKTN +zGA%k*X_4Au!6i{zlIr8MMJ!QWs%2aL18}LdhIMwTKucz3CG&QYT}j?V3j$8=6#QVO +zrRtkt`^GmD9Q1tV8+nD!jg9Qz>K&ambCvn +z0Hg1Jbqkq5r3$RXFjD2Q9|D)^kGHS-@1nnd0x_9jmsrD3>{x-uF{Q|yqGJX!Z9e8# +zT|Lg~=5bbc*X+qydzs5QS+<7xx7iNA&vDF_j4Wms<-7c)R|S{%Im{J(Q(V?B;PL?> +zR}BidZm?^tWw#DJ!cD^*ZXE-6ydQGUn1Fjnd`qLrUs6^9EB3>heX#xzrT}Ek{(u#G +zQ+6-Lj9$8w?2Wf#zH=%1&Slnj4l{Qd^uKK{nDO3XjYnet7FB?o=h9dy}n +z&^7hS6TV0pi0QlDHF=m`>l_0zQetE$%UbQwLxY#AJ-VzG#JF^bgZ&A_NQn`^v|8!Y +zV!2E6We&z3rMlqdo>`t3WXSR*RYpgxVp3v~n&mXaDA4cn=JFIR*L$?xBQ?Yg}nrjZ)U%yx|3kI@E<8pzBJ*h=4gUh}m9tv0E3ETYj$ +zl?u4Lw%DcN3TqwfxFe*~PLFnN&(`r*li>*FQrLb&+4jT?J>??=GUc@ptVx9v- +z|K-v3bBDG&BU63AT|lD!yX`MR(FVICUd@Y*NPtQfN+^VZ~uM~ArF)i*Rj_S*;f)F15g{3pniH7( +zP1jO*cvQ&cIUd*cinu`vPo7KNo{mwF-kbt`mO#H{nASD@LgAM^;jC<*GX*fQ5_3v! +zNODZTKOfG>g+Fw6xT$YQ!-??9IJl*Mz%RSI)R5|u6L4a-tY?vdm=gssIcZCoQDxLx +z)-y5|GkuP1Vge3rxt!87bQH1m{QeiS7M!6WNF{Z&R%jaitqnW_vCjy!7F8`(9()^eLlPEHRm=n4yiMB&AiyEP?$EqqYm&WzUKL#+`cu_#Vx&kA3G2#6m02rgbOtJuz +z2`>r2WWtN7Nv;H#kXvU8UJ~_1LzJP-zDR9}A;wtBVr!Yn!xUP8F;+6|#1ujOxp2=s +zc%W1#|Y~KX-jrtPr$OwpJOS@)f#8t*R7GbPns!jek0Fzk9eh6MJ +z{WLIxmsJ7AhWD?X6d-spfqg;C^eDECVFoKJ!~3&B6Wq5uI(7u~&O*?U@^Y8zr=`Bk +zORFz}mq$wjo-B=MPzukMhUS>uid1sOTdeYp@{+)dhAM651+q6q +zacEzSV+!qu4E-Wt_!mASciNH4WanjKJWy$DV{zMmJ3MkzzcnK-nW8p9}AIt;#~02wWEVG*tVI{MQTM<u>>&Gs)e5fs#1YA7ojB=?x(npHRwZmPLak*+( +zz!mR>CgXC+5TA<&XAV$0{Hec&CvDC}s*B)7;d~R&&&ar#P<~#(xp@KS95vhGq^)6D +z4rl0Ohnc(pM1i(~zgC4(W|1oe$p38)=%n*M9D*~7V3X*H`T=E+K$@Rw+ +znB?_;=z4s+#Kz^O+sE2kV3CE)oc{s9=-(z$Y$`u5`TY2rJYVA|5M%!S)wX6%ND2lz +zrZ6BA4`pf?^Yl(GXLj*9vx}}SXLPBs!jUb3vZVg?T=I$q%`> +zx5vc=3- +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 +zcBHoaaMJ( +z`;_PG$Qm;kn5|sM^fU9GttmedtfGc6X>Lh~)+fwy@;X_*`un*<_HssXv;#xZ4I}6@ +z4%**8u-WmUGo=h_JvAB3oa(T>xuoY_c(%X3CzY9mKjl7TE9O3)}2iJe#b7rnqesM`Wb- +zX~#7K9uPht)VWnOQE0ALd)+G +zLNF7j|NY&vaTmHYG=PL*p{Ozu8qRxC7&_lJc@VclW&gD9UBZs&R) +z09RA2rm@jY?<|Wr>Z}x<71~Xo-}X>9GV(ShP0J`u)(Ie~2ak2OZUlY^b~&?f14=Vc +zyH5U?KpO$d+tMN)0>2{gaa&t2!*MMzb<}V`f`8UnTa#!_Ft{G*+$A?dwk*LK3Dw3rF{o(u +zf(t3sa|8G;=m)!3Ix(I3?ZJwdw4))Mq_MjkIR>vU9E*1DYZZ5^#NqWz<{En%zRJb5Vvn!oXLd_KlfJc!MTv>o5; +zhq%gJPJECBNu^A%Qdp`b6u#|-50u6>tH~-RXcvLPeR)vAx}mNWkf}T;OZ#Vj;4DU- +z`gNnaDS5cMRXr+k2**v|}?mc|S*lD=_1|pZUK)$~sf({#R)HNHp-H29Cxc|0FoCxDm4K)j~5Yo9>*u=>2`Rna`x8JKN(@Gy{ +z-HLdtIKJ(sogo5sWyP-DoTwS5sDsVrxF>>KKdIOccheHfJU2>+(L|QKQxZ9;i&6T{YG+Q}$jBKtYvtqH>#wN;rDWpe@V9HEIi&*hD1SvtI{EVei{8#Rc?$hpR +zyx?|CI#sQUUtMxfoqs3R5@A=34gg^ObY6ug&PCbLTu8S>hPGPGM<4YYW+dDvXiBwt +z#gT2@HnX43LO?MhGt&tj^VY=+a?+XO&wcwZ2mrc(53YAL`OIpG(rypTcFaF!xT<1P +zBBe%ewK&@n{vl@{mIhyH(wMF6wW6fcX$@jMfu9~p{L=3)8H0oz&t)uu{6m=!>2)AC +zjsdOoESMI^P>yveF#_=XBJLd4H1ZYpmX9|v9&Z1guDjjY5=JB654UUItWiQARiN98 +zA7ms})0PmbPPpBpw>D;}`d2Y!X(^O+U&VQ=XS|!J$pcA6#~+fw;B_0SNHeCkxygr) +z6NiGui_-i*Q4e!0y8pI09Bj2?GkokAANicT*hSsi%iPezUu`+1mcsK=GduizbfOpy +z>_IQDMH!rmYxc%}-NoUZa{OD~V7r%zb0Bm|FU&Wug8igXeI|i=XC_6)`(Ygm=4JW` +z4?nZ+2Np)BDE}o=?8Y^&|Cmv!ag+|+uc3DOWk+9jtR1NMn}$ma7KM_jyk800x+yLv +z#1SoHEIE;}^rv8am#of4bo0n{J!UjMW=Q$TRQ4PZ?Y9~xQTFy*2riRtP4o5YnAQzf +zG68GSf&ke5G!r|Vazj#9XnhsDE@HmWs+7bQzz36ne@9wM5Cc`+S3@DhJ6lW*~ +z9q+E*o{v0t`9@@e@$BYs8pp2*Q8Ejn`uvNYxUF_6Dh*dsV^=|AxBTu+RGw$dv`sZ@ +z8`>R37(s$(L+{zf5014o2Z!|KYAyG%$p<$+3D8U-(romxJIQApU(??J7?M+ImDp=D +zVPHj?=0al*&bRo)*e+~*-jf&CB9*MXhd{(^yR2oD!xe4}?o{xp`s6*M>Job4L1hKK +zw2Jy@PJ7txlA~MsPxQpr4r_M=QaLme7HR{_xk@1hFwaZU5S{M7+Ke)DOY7?a-CIT+ +zqn3+b;P1e`SqkByjTu;yDLtxcd*@1D;-MS`R +z74QJZix}VT5>9ya+*$j<(LCCcRMS=9QDE=t^>-3M*8CpaDn-ro7uRfp*`mdL6(SkA +zHzB4sp}8tTrMW^cHG#&{pkV+wG5Ehy_2!uW`U1h&z}^IFGuga1lH1_AbSs$j~+PeZr21+3{$up@AEgaOIvC}`=bOR0mD2skXhNTV7>ts2#t+jLN +zUjaCv!8Rc3(f~b=cB-N_8!@v=)5>=2=VWz^shOV +zc`P7+zf{vq*2#s9%4oZ;Ax?X_|4q9o-Glq$ +zZekxxtARw6)XKEf$0u>L;~}79vr}+Li)sDG!rsqbKBIk7O7%~cr*bn?P8-EOJOl6m +zc!2SZG3+PPFaNq&ZX!ZN+AeQmKwT|90=IFYgQ9nxoC5=>I~p=qSJjYM?sOYOv=t@6?B4?;-&?!Wbx$A(S&M(zQD11`|( +zLL~}O?e84Sd+jH42CO&r_DSdqW}yTtB+P{(*7YEL +zmf*qPxII@qFvul{eiaYHP0Z;=G5LbDT$<-badmgv%FiricRBMY5*iAHIT2Mlv%D5h +zZVZ>(>rj>NR9mnvh0oh@8|wbd +zly_MJRht4e<1C$A4NASV>A-1&@Ot)33iXj`cFq?C&`nqc**aPpcj4~;TrOQci5qKU +z@ne2I#j~r!5>sAveLryTP-&Z43-hSDCwC$4*>7M0Jrf_c$xW(e2+n&qjuL`@Ja?nA +zCt|9$7vmWj#v7J_*}89kRzr#KCB^nIua?pDky71Jq!@GE5Qy5vUy)o-4T3nDDUbA$ +zM~U8sEtwNKTG!`K1U(XbLtEMK2~i5)8oU96<4o52b073A;qI~za!UsP`v1i#;ADZK +zEhTk1eXHhn&-o!3&f^!Y9xqn}^jxMtEuxZw1O96l5Eam=C&CwS+QWJXDB6AE>cxMZ +z*9-V(tCn?Z^9z6LPwzQd5f3gU+<@ORy8lcy?fpn)gPN;d$>ul)riFm8jkkm_o(B1c +zmf{TJo^*a?H*;UIJxhl|XMxcffng1S!&r4|Y8$0iQ#97?qbD6DxB&myeXhMhAd38h +znqDX3Sr3kzy_0veW#SMxE+y>wF2;-=q;6hR2e!}HX`O$gz>LOxnm7f`jfmz_z2pyO +zM1O-qWdW#G)Lu@$o;RJONEW3XAl%9r!8DVFm*=wI^EP*IQJGYbQMTL|5%R895TF8? +zBPM_NZ3_G)DKsDVj^0}8TNzW?S|c~0MYL8zRruQ9R02o&xY|X&@XkL;?aia5VYX}G +z+&Yv4DO8|AS_7Z^!bsXhzN_ORvWQF)&`X*DTN}NLeF==aT^OK(P7x^YpC-7IgeW!?dmDF+vI(y$k&)42h63wd>{Ex`~2TKRa6npyo>MYo<&d*KHR*#7Z6M +zi2)CsLfio9?Tp|*{4gzaW0BxfNKXZ1T4)9p`%W`?op%JRTPOv_z*USND9$JQU^Fsra;mvTij4F89*O&EDWJ +zQ&G0ONc2}l1KXl9ZTfyktp>tFJu;#@2xHMx%SK( +zl5RuYmt%@I&K1^`85fAE5^oM)oej|TV(?>}WHO3Ue3NRAsRuwy$$Lt;}FzN&Dcoz5g9QwRg^iJ{pR#XT9rys=M0p>jwn$R--6aw5<|cZU8UoKcs;e~TNmM}Ic3iZ$#Nd(m%Mm?)xhk;*KpS-Q%sAaarq~z9Ov_N^d=`_tP;6IbN`xewI`UNcSX%4nw&mG9GGW#W+k9&c$;H?zm{z +z$ki{7{HP*RGN=YC1FdV<-+8}Nm&+=^>&u*>H>ZGZdhn|)q>+I%lL>)w(mOa +zh%SBDfE%mr&{!eAB1O)5AwP{4c8Izg+Ljh21}}g=Azn!=AvxYuh9e70uPT~*yHH}p +z?ZuPV+ZRf!F4U&f>BRfZOqe}2El1Q`$Y)N +z71#M+L#CUKxJGWq4rPFt^A!v)@#hD?)!B{v=(++JmQUfvh=MP +z{}G)L5t?!C1L}OoUyrFlZb#4H{dJy=^JjI+twHj3^gjA6art&L`j^Z9T747|qakF% +zHV*XERI?o8sV>9NdFkMAY%B>OqjcY0@=F=1w8DS=Y-bCo7KgVu@`=-YmH1u~n#h@8k&aAoX+mU8&sJ#on3ee!nQN8zm&%aujLl+FjvN)vR;6 +zPUV7?34Ai0ff1C86M4JBHn*tGhDh5anRjS4`nf8ivfQS~_KL#4Cxdfn@bxYE86}X)JB2i6;c;F!u=hjCSC(!LMJR35)YCRe&t; +zRW#*8XdK598>4=qh{& +z6quyR{On4N)u%r|i%5&y!8NNv(xMDN*l9G(hYQgp?JFSNryEo1fvP*#J%6VQpdgyH +z-MdSx{6#2&hf=3|IjK;56mGM&XTzBwV! +zYo<}b%K!*X;!0FqO!^;Xe9)`b=iw?%vNRNCT7IL*Y%#T&wel0oMr3-vs9LZK +z9M!{!V9BHHh9U9n{%d2eQ0)weZ|uZky>va*a7v~K?!`6Pwt4)EH~N|rgrZQe%q(wr +zLT9Np)7!C43@d#!s~}UPn$_*LQZZG4YCOSLP*U%GBc_8W2ij>%XX3#%EE&RfTY2ik +zG`@r3Z;u)5_hi#Vh$|q=Z9&>|^|pzC3NgD5iagh(u0Q!<0fDogez)FIPy0ckG1qU` +zM6$H|K9f+YdM>n2id8?=OUJjJ-LsBts4=SJ=gi)YoYXj~Pp}WJuNZDe%rGrisbKQt +zVp&h`jM*_3{9NJd6;7$6VMTsFaJ~MA7Mx-~YbBdC{N|8vh98oYNqqkFnRr#o0 +zLg`~dV-z$Gvosv~_X%Si4tf%x9k{lHPRPJmVnV1O@mwk_q60 +z2G2I1+GpB-N>|QVSRaKtYnG@K(0(x6U8&*C@Q7jtxxFWj&AqvTmw6$2I|5$+d-jl~ +z>VaLBR&nqgGi=qrr%xrEd+<;kxbCiK^|54WiM|HQmms&H;Zo<`MqDBgmHi|)SW~}w +zfDhs)v-UQ9e5BQ4<;5U7zMi*;nX^8k>LM<^7@fcCay0$PI19cL+0-w?U!Unko094~ +zBB9rNI>h<19u*(Sp_ATMG1YdLHEd_^fRR~OQ=m-JhhMxOm +z3}y;!32|cZepV&)DGI{krg#@SJK@0HI2=q-ioKFVvPX`=8@U|D;Y?Qqclyz<`Pvb? +zWVJmmc5hj}-tYdtosYx-_?38%v&bGf$>>7Quruu%WAT@RvH>7p+afOLMSKnC({w|k +zjS4O@&KKcGFnJ8%=Phr>@my|1yoikAx4_ouQT9}8)*DP3>=mHTv(2g|91s|4&VRa` +zDk{;xTq-^LBQT;i8gw1);taHMv;>GwS+gQDtkvb*1QD_z6hoE8`UvtEEf^TsLs^~f +z7qRv;OiSznld&mKlr?}--DHdkpo-%FVR2K2eY@|qwiY%^T1+Q_iZaVEUJqM{CZ3ww +zr?1MxhKJJ}s68;i^#_|9#X<;?9Ts$+DG5)G_U`}`fnhY=esC0}*I(o`!VU!RT<9gC +z&P6@%7ph;@!)`-*PKJNTKFOi&rZQs$^2=wUbzz_$d@!t1wbK%>b*mmU_93MTVI&rD +z(8r6zM`X0p3g=+nbbAMFysPshB?25h+kg-3Mc1L|fw1krb6 +zu$COV7O?*pHxg|Hc7)vS;!=>)5VB7MJ0D1`eJZ?4T|_~~|MR|>Rn>8`X2fY6xpAP0#Q +zga3+0JJZgdHsfd#(fZhdx=|N=!0iioRjUOxhSGOXLZ-CsB9x+S4|ftO0Fhz{vM)O)rjPMe-=&(w5+)fb>?N +zv{5zkD3|>l+uMYR}7nm;b5EaP;H*Gi2{J~9_P`n-3hrTdC=&=(TUS +zh=+DlC^RZGRfM9b7oJx;j-29P)#25QI@0~zDl#j#A(ups!>jspw(;8w#7r3Zi=BCq +z$+0jDa&?o0_a!{g_@QOXPw|-+IP8P9Y|?6-=pR?Wx-6b1VoRzdaJ%G84ZCc6EkY1a +zILVHnm`(==r+~bYCx|UUIQ+C6YKZ;PV +zHHP^fbB_2OHZ`2a#|j?32+RrjiA5|ab9^^*CAV1#Mg8-oQ`zo&3^hx8ogi#=In(+z$-jDID5PCODnqBc& +zyKspV`tw2Y2s>88+m7+7&oTU{TD$$(eES6YRPfue?j1h;ga +zLq3xnT1jhy^RoZl(cIM&Akm!U4AcxPmma%BDu!`0d&qA5wzR-ByTDi*BrYVRShn9q +zlXtYtZVtz`SjvAO?f*WU{H-jA;- +zaGc61wijmIs&S)t!tiQujd8-CQUb&`M#GOW&6m>$BOXoY +z>AobSvMG_{`0iTdDP)YC(9;Sx*DYh)Iy1a-U4Gd+D)Zrl-u3IPrGQ&!NiU#Rx}-Z` +zkuiv&+Q%zw=6(3XC4cWUWMi@p<<4}ePw5^=23crl{Xw1`xM$YF{qr^}o)~qD!&mq| +zUG5V66&NqQr*$IDt_)kC_1Stqm*JrnBsa}9*!MQW(vYRZu34dwYcU{r-4ekJ@izeX +z`^O4f4w{N!3JBUqtR{&H8!H1qKGcK#xIL|vn&z0OUI13ig`pX}BBFVjNHE&_$c1>Q +zV#wk=fI*YWKp}( +zr*m8~uD(yA*j%{Kfx28FJume&X`3Da4u^-a!|$kSHRq}RW*92$aYOFwz3Nl|e=~E4 +zxGO55kv~1vau$WjWIc5bb{K&Wv54Ni(hzrz%QSiWL{*QAFQMOVRRb;t{-^(SuG+la +za(5>UqO3)3VP?9;tE-5ng4HYy?cWV!j^?r@xRdf3=m)TJPK)g#dYj^md1t>yI?yLp +zzU6jJ=)TugB}QG)40CCjP +zf_LTmUSpY9j7DvdAP);Xw3zuC;Qn=Jml9AfRg%-o019s(~67X~*5^C>~^)wR@ +zmTv>ibK^#P9MxXF=R+;SO*c4g*gAYxA!j(A3x?Fwz)ufN)2xQn6DR(NUPNtCoA(7i +zV8)^0rUbwA%2wx`tcl;lfVNwvxjIAgu$7;R>8liW&WT?!Q~6!<{(YGdVZ|HSsuY-# +zxY4R{Vn|%2P&e(7y16s3nxP0z^%8cN7P(Q6cfZAHM9plDo=KfafbwjtVE1%tqI-%cgiWhAj|HMh4vh0bb +zyL8-FDA}}AN>L7LeTFFwj)Zx|Il1$3ToV&hp4kB@AosOTpvwTiyw3}7i@*V9H^=UU +zNB&~!#ZshuZd(b?3Zo});ZMvJ0nzQS2)w!|V{x91gSudwgWDivEV +zW9)Dp4=PGCnL9q&{YA#10U=M9u<>!0qFj2dt&(RTNyQSjncc=+QzQi&g;Y=#o=uF^9Bi*sF@!W=GJo6%%HugId4rwQ&J4kl6#zq +zYbfG?Lz3-YI%F}ipz~S36)uvp@xmQByw*^2)j3c)DDD%Pe%F0#6n96cYvVtRpG#YK +z&k=hrZvM+$&xnY#p!w%@aRwodj1Vo}!l#P3JqKk*lmU;(o;>;28Qs~_Z-|80AKb3f +zJ2KTJ`Xcjiyr+h0g^(L58&8p6`t0;JE%>$*H3<#kS$R343HxP5f#G=69%TjQnBo97 +z8_%*v(9Bo`&xOH-l8$dhGG%b2fe-C1FHX?xd{Uaa8K&6^$-tM`RqZukF}iDVG+D5u +zjeg>7Zv3k)@NJVuMTM8;7`U9TcDP?nREa80>`x&%DNA?kJ^kTb`}TZM*y7`2g0x># +zSC|hydTxjqGJwU=T1~RilRsF<5c|K1LM(seZHZkYn_K6?5Go+2Dz?8jV5_8Vq=Glc +zj?H85W8Uwj_>Ayerl}wBc4(oo_U#puRf+F5>{u#3z3};*wYdIo1W6?I +z$ZEDgK~J?DFx4_31b%0b{|=^b3K$nijKG`jcw3~B|FM76MI#CYpi!s&=btM%;TO9w +zXwkTQz>F7esSQ@MYM8-Yc7!!0p+xpia>;rFYpbNf|4sRX7qrn1&N(&&2cj3;^cM7d +zYh~dP2v2EA{f^73U&K?9l6k;h&S4XD3R$ +zG}4lHc7@w36SCFLC;G;N(O-lj=N^-uj_z#auZWWkXT1)hOb`?p&7^wLFLl}K{wa$S +z=eLIjWt_`bw*L2-@Cnc6l2J!*J8C1Tg+iC0SnLEK%H(cKu0J$3jAtkGZt@G1us1ig +zrj>(#Ou7Wo&;KX+v+YokdH8rahmcUG7CFy-dUe5n0rv +z;pu|!&7n$Au!@NcH=!mRjh;nxaLf1uZ~hYo+Ug!#qE^O3Ef&$ +zf|4Cn(3AF*K0E?OGXst{9hkpn9CT$Ox6Xirj-iU@!%aA28>4IlL`Y# +zy(h6zg5D}PGeDudR7m=gHWT=2XJ<0`?62}Dgi{+6c&1gOZTjklca-K(;PdCWjZUHG +z_~##rjA+vZicdlxCu=@U=TnL$W4f#&;0Sk%K-Y^y~_dG^%>@M-9qz`mNULy +zYh&k(ZMSY&J4$@GZx(@uZ(3L#Di49inj7-MyRKsR6#MSM6RK?zxVqj_p(5Ds-N$E5 +zn)-Ij)jR|9O3vwgq%JZFrvB5Dw`Dzn0O-*YE{dv91}hMKAulw|dybch-rVsnE~2FH +zh$?&&wcDT2$TpH{bZ(_gmTL_R>LN^mgTK>?zi-OPW>h49Ez)t?#u+G0tFhUxln?n= +z1+PqaRc(*(@Q(fUPQ%x@`7*u{(wG*M72#**lWu*SA2%A#v1nxQt7M8}E)~mBqG~|8 +zYQbN`(#1Vfe +zLHV41A^E(vk7?sxmKV4Ty*tLl8xmm%G8O%3LVjszD +zyk2^%XyMU#6p;^Tg{WY@u@U{N2%yB_9@NDFU5x(-ZuAm`#@9|WzAypv^nQ)G&)Tj{ +ze9+5dL$(I3ofxn=%6{7FjPX0&uX(0}#-Gl=18c4PCoPRmA>C&K&CnS1q;D!>ThLigVH1JqFw0K7C}G}xZ@iBhppSlUXTHH$f$zNm~5lXpeQFm;fuTJ-7<2jz-<8C;)#RXt3 +zvH0#c8V;!7z&-iXb93C-GATQYIq5;m#+29#vo~y-guH!f*4jD5LYV&T>_x?msp)i7 +zu{v^6bYAvir+ozA66edm?bFPUDx-+cm=-;1yOTCumgb(j>32TKcAr`hY +zPfQ`7jO@U7b+rTM=2zyif$QE^|CA>^x)3V1_UUcMg!@;a1#&I}hBN_BaH_SnB5yBM +z7IvhRzBpqwqV!{M$>#`GCkMqoPq{mxzn$tR!e>%RD~%t2hh`# +zZOz)bU@+HnGNbX^OM-_&l#m%OuoxjNOI)K{As^3r2DTcFvG))2PR0J&vaj$LM2h2} +zlJL4eI5RMPD)jlH2Q8DT-g7V*3kw3jA}jgIChyajfm2P6IL!V1x)7yb?%SJHauEYU +zClAeJYpjjv`#8KFzeBqSrdC8qYm{$orDz-2n9-(nD$@75F}4Jy$G=a$`%iAE^Nusa +z%3&-X41R{XHOOGR1n}~CA~U6uSEN5=nh)Pv|EiYx)AHCOhRynr%aX|#nX4$CZpYt% +z2YUzR8))4tX%En7_esJ9+5`W@WW!d;LA08J^0|kD>;J +z>V5Si?-l{Tp+E^07wex*84-6E3_8IPC_e!-ep>cjNvdS@0UBlL&zW!J!D*PSC{mxf +zP0tCduQ>*Zsx?)=-(bM>`m&tB8!S|2370^%V5BY@vuB-3iLDz?wnhJ2C)N5Hmf=o( +zBZF{&+y1wgIJ`mW7G9>9CM$4PY9nO%Tb_vH)FnLdhiKH?&qWH|Y=0R6o&6b#LPXkV +zsw_r2OqUg7#2DZG+PfJ4ER&q;^@^^<+h6_=x^A@S729FL7Ii|V%Eb`Qjrdu{kDn*n +zlh~RDGi>IE9WumI*qsfEMp3_md9F^D($v!=56Pi!dUQQT26+1d%G(B1c>^qj1%Q*N +z79-E-ME@A*h +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 +zYn3e?Sw4r{&SS3{+X#^=B5v} +zCRx-Mb==Z#Mdzpey6IS1p=AGixQe2*bez$7LwzC&pI%=hu+-eI3D#PC-uEd%&)&(L +z8FZ^%c`({ZVHPTYYOGpmPng3>xm~zxU-*L^JA^NOu=l$lCR=K_IiRR;@Aj(#?LXwo +zy~TO8{!qv0zpJWypubE#3}K}(ogs%-JD}g3xJ{9w(26^qDIf-_AbzgA#%ENQpGuEh +zPag`MFGxba|Dt0hhe^9aE9`+MNTI*p=~Y2{k^vZl;eS;6zgEYkazo5|YTe`&ZX}j# +zlt3%a!>}BWYu7Z68<6f9f4WG**B<$VK4?@Yk=pjiI!@?iac +z^G_S1$7vND178IUUgE;^NKiZ{N|&0wf)rQ(ZX}-VJ8R|MF<>J; +zSoDv+nh2q7)uTH(X-=H>6nCpQ+HS%}epEXAgaV@UJ(;ol$#FXWmZ+0;%D0d*FX}C1 +zHecNIWG2`Rp|=@6 +zz5kdectQH-;7o5OMOaHDDyM7t{G0o%;3J(hcsC1a;!F#@=?RcpSHTi5D16a?kH +zq?)6Zoy{!_s?Fp#b5d!Ks0iSd=hIE({gSxUfmma3UxT +zLynzlr&}QqC=3jpz6K#`ziO;C0b9vTYph|5&B!94BxVBW`!fbi2jA`(fJ*5%1?`*w +zSpbWJQ3O7!{zLc=mQB5Rfd{%i-b`M2d9LYY4wlytI|&c~>OU%8kIEFTQBUVFhXg0_ +z?N9^VQ;+fPfTgmT#@X5 +zZUrq=69m7xvH;Me291<96|k)$>3mgbjj+wdz^_{C6YQSaDzV&PK_F#wwG>h08Y3+ZFAA%BL@ZZ>mvBac}xBmZy!yg#< +z$ZTi;di(i&m~ZO%TrbYksR!kBeRCo8i%WmSz;ZjZ0Y{53SjTi-m8ZkFD$hVw5xCb3 +z0;5At0_&-3?POtNZ=zXh!g3Nt&7 +z*C#?41S6(jcj}&QvpA?vW39u=k-jMW!|*p)tB7()Nzs=33lHP$d=3xdc)sX(d>2{n +zpR3gu4*iRV)PV`V7HvGqWg9V;!5+QvU#W*yGm>l>H*(__1O@xY+ij8{8f5#8Slc;%?cC1s +z=&jVY#V=jO0?wn^a!Yg42za<{Fk|9<8oO)956~Pitc?52GSg*O{=^-Pd-f=%UwQK- +zKENGC8XN=M$hXWMC%02SJ)ngp1=lQQ*?v^ccoBM2sNhON&?>5bJY}nu<)7I6Zo)1j +zf5=)Zp^$Ah3pax1zgWJAy&ykFbwCU&UCkKCoYePKDH@7SG>DGvp!ocP-jV89khaFc +zWFx{CdOF*mc|HvtW36Pt8%>D#ScKBE5fAN8{v~MYx}Z9TX18?Y&f6ul;X)zy5ba2%F?*q=uY;GTePb +zwM0;2Ob*{55n`c_Ed{!7K`6QwquhST)HF`4o;h?LffWlIYBC;VA_NVK1bzQ?O9v~d +zk0;}Byx|htx5-EKCy}DvAkQ=V%hLqJ_+nkzNJ7O>ll6&eB(oOWpKUF(UH9I>enUl1 +z`+!F+3 +zR9hlf9_$g)kS^>$dA!-c!!|V>PS_sXD{cGT!Qy)>HON(q$QDiRFtFsJ|yaho)kefE9< +z%yRVtn1icQ*$CFrzPc!BeB~n%Q=fhXT(4;yJ$dL=zvqTUD>5Hw51b3SDj8~jq8uig?STxyLo*FH?^N9Mfq)T=~$(P0!RZ`Nm=_NYg@sa`^iUk7CWyr>rO-jYuH39 +zAYn0ulaYR=pC*I{UkW=;T@srG&3c-kGOet%s^0-QS{N +zUC&>AB+q#yZA4jJ#a=FbaLm@i$L{;Cn<|ZPkB4N&*rcaES^Y#q*F}ij=uE9p&o`Y# +zL=KDrSvZEodSx2Et-7Mz5hs^E6nv>pV43+9^U0pYXv8@nx=O5M{kABralTpc3R;tr +zy|kAqtLw7U@WXqSe&fCO2o}BJd{FeMsnfFwR%*iRTZ@gYQQ-H2neD>epx8ubt++3|6>$*DSK9Kik@9+K#Op%NHFdb-k4t8UE +zDpjT|7?#!CVN=&36qYK=#vLZYtHAWM=RB=6;+_CcN +z+5R)k?q3lDq`BjVe&WmDutd`un}hx@O&jH0liH8wqkIQk36ZiMy(T89QxU}qzZmZ1^3wv48rh=`TX +ze=2(L^e$9<|5;I1O)|XpFeiwp01eni83xUH3_j&nZ< +zK~foz1t=!cZQrqRAH@$_HA*@tS=l^CO1TdF`&Lej@aedic}CH+`NE~=g&^hrbm4X~ +zMH?}jv&t3*JHRzO-dW&KAl!fi*JMQFw=G|*6!9X$0V+|n{|n)JD#%P@+FYfPl2auR +zYnS-UtAs#6+rx0mv4Ld5{BaGBa!WYnXuSSYdN~AH!sb`cKtW_K*{~!jlrg!6JYv&7 +zioSYL$6@J;q-wwYWGeHP3ro@!#JYH1*Szddj$j+ILWyj3Fvtj1 +z%gL2Svu^wVJzLi1Agj_!{{(zwfLmpxz4vWHnTRY5(~ww29VOT_``r#P$}9Jz-Ksr} +z?O7`yn~rXe5bq(3A#yM1Gk}AQfEm5JPRk6J(AXh1BriV!0K+ggT#Pdc{n@r+LP7r! +zR_>4)N=Jq9-@N!t`dS(`5C-{7YWT>S31x%_f;(;@B_|K#Y7&SnM|SN>v3t8RMtcAj +zSGgDUfw#J$>44KD-G=2(Ho8&+5XOEwGvvfH;~((+%>D2DX;0xx?Gzm|(&oQE;T81> +zTupF1>&h(~(XONG1fW +zt3TMQ&vQeDz_TP>Vs&n`Dqp!_?LBb#G0qGRKK^#cd2w?0n^H3NOPLZ-r}obw9GcrU*?cp!sNG&= +z7%EsqUzmcgGjoN*WoZY$+9&<;8WOO`$Oc|CzpLM*jULU)I|CF&y(7fFYu@tb=$lZf +z;lpN5RDRj#3{5}9rU!_4yw=$YaMs5r0-OoZ!`@g(fb=zWE2H~yMGMKtFwkiP<{}8q1a+^>+htT#F?Nd_i;V*uk +z=__C8BbGEpZ=F2XC*e1JW!%!=TVvI}TMcradd`C=geBGd2jZa0ClmybAVpKFyTrqP +z6j#2z66eG1U}Q{i+sE$dK-+pVrrLfH8h5RW#IkpB3*rSj(kntkZ70DjZMyA9r*1iG%8NDm+mBuFfz{?3Cu| +zb!n$AjT1Uv@WFX#=PQE-ef13Z+{G1b9^1pkUp^rRvk@-0T+FROy2c_ehW73Pc?&9k +z;I#f*%*GfW4otHF{x`B4%2#R3c1g0x$bDYPy$TSy$$4&+ls7x%=V~X{s=M-De1}Eu +zMD<=3=-`oW!Q|G~m2dNAyxC<(9_O4kB6SmGVQn{ov}<3TPx5ZTV_S^4}AX)O_8+G>Pq#OVvvA4GmwnTY|S| +zn@+sJ1Hl&FS})X=E?g9W>O%(fF?YNQ{ +z>!C(WS0)=abKyjYcTAu&#HU-ZO+2BdP=)orV;3gnXE~?+>bFE4LJr6dQ#}2t8v2J4 +zSh__iz=dMFmRe!P2`Ys79Hh@*yp4bt1&6$t$I)jEYrguGBncX=0RZ9vw0m82NslI$aIqs8%l7jme1F>S}#leXf&NU@UyvnW8^{6Q-9GowoR;scORbxwKiP>$sa+yWpp*^OhISB_ +zH=-YG(2-XmM<-1>N%N`xUP7dEq!pWtA+jPPJi<5`iG&0JQUMMxy4@n^%n^81+MlP3 +zel7JGhvazu3SJ0u(p=;1{loTftTg6cG&i7tAZm(v_P*L~nOJFxZ}&tD=X#!ifo0;y +zhOL7F?{HZPsj!oUJwq#qG9=x`vB01T+dV0Q;|3q-v%`2|Yg%)pP?rfq|M0KI-(z>M +z5{EL9bb1$EKsAfdG!$s^Q3F|3)7U^j2L{ViE$d?Z_@#w8BLtchpYr9qbdIYW9 +z|DqRAxkonr?-M_iyw_c=zVIbEG{>gN{xMYg5rZ8g19_C=GHS^4rJHN#r2*0_ka0&X +zgEEL$Wo?j{^enI^Xxp;_sEK?vjRzIlO@(agcBq#B1z=3TaRC4Ssqh&#BqiA;`z=FcWK7Mc*YETKKu`Ffl +z4Zj*T{(SQZ{=f@3D`xOIV@&#jP7$RkPyK$o+nK?RJMS1^I&sL6S*+eNp^zWrxUrFN +z+r|@Gp@lanB}3;G^KbpX_!$oiWZrPbd9+Ah>WM)K*id9N~wr{zW^wxF9FCQ$T;T)O}kN +z=%;p|jp8QSF|-h!rR|I(%to-Pc?>YYLo=+J07Qc|6n9oLW_hEyMxbF7U7Ijmx3Hht +z7j!cdd}=c-cfQPCg_6tW)o>?9Td!diHT!E~)c~@pG4<)ipX!?Uw%Wy`6Ye2rQ<0sR +z#cxBWS|Wm{0*C9Sb2R-nuG{Y%wz$=T8@Pr_ghB2J_a1Tdt@9!-Ze*xfMTd-_ev$ns +zkMC)x3US8X3ypg*PAZb=Kg?ratd4+ct#HVruVA8x~1gqDcR+3%epv!za}=>^&4Cf +zEt@->_CJ#QBEko;w)W|Y-s +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 +zTH;BN3#irLnpZ5yExbRmG +z8%Mtc8a>>(C`iBfePF8mdQ}Hl0rB+ZRm8qhosNESzj-^PA8f;LE-EAzT2jUjh-#0V +z1ZdCWpf{lXZ-!rr8;g5|om?)d{c>&Pw3^~@``$t?DPKU3Vbi4d!$1Hz`s8U)SR)kl;Otg`j;3a}X1 +z`p8yk$L^%=mgpM$N*NDBM+n;|^U5aS>cyx>*2!M}wAgV}{~K0B3%~aZ%rvFpqq1tj +z$Whem5rv}Gm^VJ|9onzIqbYxG)mQqgD9_TuLz4g-wIRuvI0oISK4e1i2bCXr}2H_g;umIR!W0%5@_ibqG%)LhlK!fe7NypD@ +z$|NnFO#7*(F8VxcY7!kAbAp{{@|t$+wKMnu6yDqw87v9siEQ#F1CTS5Nc=jRIh>w%VBcna16vI@ysnlQT<59zQy|W*Q`AM_% +z#(d21-6~`K{F`0|3O_*0+i2tTucyG_=MNy!^Cox+a9m@_pgKPKFN)BPm64I-Y-1#e +zO_83ZF%Hgo%D%A?DGin+jlMGXMSmoGy(lpyxt?Xr_OPe|BnX7m-dZfLe!l)h8-7-` +zmH#y7TQlc!ei;=lb6Cs>*I{8P;IWJy%D53Es-1*(?ZnYwYl=f{v3kQa%BarFRE@ue +ziibGP2>%$t;ylk-$G1J}8+c|ZxcqyX*k$433I~=XqIbh7EVbL-KY8&kont^esL4+A +zvq7Ix0Mit!R&_O%gqpuJOJl3Xw-@p)q^R!j!?c6-?j`saB8 +zTFsnDWuO;h90TjxDmVCyVK*D|iMy}y=b1FSZrx46Jshr9#r)aMNu=pFfKft +zKnNHOID76mUWG`@Y+%{%^UfH2^$mZ@$ZtIbS1IQuF*atYt`*R+dW9)XE9bO@sG(EW +zK*v&=my@6scP3aA +zgc1GC(wFz`_BIr+$#Z-kwb#W=qBQL{1%T}T2C;6rn{2eUZkhXn?fV3k}~WV?WjIDxaWCQRg6F{bUa0y(up(Lo-KOzI6$S=N0<%3ori> +zJo*Lk^Ud%uMhIoSia7lI?M9&O6sNf|X1j%&U_Xiu$zeM~zSTjdU_{-x53i5;b|&|> +z;v_3Yuu4m$Ri306U2DNK9<1D*7e~Ct7~vxR4=xy3zjD8TSR#+lJ{h+!S!v^P`0jlh8=x7 +zv**e3#x^#Eecu9{`D8f}aYJazGPa0*=4bl?l?&-}kUFXOGWCa6QG{pMEdsw)2A@Iu +zi~sR=Scg`(@h|ht^(yAgK2jrcT-wetyD?wsTib56i>0m<8&Y8+KkiNv)=uX&rNvCT +zF~~2>zlvSaPaQ~bwxKpFMuL0c@2B9JIi*|$L1a?1TFqmp#Yw9 +zYx>b3URKC}<1Qr)wkPkLyQ}iYFJ)Y$x2qQv=gD4cA0#~*3%pCHkrlsg?K`#{B(MNrC +z=>X^Tl#xuky#4_H>hGJEVe_JAK;IiiRbS_C^%AVf=IaVeU4~$TT?)<;{U +z=qKij%PWQ5{PSu&%Y**^F62>0A2K}v7k-g(FaEWDi2zLPS?`j9UbvcoEm0$NS5Pos!cGpeyPeu%S&U10T3ok02dQyA~&Fg2U7U_)yo`mpV?bMSTWmn$>w3-%4*W{3W~W^=$w>otl%v_O;> +z!0fB_D~=xk&uz$$u)&wQ=In&ROWU-k`|U}xOK9TOlX2M})v;$(sMqA?I|iJAeqTn= +z&5xim1tU1Z*zi_E8@3yO%?`L{JnDbOzF$%bU$QH);6Ey-g%NX*SbG2IYnPcKM5NHV +zHiuxs7mTsEb?olTu=E&HlQ$JlOErHvw%^82E#Qtg(t8;1Y8!iYBUc*jY`|~!-_9fQ +zUJk}I#QA5zEtQPZo3Ty@N}`&d>zLaLYM_)Y_;(TUsqo+o4t-O;c3yWtw7v8#45hoPQn3Fpv{MxZbcs!O7B=Tu%j-qbNo_CxAu)J+ +zS?93&h_i39SJn^Z3O=vYtSf-5lZQFQ!njy^U=CjoQWHNiNzPouv;0^0K5%dL>uE=z +z#YyX@z4iL`jvKd4GqRGRrUI>I2FpqpVHgoJ>educG2W7aBrh(oybM2N21csfTEC+X +z&GG(pR%{ul9DSQYY5L~1OL>%$DNA*!oV~ws_bPJCcz|jv*N_SPozq&~16{BNu=d^| +z!k^nnyz6l(jm@xl0$#C91B5I2$D(_d=%dezy4?Eq%Pblfu53A{ +ztRj^pLb|&Si^miGDw>h|NsOZ|9FGPlO2|OKn{3(%Hp?_&UDJuHsYy~i_j>C+b$6{G +z@}RXtwCJKUQO8b-adyjk|JQ%s^UPzeA5}LK08!AjTQz*U2zF1tOI5&aI=)WRH8}zL +zCdR($u9-lJ@|LBNX3TJLa;_kR5E)wj6!j7x +zX-?0=$a3oL3%p`=rb1lYFZ9vE+MoL(BIG2-PSBC1uJs3jA)M6qHCAKIuy0xH5E4s? +zPQ)YoeZ$m>s$&z^%R+Uz)pN;h%L?}1w(MQbd1Fc{D$Q5hsPArG9>9L==RU%Ua +zL*ck0#)w7t!1Rq0s9(U3d#0n$3Sn7dO`3J+;2>`0t8_d|JaO8yYUn~S4eH-iU%S8y +zEH57eh{x}G8`j-t5G*e(i$-Ke;mV6rYzzZ07@0zbgi4Q%Kl{!wz-^#7Bn8u9%$P?G +zV8uc}9g{yziJ4z&0vd!kHe#qnS^U{4{-8#F1K%_~pKU#^p(g^iQ)pJ?@;FG-Df +zrU+Q4uwm1gxn)opPV+8_=`p@HEX%4F5N=-g65~}Bn$Ujo!}GbhWTxjjd&vZ&wWfUf66`}(rL(# +zEr>74oI%d3*N+=WoM^5WhT1fO$ss%OnP}VTW}l)BOoljHh;g42ZmhzaXBf1zR-*;* +zdq9)R<_6>z{HP&Vr{A}6(lrn4Xjshcxu?KOFN$7j&G!A<^qm*h&BE*+5mT0 +z=UZgdC(o|>r$@)UKsw*fmA9(uk-taA^_Ad*5#8zDEuwg{_twJ~{ZzD|osK1!{Y-gK +z1C0v|8b(@=QAAXWivQWh`!1yq%-JKh<~SiBo}+p&?M%WEmd&NT!G9vcy5{XVWFYY) +zPoL?r5+QT{l7VK<`syKBfvol05-=bW-q(fBoNMCuP6O{*1Qz!|ePa=K +zop@UrEO=R;Mm&C-dCy?(=22-vBpqg~mqo4d+R +zW$NtmmFjs5z6)>F}DFB$9+J{Nz@%MW)-z^B6@ulqs-c>+_bBr4~e +zo^y&}v0yZjYot5>8a2b=Fu*k1XR9}F{2}|A9p7H1=~-zqdz@uDgep}(*}`C8%35iq +zIMITkrbNvBy^>>Q+y)z?x)1vlE#nmP1$8rj49EMV)WIJ$rQOJ8DeJZqb2~~#buz|i +z8;O$IJWj2Ul1iE0oZDnEd>KA5sjuvZMwx;=lvy!xxE*Ib=>Yy)>|fJPBW$p-m%k)u +zR9k-VVo`ChP*A;TYah6NmD1ErWPeA774eQZm)47IxQb{ws@Y@$mJ8A!UL*P+il<7- +z`c*xovvy9DVJo33PFTHg(#y=P^^47z_Wz^ltb?L_-|x>ZA&p44h@`N)bc4VfPzeR3 +zyBj2=V?haJDT!S|5RsCSrF-dEO1dPZ8|mive10?E8UAA!7{0x;)GmugFYQH> +zXgXOfj+ACM)Yyp}8aclI>0xI%k35m07dm`1kid}|ruuCoC;F_B!^nlg5v`0v)xbew +zSUKp3bl=i;*fg}+s^|E=F$B+QY$67R(0@^`lm~07Redog9BD><-ajx;m%f;s9z-vY +z>ac{y3^J<3Ii_>NKlzJW2L`^jPE}6zCC<@E#Niwqu}+Qew{Q_8m7v#ksx1^+@WkcaVSZI@{r@Kc^O?F_J +z$e=F2WCXbfNxT%L+$s=~#2mg%1a4s=8P9Q&8ig%3$uo(^po^o9@Bho_65K<=y9F|a +zg_?vo*JB+SV?L6{;KM+-lL|FX@yFJlwMGQ4VXcVT`KfXQGQVA#1Ro|?N^3YJcNUf7 +zXrFO)`_Rui0J8+n>=$xl(u`neVz)@vF~<{36~s^dJ-75HO>h_?q0uU1;*)%P#3yjhSTvi5~i;j1GUc^nJG+BTmB_cjp9?4{X9pKUA!9ZUm;$$2c +z+_VB_O%Fo5Uy=5{QLI-+A3r +z>+{|Vjg&8lZ_|xAz;}(cVf@+_-i$U3Epy!Ki3*2NCVrlTGQje#tTrcy@gx2-Z4(=s +zq^s}z>Zxnta`}uFCb(&DQR*vcS;s&5>%_1hV&vRV5se4wC5$xdpB3bAIpFnNQ`yC) +zg^TwC=$LvCmVakE8JeJ>vDg99G@-M=6O^Oih^}uc-nHh1jP1EOagRvYHVpmKL(d)p +zCO+>*NK>XGof?L-UInl<0^0XWG4s1doRx8;6tOyxqs*pS9Z@2NnLo^7E2pk26uNZ5 +z(J>A#B0vogsDBCjEvjW{!kSNxdD`9`0X=T|3$B2D$YO$1N`@*qjvU9qpcwEVdEY!Y|GI%uGLFjhw<;bi%g-eVoha# +z=r&%~K(0q+%+c~qjT2JW)7Rt{C;J)htUI+(pgKt*@NoH7HZ?KOs=HS%|L{(sqpBlv +zMl)ED-?I@Kpumma{jGmB{D=`g<29R*9S(8s_j6U=RC$)|%W_K@niA|%w#$PmaHa~{GdXV{TcJ)Fo)f*m +zVWTfKCcW#?X&30TQ=GGL&7&B7S9l)}3=knt$-R!OM%w-ppy~c|j}QEDgBHkSV8LxD +zTQID;_4VG|ETdN50n!){S)X)u4Ql@WwZ@*Bf=L&eHv5wQ>*>3ns^4228UcMYd>99D +z#Q&+?^U!8f@s{}PV7QPUOv{q(^>5JD2|6Z+n2YvUzBRH&R^#Ls@_#FQtA~zmw_4e= +z=?dQ!G49u66Av_nq +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 +z#t`rXvi?f~9bUJYg|o-e;W4) +zDF6tcx9hn09TKQ`eayB**ZCC3D>!a#r#>~5X&0!Zh$k|ezr+4YC$FPSO4b0gKCWFkrI{i>*ca$IQIWzc{OyD=;o-A+)3ZTdrq0 +zE(2sQ;SLPjF9ZFoUg!KeWU&5f9+@(nRvZ;opI?h*zit2x?$tT;4CnY)AYx4%Yki0A +z2JR&0q9*m7hsP0Mx)qRJ7SLZJp{zX7FL=%`LTJ1qr!c?2bDBDC8#!s~CH +zuT-CkZlvXDg8F@`x2<_Vuh6Fh`F4cu?RZ{PVRO6UJdfWh1V>8pkfDHvSKi=mHD{GkiDSux(QWb$-RaGjaCTZQ96^M}kON(~vxq{BoG!jhunk=c!bcrn;xVi*^`7 +z=pW$L$!4#bcG%)kYTb&W|2J|Gecc^#bJOuqH2#mI(2{)zt{WTeA+So7A0n%J{{|B~ +z0}?+umxeCBwP*#Dk@QY|x?CZO1< +zKSmlvS5?}dnT)OXd-pQYpeOSd8~fr47Hr!44)ZT=DG#j|g888Q<->21imOuGjpK6i +z3HzlypXru;FMV8XA@57KQs%gR&|MUcPPuOHr2uZr{E-A*Ezep}V)n0_kG4uLIi=%Y +zemXP;lJiwAk+^G8f)B9#53ovS`ah;OG&j#IZZ^Q=$&t)F)w|H@UEbKsIuQ%~mo(C9 +z&v^Ny_gpN&d9JojQY5?&B}fcjm42X7=sR19{F=@9IWyo89q4l@|^ +z+78^>c=$##S~6=IYgN!mXrsqgSt3C^CLeZ|M98!2baiZcp3i~lE?<7lVYBxR)@Zqm9Fy3 +zFscUU3TgpjD$cs+l#1S3_|25}3y-hiH)&i#pn>?S{CZL8ReQ-TQq0>49CiN}%S6qB +zfE(WNsj&`g#djGl5Xyfogw75)&XicEzT}Mj$H|@)pNBGkRQWHN6KZRqPc#;*VRt-~S(g1;VJ|CF1|!tO^eTw7nU +zAsGB5tPYnGK-u(i(`=(ofuFf9E9UM-msaPPlx9~Scta4I_1MP_fI1YwQH+g4oz3Av +zDEEYzEW>HO`WVMb_w{HSzAc}BRZ}5ADNxh-BDM%bFN2}>=Tvb*ydrGai)An*rqVQ! +z;}a*9vD(a;$FeF-HEWy5G@VQr*NE|wCie;UL5iG^Z?c3%>O}*A#%0j-Au1o+t`W~ +z>ww1bfP_*pejTa$PQ>BS(;c5TtW3=RE)o)^@*@$wAGV||jv(}j4cbOK78OJPoOB&en~ +zKsJHpXqCs$Ba<(Mqn2`|#EyzgAYY{_!+xs;?@A!b47*I$+``D_c~BT_-wmvN*F3s| +zZ`Ig{oWP6#?RP^tpT*?$K8}Dx7>9#Xr6ZBSc&2M6k_2rHIiT}WV(Wm~axf9MvN9jX +zFxPp&bF@;yw@!@5dP2O9k*8;Ex3f4Le!qMAg2}GirmouG-!6R)>0dJN)r~fP_2!$&B{KGK +z+{w>RYv2!2Q(bWpK1|!{Cgv)8==iknTmbm#pTO%wi`EvpW<$01&}ir#FdSA=J_Qfp +zBFbNFLCtH1Xw|C3NnHzhX-#f8oEx9*1J +z1eUOs&(k%YRlJO{%4hkM8SHZBVc^X?CC3FfGz)U5tKG+ZQIx=!z +z?CDbKJUqh-?8Zoc)UgXc0FsI0RQRrWenIC9dRtG4>ssswU*!3i&A+g%#prUHPjtCA +z^BnvYhO%17)bUgu7=UqDXZs%#P{Fu^3b4qo$@r&qD#AS +za1)xopawZ31<-*-GS4S}tq2;&7x40zSsA~iVN!eIyLh%DsEn>n$+8Q4$r;flDE+y4 +zulUznr)YNpsuvOyKV&@Ry^g#ZvrXk&BgJ3y40FU}c=Wi=*f{0rk_ErX!<{WDdheZm +zojKR?&%9vc_wU6|-|Xz`^?iO^Q4`v{LJapZ#~6h2+uaIcBRSZ2FAnS +zJ=-z>L-7@_xt@Sm(pXU5RuNQ&_})2rjLd5i%xr7>W71)6{dhN?cwYXg#pg_AdC&@N_Zbh8aqD`;9$}m)vKCyFF?p*gY2QVMQqE~C^ +zXwLpN2fB5?-tfPunXbsbu5SDxZdNrxCF%dTt!mzOL#XP$@!RdPFRF;0yiwn8i_XMl +zcjD3!vzxXwNqlwi9S*_gm2#ZcR=8`zxVBe85q_;ae{p%a13A!{#8gSwFFP@>N&ir& +zRQ*ZJ_g8o^243Me5D>#}YUEVrj+m~-9(nwyw|;U7_?RFQd_7IA0zX{C0IUw+jvl}o +zpz=QN#<;9$WF^1%{T~Z3)@!TgOIoV?Fv&hMLOtHyl>T2F$r01+e!?TFqqZ^;rMTrK +z+n@;BUM;1AW~V1W6vl&wy@>rrYrtq~LC!<<;rhIICV$L(I*sePkn@^KX|Y2vn7n6y +zc+o39XAY9tu{8Ley}V4csZMD9RP?Z22s@U<=O`$@+VKHq7HZB!7CcE$u%=21twJQH +z6ceiKeZ0#M*rQoDrydKbh~&-LlW~xo8UfCefiYGAWsxP-#Iwc^s5^)ejV)rhA%b +zdx8hO_(>`2T^^K@a~6Jyc?T*N*lGARdhEvO*KGfiLL2r?M|o7Qk=^B--)+-~9eI-s +zCF`KZKg>7k*YRi4FvdI=DVp@xH6q!}qX8=F8_Fa03@65U?O;DECkzW4{*7G|`2J^V +zq<&Ak+6q6kSld6`!y4IoOL%Af{Ihchk&COCKa%f)_0(~T1Pnu7jK;pSdy51@-_o2@;rK0C_~=B_tr~|QiB_%9x(0cZ +zIkpz5=WW4kOXXy+hEjFJu5CEfJY!eshVHBa@_?i8a&)2@Fh2-)rO4t#S#20!rfeDF +zLc-|_x^0r_6x4IGLWViD47^JL51}!%dix8_g8Q_1NhI(oS2*Cw{SsQwMRZ7Ubodvf +z^8b+t9Q6V5$Sfk*A~R@_+44^!SO*uDdLYeYNQNPN@spj)np2HBZFV`B0>)~F2k8Tj +zUGi!Br8aU8lC;cCg3%99Kn_MFLw~CuO*gJO7p`!}hkjXf%-|Q>0nd0B;PzwBPKA*X +zIZ%iDyD;4N-~(RYwJp)ef+?dc14q9g1{pLdtI?x>sP1P|^mi>F->iop`Gqut6Tw~^ +zG89lzS|R+|TarNis3uI^P0X$}5oW&9;IyxWv0f!u5Ylw8XKfbt`z{94t?-!-0h~ho +z>N#wo +zVB4P)y`^fk9z;wM-(lt2O3l3;V{4tp-a7wF78e$%$w2;9QwIe?>8Cm|%pA^tZ@@`H +z=yl5o$*qQ|zq>E{&F+gJz1V`asr3qcP;wh0y8QhO&PGOh*#?I*;lYA&TT<}O0+me` +zbvRN&cGhP1K~r|yU&^-L;0^ifKTE$>nT8?S&Olg+kzyEtX-a +zmdx{8xi1MGUk>7T&R>+{@%$i@@-8daGyD4~?*QdL36FV8M*^8zHC2y6JM68D3mq4RunuYBmdn@z_i9L%rQ8O*k8SL`7u;%S?{-|nfb)^`QACZDe>;6Go +zOpBn%nP_nCv_>P~->1JH#pcaiZ)`Qxgnz()_x-VAK*&dg_Dp#Rm`ZVgw+-RQaoqRC +ziQR$MN79<#T$dTD%Y;(P?|W?+i2VFG&f#?-4{QxbI>yqOy<|8nZw98rKL0_E?I2dz +z$v(Lv(1eTi5S8LK*C|HRcJ^dim+--7YE=0X(8r8J_EhgH+d8YH~ok1Exyv&i-NOuQs%SgWD6?ZtN}In`1pyX51aDl(>(pS(2p +z9K%r`tJNQJ(D0UyY`h8UQTY0tYk1>%OZ%Pffb4@>pTfsQN}ObiP$4GKzOUuqok#Ni +zHX!Ho!k>Z={*m7}Hj8G;iku~jZ$k_SABL*~k?FtoDDxD~qwzD{LYXYS*h0rP&Z4zj +zGpMs#gK47`VLxw4+4~d`AXKNBX3_#B)!)`4_m3I!2o$NhDg1J>muFE8XCPktuS%G| +zOFBMk${93J$BLdW;Sy>je_eRrOFa5_ +zxx-8%U4F&itlgD~g$P3~f0!Mm1^gD}8>l)i1EC!0EUeytlkXlOb>XO)K`Dvvwg0I1)*;{$aQkd*!$wtw7(PS!bz9Fn#tRxU +z)}1f}$!N`(U?E)5zwJ+N&ym)F9m0a+IijR=R +zQXjoe*~I{q$UvJG#w~Brj=$Gt0FY)gzs4XO!&eB2o#TI!@rfHbi!V0=V2Xq5v(k9m)<7ip_A~dWFGVE)prF(tz6d6RVGUxTBNI!tLp&OX0jm? +zZ7XSghub2~+<|sdL4ld>z~UNCSwdfIU`4OwXYi{m*kv-UoA4BMXCwS(@#;{Qn +z|J8Z_>^EfjkC>4m9dfRFx-qyUnXb5HdXTQiZ?A>eVn6-cAhMi*-kI%~AAt9g*iw&# +z{!}A-F%G!-5KK^DoUTPnsVmaolAIv7{e{LQAG|2!RwpB+$d!!>Gd_r+hZ|b%S>4x* +z%!j-zgkqQM(Fh_Fy-One?u`xX9()a|XLOAkY`_D)VMefEIk0rOpp$!DIwd};7bd9S +zS%f2vYc_WOc$dU478zZyViM!R?8{zJ>tJ4W{PmF +zZ?Zw=IJv{O)o=%Hl?eZ!nBjYuFK8=Jx1B{5U@77(tcmCCyr0g;j0>wd3i>1QFmF3z +zx`n3jxtx!4MZ>g=0e1cyqZydhaLqP(R+Ndv;gSt>*crXV?1uR)%bihaoTA1DWZPK#% +z;nQJAfCY|9M~V~M*qPb^>EcI0UH2l<^~4#F^>F(|WmvPz@T&RvbFn>j%x>kUvkDSc +zHHbfd>uv>K&q_=X2+`g(1s-5G^m`?HOmX{(SVDg*Nrz_RBL&+Yq~Me`-j`-+arNH@ +zl-bObX=6>-Bc!!`?b4PN9WPtiyY}hwr-qM)>(Q{iv`X-0#S-Vl@&g@HR>AEUY^b_A +z&On{SA|urX6VR__LIx#gZ}oi|ALIUo`<99;5GebIJ<0hueHmjVq&f +zzbh+1sUr|QT&O5cuAU$X?Ry3Gw;E25pM0c~rY&mgh3R~I99r2D=g29{7pvv5OI&|@ +z3eJ)OnlzJUL*o|6m%DhBLMbdBr4ihUv?Rj&OZs{)HugQ-b`77$SKIFL9!Y59sKzkI +z(e?Dgs=Ks>6{9QqBgg5-$o00pOgJg@S*X5=Dt>4{d+$#k +zni-UKzv~+wC1vlanxXFI82mY7&c;h;u5y0*m2Z}v!0>2^vRG}k)L`jBzL)-vcgXnt +zlk%aafkPI3!(j3=I;UI$a=NyhFYphxx;Dw1J7?-{-C#s@q+_KDj^RA +zSZXQ`&ECXECb3Hz)+qpei$7GXtAFxK@LH_qtHyR5H5>19?T>M3@YZ3T4Z59Aj2d(6`Z{4gFFAC}M1AaRO=Q=5g8Ut@o;U4)(0oLWU-B&zIkfA#{78#q#s>dX_!$Eq4cDKdnnZ@^K5qu^e)|_SJ%z_|RFG@+!GCG#I}Gm? +zFHsbl65jIbqoSr_<%JAI%s(H7redf0qlji8y!QOPo7Kw&G6dM|Q~kw*DB^5=h87j2GqH!!9Tfv>ehNy>t2WIlTP%YaU68yUG(?IU<%S|t#Z}*=hcC{7Iw+rw@ZzmCk_fKl +zJj<4^;urE+^_~R;nCUNes~$gFI`{hNXZOm2aVSJsV98gw=_437G;?P}1E-Sws`NuG +zU7$>ok!|>WXx4*0z9Q4lmd7C?YPaALPm)_)@Zm_SB7dKHsQ2O1bm0*^)d9CX41xi98r8K~#=qvi4F +zXL|Ru$aFyCgcC*3lpo8VaA^i?6IkZQI1Hg@6*$$`p)$LqigRluekc) +zQQTX;LifcuuO0~yLPsqO=*vctB9_+NLF$B13iW?}u!*ky7K1hAZS0~BKs5AYg087R +zq&Gc5ZE64oRSbJi4Lmm|C6cYPD*5L6`eBJ0>K{_1bh&pf$85!RzJF_B>JTFR0; +z32cqi4IE3;Xu|rsWza{(fGR^LnixThIFjgJ>%HTmd39)oW0z}>R=98M6URCJQQ~Fn +zLR0M;PTogYt0fz;Qi`+>pKBjWD!T*flVg^ +zaWmF|2CHNjkwIH79Wxnz$&ic<6AVah9B)ZxN6^V60oH664KoWLNEtqT{4FPI6xAi2 +zt+}RN`{gU-O<{+5?ErmKV`gdw%fifR&J8vryXUfXLQ@nYQ#&qtR#8AFB_lVyg8Vc{ +zR|J*MV%_-t7Rjdm(xrvxTBvQ|yu0UOzm9&9nPp{%t;cUDdV7P+#;9(p +z{+N!hN_en1qTQ*XCX?cZ|LQBUHT48%y32G;Nt>QJ#dW+1`eRQBS*|2_>m>GUTQSzZ +z)qWlmjgP9+lK%nUEa>ZRN9m!Ru95i2L$C7lYf}=K-WC!2dVqOSiStD3YYHY}@x@G^ +z;_r^b60r;AtEofwY3ZE!xN+-mJ?f^H-#BKTjPmrv3SdPg>BoBW^dP}XWmyX!a^DKAQbUm%+|6w`j`DHFer}e#HUulfP +zc+JNv*OjXYyHFm}MU|swE>#<1S0jY0uV8Xf= +ziGgtmyP8BQ9cSem21ce)arW!~a9YJM)7$pL`%@+pX0f^kp3j24FB|acsNY_h91s_S +z+sAs2`EIrsRUhUCGZjg1^vet-U)gYaN)n$HFvOT(TEgMY_;P_HKc{u+1#ylK4i56Q +zqL^FGLTEIklgGYUOZI(rf_$WJ&acH642V34Dvx-VTflDzY-y|a?82!*8idcLLW%9Z +zueX;nHka2rx3ae6^KBj;mz|S_YU~xrL3u&40keyZ{qVQBS(ND~h|wzjWV_&>b$PF8 +ze0voqq3yT0xiS(G{o;>sj{n4S$OwsrQ=_sqJ{>Inty{4Xjl~1 +zgdFgwNTU8q%*8O*{QOkX8)sAo8RbF@e+EyD^FsT*40IpbzgEU97Y-*zV^c>Zj-k(* +z4g^=w!-yCUono2GpvuDi}--eoe>>9GzFfZD!yQrmc`W%UiXzzegAZ-77#ER6`}Z7 +zuR9rhAw!v910!;h7@0Bke7-gItNa@gQY`sH3_{A?xV!tO+ojCOE2_>5(*AG{$uLLL +z3~xybld|eWjfC4>>J!<&zioXHae+azyQF^hQNz;4%hjA(3+5X_$0aT{9@-S0X-%)M +z`Q*If9t3#~tc|U(l2p3b{_8bm{ZQM$RVD90a##x +z($s_#5JZkE7T|r$yl^+Zb~*zpA3VG4AVta##*Mn?4z`sHhY!bfoG3wx0(T47ZoCcN +zjf=nUFV&a2v2&skpzA?-QKx32%~$4Pp4&Y~BuG3UYyI7>;00nN5nAkLep~KueE?$(M?M7jd2Mq= +zKdoZ`=(8kHAs#>)^{%)30v{U$pO_J@9K|dH;qJFg)b+a1dw;E6#9#7~+6p_Ht2-!RQe8{DKHO_iyE8)dyfN?xO +zT^Sa|TY9i2u=t;3S-fpaH1Zl}yb{c_bbFW!|WRb^feW>KluYCNUTe +z$EoteoM9s8xO;XuW#`jm6kF+AS)m{r%*Vq=db~Tsi4g-g_1V(-ol9684jj^l7>9dh +zV<|q35r@r#8b3SglROr=(CPi-Bl2O9Cf=s|b=EmR`f~K(`R1Cw)HU0a94c6yx-}_Z +za)XUZV`ck#!jQ-UyK=$Q3AZ$lu~I!E9!M4j2@kbpR>~b~1fzSjb6YM-1|O`MJ#r{Crnj^^BWgKTfDfb8Px5k4C +z?z8@k@!A+cX_@_KnJ-IUefLd>a=g3(Vdz)HGD)FJ2m0vW7_X~Dsy<#}JD~?W3=iSs +za=g!S;uo7t8@cLfF`ETrImEfyT;jj8%RSV1xw&v$_e}bnLWBft!{cYUEr?v5u9%zI +za&o%wPTq6N(Sl=^x^NJWRot1R-+Wwk0}9vl6vobDF5)efOHu`%v5{{S+ZjC6?)wKe +zY-JXD^;06N5F%&zl%|cnvX`@x=W*o=Lt3PgvfOn{5UqXSjjb8^;+Ah}Hwz?TzUX5l +zOPQz624A{2Po77?BSvqY9J59%HwWWa&1ZSzbahp{-z+o0jMY5fe+P1kxEZP|DQLzh +zGPdad*WnxEc;Utno4%8#<{4wMT|K~EWXnLdD6qV~j=Xp|Of}GZDDj5>lxNAH;)om6 +zL)CWm>&oz~;-Lk^{Ip)1^6dvzQOw)RiFZ$45P`VxQoj>U1>y|? +zn$M}hR=dQ$`7mMnZ`i9Z4Jw6;)&1j&+$0VQ6sl6r-?;Hm4?TgXX2DHf)T4JK7L4c7 +z^zizBA70_YYD0P8pF9`ggcRhT4^P=C?_B*pLUGjxa0Zx2O2J9G`w6;`=zkJrVnXpCmDUufFCVeoGiH#b*7NCTg5H +z%25(RS@2u0P;Fy>RI>7FFINVusNKSFR^A?9POw$= +zeQy9a&nCf6l;xGUGLFs$Kz`->^W&iwWk$u +zEo^v`B3w$6Q`9`%97m#(N_6euIF-;Z>0UwG@A;wh*y{%YXGG3q`2EdP7|fCg-gR}S`7e8`RoE`OEY+CRO#ow)2u+q6nV(PGuGQgD6;CPh;v|tw)BIWmVRY2#ja>ZE +zJ-B4s_>p+baM*U_R2Wh1Iz9`M65}eZNY4N +z%(1@I?QSg-9$0WaFF7$=y`L=L{K^7+i%uf4N@pxi?Wxt-n(s~AQjl*x +zUG||dco%~USiVJ|Ez6R6)jSO+%}62G*3|p{xSkq#k;^E;{he~1zIq3_|EQP1EZD)aS!J;6B-VW-=pIu3Zdbt4cxlx$e)iE9v$w+ +z!54S6;fumFeXY~c`1E@%4kRj)>3EnM&zS1OqFD6=j`wS-*=nE)g%INce*7Q#IM1^= +z3KL%Cve4t7caS2qtOx4y2q2~X+GAn_@+Ns&>K8d62Bt|0rR(^z(S$r#Y2na2KG)wL +zK_QK|Ry6d+dfyrxKyxb@%Y6ce$qe99EsLu9Tmtk)ZPAQC9f5_};u=7y3}4GEh^?fI +z2x=T!f%4S?H2hiv8@Bm#Li2k@bmTZHgXJdW$*=m1YkDqpAiRb?L{g`SVMHZscBZf4 +zyEf~8oJd>!ARy~8tNhAl8YuJO2bPKYyG-zxW3PFz!RWGp%%X6tR`yMuQa%V(Ts6D- +zZ$AK8JK05vxpCCZl;@8>Zr6^oM@q<4_pW@pESm|w?ArZr2e1>14xJY`RE@3$@;b4^ +z91ErSCsTg88 +zhWf^-{nb|sYq0lu_03@6E$J~t^fd`3IKt^gA-=%Gpw*S%U&TVgY>fcjkrLlzyJp$+ +zGfzjCZ-t);n)%c}7E06R<%`sbc!wV0s2t%a#n_u$B24||9vp+uR`nS1*IOo|9H(nOGU4&=m5&y> +zA_(@1Uu+ww+-h<@_2ti1h$<#<`T`vF%5{iNrIlaqzje$}$sX%!ft==fsM^~99Y0{^ +zEb`(cYcR>P+|W*{a2&5rP%$NO7#GdXH-&h4O=0I}Z-r{lo7xBeKz^5CIn&=ax5t_u +zJB$m&ud?Ec>>4R1mFbFXYdem!(UA6jF(^0w81ToM(EE!NGU?<_*KIQ(CG>aCz($Y5 +zsN|h*O4cgg;W&>(ipaK^?NS$5{i9v*llf8Z{?cHM`5ANeJ9-MzxT8}`trp2A{k|%? +z4EXE6llemAB!{3n95SN0;o@|uUTVPGtnd15ml%+ibj;l*XMmSimV0QNIsP}DiJa6k +z8ZOP+le#_(LV^`0hc)Wq%JxX}oK$`&{Lcl08mlo1eI9Au%|D@HcO;h9kD0C&=(UJU +zIIZbxV~a|x9JJ}SCZSI3vcYZ&45nPRP;YS>0S?1@`|8j4~KHjo!8l7om~2( +z>9tWG=_(*B-WRW_0@ClS_T=ObIo9i~IkWY47>3lCuSe*dJ}7{6JsW<>Z8=MsE!fB$ +z>2gMomR-u-WBpKbMLNp}dzaL6SPDua#~?%y5iUkXi2ALO_oY1~+5cVsQI9%Pvz7nA +zx?|h=`MBWqUy*ER3c;NSc5T>;PXl!y!*3A$NRKtD{=wgY=>t^%YJ}r25h^YgQioeZ +zPUzsft;QkYk;+4A(itM?5aMvBh*WtF*{?afNf}((7lqA(aDb6KjVH+G`fz*`YAs +zb^NAE18Wp2(9#U^VJvrEOm?Y-cM_ckZz|P`G%mmh=zwvVDKrQ#wnWs6+79dpZrr4T +zLJ=K6Z?r>&6%Af!RY(p-3O}Wi~vnSbyqas*Z0~V +z@L;~2IO_{V?^-Jo@%6&eXb$0Sk;AuRxceGitA5FUC_4+u_Oka`n1l}j$}zB{`JvS| +z7`S(y{ho?KNq5)12)h(&Dzv`B{;z_#KgL<{y1EiDIdeSI@ElCYGwQvggkN^=;+XE; +zV39a>kO^A!0TW5uV1)tvpVLeyK;}6WLq!E_rXnxO@#%4eh?vrVjFMcOP**q+4Jx|~ +z9cvR{t_!@*dRhtZxG;rJB$>5uI(*cRr;D$b)|wA*$ZgGoLYgO57=m5mtK+IAz~!uP +z`x@@;Btzuv6}pqiv62`Q;t^ +zexDI;=uT7c&>~ChOi-GTkHqle+|9XoIbQmQ6R#!!@ +zw~cQjq!sBFkgfsJrSJtL1nGv+DF{f{KoF5qi4BR-jda)O8X+a6fWQ!>2a>}3{Qh{4 +zV}I{>wqy6M`?{|4{G72MD&&>JD>U+W^c0?BeyTtVT|*8L8M*AT3Ha?fhY-T_>+ra< +zDLmkJ9_UJ6MPFdczgahSVwo%vr1p5pmbBx3R!7phf3G|I4$>xi+=yath@M&e7cwO^MyJvsNW}i%3t5uIiGg9l`SW}P(x8C?x +zSIiz-J*x*g%AF&K6H9V^_0x@b$|M)tu7xd^UxxoeDu>MhUPF=IaFjGdjNUYfCEmSz +zC(Opy(KgAGMXuYHU*3!s=*5P9UZ$JQwFg`(oBl;lJZ&^*{uZq~zBawK`_dqk|LhOP +z=Vc=6E;8uc+H@TnuH8pV@VGnES!eC@jn1#1&89jp9V&XTLlK6+D!lF`3B*LItP(Vst8qlEb&@Qy?2iWjw7Og-iH +zOc?LG4VPoG*Pg(bZr>7V&AOOJhn=`qaKsh^62$<$e41*zJm%8F_b3Fbmd_4CyoIJX`x;HlVhK(D$eYXWjC!5ITgADQq7d +zb0t%Q6KX$SYPW2P{)*B?2`1+Z$tz-B(+6?Deleg%wnOnm3?_qs12=I+2vf^CWymE< +zAl_*wG$afqhJ}(o0eYM(K#KVtlt6xbPwm(QtN;D5+V;7`r!vi;-(|ch!dL!Nb%t-# +z-8gXc!Lm<}IG7fv1X1gY!UdC8#f~1@Ns}Mrr>+at#I3GaObjy61GS4N=G9cZgqa7} +z9eB8U7#{RhlS+HlRItTU+zX0ok+`W#-`GiE^z;nt%>5v31r8!&B*L{Bh-yNWXYA1z +zGdnC8C)>(F-W{A=xP+i{#}(g7xz{SfK7Z+>{-sndyVU|lhFh#P4hT=`#7{eEJhcI1 +z2#xsKJO0Lvg^=#2kN!asc8GOGCC|4P>s;alO$BJM@5fI6=@noFKU!&rK-KfU%OaF8 +zJ}&K#HFsI%qGY)6tWj(m$9#I>aw<@e2qtoMGI~`f8F%7=I5+7VvcP-il{gikh1SBY +z(LwGl4r5iC9jClobxZKkr&c@ScH#+3dr&*7(;uL5lfHTZOKUS?q4a051XEWjaIA0G +z7ZEa-bA~sT_|-yDUOLG>*V?G-hy0iyW&UqfkMgUK76j0T@w8 +zOEBREXsHs*h&j4YyeOg_3O`m +zXg?!cks5FMOx)HRhKy(nuqdJk6FuK>r(iJ6vn3qeuShVC;gZ5(n4z$|6BWYNo+6Cit#}Ksio9&)8VHi +z34?+v1cOf#$~0&Tf%y)d!r7P0m45hEBl~Rx84S3C_`Oby+2d)XrgyXgbkC%YHkDT# +zT-acegfBIxcIugD)AX0?hdxu +zC?s2D6TcRbkUmUVf;+UT*j3w%E;9g-Z<^qgFtFBC +zX~kxqI{62L-nPtaq-C>K@Ba-1T;r&7!VW+5MrR**KgslL>tBKY9gyN8_Ecby&FP9v +z=0JQGI6oLAGGfxj{uyBQNp7m6^hf+p$500;E2&6psQ-YyYR>;Ww&+2K9L$wzSe}Bq +zm08$ZL*!frxY|!|gyQ?;)4~i36J2Ax0Ff-F7jp(8s1%*4>#nf>_Xi`6TA`6~$v=4iLGw0~y*HFf{IMYNdAQAVjw_m0;l;s!Yac<#cWnRN3bzao +z8ZkMPvlpiC=6_GH5;!&|5($3CR$=U(sw%1yNy!-YI&Cnl+Q;68kMD10BexZS5QT<9 +zZ%Vmcz2I4}ddvD-BAXes=aF<{0ztrw*Ql0fOQP#iq`Mi`qRr5mh#gbW|>(bX@kTxe+yFxi7M#Iev{#CN& +zar3acGfn!98(j1ePDfE=97i_%B+z738?14-`GsouNl<&j;hPay`-yyvcM^>n=E3#| +z$FT4_Uq{i2wAL&U9A!UmMLuoq6eQhbM=!U+XI#U!EJQ7=tURbQcT~KUfe)(h>mk5k +zDIDWl1m>w892PVw$b70N@lC%I@^?#JTA$w8#uNRMer3@od4wRWs&Tf0nXyr*AUu|N +zw;54xTKTo!lZ%6f0k%w3RNi2-^fm6qEc&)$SUPY-6wmN +zfLmWl`GP2%zI5!Q20&k=;h-sf1E=dtsF2An6G!xA}=Yjtk->K%4~F +zL;{mVn;fEJgzWRkPicFB8A7?zmJgjH;_Uf1i_jhd$BP^^#lr_Zq1KzV)6th<>0BNT +z6(m+oY3+qWcr(wNipbKjmzdVyqGJog)IZNNf_tR+wReMJ&FJKdvtw(`zSe#sr$s;B +zbHFS7z#Q-!wRQ9@Lz+`KFrmHB>o-gBHi7m8F}*JXVODJ-jLoT^!4|{~of5lDuz%!q +z!thKRZAz|@LqdOXACdt17nXbx`uaJEHjJ7+B}`Pv0sK!q3{S*On<`DcF}NIP54Lo@WuJHVWK#W%6wf#l^=Rf9hQXiZqxW +z9A}oLsb&9eq*PqU=ii|B8b5PwTqv2FhGS7ZcjG?4YaWf>JXv^6s5p6I<|7Eh=JC!@ +z$YPX8a5IJ_WCiCv?)CgZ_Bt3Kw1g*AQI0gbn<&uVm|7y}Ur(usqR2$_HZZwV5*iF4 +z4OR1eE7~qUvNrf~3BDTT +z<^1E-hEJVOsBWcMSW#s6U!*SCt*dSzq_|Qa^n4J;&o~NGI4mWA-hF|b4}Wzclvt-Q +zk}C1A=Dg%$BCCpIiMx!F%8_IEmud=D>LS|2z7m2f-9 +zJ1GV!3apT*wkK+Js;K&jTpm{QC|}u{b{`mksGO|aQt2k2Y7vQGWk#an7b5_*pAn4p +z`M+xruA0yiST@?d$&1-r#;vvEDj~Q-)Y7AF&>(!6V|8H|pO?L3p#;s<0jNsn=x~c!9v`J7knbG8 +z+JpnplO}Z5?N1}Cf3ex%>b(=-D$yJ7yql8AcI4_O4LuvNng&#~2NB?eO8ZVRNN|PX +zC35IUkUoTPFbg=IgW?vTx{n%>qWkvFX%WX6zCGJB@rv;xL4%4-{35Vd;pn!|RS?E_ +z%jSbo-kx`jDM^BsTEXRU*+mcNnYWUn9Wj9DfO}8~&+f?|uWIf}Hb?^FpkTvncsY0L*Il0% +zgN4RF|9kK-d@mSeK+fZr%YEZFnj0;{ppfZbU8wP0^UK+(%ilg_NJdNONq~ +z_9Q9|s>tF`*Xv!zKUziYx;n%oBuX1p`QKUJR~aMj<&-cCB%%C+(c6x8>D-MI%`bkV +z8z?#Kr`b;UAj_C*KC@b^zP+!em`q~D<3@pkXUh*6iD65$GnH1NQcXhnu9+NwOi%Dp +zt17!jqpj*AP7CB3SHp)L*FF27$5NAAm-`T3@-KALYuTZ`XRD)m-tioa9VzP5?UyUl +z@^6cl>PGHM=WHy?>$R-&&0E?2Tn9CwdUi{4f9~AR2}uZ!t~CG;ZC6m3hKfW6W3hCb6q_x~quw%ERNF3HL+h5weL*=RYCDG~F5yqjBfqRdD5zWZMBaPnJ{s&| +zj{VmPw!p!@1zq5J<-4Sg#1iFbKd$iU=+g~3*n0lv2(fsfW&Wf2MT$8B*l8Mm%96%| +zS_!zUG=Ap(QBDNLrUS+F>KRQyIQ@DTSd^8XdVT!?OieAw;Y~E#i-ee!)TwIClg +zf@&_18u-@WYPCu1d()>h8A9QiF$YfH#6+N%k$VWL*9d{C3PX@{Bqwx1f&wp@GKNlW +zq?xpSF~_;iiopU1D*2|k6ULbLyIp3*z)*w95JJ1+Yy(=tVr$SGTSO|~M{oLvOT&ep +z!)pGr6E(g$W?xZn79~L95+bmu)Oeg?nC`$%CWE+r8r3Aew#=WD;0gOLhGan3Npu>ugxuC-FJGMgj#qqJ7uHrH7y5A>Dmca? +zL8mWq8>G4|ei_xbP_Njh^Gr&H%D<&yX>U3>UaNh7>Vyip5 +zKM=10NjTxciCa-&Q6Ucp4`(#PvexAk)b@JOn3`9toB6mmnszeFN*~L+n+?K3k)?bnNuVp$W# +zU)iL}#LlW=>yI8|o+GvdddJEr6pVX*CBSK%A!=-q-GaCvyK-vAz@TCRB;7U|H}ebF +zjoPCL>D!sq4kJC?*Wxl*@5ChrQHsQ5p>M40_U)|@t#51&pn+lNAtpRRub5Anur>3* +zpqM^V0mx4?ihTm$34hX}F@A|ORe$VUt{LQyWj=vG{ms+q9^X)SJe7?mi*;?dC_JhrGG18DmpB94I$T-PPngX+YGKaWLw>mL9n +zzC1=>q5s7(5=h*E{-3EvQtR2W+c=K{@gt6iY +z&1kT-MKiPcs9}X5&7kRs1JCueM&9vdkK6U1w196Y*POwxPQD`ZO<0p{|6K^CT9O}c +zgU;s +z95G>Xb2=td*Xd#;(=zo;)Z1CGE|*1dAXZg8vE_iQQK5gDk0%RLmWip#AX1qGk%{&_x0E^WT%163NmwM6*^ +z9i`ZoJoofV-!xV&Zh6$|Cwyjs_`K4VRcLJDI#r%ESfx3>>fG5BGyCUdZ+F9|lZSa4 +z?vBaAxXlYY!b2akH`DfWaU@;RW4?fOap=Jz11FpfB~NwUO13kbzw&nJ +z94Hw#cHxn*%^n-Nwq2w#4IUJ28ZwJYE&!7z^>F+krgPM$bs&BTQS*!!wTm4qwSxNa +zBrLEV9aAI|hlJ|iH-l$XC8ihX+vOh0qUfB|18u*m$Ineg2y}FtuO7)YnC{WT^{|EG +zK7sa53AZ*El`;f>949gQ*T}wxP9u!$gPKQH^G)bdsEXu8huB=+Tok=81wp0!mgpb+ +zH)i*Ab$u^>kfD?&P7`C2S)OnIzZPJR3ydK{nK)mbnv-${pnv~>I*{^KoK)~pS|hi< +z`GAQO0TWN%%61qSBTL^3E|5%I!sndtV-m2;u{b!vYPtX)Ux*@bdj?&qSw*J|IOLDT +zFZ%M~hvNyphaN2Kw-F*;{zX?5j +zsEkqIlUUXy<>Ox(b2SZ4`97ym;gm$?e~DPoXF0wD6}eO?`n;MMh)dW%UCeI +zaL#6R17sSf{702Bf)*Td016vm6?9nuLhqHiw+48j!~m}qPjtq4ZcG#dAQs)w?lGF+86yVRujM0nrj4! +zg6egy0hUEYo9WrW5dOvYK3%GPyQsJa=F0Cc*BSSIYUPWW<%LBi1s%s&}xh +zQ6>`g%r{5R2LFArVo(VSSrsYNYabVMo~zD8K$}dc7N&Qg3Yy_kQ7R+(ogG)3Os<%h +z&Onb4dhgAUy^nMT&OG2+bjmrWL<_cU;uh1;3q!`+mxQqS?Q0MIqebIQO2Ui#nK5oC +z`_XPgY3>dY_(-BD{PIt!_&@*DX}iv`Wt)qR*7yRjfaWdbH(r{TO=_!;%&;DC!Ls4~A +zmoSd?7K@Qt=o|f<5Oro()6^a}3;ecCZ0+NEWUMG9DYDsq=v-q?GXNy1oru10t@Cnx9ycAK +zw!bhNNe_Pi6gzFSh^9V3aP3|3EPUI+i5TK%iQJd25WvY;(IO)!?YSZszv<;YbBMP8~ +z>sKefdhNba47XU7>$@ME<9y_l98(fX>ttN>>pwnsUBkNd|FXt;Hui=;)N;y=PWX!c +z%}TDn3r&4Xm(Scqy**5WD3DQ9_YIrIZ4}b=j|jf^?RYd1*DKBQf!TNH!!L*Q|Au)h +zIO-q2Qb&%u#A=#UaJF!}H_x&Hv&UcR;QlOiQurC}GG=A|fP-B2zv{(0;>_t& +zGWXn+Iplm9p`8cI>73hpQP52N=gg4*sb!M7j8>MFM)B|}F0RxmyCejA1JwSzxGm*p +z&3-vB$^DK*o2z=f+QCa^P`?z=?AqZ!8PcjE@hzMcl@v25vHZ2Dfcy_oZ*VkzYMoc( +zhVz|X2(H?`u+93BCai9+7|W@+tZ9{Q>75bw&G|1ua>llTzDV!mA3+Gd?G0^RUh&Z~ +zGKB-NCkhi&Phyh|iv%S$TijncI4iufIbsM|bTrSIOpr&+%A>v^!U$26zj>clgCd^p +z29<-Ib{SCATkJ+h`EE|Hx(oI0!I%jhb{|IGYNLL}vIOrngJz`2>nU;T-&%qwhKcAu +zmf312CqHQmQqGisKGFhFIUi}n?#O`SKj2|$d!v1Qh+2xd3|?fYj4#6OqDhh2StAI* +zHWmAGNFlg*h#|Ds{zMg-&%!dNXLFp9Mrt6^``hDp2=&rolVqK-1s)aFtD8plRdnPs +zUb=PU);4o`R`lXdWMs0gcqkq;UN=xshM{Kj2_f^~zCV5Kk9GSp`u6n=E3m!48`+Hg +zZVx))PkE%a+l1wQk4Ge8TTUL(4OxuAru={ZZ5>-i4F-9AQjgsNTbVrDo;$kY5tS7# +zv(q5-z`XM-fw{gL;|$%TFyw5e6BEhC3_)?5>52KzA%-3%l1Hg&9Nf)ZYMHM?+rUp$o2+W +zy`t=O<^gbDXC0gYURyq9wc*yywmsp!6x{lA@j-+OTe~890Ub^RjY>cAz#(T5A{N74 +zisI0@5nH&8uAD;|v|GV!7|Y +zKO`w^gJh;%Z5HJTL-vd{m3UD0j^7OB(B!In1Q)2(S8h@r4ViB6Pj0qiK)?*e>Q_g0 +zagqe(+d0t2aw6itn3DoRr&5ZY3P-_}Fum7G(FnGPPcBf4Dr2$zUSR&s-VqJOy_a+_ +zUgiKT2O8r+mHx@EmAHHS$yigh$&3_E3DZ~@k_^6?nSr6SjshxL~yT=0<^5boOuTyzoHrd6q+@2gi%to4cd~1L>zsCkm2ufqT3sRGH`sbuAbn1j`G|zzN-0mKKMNg3~#^WoI!Jl>(k;XOqtu@;pCUYz&O%o_~dDaGmT~(7tw3+!{ +zhKVxs9ZT!ychV-?7lBI}ZoZ=aZX0>m^#|WbECsanOI;@8MjcYimZU~oPg*XWu01lk +zcIJ)atSXhP>|*(g0OV8>t!(9ROuIQ-f!VhH40NuvV5xu9Wwtm$2|i-n0tT$F^WZSelG~^K^M1xCFi5G)B0t$fE`isgd1dOy)ExmE29|BpRM(F1cz9?9a4)Djx1O +zmqR0}@4t~9e24?OaQGVD6{KU(ein44^7j0yiu%nwjj +zCFT-V*McO`8hPiU?Y$zYMWh3{dLuiCuC;7kDOYA}ze|7&LRQs;+_AD&ji8ybC_*=5 +zaSJJ8_>TUw8BdxOYKZos=E1H#7#ofUH6ny{0kkxAHRF>4@3foHC=mBViuhLo}bNa%nGy`F(`Y>Ey`OC;}cYjN=bb#A`${R)6p1o +zgZ&rg1U(zbyPTsJ;)~I~k$e&#NAt0@_v<0SPR}WQ=uxk1y-rjSJNk7#c*Rz=N~M3Q +zH6j%hg_>j=mI#HU-hztHwuP;}t06;Z({qyR1xXcU2vH8b^8fCJMNLC7jw2d~0UkVB +zR6m(@c*mGChLsesBGk5r4jy`Ebl5n8x`=;F%Iu0M3Bh_jFK}Xkp~eYHLT`4uiGyDq +z1-U;Q3;Aij3SwyBG^01L_@Qe_=lnS$t49)QxMIwk9Jp0Q`}>c&nRHj7ZwC2Db&Uvc3_D0GRBZpamc +ziNAA=1S;({ZwTU@m{CUPfiw7f0?EaCDO_L>-%@(s96g~0>|FH?3;{T&no2s!9uGjx +z_z2KoUoTQiq?i?9+xfsY?Qh!t|CGy4!3- +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 +zi;*Lkj_eJ30;kPyp#N=8HaG*1Km(n7z +zwXbkRrXn=HyfbJ}yd63cZ;PfI4-Kcrvej1nHSmQLZ@aBMbi(2j!Ia;BO7s{7mkH|? +zbOHL;Muqp_1m`b+1~27)OX2?c%iM@5k_%t8=#XORV(-0izbP-u(;V!{DRXSs7{uD* +zKs=D^6m?HzA_?kNFj=Rf53?-j#rz;;SjHj+CSsVE#7fgx}4)k%$|C6sTcztW1yAWnYa6DT-dU_u7V$s~>Vvg>X2 +zrH{*%m9DriD2m?E79U!sxLs^s^HKHBNiDcJA?Dstk4jl&v1;!oa +zZ{v&Pk=XA$P#_WlD2It)Uy-Hiq{6fS1C}DX +z0wqLU658p2=}AQuzl*%~NCMjGyGG{lE;3I`yX66GTJEoC({^N+v70tC%r!<|RHw~_!kjjy+H=e|w}f9I_iE-%}AR={zyX0TG+E7fF`|GE{X>TFw7 +z#WyBAif}jTD%&4r+Q*q^eRmD(YUvT>AFnMg1@kY=MBkvFKMbi;rFQX(K-14Kl?Avq+bQqnM55GEa?J0wK9JB8o#`CZrdFW?%x +z_MGRObD!7E7KtX7J1vyH!;Rdy_EK~@aV0=|lSp{o;CMwiN4i&3*%~fOdCNlTK5Z$z +zbg4>+kAHo2uFjcZ-ZsHnj6-NXk2UKigql_UFUF!M8OT5mbSpKI&*_`dNHa;yYbS*L}|KWJ+1i&-&+x_rR>r-9;(-i~KI$-Axn4n~IuF>IeP2M)EyDtY{u>crYD +zgq!;C_skw7{&3a_d9y96m!I4YQcoG|QbNZ@*B37?OFTX +zmQF%w37`VG7u)YWK)gB6pzE-ol%4G1_h+8Y3SFTGy|=8gCzs{cYuZ=x^0Wa=X|8QQ +zz#13VgapnM9y9I-)N(}w*r?;m^rt?UJiGdQBA%5Ds`EBmkTq`O!Ekdcld +zIUCT+!VV_IE~XHHMF+vt-8XU_jF6W@`gx$=j+c&;JH7lOOj=QU`M;u)2w`A=+9h-A +z@Y2BLEfa()QgbrX^!}PlBX7|O*Hre7mlQHIe}W`ixYhY!1W)$X%U+G3$8hE2sO*X&^m>mii0X%x##5qz`!fDvK$*n7j2 +zLcF(gDp>2Srn>wpA&e=+aqr3aJ(SmNbQQ>Z=_Q3wOvRy*NA$iO!L?GF)_%Q&uX=n8 +z@Ty|JkP#tngEvV{-XxLUYf;$(Gb` +zN97=1TEJ4lTOCFYbZBI{pd8#ysUYN))vLCv2o|DqDqM*%uPQin!L6lR>GZ6Bf04J| +zNfquT5N0es?YrLGSFp7^)irTB_oG)_bc(8k)V%r(E3_zGq-Fh;wri^Nu)#qax5HX7 +zM@S<;Ku5qlPMJZgx#E(N;H*)-Vuy3imQcnGE?X!By7_I?2rh1f +zfJ3MWoBSU)Fafc3mmH*&I7*2YqEWHRuIQ%_rQ!Du*6`isYoy)e5{D+n +zA{%(XN3m9nDS?%=nx;lz;8R+zWPt0eB$Y@uEk8;$*dG9Jrp%~=1cRv!|LZP$#oJhx?lx{R*>+%_Mu*++?zIoS+A)|})SGx2P1lzZ +zOvpdOJuLOyp-R^%_Nh^`tZ{+i!x-Z)E0kGb!mw;hW~& +z&ikeoKo^*z8(mOLnTa;8EGSwBzH%$WPbE$2`J-h5O6 +zbU=Ug<$OiIswzy5r1}AM|2ULXcFF$FTD#3TMQR}COUT{>xrZj7#&SOD^qjoeG*c;f +z52AEqB;D@gsorx3E_Os&l{jYCWB2N{`&jY>gFRbhR +zcl9dop`xBjL7CB;U1K$;e*u9E!?5Yl&~tI0bv;%RC9~e-n2SN{)3y4Yf6KXUg*^5K +z!s%?>xgOGdoGBjdE!*|mk5ViP=31hMZcTuSo=VZ@V4SS@Xf>Z1RHp0sZ-Qt +z^;uW`Yf$~FXT|=ZD2o{O$Z|FDc6^s-Xwr#ipK_HNrZASCGRuOQ1L +z2Qr3~bLu!}zN%>;^PU&iGANysqDr&rYDpl-JRNig^jXp`; +z`C8d6E8E*+`u_RvWigk=F5nEq@lpO0Gs!+|n)b|EI_{@=8_=|to?WaNMmIhRR5)!w +z(W8GABN`7k6x#~+yin53`^?p1i}5M@*V}vqt99tiKCCKO@W_(UN%c|((-UMVb{eQP +zn{%Lj{+d7`X%~i2!EFnf29xGHsx0s*g=x6|8F=FWU-U3o9NYk(>7;h_*$;`ih9!}6 +zORg`yLCrq;p^&^g>@C+MLt>342yv39M3ZnQN1CmsTcK$MzpRxYublpCa4OS9@eFy8 +zIVP=c3_6&3Uj*e3j#g@{6gam2V^LB@-(6~TejUndnQMiP0WYLKB@0Ahi<=s41D%6a;y5c*o1fnY(b}T7FG~sIEvN)k3moWdA@FAJ|AYTpZgAFglkbd +zM)WURX0pDHVK+8d{2)>PfTK*O4v=gNU#(t9Sg7yU6nEBqYxK&z*BPNjDxUT{g@rAC +z&0d6KlokGU&Pw6iP{heFCF>fu)+k~?;B*smlF*sU=up4 +z0CK(g96YJ@&b5H==#RI%Ij+W8X|mHLNw~@1GHEGwmvH-Z6p~YIdXE-2rCA-* +zv2a5UG?BjhDdhMbodwK+sO-SgA`2Epol-@N(~dNzqvw$HNG2 +zzt2l8N`76h&6v +zu?Kge2=ITo%X(V0;w2M$VgaSc-72uR7|t!$9f#PcD-_Nq+oynk_`Kxbp7W*SDX3}? +zP+ASU7Y;5kX@+|SJZt%t&ag7DL3;xohy70}U(TCN37rg?>8-(3dyPM(MR18V;-eyVC +zo{m>1T8(OjYExYJl(H9{$&B1#e$8K$r18h>bxa{YB&C<}*9W4zDw;mUPir_c6kW_M +zUCh~CK3lnDgm_EB-WR?)7> +zIG^_>;nH^7vQpW?i-99a@a00)+tW*b(GZ#t9oj665Ko~=Wq`#(U5IGVP9Qx{U6VzA +zYi^9xphbRb#LtX02i@OkWHOW4;$8WkeEK_fW2iLYp;>F9Wh_eO?!&zyDNTB9qvsxc<&iq$l*qL2zsEm^tpg1hmfWYyV! +z;v^r;WlYDOyn0?7o@Vc$M=rolE(lbCyXviimJi?I#S3Fi(~Lk#(7;$ +zA4oGc6|v^QUUorHioOS0!d{d(EfG@6c2c;$QE{-4%PCx6mlW;>|CgiC1w0LairGee +z*;JT!6^!}%RAF9zSFGqe6&(NFp>mJ}2x{v&>pz{G3P!=Och_V9s(+B28QW*S_>nL2 +zjIY9D$64Qy@R^*0oy2SY6EzlQqVt9K@y67#ZLzox2)^-R1~D8KrZBJk=U`w7`L$vH +zhd^r8H!Z%?o|0BW{sQ_!4OwDQS*U`^LfcxT0u%p>4IU-uJm@Ons_TNx9b12qPRCQd +z<{N9cxhF1D3}vU%a4F3YiFCginwt)O9XhbbOrlN&iH1L<9?H?rFpK +z(4bSc*!(L&%i_v|PP_M?DKCl#7P#V`MyAmDs=83Zd3WnnQ_~~jLXCT>KvLTu7DCgM8ic<_Bz9F{jtn*qqCpGzqVpUtkCX=S+$#}kpd7wO(HR9-5 +zRALtYF327=RA!~!F+S#l%bxtJh!Ubaq=3KCxBUZ3+VnCi>H=<-E1P2fcd7i@kjcHp +z)W3oE=okbP!O$YAZ3;NygQX~exNH=G*7nYekV+f-mfd0@L;>V~8%1FL!6k1L{^`%R +zDiGc4S&e!t(2*L>Y74?S2DvtlItL>Bu*roy+u8A)G#+IB!D&S37LVvFsqf@dYm8gSg9YZUdqwQ?yzXBJM$=OJ`7&C$e&%d&~4C*C^&d9rgF9^xX`|!lT<&pCJf0wiYHC`grnPNq +znA)sV<@HJf=Yx;13^yMM>7NR<(@V8gPDmlA1&JKpvkG5?x_xT1VX9Y`4c+A!6aUl{h%ne3|?in>Nv#HaLQ!{sW-%E}uV +z4iE)~(V)@4`gxLj4Ppyv@@M{ +zqWGj-r8k0k26g&!TT!7Xv4P|$p@xUl(C5FaPezDEJ=GqZD(Xa}j4CkE;2x!YO16yu +z+(_AdEWlgn2g|C?`R4KmEjOk|@L5rF<2sjPV0%o{CWk7O6(MgRZW^S5W|^uElHf3$ +zEb0H8y;7|yBCZ_dBw6Sqm~UVAK<;E{&>$i-HFr0q`qoL7qtSTeAckB{K~E$4mA-`z +z^LWP-fJZ`wY&a>B!8JC98WZ*utnI92;ulN@bNls1YK_H1f@G_FrNo?cxhc*j*^p)_ +zIj5DpQoIl?l~^#kl?k%^N<*QL%NlRNauKEi+}XTOTzYq +zaLMT^y7K2{Lh^Q$@Q>qt@0jl)d-PMEv8ln3)B3BG4ej>!HC;Ac$wPT2vJ3tiNHgt5 +zCzp#(@tQYxaP4KwqdpH6En;W(evrbgzc0t7ZOIha5G-ul4EkA@u0g=~dtfbq6L4L4 +zwHUo8eYlLWD1msB;}AyX8ToDqVtA1-Zo53@0diW;b)1PG3SrKY!cLfwl$4QcwN3pI +zNQ*KGWrwe()?uwJ#DszIe^!4*ZtMLjC}2MOu&o~jzK_f0^c&VzSV}bKlY9X6Ip1SX +zAO|KtNs)SNX1I)K#iYm!EuY?w>_UA;T%5qf#}C*9caXSoBebDcmAEMgx)`6O1MF`Q +zg?jk9iAuNPLm&V-&Ib?C!YvX&0V7)^`4SLHRRZ@|xdgU%H-}oc{{n8`$8O^xXmF?3 +zgbO&IRje4&nRc#TN?T3Y7ycESv_jZ~*)m1)pZ4&LzRr7cBce+EU;mo(wSI#5>i5BF +zJB+LY088Wb{ViJNX8Di@{+^M8v20%k1HrA)*?$(o-Fx(+c^hq{Z +z&TrPZ;zr!!*(@;ywcQ62r72>?)rPsxOBuY_r=v?tS{P*qKnHQ;y_lsff^qlucV#$6 +zleJ*}czS&9qjS!7zC#z+q%iw+!IJsM3-Y+W1b~A;H&ZMQ4~E>xv@H$u?6;Cz{I`Fo +zunrSk{G=5fmV0sh`2$P$wj@EQwD97eLQW=K0?A-21(s&Tjv{DpT4ve@J^N6o$l{IX +z9SGi@f8TptsNjEqng4K(5Mn0f;`AK37f)61EHRf1nQV7+SS!BJQn>+kY7*mJ_;1ew +zdfx7J+*|D>M3Vhlbv4m_dA~`pOWM9XO0a9|K|8@sZ&&*mTC=NuT}0yr0&h_@^M5RW +z2rI|R6K{77Em9t)cxuY^OiBT2ra13@E17{O_>Sd>^HWVyk=~zgCn`1VYkGjgyuHJi +z>_RF5E^<~}*4ZMBi +z@-X%{DkV(M=g@5-ctF=Npt3IHRpyT8DEq>9sMOxwdwDBs6v5stri({?MB%dT&FJ4i +zz+Fb(58Pb8rsbO!qxeHCQu(`-Z0$d6N3yCsPnR~)mn-E2iYMY?^mi8xC +zvv5=g!pu%1w%ORY+NLZ5Q<{LaGXkK`s8n(HuJtX3V`-G;Qm4b~wlL9+dBhmgLNdkr +z+DMcvbH;BySUCM7lyb>YgX>R@Z9|5W-!|uSRh?_|qK03$y9ASOvCmo1qXb%ezrlmM +zRhzMH_QoM(>lrH-jrYx^g(m3~n3{Z-Ei&$_JWnWJ~{QXAm_X +z&9+S2O*@(;|0CBFTu3%@t8gV2Z2N&w%ofj0@o46MAHym*ZAM_Repm!Ka-X~yC(W`u +zt$g7?#+794y?*X8mg!F8dSN3d;+QE`d-QFucrjFe!Exs2$bV1i{-C^kTlDi+aTEId +z&|aeY?Q$aX{sall?z2Dd~T64vty|k)NMi^*!4Z +zxI+JvUmvQOy7{?2$UhWowtTlr@iN;}({fO3=0s>I;#C(*Bbk2l_Xj@S;u{u%7r_?% +z-o6r0KND`vGs%iSaB)|!&)PQ*M_(OlIbYeG4LhDPRKKpMh?)ZmsHTOiIpd0dgQ`jc +zNPSYnv((6Dh8`_dY|7Sdx`m!+dN!+Ig!D4$g%?tO`%>7$s4`~f8+|BvzwR!zF%V%r +z)?3?P8Ggf?^LFkeRMsj{5Gb1+Z~TkUr@B&K4hE=oizr*Iy9!*M2ma`E`}-!e`J+gP +zi|kgO+(1A>w#P~FT4Q-N81Df1FSRX?jJYR&&f;{H+?JRyQl3Za#;>?0+jG*#-O3^& +zjbKQ<+04pMvWW2+t1mw#^?WC$V11=EA{nmiQbvW2^R_?T5aS{`C2_Q~`&!vZ%OTn4*ViGIKsZQ2>Ny8rC< +zFC1wS+X3^ZHSz0&uGy!GN+QP>B~!MR&SMDM&Sb)1uer4(dnF9(Ne4GiR}nPl<9SoY +z3hZU$AZ|y*WA_t-7P;2!O{|xcDs?N;iZi56tpu2SQ+q@;v +z+v1z(cLD_V4#pNUZ0g~92I;CAU_@%$T8h#}9`H(h$U+OzN_EA({LeR8uS>#kLriUa +zr~}9lK8LsC63hqY`yzEwPs~4cm0qymWnqwAgh!$5ye#ik0W-q=3K +zyOQt&vx@!qAYS;Z=D`SVsQjR~wBRJQ`9MDnI&8`j!Mk_F+%oI*#~RJv$R9*7a^~+i +zB<3!P*gbi^zyyUm;1rX%=Oj6-EeJe3$eF7(Hs5wtd0SZ<-8e`#HS33mqS97t#oiPS +zX8x;?<1+p$7u-B(J12#C-gwX616QrcxpB3v(?=n0{%rc&Z&nH@oo{P#Y{+irA1@oZ +zISe(8Lu&{Nm?l@{j0NmbtP?;H+{BWN+4G!iC-rl_7E?9q-5+uDx6RjGXn-QXloph# +zX{{9w(3h~|&l}!O`F%F4Z4`Y=DGoz^*w=~`Pg5~(b%MVMs~T@_$}&5FSlUN-$q!oJ+btC)B7i&oq}UjhIGnnR=J)!y +z9>A5Mm`DuBerd%9q*c`B40cQ;LJQu7T)S{4LFgtP-9mqNS-M@R)mCoh6BAn!LW%7h +zaVSb0F5Y{G46gGNgFjpb(M8~?yoH(o^0e(Tyypk09lm3c=Pk41yX6#V(SwVAebG>2 +zc@hp7d+I$v>KLgt+wQ)G-F)CPjC_3ZV3 +zuPo)l5}|qSF9#@rpB+?!?4=zDMfI)RPO$2*kXMEx>i4*jW}L6v#84T={?}e9gC3KF +z*EbXlbbx%`^N2i)qk?i4z_=n5vp}o5TZ_7`1XZ_QnCXd1pD`MbrWVdmh3X8iw!a??Ay;U_KY*E0t;{(3+H-nI3!ue=S`k4h04ks_ +zj|$EnDlXev&MS8voY|*s57bxXYr~5)Qj-w+e|K?jGem8d(LFz#_=$Llp&q0!*aukY +zV`@G+U*)A#&A(jTHvONg+{u-0wZ@pT`r%`(M3!WQEPw*G-p=m3wfSEFPPumCB`~Wr +zV=jd04QyE0MdZyI@>>*U-I34#&h(;aQ&GPdtY*X>M6Vg*{D$Ad>-$SzswUH|G*@?9 +zVa}7=)qg0^XbF29mim(Fho%ZQ{RC0w_fl>Ehc{OWKI&0O49xmsFu43?L(lCgQwj_w +zn?x@6MsRJbCoee1iGLyCrv^&#gY)Fiof$vDdxckea%VCF>5Aksj~dY8jVVKUuKZa) +zQb!A2d9oT)M^<9=~Su8AD*E+sFAcj2x$LU2OQYgTkkl66F +zvQu}JOucVE($XOW|Jc7?9vXp0o1Iv04-hPCZ$$s(P(htFiJUE1(b&9nJjXbGej0zB +zMIC!4&4M(``i;MAGA4x1QcGh9q0=4xz#nA99`Z${(2~bP=wPQXfNF;ER&e$GeCP;3 +zy?}bq8gZY3ZRf+*(to95hOfKdt|(Hww0-Zj%_uPyc+3}>HC`%Iyx(v*4M|LNbv`rX +z=Lj+xx#?k*JDx}==)EsM^*`qOodKq}26SXs3PyXJmc|m`)d<)CazM7^lj}UNf42Fk +z1wzM3A!SWjcm(GR6E`ilKHD0A@nxH$1o%sVXdfd^)*4Hro%D%HHP!$l>ikxFoq*&T +z$z~$-Gu-?HGG$!Pk+BiM7>Jy8t_)(%Jukdd7 +zq?r(^T18;bWZ>f!HvVYul%-l4-mQfCdX?pWs&>IdWzy`&tj?LVqS?SfWhO^CK*fwE +zDR&^Eoab_gdzaK_>zgt-CZ?6@;9onKVWuCfK&b8E&`1pDWg;Q=qF=q;uTWb3qMQVr +zd<;fkfRn0i9YMUkYYb2^ChM8S!)x>Cvbou4t9Ey}60CB*vq}9N6-80@SSEHkgSl*9FEcP&)@9 +z_^UuiyFkFFIt8XAvhZr@C{l?fXlX~XH`{+ME1c{|IiXBS!vCJ|BF4b#ok;Yj3>A0B +za-ow8@6UZ%28%aZzn;UrpdpSF2ng{&v~BESKM%T`tqDINypXcHzc#&JA_f(N&!qgRGfA< +z16heu6hfyHwtT+x+F1kcnr5$Uhm8wyituo=545;oobGyK;!NtDY2*SQwb8)A4h +z7u~z7_&lxs5n`yPKg)8ugRU!!t1Amd+hu`yr<*@;*G|TeX22zB$3kt^Y0*6bFqrI5 +z;)odQmBf7wmVP+1R=P!^xpZjitu^}C&z&jZxt+{LykFh73&_v9=+Q4q$$oX1cCSXc +z+XLoICOX`;z8`seCOMRtHdnVp@aR6ML?j-C`$qO^0n7u?`W>4%w=@hE_*OqRHaLiXzCLpbEhl%ID +zq@o8;qmEQ19b$-ufrNPobG(H{3XIF-3O$3jOCyB>&zPzePU-T*Z*Tc|faTxu5ica} +z-D3w1aZr`@jyr3)8(T&23&x*>NIingd)O^wOgS+ch&z9L5q7J($Bnq2QLk_nj&w%IohJ7jrxhXg} +zv-kFKLTN$yjdQT^rHNwzQM1WczcBmI7H_W*D$%plP8>+}ns6SbR~g{T$rbXBA1Wj)mqMiJVZPGG(vL}3lDi4@&k{KfC)w;p?8>vw}zD&o_+`hhnEuKdl$jhQC@6ar`hDu6#~$HX5I%k$EJBDj +zxUY@@UYLMW&#w>$NL=V?1?%Mk7=61}cz0mks(+y~Sv=H0Hr-AtoG{y;qL& +zI)GvmTjGegZ;`gp%A13e$e`5vjzjPh7|gf`A!@^gT#Aw?iXP-kHI#-6;eYvm55QYS +zQte0IqZ5EeY~O)b3mcl-Yu=-ty!bn&Ci{ZU0b}@EAa1k1Mgi`}@Am!W>c5?n%<-Sd +z(;lEJHB;3GE^qjEg8K4JRIaQUfHi03{aYuO{+k3nxOK_OcG@NoTYU|HBro9vY1CzF +zMYi$59{;IkK#rbsw{VWz(W9S=6~#fkzhK9c9f7w&zU>weS{P`UiWCWxBuL3)qVxX-)~7LA~-ugxbDL#hO<<&Hw^+gi1C|tRifO7Zl3t>kZ1gF +z^&UOe=>6h`Q3-(F6NC@l@a3S)EYL*gd&JOeej?_?JjW_z9oF(_On~xf;FI3YZ +z9q)ks+~buWBx+_L}zE0xd6rXA7Yyf{X=>2cl?l# +zFK%apT2$!WnRMH}4{KrkA%0Ex*n%DUj2!RPHO5b4x;g5hBfcy}EYufibRlw7Wywnp +zuO(!J`(9`b^Y*JJL~Z97T{=;~6&%?sULOt_rpb>6?`F9$B#?-^p>HcCfLpj}xs^{A +zZsSJ_Vv091EH}y2zY7}kqqZ-mhn!LeUA-5z!N7>s;KR6=zoReC%2{vsYHqEkBRm|M +zLU3$F*dso!zIyobv+h}8ftSNuYT|ZOUKs%w36rRLZwi0oMj?; +zTHfX$?Nn!_){b{7&-~G`ZT84J +z+y!I3D#OzN>Yg|~w(FAdl^sJ*M4AD(Ga}YQAc=0rz5r+(ZcM=VapxETAb%wabd*!L +z&;5_a&m2ic2}GVfc}!NEa^l~%O&B}vX4VC<=eU|yARTnH4lZtLr$?7V09$S@U}FFF +z6pY_X6}W|v?+RXd&3X-*b`gsDm8L*)DC2;|G8+`oM{vgLyoz{Q+qNvfbg%=aagUIn +zAh#}w(jo`=PY60A%}hSsEKizI4Cn)&G^iR2P$9_SzUD;gPs2$d-pUZ6R~!cJSUqd=Kbx`PNh*2+cQYy7R^lczHWY@k +z=O>;ARASc9k8jgJs|>{-ADZ_a*SdV9)5RSqXD$AHQ&2v7ly$jvRXcQ$;%NWKbzyKN +zF0Bvkg>wp0!<7{w2`X79ugy_yKy2m&jOf(rD8s!bmdu)v-Ce5k)&f~6i#7o8Pe~V0 +zev{IdYOv0;@IpTsJ+38FZSgCYrJqLQ*XMZz4;4Kle1E$-d-!Vgu8-^xX8qvES*CmR +zY%`zoy%DP+$6TfB{j49^6=(k8U=|haH8lA!zga_?-HcC_Mtt)7++E-mwg*3@BRsWuq>L6_L +z?YeQVU(g=nSPB&<9Iv&Y|8#Z0#c|smF)+_ZaVCkCXiQJxB^Yh(Y!h~q9l=u@d}U`V +z2YwtJBC%e%b4xFy+A4ebx{4przdYla|8F(B_Q^EimHjmHG}ZXKNB+YtHSat_YP +zOJ3cj9#WEXSFV=TDfW=-6|lT!$Z2xhXBW&uoQzKNU;AKgGx*Gt#N<+Ip8No9P!8Q& +z-)$rJWFU%O;!B`9#(W_7YbOZ67|T}X0E^>2WWdjG&4ur4yxYYv1%vf=#ENBH=+SsPq9MinXEC(xnfqGAovUz#Bos@S<yh@rMJ~mjC +z8hY80;)Y-?yUrbQaEoyz7Vb(pj}zEGKSuYhx0Ug~W(gzh+o#migWWrI-I|(CHwTBiYG16KmUD3hnE<#nL-rT4QN_l37 +z3YOp1Ao15NCAQ%`HKg$T6yT=}glIBfp>NXLXr^Y?-nci>Uv%0@Z@$FMda;mVz3e~e +zQUbfZAiO9FS^()>B{}~6cgQKLEp{uo7*}$((Ksx9TEN7pehv?U)9-btN0Hs>W`5tp +zG&BXhjc7u4T!1wRr7rdxT2HPV=&J6BoB4DFg@{pK@**(JPsh8IxI8+>s1{P^dkrXr +zaZOdU))s&Eukpso{47{jVi6Q8lBN3YWxun-Uzb5czVcog)6C_h+Ht3AM^ukI!HC~4 +z`f(YLsL8eJ{R#bO{ziBwc+j+`(=D>gQD!b>)pJjx-a|kE4WvVw_k3#-TWCdn?tWML +zuIqoAcG<;UiKt!0Yz#rj>dQ3Z%Ry@9YS6qXBr-J+FfU@*UhA5V)$=7X5nppn%*!in +zUCv+a{cE&HcTvnf&D8PZs4?EEbs4WMaQQuBEVu|_@Ej{5CFj#=|H+i__A#UCsWn#m +z3Gwr1&z=xZ(yOEGCiHo%*(lC +zo)ltTy8AK*bR;kcvjals*;H>P`LZD^i3m1Xw&Ii5GLC0JS9!Fdv-0m;?BWX7|IV(L +z?6FZ=<2?{`HWhQc*(DGz`yN0PQb1^%Ub$3)mLcGV6A~&ZUm*pgTU!d6eUl1sL_wAp +z)xe=n_Zwd_PE`SiU0dknw2NT1@K2ZD=y0ZRJqq-;<>?~%IG-zpW8uKQO<(5a1EN(_ +zFQVkag?N>B_6hMASFG5B7ORzmXvuJ@{o8=p +z4PrDfej^Z}h9`#&Tm6_Dr?>g>MBAp*n8~L4zwk>=3Nta>TLH~;=1}}h+g;F6F%jpQ +z@L?jr;>BTwS-XyDz|8zmxe%@p%a+r;UYb%d%To9a>-IATboi$zJikt7L_A0vWPjhW +z#sIi~lr9I-Lfp3qZm_@DQ^P)8LL#MEigBcH&S__V1!)`vh?v-bw23z=b~0Z1UYKsi +z3M4N~*#j@hJ9YtIPDDMxm=spt-IJ0iHx0GNzLNNADg>Cq<@y!H^kE>E3jT*Wrk{1$ +zHD>y{ulYOh$wI6=XP@vA$3w*ovwtJpEq +zySQ_JCFyL`(+QDp?XkV#p`E`ysAv8S$|?H0Mia&KD@NynkpxP6iSl$hvsU*p8&}gt +z=)>Ra{!mjV?6x3lfslLB<=q$KUxmV}{_?T^{(iX}dCLr^HZl&}c5vaM(8VlgH=b7R0+;yD +zh=Eqp*N%bfs`dDB+=l@f9+IzP<`LiMrF|0@Rx6M0`rDvmI8aaN +zO9b~`VeZ)%jgQQRYI}`aGIm3uS5s%ZffOPk#Kt2|FB+m)Li%B<8M2$r#FsS2#_iLc +z$xa)7Ch`B8ZqAZD|H7^KpHlHJHJxzD8>#T0K7Xv8bC6IUhUGDd^W9&t_!Q)RD +zA#qfv3&ohKiO~4R8aBn4t9?ykW<_NUo1D`+TOZ3?>*AU${LGBTY5qUNT5V$1!oXZp +zq>#Y-it373qo4;R{5y94=5=b5eJb5Cv*DH8saN*&lc#Z}sgi-ok{x^=9}Uu(D@&Zo +znmya~RZ}61S+zEASg|ET2@V-<37j1k1S{O6Lrii~3J@SO_PR8J|%M#?xMG~*zo7n@&S +zlOS9rC58&<7wHy7n$6SKfvO&n6X}_bZXX0_XX0H3&AWL`09??Gk++h9`-G>aweA#4 +zU&zYC=^^0vV2W=jfYHuc|2zcsuSl=(|5yOq-~gOOiW1lOr4&G4UwrSa3lhYB(dIiz +ze_^XCvaA;4JX_J<{LcbHi3`SN4L{Npq8`xM2 +z>$_vS9zn|G0B21YNr05@QLu=D1t`alEnE2gQ78nStK~3$(PUG^ftIm1;!D_rNr?hs +zyDFZUaT=<=HTQE^mH4Ag{JKiT9wIBrwJLAi;Ko^95$|NYSu4X@;^%Vrn+KCzvqHA_ +zZ2T1(lol&H_Ujs8o$jRPP4tYZzgqR(i|QFG0y^F`sJ)X_gO>BbRXpLdzp5L)ovr*0 +zLTrz`&a>6XuJUv)=dq6-q<648geXma2noN9=C_)Yr|S#>d$_%2YS|C4bHr1t6g|0U +zaL@@4ctsS4W?HVvgIT0Eifub)_Y2-I%Zxj9OPp^} +z)(gllR#T#q#H_Z`YE3?7kSnK?E04cNnB&Uzmx^LuXZ?N)n@c5@)_teR`%CvxV6bvW +zyv@zah$j~_NuEpBTzt70$gL9X#|#kbFGDagnc1xO_(C~z-QxX4Oz8_oT>YIEA%rp= +z&^d-?6DbeAS$x2ju5;(8bku;G(K->lT3tx809KC?a8$5*0jFEhoOoZopnU1mxPE?!UPv)Lh7D0IoSrt}$=dY||%t>v$+9uuCo +zQEFi!bgi0VxMN)GJ>nn}0em?lmJoOC$z$2r3Pk2F)xHIKI{eO7Jk^0_`0(Q2EQ?BE +zgv&jHe|tuPR3<`Q?~bz|bW_*SeMt1~{a!(1<}%AXo1zSC +z+-OS1FnqX66@Fm?=Doh&4?1I^^_fnibwB2s|3%xTc&RkqF4*TXoo_zvsA^l4#$0sl +z_Oe;-Ky;>;VXC(BKUZ{3aL=hj3NuqX%~CGU-J!d%2|LH)PjtRjoX)N)r}rr$)Z5%ANORNCt;3IyMLG +z>3nQzd>`tUX3nFop-~Rh8&40#g@)n@>%B&o4athn){#XrF0UoKlwNfB?eYIzAZFU% +zJKJ6)QLR0kWjgb+agi4-e~VgCSs+MfNYDcp-ad*w3Kdakpf3w*NipF1-4RAT{R@d?6qEdFnTy*1z +zd3qDiz_B|AV&^3yFqEXqTRz=psN+woPAZdM-%40FDi$gea) +zjWA-qIjV+=8~aQb+D;I+rNw*Jj`?CssTu{}cmxu3&6#N_N1g3``jH>FL2R))bT!W# +zNb@ScZnMOlEz=O~NRji8)2-IN5Q4VnbX5U)Z_^21ckLTflb}bfUDoiP?m&(}&b?bl +zekl1t9WhX4ckFclolBLeHevw;jiNQ3-L^pX6dek+%ODS)7yIJu#9=95=d0w%gOd2| +zWid>hZ%~u +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 +zv^dW^k{uFB$z0<)FcE +z>Uu5HORnpN2QDtrMKvYzxKXEg@F4Ss=G0*XGW8oc}VZVsr(&|U-h{s)#7 +zlNN>i@f3k42NZpfZY|^W3q2}uX&hgdVN#^>gh;dsutXHBqj|!+97Fa+{`7ZESdYGd +zP}`UhHz!c@&gmCcsvp%RnAA{VlCS5K+>L(Bt$&&{RG;m%pOgf$$)C=EpE(i_xUSd1 +z3DU07y!sm+N6+S7vi`yA+PMZcNZxRz)Usz{Ycyeh=V+Yu9j^Y_|C5r;if%P7!lHl~ +zkDW8>;u!P56&w-9mtmPhgd%{R(ytN#J3h4Y*L>K%@nCEi#=1I2aT8=r1VN}An8csJ +zgi9zYZH) +zW7l2ly+YU=j9^~lmJ?5nJYV9?vX>v6KW3a_6&SK!-yx-%<`T{)>%6|kJ< +zi_8nYIVo}{@GT}32VzfhHN8u`w=wP0x=hKz&J&q9vaKqsRr0l8ea>$FgF5AW_0-%P +z8@#Ync0}=&if#5k952(2UnSdL^Kam7nHcIG(67%(t@Aqd+VWNX!qK=Xhi>A<2F@7& +z_;0HZiw>pw4>bY;3^$X7ZLCB5t%kO5xMWQ&t_;E^kTBUaJ11 +zog&Xfh2K5P@^{nCf&JehhndU2Lr&fag~z26%cUxb+oElmf!;#?-fwqC!{JUu;bXBi +zonY4Ay+5-lRQ-J^-`f9lf6w(VV%F_9M(lYrE%W%78NK}b6Ya{oSRgysOvj2F@fk_lC>>mtT@ON7KN{*1=O)7*$xYH~A`$=_AFAxPznMF2non&-wJ{sfQ|Mp-r0M +z!fxk5TT7?r^kg$p$+XY_pHQ)DoD8%1;cpwNsi|}@Yddk;ksm-`#M(hF*(t@%TYC^? +zK+n?5su=8){qbcy1Vv3N8FikQFS#nCpb+gs-ZRO{XrfR)nA^l2aGuVdJ3na|On>;fXZqNuY0VU~zY&n9CoqvmSdj1qnI92x%n!H`1=@ir# +zTKJeAYLPMoz6g4CD@mj7Bm-J_NCbA*_XH1UeV}iCOyaVILjf}sb5^EhlV0uKk_tv`-dE&5?AR;o^oI$EdsxH35}wI+R}bY +z+46}Wx_NwtKu1Ep*l2R2wgzQuN``bk(Jy;&_P$A$4~+UjN>TTZ0W~9KAS9(#7MS*_ +z^mMt!S_koaqz})&48!4FUA9F9&@%ePmIo>TSoYI|$xw+5RUMogJJbO<- +zcy6ycOiH{?AtZXZ1PnD$L==PNs_jCa5F40ueP-=y!*Yu?CEBE$6Eu& +zZh1t5e+i=95zM;g_s^u*yAhIisT5eu`Xv2;=BlFS#ISZSI*fsnP@MopD~$1}F^4X08gUvH2?@JnWYV{7L=$JUK{p0`5sO!9nbF_Hb|&Lk=A{xso&1_>S_HOP9%fn +zeu^y@f)S!zYVKA#+Kc4G9~!>MNOc&Z==+Uhbtqu<8_R0@TG;bpk~7b!&eA)2>sKpy +zvx#a2W$x?OI+`v~kAQm1A=0g(HU^0F{_tNOL2WpK&FTTr@N01j;f!tqhAwb|hujG@A +zmMRWZQajBMCK+|5-8ob1QI5TKsBp59ZUr&dI*^Sb3BZ@9=2Z<@Ek>x=Ie+#@Fr1!T +zUwRUsSA2E%lqk56J9^oZ{|-8H^65!;tOM=s@N-eF{_as0vh@Rn@FdooyXQ0WL^LTl +z*$LZGn5v4OAD7rXHyEljPG1E)d)?o|4tA0Xh)sVmv4*BSg86GxVcj_iX6RUK%&OY( +zSbwArkVMzzB0hYnm!bV{OdvrXJ=thB3~H4SafQ6_qr7pw;q@ktpPWqg$8eA(|FwPv^;&F +z3nGee>XzVhyZpoe3H5VslsP|M4m3(=^BAU5HS?PJb{wGP+HFLZ!D~ +zP9eaJc#k}th@`Owx&RH2kCq@9O_=C^Wtgd92a1PnxSEcirPodi|0?3}RTUkSZGk`N +zZ+R>)z>RpGQ#-E`im-sT=V+>poxeOCa79JE!DiJcIRJ$p5hBB)*FJ_tTX6~8QN;o&e +zj1TKi`37{~u;Es@aW0A%iY71rQ7B3X!``Opj?Ufe1UCwuULm|(2bl(G8{1*t7I1vm!dgA{+s(l +z&`!sE-@>>k5T-%Xn6!S+V)P$#TQTHMUug)^Q*3eLvC{$~R(IsE80+?hjuTO#{UK_eXvvVLu^ +zKZRPO{a&@Y6CW~IJH1@(R?f1eoJ-k4O;OA%$LB6Okg!YrChT_#f5svD5X+S;#PRnU +z?H3)-K!Ev@2i(ddC7y-h{leeTDJE$#Kb1>=g|L9q=cIsXv9jYJK&}63^%KqYQNiKt +zm%{<$o#rz@ZUrqSo67RsZLsw# +zQjvxX(;G3yijpqvqI{x2+xOycC4P=4Uh26m)fi(3F7$b#l-(_nt7PWpZaC2d;`&W& +zJyGuQI=6wd$I&%KoC8gJ?BZq22Nk<@%?=+zmloLlyxj0! +z?vBN|{z!fwSY94^ci2q(x^BU4=tVojs7a6F<*QGP52c^iha!wbw}0v0AG$cr%A-5h +zdG2H5~6c0Wr7{)<=(c?2z0XYLYjW9F({ +z{D@j01%hAcf2)mji^3!8zoRTQlFXfh5F5p~ZO`1$hH(DCd_rX>5+KamPtog@zt`FT +z4;J(`aMGH&9R02m@2WvF%aoyd%Yls5RkzOdUERC#O9mJ1KEE#3akdLy9Krk%XlYNv +z50Qc29sH~*Jr3d$xyw|RNY;2gAL +zTJ8lEqiC!-Ugct?QTkk3xvg;hI$loDavG}Qr+}GKKEa#SHv9^lr?73jJIu{35$*Dh +zqYGLNFD&e+YNcSm!{KbRGz>;WB&DRj+plxYD4>?{=5o{(?10RJLI=iV;}*G>Lgb-H +zH#8*Eq}){1QPV=Wo!Wy8%*$vE&z6X<2+dI@ADOxcq>M2;^a#*RYxGza>V?|yG+iI$ +zG}>R`J7WEvCqG#_h3};L$CyASkRf^$z2|}YKv?iA*>Uf8DEoKIM@c`HPf)_-#Z;#0 +zv^y6p;nO^-L5Vbl$3bsxlFJ3xekfyI11*(O&gya@h;~{~;*G$2&O1L& +z=;R*NP0GM*0JVCQ(8%mqE4C!xui9bq_w*zR|aJhYEzg{)sWqAsuY|; +zTGgDrY09jSVMRyMmZ*AEIK%!uV`)hWQjx&XtBD3n1>!8;QGrDpjb35Di$CgQ%AS4(C2sfrF>{Q +zgmG)KGvMRmAL#}LY4qu?4_gB>RkL~^X5U}xMIiYT_X7L)E^Jt#OeoX+2TZ6QPsC~! +z)c9Z6#KpdqR#GMz9R!NMN1%?$ljhJa@V8xjs7o0m)j3cT&5yN9f4)<0H)hOp?0NAb3-0 +zoo7*M`vWr~P?tuZpj#S)O2mo-&hP#GaCDZcA4f9lgByq$Yv2JNq3t~|6n_pv(&vf8 +zTbZ~9X0$Btyxn6~3*WR_$xI6;;K73bnzqxzRD%Po{I>qD1t^H#G>aC!ur^L>j1OA1 +zF{Ar0IjLOLyN!2wZxnHS?YVv3n8 +zQ_3g{AfC&P&KV%%7*+;;#f!L3f5v^-kF*KC@(pF%nXS)XW>XUvS5Yq>VBJz$2&COu +zomH`OBh4O4%B;K{huR^2Z*vWA$l70F}zcQ^o3VkK# +zfas(+{Bf1sOvAZQQx>0`cT%=sq21(nbchjN7bj{B{4@P$P4BPKLG*64)4KXbsRGuF +zBV^YRk8DQ7A?T)CvjCPusUrIDNpIO<^ODOjHhsm;jzdmT(er&7b<*hr=L?Sag1;NF +zn^JE^SvibrTKQpGTA?aLHO2J7=YJ^Ts1^X|o#(F)pZ8K|$%yoh{&GD%TLq;%x6PS9 +zN+RSLo~`KxZ@c&^Po9rGzJnYL +zgt#$EPGLYxI_LlLVZ?-`KhVPMZfxKNGfy7Uz^sj&s)i~ETb*#9s2~Dp_13i{h +z14upqN;d7-L}HXxeaP3C(9zB_l769)yLxbDShYU(5iW8XWI7gIppuq$TGZLcgNRw7 +znBV3Ha-kP@`Gxgl)9ksmSXmGs6aNSr~YGS(AhV%6FtISyu~trn9>&3Ha3>0fDrALC$jr{Z?=eP1B+IW9!$okEJ*S +zViGp$C~{3*d<{YM<2%1}PS#{B!8Qk)X(0v%M<5%8(ur^Q2K~m^a)(wPN?6d4u>tP1 +zm-QkrjndbQS&iZ_n<^lieH9WTY~c7+ic#Qn?V>SUypEXy<~$L3b~Pz_>=Y5-gcywu +z%*|zNMy2s{3Ayk7{pb$$AetD9Piob&ObutbhHfgQH=x+OveXucuRIBcUZN)h^XAg1 +zSsg!eh}W2%bz>W}N>pV;IX!FRNDNElbRT_^x9+jg-l(W+>gye8{>nR>wwQ_ldilQI +zCbbqHnIyRO3qWv<3B;J<@&U*|f;A}}4%>liSsO&2EkY~$HRxEXRU(}j4TY#Q6Q(A0lUIIB$+{0JgbDcz#RzgF&(j`k#$MKQ>D(Gc) +z?#3Cj!SLj|ueE`8e6~M3Vu+O$-ukrP_4>IeACamG0Wla549BUZI31c{rkkloy6XbR +z;SwJf-bo@s+v35W{{r0!vr-hI*#!7aNr!wXEP!w`U~o6EkDc*IyXS3)@|AJ?DkgMR +zo`RDnd5#~3&Gzurctgm7Hpn0g~V>*FaP8x(%LH1SM9i` +zATbk8v_h#U3@Co9S<}*vCI>GbJP~VOfI}evrcV201GN3cI*;_M}Km%paNcp-G4@~Gt|95{eYM8TuON(E}>x-YmAdhRs-s8@%;t0Mij!>#* +zEKA3@cOcJw>`Pn!LHS;IEEtmBCJeMx8o&U-v4;L+C=T9rOz5jg`XLxmZ;qi-I!y`i +zyvzc39;>oLk11)TRsd5K!WroC1E3Tvn@pm=jAg(RU17vtIGiZf&AVxUeHWh_p)DVX +z=0L96bwZ%G#PU1{iH`PIu*W8FlJt<(%`PwTH%_5w1bO_m)fj&e9T1DW8{Iwb6TKLt +zV(Y3p38s{0pnSbIN@C3zFpL`Lq&9siW{9rs1+fD8_GsE)yC5J+Ue`%XIa17B8(GE^ +zlso;iP|N&F-hPm#v5Y<*W98l#bt~?l?-#AFx{s8wX(W$Jwrd9$uF;#1^dxs&y0_0|%sVyib~3hx~$IhQz@06)jT_-Ru`6ImHRL=;zBHCBNga3v-Xf +zZjy=QwsTTn!j{t%Tfm4~2nx9IQp_S^;fZt*N^ZcOC2i0f(|~YtaL_+iB=OX6{~9e& +z`odn`A?)9nI>&tN$uqdyPOxg}+wdU!f|rk;2Yatd%`L7UP7M-cYI~k9bz)!#(BIsg +z!1C;~+xY&9MNU-Kd?1E!cYpbmubzWi-bh*{)yI0OHhLWUxJg)Ue(87Z4{GP@mdxPG +zw5f;JTbB2$Am#Wk8<0y)%P$k*r;RGiEecjf+z3K16{A_+V*a1c-ve}U@7fiTCfB|i +z-8R+L;}DEs>TzLm|P7^ +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 +z$eWIJ(`TZS88MM5zM`8#{ +zm>T1|1ci+CE{RL7g>!^pQ8_ig=d$Trf+yCm|2lx<)NM9ByGC7q4e$(~PNC`=JvqD# +zvdYymTQRY7+&Y!a>&>e(xkcsG!Cs|KBR+BeEvy2)kx8**O+akbZ90%;O+{q1_Yaccl9Tk9B{bbk`Dg=a1y^7f%qR7j)t)Hh +zFJZ|X#uNbRY$JpCq6(u(g=yZ1rn=vb%9m$&Zra0lB*##=n*r4^msmQ`*kWpUE)6V# +zw)RWznd=93BR^U=t%bfQM7F*I%+3}bu4#k<9+)qKFT?Pa-?IS=@E5<%v99;GauA}}cz`CCgv-i75fn34f(c|dH}Kc!R?~{Wk7iX|Bjl5W +zZ_U6|A<_SYUKrYuQ;9g+9a@hPb(w&>%&c2%Vj}>o6Z+N{sFYEkm&5VQuDB{5Xbpxs +zv0+yHw-@edA%J9FLpGf^lv*;pNdN^PQDRmorKBf>lUg4u0m*GawdTQ#?%UHeA>-@R +z>44~-Qxg}OR{fg`1o+=Tn;y$Ft3A>9Ak0^qh4&4^`irIlh^3C<&CW4~-Xo_u$} +zH*x-4T*`Mo{881VPnaqG^l_kN>=7=-sbM3StR=zI0YX!eqYT|VWr5&X%cC2v5A5PK +zC%qHCH4%F^d(KyAzK-ZQ@c)I?TG?{&HYYP4=0#TF)LkY;J99b%%E~l%AaHaF=Uas7 +zWd-xj&w#{fpFII8K>JwrLfujd4l(ul_1d<5xQ^AAlr(jNQZd+%?jqeo8x!zCP3f^f +zBw_sVit53_3s34>0JbR6!6!jZ_T2319@|KNt<$HHhgW?!gywJI67E%YkV^MiJDN&d +z{QTLpk6(=cygEi!7R;J9`_hyAA9<%5B;lm>Ri6~)SGrkk3c&bJ#mS;8sW4JAL^|v9 +zF5M1qkcu9PXWU@>ElH@Nd2GF5zL+OONud3ldR8&doaa2aFq4@9rFI;Vxhr`93Sy9W +z_mEFdcMYTc7qM&jbI39;V&Tu3I!;GKU80EX--!r8sRQLV>FG*pbjeK_{zkZQIZ$?0r +z>qyCDlzs3%I@y$$JYdAWAKb|UBPRwJ*3Kz`dFBHt;=9K22M{!xe8a^HRR6WxR;T=+ +zk$>cyRGT=_D2=4eQM_Q~EL%XA?M!sc0zxJRE>~i#j0@eJaijhH;8{J!3eg4M3E>xF?V{C6Xjph0e{X^p_yI+^5+*Ptzs=<2UW*EZv?Uo7WVvg_8P +z&VaJU`LlpU&ct_~699O(43r>@!nzT+c}Geg+A +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 +z5~^>_*n#=1^EnN!gdqptfm@bbA48Hyc| +zQAu8-{AF5em~qQ$tO@p=Tcv$rP?g!{fh7PHfxTeheBW-FRQDSH6h|1NfI=YbD#DqF +zs%h-xkE-Pv5Qg~+3yd$+X-aeAZ3hQ!$9@srj3U8G_ld@k;{JQBO`Yz(iv6oD)ALDc3zGglzhcz(_;q~L8!z`(Y#uCu +zrZ8kPb^2o^!xoRGw*rVebN3i7&2PrSOe1o6Z$yuK*>~D$w{~0xMGq_4OWGL#S}Kr8 +zZF;nU!zXujPoQb`gBXaWYFPg=E$V&F-a)^`Zj@F5>iSxgbpMgmD7NBfkiJ*8wh!Gb +z0~^Cd>)R1cVa-Pc!UEmVnFDlv?^1Rj-b|Zzu{}F)WZVa*c8&~6pyZC(mgms)E9QcN +z9Xc6zzM%!V5{TOPIoH8t-Bh8TI99B0I?M-2ixxu;(ON%g%+(6=zvD$^S+Ab5JLAtU +zJI*g3pv|MQES{7Hm2*68{zdeb7e#Vhe!|odcb3Pq&PL+0EzQ8Q{{8Kq<51gNP-D}_ +z=F2r!qtQi|cNjr94&1e=rn2ZMhtG~;7w4TNah;dbQx8XmHzZ~2e?o4>w&U#M=xd^t +z2A&Ao1ar|&zbJ|_Huyy?ZoO^{b3W0%k9%d=r#`pkXv5SuAEP3e+>}r=iuGFr=XdiP +z{ngo#%v7p!`?XtHrGw~;&P$P>YO;~&Y?g}Ee=6Qrb=8egLcb=;o|{z~G#xjal~6vY +zoY&69gi(XX{@II>eHB&Tb&8-e+I285NLlGM{B!oTt&^n55ah-gm7ILCuq$1W6x>TZ +zxwEe8FF9$!R6HSjcg1ajXpv0 +zg+ivrQ7)dYzl?CM8|{;&op;dZ6b?+IPBG87%r<_D3=XMbUds}o(7N%JJXP{ytznMV +z(eVeCvof^ +z?^}bpVvI>X?F>>2Ffss)fd&DnTzJZD&B(~9K)f|MvGTNXQ#(>LrRYg&DwS@^K15gN +zU0Ao_h;A~zexMEc6#&JkKgHNSMrUYY<~fE1l)Peps2u2dC@lNI~>iU`| +z4hlxU@CVGHJ1A>#0p)dj-Tcm3PEFHvO`Rz0CQZr?5ANsFXxK&Q5^R3uD;W3;Za{W| +zl7EMSOxREGG50j0z#_jfjngpZev4vlqbpj7cDrgoxn{T|;{r?BpmZh!;9Y6t`G8;= +zrkD&O5*r-CbkeQ-jQZuaxo6S!)o{lX&5i$i}5$a39w$=zNt@WrEy|G%aj08S;8n`-P-*NJc +zNA9{VJrR`(O&hkS6uf)RvKCG| +zQ|ve)lOrl5@okV3RrV*Mp!b3}Ip`nXidYw#IjUYx|TaqaA&Lv1<=_ +zbV?A?1ko=;x?fbk{2dY6CsC6t%x(bN2-goK2ZMZ19N3%{eCHuOtW +zqanbtt^FfY5DxOkyZw1mL4Uu0 +z0+xbpA&=@6KMC_QNOdOCLb;GqNTSh3I~JpY=U+dR0KRyKoaiiAU!()uCXsNSh|q|0L)ZbD$e9by)OQ7z=eDAA +zS?YeQ^i^EM+FQ0l3mJin@TI0IWl}BTEU<=t$@dGtF70Vx=jVyFn$r+l&mA=^W0x1o +zcb`Oi8XU^!ZCd7*>k4MOfCn6rROOjC(ESuEvxB)h;d&zxI|)SIoHtgShNj#PNud}c +zE#?-MG1{Z0-->P_m{-jl5^G>(BLeCVxpx^_L5Yul#ms`H_@+`Q>gLe)g!9$>Cr{^M +z4LEk+p@9qhM8Pw`^VIif8Gc6d;&h*=s+;I1k#&!(h>q1ABP>WT3=Iul10uf>U^4G7~Xk>r; +z7}=Y)W|M}UIl5`M_a~ZP!CybAVm!NA&SLvJQ0703TQjR?SX-9TV8ss${=PsCg}Q?1 +zs&qxQH`mlt2D&+8|1~llR1#QxsN_1SFNIvWt38SzWA8b>WqiFu8OMy?B0a%=ag_4X +zGq94_?Vn$PG1wp?{wT_oE-`?{_@j%5f6CJVae9A>Q5D;g6&BGfgRoqdKhuZMAML@9 +z7+suR=}Nk`#5E2Pt7;2OPY|k-;b+2=ViU$PqF7@$o{Bg;`%d`sJ8?$-m|+OTSKi+_ +zPt_@>zmqWeU)4TLpLsoaFr4Va6CKp?klGP3M3pbTx+#vZUfE6#*=D@%80ePQ<>8_$ +zvtVG2Ic$7=P@yT1>4&Nz^*r)X3>K!pF=XjKsP6j-890Mn8cL++%WM+dE2Z`asK{J5 +z6kJ#q7qLwA4Cjy*F9)mIG;58$!JmN>N8D#vht>)DPi8c3e%6Kw>C2 +zTyjF}=r>9r%wp*x_HRP2$JPurVE3Z!3_KvM2rendo(ru#EZEU~Ay{p!Jo)bw9SO`m +z{p}{Pa^rA(t)f^PD>rqzWTUy&Y)hqm@;}Q|x&~vjO$(LEo)H>Khf&#~?~zYMzPmjm +zJaG6%AI}sFiNQ$vv@Xyg137~-v_nY*)7C7&#cwvFliJ-#%qK%WDn26Qbz5 +zYdRc7KHZ71wRohCCNo{z +zi`kLR=$>zHB)$}$yssM=)z@Dlu1sO$$XOoqsU;81-=p=+byX%d +zg5u{r`G64z;$#c)SqD+B^n$@?ZKKe;8{e_B9& +z41HU0@&|(BL*`78k-0Uz2#;J8x~ca38~w^09IHH!N6sSnJQx +zZddKox@(%bK8Ga(FLh85A@0{;H`-^k-aGrbjbzQHzR*O3DEQh99!D$9odK00k +z64MRKgJhdb?w*||3}C3li+jH3_gjU>oi*~ZhcaKk5%vhYaw-s`aqb+D}Mvy9%cIh0k?;;7|@@%Z8Ca(qztgPU#T +z^37RuA(uH?r1eJ>r4&fVFEBl90=vtVoKxl{>*+Dd&F8*Y#2TvtZUgQ0A&N||ZBBR5cK40{-ob!pTB_7De(=CC?Y +z@cahmX<)^uqHX`Xx(;~WH8bEE#>J4nAJrlU^4$C92*M3z>XCxW#<$H`k+oOXFw*jI +z?Py2F98>yL@P?}>`F_DVnab`35Uno#ZL9}|X~>hYjcSOEdXmiVvb{qKx^_R%JeA_* +zr1J&PKXV#!*}q8w5;VmyO;pM>xB+Oj(e?seQdB3+@8#5$?O4b?hA&CHumM#v?x5)v +z(Pn<~2az4rU)O0HQdKj>1@hpQ9+goYR(jzLPsPV{=_zdu1IyoWp80a6+i>^3_CelN +z|`5C=ozpNqAVvu!s%EH!$^4CUaN3n( +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 +zf4kP|JbQ6S)QnD1Q=C +zP+?#?UaZo2Px|AQ#gmZN5{5+i>r68>)cLQa`^I074&lE++#4M`{>ziaKYK)Zs``M- +z&_W=-5mRxuRY}g5-xu<3#hbpRTqat_`>#qh(;od4ht_@iU*#pl`H}MOFNs)>8X+%h +z0i`!g$OA6K=^<~;)NpOGK-EWG+XO>f8~KM{z*cRFg&_s&Nm1RmapSgQFRgA79iH0#R{fGYni|${;ne>;f#vbvxMxuxWB&Fm +z9qs1=hSk1&!zUop>E=hDLrgnepnr0TdE<`w#JF+$)$W?cj*7_+=Bi((o+R6ZoP?5Y +zeUop;AfgQAmyvW235pFPfEZgzLJiyV9=s*=GTj%C(7n8vLT%U32v<#mO%43q7kq?f +zO}QQDY;e>{(<)%NulVT|6+LN(J>A78&xD#O`s^GDNp{i(;l_bRYUW%A)LwUdnIfJj +zBRC-D&31NeruQY8u6Y73I2{!U#wOpcw*MIB{^x~i<~IoPPD5Wjm`XV9Cj4J|L-GgW +zCmew;SD)Ammv{qz&>4qX;K44^VCU$%+Gb{lNEyeR-^NP^$9jpG5Z5fSf>)NfZ0=s8 +z2qt1tel_&uh4EcmSX_4sa^lWPzUgo(@yC0JaFYUIC+ux}p%k7GU&>=+fjLc=a$lx} +zL##sjPPXFv`Yb0sm3m;XA>iu2B%RszuUzZLfN;;$kDh7WagkcU^ok9IHBLcNNIBlb +zPwNRt$zT-{PiUKGN0m6lSa!yR2jE?ITMS!xp3sM(4g|9sY>Y51MhZ%Np$%FLFG5iZ +zoc-GjGO^`?*790kE7G$!jYFgQbdihy7?+%Rdpmup;rNLbyt;(&Nn~fTKOf$257=m` +zfyjT3z0IwtwOVQ_nm44-eUc5VuO;W>AOFPnyr6~~0~=b7!{r0Rg(b<+&+r)56$djkIbp`!F9>ApEeQo}`w0RTz8oDc##p^`33z)r|Lof=bv$Pjz%{|<`7 +z$vJl94^9L(uFuHOue`h2D>i`0bhm~j{;M;lj#Zb{kP?UXUos(D@EO0p(+U;l6UAjq +zOC-^i+4s0j=597}uTyt1qNUFX8Gg_#n1x#xW3*FX1ONZ$1y1%|Jv-lYF}hr;1Hz-U +zQ#s_^D`k*L<{xcB33$J53BS=Vy`Hz09pm=X=xipviN^#4<4LfdjKz`~HCXlq35)NE-yJab+s9`}4YowM&t*lw1 +zWGu~)>YtK*(#4+QCs_5MAdMI4b8j3exx23rTV4`~Xt>?8;Bl1H>YF0N*0sZs_ +zaqNes6G21#n1ql3e)y-al)Lp$Qquzv=Gjs_KAp=Ov6V_yzuHmNCXo!(21=bC{4xCa +z^Ya$9W-tyF>czdLoe9>*pfVEA)wwBPcGj>e{B~W*qfMcvY^6qaOi>E9UN7l(jfK74 +zZ?wM+xzjI2`UJr%{zvVf21_fcvu$uZx1N9KeW`v+yqGjJy)CiLg+Nya0jR$_elvo} +zRMQLa{0th}Zs!SwU&Qy_yUufsT|)AP@`5BkN5WooG+_N?4o_+f?fE9L_CD82P3dw8L%H|NR;wDUI{AC4Hh*aTyEK0Gpv(R +z!3IcJUKrM8uOsb%(?zyId86D{Ekj#Asya4_ETX37LZp} +z$JQNYiNTX4VpS7JaL1*`xt55{=O$X!!io%Y(8wfonQLI-SF=J|$~ahbn<6p5E1vkm-1+Mx{5cP)b_ZmTTwsP{5?LT09y#!JLVC$_{bQI58b|8Z~ +z{6tS@*8{{OL`q6Wy7^UE9*^nV3Ire7&2l2jg3GT+fi!((OP)KiUU}wDb$s1h1Bb+q +zh{NM=R0;+>0uHyBF*ZZiDwI-`rT$8Qe6CW9HBt!Wb7MkS5PP3i_(xv(ppPNNMz(v3 +zI*X!AgL~N=JlY>`#K+6Y`aS9NoD;J&2%? +z%7pgfUl+vJM`8DZE9{3~>X`UqWIwoT|9tnB(=frCIjKWQHQx6{A6mFLi`bmmLV;tf +zbwrZj(ZtoulO!FY$Kvy6VOVDQAtv>?L2^z8G_?#R(n~@f=&wp(rIos@iuw@qmkeuz +z*v^u2=OFlw^vpt`Ssb1yQi|v4vk&g67}^EWoZHVXcO^JbpMn)9W|^3VyC#ZjVpeOD +z`H|HS{qT;6ESf(gj@J%69$G~sOAs=&FFMc*@6i5$a47SWgLAdjCSYBbI;P_y)~zKOfXK%y#a1mA2=dM-D4c}ddq|PMA3{N@4G>dJi0P&(DeIbkUL1Zq0rDdD +z#zQ9$Bso$X;jS$9jbbVnB#N<>a-So|DJq8hWW)_IYhs>-1s%^YE&fxLhocb664%(} +zNF^OdD;mF-a~!8~^4P*buOkV_D->}gL{|Rre5J{4;8U66Wtmxo# +zG!oc^LRNSjdzbDTD$E?%3a>4_QLN^aCAM_&0#zC6bk)6gm!*efmZS${sQ89X`%{s~ +z%H&WRd>b1+)={7gtDlCCHBQjalBT!wo(n<6Wngt|S>?%Gm_kL?)^>4kqvs$-(?8hkIiPI9pS5s}!{4?94Nm@nb`Fpl;DGsvZ +zGXk}DQx+qK{wVcERgi6*yaBK@+oVh_IvIBEJ@Ect{h&&9eJt +zjE8=z^O{bvS5v|qSJQ{E=+kd^h+j>{5IX-&o-_?t)n!d+aF5(k^nR(tf_(7B*buW? +z!JxX#z0_9US8Yo2_ptn%@uF_%sQwPeyRszeSVjP1w1CLx=LEl0VIZWLUB$BBRyjnt +zq3o6ZYsdwM?W&z7glQ&k%S7bc=1dcF(EG7s2o#ja_T@4K7K__$NIwM;`b-q=9Xua- +zPi@_`1c0AXK=nw!3R-xyieT5?-UYkmdEH^dRm+bV4LaiR@t$HK6Pk1w1qqHL*QnMj +z;J-C74G-nKuN_`?9Fm!SX`Ce(dir}T$HJbpSj%&Z4Cy5&z+7UW`140d&C94;ydMvN +zjXIZqb&qabx69^FM-aFy-V+??aR9IRB`j!JfuXu +zX2*n38^|wG&rGwz&u+?aja0BUWg(z{^xJU=hQ_E5XH&gzL$P<02L8J}+1rRs>w_{kd@**l +z{#$(j8SK2KZzZ4D;4dFv5loD%#D+*MGr*Xxpk +za#Cr}G5LsrW}I(%2X3a~VM6;+Y^^hGS+h_t7F*tf&RN=(TRhK5@Y);-EZ +zkthxYdH(Q8NmJs)%w?2iyrz{Tf~nz|GZK;Qy3gkIFu6?&+dYvD`XlVb$KLqK8?^wG +z?3_U~k7?v7Ztynwqw$$=O&VAuG(1#x@4*w=`K~30`&=J!4Y{ojZlj_|ITH$7;5`ek +zM*fdNj=V1~Vu#qlZP&@#uKRSgo4Q4Ey=C(MBD#{BCC%qpdTn?dOO(H@vusePzT5+A +z*BE3A>_Bq{o?6~2ypo}br{%~QAe*T-j^KOytolrY-VZ!3TF>RUelSrK|N;GpLNKG}8xqabqyWv)NbzND~-*866tUcO- +zrS`5jA#_AT7m*1YP^8uW(I^mKwL#U}J4X5>_mZ4tyf5v_ctF1}qSvmlWG&THgayU; +z-YCu|@>zBIy@d4`D%38#zv4@+8aMxnjeEgBrK;R!ah)T8PQL2qk`NRX~ +z-W1p&S03TM69ZgloQ_?3aB}qKCl#SK<|IoRxaZ12HXWqRZ^E*KsOG^JJ)TD{Nj&-1^2-_F=KFFc +zS0_5Bg}$~_gs9H*wmI!$#&`RdF90^p`Rn+S-4l7=l!Cm_QZ?}B+7?}E7a<=eZqDE* +z-|_ls&s2L@a$Kj9db=A-+Nrwy;`ljj+&OtJRht}@+fgVkb~RAUNS_qRrr{~}XVm&f +z(*gx(WALjn$>{vmgu-w=#cvoV0@~EJy^uk%EPUZrF@D<4V**H#L=6g~HPIM` +zOwWA6ubyg1h46he_w6uUhM~^Sm9Nm#M9^ +zq=X`o1 +zdU0V~`otET{={m-uG_~!9!CPPg5KxlQ=XR;yr5F%J}a`oH%uy@zpdB{y8|!D-Yl-p +z+5Hx3GDcl8t;|Hx7wPY+4IEW6CKwB(b*jAg<`*8ou?UBL`TogPZiMgDCyR5XO%+D@ +z&+WY?M^C8a#`i?8PS~oRHFE(8m8GW@Dx=6!=K9pD{$}_@t93l2UT)*BCui-q_0~e+ +zYwcFdnwc`o(>OO +zqhjkh(CftU+n?BP`;6PgE?c!eFmQIaNVrk;d`Fgf=$4DW|vaVuL^po=z`p>@37Dy%Qo9Ql`echCH^FygrnD>9Bl}M5Ip57g_ +zuf4cAxkspFtWsZ#$UMn5E-tu)AF9GGYhFzK`_yS)0>zF6%ia%wtvB(` +zIiKz^?ge!da@g?Kv+&JAo_2`HVC?#T^z7DRk0Y=N&BtrGaZK0Hx5Ti@2Cfa5(GdKG7 +z6M>=L>mBJ2TjC*9hohKWqb@*up;<0=|FLsqdWo!xjY(*5fd{Iiy9FD;kkT^L;*Pww +zY>E7mWpP)^n>{vLIX*cpNodoo&vt|Q*E`4Bbn?>4CU +z?mXNZwzQHULW$Ub4@ahV=<1JDl%08?&Lwc{f<#qI^9wqMowZ^!`qlzK?m(fu@7nLl +z6Tc?H+ZO!OUo8qRm|QkK8)kzdPiut7Qx?DvOj1{NpGoiBrra^3u=~2u9e~s_-_x81jE)>9k7BOW2ZTj+gx9n5f4l@TIu!%^j2!g +z6BaUg{ICX_FRM0GPWm+xv_FV+d4-f@5#w^S$3HQz_4r8# +z{^TJ!EQhSLstH=zAglaEw=>`O>k@# +z3$-jIk{r$atwfOIdZoI9eQKaHnX$euslosEN!BWXKIV0eCKG4NXX +zpjQ*@z$Eu3IdaVzp|Z@Eko*yVD|H2c&!-JNN%9sMa*ij^x*RJPr|OA>4{pS^;icq} +zHpW}jqRqG#fb^c1XTWgi!K5vr!DOdPZ1J7#>PI@r@mt@;&RpF`R^Fx)j3S%=fsN3JwW-wgp}!u5<$#u{k7nSnS9(T7NAS&n2=Nb=hU`EJL7&AncN~%mBA`mBjy9{0<@Y +zc}_I=u2&SVn2;y@HyDs!Y{;aTQKlx)BpB{Vl_+>A4I^2NLPgbr^?yw^7 +zD5z^wld#>?m5g{sKHNARPGIL;Ey<~edX;cj9}Ks|@$MSA`{-Fihl7P7V+1sqNm +z>ApI?tg-<}V?Jsex0|Hz3pl#Ed; +z1ZhV#G3774`S&?#RyR~741a?(CGhQBR&u$?_1(GwZf(k~M4%DI-d8#PVcVnlq? +zA~HWJK1y&?q_jTpacP5p*qp;nQ3P# +z3=`0t?bhX9)8***jTmh5d?C#;i}6-JPpfr#ncjN-^a>hNlIXxO|G9jd9CP5g!djEk +zOMQp3AN+-9T0=TdQRiX41?%w)a3x1il= +z#={sA08Ac!L5f&U_)qNZD|*Cs2p_&#$J7K*%1xpu#a+@F{`D>%p4INufsIjDCtzcv +z!6_WuY15M0t_iSRMt5pibk89OTQ0XWKCOq!b-2lj +zm=q9B*>``eZR;*AJSWwc5!2xl3^+@Xvdh!%A65-g`hW=dB0-Pl8M)t;zTW>a;`P1oDtzq!&KD$45ngmmka +z<1jLoV_(x@FlFt`kIrjPHgk+70-nX`j^%(&?YBpRF6y`=X1eNAki!>+Vlt +z8!ml2vbbzRxUi-Wd!zFyUWuJ;dlHwmfnM`T0{5HYR3BqHIx%yc_!)Ix3lGD9MxdD7 +zg&NM&7%5=!3_K}pL5r_{R;>;4jE&P8kv6P*`ps9g3@mS@SQ;>mt9Nkw<9OJ8j~SuS +zU>?^g>BrvrIJPhU8T}*4H%R+T!dkQAfD0XoRn3pml?6&Piq6K8aV$p?V-Eau7KfYr}`9XaVs?z2h^Hf8;B1K +z)tgW!SbDDBe2Jr=L_&uRbWAwYzCK^wD{*}$NVLZ^%+S6c^;mEuNW@)U9>$O^zv0Hv +zs79LIHmIE=1&KZ%q)DC8^AsT5C*@2Fc2VQsdche&2GK?jNe-6=2<@*I0SNDv@BgxD +zM~16y+r3lz%&JmCt0h9n8@f2G{At&t~MU}B0NWC367G$qDeg=3*R +zIID4s^po=F;+p-$h{>=paTD%*7}t<`vkC5P40Z|Cdi{S|fb-@I=kcPC3Mr3UeHzj< +zoAqh%uWrY#E}yOb#_KN#k~TV1!3lb$6Y7&7&_;xadmwYcODFO9SS~9LR8@rnM6pzB!tG~y0{5>P9mHP- +z>;Z|~@EkM9%Gxu*^AXSpe*qqH%4UGfsEvgNtM7Y%SJyYYL2sPfeOrWbpbSPVz*L@@8 +zEAK`!+;ypmJNHRgpQ1lfiZ>XXv!ipLlE6B-CKtRnf7aCgaOYxL{iwuomW9sJs7=N3 +z3&+wT6JnbwImKF3{sbYk8b!0Gy$gZ{Fw;nPua0^}$@P|mdH>mqs3JVrwgB^0%2@}t +zv-IzV9%YuCL@meJ4~}jcTU~XvP2arZPd?;}S#*>Fa+Z-giMgywak3m%(?m=Ux4*dC +zSGf>54Mh#zkjnSsp51rsQ91=>8ptD0jo|dtHuY(HSb+9qN`++DUsuEvq7R= +zd^k(rzBwue5+BM`%CQ?Pd7Xb8x}5p=2e*Pwvv4z&-Y_+Wq6l?;x1>u`Ai@IcR_Hh8 +zQhBPSqj{lA7KQt1F2N@UMm&{L(H=&8#~!g5J0StL!bMfNz0dnoTo0ma*tH+OXJ5oT +z0~6CJUny7f#c)}q^`zd%5BdWe8@Zsx3kR~-4(22*vt14S1e(e49i0bK9 +zN(u@7c4R!Bme{ThDK>K_$9*97)?0QM-k$cjX9gR3k`DQ(Wru|Ax!|ci9oyFsJ|C5{UXJ({azzgb2n2har7?b69U>FfxK-Z>|Df +z%AO$m^R0!NCr|21F&PtaI0*h1Lm2Q&vBZyh-a_0B +zLxa}zceBY%MiE4rVA<0^1He=6E7*vK=HRZ%HnmDnd8Xp$F<%Uu4c>0CeU6{qDG!Ty +zO}@e5eeGrY$rkzEWg8?w(wDLc#&Qf;c|Tq-QwAo&8sfSoc)GdpX8cI582?K`=jo +z$6lO!fzJ(hZ!$%8)6Uvb^HeCsWoKHkEjd^0?TFiQOMqafhb0LOH#mkRfrqRB?XeGW +zc4Z|lOLXAMMiia{WTHMQtAD_Kztxa_a}W7K4r2PeA^npv!FcoaZM?*7u7EP2?i$(q +z4WqpSAr6*F%+Cr(fsJ+RX+>YtMRLv-o_g|d=}*1dEHCZ*+J6TJfaT$kuQ`VB=X*^Q +zuuh5}owlp|WAlJ1WN#b2a(UCS@+A%2PBJKHN^a%zAPFB={ODS!dz}TeK?q-Y9ih_} +zUYG`8vtNBw49Ozt*d;f|si;NBaoXX3hsj||X$@Mrn|kADLvBv(%{p3YxZ_KXzA=$! +z)=1NYMiPWw41_E^_grjLz~tq`2d=-kC4uRXz7hZHg;2XvhA}pl#P4=7lRPaCZYQmb +zQlQMAF=2A=$;n1z1c#}K;dCA(K`S0Dn3yK>YJGIoje9zPd-i&@c|^nb*`dtk1&39! +zpHC)@)OpeDk!+>R(JaVB8&6_xS8g7_A$BrBH~otmgPW99A|}P{s!z?F +zyDf`rWT5oUt=(~F;YeB=-uWItFQXy7qdiKWoTs)+-fX1fo|P{KRW+B%DgAnZOrw*^ +zk~J{k9ciJouNpoi?~9mI`X{ttlbQRp-Ubz}HvakF(yiIP=go;V-gAi!D}Bc9d=dPh +z#MP@%M$9wEv1teHTyNpxf1ee<4u+DvmSOtbPXA>KTwSOuL{lS4-RY5RLwde$Y|)kn +zD3M)G8{gGvw>kt6ss7yLFTFcA_{Z(e7ri5oZVAQFMN)t&c;0cC#6?kYzXy8m#;Rr} +zV5Quf(`oQ;&0}SOkeO|P`)6-xl%u%}X71|!So6mtlthw}wG@EEvSYFnVJY|GxRbBL +z7=ReCM27(m55u0E%%ua-hHL~fl3|o?Z;0OCP%NYexO{1_LXBgPF7=fa9sQk8a#MwYjlF{-kEC|LZ!)68`N$M3+01wZP2#|0>TipUCV)nsH(6E%pF$rqb$h8?20zo1@D=4VaPEHtg(xE +zL7eTOjnWAId#~Ectr7|2DGPD)=8!2e3OcUq+?=&xBJSh)*`I;5Ie)>IIDMT}Mo(_! +z{(;na*9%X|zp-nE9A#X>VqV|_uGnIYzx4FBl!4WKmx(7J +z5K8@+Q5a(SUN4*DTU%WA!q!WYqr@@6tOepUXKTxm{qNg3WBOOT>q`}TJEq>}#&-0- +zUC3b#HY1`~S}<0V9r^Z-gLqbK0EEqx7rI{Tm*Aj^$G)Q0QeDD|lt6q(W4~D<4Nmg6Kz}Dhm8}Ae91x}#sNZE5m~sdJ{Qe8*qmL +zVozP)qTV{=N}x!S{A8M#sTSqjlL(nSPJW|kN{KCnY&&p42$z6F{Qew@sPX0+zx)*| +z$Z&m97(e`ggDm^0tWPH4WfcAo8J?;WqipBhRX;FDE5WH|2W$P@TkX$NN#6Qc01fi= +zjb#s?6SSMY;adQ9VEOyC&^qtD%z-!Lh}pLJLXLmvUlqVc=fyMGyGR_9BC5@`%~FqVZ8Hy$4X=u)1b5( +zg~~}clh`tLGEGY?a|pkb`-rr((;IRmET`R1Hcqj0@D)pX>yK0I_=On3F7pUM{2tSKO3VmNU+wCyL`?#}Fqx=9^RVlPiA +z(e@47{9RbEX*9eM~_YD#p+#JWs +zKijh?@T)z!y4U%{NA-`F8>yNfYDUsGu0P&B;! +zYNYP?j*??1;OpCu)NruO>jbPg2^pk@JI{b->L_YcC{LaA&ZW%zjor2JVu%k9Wx>gj +ze1gMdMWI~QsJC}i&DIGI5`ImVcQYcfUw_kILd&bS&BKwM?6h;aawJ>Rr*N;cpYrh1 +zi{C_mlp^&L@Ei>~Rwt!0mI0YOz5O(TiyZuvpp9%9GBA85hDQN(>8*=UQxyP6CJHby +zCY5fb%OaL^0sTVho^RzdM$4)QFox``h(6$BWn?R*KtD<1=FusO<#|zU_*76)#TThL +zPq!L^I{%XbL@O3Tl5l&FJ9**r$x{_>h}f6rmnNq?;r0XHE3|j+4(rf;ykGz>He^{`8w0cL@pYZ-<66(Yx>vwR +zm)8}WvKPukcF{24xjZA)pZ0a+^V3(t7fy;;;#7HXfcRLf`k`K;?_>zYNug7yfn8^v1F4#{00eoF+o% +z(5h{_UJPcoJe|l~vvZD%233p?Wr&$-g%;%5+<<#p52RRy@msDnD;5sS%!g&8s*aYUnl3{aO_3F)$$>a=x2RoFuFK*G{>>%CLEN^1|hTjT|Ciy +z+KzvAz&`BuXyCuk{~MWyy&YuH4qr4V1tKtVl9({GSn&A1k4rGpXUZ?3zFv=Ctb@Pv +zT2z+l*ORf6>rDYt#DXr{2;c)POd*%w_=*j6P?D3Q9t2P)4fUdOa^xz(q4+M&;i4qy +z`BEl0|2uqF49`nc0Hzo7R)%5PyES3c<~3)PEk)eOOK{=r92I_J_VOvE{Fh +z5cFs7-_5Nkvscdlp0Y;NH8X!ieAhw9Xg9}dC-Cr9y)?Ect!t#b{_|xJFQ^~okM4CG +z65XMG8LsnAkP{77np1`$0&swT_~}dR2GU!wO5qye`mDXcss;UEsWemFJ2%1a3x+Q` +zP`qw-()h#>hAJ@Ub9_M=ef#e+NHuBF@Vq~Iv;aoZU&tjz^j}8h$@kB&on!DN +zwbH-kzTokJc+%*qpLru+-x-YJ!4zC4u!V^FtAp~BQW0l-;|IUEvoEtRK|$} +zn6XIUK%z4C{twu;re0rF#znBa@I8Hz^wu$n=GJ@Cp5kOvF{+zL5!$L~J?elk%p9zI +zy`KCG8>Vj${Tb%R@lE<`uadAOflMaG3+@xh_eRKu9cIf2vt~S53S2KUAYWeTNdsw@ +zfF@x|z^P%A@A82Xd9$o*#AgTW)hE79dtV)AYFYPutKEP7qyKu@&GS5n>thj+QY{-A +z3K{G;YrEMwxryCmvj@?QPwS?`qe}SE#urf__LC%xHyGWB)nXpzJ=rcrZsTsT`h?tP +zYm?mFm`P>+s{*-AwFc=(8>i4C9(a0`TMC_aR9hy`cprZClYu7^Q|!`0=ZkRKPrmiX +z&oSn>f0@mnrIRbo7H^xwq~m%*sUpm^vH57t{W&_#2R>!Dsh2MbDwjW?@n@N*f&H92Fl%4D;5B;i}XdaNCUiHun$)y38QsmQKj^op0fXljuy)v>Tn> +ztJBjQ;%sSLgfCaE`c3!vV4ANZPx_vyf0xMYR|_Zg^(Y9|mHXq)mvutr<4VhAJFkF1 +zY;{TOqy%gCpL3e%s?J;$!0=*>q^K~-Bv_bMbO25)V5x@-82q#_$*F>@IlR+nDa^<7 +z<8944)0tp-XS;1C5 +zkEGCB2Cq3YPQ3Hjd7>$MeE?`k`lyL;m;>$T{?6>7)5lMirY9#E>(hCDir>;2`}foJPjea}8U)h^UFJvc&-e4hXEX5hO)~5IUm3Aks=GE$6p1?EL-t38 +zZ3{-Tx`EHXJQ`rK6#zP)_qY%j{z9HDd0N+>3=rCGJVY}`-T?xeagh3qf%>CZtAsfj +zQ+eT}IlF4K0*&x1ib|{!SGT_LV-}SmN3ud$v$@=gM4JdwS?w3augw$6AJ#yeb7L8e +z28hpd0@|tXdALi#2@g)l{dF3G>(obza7;x!V5T^-`X_*HyfXP&`B%s};7_H)W!`S{ +zeDm|^&&{YxBI~cYmx8)rXPt09Ky#MrHjJ6@nAzI(nA_N8N(t#u0PVCWF~nhs)U(jV +zImxi2WwKtzTD(b|6WX!#-p*!0klung8&;Jax&|kt=%f#TVJ|sCj4IPf*2UM0hg!iB +z{k7UOeui)x99P=s4^lFS5WkEarA`{v*AE9a(LAXU#@zS&z>t0Q7~#+yD@Z13Y*|@X +z4SrGmu(s0W=x;GwP@NT|P3bp1eJSU+dzjOu7XDmOs0-y_iXTb272)=QB+{lfo~T4T +zYg1*2Tx`ACq3vqbU?u1i|A^tSMg>N4DCj)CuB7pa>!{?7SKghijE}R4MiQNN_Qin< +zc#DXU-faEU5*+L~?0EkhXUp$4ZVl|=obR1HNt6|wyS8_FrjlSJ)_$;&?nASha5DG1 +zRnPn*l#?2|Dowma*1sG>-L8FNqs4xFfZj^!%lZnC11LmSq8uEERIw9y7CPOhv5-tbHj2+YG(?PT9l$v0zi#rbF(-O=$3 +zQ8v1V)FvxS>(;Rkxp?C5i$3?+ +zgs(trb@OeO2VWnXB~qY=>zghU^=#5cD1E=VfMNAHlKx(E_4Y9#X-osnQB_l14iv%7 +zkU(t@S1gpYBaTcag=2XpLo6b!O@R=z$00X4@#bKR$Ok(&OYm#|Rt^V+Axk8ay-eTFMrM?m|AX}qy|xSAg!CePu?UiG8yLtCeB +zVa{kJJsaXYJX^zZMaf#ptSh=PMci^dmKGdK6cL%7|BB4GXT?FrH1Rw<=2wZ*F<;&% +zHDrJb39&h1PfnV^joveTCVe0LW12+V5kRa=++}BkH~kL;oa`Xs6NnDeJiYFxHU+_Z +zMwTLkUgv!gIOVVokOOK{QRw1`rJ1+ +z9c-h?kDjv_E+Yq(Hh2Ik4oW9#Z?mcOUWd~m)75tAof9to;xG=34t_2XRxTX@H5r-6 +zVLG`}3#CM4M^$nF$blrJ7uGvTU?Xs@j@(8+YlT>_guoPlLH{tS7BiV0DFZ+O!Hz_W +ze~><5LG`v5No&D)g)Pe=LwWpIS2*5c%%fe;i#=gsy}Q86dQ9 +zV9ll`gc!w2LIC%{(;9h&l^#nc-FmZ?-AZzs*Mi={DubPqSnOCQP%|F&avghb^f|oy +zlnOtxlVWJ=^oG2)pz%C!M>_zx#QCKjjguzw9%^WrnN(Oah^p}wn@bg1CXw-*{QLqj +z0RL!?a{V9DH9`gB8}w@6tm<#Hc#=|@2N!vpG!C>W5fc0wy*2%ILa~HA>=oM>pO_{+ +z>YHM7B_`@RCyHW@Sx!&oUoSV3c;)I1|@#ypxN881Z@PV`O<0$rRSH30mC +z%gz-hIwYl6^6;2{9IyRrlUOT$`yfL`doNg_bk^bqYIb^B#;DbD!xKL +z#JORF=gYml4p|wEX*asPe&v4F!^ +zt`3&7W71jO;?4)AVXlPwiqQq4O_g7CMK=GSbn8R+-uFY-KXMHas|%1qv8UJf$jNMV +z!0prjhtl7%!!c`$`p-ir`M>JNnV*plbN)LFc~2bzFFWf9R+mYSUAVkcCv8P!0Y1TG +zczDD5cAHSqt4c}YUmqp>P2NZ#G}(YF=Ro8C@R@9_dkm|;PH7;dh%{DDE04N=%ReEn +z^B6Xoi?Do*GOgF)35Pkg#n8*NTiQ-0n)63-L?Hd(;?9XL76N*ARl*5TExWo98GA}Z&y1>alm827!^W!nT*@nXAJbBA?A=x~5o6MvDd) +zJbR+()89Hpp!NxfMCz0OdU>yWM2zZ|Br_bQKR#csp}gN2ljxZxaI+`8X~CjbP)Ef~ +ziRzn%R<-~9>D3|l+m>Vh8k|dXPh=yIePoK6F)!i6&@@;upKqTt +z10I-Edjhe_nonblbP6p|o*~`V{~&BNEe4H=BAr?T +z%MLPTRd$47&a6Z<&}GGD_}esr0S^(_d3;l%Ng~DTSB!%Z?#Bx?`yZVJbJa(MyJ}GcB0`XIn(8D`{#uO_t3$LQlOOb@)^d!-jn{*7)>ED4 +z$14m3Z*R)xYp1v)(`rKv=Q-c01+cUHcH5i0$SzS|H~cm&RqNhUnzqaOnmu#0{dH*m +z3X62PlZb?SS@+i8`s~!{5^WAg8QP6TIYt1PR{4b-jxH%=G1E8BugaEMFn4$5w2wJ( +zN?we}5v|YY&E;{#o_2_x$&_sh53zMBC>~XPGZR#f?Wy~7H#lPdiV?klUci&Gx +z?F6gbsg`G|)Atd_J$ghuYW9_*ta|uhyZobtZ}Cwwg|2o-czopUe+e;R)fIA2F+JIP +z3`=9C!N)%*r!MOpJe?xa0X8(HPsH@^4b#4J(GC+{E&{M}9^GoGW&duBRm~6f@!BW; +z`zPY1-LFGGrzPXgd5=yvWlMcYn~s?&H6A{=xuQF`76fB{kz|Xs=bjHf^W67O;9b?m +z!W2n)yS(U&rH10cmdFUf4t`ye6Ya>OH*#jqA!jbKV%!5(zv{ZR4q}H!85W0v=gNe; +z*zzCk=t0jH%KoOS=RvlOkr_rTeq!~)O1@4AA2uvhToUqG8La+O>JyYMgJb60P69&- +zOYCCcwqWdfa!xeaIc0EdRXBZ=km0<7O4$r$LY?Zy+ddpBBH;5wEdd#)W+AH>68``_ +zw2x%>4|@tsXWi7U!QzORa=@G9jRwW*&)*&It@DIp5Gx9{%YB?oul{Qr-Sr_B+ztv3 +zT(DJ%vi2^kPzZI_OnEx*FVir!yC{=`Zc5x{xNBNlEqjcmq+*YFd(V1kbkQ(`vIrk{ +z;;E4IP50_gGouU!3YS*XP_|Tm3Z;LLS%lH~=eXtL(;JF4QnOH#SJyuu$#gtfpL*7x +zxCnD^m{jf9>g?%1xhM3uEAhBeXBm&~HHn@&XUxbY`^ASw%+lcrMvFqgE*~Y#7C*4p +z{z-IUGcy2<4&i&+NfITbplHgqRy~Zn*BqxQ5|km)e%>3CPG0U~iD&ChgG%@XG*Zi+)X+U+X2(@+4CGow3EPa7hl2as+jRky;T +zMxZU8w9=nwRTt}l$F0j)MCN&fu==Fp{+wy-z*5K`1MCbj)9=BSrt9aSy5aOa7<7hUj>DhQ`Pa +z;e1u8*Xe{Q1nCZ~E3qVJj*JsIkRE_oK@uuU6Dm(2K#7J&NIzA`6HI*@{yP~!pD}0O +zI}00{+)Ub)D3eo_^EqnyN(<83B~{t>-15|V7RJS|Z@1`Shl-DXBZfuG7xl9`LMJqQ +z=H<1Bu6vW)NbcX*GykAf-Iwb4R1MVYn2`_OUJjUYp)zuIjg0ZHFTB)v1b3e*07(mW +z92!d_ib#U2kx=CN4q2=po=}VTWL$;`^}1Tb)a4y35PP=df1)!G>_Y0tIxT5 +ze|*IsPOD5fi;WSd0Lf}Xj&@64Rr%&hoPi&GFJJR& +zKzML6FZMI&Ve)^l?Q?j_bj*K}wlCP_133H2ln(Y}zNBd>%{-$mKANUjlGW=Uc}o}| +zQ;}I5Ra^E9p;V?obhXS&Gw2t779xr(`i{9=XIKu?Pr<9^Q#@2bPAE> +zLCb4aAAa}}fd4xwNaIt`I9oE**kvH1{!;YJDe8)CJ(8Rqe=6(jgrr^1Jrn#C2ij$F +ze2tLIVc{xF2B}<;9XR^R7gA?v>AK!JWprhVko&dDAEMc;Bl3?l=lP;LRHnyrY;d5sq+a~H6Ur^x~5kB +zlYf^kKJ9!s{g^QOZU5912lkX~=Hv7{cxO#T3MqM>8qJB6409d8!lWLnCKJM$1DZ$? +zIHQIEWtt1%8SD!dXR8(7SQ|=2a|tNU)eZ~w<_*}z1>4Y&bNCa4A2()e&;ijr7x-e9 +z7Rb3FGk%$iu*?|BuFqGC0;Cc+zorCIk`~tVEZSFFUs=YBt}~Cyc5@E@d^AT_s1DYL +zijX*_?H^FgOCaNPT@P7lMz);EsF*Z;-QAWUF}A6xac%{qx(Z34al&zWbD~z~`*pK3 +zNQ-kcrq|Xw7i|H(|<5wwv$rMFp&x=IEdok{{Dv$GE +z0e$o?nNrj`W@Eoiheh+8UT&>SFpv3}VHADcz{!iW$^OMh$N&ci^ukvH;bv)jrGvrI +zey~eyQ7*b2tG~T}uw00jAKgkG#)HQ9eT^g3uHHql$0rX>)MJ8a$G>uEdb_!JKc;Dd +z1J*tfKvP;g2QM9EMrtY-kj#;uk8(VL(3#tLyOr)Q?-CX +zfwgLdyOqW`Sc&vY@AdI1uu?&KKhw2J`Q>G`w)+nQa0wOf#T}%OZF&Zy^a7YLA6oOY +zMM6aV2A>Q2+co%GA5MjIwdm?(;;>Ix=gO1_&i-vH>$RAQaQMk%8kGZe5%iZ4%uz=q +zh)OIWM^bs6lBJ7PT}~XJvo@*BJ=pNtF7^?)m?$zVt26B +z*)VRbfq}nsSjz#-InFIaH~#LsePBv#$35SLe4kmkwe{~eY9CR{cmH)4^fG-_APUzyx_f57xICXWbCj-oG??oABJjP +zUN>~hubQD*QEdRo`GOaR&vV+@uf0larFO}4i=oxl?fF$akW=ZCEX-!j->|_z1Opq1 +zZzEPF;+Dg_7-7vSZ8U&sJ0k&jW3dowlflN_$6qpbeaiU!=A3Dtu$2^Ve#e20_C%_R +z)hoMGsesr$>&Y7i01BwPOT-iOlfCA_qh6qfaO>f!)Xrle=IC)?&VJL0#h{(l`10z1 +zzL1>}{^(vaY!%n5Db)5aHKfk)*#L;@8GyT%`B}gTK#`bNl(UpHafrShkcT-t#sQ +zD$kg`Uiy}yN*2)M$|V>3GzytNyI#Sum%oZ`(T>h;$BT +z76sZiMbdEeUvm&{@Wu%Sp$yE5ik{%nF@}^g=!vN@gg7(&Es0MmsiF+A98e->56aMo +zroYwU%|NL2ET-D4Yg%{)_K?uRXF6xp3WB1}S!E6epDKB(^=V9Jy~4zFimo6c4v8U4Q;{#?`rCr&au|!VybzdKh%Hjk4B*{4|WjP9_jDI`IE#g!|Ko +zN85I|;?GFc*}}{H2CcRW31AJ3?ye{OB;esBcC +ziTnfVDMVBE@5H$k62u!pD1DAWZncqMIB!!)mwt%{61CO)fkh*V#!S3wYBGiDU%;KJ +z%O{d!e~{18dOIg%$0|nr#DksjI)UyNprv1^MEb0`KB7Uihv;e_k6dVi8srIJx>l7~ +z$vCKx3jkJc0tn|>F0$UPxSR;39P5y(h`Zb-P4_A?u6KQ(Pz8^0+fsqM1JM`>5f03r +zU?-h%C#5W&4^fgitiGbgdzul7@!^4&{jN)^FSFMvN#Sty{F|I}V(lKs-9gD$5$?22 +zFi1TkbonZRtck{Fcz5fs^EsivM$>Q>WoH|A?-xzE8kb68I?D;K-Pw4rLHF1sOCmj< +zjS!Q;OVxn8=W%{BX~nbGUB>=8M`w{gz|%$4sSIYtGOsP-p3VizG)>qVyQAO9Bv1s% +z_50LW|1&x-yrg?ItwFNC9nC$o-rprxu0-1yS9d~rayfzKfo=Kv7qLdQ8L;^LoBDQr +z#m>X>?sRZRB9B%Qkjp}Ja0<_ZbF*o-KQ-b^^6Qvo9NNP|d5KNdO^^Y0v@&V&RWDh3 +z_}r_^ejHZ^i`H1tBVlTOgH_&D_$JvF}RJ+YmX)A;g@V +zzq?6&=|t3fGvo(vuVcm=L$~0BSc1e-tl?`sgS{9`=Ha< +zSPk{n$NAE9*q;g(EaC7M>fh=Y1?!#F@qCZFM`K}9o}h`X@cl3+iHZR2_d^t%@CEKl +z#?G|Jk8jeN>}lYH$;dk1jV*)fDEJ~>)XfmzRX~t3B5Q;XZO3y*X-uh?f1#NargK{B`;a`K>w@JhvXN0mf!t +zgW|(MzPq1&e{a4C3f68VhmDJ@WMH>c#V{ImEojh#_xKTcvNHc;d25Or@b-6>J4 +zX%|7KfT0=7{2!3|U*p8?paH?Mito`V@a$+-1iKqt+UL~K3imD@xkPXxbu^p!?69EV +zt&p}vXSQE?j3=I!2!1>47Bsrb7)jqf-k|Vr{*poE2pAmhbtwSz9X*8H(((CX0ors} +z7tFa5p5e#$2nT8sh66KevQ5%QkUo2I=<&E`M6uaIbhLrDD(Y}fZHkt*9_VFuzNq~B +z+hpheP^|KA`>RSQr+J#G9A0@{AOo +z2h-7{ZyB!h-d-hDJ7fBg*@YBmqqRIS!h(3bg@-kBSrkW!&}DxEeUC~_c=+8}H1Z60 +z(saO%iiqE)U`dybcvwYL{I8$PXnF=&_OAyS#r9Kytj@w^CT!NcoJf?K5SX0s8yT +zDce|{bt;lJE$5#rPg_nJRv9IV=MANrXLtvv7ul4H!fkp@rBw6v7{mk +zKUqiByV|LFUax^sm)gox6nl-xtQ6w7?rsQmug;m5iwNVwi=dn*=)Fl@e)}>)I1hSn +zHT2%N%fPv4u4rjOF?GiuL>cj}dLu6;ucqSAsY)LBrH34w-bwiee@>gg{w29zhO5P_ +zuZj;FMdKqvZ_KfK0?Wd!dKjFrP(*{G-itVSyz=k9yV<;jpzfv2o6F}~9wyWRB=wJd +zYI{TYkc$=`nLtkib(7eh>5X1ON8gC+4<3nOR#lX&XFMew7MKZ)jaVE5+9s0-`#*m` +zDsPh_b_}39X?SxgVhzt8HO#cI`9Xd-rtIM~(*|VX3XB!P1^f>BRkOD4ubQDmAL4)1 +z-Cn`YlF7V4YeYs+6Yv(`+2j7Yj)5YjIu!3k=a*U +zhk=v#e6Ko)j}PNdFTo0N8&x4Eo3zkQ;a;L&sfE<B36qj%|5 +ze&P{N5kBi@Dsaw$Rpl4tp;!0jl~+5>A%- +z?B_j@!+jFYq*lVIZu`){o9M=>#5%}#F+BJh(}E0U=ogMFDS(IS5hH+!7u__+1L9C1 +zx@$k0g&{qgVYkecHU4F2EoK*60S-uH9V=TosnJ)4Qjiku=*f5|xgUp*I9^i?6y5kj +z|1>GXtPQ>^HV=62nzt$xJP=>|l<>JlcL)>zaOmUU2C@4~dNhyqe$g^X6NtKoz~Z$3t1q015g=9Ic6~=8xTe*ID +zheq2lcq(wd9*H0lDMmwsLQh8668y+;h$pIcCyEVLI$LvHc2xH>nKwq`@Y5aD-@gae +zJIO`ZM~i{skud+@SG@#0nESmj4zw4Jit(~d7g+HS5lY_5E_Q_zq8p=8C9ZH`k-`3L&<&T+}##U%$gFZ3+K;wyO`d!OhQ_%Lq2g553Ii#ck`W6{cQ(?)?JU{b&l +z2&iBXDG8(rf1=Rk_`L-q%}+8u^o#ec0jZ|nQlbd>(65`ww}37v6FkVx%7*5m^LcMz +zk_j%+5Z<*>x+cnAdW>lE5B-KC(oTl`V39OCQlH#r0rivhD5wS?yIk1p{!S#Y`I^%z +zET84Ts2ka8t9>e9oz$7lg#_jTJmg7II4G8^qz^`y)uio@EZYov=P?w(?oA<@a3p^|g2 +z0mRG!eX&4V#EkBaH;g5!>DJ`g2f9Q(uzZ(bx)#~Y_hu`}oLgGhkbh +zG>7F&;W;)|hPRZgzG6&_IR$#;uX*&&(BH9Z>j&K>Vsh#>VdMl^n%BYGuh~m}tfiMf +z#_9k1dYc~eXZu>om0m4Q0582pLpmgy*4VTTf>2srAHBUN)uk>fin0p9WWDTAu$j4gRA3H;e>f +z$}3`pjiUM@!T;##jU?N^vtCW(p6te?DCGAYk2iaftgOdNIO0{6_CsUiMG>RoYZd?H +z+Y6{Z0(|Tv+F{Iyf4lGSAAa57Kiqgnu6520FBUQYPs?NEl%VA0uO|j{y|Ewv{h&f0 +zR*6igq!FL(&eIdYoF7kr*)AEC$a0Y(6=V4DIXXhZwPL=f*elKOny>6NsG)Ynv70B= +zfQAoQSD4oQBeKrTZb*hmm=-~OAb5^4{Dd%-3^o9rd{+q=<&oi^6<8Qd)c=on23RmxHJ} +z+a^Wd%4T6J84dWe4>inHHI5<$KSnqw8szao9QHW>=Yc5*0Qa9Uqq%;49!J3qxY8Lo +z>1(tO +z1l5MeajS@H8~I>MkjD-_V)I_}vd#{Bv0+h2&TQ9&HyzPu+M8qq#w;m?H+@nI*LiM5 +zGvdtF0AdHS*~aW7MGV>Mz7;BrDIWDeiJ0|TdZ`);4eMI%IaiXleXJZJ2r96=KOpji +zGh*0mEBNemEoGu7e9d6}4iMsrxbuH!k$)j8)y`|CBX&VSzNQiBBEfPNtcl&@vQ}2M +zgS56Z842^i-?Wl2nc^8Z?)m2+&gS^T?tQOl%;}B4XmBInx@_;5`n6|<^$Ot{kH}V9 +zf9>LE-ILZ(74(JL9ST&kOl%vYux5;NTorLTismC|b;;ehKFNu`&h;E3tNSq=DK=@&mM7iZHRL3bg$Srhh%#Ny03ZS())PmOo!k3LJ`k^B7N9>dX+<)R$ +zeReFDxw}yvlkUZM-BR#S3(ALdKFMshRP>~%-COM&qppeC^bYpddBsX3R9(*hqFkWh +z_A$rK0LUk_WRRbEfGa!fs|+5@qPU39`^ZL&uFy5^k%NG_%+p#EXnM>PXPg4a=f*re +z=hJM(FB>DDO7iZdKI#D@y+zSjENSOOxA&8IMm9dME^z|O{IKqV2M48|;8s69wACEs +z-YNdkS8%N2m64z(R$K}-I8IowqR#Vkg#nN|?QY_7Jr<2*p+%Tid0#gHzA{3al$t3{ +zxbUzbvTm-9quaphBOo5s0#hagE&YU5k(Aw0FQBP@8Q@|qWOp&a7xGn7!A|#G`2NUW +z4T2Jg4HmH6l=L@oH|2sETd}qLpBG@hMy&Zgz*UYA$#btT#~n1?F*O;k#F{2V=%Y^J +zLCM6Yr2u72T1Mr!`pKDlp7>?id$^lW2@U$%urD2}5J<_n)&^!A{B~^US8c&z|M|W{ +z9y4q{tb)#UQ^G=oMkn(;e#U*G&`Q5O`=6T5-OrvaV}4{Snk`h6q!;td^WbGdGDI*T +z{cP;%+yS{SxtCQ1Nt<3PjJ +zc?Kdu$Aefn1zZ8Z%I4_ZY*;K`zsWntt +z{#V=>@+GdBY;LI%9&O$`ZSudfRIl4D9l=CrU^l->6h_$Ikt>bQ{(oiw0 +zd+1f6VbiMW{!Ae%`8WS&(eI(XZ-tShU4*aJemy!0QVZbzY%$s2cx>`KCWy#sP0928 +z4TLk2uEV2nUW$fEZ-&mLjYxx}yA+G6*=OYPi88xExK0qt4Rn`Fh&f%~zQcn5sA58{q4L{>vu+Ruz3J3mX= +zH3>2F^(nc}!*BY{D7uNz_@;m!fhe?+4u2{~^rVFFskEz|r%4wzRan +z0>wx$?Di|k<*DUJY@T2B1C}g0n0t&h+;Sy)bZz3oUqo;sD}beDyU!(y*u(YR$>J*X +zoDt!UBPW0lZQ>m@3kq3XeCq~b?838L`YjUtCWUTpAi%HG`b?;Q<^z(9aQ$m=|8#Q* +z1}5{AK=4Lx@~15gibB#$Zp8!TJChjtOyO3izlfa_G3YAZ+4W&00^3TLM(S{?e8vAUO=X^C +z{cXPSB#CJ_1>*MSapebKI@&m3jBK-ZKnerLc#j?Q_b~MgT3HRUbI51gyB%TTY1zDy +zP24XzS_qF4P(!x4d{Dd(k3#((MZ<+JL#}I*PAIYB^o-33&>kgXWCnmwx$_It^DIHa +z-$Y5z^t?kE%)i;ui{RTR`cHM~qga7DKdO3H80`P3*JqjXkHs{aU*og6wD_Q?52d** +zue$+i%%BEn((IkI!aouEEWS1w-88oY*st+?vs#?~`@%mOE=G4XHCqeDxKDTDp;_w%=R=j^F~`D(aKq};%eROQ4Q=m&Jy8=kaH*Y|ZFlfjO1tnZ*tq*7?6mQZ(onCIpl5 +zyeqqFolBlWfq*O)a#NjqqkU`I9M6Y?%7>sMmj%z?vA>z@V%?aodPvAsq{LEC1SLm{gUCoXL4WEU_&0@I_aQ>2PkQ +zK`-;Pejy)`Nhk1~KVN+|hZRU-Z}Hj1-!E(E{M(LF3H=vbM1WAd*iNCK&|;w7O(|%~ +zzJyDb5|sjc3ShqDu|2FJT`>FQQ#4puySnv- +zIp_5<|F$zVRp)<9tuMUFVxMHD(1PEii-iu>x0gY{m4B&-5RhG!2Nt@ZqM2ns4r_&B +zsRWI>4>OK|)0WB|-5mGV|FD++a2NX2cuR2(Q6Dj0-r)!i?QtRZj{t;&I^lqXKLuLi +zofk+C9wVnpaUWS85ta62U~hF!P<~ICnGJ0`tDL~Wn!fp1Vjq?taY<&hkh%L2yL|6i +z{)c2deV;R>Cc{ro^7()c##;OXsY@h$bhw9*lxKOVE-l*=MxT?C9+01sjKdvbui%57 +zUjOM}KseB9*G<=Dbl7@0@!qSYpw`-gp#*5(^2US!qqN4v*}6q{B2ix8Ibm|fufzg6%?Z;UdPGsl957?(EE~0Ti62^hR{*13 +zXb>m-)%2jd(a9 +z%Z%0*Z-i#h`mZAMMDxOnZY=i-(S)w;Ab{RAD{$Rua#41J0; +z*|=Rutkmm@_C@!&M_P`=(?>0Nm>&5Y@$`%8 +zTBqI2ec+U!tc?6Hwym-8!Cp7eJbJNVW5dQmK^6;elAuRPi+foOXoY2##&0qL&N +zYi0{G`Ihul-%-D}(kGOcF{3<7P!D_2d;YoaEMY=*1?5WPpy#q_x=)*ln_WeS9e;;T +z>NGGXw19wH#v6S +zC;ncglNCW&Dy%SfDu=wutRUIJ!*giMT8r;Q0_iP$#^ZoAAovsUskSsFFf{A5$%`5a +zPGcgfjB>SaQ`Jfx%Ej$3Fh*~vB=nOI5Wyf6cmgqpq{Np(L@*twL`SxCNx;gPeKzAi +zX{~u}#eeZ9$#f@cu`-_ +zD7TKPbZKIV5(URp*fLdqY$&1Dy8A`Bbg?}7uxIhYvCFH+ht=&^I>Hrk6vW)X$iWPp +z^0qaPgQWiOG!w?jspfw#m=}`zGsEcX_s2ME6_}h`yokAb{Q-XsWtLdS0V?J{bdI3w +z(rNjC!RB}!T>Hcc%&SDSS0CIIQk3GGkW%;($jETnpXo_UW+~scBN9n<57y&}^L4#V +zU)~i>plvS!0@ATQKfzfzE)8P57HkQ~*N3R6$2~8(aKg%79XfO=njc~5a^P0i|MDWr +zsLNN17FUm&zrvYALC_#XEs8FvCa=jLr2b#`hR$zg;O*Wv1~oSC$G5EpYc#!_EACH@ +zzl?0II$_w+={`1?)DF>diQ>SFM5=2Z>_%U0On!UqX3s`skfy)QaUpkqKI4MVQE)&R +zdLL4K#FFebZZh9@{1kL}V#my!SH4x$OQFTQf_74RtcEPxeW0h`NT1}zrrMaVQI-tS +zuY{l%h=Hq%p7SEZltj69_(8(aRF~sqL16j=V5~D3U4C5KG~wuyquPBYC|X-ETH7Vi +zTktAkvsG0=pY^V?`dwWoPc3;vV_$<|{a5?i{AURFvdI-;l%8`U4Lo&p(LOpuiYB^} +zXIp^*W$}CYvO2-At{b`5li6_%sI?bnT&4IRDP(nJ`}ES?-;wU}-$f3KpgRGyeai8A30faq_Wx)) +z%c!W{uMH0!Qi@1}fOHKYT>=8q-8HnNgmkyU&^0tlOLylWHFTGRbeD9!=l8Dl{{pP} +zz+y3T&U5zO*M03rg?mmDsxW?cRFQVRzQhAx^qrn@--SLLI6s`{&eOan{5)AF-jD53 +zH?ySw12)3o)_G+SJ+HAuh}36g{x6TIPq2;c+tPF0T=gJYT=hOrKaH-4`}Nx3(E40I +z7ZT&qun21}krc|E+hjGd89pT%=pTEMmhoDe%l;kI2M6U$##%q)3}Qwf*{*QfdCkq& +zuY-oeCF^5v%fx>U%XJl+%^^4VikBsoD^e3j=;#J$_E%M7lHZvGyp32J2badefo`zG-lz&^vo?lE@MGzWzYS(c(Rqu +z&cnygvFj9&tk)7MB0?5~O|Kl`!&%OSU#`;1jxw~y15$utv&Jz!>)Ik4o4|5{W0N2H +za!P^uZt|OrTfq)?akao_crto7qF*67gbQl2w*-0?MqJ*JEfu?Gx$vfO7yuYAOIpq# +zHc9zT*>C*`bauXFUjDVhv~YvVc2rK%<9lN|A8qe0LA|$V+nH&7`U9gmGdSP?nAt8j +z{n{e4)7ZPF=NE7(6Ui|-r%Rpr>y77RR2X>mCj&RyRRBM|NO)}#nee;k0~@5ynH7ae +zzBg7TNdeW2X+h27+a@?h?+p@Yq#4#Qt}9C|HyhAbR;kxFP_R}Oj?QlSm^|3NKQBn*;!uuV`0%{NlRwaFNM)6-VNTJ@w00u-NYiB~Kxfa8m^BQ* +zUE9md*f)&!8hTB{uA}c(9s4lNC`LndGzmTeFcp@H?dRuZ +zpg8a%{iW`R{$C%A4|-?{L^!X@w}3WS8Mf;qZ6gsKF9Yv5bucuE+@M*+zOtkB13Hg!#O|ja_@49AG1XMwYj^U +z%qmi0Oe(8Kj08++aQG`P)v8PgHb4xY!f%vZFwn{W>Y)F}6$hbm2E)G~lZ4$Q2LZh` +z9rt^_fl4(6Vf*GW;8kIZTTxIS3wTTHuKec}4qnNtIxL7UHW>;w9ThM?86d$X_igCU +z?@DsLpAJQX9f-#|U-o`O1Ag0B4#7s|2_}G|M(0j>eWuI`pV18zv~)tDlu2^k@3J+> +zXx5*tR@b`l-qiVQ*K2NFVBIK*%1IXcy6e5xJ8BGw#XU9=Fq>MB|K&ovqS{ +zdslSK&VdS78cm<*+_3J2sLJH3TJcuy`=6a3e(v!3&lf?TTgOZn|L92WWXtZ(A7DCo +zQ*X=qVc(c`qC8Zs`uk5`=h_Xws(Yu>ze4}DCO40Nr$%efE8<2iht_|-F^T$`Jx^)X +z#ZKh~yFSgk_w9O(L?c_pxJnAU;>VR54#eXH37;)$H>9+_9-1gwcO&SuzIx|pD#yNY +zouniB>feN&5xYm-6ZN4m67R9piD2p##6pR%_aO&a@%~;OXmT +z^h5LV#eP)IlFPwW42a~n>T;8EdjlH9hZEzBwGC8K7=gWhz+>S~!IKDcD>yiTfJ*=2 +zftj4IWbM^TMDF<*2$r(?yo9tJ&`z+f!^xjb0CBu&idjjtEB7u7=m(lx_FtSpwFRS$ +zjeJ!!Ptor8zl*@fuJ2z~b#lG!WEdTa1m3d(t&Tsz)wa-bjsMcQv!FyH$AOB_VfmcH +z8UY?eb$PtT)og8p2;>X$tWHmz6qndM@y3)Sycdo{P5ICBOQkhYO!X~R-xgV)LeSs^ +zX%?~W<<_N=Sf1+v%zM~e4V8fk%3~{=G$HJ}vS@j@*bdpQKN6#J6$vlH@-+1e{*F;i +zz}wz?>h-d%?KhCRmqD+c)1h=3nH^FwvEsmv{^`8a2?>&pMe`3S +zV~MqdZ5=dK3%Sg)kbixsAv^S*wB%Gd=ALFT{Te*Dd2i@poy0GwkYT5o5LAwqeN0H* +zZH>K&LSS{b-wRH>&;KYgLIgMCb&A2_ZB5fVqkAu{f23nwTNG~#N?hU112;ged*s%m +z^B%*TA3P}GmgF+SVcoTmkA<=_R1_rT_&a7(^dX1CFEd^+XIeT=U$8!OUGlta3=gos7T02oVeo7BU +zlxdF({6?!H$o?O$(R@WC{_103$NngTxQ!aIr{P^WOuslVBg+%iwVhB`14P6OF| +zPSQgi2ALiFH)g0j9BToi7O|@;S4TGLW(>EP$u6VWhj|-R7Xo$(At?mL9k_--;2rxc +zV(pc2CoV9|#nkWFu(wF~gF`%g-uyYHf9r*BYdh`M$5xIxMpKy|PvCLtUqJX{%RF6+ +zU0*h=MJu^TBh1$6~;ga +zmBS>@RH3Mi$&S#<5tTR9=Ce!u`cLU``jW2VJ6#}@&^=HPWl3m<4kNJO(A26?jvP^R +zL!@F^u~F>V-5c6R@c3~UWiAKnQ90dW=TwwFFa+M#UP0KpJl{YZYp|gphAO9vo%&y@ +z?z}^I5I`vAy)AILm4VbZ|E5M_30JDIm1T?A-LsADHlXtg;`;&|3{wRR3ce4bAS;`a +z*w?V=8sV8+JP2)v7NpEb@x^64s`hsqFon%$EU*VAq~jZ1;NG2FC_)^%raxd-A#*z- +z&`CwKA#NPIND%M~+4b(USPS@TMDnVKm?(3cN6Z=VEApn|g!~0>FcoY~{l3%e=zahq +z11T=C4vXGEMYhBJR +z$`XP4=e;b3w%j +zs{YTbd6`$DEWo#6{hvbrzQ+CJ|LfqBJg(f|5JNP1EVfXB4GdAfQUB4g;GuOmVU;X0 +z%AsAnX8-BeNh`E$0?avLCnd_QhnD}b7bHqv+0NGteG)u+pMR^0c0|RJ2M;t864R95 +ziTIWEcd|1^8O3(@=9~67VlN3eQO%}@3U-7LdcgJ8$LCqV#05+o9=E=ZkNs2+@!y)2 +zx0*@muv8*VyBf??OvHB0F%B`m!ZhqS`sDDkDwMHqp10djep~ui6rbnoWsgdw1+0vI +zRIXLoplT&^b%g{*A_`O@N_3ec8(fmr%ZevmR?M)O7$vt_xY3u>Da_62@=^c(@|8%q6x={*$m3tf4cTx4_v#Vd+T1TLK#E&aa#C)C>0xp$2w= +z<#>27kTfos8)o;1E(dzJt{wU2s2Kpxk|lCFU$?h?J?JoRO~E7>d0f(Y4NuiRVwVzN +zLa|6HoSuFKdNiQFp|IFXcOI5qJ!x)3MFGMf-XW&FRwOiAbSm21B-tAm>c*MhWviOA +zNE@_98nH(se1H)A)y~4tBjO-ve+G~uY~hDE^0Jl99)PG%PQ6SmMa>(@?cy^u4{c$q +z3s@>_k&6$AI4`jihbcSMMC`Q!Ew1eBthGUVPnU-E!3880Yp=H2_oL^?z-Jc_5a1c+ +zcVHUw{Rcz|%9=U^p^(flDmd#IZ1UH~hDAcds7g0IHz`BB?oDrcP(4P!F(NUnRqkPB +zrx9DOQ#C%TJtaoys(d? +zbD;66+N)KZ_N1&1;{xvH-aB_Y@;m63`KBXfPX3bJ0<*he$C(FHDdukVE}wC +zbzxb8^lNidP*Kwk>6f@caUhwK#(+c-WO5`$lC{RupTp6IX2_{&PHJxq%QBU@OD{q) +zQfFQJhcH#Pf0Neo^z^o0`nGZQx!y+qGuDPvM(ywNarPwF<{65yjuv2Fvf?LB3>3%( +z#$yBV$%3ButX$aF9%(NDvMkE#-MAV914RoC{ILYIp-CF+TF8e2)iBE+^1YA?OFcEt +zJ-;uJNK9r!O+6)B?CUADqtSR%DA*Ms5@^#9Bj;yR0_59VSB3*GYEfE-Q<8@p-K#3r +z1-8uKZojyUnMz^nlg)#4qBg|L^lBmy>px-@#QM^JnG=1F)KsTFkp&u0-Od$b;Fh#P$ +zDl8Ra_b%#a%uN}wz}_*V^ijx$mbGK_z=&Ln%BmTNyj;o?FF#M|OGJ*9W1m+7d=pv| +zh&Sm^1IOCf;6oIfD*$3=uvr8w*_ZhpmN4j}mcriL9d($Qi`HF?8I$0-PexBZ+JqY3cFvwFjKasj{lJ5qIC17ERd>HU%X_>^Bconyk@DF +z2+$i8!iL!TG>A;0(=J~Ep3)#^K10!-)z4?y}feTvJ^V-yLI@DEiMcU8G3`|hT +z60OqcKi~C$*}7Y_sh(Dxh%N1fL!Xqy6B;lCgcvsqyRss0YhprxFJx9)=oXq?bv=QC +zXt;;Jt_A*f_j%vk2cc3QMqS7SjrAhKBkqw`R*x=@-E+<|{Q7q8p<}otor3^{&R$Q) +z-yLvrrK^b>MYJp)S4EoC=+SM^YO!@rTK{LGp557aSj$tq`x|d~?3JW9a|5Y^w_I05 +z1P=DDc>S#TsSHUP{#ZCDk4r&|?~4Msgk(~_I)jf#K6<3Ftx>r9z>8~T9{Y~zDDfsT=dDS6$rQ-50^c}+nN6AEghtrP=!#jv^n00MJk +zfWu!{leY}3#Ze!=LA-CWuvG~3a$;E)rmTRynr|?vk7hog^?`x58hLQ6m2|LDLWnbX +za;)q_rE>CIXQ!W2>-l3VYue`8@B8<}%8_l0YOfc3avrm@O>;!s9O~=cB$K+4B5Vsr +z>qmp7v_7cHsJ$-7re%q|V3U$WFZ}T7)2Fwgaq*!bQ@petQ`|A9fK|UgW8MkL-)0}P +zANx;S#SipYqdu^geW_S=GwK77caHTElZ)l|=1AKQUomA(QC6Gzic(o?eVPP2WA!Xw +z8kc`RRW{1B#GuG#+1og7bFBC?|NG`rjYIFm<$J>51)6wQJz}jGGflM0@=pI^l8Kj1(-f7RrVCRY2>lb0luo|8 +zGiK|3=VgY?8^aFi#a#hkuAeu&{R382-wg>`` +zM$bb>cV>r2magJ5bpnl5!u&wq%TRQGDZAbx(O)$~Z_k^`SAVpR)lN;Exc=IMl05zW +zc97xOf~htHH)hsV8IN5H*v2czp9_5Q6&BVgeATj?m+Js`Y9;-*7R +z_r#PtF-N_{CNY#H@lf+ONu{+hYwG0q@4bgR`0ug%Xj@TM?J;hJ?DC(%f%|(BUiuyr +zrQ_{?5wyP79qv#2PgcqSRYCFiyr`@e8r~#=(%>mmBpDXyT5rsnrHd>W?n{RP2IuyC +zE+`wh8hnQ`Jm9m4z9zlK9jBQBqI|(Wdq^#*czUl<_OFCN)5QLlf%+uuEdwfX35ThK +z_3jKXGZtkmhz%RG|8Y+1DTfZDA-HgYD60TJfWSDA4)(HlogAU@79ctQrzJzifbxpO +zdx)eHmZ{~ybq*+lz)*60V&j?Isd|3|^udn^B8jh9+%@p*!V-9E;vUAP3emJ6EsPuN +z4cPK|d;?**L%y^e$Kcrwx@GC|Td%4A(+D!Zhb$WM)eB0{ra=n-Ser+z{U#5DXc-WdtO +zV~y##@Aq91weT#R-5Ifk9}sn1cCxWw>*{aUdd9AAapw?6-N!{R=(O|VmD!x?*6DTjIumrMeSQpWEV$^Z9�dhb{_EtA7S$h-f4FC+$7U@vL6AiWpnK^z4xXnWwNx +zhZoIZCa*TiQN&8gP({U9$qifmue!P53HwZA$$efG$Zw9qh*7n-oKt2{(NY#f!`Y3( +zIb*vNgpIN}zSaE2^j!=*D)mx18}#BjHX_~$dJlL`IOM4n?E0RbtR0-aM5cDm+{9Gu +z!HS4~X&HMLawQ7Rgh?~xk>!71-Izqiw0=hANS|bw_n(h5Iv`{LI0@8!#2U7qT6=#5 +zL(U)eDwoPJI#MpjPhq8#>n-mieALa_s(6P+rK&nts;*H#quI+fj6J;15lo9@;S)(- +z=W$TV+<9i-w7pjoSSg}axXB+lwfKdACUa@O_O_Vzwm6Cy!FXG{*vK_ReG+b6yVk(l +zp(LKsGz;b$aq<#s2-s@*3QMBOkNcDU7c2_5*5e35uKi=FmrV^)_7`h^?zqwZ{S?_F9EZL%n>Q|y?1*W6tXYKbAT +zBDQ;a-XWlJe7ut~l4aOYv09iAjev6TiT3=qdAS*()^@&2VD?I0F}Du~S)obWeI=bK +z{X!$ZH}oX}51Ay{2t6!SLLMkpgwVLeb(%-Ofmn0HJ+1;xp+gFu0RnBi)lVRl&s-?h +z#T}tLC9h!?gwHxiGX5m7u9G6jM17}r2N77azh4LWS~ehv1i_}P(2165nVc7Vu%K#I +zi(pu^(*y%axpEqNpSKPG^lrnGo99U^+jD@*UCDS&N6lo=q4g0da026KNdYpc+%$&LoBtBB(QB?$V#O1)Zyr-S#|B!#+I +zkWX1~@Zx7O7ZRe$LBcdYyYt=L&QH|OhH;dhS^%&!F{CT$hNbzsY$yST4PGe~IPptw +z*XJbx8Uf+E99;Lwcaglw+YLro7D)MqI)|<^qaa8ykq|!!W+ZRIGkfAH75|!v$h&1( +z|EDdqCj@&Ybs8@x&e;ofhjVR%|*h&?K&LMEY) +zKhg-+R;>CtQ!Rk|=$uaLY%t5{b?F`nS#81q$+h6kBoH}RO{c_`qNpX(nTZnI~Gt}+k{VZidAc>#~Qa1 +zB%m&;d<$gGHhZy4+=xv{1c7AFg{CUcgYnH`!{?h7r1xPUjaBN6rl-ReUozpfPsB`v +z4mqsS|M+kTd(yU|zv-gA5vMxKEsIbYB1tuhOmPi2rkd)%c( +zJ0CyiMk^3gZJrdpK7$WxK{M6+iz8ys;TSPo=PNSGt(}P{Lv(aJ&r-Nh&*HRr{059f +z5YUvS>D7HkG=g9s!bq{f5^XNzbjJ?0kx(jytXpHr?-LtNb?R^4rSRewmeVs<;DEi`Ta^7NI`~97_nJ?6SGRF!WKPc=Kn$qq1jdr%Sk(9!u+xsw&7Fi3Msa@6XJBny +z0KY8y6O*_R!Fm8Y^gJM&xX%6f0zlDW$jd>(A%J8EjjwNA37YDL5+T>)#?P_`? +zt_*#nnnk}FAtRajRBPpxuSlE+m!y7DX>-pb3Xy2@9Pm&)WM +zqv-gYvf5{Twn8$Nde1g3zhtbdd3?TePI59WVa2oQE{tg=Ru&W{h&T48+1Kfn*cTuH +zlQP#sr`NumynYHPL>z2||C1T`9Q2!>gNNU1wocrky+4tBi=B&2_lvHExqYX6*cu?& +zY?oOf{sM6;%kO>%>Z3*mhcPY(-E2CA4W|PEJa)0)=S*66ih2i5f6{Zkp6;Lmi5g~X +zBd!asICy*?wgz+ITVZUe&3j_C+|^t|Duq6ZCWKoBO3oRP41vsFf{B)Vt;()EU6i2L +z9;AFTUiM<22gE=J*CiO}VsXd~-8-|q4DtSNKuK>U(Gt`ln*q&YGg1ZVD&-emb{Vtt +z|GoqQO`OIVl-iNgK6i6bF66W{^7WQ!l8xCrXfkphFZTf;M@+HRZ6Zw}>Nz(G=f_^J +zrfBj{9BcX-i{PosJ6W$$Z2FX)S`RocYp3cY@{nB_l7u&Al7TOqJ_S`f4}C{gKpGAs +z?Y=HPxj^=U94}2Ely3bLmlqLVYJG0a{i!by=55X5J&`Q}m4~ig7S>QZKIvxP5V+-m +znc~3iPC^}K-V}vQWi*!%p!Rw(4U{8hS&CJ!8mjH3;4Wyxruy9JK(o_4uTLwN0NZ-Dp%2k +zR_bfW7C5LenYvzc1m;sgfBrz!3}Maebcw#X{@*#k0Ps`}2ld(>meD +z_FRTh={C?BRC5P$nKz(E#v!9|4C>g|_0NQ58_~3O%rSJBSn=tfED3b#e)7oZCvX1)9cDcmlwMLlIOEq3N=1E((q? +zToL{mpc`HhSCD-=Q0##LY(-zNHmH>~Emcv=utq9u>8~ykx>UsqCZ+L?4-@<{ +zr|%uwc6cbV>%zTSUj;$e#|~uhbKPgvpxb-2cqB9{%r21$1b*Sw8N5W@*!y+`N+qLw +zvem)4I6s3btPhc`m358+tSXUw5&P~1aktZM2#gKaI$5PF!7!l!PV +zW7mnge|BxXH+3I_ZE7bFktS4pSX(mK%G^!5m-Iicoo&>v6)XG3=UM4lN4c2w{)7{X +ziedQtrO-smep@)Dy5vxNs5uvE>cMF7NqT8za9OLr`8rz2|9Ob3!taShN6aVF&RC#3 +zUnj=-{vg8hW(q|lV`eC#fa{z*X&k*Zorv>DZE}Axz}}Fq32$SsP +z-LR}bIK-OyYxj(<9R80w%ys+piU$?)n)FL6B)7$2C|WiTrT?$k +zJsn4Z5yx+%a3dqtc~X#~X@-JCtAcUs12_akCv6p_ndTl_hNlGL$`GbG`WRY<9x)_V +z94qA@Zb21W+r~H4Dk~}`vVE~alj?Ep!?t=*Ted6(y0HB(8K3i;NNg;%nT?evpE4vt +zVDnPY*Z)XDZQbTQu2+nkf8z7~$8hc|Y +zrgL;QkB5XKQh+~RK;??St(Dg@-aA)!8^2DNeXI3*9U&7trVqK5h#+RAW&8CO1hduE +zTt9P>hN{Hcx#2Xp%MKm~&0UjNeTh8pp@PefoJvQ1(HMM_+8sjvb2)MELN~<@!OHLP +zL55H}I<3R_z+7yK-+OoknP={v?XJ;LEmY@&nWOSm52ZNi;Rc +zvO_9dBRRCCFr*=Dd%eJQnDV1@!n*M(%RcN{LG;+u+(JhaTx)?E}L*Y%UFfCw@bixw!fjtq_7)_@#T)ZOmzBANEyF0pc9a%yi +z8IoU&g8>`w`l4dDj}O{5nZ+rL3tRg+RZ%ur#|e1}(Hr14%s=79?cgcT2U1%?u%snK +z@1ek)eYERp3<>9d9)l;b6(Isk$7c8m|F!c>9|_@XKWXa1Sko|Osufcfn=Oru{IE3E +zw|HdNbuw!Rhwjl&tU!iOT)-66I5J{#(7%~`RFDKl +zcf(KXX>IxpTfni!!nJ-`@TE62Yl1;vfHaNlSmLTRpetuB2y2q-RZ(23prqCw^W2L3}1lxUz1lX5tT(7S&rNrSBU`+ +zLU^FbJq4Z_)G50em6{;=?7`&ti8J@##T+5qa>XI2JZ)(nn7uZd +zyaVbw(yvbw<+>M%nYa4QX=T#i|I#)or}Nd8$rD8_tHpWO!@mX0fakB`0m9-vtHV*} +ziGphW76{gR0aqCiSo|(gLfWlp55eh9PyIA=QsvjF(b% +zs(^?czRr=l5eYuN3U;e;EKj<9|If2Hr(hyjn!s&&d1IN{JezfIH>SpmObmwNtUEbNKK8d5#dvs89RCx1 +z7Yp^a7ZSN*{ZkBAoiZ&x25UClC)Jb7FFjN$>Sa`qY1Ls=PT8>vw*{5#o|3@ak#ZEg +zGNklM)t5ztktxf!iI$$xA=b4B>n-PF@5b*rB3}bf#3u(ls09Yo5)B0HB9ma+G9t@^ +z1I&JzXCFAN_22<7id5pwruz22f8;LVHs#jybf9KT7)^3_Uu^GYNdwVmsyfJtCFZ;k +z<>tP^&nlEirZ*&2fc=xwl`|$*Ku-_J@95dMm8*SR6y{ELy$dgO1?^ecCV%y +zUQNBp-$2H#(#L!hn1@aLt@*V(iJ182#T62~zn@Y}X#30`h`8`_rLczU#t#ymo*Spq +zYf&j!tgTX-j+jOmwdejtB*}P|%M|*8+$(mz8uf( +zr>MwB4c~C&@ZGmLFIzjN!8gLFrrc3k&0U8mvstcT8rWk=y`C2zGC8#jyzq#1X5>bN<)@Kp9Y +z(R(&F^_O|@O&nO_l8SAJsR4dIRYaHUu4 +zuR8-#yjIppJuSD6Gt3(((y%>pw`R6l&`LHF=7>nXcr~- +zB)Nq@4<*GJ;ySVp{LojNRBVSEg(ISd)igs*Zq*R(pHM($=4{JmgRBCDKIY9expNq9 +zpbc6u$3#Q4acV)^51OeL>V~64y=5)})|Q#Iolrf`mjj`y<~j&%At|CXq*%o`-9n;T +zrx8W4c_m>sanN8%F8%F_2{OqG_LAV#N?>lqN>jD#eEvC_jY2|E)n!i~r4zJ`T@d8J +z%V(=sJ&2qV^`85J(U%J-fs>mpY7v%#VsrKp-ERC=l}J*_1JkB%};EJSF +z5(|>_uTXr+=h{;w?)z}%|5yOkeeQzgoo*L+&MSteegv+HCRuh_u%K4BmloBFt2?%3 +zj2Cu(#v+&sc-`D1rtkw<-xTUIUFY5n6t^x4_uKPgg(0pSC?Q7%nMe&erAr0{w!Wx) +zy@VV_lDnjIku{PGgLZl3U>Rp%Nn;k6`!s+DxPu9UU`}C`p1{nBbrbFT640{6tx +zy8dzPfA=4SQJHSmF%_wtm`~RUJfGfhaqH7OdomV`;I*b3xz}CR*5;)q#1!*hoY+N# +zP;y`h(^2fX2u?E7_ceCCg;k@avNYE@Z8$aY_f4z_^n3rEzW(T7rYofa?aL-n(icB) +z51Fa_$P}nOxmhU~e^W&_U?cx72F+F>w;;QEx^1j62C;9l7li?!9o5F-m=w7;jc~mhIz7>id?;WZw3Ou1^|&Yz}ku +zEF%K@RVR)$R*q{+|5&S#+kZKopE!a_rAptv= +z+#yt%YrtbZSjGLI&xI(mdqt3l1CDf>eFu+xD-#>BN*xHxzpSzNG~w37Qg{%5U5__B +z7mUzZE694Of&AZ8NKGGK0W>@yE@$)KJk%$CKS5+Y;z2_~5tGQoBYf>;_F$zjJ>(sr +zAG?5ea-foAp&XbaC+5pN-31-I3&hGbV;X-aCC@#8)2ZzLr=+qI8_azcn@RS1DVvvW +zC^iwaeX{-WHlld~wd>!7%9!lU9Pu4i6dM{iwS$rx8>}uH(H%uaeQ+r_X(upkCopba +zoGkmJUv_4a1bF=)*vX6GtfqdJM96?5m`3o5VEWc-&Rf? +zF$y0!s;XG29@ij_@W!~hmb#l@Iys5GnBcnEtpapSzAH;7)qq3aOR&wDBhXo|X3o+k +ztUtjlLglKT3EJg|k>T0k`-QVIsb9ASKZWX4uZ5GT-LR>@8pPAt3oZpmDn3(Z2WpiE +zVFg%5t;5lCbnsh;ncZO8yJx-1Fe59N#v5yQz~cOeic`zGEnv8+Mee{HsjJNPpJ(UF +zRsmV6bO9A-3VF89DfDgO^!kw>M+Vyfsf+hU!-3`OHi?Q=zt_fF-xVBIa$IVPAe(0A +zW4(iO)xt5>RwKTK?goyV{5RWj>p@Q`!hEuv9;apMR-$CTb%##|MFddDT +zwp^|ClgQ_Q`E$1zu9d^-r}99*ODYWgwkTSE@EoyQE_FZ+bzR~ +zq>*N{$&F)!`!7@})>%#;%4L^lnEC5FzNeY}!q&b7z05D@+E(zi0C9ecVbg4_>k3(f +zNqNfos}Il*0BAs9mfwX+Se9b*+aA)c2u=jSHhD-@!%ZT(xE~&b(5yfZwq6`9NP;PS +zXxgbU085aj-*M`mxSYuZ0cGiV<*vRzNw++~4+>B7%~-5sFX-SoN#}2KGhv2P%m1M~e46Y}Y8d~YLl%%IkG@lDp%_ +zK<`(9Q68s9GC6sIlS#?5Rv`0*XWKG4GWentSlbQf;XN&z9l+~h#i+JI%;A%+2yC8> +z(xl?!d-=N0n~%JVsPm3>!woNEm|wIQu;Y5&fL^O1?)QZ^sm?2@p}$16)~{0C9oWm9 +zkMkHGTHR@4#2SJw{lJpHf +z4qUA9mxsD*duOVifzz4b@4&xp-I{xV;^b0r*5MEp;5UkwYTwei^(hxscaVBn?=Sk{ +zxxs>fM}yVc?XIc`QBi7W5*6Wxc;Jo`I=NBX2ycv3v`LjxQwUAy6VNKBLW{&X3d|8} +zNR7w8GN2wH#pgQ!vIO+%^mS)+h^V+m6D4ViWNR@RbwzuWBpmYUTFqD|}VidqxU*OB> +z#z9SqFQhJ3cHvpnw^8omnTLE3u1?(1?6NlL#Zz8hwTUU+AX5tqkJTIo*Z^K!#m84cf1pQjld0>kHe3c_7vYqwzH6T8D?Z +zhZnGGU2!iO1ZKt6r?9mcHlr{i6(KmUc6R +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 +zJU%ot#=k_su(1jP$ +zigcYUw*F!}FjWT&!HQ?C5XzggrEoE!S>Q@w28ES8wt!t~` +z7@qjnVEnJK&`?w#%aY9B(<>?;Jr*n3pK`i?Mav&AZec2n=_)-|5THp=u85c7Bc4vA(d#e)pEL#T0+M`pTz?yLaC6NI7S8 +zOQ7w{9Vk8LHAL0b?Ea1Bw=(gQIERC{O_P>)NFN!dtVN_x9tde8-4f4~Q^C5!Xj=5n +zFVQxsgz8)Zaz1sv=Xg|L=T`Wh*biPs37IksCjNQlo%v65S`7qMXx_O+E4u&DSY)(u +z=5mn2tFF6TKshx8$}hxkyT9|xm_9`~%*X8q&FbZgmr99F17O~RmcWtC6+fhEVlLBl +zp)|1oRlhXCM_i~EL)H~-OkP~{=pOa>qGD7pDPXF@7#|u?YH?z88TO}_AKei1&I1i} +zIsC&j6sYU*)iIrH>7C$#unTYWbws2$X+XM4-A_<5Ercfj<}V%Un=Pths(#lpXB-EA +zvy&`kNL%i}6j!YZj-`mpRqpkJn=OMWZMwS8I!IE{)(!+FY5(bCtyL-%=y;+36J>(6 +z0IHW1*u`fT>vioHlTnt5!QO_vDRddLa}@0m((fqO>zcJ+$)0{6fnhtUCqk^dS3=p9 +zRi=r9iC21DoH`rIPp9oCZxN7cR>4_NN(m)eS$L2Re!#uA7QzyMnHwK<*FqE_Fx=5@ +zqa%T3i&K5!dkTTs^F!JnOw8tX0n3fvQ)^*XUN=-?j!qQ_P{OYP;bgR&BHz1B5c&gc +z_~@t4RPKQMuE5s0+9i~E>A3)!2oXy4+Xwf7=mL`{GyM58s+RC+nHLRj+9cQgYKNpl +zlfWMtbl`hCGe(+g?QHNs9`{78fhivI`HjE)DQfjTF{7T2GAP)YrTfa?QutaDH7D;p +zIXed@so+TDklUJx{)+p!Ab&S78hLMBniIRotNhATxJ}otghcyc_Zt+`j!U>IC#95)7lD +zgYPjKnt`DD^fEABy}sB)+PHKz+;^D68X3K;<{d8<4w +zFF*Eey<*m5JvDIethU2M5@f5#3L2-IxTVP#qYZ*>B@;dR6L*Y)zrK6fD)gD{E*f;| +znh4}nK`oToQuq&v3Z`P=uX>1*3rxfua{g?O6fwm89=nmZMzF +z1|w>^G!_`1{z#UxpE0DOAA|My}oAV +z{eVdHmQJj1POQD`x7Xpv-M6?*AGnrY>tIz;_|wfmnZ1s=Zf5X&N6G%H_vy-NIsmgY +z{_pG;U%d`k<9YukWU(`Kmt|z^K(aV?>V}qn6`@5?yt*F +zMFV^$ycDJQH-go2Md&Y(n%*_BzBT4Ac!9KFm^DImpAlI8o2^7_pFA`}f#5WsHD|Vs +zz7OnnGh!vP6A{z}f?RSOihk>2=)ta|0ZnjBAJ?^^KgTw{_A|v_ak@XZE +zKeY@rc0|kN5MUKkQNHsRDoiy0uzUZBP8nbP5sd4T@Ho{<8tRkiz#O@TS&W%=u`mF_ +zQ8w#i!G61N7SlQ2Bf~1b!4?5l(yCRgoR8qBjZ#)$iMlHtJtGr`ITz*fo9Qx$zBs{= +zmH?6Mze1;D0W?h})M~Q9O0RduWEY^SAHZv}N&*FYxKbn`q)J!UZAH|7D7p7B7T;R9 +znO3}a{SS=kw=!7-@uP5pXB(zhlZIPirYx4{d4TWPa{_l!7KNDu_ZsrKClwY!8OpN( +z7z4ucO{F=7e#M>2{dni0FQOO4WaDdNG+pa8O2L{qGvUB?IN7NIQED^(`(Ik0mj7n? +zh3^YKOMC;LN|5$Pb&e0FDuK7Nj@^+@O?XLF7)=rhEGLq_ZHox2n@S$_>Vadr?0W($ +zp4Z`WI!l-|j#RUvj(6b>oF?C>Uec0k06RzX(o;ZZ40w8o?A^PH1BbskZo9hh&1Q5% +z1T`4bs7jr1_2i?WV;c#Sc)Se+s0Aj3sXKvCt!ds0=FDwlpGKYS)?LC$dVukD-rcBk +zT!byn4*mNBaW6L6)NPWhSXPoi&*O3u%je +zx<*{a^fnH8eKQ_W$F{<~<*_0Xx^0jYVf&3JU;y(J^-@3PZ*p#vNzK&iPo1c-LYW+| +zR(=Dn=+k0xiguH=lVWkfb`ush#JQqzq4lT9DtIe@uh3rWvmaD5co)>Y_d>NfHkUoT +z%AABt5ODO*Z(YRty#%`Sz`rBS6UvZMt!>Jb!2GZEvhH8sd0WYulzxw*eb~w1@6&Jo +zkt8t(+gH;+XU~*;H~t&$^=h0kSaZy}4Ho*S>6`nf@40rnUO#ZeC)*?pl_jPIaV_YP +z)!!S7^s3`4=yT~nJS*Q%?hQWQOPf&FQdjlAGZ+kZ`#C9uHRGHyAFoIM&{D<1%XpwB +z`tKVQgzFYWzW(uC6Kn{GL!`y(dI#3O_#7WigF40!{r-K%&0oR9P8U)d%Y$U#bci~h +z_hc)^#4PO?e*9|p0zn;Jf5jo=DeOvuWA#hKpt8YBHk1(fi28-@elM16*gl5TS8v$eVW+BGT1m +z%^H{F3!Bbz&9%@>S{)TX`b^UAK%822Lmqv>U^csTy2TikVsDzvd}QGDdo5Nbg*Hka +z4|>SviajbAvXOW`Td^7bxOJ&w_18PSuyuL~&(gdQck2xp&Tw@mwON`UWVon-?i_HcEX{WJH#16~9{8y& +zx}w+?eLu1-=yiI==U=T|jknRmmRz7P>!=S<8d36wgghT~9o3r4|z +z3Z|C5hGtU5tpYv_2(E8ZXO}ePOedb2aU<(*TH4rm#;C++PKI9|=gBzZiN)S_?4-4g +zuE|HT%ac$+_YSq14BO1e$0Q;cN%=}o=x{+=Wd +z5(V$VdHvH|*+uvS?5h)6Q)%^{xIDKlJi%Ycm)zl*`Wr24f~l^Ds%lkpBFsk5;cp`8 +zd`-S>#k}$xi&2G~y#O*9-aik1qY#A)J0ZMZEgyI9di){|pLz9m)rN@O+*{FKK`w0i +z><8s7u4rxccs@Z~?HA9voK{>_z*8j5?$!Uw+<4)m^<98%Nb=9Rd%gTj@=IC!fj!|N +zsR=>SliR?5*HV^tY&Pm~M`2t)Z>*3p*>VgU&RJxL#Cr>~?!5Th!wAhgUri0GLbmT@ +zW$`@?JAe}QswzF;ElB7}*6{)S=25}ZzwRZ=PZ7yyxXe64y^I%eugI>O<P%3`&UXbuQZh}m1R5|-G4acLE;Auls2`IdCtj}= +znYW^4qDCng6y|L%O9qcLb4Q!6<(A4keTq4q50{{_Lps1D(xcyy+4|rFG5`x?1Qfygybp|Mh^F{APb4B +z?)Q-pHaev-3vPLm!-HUk?Js9PFrz1_x$z+msMe8<4RtCJ)itq;u7Lu*VKPz)6;$oW +z>TRY%Iz{I>H7kA}vl~U%mNnElY!ug?+&i~xI5qMU18YkDwMlB;K@vLpr%qM#ADT~O +zak(;b%>y>dk6ZG2j(lISLexVlKaZqik0v;~)VBrc2iU9VdVh8H*z5iSPTU>~yQZPt +z`N_xBFS*+dt$aAx4wly4XJt}^cl`yIR@{&Mx*|TSjX@~X`-^;Y=>I>cR!-;drO2k=-)*Sj+o^o +zsiYcjA9*Mz_IaPV>nkM!ARTsp%ISdjKg+K0=VnHW3a)S%A>qs)N_?H!U?N2EBm@d7IYPW7}busy7f=%{kJj%3Tf05rqIk +zBeIgDh+=D*u3fYcaP7C@W3jLX33VkUR}^T0sNWI^5B$%Tnv1`jriRF@^G#&(y1kOx +zrNMMN)mfSLcwyYP-o$6foY;Eer(~h2mBxgRRYc4{B3TiP*H@*gV9^EOoHunT9^}gP +zUnl5^Rpn^rUv`Q88yX$p#COc^ar0QyuF$ID(|l#o$3S%+&KID(XC!Y|0szHh{Q*S_ +z-~cqmI6E0prVCGe>1C*Nq!3CA#^g#90MWnQG1YKt5X`_1FpGMu^2m}43#?Ubmv_m*C0k{w~;5cE!I()0DL!9c4QwzgFb4Dh3iR;3xh_GF~iGx{{vNmF7h%_`^q +zwL_#vl%@x(S^8mIHx +zj*&v*5N&^K!lPcGlT)$LpSaD*uO4;xt0A=#6ON<9Pl&}I7H-T-bBanZ{St!e%FN<< +zuCZTL;{AcqLfVr-M3Cd=ssMa|i%Qc~%m}g72 +zapFuESa|mE^|k5J?Ao!PVa&UWzS$>}v!Nv_(HCCc$H<5w +z!YDa~0s8NFlpE&MlGdYeacV9d8S_~-3K?%1Z0&0?eIByrY5mN5E@MmasFN)vT! +z9Mr?8l%eMiP9dFw+$8p&a{G##b1)d9)0dC^4G7uljY=GPTkdkPnw$1RM-qoV?;=^~OHH?{hK`HxTdCEfMU-I4fClLAI`hPR*x3b+f}oc{1}kE_ +zNyn*Cf~q|Jxd +z0gZ0BCS|uD-(153f8|xmo;Hzp$Bd3^4GFSxlUKL!4*nVBK2<}+43WC8RAZ*7&3hI3Z +zYqEaSJKAMn(lGZow6<=b+XNB}>olT!1}m@SuRvi3qbY@2Q-aQ7)u8gA1eyu@ZalBb +zm45LSP)+ +zVq0Oc)>T%8UmY@Zz9JfO9+XWBCNs}Z@KTOy%A)LIOnd1*#0Y)$d(@*8;u*JlYFf5* +z0OftR#t^I-sa(H|I^+WsLGWIhnFXUqyJHb3B@cf`=qa7-lg)rW=N +z__2fn_A)q-#j;F(9Ei2H;8I=(j1q%Kf}v};BvVy`b6uZr8~4F{%t>Hh*p{X*n%vT@ +z&7#13w^?=bCiUYI5>>8RI=?jbLybQ(_tF?IXdv9j%cQ)C4OID&$#eV#6~0z%{0hO+ +zAI@9$&JD~qs(k9ZI^`uO_v;L6`Va$VQMn%kk`HTr5$(g{gv<$ivZClql9=RdENHDt +zj|5}8MTrMV4`T_W$dd@gzF-B#5Fc}aHh;v>9ozuDY_@Xa!CJ!rkV`EXAleyG9*G?u +z(hN)mp@IS=b|k+7Y{Ox4)bROUHYW|l8b0wdnM~+z0~$sj`Qe$$Gf}vbK4m{%YIw+L +zvy{CPQ;>ujDXpxOz1PPO_fE1@Cgf3uU?gVyZ-(#V$Psd3xC)T>V9O>gM?WX2+# +zU|R{0`}qVX0T*&5QH20zyI%6<>;@ZdL;$mcqks7kymf#dHBbb~Lxk6M%& +znmIYx63VXn@MXO3(UB~EBCTP8N2-GV>Cy(o14eoD$%PU-?S7u~=*zhOdpXJ^XY-0i +zEQFVOX2^<9n^UD3sv}&w@!igSe%!9o*crvhUw!29LiA?%-z`~deUf|rG~)wi59fMK +zgKysDPYM5B7xRS-KFsL2#m%q3;1(vZ!V_-Vzx$F!4ClbY+RTq0!r-(_QpM5h#K9a= +zxGuzRd7w(?92(|0_$okEfwn$ao95)=gI=X65jUq&ihfe5dP-_2@)6H@#*=e-iH*1I +zFi>94i*MPD)^ep262|&Deaw1MQ2E6ps^Ca7_mc}!vsWOd4$sUEM;n>2t?RZ^nECWY +zT^q2326jpC1?fkge47|o{O-t(AU0{c2vw3;!zh*DAW#AF$MEX*+L +zwMf^Ubk$=G8Kvy90g6hzu6=g0zKnkZ{Cv)c +z_=UclYP1dI*s;x%tEri0(aG5^M~Bd}!P|wysk%DH6l-c5Fu2{{s_ve?U92g9V=m)io@}eKFl`aHl +zTo}z3S1bIrW4PS-&G?Uea{D)WOpj(H;-=l!9173x+dmY5DJHr?BBcm1)^TBH6xX{Z +zr%JFf+Zq3U&JW%h>Vys_anb~EReRPL~yAoX;DM*Anx;$@oVc+jdap5OP;&TWotY6Pj~JFZA+PLmos!8biKt9VfQyblC= +zWhR8|c+lO|DhD0`J+zlq+~FP_5(j%N;fKrZME)f(Im5wKc?r%V;+S0sI!51m|&Nx5me5& +zb{NyhZ^1_0PvlniTFqc!>N4cc!rniap>FE9>(-us1hCV%W6Y1sh5fi+T50zhYRHQ; +z7y^g=kfDyVG^c_vQy;9#&Hc>Y;-Ymf~eOOUhL@KGfvr8kAbi(OO=w +zRH$n_iRj))&a7(;^8Zvf(A-aw$2{y=^ej1vf0PXzlWfY!G)qxWXomB#G57ZdMS$XL +z!QjK>8pP;c3>AN@1W8QPGZn8&sw-)?Mb_Xk$6ElmBhLiK_dm?@k3R3bTssRt_cT9h +zSeckU&t7&qT~*${g +zUI)kJ-@Ok8)MRTFl_L_51FhjFY5%s9qdO0iO7A!?5 +zptV4*g7CkBK_@R+o+JI^g^RvuBIRTd3jJcr)+w%u(y&*{4aIpJBG;|X;< +z#fANbdF5$Ck4@{jx-{?m@Gi(r9$5ay)g(}aSoU`|q;^mmzsD27ffR}o7(I-Zybc;& +zX~cOzT*eg?y9e*Mz0cf=Q$Nq0w%fYTXeGh?j?lc~hN}I%aWD*T58{9R9sQ3Gc$l%S +z`%%l3(2z{nPV`Aom6x~?D`1}zydrW)+&1lu*p@JA!R%GQr*~*%S)l0IT!VC +zGs0Audggu|;;%){#&QDQjBTY8(laXIo>rjq5nDzcpK}Z8&X(9|opW^VY!(c(mHa77 +zrN%)uRL0pl5B>Cyjv|G>Vc_REGcd9`o_b6v&`5*!H(WbWE=BijMl+_2+O0+eRHYj7 +zmsa?cbRvC;<;?#wUK_af|Kvw}T_$(dF~BU+tp2!paL5v&YbRv?@#I>?rv-9g%7pYa +z3vZF(rhH)`Te7frWK!0%HvhL|X8UMP(5JBfZ)4`s<&_j)^xs}quPSA`=w$-0Ut@pa +ztt&kn&oYPa2;z7Pgh$^WCFLZX2Xd^bOa7%HDf~)yQ +z1+f{ASA(nok_H0CnA!?fOY~x!XmB41t@oh5(%Puf@h{-LbB@@m@1SO~@Qv)z@1eNf +z`OZ#ZT@=0az}mtuajQ<+K>>_Uj)Rh#w_i;_q~uTcr6$-hUC%VY8aTQvJ@TACH95$W +zje0O7Y(kY*12)XH~Dk7TuXmG)l +ziY`eRrH>G`ZSKjOM=Uf+V-}5NQ;i|WH-;Is%>r4Aj+Hh1Bba?*Cu6qFGz<~DD1S9O +z^5qj!_V_WARK~5raNeBAsv(`qmZ|!0#8!AhUE>q>j;W?1MJ8=Nr9Bn3bo6D!y_=!p +z5?fqV!o3LOO3&YxNgVnhp1h!)DoUtkcAmliu>e;b>6%i@F*3#Cfx2!W;Q<>EREc1- +zrIw<7>}d(0r#$_`9GIEh-)7YyFHvb#%MpxP5(Ntt0Y-~BVc4kk7i1=tJulQAS@Ve2 +zi3k*kd5JW@_N~%awW=GJHtN%FSp+3Fx-tj5P#W!h!?HRgk3c6KN~*&s|50wSs(@HN +zcXiZ#-SZSCZy6KzUHvCkLcxtA1yEMYZ~RsyyQDrf*UCG?GvTogEu9Csb5@7n?GWOr +z+tPS%jT``Tud0YW7>F7j)!v*-Z-w)0jA7j*bZForHEq3=)yROSdB$2=FlEE1&6;0- +z`u4nfDEDR^O>5M^Gs!c$*|bkrPv5n!8nvB7AX1O5rM$d}_ +z27W6Fwrm#+mz{Zr+vQav4J0Lokq6oeN*G_SXzj7c?>rQspe?1)t%~=&RC`>jp?Uo< +zF`i(4*ZwllLBArHh>L{X`0=e+jUMoh~9c*4HL|0dk=7-i^6PX&xNC07R0GP$>LGRHs1_TyMO9k!0UcJJa*wm +zyl1^H+)nl^f?UhuZIl(edkhIX-)x9i6iMvO+F8~t>FIp_Ti1~ZugE3iF7&nl&>V$5 +z9yfxBm3{(;LJW`c>Rjq(XMgTRJ6N=dmnfnkxyp2H*K-eAZuCLO6*5JXvzy=>rCWug +zC*qrgpv@=|phFIMBh*6VbA=Q0h%-24sSis63%a~4H=$f%mpU^6R1yDvnE5c&Ku6Go +zKZ)^q>_F>#jTQt?mBv%yJ?-jo_dm9EJ=>V<0{@ft2y$kr#rk3nWxH1hJ0Zco+=K5} +zzZ~fU-aqMh=$kOm<^a+CIgAX9@f9i}7arVjZiw-b>^)neEmJ-M*4WYrPq%Sl;ZTg=H<+hl|MVz3LmDtI(^cjVR0PMc~Y7N +zF_-Ky;CVoW&WIG+U9HWLh$a=F+y6J2@=8^nj=ot=+o`&U?oS$XTcJBSx}@aHz;NqC +znZ@7dVOCj{p~+5F17@{S#M+5@Y4NbKl$MuWf>t=LM#kFZ31)@{*<(fz#E}{vRup-y-ouVgb^UoeV?ydoXDFAjbp#6;I#gv@;yoQA%NlVvs8n#6h+`~V +zKBFVdZ4yI&Rp~QPFmQG+7()gne1EwUy_2x!Fn9P(d%t2W+}=r_Kn28pmfJ9r`*UpV +z8DGZEks6ysW_bPya{^PNyscX`ZjI)+*$s)}zdhQ!#58BLOQD}KjiMhsB_%i_> +zvLZ6W8=u2-RUbXU-%Qgaw@yEt&@3mH@bLM(7lFqpa< +z2ug3|Yf`avzjFCm{m58ep{x9TRt4QA5n>AcpSYl#5Km3etfb3;-S0a(@Q~0n30%(I +zv>0fq|fRtdQG-8tUG)SEtdPavFcT1~Gq$#z{M2 +zgS&{o=T4Sf>BbAgp<2Y7~%`F^2Jpn;)X?mG<2RXA_9_~ +zj!c~~s&OdzeSZyjw9V3btV +zH+=UyBc|9#y^6P(m_6%|C#UI?I1n~Fk7j4--3UN&)P4ZuZRns5@lbf(KwO~^0bIl+ +z@Rkb{b9a0R$_dh7O({#L`dMVP?8m`0ThLvlCQ#VoA3c<7ENA&xyS2ioscdG)&GE~S +zfb5D>PB)Q`Nm+s^U!U-KDU~$qv>kZ!E#@w{nOZ_*^2zc~>qOa`XYF1M?-OG+b=`%~ +z1uC=4ia91Rq1W}ra^Jfx5rut=)~u3rq;Lln=aipoe2O@zuQ-L_IP7pDek&FHfgXc? +z!Nn>2>l0mw>ANzcgI3mOuprtzdiaFfX50i_kX)I@Imfj4ka+pbrqB^{>+s*m3`qTk +zF^u~drM+G0A}QCxL`U*+P#&4w2;=$W{_ag;B?r}kV614_0`hr8QKIQVF;2%&i>iSJ +zn3PwZPRCcSVO|t;`kzyjHIgu9NE-)*JHi0oY|W`7KEA+-2~Y{vBsF}S;0Qv#ie4my +zdvSqOVs(tZ6wIwR^)rAtiz6zF5ep~2iNe{vjhi_IU|==y`2h%1ZuSuU@=|d$61$b( +zb<;&{feQ_)HzED+$<5?nsG{$$ba&Q+JyN02R4X6N;ERs%%)O8YVRYdTvG(+k(;M`e +zA%U5UwA!^S5<5g#8+_zonl;&hHryx6n(U3Abp(o0$M44d4AJ}~cVs=(11TDI=q%yf +zJ(@NJ*yp54eNYwY7K6U8(m~1K3FDv?({)DgGiJICso#pan2_7VrihG>#8=kF7&N2| +zN=VIYx;zQD3Qr-Oh!0kPSYz+|A10^scLrc9}qo@p|t~a@h-@f+*UlPUqlgCjr +zvcdd#LG5X)J+3t)#Qgh-`mML()V6EG_`UQmH200sB*<6YW%VS7EOoB)K@!`-G^TMp +zjiHE46Xy;_6$IB);eIqJ;jOTvhoG1e%MK#s6)y0)OezeR>lO$S +z=k|cqzOn34;-Ih=1f%b8Sa?J~^(6aQvZ6bK@Zlr>Y6&VH^2Q{hI!M=$1o9Bkqo3Eq +z7jFxcRist@AVl@F;aGw;KbZw%hodb7{R9SSmx-av +zPEW?4zcK7hLzE4){fC=Q{WvP;F{Lgq+ny>8>TO(W0EqMb6L;<%7w(;Z+K +z8e%_W3I8*Fq+jr!On3yT*rBr@={ZkcKuBM`#C_rd(@o%Z!wcN8l6@h1gA?f*&K6xQ~<2aXMVCZ0HOSXYkAq$k!`M5#4OI(dx +zH^krexw>ZSk-BY#2lb}(5}%7tIa*X21w@DaD23W(>ZB}PWcb~uk^vXK)QF^6mkxr~ +z>F`x8c$Iw4xk>Ak^`H@|p6C5J0iq<1$qv2TH-4L8)77!KoDFMrGjlOF1mi3XT?K$avLtS#lv}>t@Qj{r83xLga +zucxqz%}dDFhaw?&UwMSZLLQ2WsLRht0O)ML5pr(OAt6;5l)!ocxURyA+GRO|A%((S +zQ*#hCLmar@DhJj1yO{yM$13q_U9pYorAVaC*xt0rMFiclN}jnF+dQhoGK3^Ylo%*2 +zLHy``?f0EGsakOVCv@E=RZDAs)PW0jw_aQ^usPQ8E|L3G#XQ*lI(97matMIO7ZC0* +z%KBJjco7_AL0zo+mt6xkGDBW=c +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 +ze3yhcdk&uXr-0I{zy51U^Y{&y)s +zVDYQ-dJz+cvsX6eaj^D&hbFVai_u7RfU&)o!hs$Lui118IggFsmF`w^xxDsfX4&fj +z7RqLKR+ph!l))^M&RXmx=I|(;(sD-w?Sei$g@>P6h{Krq#HeL@vqTW3Q_$;doZ+fv +zt?YL#5!oKYEuP5zLx{Jp3cEdV5M}o@&=(d}YR{8ZUj2^*?I=?yH*n(~NqJXLK7zvb +zQV?o0F}h}#c|^6*Qvh^c954c*#qK;kav_#AgIYunL?9XN0qmXQaKEG;6t`Ch!`$;f +z-dPw&CCg8n5SJ{ROiOs%)OP$8BpTHg7*)Ag-{UFJCO86cl8J-gPHmYY5k3+QRB3_x +zL_ot`&UB*BQ}&l?2|oAb?#Nq~g@Gv}**{ITfk#uB-1@f?42;mgbNjr(Efp0r^hFz* +z5#IT9f*!sk-&SiHx93TbU(L}x6E3FXqOuEAZLkE5O&dSo?765 +zxPJFpckFLd%M1ta2B)?jJu-r#a!Yr- +z6eiZZzRZ3x={Ry3{!0#C?Mm=o9};c~Wm!K@zK0B##HV@2wrnK|vvx3QdEN^@3Pt6r +zaT08DsSZb;#+=6WKfGmo?Sa1Bw7YikmWw!h%&HbFKSmDtrr+>xZIFPkqO?Iwz>b%w +zm%{ND{#SSR!dh(jgXe8Eskbu=z!7Dh0;8{hu7ySY02?Nf-J`&6n$%BjI!teb0N&b% +zUsJF|zhyxk7(*@!qnB&Vj0;yI<_8-ASsSu(`4ucO+&P08(r@!1_M@f$>w^-`{|Ewx +z?@a|LCGwt16-XNnn)gorjv@20dvu7xs7VSN!7p80NAADDV?shsFaT=+ +z?Io>-%2V2ZT-M468yD!sn0-4<(2aGW=@wr^CTH=Rc)Q{&NQ1`v!n7 +zLT3T+cV?V-y&CK2Z7oCo}Z96I53;8!LGoI-AM8kJShte7FqtF>?KGCcHIfzEi8Xt35ldn33a0Q(up} +z*xU>g_d3~fxxG#aC>HD2<%)!A9bCfGpwIy31rwgyZo(QA>A$tlm=$-Z7!+L9w;^ac +z`ts1fZg}YRX*+Fav9H;4UT65H9@lXRU7Q<_NUfP6p&CY=3b1fxeu)iY4dVh8knc0* +zWT!GL56IMx_Fl_~&BN=eF?K&Cg1n0QnED`{3Y2iZM7`H4<-!Ry!gAd>QI3~;;;y-q +z7(|>nVdouGK&6-b!qzz}RU$6hJgzCh(qzjkIKP*WuamL3>mM9g<;r3yG4h8{2hHl4 +z_i7zn{x7krnaic7*rQh7WsLRtgZ^R<1UfH#g2&Xzsm`NIb6;dCcup38P9j#0lH%ssfw&ejoGC7(}aLUf$rs*d=h#73}$u_lMl5vvSNT;y=#m +zM`Yo`5n4(8L3Qs8_lSE&xfdDJ;|F{3*6Rm4JnbDlp1dK>891dr9?7j|v9-8re|nBZ?Z<1}No}j`H1jeQ0STyO +zMj#BuNFc0*RE}SfxOtu2>e`{t +z%$eutBu?U3HSmEV;431+7k^cZW&O8R#v?D!fEIgK&*DYWi>4sUmcAymRb?rh?53$1 +zIkn++6p+jr*loII4BO+W98RfS@zG1_xgDHTV$EYg8t588BVJ(+N=?RSe|v$UTd9uPuE1~nF?hq8jP(878TlS +z7VIZ%xHq0zp%&wfi$Y9A}~P6ECFR&Q#g;Ol$3iw{{qumJZeU;_j*$Z{`L!;tfH6dv57!5iq)RkejHIpQ-ZWb@p<>} +z6slqV3|HJxc2o_}WKX-4rs}ac=|5QiuKyOrlCn+T3t*9gqp-pN=;$-qme1t&U$Osk +zyVz_7w-%ec@-&s~E$b|_LhOt+=YJ$dk!{DkN)8glSE+|dVopVo2KLvaIMZ6W24G;26p91#yG+IZ +z`&QpL9are+fA0X0Gc}Va1*YC?N{;izbQ*AU;dS1RoBh@si>50|Q2zR#n~sm)v@$Lh +zZ?-oh?zcbw1Tm@G{r)Y~#@7s_ctzy2)V@oO>ayZmi=ebkk3D0B+vX(Qi`cZVYbxV3U76F(WjPu{~g^BQEteJnp!0qUy4Y;F4CAL2?S;(VTy +z1(vE#e{L4(-f5H7tt$$)%=8!f1Q8G;lb +zn{SWk7N}r1nVc+$2VCNraa6|jWOQ+w|hCaj32-YIL6afaeQ0R!a$!4SzIT`h@S6Z6p45lQi&rx!nc +zEUg#k1{?Vee=IqMr84>79WQ7dCwLiU=ilae#8D7ETl}nGkMwJr;@8w^fUg#=_*Q&x +z_US1V49w-%az=@_Y8>?tMj{pQX2p2Dw?G +z%wDmaIAK)Si2*r4YWb~Lvmy@Y@r+Y~s_fvR70_&)(@2^OA*j7@@r@ZnsP&)y;3!v+ +zHVag|Va#x-Up8be$HO;PG*N2#fM$|eqXfNq?w1^w8Zk|@E4*g|+GS~Lx1xEvhErVk +z`T1HzVvq_sNp4Rn&FZo^q}Uw9WLZgEq6Ze`tbB6PEOpzd5L55htT?{b-N2InYiYu- +zS%6GJ-~a5yI3u^HJK~>_Eium2ODFL|-4meo)805Y)S%E=G^OD3B`neB9yvf!Jc?=& +z%}2P_wz1do*_VFoC&aL4%ntwFo);vMs;dT;_PV0^ViLFaZ8d~^1Ky(3Ssg+>vXvU; +zk<-kpt$KVOxZCUkPTmH+?{6H^Bt{Q4=UVxO#@X$(3$(%-1cpaig>Rsu!z-nJS!GZ+ +zZJ>SVDjQjvK_(3-2$H2aqipY<>|5X@^nrlWQY{c9Tvq#xt;m_?$9<4sWajTfIT6{+ +z!v>^bN_95n>v{%bCiQ1tF1p2nr>!|!>3?O{U4J=B9%fkF`f;EMY`YyZL5^R6fYj~L +zgT75J32RUEkfTvedBigX6bxTnkrc&dRM*}|cWP792N@sA_u=*!oczuLV<8lNnxT6$ +z7;c&Cnk8E^OO+P&L52#;av=)r*DOio4ehS!BU@U2NCikghf>?8mKZ?Ped>TDQ$urY +zmnY7|wxlu~^HpxJ_qz=3q#%CIsR9c(iFr}D0FhiF9CMuzJ{%kXj<#u +zo?XT&UzO(=e67ELpH9eUcqXDR-w%=CT_20>aJgp=7z^E=)a?)rKpEOed3N=XTv(1O +z%hvR+=!-Xs{e1WgcKhh756Wc6+p`6S)KSp~t#U*LtMAn&^F*4pE)r@~S)g&Ov}V|c +z$L0;g7LR}`)|oQEhtnx$=TD4Se?VHx|D(o}F8PM&Z6+My1lJ56RW+_(G)H +zVxKJbwz$GmXVsFuSNj<%L)5yTd&aR}o5bkaAbgf}8NP?`^+wzWY87*7_D7QAPA>}V +zu05Vi0qM!bCgcWJZ3O)ZU7W9)AMN21MJ2$#fQ?(#7fl3bO`4Lje +z23}@sbNY}6Bx+|6}PAjT5 +z?t`|k?Y+Tm^$1DYnQ~RZ25t4#+Km_-tB{JSD(x)({+2gjj;xMdA2o+fM&g_Z{ma69cUHl|RmYi_R97;`yHw-@_hn!{f*S1a9 +z_Y=N~Sr4(wT4Z~?<*!9Hv~bB#A%~Z>lQ&pKe%tuac5igcPXqsT@|g^lOi0CtNoJ@m +z3(_!nVV-974;D}(NU8@Bc8wJ}$cKGDzJm&x=xIL6F>vs>(_S7|v&mKH)QZO+qdFD{ +zQEsN`_I0h&_^3wVqAxsu+m?^?AcnLULBNo=h|Ls5Yzuu}N`15=64ZoQS^ft;DO7^N +zPMR%PYQ<U(~Zc)D1kj +z!=J*HW&leY>0Cq>5r@q5M!Wbhp{9a|m-$V59y#A(^WUTLB&JZu-5S=EUgKhgJZ@vCr8Ai);)3>z9wP}wdmGJ=?j +zC2v05gJWM*+%Emp9hZCewAcYSvt=`V(C*x`2GF=k3VuwiP5T~=R(#j0hSNUwjE +z=3HGxmRT@g`W*le+Itq?S05TTI}zI=%a0!ztDdIj2XIFutf6^G9SH{&HkIHPxtY|F +zpdxa6{71ZeMuC~-M;C8{QqKo%@_jq69#G#c?7H{As+2hrKB9qg@7Ix9H+<5p1wkrO +zVts4f#*@X$+JB$;!yLL}|5EXswOJ992}Y*>mU?DOZ2ROphIDTwmxr}VmnUw~CBDGT +zAynG0gAlWC +z2eh~s;n>6j@rQ@t*G3Va@(M9BjS%s2nk`2~PtiSH5YQULN21vV?gNF_p%-0PwovTw +z^hd2oo%+;4Cl={+O8YUk!UTszB6cQ1U}z-dw%hecX>Q0rmSzu5NzYhU +zAKR~Pj`5;vx;|DCLx<}JT>UX;ah`!}=ylY_%Ws+C3y|5c$d-lyxFx!$T!ohU(uGO-hBFCaGJrn%i_1A%q8l)ZJ_Z9PXd@2lJcv0Q58CKi00z;U3MdKlfv7OAhH)4)6 +zVP56BxZ6i@mKO|{a*H7j)sA5gQcU`rL!PH9b-we#3E5TNfbo9i3)q{p1i3h-U$_I*|b<+~Vb0O8zs>Gvy8J3#ol&3>&J}|WZIe04gLTYuCP2k+P>P{WoKhwD3no9Wwt7ntjKbRXo +zQ1Mg02pOxANvGn^${6f1CF%|3)F-x$pXT}5OKNwuWc;$rnQ;Oj5NeX1g#FBt4Zbeu +zWQ+XZkFR<t}@CC>~{gdJ`v=!_mB3L(3%w~_L7R+A`J1ClN-CHd!u)3U%xdy#cal2ro9o{&ZdGv3p*qr+Rr?GV_vP~6@_*FR +z`3(7(%h7{(M8K+(d+kN-`;I&os7)06nSLs#>eh|{K=kxg>6&=i4C!i)eU^3MEGvgX +zfm5(e{uThH90#^-Z3j%xuNh7+XNElyRaan-!Zzm#>l=ybcdSJub_u +z6}TjodYKvgMV+took6S@HZA%LGr50lxS322$r9Lt47{u_Y*TH5OQnbGWztH36=&EKGyt@}K90(67d<8S9RhkH) +zu>IPN9BD-7ta(Ss;-{7l)LZ*?rww#mR5-XtjAgoN##j6NS%Mp?k5X|;oDN@2T7Po| +z4yr8IJ~dYy_wa&^z?-2D-u#FS> +zvl7+7!ard?ho%iI`gTP8UM2_l@fDp>A?d)BUIrH^^8r|Zib)K^-238+(a${f^ew7$?~51=+J5>i{3^fI?@fOJC$|Hu +zk@!KeWeKFS0d~e31%zGn>o*R={VJWKFXT|#kTo+)rimA}H|d{hQNg4pwQUJ1B+^Y= +ze$A>j3T$R&%9Yc6x~SZ+mX@j2!iUY%#-bsQr+>m@=g2gM#whGlV_Uq7=ro8^fpfB< +zk~68~nO7o<4IzZWqY_Uo`hL8TkgWcn+TuI+>yh#+*%xcw2SO&>^Z;)oLUxO1fsStH +zO~?c89g&6>pqm`94jSoj=K}#TQbj{Y;*KF!JX7m6UR}6+a?Ah4#;i8IZ&6_f^o|G` +zj9W<)a9uVi>r!Z~pD$>CjuQ)uoSxkADjp?A@y`P_K+FF9w=rO0V>U4{gY= +zb|RqxaHNG=yw_?RLuIfWexT`|<+XW?ZaC|5H){`8`{YF`N +z<$m>0MtzAg5SB{>?hL$iR*km=c@iDkRVmcf^7K~HZ``0wK5lTN2uECYopRX` +z-A|qjnOyH>lUJINB6)3`zDs>@GCY+{Y5EPMzMPTI(w}xK^_~tI +zg3PYfJuQi%Q7x@DEm=!Qtj_23ndLh|^@j*BsH%WOiukrub2A`lG?T<)_VGzmyYIki +zuy{qeS5PAt%kH~97&`aqlRKf(3SWzZVbsF#`O@U9jg_?9dqYIYvB7*f^p{(4&UCMp +z&B$B5U}~?7jAmemh_4t!GDG +z9sLR1++rii2Qz#`Dg8o4UqY=)wBIH(LE}s&BdF)6>h7>zvpBp$kI@ +zTRYid`zl?AC8hV>_;Q}k?{>(2-`%hc)_%9Ri!hj@F4C0H)5y3Y*<0uou3~<4`iH_z +zmDVCjNw9rsyJru!0G@T}Sj@K~k>Czvaleu%3gLE`$)FmY+VrV?x}bSvsuBCzL-b3i +z0gu$Cc}UyX(MpLVFwnUEbeH3Jc)f;O(Tr?qy;FR2FdD<;o}qT(!@7L@un+3NE&?Mk +zXe(gg&=Z7eLKtj->ft4Tbl71W%Ul0`_lPk00dI|n`t +z`+06!Ff2rQgMeKgVA|_-8Ac>tJUG%7)v9C_FTc(ZVK+>&w0^LEZnIDt8Hiib93|o} +z5W}u1$aW181>1z$LPU{fBEHSwN0iN820Yl-yKC?v{bt}(n7?(st5xDc#oKH-IXuf< +zSkQ`p8f%eOnNINUcpP>1%8(J=BwA<+KN4)cRJ77ToZA_jQnI?Fstaam74`^-o{2?@ +zoaIpQN47xw*M=ngW4~ +zE}v&z{@KdbRdM^^PZZz8bGn*xG0Z0*xk;?PSyiq3=uE?Dm!i5{8ozpBl~W#n_`@2Z +zCE6qQ&fCiA3zJg_^EaH#>^;~t&+1GJhm?R718(6QwToyOQitI&xCXR$;mZaw6(=gm +zJKw}S@n5$&vJgfc5T_f`m!~?&h$Kl_|vX#a(8eEdKfbR;n{a!(j-?!@`-r+WqBi8tD6*~hiPbxE_x1V<{bBc^+ctsv=1 +z)IO1RLAo`*c0B~`a4DS>EI!XN^-^Hd62uQcyo7Tflp&!{LN|8*-usUGkb?ME4KPYq +z=vr0-SOC5KalH@9gGL0JSvKPc-SaH0+l?*FQ+B^R`u#eK@rIuyZ$&4xucL*XNg#&N +zT!q5*c~fgxdzxlF0Kl_``(A`+-67}RQKO;bezSHY8#rNF-0XX;I(h%Ylc*Nwu20Ww +zxlATn1moR??IwYC-yT^y?wa7=T_9W03&ssxp6)Ovmlz+&*Imu!qYFC*J`qwdsG2gHDhQjvklecVIV#zAh_SglbcXB#) +z9I#@@RcMGAuY<|IOk?OGtJK2R)FY^enWRJdz|^8M$9kC8&ywHbpHzGQT<%!K1sBrO +z{(C%bSYHG;;T-euO!!GmyUp+2O1vP7j$%Wf_cV&2j15h}D_WwiWcb`V4Q+18@cp$v +zCF_~%)Yf9!jQKJ$T7oCI`YLMqiV@UD!`a?GjwAR~q21#>d++K+8LK-Nuibv7D$CX- +zdHc?=2f993B?Rnk1Kos8O3Y3_u)$4%&~Od%Rn`E`ckGf5H_@a(90kj@NH0>4?Yw_M +zDiR1G{NBrf{vUTA?_XO-y8kTXX8cc9hbalv|_cy(XeYVJbazjE^M+x@eDp9RkTsa0J7&_&aYClOv4 +zbwBLpI#)A7@QVGa{|{H)fmoy&r~OLndm_}X3jK;F57pu7BmR8Q;pqC8OM6W`um&au +z+tB#lOJdF7+7Fc!495Sfqfli8@oOD$Q6c~L4g)-W#fv08vi@(pjV@={iO7gh;K*XF +zK-m6Zbr-I1$vCDvAmfX^u#2zA%WrIFYKo5g%XV4O)`$f4>{`Bza+4{)yI3U|yT%6L +z$UeA5O3$$%`we%aT-z<%1+}%ki*ukFMJ&HlxuJjg=PwG+PhQgtn;#dLgvR}vOhYGL +z9R@cI2|c%`D=N*z`27Y`%)xpU?`_y6U{@5*Vs?y~N&wZKDn|Eg +z?XnklC_c@*iBj>5o8m}{0P6zghBH{Y-1-oHue-X!fEQrL_JgI~!S+9aXoWf3p9cb@nsp1`fs +zhcDf-lGaq5GGT1v%t|BcEqnbxZ4kaIl(Mw?K>6w>*rqnz4MT4--pQ +z#IF@6i6?d18U)6M&`cRH?mmjW8Un%RoZY;zd89{yiT#^Xde2s2k|Nx%t7_`Bnt$}e +z*DC7gk6&T6stVZTMWE}>QxVTJk*|mjLk%j(_oAaGyl;Llt?^e3)OmW$WykeSWL( +z2fWiSiGJkHq@^MA`mf$0RIpxt=i{h-?Zr`y<>Wr#00ff;IZ`-!%QrxiKo@b+?h7WBZ+6pzcrO`usCUEyybd +zc+GNpVXNTL5EP*SenWC+>ZT?6i#03u$DQi!K_K79mSrYrHgEske4!en0e1;X@k)ltj +zeVq6&3`=s*5i8W}iO|%Vq-glW;1Z%N6}p7}`B7)XA*=+u9p0)3+45ij)kbo8B0zNA6>|QhCGcH5 +zqV@E8zT)yU$Ki4|!MyVI2Ai(h=K2}8!9o>@)s$m{W&o#~5*aUVbVlH;*y3D&{o<#U +z#R* +z-2YjPqezl5U$RnKs+iY!^Y#1rZ3dmTl~jMFt)0kiAnJQu`!vtmVDOnDV}bO`53`iJ +z+fBjFHZcHI%gf(D)+p06smC&F;oj-ea8^%dt-=iNiDKh)waS?<`!z%_IZk@^1t-uj +z%hxcvwi$3*JNf{5S>7X)dr?2SR-oxU!Q2<@rq=E=w00u2q8!4^BT8589f8`mdhekl +zneVi{RVO<&LzFcuuId)GPA9MYjKj{V1ea;Gr*42;KbdlKf6IMEYewR2U4=OOCy}8i +zy6)zCTF)9DLChnZbZEMBce==Oga4Tv1$l_o@zL~Gp5#Lx%1~3+nidAx+{c$!m4VaM +z{CJ^p4f97BBO5pK3vT@r+=;!nkF?@6p*OFmCR|u``2g-8BPq&dNGGoyRpJ(?=k56F +z0kaI14_DG{)9gRK!_vpI(zj;_{zn|Ulb98*xLF@7kKuqsVkxOfC>4H-3vWI>KV1!0 +z`o0}Z3-Bb9Au7*46cM(45afoMZVT&P#pJ71gQ|>nMkRggA>(=^uNo308qKoGqG4$- +zx}#yNyZ$P?_*B?rd9wIO?2%{{K3XeS0s-xAfB#^SI@IKEbxSwFw?xRC|D4It?y$e{C0@?vzEbX7jbD3aT6g0p*X^^=4fVX3W%6HaN5hldVqQeOknL1z8`5 +zdAB?)MHmhoSPHHySz0X#65;i$-upP&p|X75z=qQ}q24ya4~&v5lGhTJ_+^> +zpp~i<#%%ZTnY@TiEV218_;g%5Xhj{>kap1bAF4yjdAQTZFBi|)z>u=nqBWhAVKQ$ +z+FxF}d_#mc!&YB?S=IW5q60f)`iv|k1`L@O*u5C6Tt5;4NuJ6nj9Tfp^naf{gB`q_ +zVbum&7qngB(QKnaMx>MX+rg-4Q!V@zib9urii=%Q{mUZC?B|AWJ< +zC6(i-vw6TM{~sjSE;RDzHv1jxk7#wf1CQBA#K(RbjPT!byanIrrp=3;f^;i`EuwdK +zv2hGH$``7<=BXx5jJS_?wZmB>F7N5`TKl~QIowcUgf-k98jlBr$NVr;H3HaDfivw6oO0dwO??@C25O +zDsw9mu-W!^VGOf>OX|_g7WCFCJMiHd!MVyy^@{tktrxu)sjz!}7nqY?3p00_CWAn}vc0F_Y&WnEYJ!xu*mACeA+hH# +zMSLTO?MWrBl`dPK60U2YCt3bbUi(`#y-2H>T@Cz-b&9cUfPrMDL1ar&#_rrW_W4se +zqj6r@{ho7j^HOXLk$mN|7{2~gi^fu6Y1K)?63d5C@L5R{j5m4SmH%b#lr +z?EKH3=GZX71aqFxHGzH~YO6}#$ +z8pYUYX*{zL)WdpkUHVJ<^tS-*G&6oII}goAz(emB>s1P$Tm +z)2sBM;bPwluM8Tc)lH}!vy)N+X80P|4YS05&8P@ZkNv5wk-%aV0sGSuTJ)&vzq7si +zqRxS!E~~zjPXGfb&fWOe{j8LCLEhu=*^_tvecsmcR8^nePUa~2awJuC;xBq{@l{O!1NR+(Lhq!R*!Br3m;YYopY%6j8UmVaU2!X>*w0pG +ztJn*EI>+n;93C9}P1JaK{fftT`!wW#Yn!`@> +zn7&W^2XAzebw#p5J&k-dsh&|^4C={Cj` +zU^LdgaUnV?et2qphh(f%Z>Q(TpE7Ax5`@WlsRvZsIK#E;Seb%b=FPfWJqkWqWZLWh>!?1 +z&89Ol-a>i!HVln0ZQ4$Lot`V`t+(RA2uE#I{F3)f@6+R$u4`Mu5@$s$+5weCxcddO +zf+l_S5>88NVvz<~{dZo!u~c2<$_W1J%~Cjnhs7N>^;9(~S>_UaMgp22-0_foWe*9@ +zbUHkw!LzLiT+y^=-v&E95MjvQDuG%L64ofw)@DK_AD#ibIRSzNfI*^OFgxxf-Swr? +zocqZ8`>mTm3K=?+m5|S?DGpud5Hn52k6(n~zpT)o>{1>&>Y0M)MR|2#&>w%| +z4D)%bfB&SjItU79dm7Ks3tQM0cui>!n|bj?-Vm5ftg8qSKRx@5OMXKYW|{IYx+Nky +zv?=7+lj?yvwVqVNR!bWfPBLxQV>yxZ7Q+V)lxbLXWKl0nGJ|Th;G>AXnL|7Hj+a%5 +z>liKY=iP#NT|4k^fU6+Rs!}{|u)xqNTP+H315AVRFGwNl#B4VH`-vClr; +zQ~nkSFrF4cs9R4DPVN9Hm$OjC9ODlKJ#l(K{eTH8a^kin;FJZlkHWlBEIDc;oCrDd +z*?r9QS=GN1zWyNF(8v$u+EhrIE051LJoQq4x%EF5T&g@QW&pOP)N(#%vl$GocV* +zVgMU-qnp58x`X*6qRu*rmv^=A@(XCMK7iyetz=zIW(Sj7-Cga$Pu)=+_`_vC2W9W= +z7_T)bHiPs|-FcHwFJ+h34!J^FER0NrkSohL#TNk!HmPuLH4(&lV)x#g5Lz@MEo`18 +zBxIFqSfqmHC#i@+cD?w69=>l& +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 +zOYmq>wR>}@$MKbVZYcS +z2XBcA?#Qb)hg=SK->vWPU2s%;Ac23tr|OGQ0Y2zg7sIU(RPe+9)yNPdv +z*dE@@b*djWTzNkx_N8AyHB1^$-Q!#XgPKqV3tHjKryo+=zsBANii$Z*muml4`I{@z +zY*_fM)(l$0wqhcqRXPg$gqb=6V%WV|Yz;&@T90pvwEqiy#Y;PE9lx^~b}k&Exa-;# +zzB=w3CfT|x7C(MC^TKRrIgO>skV$WA|A_&TXWr9)ES}scFr2SQLPD;6fYMOI$pGZ0 +zuBh{`crA_-NBE*n(@NZ?K3|S +zKmYPNf)iB$bnaJf5lUSde^)3&>~H_oI8hIiWktV~#=HtO6-Q)8zJ-~)pAg2fl3H$A +z$Kf9P8q9VymxIJ1zDN2zchV(`(&WEr(r)y0Xylf~T^Krs4_zzjX_H#1%LdzD_8Mk! +zli<~T=djT?U@VPs4~iJbbjym67Z%x5XkljQ*Io`YriQSB*b<6{pvk0Hb0cIZh1wuN +z+>a1FHaNuHDpKU4AIF?eh|?X9McSHs!PeUL~gB5AE4LsAkn>=t7#1Fa&h}GNx>pmOomVfvhWiUaj +z^Zj#%;ZQK52#uBzNex$eoXpWMmlRE;WidSu048G=Ef`u+ysCb9@51~o2~V(O>0D>z +zS{zYcm-G{)T{{|MBJ4Vfi>Z(V*XC=&G2f=qcyu!d<3!GIrvw-1X|J}z^vJbZtk4V* +zcp1sVqlSf@!+r%xc!f|aUq1|%7Z}n4Gxd7Nqr*pZ%=WYAWpHpI?3P?bIXs{z&+-2lXK`9?{Gu_gTKmBWwj_Bor&Jro5z#2i)Bu_F=9aV{}(3jFhjXa`wj +z!Ph4Y?pl8TSDZcW;IsL_2b5`&UnJex4Dqf4I1^MvHIlr&o7H_QEo_L#i7><+Yd?gz +zp^9|lUM8~Tp4hDFHsG6zF|ON2ENWnfS^rzaL@w?{^+($@o?#hj(sf1#`i&uCY(gZw +zV>{~ihv@TJ=qa*7%kL2FmgRrujx3io9P($h{#%zVbcpqdOkw}+XlxLk4Z%zWzUEj1G +zG2%h-?HiVnJx7S2q1eDlDi`v7OW{8;dg-rIK50A`)=QWTXUHfiBLnkq-#ID;t4x1@ +zr1ZI}V}1T)>kcY)LFJ^-1opCnTHH{Kd5)|%|AqZnSsD-O+QHcyvo&8qOkycN?u*q*jvS85^KPy}ap!;iiVZbI;BSal +zV>cqABqK)Vy)TeZ3*oi|gVbCCt=|;p6Z<$1nHDp@mcVurbat&*Qposn^}5$UTsC$Z +zs$@p%;7$GtsIP!aal#-r86(QLbbwEidCKD#bi7Wke?cff>!1$zfFs%HS}xqCrDol{nCK^q}=C-)p{Z8GMPNL0*rh?qf$SdazsUxd*0>J`zvQw$pl7@Csq +zZ`yd?WfP&AQqev90y+p$LP3mtgP$k9PTk5T7$j`}CttK(D#z|rknCsSnj&4SUB7g~ +zu|p5MCXzMk-Zkys{X}w+wdEiNdZ%Bnb|*jwa9tGPVPhX`dkA%qK1wbVzV?C}c3TTs +zY^K-iQ-qu*{zhdKZf*CP6dr{Siu;)5iJO}HFCHZ`uPJB9wQ87Hb~fE<9;k>o?7RC` +zkL`v`0dCTK$}O@oH#&+%t3{R`y{ZQoi3W!MhB;v367=7-a*yunMDZSuncSOR_5<`PeH$;{&e5YBOx)b(+b@D`KO$AxF*|$fywz +zPgS9}hX1A6JT)$AWhdDIyAp|EY{vjioNo5OX)Zgz?_SW|&iy(*IV#QW(wV;yIeAB3e2)`rC6fz!VBCV*I_lz8YZaNIgTUtq?mlr0MwD +z6f$(9sHX$!%{F3oLJ+#iIepu|Gb?PZ;E1cMdOd!x97Smr3Key~e76E6-9Grw*I2Sa +z-qvEi$PdLr5~zf9vU01G3LtHL6vN27?_=z%#1@`0VLQnB&e6HrOJNBLi><%VU=-|< +z5?0Zf!TJs9u|#H_Zh<4zme2djFcjp{6rCM+BK9=k_kI{WVv(!aL$ZN=h#>+w9P;s= +z-J9`oC!Q;FS~^XM!>ZkUxWUiji>#Egcy?ZX0~$gSKfLG>6TVb8|UveWm_3vhV3F}~~mDbmhaWH!D=vOceA +zmP^RQkF21j`H$o>WsT_aCIRF2ypQGaPoJ#dv+^QMFz(sYRpvTJ_bt=qp9a~^dUn(H +z|CJsJ24UI!=!Y0cd4O{qW|4t<$%9E|OA4x2G-UUr`V2!I +ziwj!r~fFBnrMU +zmM?6DF0Rq%+mQ%UDBf*kDro9lC)ZWvomLQKzBKJs#tXP=FQC)hnWoyLBbnFgAu#BV +zZq~4oJap*x(4)1JO4<3NXp%FBWXnR!bzdbz>UFlQPM!WJ5%p&W( +zAc>2BVt=$lK=M%=P$nZOrx4vIA+$61<%!b&IdjgGBsSFkc-MR`38e?)uKuvD@dd +zPP4-N>q4U2Bo`P-%D6;76V4`bFw1Xo5Jn;9t6@cMdb#xp`}##w8A&&3C4D`HXK +z`BGng!DICYw@dM&m7id{9_dETAJTu|{@~X?v9E5#-c5hX)BGG>5%F###>Ic%q24K +zR2bo0_)NDm2FfD7Y4LYM$^FBt6$ly7%e{a7K`-sNjze)UAnO&#aTf_6&O#c`%=F^n +z7j#ik_2%uJ$Vf^6L$`n3&_;?BRi4g*|L2o44Izb`7Jid*3!;qu*CwQ+(crJLzgg~t +zgE)E~0|VPufXa}WjGNK*XiccrcIGUQ<{48!yr}aQ`KE1>PX9~0QuY-OYP>EWLtV@! +z`A0^jsfCNaUcHfrJ{{@p9-7H`{11uP>r%Zn_NN@grha+65<@`_Em11&8$ZKe2CxCX +z$V{si-n#gJIQ3tPW*!460T^nr6*erF(OgINn_dL!Rurs>Ww`PVb$1)7($Q}(9g%3c +z7qw$FI}QmnvAwl+l7$+$$*IB#-Bo12VaoSaaJ||%e_}=sZI=t395-p0Edh$qvKCiz +zX72#?)E0@}6)iHbuN6dyQe!TCK(AGz_pz5lOR&$-0`ia)eov;v0W|in>mKm27!QTn +zgDeblXhh1b*aP)QQp{k$7}eIXqJ80%@l1`Yfy5%mf<%5$O!Q}RN-Q?^S|WCn*y_gH +z5@Miq_boU;i{wW#QyECFO3d@2muKQ-^VLmJzYX8?_SYAdH#_exSYO>X43$bll`v_M +zqL~%=U*DcAB2C^}r(s(VW)8V@iBLMf5ZB`4ty4=t%(m^gpOf`r&|mcMETDUTZbJwu +z_#^bw);?FG!S}V}^?+G=j_z=VsI2lC@-5GS4@pVYgD4tB)Obun3WGr*Qw_>&+^#U5 +zuK3Ps&7zz|_GndUfGomuXO(M_Qkg|iif>QH965QHTgb=gTx*V2eLw^73omMU_!Fyw +zx;cDRk=!G!GJgG7L509F72#=ahb`<(tz)-&)Gyv7xss6@nz?p0di-p=-{DjGUyS$a +zrb-2b(V$mXRnZ#iI;Oc2X7wBWB3i@$yAeTfa1<{ukxA1cmTBG6=C)TqVfWFI7YFhz +zm*5|m#TK$q4JjH5+F6L82o`+%WP^j;9Q_Jq4fb^!Vk!p}@GLWc&viAZ0!cR;KguEQ +zL`NaSsrTd?txd0SDcOgMx-LIMkpkWs94X*EE|SOuENPiP@1LW*+%A*6oY_nUBNE6+ +z3L_mkf#Av`)E@W;G;>MH-G@Uoo6aWTZZYOvx){hgoTCTXkL}C;;u@Ng#xOkGUM+?$ +zaF9eZn97XjrQ^pWXgpyeq#82=+v$U(M1iAqyG30!f=_t~1)V&JWsHrHfOQlF={QlL +zoUhnZJCngycyhC((*oaf?6ZoQISr|J2kp0ez7ewpojBkxfTb#C-^My3?qc3k`Pk7C +zHvgrUr%V+u{$5x0k(!tf`zzh`zg|HadjHdOWp>2T_Ht7;la&HGr$`R?5rVW^+JaTl +zOc7kLE`{{%2pW;#dv +zny~n(GYt2}3*_p{xMo1VE}`IgK9ioRoy*8hqffC{aehj^0!<9wG1E+s0Mx76gQM}? +zOagw}!A|3pDxB{UlL*L0ZgK)7XiSr3yoLQ)gH8-lwt}9I_MX-r7hY&BbO#j*i-+(` +zb+E{QGt8YGhD_IL-!7*A_)|J;>M=m;Q3n$=I?sx5GCGh2?}eX|vR3hH{>CzY3{m3X +zm+sG239%(I$R=7I>|Z1E*vDxrPV3-DQx-UkTl}X;p>hKFo&@VE=2x&Pksk|&Cy~%4 +z^o!EFmc9x-9^&bgHmh$ND&oTtVyQ9c;ECFFkScJY%rMmQuubu!bu+NqOh{SYPhLh} +zUf%dq2sAE>J2$77G{JvG{C>fMM?wFMrKf?VmzYAt;_60S2Yjd8DXTh_b?)$DGhg)P +zI38L6PiS2aZPIKh +zE!upArO0EoNX$h-FQdxqb}jm?6!hG87oXw>I`)C}phh0-x!vwex{S6u$KoAP!#r$! +zHzS=ru6K)OwvC7f*WB?2wV7I-DPi3n#aSZ8liJ%KqZ=%k9H09bM-8d0^l~qfEnM{) +zk=;66lrFoX4hw`Ao$Xq?7dkB#yT_m?wW6~#C#e2k7ugV

#^pn&F^Q`Jm#_dqQ%lnpnWe34~DEfs68M)=L6Zs +z0xsAQ7aT39bUE)h=6AT@$Gc^=UDCy*&u^DPwq1nMi-F12%sUN(%PqdxnPO)qR-tN> +zF6Yy6?&V}w^~-u=EYiwhd7eCf=Y_hgR){96wu>VrTFV$JTu5#lHNuf*mQMhd`G-ma;k7#tD(F$qGDKN>b +zg>7f4PQa+@h&MNfEIR6Oye{NoE$lrTQgPIy>Y&fw8lS@#JPuxnShO4ZZ%p%PS;U00 +zh?(2f>J^!7_R|UjCTz4=e*}&tFaWsq67;O_d2&;NUk_s1%c?Ix^(EMLBxJ!h8!cKc +zI0t)bL-t;dSa}>ist9Sn%`+G9ujJGSwXZ%??C@-{Yj)qMCG3S#=wAsV%3wgL)C%8Z +ze+O$xrQoGFUZgo)&1gGdRsjrD74nW)d3mHb-ud#RvL{k@G$j%3O10}n;r)nqWg$;% +zPhMrjv*jVrR73`FUfi5w>b{T_r(jT-!{0YLJXin^tHn&g`l5hGcEsfXvWOX*n3}_+ +zq^Jhkg!DsWTNA`cd68{QHZ=iEegrg6>G`=mF;ZV1`@g_TY$J;U{jHUle{2d&HYbLc +zyq)Zipwb#zTA%+<*Y&jqU<5JUH`Md~#(F;3*kGo|<~n+8sio(ZI(luZr_Z(q2JC3! +zlfov37Bw=wsGec6mMI@o+Q`VVMut~5F{~=Vh@A<>R3-VcGG#1fl=I)hQ+ODu^yCTEg%TqkKB1yXq%Cw~Us5)hAH>)m06kdtgRj2yc +zAg*7oby$AU=ert<8AohB+mm5XRfeABwpn`lPD!lHbScfoJ7fegRldo{ysu-0Yw|Q* +zN?kgYdc08_1I+8WW5;3@1=w^hQ4^YLY-K$v1A0~ld|2W0VTEVz>z1>wy;Jxi39#`DBN$(eFI5aillM?Go{MMghsM_vph6gMPGmbOf6JIe*)%i@}1sUk0y1!i~43uUT6{y&X&xCH;7<|UI~33<6J +zo|p8q)NkG@)GvThOIdpL!-vLQtt9Cit6`rw+y;kMZUYQy5yuf5( +z1UGM(MzYXkVcy>9qtPxHv+UA@@_l;j3Fx&qpzmIve*0Rc&%S`(dz70Ad0)#hm90{( +za<$8QyB&H}dkozhF??UdM|(W_?se&>N@Xp!Gz%>QKHBFah{=cfn^l-YaTaFGA(uD{ +zkiHRY`Wz{)1&cj^r +zS%1M}lk8-de70WE2x2@6YduQqRI}_;rR~)X+Na=~4cCX79F8VjjwfAeQXVyFmzuO- +zCP2&Nc3t(@T9abK(JUK|d;E6HXRWd^t?HIdQ<-2!5F*R*DBY5 +zjB1x#s+S!EGjaX0%lxgb$;cR(+2ru;Mw@x-tyUlthyACovYEO<%P?)m|7tUCiNn}m +z9LD_YFnW>8$b}BWezX~~z~(Ew; +zj8vH+QfHK_(8Y8-3Wnc2IG&qy5k4q`)RlMyGcC{}Sh;DS;3UPZgEQPbIK@qalH4ee +z7?k3sk5k+-Bt@HHNp2h7#BIZMOmW-LByB!T(q>4STlBd8Np9$y;D$a;+|)b4O??vF +z+*i}Ytpk$WGBC+4gOc3(QIcDA)X)1UNt?k*+I*7awjn8Q`y@@9kJIsM7?|Rw0V!_Q +zYa6Jakv7NtZQXbCfHXG^5Oig@X;6k62d3lEx#pt`H<{49GDFG`sSF`)M&~yUR>nxG +zRy?}hdh++*JlNuvk8|^h#jP6UR)$!#kp*nH!>uD6+Kh0_-$}p{mpHUE)ERr&2%9@c +zIJ6yQ8>PimACD2RNNKTo;7gkazl!aOQu_Wm$>x#CQd}&anC|e@42NfDdp!5G%ky(x +zUi!x6mG4|$oA2`a0*^O-^y%`GOP9qSoqzRtXL&&P6#>0hr1^N&WhQK|W8H}ix^S0u +zNLHX!2v@_1O95Q=B5G}yi@r~-AClCDc*mpGvbkiroRi{`g|kvF?1(ejkW(3-Q)!>m +z*?_azkaJdKjtcb4(t4=LGjk;Eb6nOiS<37fU}PB+;GD4o&N|u~<8#V~>ZXVdCsM3G +zVN=lryKSh-h7>jgY>>io3Ray}K;LDJnjFvjth^i=c=_>&_L^Im>Z5 +z>&7`9y?!mLRKwNULs@>TPO<8A$hIr6qZSGhF#Ci}ucBI}>~*P0>idMoDt0~tXOeM6 +z^f_JN+frX5qfj+Cu;-%1+C7bwp7M+}D`khIvk@6DGzGAWb!YL +zpvJRtya2~kDSKF!MaBzg2;kt=h+nHy%&TyjRUGhriAB}9$XLV@O;Fz$P?rv9Xb6#7 +zay9K3c+u~>_;AR8jrB~ewn>CwB`oy2T$K8f@u;^g8f=eL7LsXM;o{#-*%#TzWG74b +z5l1pGx+KB7n{1}-fdi^$u5&qYI%MC`h|)tA6(=0_p7l9=88+9z@U01k7lurf`eHWO +zM<%pCxxi=Iwk%r@!pXFjiK=Bzi^tPEzA4MZYS^zbfD0j|=Tra?GPf|z+!Bw%Q*h*x +z-fvi01A~ejUfJUCLJ2%?7B+?^1JlmzWN~>)>m$q>3y1C%%AKhB3**Ak4!>@CZDlY^ +z@KOwu$|9x}hX!CiFNW7ukz5?|sNkg-9?yeHu}`~Vk9H+N3@`>{LY@&AmBR}a(5@<= +zU75@Cn^TP18S>Lf_3VK +zW^OC6Z!#~Sb~Ck(>37$Tn|4OIQFbQIyhv^Nv-*UKGQes+`Jz0{=amhNHEK*F6RVSarSN<~ipQ7MbJwDr +zoosRH4*=5wGC6=*rZ9iTz{|bMQrx#Z#otz>xo>6KK+C%LAMfW0$&-dEQJ8HA;f=fxQ!_In}>IR$A28Yd;v#dUEvEYQo +zl*0}qwQz8kM~@1Rcgh{QlsmjtX7hHLjl%w2)mA23S(V2Jm2nlbaxMz|zhy%AvT%iT +zES5z~i!@!{RO4Amtj5Ta)^n#%k1C%Jl(i{$d9U1~OSx~RbD7Uuf*I357PpWIXgZbT +z;YLT@@0(0bM}bbRz05S1l?QaJ2xoT%MxO$dx0*lS7PuJD$t{-@{FH~htR<8>n$dn2kC!SG*w^I3 +z_j+t@%+JvMxlz6)4=@VkYfQeS!f&>ewO2D)rB8t1t@m=Ud5SC;Rz~$C9(Isa7^tvhyBm&wH%Pi@YY)4uJ>;?Wpg=~pGAEafQCpcp{w~XMwz4G^c}2$K=Tg^HFUQt0 +zmmdo}V=en(o5%bu4&QIK4a9uYtjNe#<}hom%Z$|yQ&zf6TJA7mnafwdx{O`oGUgYT +z(LXzk{K;YHLYpBA1u+(bez532-=gn#4!yr|=<$uq2Xh^|&vAI~YlnAdJG?#1q4O+< +zw`MwYn&HrKx7&GpQtqS=a} +z=5ql~yo|8zXEt}rUN%y7%xX7_FOK6+^;@iE&5BGu5T3J}-SSDxMYmw)mO)u=9+=^l +zkK&2dmKaE>xOC}SRTi-DU=3^;?*=J&h#qYRpx1aYlwcT%eIDwWRlHCelK +z{PW}T_ZjQgCpK+{! +z$hY|0Sew6p(&XxV$*e<)v?3UiseT +zwI5tM{OIz=PcEH)7P$CyTkO$oX+Spx^H;j`Ta{t-?^oGSlQLV^WdqZ0lB5@sZ~)gp +zD8FSH3#j*1mm5%P2WIi2*|x3#w?3t}LeAPgXC05T%8ytf7Y)b+oXz<07qMG;>3|DKSA}mI2Y6))x?(4qPk=S^aUzW3@~0U!0(1Ri1AH5vgLbNUWj8y +zI41Yvkn-TbRrr0s%e+#-OUQx}pQc?{HCO*&joL2c3_m9|M{Bc!|}vmuF0L_=2L{df$#I6mh*_*S;3)mIr@ +zYEyJE;KWrpaRK%mkElKnap&;WK4B +ztlnvxtd25PB^RN8kxlz;O^n*>QhXi`NZGjvTWccb7dobjddu;U>e`5kT3A*S@rl+o +zZ1;Gjz~kk@xU%?Z)e;x`=AvJj6lGJM-{BiK&9HJ9Q3~Cp&XlOsDP&YB%r5qsQ35kd +zV0>xFgpz;>#n7)f;^~rz$4iuTfhP>SNNEXZSK{+ziATHA7+{_(3wWwL;>9v(uVt0x +z(5}+wsU0bL7CC%(3_jZv@#@wL|J?5LfGU$sij^gR$mOjbYE9XH_e7R-rLwRT{qUzbweFpH`Vg~rUpLT(h%1zYj4c92KsMrU~o}_ +z!9|S>DQ;j`aiarHxD$vcIlKH|Juc +zx@hiOo#wtZ8UD69%l&IC?pvMZzBM*~U6rNn@)W9FzI$1g`&U`C+vxJzHj6=(4qqSj +zSavGS_Dh18EPESmcGcSyU3K{FlFyH4J!aO}j60ZR_+FcVJ8gQFX6RlTFTNCrC=2sm +zxkI-Kmk%nHlZm0GTV=pI6#<=P?=p5WpAMxS9ZDTKmO8vyrfu&&?|)8*|7C*BBO;hH?oTP41!YJRiCCqHi~M!)@#5&4$W{%Aj#kq2T5f$;zFy_iu_~a0z^2kS`4=^j#lLS1I>t(-g;QpcrN=u}xdoNGL$fC)UQQ_`CZON` +zfc^(U1|A4oU?#V)vX`-$Ieb)Y^ZDL@NrzzkVHmd0rSEQs-g_MS?s1y|X7FB@A$xs> +z?+qBfPl0~d1p2iT=Ci|o^In*7M*_@lnBzW^j(bcw?lHZ_XNFqIjFrqaR@vMb6!e}&&G=Zn+(MGY%`e{pTgPzWn$FoS6=5*Wh`aB3CRj# +z4jYIGIGGf@gl0~d-3)=r$Y`^5wXB*alKg%o&AMZb*&DO+u*d2nk;%oZKjg9Dkj>gd +zE~^hpjZs@!tjMg`olY^{fbJoX8F=rc)@tD5aWy(s2i7RZzEwlOJSDVk5IDGbt&8VMkhW+F) +zWTD02g*G28uo<|(rr&&<-t%pGd}q`B8;fr9Y`V_1cz2G)J6~J8J=^B(*{*>Z0gdL( +zSvH+!T6CIW(P@^$8#8S>OwZDOT88%1vb>_1p5Q*f3V{Nm$L;E{gYMQ0aSO#un +zJJXoT=F!@;F1u0IG*jI^T(+_dvX{jcGmAE|EPWbJULD9EZ;>MNamFYtHw{js(QT&eCRRl3PC&$RueqG|e3&^fNQG9i61@XARu>S&}@*+&MhO +z9Ya&xrtdQ_MVkR>11?fs@*{W=wA}tlJhy$4%Be01ZX1%|j$ujjJ@kEU|1|#Et%977 +zGG=ZYoJEtrefyv+n*8nj(fs^Y&uP<2CDD5!Ffwp7B+G3>6`t4o6{{$+dZhOK+DVDxV$hwwI#)Yi0xoG`p@9-zpa)#gsENunk9l!`Uw~sWFp+5+tFb`!$p;$Z7P2#r +z$2rI1oD-`b#}bhV>!0)@PWuiQ9N)Bpot1jg6tVI^1KTb}?9RY`C!{jr8(Y`!XJPeu +zht(IetTA=-@S9r4E?F$Cg*k^Jv$*$Yqf{i-Bs)gYIq6_*Qff&%X9Y%;si+P3p*qRj +zUA|Ftw%5ir$(!q8%x<5a+mb9g9tZU=+b(Bqms45ovx$`gS?p>ZmwMYXd5z0HRG!JO +zdG}?G*T-cCi2xF=OUkjxnEfs>s0dCpwjY_1BGWQHwjW?yZVWG$Z&a|uNm#buWo~)E +z)B^avB%<(?$`q7&v1m+1@#4u8)MX;B+71ntZ&bDgM3-+v|nGx7du_H3S1gPPMr5Sa>8ThQJ>vM +z1CE?)||Q5N!OVTR5HDHa@pul7Yex!LB?tv-)z_j#-s +z9x-Z5m|KJ?aEVI+WD#qpx@T1-7sV=!cD%GJ@Z+lF;<$Gu16Wx?RUV +zjS22Yf5^Z*vPIzX$NT<}joAwS+zJnGiQ>rtOAIY>6Pc=&H4mEF<=mc_jqpF+e!ogr +z&HCDAfDyb1Xmk|R2w*M4QY^fjVu1<`Ju=;nT6pegToTP*KGud0PBdfqg;vZhZpX$dh4dPQd|4}VP~NOj +z&}idygM$7Ai(rf(tS$oFKLS2!WW5Gpud&{LB* +z^4tUiJXtPjz{Nxw|NV7xI{`3ZikK)eiSo)2VB~qB@1@woH>H7q3E_m0LU;*_F25?| +zni-A!=CKf9*a1U$;qMuOTlhEVUr0X;P5qAazA!eKJukz`5;4h4CA;LxN*Mu0l$a|H +zCSG+h>57Mm6&}V`I2dUU#s(+QEt&4p!c9u==KpHHkGcdSNy(S~<}T!&NfV593NQ +z*};1nhZ7w!$q$)K<{&KrF&P~YLr;v0bM=lyEE8f_cF9O`G55DPC~tL8ArNECwKUj< +zM%!BvAJwf6s@s(8uUE56rryWt>L^mKwIi+C#qsMNQm%VQyY3_9D$~joj$gAyjX7R! +zBl)u3kyb{C;jr(Zt4D?)b0Ci(qp&Z>7PCJM|GUn!OU9PfvaOjmHnT@2Lt$gO0t+$! +zNO7`;#ZCn(Z +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 +z0T~S*(raTlSFiD(?R2ca0?f^g +ztK_kTiaHxiAB!m$QQMNE%>*$UPzqwuH_*c9WCJhZ(UKk*584S}v7}NfXg7*_3pja; +zW_J$@F1T2k7sGiP_S=DY6o|F?Xp1r(3}|lm&>o4Q&9(&$Q*W{hMdAC*cC0A2aIX=t +zY{n!j)Fwg)BpHnWWBK4Y0fxhKsz8x=fVP+~Wt>!}CS=7h?Q9Ge>w$_UAD8a|m#RHf +zRsvPGHE!21bqv^6Xk%J-6jSpYEaxg#E~M3d_1PG#^u;I%Q<_=?EX?yTnZ6VT9c6i#Uj(cw27W8hSd;H#16Rp%94spgFslFp +zJ#QCyc(V|ApQ~d}tdALJA-r%tWYTLP@Htn<@_|qC9lUiRhS9k$4&DMLmuh@)&cYk# +zd@vP_@bXr!iB%4j7XnOZ&hH8^0xwKZ%k}X|ejpuxjDZf}<%0ygyqo2V@t+W526+2| +z0hq4qWPgX2&;w(Rou+=OFoc+Jg)BUV;1V7QFkK;rAQR5NMy1zcM0%~1Sq>41sWEfLj3_cK7<;xwyfI8Fo0QXn$+^v#oNM4^dTtY@iz*Yv +zBFFR$-z7 +zF!aNO)9ZK~;q*Li;g#byUO67eE5~CUL!jw-f+|cLFQvrLov%r?@%|~csoI!aYGL&? +zg(G)8WIl9}+W-`|1So5DQP|?(Oud6+j}-RbQ&@A8DN!{1$1tfZj4YwXCKMWQrMAps1M8FOxX(oa#%bBGc)E31KEY5@>jCUSr;a??b2w#{i7+k%U0- +z&quc1o9SERbN~*!SHk%_xDZZ6MJi+nfs1bom?#!Pka-_uFD$z=ZI`&mizs +z5@0|{fPN)h7jy7!u@-;{0V{+y{$2zamRJrb@nkw6CIK@c$WWCTRAP+%qQsOq0x_e? +zG{#=i7+=nnGJ=f81gb3+uE5H)t1hNr^EzhcRS%pQR~Vg4pm9ZY;ksD}H3oDXdCtsh +z4#Gq-LQKahS!DuZszOhU#_u;ZR^N89hAK>#ewa>(VMh$(l?mq#4&2v}h~)j+XaoyXKideZDYeJg|#PbtUal*I!$3^ +zs=|sB8owr6Sej&G(J_UENg4}|Y0UXcW7c6?KxX +zZJ9AU;{r1@|Bu|pHM4|wW~+r^TdB;%WjbMoKogFI!J8EZZBZDw*+&1(7QWxC@ZDw` +z-)^$-%_fB}H!Ae`BaYA3S@`S^3m>nIVOZ~vyi +zLd`dRV~L^h($M_fYe@_}mc#{U_>Dhfcm-@0#^qw07u;Rvr3EojPiP`1{Jgx(Mvvt- +zdM>x{@~?5cw3rG@R7~eIpVN3w#l@_Nh3j2WJVywb8NssxFCn;?BVpy4X;Fa|9_5_R +zn{IqAA*?(vfdsKcI6yQ3T5$m^dTzMBX1q92JTr@+W0V;J2m$5U>1O0S0VZ9~2`r(? +zVj#w-N>q5d!i)Tlb1l3y&z1?HrN;sbJr~5$YoR405ywkAds(E&l>ZhhY?(J!YWcSb +zq2-O0alE}Mj&~Tdy~dJN!jIP50xbj=t{Hx@RpXoOTA=0o-5UM(I2gFs!C->RVGqOq +z3NZ3$fN@CyCLGt8cr1pWGc=~AMX;kVBH#Wu(I`$czVZ?E1DO_=t6~9KdMREWE*8BU1PmB>;cAyMoiE~lNdOGN#K4L1z}$^!aAcJ#@faVkQB2^{ +z272NiYHeTMyTLVH8Fss!sBS^VU4_eSfppPSYagX;0WxcW>Ej+Xp?y>xmp#a)Jt>eq;+k*&j +z`C$Z?9<D%U`W@(`*iOdR8c!1DJa0fz8G6((*Og{IZ@#HX_^Ut_^J2TQZs +zk#@&HjjVeGh%|eMw$QvEpwXf!-x1}6|64d+6JT~$9D~j&%(xJhW_p51L}@g{6`JBE +zHH`{f2rmLKwhyk4QGqdV8R9R@y?=bJP +z-^GB-2Z^p1_Pl&v4184t^vUz^!37@!^AtAS0Dh~W`96+UbF@hnJD&g-z9-YnvIFUk +z2^AO~*(F1mVGseqg)4EN&{M^vVqIuhAK`7@1Lr;TZ;EhNagVaG|k3&6xYcH8KK>01Zw4gqh4H3_I0~ +zp(mR$EVBh8Pqkvy=@wZn8-KnD6SJByA-fqr<+Ndv_+lC{EvHd{=9j!Ue#s+Aw_#d- +zE2bCF?B9Zg#jTiI62r)>C_X;Xj290!!-YX$rkkE%Ztwu*77Itj7tBUa1aVK5pTq;}N``7R9^i +z5qxvj#@GUd*_UGY5Sr#3+v{aY039c#((Ug&qbMx&k8fybLHZ-j^Q=9dIpe +zOo_tyQjPItRAgLPFB@IzVMO9R2sAYQn|V@2>F9+?q>zOd@?GI21ekt=7N)34YFU>f +zjqg-nx&TcGHcuW26oeNx-g82j=~O`o9Q4qH)74`m=k)XxxE-(~3RNN{jgZ4(mkSjd +zLJpybpCN<}ril$mfJg{f0y>G6xvl`yRe=!|CZWi5y`O*6ABtTJDd9L6R;n?gOk>nV +zjnOQsyu`vvjh`<$m`qPgg^MXvU9M?Nzos$sn#P<;7qbOQ9L%nCG4m=xB{3C_K+Tk^ +z4yIjmLHHrSaE)yCwS)>&>0(i07GHO(b!P}tx|Uksy`FEzU;Z+38{ +znJZ;3s@pu=YIks_oxT{2I}sPRBfQVWU7qv4L=^KaG2#OG4;-ATjw7`)j#ODIQ%Je) +z2+$m_ba4Et20O)a)}PW?ds1O_hQ{w14t`73SaCvOX^O(q;~I;Todn1z%sWb$QJ8(is4_DS +zT9|&o#>uL(8feLjXoF2wN?5_-dmqo|!&>STJMb({(mJ +zU2EZ!wFYWFTy5dQH8wt?KVr4Q`>Pb*U9DsV&8(i8wX@gR%)VUVwPiM5Wq-(0GfcP& +zr|050dMt{8$DWHcdP=*yjUI%a#4r)9`vP9bTaujBZEj4~#0W5ExMF3XpxdlCy3LH? +z`57@hH{JM6jPHbA7~_X|Zblq332zGx`h=ox^9U*NE=o~U0s&rF$bbO)Yp52*@ccX` +zpLNc2O!u12pKm@xsH}8dJqy>~_&GyJd0~zX`Mk5@cwx4M7v~UER0psST)NL!=sw>@ +zkNGxwE#O$_z0krdi!8jl*urc4o6>YoC5)=d?>63CrSR|7${bfYcx$zTw^wVtvsw$R +zyuVK2gFh5LTyG`T!yIru?5k}KzTWQQyPYn+-|eFR9v1`mIr!m#hoJ{Oj5zFI#8Hh= +z$qvS*xcDi>!;}*arlquDekRS^F)^Yy&?GJjOCYW2Eq;JD*F(GKquCDxVCa2m_qa}G +zqLN#+k0z=twu@TZC@zE+4grQy!SxELqv}Eff5OBsKA426@_^>}M07IK$=Ghsp*cKM +zUZ}oMsj0Jk)G>zH1FGWz3Ts`QyKCdZ-8inadw384_dOO?0@?LGG9PNBJ=93A^^p45 +zM{0LLB$*mGUuaFs$1O7;yHEk2&XK7<0kHtg~@s+zI60 +zC1M3=kGN=$`e3I^tK}eW6I5KZ*^b=TMlX~y5Yx`^0qx^PJFvb&VfdL=?7!iox)Hd` +zxa6B2N~;`PyW!*RV;5KW?^6ye&DNNk?_o&+@M}J>G(W(c3l5f?w{ZTJCsEK$yxdwH +zU`S>Qe!Hl|^Hd%4P~GgKx{m&t0Lf(lFs0G||4S@9%=c6~Ll +z@+$DddjES1#!4O +zDx(&|Gt4U4kQ22Sl3Ir$RA4fiFeJUvoHK5jYh^U|XEX`83^~<|!GxGoEf{{P1tU(k +zB-EHjj62tipR!spKC2ZIvs-1IY)W<$Cg-$bQf?H#S-C1HO029N@NuAS! +zYh+S#8AGpRvr5)0C5GN7Ec8q@(<_Z2W8sxFf{a4%RE1Yl2{E>L&WSjBro`~t2^;U6 +zjNsGrtr%Jm#rz5z+iz(k-FJ}F=%cvBL20Xvq9&RJjd$Sq0|$HWxY&5p#megr7GAL> +zig^ORtrvJ<fu@VbE*0?d+*buub33M+1Cth}Km +zUU}Uu7k|h)nUnCuIM{L96^Pk&*MUIHeHRBFxW*Urz`?PHjwmrF9(f6fad5KM6^J=q +zt8ung<3gQIs4joJhlsxx;Y +z9P^Fqy(rJ=kpY-oR#c;rS>2AbN+y@tI9?SX`MQgwN(V`m%FI;<$rUb=%Uww=OS-Ia +z?4rieG6#Q^I5@)i7Dh7&ARJjgqnAcu^bUp5+Z9GK^=ya2 +zh#d;UcGwua-Np~w<1z!b+vvAlq2G2JeYYxnyV=Iqn{0f&(ZW~j!%_HRy$vRt3CygC +z3)pN%Y^F3dn!m}WT7Z=9yBHwdi3@jSmx^ +zmX9}@AcxO3+eT^Ode{yJ-|u!XfV0=dp#44u9`Nu3J6n!=7I~P)T(mkG4a$+;k_JUZ +zghSPZ;1ZbiFCp;PNO~ldlhw284Zy7(8bm(8oRD|I8_6r*K1_dD4eZz +zaqJ!=;Ef!q%?wwkGpL?Y9k(MqFg5n@IZU0Q4Z+qA(Y*V2B@g9aJ^2U +ziHep(BfKjB6Xp7q4Ol9W!pb;T!dOVj$YfDv7^Cb!DTTPwh-hCF52ambLNCW~RgvaD6U|E)fspmY*$#L=5r8w@! +z81+m;et>8+Kr{xlTOQgi7jf~wxQJO6+O(3CF-9o2F}9f?7xA(7Y8+$EHezkLFI_AT +z8a!0r@^QHmsJy}WWT2|nM^c50-*X(y$qq0tFTkQ4hyi|nUV!=MDXB*;kG7}M40^ni$*8nYh508X +z=3f&|)?tszBmezzJyq(@;=43O5 +zoNAI8da4P-Pq)ZO?DFYmj6L6u@fX@K{z7ZVYFW5mMs;RlP78j?ZNuc;HcZKD6SF@f +znCIlTU}ixSzwqKUGm2OKYC*RHonDx*7bfh3>3-B0`lSyh^ue$fCOO&>soXO;(&2~c +zO^8W};gu6{yqaps@wGHt&Uxg#l5V3nfhI8$0&pUR9;p$$mL9=JC!-i}t{oHdqgZ=g +ziWy%G!GyjV^Exesm}5&_j4v}Yw#>ngR0m2l +zh8HV&EnmY`HIA&A6;Z9=T36?47uA<=b*yiJ!uN&xAEK72#;`Z$NqCX9vW^6^&@Yql +zlyvo%{7u;yQ0gEYu4sjRlL1BS!BJwU58)_OjKX7wa#X~)XTKvF*(fOHeZyi(zIXWk +zp-I1gAyeHFAk*P_q4y=RE>`NwYs_o4oOhV{OB_*Q!ieQz7d?!+;zm@bEmLz;K0(BM?*N +zf_@m|iP56M5MqA2>4*v=#{NV{%%;J@CX6 +zLtl(ZD031CWk!i1#GI*B60>~1UYn@pMi2RoE(#i{#yAjze~Xr+GIqw$7gOEtO9U$8 +zmU%%yHHO1=k??l7J|d-jdmQbj3Tv4Ng<|y%yk#Zm9BVXj3SdzX4oZj +zStIG9#<4P%Vmdffq5vyF)V^_`RO4W=gZ+i3v}_kaMidzb+jCrO$#Ssati~T_G}fIa +z$k2j +z4BBa7;0_A|ci9-QL!sX`3;nj(_+D1d9Q56!@!ckkZy5?89vVv$&X{u6hkl7awCSDU +z3fdnQK3ZqvgEcm|ZuZ_PuAkX>|96FVSK4@oP_x`h0FAE1#!td?vj!JK&!rqoZgcgG>uh0Y06i!K5Gq9Bx>u;4JbBx|2_uU+FLPaP +zAv;*;VKMzH>|p7!(2_0|o^uE;{QJDNlz%IQ*MB7pD*SsnV~#ccy~>tumiO0b6LY+d +z0Syj5S+DWw21n+zjT(J68Ks53man%dSr6;GOQGK$4}JGRd@X|+easZG!!AY~_3>k} +zk8vk7#-uwKneO73Okj3~jb&+%arT~vS^$k65P?azV#1Y}^Tp>vuS;TR+NTdD;eDZD +zzmZYD%9UfY%eHtkO|lB*na4W-#uLvA6&LzpWTlKNVN4W@nLZd<2h*m1q)`El$^cNf +zf)>7xU~|s`^6$rxeJ6^m&4eDH*)jf^i!DZRq3S|#NvjP+b;)4A%L5b6bNsO{F~^7Q +z`Pg$cSYuW8001BWNklN$+7M74S@iG(c%(EQDH{)|L}}n| +z1gLlvLv_6+zek$}B8naoqrMPa#QQ@3OJcej^m%S8M_?wVjA5R>7e_mYJHX{8U`<{O +zbIwHYdqD*B2~ib`L>#oW$I%qkXp2MA!{~qEs@MG(u&+X6(y2J6oOiJ}%f`_wzW7NZ +zTqTs}`w4LIq@VV|S4whVqVRp8Ug}DJ1<@uPI4@}K=vE+i1Fqdofz=IgDsw^hgsB0=* +zTxY0VMiOxW@IqnD)8Gl?Xg4@zLjEfIg+bXW6XYaIoM?fZwWse&=nx +zbtWo3F#;-y6|@jqx*lcqEdevUUslHWI}%Em>ctu=ZP<{FP@t**Oij1f+gd4^zCls0R7>&X9~|Gh8oAtdw!BES!;NTQK@;6ULoy#ZMPn +zCF7d_!~U2F*{ztE(~1c>Etrtoiivscn8cMbCY9wjV^$t}WNb{#Qy6?cino#*@!X*n +zJayQ@^MA$B{YX1{9BD`QzhZdlm@UPYvP#BMOG3>5Pk~G +zvUh%jqm1P^{ru84)_ +z^bB?VEatO1=ug!o0WINs5kBNS`B>qT6aEasOUKVIb@4;TIC4Iu%=E&Dkw4K9GnD^6 +ziDWXCU2+(+Om7TJD;c%?bGd_w6&jPTXmCZW!`o8n3BW8O+{zd@At!0hrz!lN7Ot6T{CZqrNwUV`ByEiUN0s7J4Pne{e4S!?4X +z#_+D8mqz0wDg(bOyd&NjEf?Xu80SSfJ7}bbMm#iT&5Vi+FX%f*3Dn3%{$c`8=USS9 +z9`js+Pj{x0&5PsZxp8!#W68Wcmw;m+hn^DiJi<#f0V{EdiYBZOT6+B&NAG23!otrm +zsDRK!|4ENU1SbPpp?cEwXnu}?tFCau*KtBn>Agft4~vvYE)JoNg_0)D`i*4_PcTE{ +z{X6VuS;aVP8y~KBBT|N*;bvf5<-g{ +z4YW{|;SgM!l?V2_5MV-R;qeJ@QJ#Q`nD_0@bKd5KGu0QaiE*f^aJ`IR((D-ZrJn0& +ziiubnEtW4{z|dNwj22S~5=rIea6 +z@u?3SoT%a27;yL=u&YAhNOc>^VlM9Z=D#tFdgoL{T~tSGFaY3k3^;nj#r_I~jGF<@ +zKX7F&jefzb24KqrVA>@Y%P+U1qSZl*Pf!8wwQJmqXh~3G?6O2eTl}mFkF9@YsiA;1{r#p_5Kvjlcb`j=(7@Ywa@LjL=?xzxs- +zvr(+gZbiX=B8#~u$iHoKG>X=kgSJS3wg?buqtV_Z!yT@4G5xHEnR&p1Y#TfB+eNit +z`J@>9V+M5EEk~4>Hp`RP-i1AQ+z=${YtS3xWU +z@8;NeJI9gY%Xg>{5wfyP;bhk`%n)R_`o`Zw)D~GCGa$p?kpM;I<^Ky{p7g*liL7%B +z#88pxoDgP0aQUZb^Cl!XvOU+sdeBCNvk)?O9E&JFN7NcOb9YVPqtw2Nu$PeRb@t;YQ(71P5AL_vw#fM +z7?u_NoYf*TF}np5I63Y3IVXaNIqjIim9o4RSu5je8CS}F%#Pxd^eA3BYz+O+ACBM! +zcEcQvB2;2RPt5-YFkMv`rjvy#Ob9Tqro}n{CIlHdW>|Pd;6~x~bQirdJiL&h@j|A9 +z7c&)JI~m7EC*%0`tj14yQ7pP_WAiOX)^Rc)E9BPOC~i_HX;NT^Mph$N%q%27G+vnv +zHx!m}rHB`{7d3t=(->XC7-d`5#6*dqzopc}@G?(&NQRbr;4t0H41q*pFq6-UHHH&p +zN;JkX-ua@7@t4?D;>v2%k9_}9uAnIl7Zpc|sxydvC(?Ohyfa*_qW7kMu@ZnG%n%F= +z)R+Ryeo_Q!?hB!z>#^%=y51jxO!$5wyzuys03&N#3G;jx00}{aYh44Rw}z@uC)n`w +zi;7chj(k1=W=N^mF}!b(l!bOa*QhN9R=S=WkO^ay&A-WrGGpWq0cONSSK^f!vD^tU +zEVWFel$E=Q&KO5h%BElCdYFs3m98i-MpYq{7*$1%)h-rQ8K~jooF@Us1G`}eFiUTE +zSXS*}IpdXYIL6d})4`e>j`+7W+*H^k5aVL|Z7MKkSa!*w5)(qq;Rh~`K43zbBM@_f +z-(n_WmNOC%!;~_XUJ_z1)EkJ&tv9}yq6XaoG8dbbNh@pRYMEoy7)B}+WZHcJ7@GY< +zMdoh1hQu(-<7PkncH9#a?bVh5=Wp9ctEAaqBc)0qIT68}%=NNs4wA3BNWS7qa#?43 +znZjQe9ULih1Y{1BxHwSaVNZdB-So%gIoO%&V0*5Et=SGXUr^Y1UOxdd>$qk{zf7is +zH76acO4nGK7OFEE%a~$zoPHS_3yxWse@tO6*UZE-!w>+CnT%$Zbu)$OjA%{_W16S# +z*ObsC?t +z!F{#D2fX-RsqxMV2XC#=cyqbJo6Bu5)l4PLkIN%&>V36%R|)lrBj68rnkF^Smdto@`U07v}g#pgyockmKJuCco2{g +zMMnFHl`(>e83QdwP2qi#JQg>K43!wJi#2P$zmFCcU}_gl9LGnCV}5R(4cuz=Q1&Q- +z!iVjsY&8l8q2__*qO8fq8LBOhfy~DqF4X!s{RlYu$VXZYlNH(Z;v) +z3#T6VD7S%|p2khv!cBf*(gsn9Z(Ba@TR=e_aPYdu{_6_KEVz6e;KV~8r)mP6s{__m +zd6-&gW7Bmdt747x@=P0x(-zrNf%SR--T`QXyTQXrQ|(I>VcgV9%h|x#rhH(1vLR8EVGPj +zM6Ebll!Nv-5N-EiMKo;o>qLOm8y=>g)tE-5AY=vbPTpYS&p2wBPvIby6c00D;^l`)D%9xL;dX35^ +zA0>>&zUbh@C5^IsjAsU_>VUJ4fHmbdhUM7kTL78w3QR;X;e|>IyHG-f;?qQoF_nzI +zIX)Jb0`rRke4DNDX^zJDVqg`!Uh;s|g}|x;sxBT@=LA@l3oPU6m?$_N-p}{&KG(qt +zfe#bvhxkvZy5s?$mjvi@iECpFM>2(#?=aA)NMY3_1`W7)KgYtG`5r#b2j0sK@Ncf8 +zQ60(wL`li_#ZSZd7gcu%Wo$M??XbGnST+W!1O9D&?FQ`zzBL?(i#%*QjZ_f>oM>|y{wLPC@)>s$p|uo>5n($^uNhPGn`CC@vJ5kZaamD(nI6R} +zM_TaQktm)$8b`OJ2wwWDMHHA2U}Tl-9~78>0+=Tt=5GM=dPWRSP8@HXwD4-CjaRA8 +zWIE`5QlmH5&C=s|{iG$yWnW)V7*$|n<|T!7*KHiSOEa{_xjH78xhQI4dXqwSy+Yq5?7O3|<(7k0l?n?PpUYyzQX4;&D2yq#@gu+4r^lj{J_{cs%X|!{VZYVR#8)Ma%2QU2-t~qJy6=YKRXfv0^5$MCd8j5+Xp)4WVdIp#g@0MO@)B +zL*;{NM+hc=?@I~Svi@(6{fd<+Fgy}qLg)|`q~mvT1wKM(36G(o5}NkIBR@l^q=Zlu +z!d_<~r4Ono^a^nXm6#b=tUAuS0?gnt4^&?`|1W3n`DRs_ZvFPZbk5%U-Q8z*w-E!V +z7%+g6bB>}SVgwZtB!eiKB3DsV&N(MC6jY>g4r{GB=QGoIuW>(fRxQx(_nhNPScxwOHOO9oI-g*n`0<7l&uW6cW3nk@X* +zOeKaf%SDA``oH&pvmZ)V1<^47YF+1RG00 +zX46?Es?7Q`7FM6LuO?1Skxbut;h +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 +zNkl%69QidAcPGL +z*T6UnYBc1;t26w4a&1rhUzGeF!{4QT9wiB6Od(^Oa;Urryxh>>LU@sMGWubHVP6c3 +zFE`%eN}2A3nFJZGjp_9;!V94#gcQO_I5h2t!$Ql+`6IxvtLQ+JjYG{2js!)QV(kAn +z5W|%+ftU_QASSU>P4va2bQ5A+G0YNT!s5%K9u{9Jl=RvH>Xm(JLXBZk8ND%5fXVI{ +zsxc!j8b@3?nc!NPUMiX8(Vy#Odc{m%r{TXX;-Zbs)=}Wb5Kz)?Bkdl$WK5(4 +zT{7&G;cD4+&Rqw|cigzuGDl$MN`qc4yU4VfIveL|tO<}gU8!)Q!p8A(TPrgqHhwQ= +z`?G~(g%*w#*f^SJ<4CS8y)sm1=$qNgZW&24v+%QcX6y;`KLY^5VR7d7i3&TeS~4ur +z+8d|oNc+F#7{#{&E^CfgqRHp3hOQ?ti7nP`hqbrt1c>pLzp4l +zEIVfeqXCDv%Y7FtthlIT2tA7vY%F4b$Y~{OXS0sQ@cyqcyvw*|DbiGUW4|pRBgX&z +z242}~PLwLXBB^E?WLTm}xZzPQa|La;?xWEs|GMAg1(t69%=9yzfHn~rAW9AaNUy1B +z^+rF2-6#Z;7k<%@^5Q-dFYJv8xV&`0fF27|_G`G|V>tpl{JHqoqnZ>HM24^;o|Qee +zz>2^Y-#5E;_E~r(XugmC+}eb%4fs+jd00u*@jJ(8z&9uQS!SI!!TIovg^$iE%n@j@ +zu^@qJi-V};KlsL`50syJ6D1n9i=?t=~b~1UIcIg +z-wRj0!eR0l{VRRSpHN(=yvRCOux`fw80nC4Sb*th?~Uza+|%*R^ntJwggq$tddKlN +z;)tI@-oHz43~+bQMPY|RPM3$AJ|HIqm@We}>$Be_rOOk~UUr|0oB>GM*ohm%V43B8 +z3uv(zjja2r?laEahJ2G>G3epSUHU8>Tzv>+u=KLcLRzPfG|lSJCQL1;}IoYDOA;> +zF&lQ&kTT2`6Ub_I@l!zr-n*RBZen{ +zLq&&hH0tRX>+dQ?urYTGmmbmg1ayyBc-#-%XaaI-ZIs{fQQHEXuQl*>fej{keO2yZ +zTcwXJB??~@nmASGqji+NE#Sczu&aCwTk{5y+~P=w*qs3fw|YI)cLJ%mU1Z$`8rodk +z>T~drs$2`Oqrt$3#bfxW#K)XcU{;wYy?9*RBEU=!;DylgdKDEC4Kp*#T!EG!8-Q;b +zfcY%=E_3l!4Y044QOTZ^f)ZdD^SqnsW0k-+wZOtE7jKlh;xo}JX?jI%dZmXqsyw_| +z!sAi>onw-0WVf)fSF#x*U%vV +zTyqoOPT+HySc41J)!6$I`eFz$ua``atJc>vj#Q1WDR3p<`Cv(4NBxPdt;X53}HEA +zmve`(tZ)d+ibk-!a0Dx4#cWt2nAaAKVs+6N)|8H7UFj&eTJ~w#Ft%{YBUn`&!^|ui +z{73O0mq+n`Utz@Z82%$Mg8xd=BMMBQzWhz1l%x26lJ$g&3>6ry!Wj4mlgUyH{4c4Aq&;7@p5G@M5NgDOoYRz}s_7Jd>mFj~s=6W)pBMyg;u^ +zP7E`P#;~M3iqCJDIN0RkY`cq;ZW{%CHp&JRX!@rKn#xRmFN*{fu68*%)o$ZxE8EsB +zY`bgVlUq@2Xoz8Toh2}`qBe+PuCXPNY*`I^VO%V((S8~2`*1K{R-kMwsb$)kUN2*6 +z*6Ml}Ya3jwzd@McW!|P?hR?l>D`|mxK}eWOFA5FI)-JN9o21qKzdnjA{&1+5!b?A%P=q7Sw8$ +zDufpebD@I5_+v*_?N-z|SVnb)p$hTJmh`^p^|6IqAq(P@`FmVir?9kM&oV|S)Bn<- +zu!51wgq8;SkT^Eh)G4fOP}4#}@ak$CBubgHF#{^&; +zStX+ibF$6BskX^=vJ35uS!P#^UMUNsmalg?NbL%}F-L)Wrj)mC3L#hOx?AEpyN;G0Rk7T(php6^&L| +zHM7wcwa_%~iz4$N0#tUG$b2x0^u{Ps8*N-`bdcQW;u;Gv>5<{w){}JGM&d08mv1__ +zd_&Kr1{>$=6cTDIoU2hdS7YOJm6D-nMz5OL(kpYKL`gyB?}ZA-@>!Cpf>krFn`vcc +zf2M`K83Y>bo7t15uqRbvcM8YGt`vn`*KPci>|p0L8$Tpk_&$kXLxsk`*H=w^dBwuE +z%L-dBD|}8b%_W7;E?L-o!NA8C4Samb!p2J`He9x_{<6aQOFUZGa7AJL6@_(I71mz1 +zu;!A9)fe@wy{xe2iZwB-E}K|+$&w+=EWe$m>)pEU=7mD$~#Q#obT82#YrfKf9QK +z#>)gEu4XZIn4S_w4;z@W&&10IEWCWs!Yc<2J%^&0dc?rg!zQL4w(#m9KE}k9eKEYW +zp9Xry73=rH_e1sMRZ&lDxyv64CAKvS@M~5QkcRUhZUwDGG*R8Y~d{y +zj2^Y{?yol9J*M#fZ@N@+=1GMQxw>~&VIB?m2{vY5bTI#dgGCoyEWhAlTFFPQ# +zti0x6O_IWf>n=8>`S>`)#pWyrpXFHiGS9^J{1|>L7{m4Z23i?a>j6>6L5$JIjN$dP +z`99*hh`2T)a$*dO2c~?TEXFuwn)5xGVKr&ompEl6PC4|WaNW!osNs5-ULB)(-xt6L +zW0PqRrxG*3u^GS2=i_VWRW>{FkftfKz +zS#y+*i{_CY7|YP6`3MdDrVC}-Vvgs}jtB9|EOV?M@Nu+a5Wm-s&B#1-4h4*jOAvUMGVbfX8D%2SMYGhrB8aMfD0dI)IYLz%Nx6zASU` +zO*zE4zq#1M7xW|EbkIBm437IK>F}|;auh#Q#8A#Ou~FbA6UT;uigp)yw+s~Cc2Oq< +zm=5j?0@*FV7iBTbEslvfer~yg1!WFql@nZmcPf0m#cr1}4)7+|x~i#KIQXa%*i@+v +z`d`%g^5y3{#RfJrF1ZfaTj^ncIg2WN@xKsaIA7NQ%PMTVS#C+g{d6XN(Trc|Q{J}F2m2jl`%cjWX+7~%w)_m*UrLWeDbTsjBD0uWRnoX^)X-Knx_;3 +zQ?UDkI1&%NxS-{9%EYnxG8$r@&o(h7D~hQ( +zQM_AhU|E&I=6VZ1-?wn8RUxU9z5*5n(hTjPY=9?zG)F6B_Ss17v2m%>#<4bqeN85Q +zxNl+WElb+lH?Tml&cZ4gy)MR7GWunf)OlD~=Yl8R3*^K*NHk+|mJ~4tC*8rS6IGe@ +z^=_aNI9SVG6Yb52n19l7E8pl_Tz+}9KHs7Xk-P8U?ZvxRTM`$ZRS+z)ibTq +z=*|`(1g&!6*xWdxBdBL{+z6ON!;{gq8roMCY2Wg-6Y8HcB&^FDlm*bURkf? +zxSZ=@jIyqCq~m3g82|NW7JvzE4}X4XJz+?L5MfAwsKLQXCXvbSH2|1;sxb=dZceU| +zt-tAD!!1Wt7(&eE+b%wdE3pjYlfM;zjEx;!ALFXnBOALOIoR{i5kT4d$Pu&tFO3R& +z8WnzFlrjP4A^*L&;)B`u$i;z2E)F(%INa>wNRxx3j|ed~erwUIWG7l3NhS*cCN%aF +zVlJ`p@-b7&*cam9z%8a(f-*^wH$6|4lPiyj0?rJyZ^Ps2=nL +zVhA!fh8;=p5r0gWRyOA1;TTmJ7oovFRAIPd9-91H$9S3FdfI4 +zMB0OKTz}*s>7k2j54`|n9O;xH$k6nkc*n-o+YYYWvi01waj8M!LY;*RgqeC93AF?n +z3klT<=c*LWR)$Gt?3PhDDIjCvcd9b^x?kqkJcT1UdJbnP9LltCFw??;3=8`*Ozcg! +zus2;{Pnv~2X^z0m?i5F0hJgT_9Z4p>OSH6yCQ)JARfR9E=nXKKNDP-J_s4(yIbh<|gB%0X +z4qKRZ#KLPwOuTl)z-vchc>PxsZv?~Jryh!7>OoUpmnQnDEQKUs@%?c2=@{dQ+rs{p +zgN!v+k`hKhn|{c`+e~jes_=FIEHl`_^Q(#X*vCWv&~b%XCpi}8oK^xZ^UqmW6qxWA +zT~b(dMPb=x2g@%zSbfFAx)fj;xjc&x?2LE +z5mm;O6|vD^MNE_ie)DhZkT(cq^#d0lx;TH&Kv9>AM_k|H#C$Yb +z9v<4BC^0t%m}qF>!fg+i?*qx~4QaI{LO!iUiSaw31=w?A6sH~E{^p +z;o-66q0<4HM?BnaGx4y?!Vp)u93WzQ8eG^?A9`TK2Sa#qC&n;6 +zScV1~#w(i!$HuraMLnapiM=t^^ySaZU!9c4_iKH*{k2LeEcDiR*iZ+oss!FHR(Q4C#jEtr1S?`R@N;C{t<2L! +zloAv`cyWW#T`%H!A*jTGOQ^!cA73fa1(rO%ROAMc%1^2>Qwn_O0ba}prWE{fczgT^ +zyyWTI!plz|pATRqRB4{0U*=zUWYKa2!-*)|Jo)GoquHOUJRXEQ)pI +zF)S`L@m9(xUbr%dzg`@{e_mlanSuXGjN!i%#|2;rF(Jsr15CI^_V?r{!Xe0n024w? +zxK8$5hA99;)n#%5h{=xP1x}WM7qiVj84J&6D?Fd2uxE0 +zci+O%W)lgW9+JB0EucE1P!>#auZ65$9~nJCgK(RRBhCDV-NtwKENr=B;NzQy_$;_0 +z#*^n2^;8rrEDdIHwIPwr3u-JZs0~IUn%PT3pN%Dc8OATuAH(&sjSW6F)O%Q4uj84S +za<-zzlEgHwvgs8z0+U`-TO@$P6aGn)JXhJMlEnK|^h#Mg(CC%3a7`_IZ2Xb;@p||e +zIR=r-RAAVT6Gl=m4%Wsr#7wS{g{x!)5UzspC;$^2`FrE=Hm-v$t5Y(fw$#P>UgA73 +zdKHcEVq^IYM^C-}dB!O-iA<-FF;ZD8FB)FlKLQLP=C+Mb?>G{-yfx^7`SPwMJu%X@;D?7Ub~RF&b3qk`fI`DQ{VqJpG!bA}Y-wTtLrcv3H1r>Qq@$Io#PHt`A%EJsNWTc +zDeI>i#_3`Qr;2QxEVOZ=z{c@>h2!}S +ze#=$(Eyuyp92-Zn6$EOs6b@u49L#iaAj83dbPxN}J^Y-iuq#D(&d@`%ogj0~!Z%3@ +zUnMGhdDX%fS50h7wD3ieh0m{A`23oU&yp;BmZb1WlESCS)*t4R>lQXAn~)ifYp)Vy^lI7S1WN}1oU}3bq=VVVZG8BHrFff_0i +z9G>J8Zr)<2$stRI>s7L1Mc_GVf*mKE>4cfXhTQl1L8>`~3r0HY;dPlqO1vfXmk@xa +zGs)|ig|~iFGH)I;@b+;7?;KY$Z~ty%I$?&-&&MC(Ygu5=O88!+7l+pa_~QLBGu(2V-#^wx#tywOa@NI4kKjjT0wH4@OcZq0LC)4m8UA)v%VOZ?^V{%~z9-un_7_$5h6 +z0~hXDNNKWgz176EW(%p0fTSjXkd)BmV{bzgNi8}#bDWOH^CWJVurVHEn1c`cb@Cs(I8bR~XK@UN +zs$J}>RM=f=;bgUevd6#}|1CuwDXZk`%lk2HSs!D{*tlf~z|fCGc#TFqSX}QLr&nYI +zpA`-wv4fpAKwpFfp1{3sAhX)Wm8uvDAGj!M22R!i-xs*pQR+!o%Bn&an@TNQyyu{G +z5HJ~!-R|Mbq6mJeH&N6LG!6M^98$PHY@qJ3hqQ($avL4gKlbsc8v3is)70R$&@L)UhZIe35zr**TbflvoD6@r5oX_2~?T&Y28?x){8aiy;zwZLJT97Y3%O> +zP5dFe!~@KSse|}1eMsh`j6sA$keQt|C^IK}2%Ndugc+S&wjg&HgcutA2{J44^sLGo +z$LjnDRu_$mDzmC&7;DN#wb{RP6r0MT__#cR<%Kc4n?8zvTpGatx-^RayvmN480d>3 +zxDaGQn0Xpt1Y)j5@ITig0x_b*q(mklCR`&6SIPbyVhmANsIa`09g}%E$H2=uCSK05 +zWTxaOOv!QZVy=Vdb3HtlW8)dBHn}EV%!^`bv4IcDB3M~9j;%Kh?7U~;_hyBw?F!kQ +zHVPQaES>@e0J!2Y$n7?e)@>rGTj5NHgTt*hereV%?O)!u@Yzih8*f-x+hAc;y@nV9 +z3{Tp_M6G#LOv0%)L9kiO6{>1JKIoRIcLa(y-f*$$hJ%fgXr{d#RDD*~>s7Ypa-z>Q +zEJt_G1c1QT<8u-m2r}UiKC}`u>6M8G6M~AYsr^ZOatJkie0Z4vvnVM3)X*}iz&w3B +z)tC@q`2P4=2`VcCc;V`oKu10OLcHCQUKjbSRBgh~8hB`)1{eVuNg-2M8Ndslj|z$nSGd(C;7~Vs!bXgPK7-gc#i&qZJuK4Etl)9rKV$L1VV8lTnG81Q@Pw*b-OT +zBEA?~`WGI@0)GtC%NWHP1N#{G1CcVSLz)}GNbul!;FIqRW8m~IyhhH;e5G^gfa)`N*$ajRyb4a;B=9VQw0uA +z=G!vI^KAUi$#n&2j^;QxoT=wvrh~odK}>V1iJwv|{1D8J>k8YG6~0MU`1+b9^VKyA +zUnN`kGTFkm>lVHUW?PB^=Zh4Dt-LL`{CTPZXG@x%&r&UXmTKeE6ot*#ZRrsq%zT_| +z3(yc|)?86o$@pHX2i3C$CRXh(U-#5Vk#-&d*N{gZ|8eH7DO8VrXh{MGV{2N +zSto3Kcv9h`6PA4TxePqu@8hhEh39C#cd+<^5(ECyOA0HlI#`wDiI-(Aav-k&Qlp;>-JIgp{Do9alQxDZg{FUNyRcsU+k!pHMS6^B0?1_jVFA!%Y<6=P7q +z#1O6+5&(4YONo9P?PEY6+uL0r<|sr|Ouof$kNK$SRw!y!$Zhu|vN*S&(Bh$>*BAdw +zR+o#c9uK(#J_?6@lng^Awar1o9S7H2qPWGs0WM*K5y39n_;fm$BLDy(07*naRCmDg +zabo~TyJzFf%?Qptbdl5s0hDX4N(}IsEjn`d1pO1$Lr89k;QpvS`ImLEDF6QWvM$Cp +z_|9_7ecZ^}7)TM64*r +zjhJ++uy-Y9TC$qQ!p2`~qWHOF1c?vnxq+;RjYrv|LzM*LoiQ2RJO(7*x5cEtqs+nn +zN*nttOzf`mv8Nz{{0EGB)`@5|_(yozR2Z>LiAtuCf7s^QSQHWZrKrGhg^m3_QQ*jp +zF|02bLVB|+g`>Tei~g94$9+H^BkU_oq~9`;*8(Km27WA2()03d8L*bHUh3e~JqwM4 +zz#tRddKpV>;HN4})E53Xd^l+1;RwA@K1%Le$iJh|&%pAO3qp*s~ +z3sc7`eeA4q@e_Y%RA8z+?5+W}FqXO07S)AGW7Da=RQqDmf1}#RJ9UH>AG7K_%&PbC +zULC{(qdhk^7M6I}SOF}jFNene3P*Zi=w*4UWD;5kF5$!jj6^aA@S*``($N1j#E6NX +zMt&KszJw4H7FzymfC-hDe|LORogu))0}ii0&vdf5#4>tj1Z;9WeT-WH +z9%2YHA;<{KWNDCLV%d`15iHFc#q!({tjrt3%KULGD;ULcdS!}+vAlR#U}kN}7}l3? +zwQKyJfAdzzg`)_e_a{D|B3^bcm;;g5Ujeb~YEE*A+MEGRT_sL8_a +zMiV>kGv&(0$2VPB36n0ET7n7{7!&hrEPsK_{| +zAF^?iX=TzK!`NjTjiZjJF}esdF!_&Zm}!l8VBgEmk;Nq;Q&3=-@;?RT{z!)fujw**KV`0DeO#B_#xH84`~YDr&`#aV&Xeas--8*!gpy3-=-;ilNvW^Hoi_%_$r)q8((MG +z*p{KNEyKna=?YuZI5s{{a|CDzHJ@C!1!@R1Yp)ns9r$GEkCAjUn$OQF%s-T(-vl)vGBne6Ca$3Vdhx_v(B2Bb(XiAc>fer +zzc>mXoTQ;Xc&+0mW*+C-m!1!f^F0~zem>;qVR4{IZReS1qjKN*)!h6bBpATzs5HSfRpVOM=+PIX*ULyV#QBV_U9=uk#&z +zlkZ?hiG}T@F&wQOL4Kzt;6g8n=>Vq96Mi3KK@{@8Qe0?y=2{uoe8SOSLEw0Lw0aW4 +zN_d=11`EOf;-ZxK7*P`f#fK5idKlNtp($M_jS*^i5>6H5(U66<0Rux3h6!+$ivAd1 +z(#co=$+e*3#|H8{3^Cmo3;=n3J_>qu3K&%pu8rk(*}6P;*hSf>kGx^vQj3c-cMaq` +zc5$CdiJ|Z~YKbD-s(jorfx;da7w$%J@qt3pBOl2vz_k|OdW(s}7#=rF7>18njHZ1HqXZb! +z$G9Yt0b@a^K*X>Rv6MhlTC0Oig?+fx!5|1=d|aVB=HX5+kXx^iSYjjjhL8M5z~#HZ +zPZb`%uQaf|I*LuD4z`v#61?)T*G115Q1uu%P;Fvwm4lmuKjZ&q6Ps9IrD9q^;9jsc769lTv_VP=JkE!Dton)WMv>@RmF0Onu?0S4I0#IZ^X +zQ!5-<8GD;C$W=bxsBtm9h5+Q_y?S6~1JxG~GwWPXjd{CTgARQ#YiocNjCC$?L`fl> +z(3c|~8bVe8F7eP3-o_)Lh2aBJ%UzjiPoJoR!zR5zgw=UT~D`h}tW@?{+%!C>fC^56M +z^op5YGh=eukQo0L<&0u+-UycDjmj*|AJyti!3dTX3}b1*kig7}qEW0W9>Ln8eyk}T +z!RqoTmRBgu$~Q4JbrgTU(vQDg8OC3qQemjX#KX(e3Jd`zgqQI6G{l4}Wg*1S7sF(- +z7c*lrlOPi+FjQj2m>3a{kacsb9-t9cHl<=J>E +z*Tl@iC>B=g80F9Jxj5Kt;v}POnf}!0Ag`b6IW~%W9TfMvDC+l+C23|R5<4xNf2?r4 +z&B6XA2R}8s`0k!9-kDEsnAq50V0FEL<#h&@)LD|kMgIytE(92=GjnT9%&Rf6u+9{a +zSyE?WIn@ZB%m>lH1ebM$Bleuo=Mhc=jqD5yV4sbN6}1-VFA3MO!j&^oX9!HyL40!n +z9aL%-1R(N9MP*W53Bg9g%jE4LyhwC%pv+9b3;i$wz!0b=*5DY35G1t`zyxCAlEgw- +zBiM*SLvBfZ|Wqn(8xalF?ZM%Luhd);Dt(zs4@2( +zY`bgYtGf!{+*R0d&&G~>mZX*a)M#Uu82hz}e{Yip7=p~f7N(FXiBhKO5>B{6#$Fi0 +z%M$?8=Hg7dBM_6&ZVSL%>U42AP+|x%j9E_XnuHiBz3g&jH(jEZdmQ8h5JM$qqWCiK +z#ZZmmT3OAYt7Df3ZGo5@vR3Bc_J}S0G52WnAJyI%Nh=FX{xtb=ErruQ?#pUN{CY>{ +zxQi~Xmx)Klm)O&qJ_ngi22vkcNNx6z{K!FavyG%j7Lp&@GE6X&6tlZrGt((%Ofn0L +zG81p=Br`@cUujUdT(5A2(abeUM#GE}m$0N*s^kVqCnv{PCk>( +z6prL79Lizmj4sgJo29TPQ(;$zg`d(Dc4pZ4F=07#_PMcug3;}1hC>K;OI0OU}bI(|qdxn5u2`Fd);#!u457|o-zz-E3 +zUgm8C9s!PB1V#A%;2U4a~h@VeWYga}t>LWn%UjMipE5=!~g< +z=Cpo&zV750@?PehC9LqXSeSp-z=Cro7M-^OSRt@jpu)18ULh(}^bRFCSe>M>{q0dFk-5w45gaZu_;o4Zd`a-Y>p@pVxUMA3RM2-3X0Wefq2rWDkn)rG$0xKF? +zs0tBYBtc66Mn9fCGVQ|#8V7B(j(Qk2eZ*MCC_f8HFS|eHqmohVR9w0|6b}If^fC-k +zxph(4r`N|aJAvFDA0>kdl_LhqhJEDr0T&t-&NUh+9s?d&4jx;2&8scup-EY2^nq-4 +zyWF*Ku~Fe_ixR&}ViRzs8Axq%kkjHLxeeHN$Ht!8h-^MIdk}zWiSi2&y~5f`c!}ER +zh_J9yt1s +zT+mR@-y0P)1}QWS183^S@l&ON!cGP;Kz^rGXNFBcQ5G?ECrfdwkJB{@`-&9~mistd +z!L>0@Oy@fbqDZJQ&@`yMNBlQNV}2xNBPNi=)iGNDMz6f_eGp8_UHn2ojpAf>^_nGy?$H8xUj14*}mV^uzOmfP4~V_|ERiBHO6NPOhU<2wg{ +zTfM;18p2i#RXsrasE@`zg$I2u9t;AN%|6N=0JUv4n))3)><0?kfv;*}m{V%v!%ARr +zg^wj=4(69Dd{|*%MwN-TsukX;@}$6$>dd=UzNj(W;@DURd{xcx0bqR%Fulga)QTw9 +z*Z4S84ID1_u)9KGH;-H~V~J%o@J%&e%fYm2g=w|Ebhxm`g>b@h%C~Dg%%t*iLjw#~ +z$KJ2=@otTWcPd@HR}HMF2j*5&4Wc*4!|Or(@r+WPlJ;sfJv0O@ZT6RA05x10<4j}h +zGtf1h4BP(LIoxSn-E|^UEUsWLjEQZxnLy>@w^kPyIy|KG +z`pD|@ki$Rr{WgjQ_-(fmz{%=k8?lY6oeCG)OgTB_deNST7QVk{VA~x7pWU{wfhXCu +zhJXf7=oi;mQi{nw8A6O6OB9<0)uybOF~&Lc%}B~ty^Zzt3LB`%h-zVBHPs59*#BV_ +zi%_Fvs9b~)5w3RqJ7|f&k17sFt1OdVmk?kGLcH$@c=;26k<~XzA`8~w>Ksv4LPdqi +zY+8|d@)*VAA5R*OaSJlElFeoF}Ia~3*qIH+m@&=RA8vQaJJr4 +z`24=Y7xxstx})dYyYxW?1()|-{MhJV=OZ1ry!%nGTGpg+pgD+9Zeg;WnowQz>X?h) +zn;aZ(cJ%~?ew|8Y<4haeKyyFW$-=%E`eLZW +z6a>B)f_Di!k@_83jjR}OP&J@e%5+j$kXAP2;O4N4+as>@$Ar<#^v6(<;WwT%^S6y_ +zQ!SMkQC_Ibgq|6$e(=PDCmRu_mw9M4fZHQLL2C@Dk7BsiWa3(rLTa-kYi8FQZCrog +zA~l$6_ZZ9Ui1|MZ0H87>Yi73;uG~^cY_Mgn1~7A#D`&M-W(YD0mnykVp>VNWfiRO$ +zuEamXAb=CaK}>T1GXxoS%}C!&o{jyv4)*0Z*qd!*ceaC{vuv4NSvG#kR8P#0Sq{Sa +zA=93?{5|1?u)|}H!uA|T=DTcLASMKvFVhvarQ5P@CM#zt7CueU{uz2^HYVCwd)3D3 +zOEy+gdAML<*?AL7d6J(nISc>@uXFv3YR!{lV*WV;3(s3vcwS-Qd0P~Y`Aq9NtH2d4 +z4wW4ZL4*wrJrj^YMdZAN1s4?-Tr_1CUb3+GiY>F~vLpA+J8yzB|GbF>36{hbGrE|w +zkctXRBhOn{be^h;DUc$d!q3KpHm-xQlO-6!%9?97*3x*N;$TxMl@=GDW+;4?rLZ;E +z#us@GzR0ujWxj*23tW6t$Who)r0_$TiyzBv{9HPYQ}tu08v}azjk~WCotWwr^K3-H +zZ}Ke+i`RwS9z0>?NwJRKomdkK6c?&5qL75(5*Aj9SLM$Y7{W;iDuk6#feF{dc;A>C +zfD2R4=)G}$0g+e$GU59nnewXjdrc@K8Je +z6tUBz#}jDb$`}g}GrL^rc3~89#juB(2v9Ntq;&d7;QD8iE;W4YdT3W3+Mq%HT^jM&_D%yT&TQI;f(_A1{D^C +z&WH=~zC`#%2|X`9It&j~kGgH3al}K>y#d_l^w1mC3KL_JBT6B{t`}JsV_1QXBM!lZ +zM?wt&h7G7*vXYajv474u+Hx +zWB&lx#~e!%=57rFyUGS}xM5U&Uwohaj`lBQ)Y~{$;^AU7kl5hjLcNC*H7*X8D=C3w +zIpmfSOa5E5414Gvho~#RRmO0nauikFEWQL9`z!&hyM&i^2ZfChl($%T*atKY0au%W +zZPg}b7h9NJ3CykXu&4r}z|5?$@c~!HDqMU}3CyYjJ`gj#i#IA2W>-4+qE`D|zO4q< +z-C%!&P+(pz0yqSh_{$;4 +zg!hHlG(QsxnU>C7LFOE#;~*~Ch28s +z3Wl-1a2OkkMzOXig4Go+W@npt_R0|c=jt&2c6AhgO&Z64Cr9z$$w9eg(zsq7yB@{g +zIiZ>V{{z50lNJ$xp(>;OF(#hRS=P< +zrI<_>lVmXQooFwMs2dWqY+-q|iIp`bR@azVQ)7x6BZ^Gm`{0Rtcyj-=zk~|Sq-ov} +zm?0c3u2ERR4x6VE#Qxs`3>75;3?rrEpJNGA)Z!GFKZ6(EHc?a=*Pj!vlJQ7r3(G0j +z3A9aqMt;^1SVH9`y#5CT<_Ul?@$qdv1Q$XK0dvb8g{^lqzz|{xFx&1biCSjdGJ9h< +z-`umY{ei*`7NR!V6Q!2)$1q0u5X&s3(9*<_7E60yM0p9orNzO?W*1>18CS_p1*ZP9 +zTqkR@1Y*v&E8P*(>ETMJi%ayxFrnV`bzv|C7d6cttG`XhyuCKoA>T%!>8$V?!?98@h +ze#&w5> +z`qU-umsxSq!tx8I3{U=-amDIF2sXAr4a+kHZZ2^Bim6<-tYOhZLXZfdB3x5rq;ohE +zuyMh}BCc>8bj?e$UI1LSwIMAAV@yM^2#7gbRQ +zwNdSNxzgm|;O}akSFG!73dMyqyYg +z!;mP|TuqFcTyJya{SC()jM>4e8`r_)JuCFvro=E0D20CC6>s71l{R)(n8@q~M#l^c +z$AH#B4>|W8oG9bpI3J1CHZIiqI921}_bLm&RN45X3RqJ_5O8p>%SGQfWF_u=gMq^p +z5!CkhXc~tkqO}bH_xgd_4xspvjncLVZuJ}Z-;}-in-o>L?ce{@_qpesd-|O2KF98M +zo=_A)5pW*6?QU&tXG8^25Re&UP-H43o81b8Uy;EAZl>#e|!W?*Ln@PU*`Dm>a`MSANd-twlzS^|MxRyx!K3VtKdSTzAFGDNo4fBa01il%k+it5-5Ndp7&+qmYGPF +z4KhE67y~fDZPJdyi_zHJuxp8PvN`RVh4PvV`B|Oygg3X7RuB7V-b( +zCGjtLDg5s%N&K2I%lS+A*Meoy|1MZYpnoq|UR@^(*2s8f`(c747XDC`#viII++A(szG@qfRHg7_Z3^2O +zQ+Oj{;hngJot-pkYn&Q!a6aLnV8X`LDF@Zlu0%9*?W|&&D?N;EW_hLq78L$C?BL{( +z!jSw*=FG{?Y8KzZ8qNSFc3qS`Fp2>cRMZ7d!07^ +z(P<-yTK=fp5qKfM?C93wecI8hWUb5?{T(s-@4cb%ZJ)xo{R;asYh}j7pE2;$|1zNP +z{h-G8gqK0n3&Tmw_e1Q7aip8*?1;vXLx&AiTmS$d07*naRHh^5(x`{rQ6ISp7dayi +zE|1u&)0l#Ui^6daMdS2vc_^K9Q8uMfKBaJVTFZ)vtd&h`)C$ZvtG!5}IS1i6XEky; +zKJTK1Yh?=x9rIe&%DNWmkQ)hahFPY! +z0#uJ$DDJmW(67WN!xb~GndIMeMTOTjih6An^;jtCaZu3X$YdtB+eKa{SIrE>2+Xu; +zUP(mr@mgC7G>_IQ9I17T +zsx2I@ws5G5vT>-&!NE!g-&HEpMRQGIzf5fuzO8Vux5B}m3J2d*D138`a)!Z~*&$DGR@N+zMKWe$Jm0x +z@U(@IIfa>I##6yRlh#=Bd`v4J{mUMrlM40YgcT1BETNtAP(AIScG{OIOy#(b@(~v$ +z!%X7z(YWLz>Ud~QL5eDWxRJ#9n<<1Be2GJzP(DV|Hbxu=qprsP>3>G)h>J6wX`Jr0 +zae2^1!GMpV8$ODAeH8Ztc_YBd>k9i?7V*<{O8|5NlRni)#zDJb#cudxZU2I@1a>&Joh$ld?F$8RA^su?v$J-GP{|IY*6!!5K!bHf! +zqfH8bYVmO(4jhU?;E$sU$|^}%>#Mk7BN^YK*N +z!v@}qLZXuI4|#aF$;0FH;1H@pX2QbwV@_9s2}^JtoU)EaUrlpX>X>+9fCmUVnG#E` +zjb$qvV0cYfA;A1kvC7#{!|MQ4IW +zM&C^E8lKrcnqO_n8Nt?^5p26Wf~{9ZjdBy%l4nGic`kn(&lgM><&T@k`GlGYyjV1j +z7mFwHLXnAB-dfCrvMEz`neoGHkZ5JbD^KIeLK^&MupvC6o?5x=9O9lGOzM%u&}Mx!eeDixGQ%Szs{M(zve7} +z<(B`NpTfVe4y1d0K+x1Y){PX5JQ-`9bimS8IAo} +zM*j@V1P~Jdj5#gbTb06n)oI*Qs)t1&RMwIPMqA~xRbU{V!f +z#Fk>h3keT}Y^R-4k_g3BGx}$$rZi}>E*@7X7}Lld)3`Y7;oOji?*~2U3;C+o#^*f_ +zKIRml&B9+>Exgfc;nlc>7wM0YCVR8WB`aMt=*KN=jazt*31}@ew-aVeugvT5z%N6v +zaqtGk5B@w^_?Qu)M@ltWtVy_GQ6%Gw>06N=7Y8pyShlG}FGMw-ry?pdxlz~_ve%|B +zT#aKQnxw5613%w8g9fqzCb-T%2`K@%1gmesW1jM7 +z0EQ6r7m6J}9S;85?tl>Uw{~lFo$TFCPGf8Y07Ho3B!+&Nk24S>D`he2eVSPr%z#TzX6%=`Z<+xaJbLGF{Y6XD4ZBHGT_2ORgKfboW?jJPGf!; +zRsy~kMl>#ux&kn{qYAmB4swPqTpF=(Y0SZu35~pQjeM5PO(>L1YLregDm>$jnQ~Dz +zMRPwPTcdtjp>f(lvrJ+%LbDp-OaUfM{w?!dDboTmoeLV>3z;I!MOV!JTq|RgvOo+A +z>sI)oFqoBh@L7R)hHW&GA8u@J=@>)IQwz#;`;^A`K#pRfXOHmgW +zB1|=72!M-o647j6=2RogGc`_fLX*)67QWRvI9{i5jBrz_*_=a6h5nPvHhyX +zCtNwpz|8x_3hx%#c)QTX-wG7|ny)3r?60|wq?)~z>)hZL3ss8>Q5$G+Ad$!=qb|-|PvO#lh3JxpQ3Z+X?N0+k +zj*n68qB9L#8B#djY2l~q8pQ(&Mg2Z<`aD?~E9v)qH8 +zoZ$KxN*PZJVTE275hpHb2cwq4h-Lg9*B5~BpoPZXCG^jG5)r*9J`%!!S^K&LU>I>s +zP)KtcLu0~U@%9q$;0?j;EwP^NFX{0$>v0aISzu0Btr`QTwC%9q;EU!Qe`pJ}o +zq^u4C9g{vTwWe^m$-=>qi-RGBgUt>O5Sk;vzJ?Sow +zEWMEVZ(S)6Z7<5UDV9tBQ^ +zT%3t&>}FYZ$irKW4vw@~h)qD&^Vnf?Jhp@%qAQ3beDp6sye)mR>fD +z#{feu=6tkF1G{2LY^`6$mS$jEGvkLfHiif+ga#K+hBcmT^6-32M)(LX(6}(Uq)Q)ifHT&`}iUTyb^N3)iios +z9_7kd*uV?{h8~wEGEvEdnDr44kI@g4iB*22*%xqG-^2*#HBUt6(zXD*Fm^W{-&xtv&2&KR~_8N=3G%1mSkGJyy*fe1D)6i(v#!bv<= +z#ALE*(bnQ=Y%ZR{#)3)lzR<}3WZ?{+D453jq8U71IF0p%b68(AhbIJVjKM!xDa(eL +z;F>_Q`RXDzS1gF0y|#!gl}jRCb1K70%yU&sqUUSYrZO+rE{oy+mAYlTRBz##$`l?e +zUBT~j=kafs=kYK3EBIdpN&IX6GX5=pNyO<(05HEUG)ZIxm~4o-(*z~}m~4m%CNRM| +z+3f&xYvl48$lN-Op(lpmV&mRw3-?tfac^Zx?)|YwNkRluB1}?*#viK9+8HM_57gLL +zS8ro;Qwo2IrtyBOjosHh9P6{e^`FZL^R4*RDOb{=2sHfgSVQm3ltS60gW^erD-$*@ +zBy5~XD4ZBoI5g~FU%w+w?_XTE@KI-4)|>v?uJA@1Q@J#rj}u^0*c?lXo{ibq5_2Rd +zU>l1dlx@8M8`uJHQw}49)xk +zG4#Z=a|&ZTF|tx7lNbl@$y%A2#C+K4fD&WBfQ*e#x{bD9CxF@pWHM`IyKXr6ie;C5 +z>=Lr2FJ^zANh%}EnDsIn#|9Y$q452%nZ#sAEB`RcRYYYxF~c?(txOM0!I+EughpOM +zA!m&Ltub!dMsC6}No5l*3MX8d$dpXzRga8WeKfr>fiH%!;an>dqyL?Tyxntx?qFqOeno3OW>wT;#V0 +zFykV(g+SvWC&pDXjmuGuOER6&I3HrNnTcv<@5~uaX__2aIg_=s28B}%3g0&nZZuBR +z886N88jYj18b@jr4%ZqTs&#R&M&m#&rEq}e-Z}^S>$K=Vy$fnzoxOpeX!#0n7ihf0*AyRM_cswG7Ilr)%Zt+ +zi+9WDOHp{I#KpVCF5WHCM#UQM5l)IT@3}c@YLjCcf`ZqsEs`_2YX^J_C*wqhSMm!?qH1V_FNOwT095z +zH>6#K6%i*D#%Chamn{DZP28qD(3rXTn6MI<^X2F6G<}h2%bHJy)0<$LBNH8EiW7t0 +z5tAThO!>hzCofzRGcuEypnGN}pq5lIu8ZaO0tJJ>l9GiJ&)KxTKq0cOlG4mi78{5 +z)vIiH;WgujsQ_Y(=Y=a^zIb33EC=(pg9Vww_?UHk3@m#nrUAY!jn)|p3$}t<0<2{q +z#XcEDKMqhg=;HfG65oXs4n=$%j`#vGhoV0AhJo*zQm7r!m|g)K20e(kg*`K#fKpmK +zFAP}#<|sl-+QnR2%Nipiod=hIQ!y7`H7FDh)39%*MMDcfQQX3@dJCr_8mA)=or(cx +zTRrUM7m&>k-fmJjeVsAL26#KBU7U?B;CzQh>m1O#z>-QA{nI{rCV<8fh5A8-o)I4d +zqdrEbe1sCf;dWqK!y-1Y?x7iYIYc8oCovv2hJmNJ?#?eULl8Y3@$qm>;gOhy*J2)a +z5MUxM{uJ}^L|9>6nBHFpdt<@}svD|ZK#KTw8`{LuP2=JG%CvnRUMm#)3FAZ0` +zB4*-4cwy2QPflV8H0#1mlD`?DS^$G$M9^9JW)LRGd)={2Wms< +zES@Tx6K&*rS;Zorxn}fq#R3R125M;fH!veWQ@sGf%qz7Ec(rZ;uM%dsYE^3s#N1V| +zh=0kM#lPe);eY2ZiE01eau-)u#>B**ff<6#e-tj?B6?r4l?^Zf#AE|ZFoC%hVoYaD +z05Uu|jR~eNJZbU|*2f4j!Sx@jEb+(OU9E6;t;XH83U}8yGMV{9wS~K?9sIsV;SV)R +zCN_^&uV7>Ciuh*U`aes=?1}ljM`M4#2Y$o;(}*qKj5EQkV%kJC^Q@S0P(E#=WHOEX +zi4=0DEL@zla4uotELYA3Z5-}POHtzP8;&%^a~kk=yM@no=UaR{7k8z_p1@$@i8Wqj+Lt7r87K$>511A8N?33`qBF`Z5IanjR^}VbCOprjf_C6fE%sw2MG})56#`hY$ +zE&wos86hScWd78)1~6~7+N +z@NthVlbFwX6+Z7(;)~gNLql|v5M%m-2r_#!#h3eN_8+iB0y6A}8Dz9F*T^)^NHUpP +zTO}J+I5(njJ_9lAh9Sfhk9jEJ3fYK*{2>c@!?%5nhqHk*OxSI +zWIAN%i5X5A8Ia+(sxA`zaFXU43O^LN7*8n?zmXkIx)?|SHPSjBjj@3IjR;O^Z-snh! +z!r^-77V+Mp#x)&mR5(ztu&>q@m=U0vZy~4rvs|uf%D|}M6 +z779SH;mX+u5)9zr!(xpOi!?qcR3ZYzdxVK%B>-d~$oOqcUkxEhi`GEM+%rF`@Lnkk +zAZ@&V)#!r?3m;W#(T5cp@0UAxznpNQ@jGzdvovUY)o5c^lg6%Q-?W*>fv@AhcTpDyV-60-mQmQ3!XP_PnA|06 +zVHq>LtFi2v5BdZPSpnlDMb^ArIfL{mNuZMU^EGfGM3||{8lYsuNpMZiOK>gF!uLQw +zMwYT+#jJ`2D`Vzl=M2Ty$t1?7&xI>v4yKbCaA6OPML@EVTJe!iIk1(3 +z{$(JyJ%wY9i#X8i;BXW;lF{Kfu%`+5rp`inkAvA|NVKvglNK$>W^;sL%SV!4r8K~4 +z8vnV_)W4WaA!#f5Z-t=-=ezg?#*%oJMwvL~SfGcnVSxQtDV&LL+QRiR;A{jq9|!h# +z053(B@z;hla(azXe{fOZ<_gopJY0;epm&ZdV=lVc^D^t9cM^yWL*S)rTw#Lo%5#uZ +zvTr*)yxFX_BFVJK^zOh87G%S<8} +z4gTVfVWL@>1pC&T_*sMWIkYE;+VeKs}o~xvBtUwiZl++EzFv +zdah_1lvyX6#>RpvY$%w*lLeCkF^?5Y;j#P~JXSC(5}+Z}WF*s>!Z|!qG%qp$Gmj0W +zf!08VFk^sbVHIc$%*^B2YerkEm{zuc=d0)OV%5APmKlh#@FYDY#f$h|-W-0Nw}5}o +zC%i0)2rF`3xP)I9E#p6^48UYVOK^QVyaWJq`x+VHC6MvK+zK$kN*ParjG4r&0Sw_q +zfTcQP>gPnJI*t3Q(|DjNg$JvWc(6K&2W!%}zsADdwKo1(ZR6frjr(dHJWyld!Rj;~ +zs!QXs1{)h1Z9E^c@TXWB@3tnfqbr3yH&gP>`wv5GTGuFKVHo2rr!uK#Qw#{O#XD0n +z?x1MgMqa|krBMgxMs1uPwsCyOe2c&5rpA{&3ZHaZc)uehYfx{trSVE@8ZWe_@jTbd +zVm7u#`9C6~t&DSyJ2IhpzQvW*GcovQO+MD3Arnm;TLYK?6oSMvLIi(401^R|h=muU +zHeO_TB^BZS!0c6k30})Hn7$CGZigqr$=Z8agB#up-gEGNg7bEG;RJ?7quJmR_+fay +z)ykDJC6gGYl2M$%WKUrTFzp+}gB1NRX0=S#%SKEvgn-P5Bc}e`AqOQR8f9Z1 +zN(nP#9*PqD?@FUUCN&C$V~+T+xWZU6;h=QV0h99tWLBe84a|t)f7V6AEWgEd5uW!E +zo;M&9o!5xX8<=TZ&}d)O0y3P)bc;tuBD3RjM +zyN$7=BdaB&X^sArj~m>1pL9_hT0@N;+K>cW9BB&}ihhE9A8~$Zb`~Z6VOmKa=s$Fx`xi%~8fS(?{drrwr7b +zYgYJ?9W+fEX9aAO2?*dCT9d-bj7~IZoM=)%SF^_Pkizkh#<7sX(Po9iO%4t>DG+MD +zYgE|Z;9y^a#<%qfdzf@otFWua#+TI&zN}Ip(8%gpg@YXxDiaXEkN}f>w!K_qdl>@* +z6h0~CIvVBRldBFstuQCAc~6qjN)}gWi +z*X&?#SYdBOVNcY@o*1yN#mB)`g`;h0ob9ksIp$!3QOGV!94X^zS#jwfaj}?z8v0#m +z*5`+Qu7Yv0!f)AW%BLqH@S+6MmS9bc_p>2{*SCWTCpm$F-#_>n#`LC?pYgUBI3b|i +z31C+5ae`!dm|RkrT-M^JF~)vIE4x_Gz?2R2&iRNkF>H!oIQVE-@X#~|G|l;Fn)lH- +zX23a7f3Q9tW}AHJulB?r^XX-uSCDW4om +z0plycM2ahK8VM_fgi2!6v5?S^62{ +zzzZiY242L7F94&!C}gg0u`IK)a~TyKE9hHxG0%VYDVpj{GTDR;#K#m)$1EIZO3S*~ +z(Wr-GQ4fd18b_kOc&!dLBvCowOR=T4T-a$X@00J36CX}_`1=uJIDH|&Fi3zg$;q^h +zC5I99J_>r1__}rm^;5ts0ZVBND4=H4!^Kt`--m&-G2m$2mzA;eF&8`I9$sin;m^%U +z6pa7_3&7~ShyHmVSFbxbA4?%T4h+mX7??@o`m{#(gpbIei{?QO?c+WMCT$GP_-Gmj +zzG?Tctx@6WsE3zgz>6Ut+ggC9V;(lg2rsS}eFGYNr$b1_zpt2+EV|y6*JnCatvnxKBFIs>XIcW(gtPh)DfX7%)8S}9r +z&VH9Qh#}O7KPKeiA(4+qn|-WrHq#dZ2}>>?x&y#u15Gx#1lIw;@Fc_pAY=Msei>kX +z$sZE{Og7Y*iHrf9wd=L?vS9iWKu-WP+4t{seT%0ivvS6Jx4_OFrZfTE{OaNJqgZ!g +z6zeaIVZ#6;LEOHj1fIH_z{bl7Y|0s1)zeqTK|PZ@v3l~F%AU{=X0joMFvE$=W+svq +zOyQ~g2|PuRDV&m3GD6Jb1v69<1lj-qAOJ~3K~$^I62MFLNs##^hzX`L0x=Z}*mQLP +zoW=y=x)~vc6PYblOQLPni+G`C5nL;Kp>`QtYm(ShnZ#pd%lHie=E^+&Gk<9nRQ_)P +zCV-UyVghK%K7&b2058FrJ$cE7m*Cn!%v#j401Q{jGPa +zg{rmj0L7$>I!AP0y@Pw}Y}{Xy#=|vftglOBLwypP8&~jRBqiN2@3kAx%Yhp-bGx`W +zqLH6ak}6d)ZlESelq%zgPQuKXjXe4t5)LkoIygIQ6iwm9SQ;s5$hQd$;B-3~DP^#f3OHMVxm +zq_QAl`gVXZei$12IhnCCAVY7AG4-!POyG$TLq8#g3QYYp_M3#V54sgT>0!a8!l#6n +zE^BR#tj7_E`Mg)-i(ZW{uQP7h1r7eYZfMZwwEOxR#4xpt`u3(V{U0F6^l2RGcX4FE +zh!Yut%*i2>Xm@JF_+;phF%ubuOT!LwMwIwtXyh+t%M1~MUMdn?^7F@(vCo+T>Gm+_8_RzcH;bumJ +z7*kBA%~VDp#=}TD5bv{{n&0$lBMTVJnEh|E6m!Bs)j$emH`6E?aK#@(fC*IEuRxXc +zxhTD7hOqZ%h88pp#LM?(rn +zniUQ;J2=>^aG=R(Uz5V#28BHh3g6Ue?5u6OAux6h5!x +zbLM%jer0P{t-@D)-}P(yrcp`h-=1bArF!3n8MUi$FsiUWuCcGx!~Rwehg)5oYIAU| +zbq;moX>dX?%S0~6MVb+{YHdAi+2hKXBZ*#w7Q)R6)5O@b!oCj&nB%wKnGTR_D7pQb +z5E1}MaIQ{S2u$>$us6mFAZjf=ETw`j7ITl0$aj{BKj!^c+Z8Hv{Qc&w7v;Z{E8#OTocMfP^F(u0?hf}DZP-t24(d7W0HV~S1Q977H?tsRn +z0UwtKJX}q9h%Z23Wrz{UX-`tjhSI>*Q5z?&r?9Wv#ib#jguxrb5O68#*C-zHaB;}T +zfp!}g`b-$e3_q}2KBiVYObV!&zu#jrdG)1Lp57O(k&fC53C9zY`i%u2%{N!jbbUcu +z?Ux*W(D$*#lsH9r@x+U=Y;l_6%4(LtOSW-;b@Gy#x}+GJoJkU+f!^}5nDQ~50-E|( +zP}{wXn^PXK!i@pkp%oVueKt-;0{A`x9E&TQX?3wTrtosZ65eb|$toXH#Rir%ZY}@~H+`IMoJVnY +z8a<1^&1oA0b3S^eeY6Z}ga>W3jcMGR=1Lh*#$wA3g*TcU@v}S|1GYtc3F+Y!<(UYu +zHSA+cNK2>?pQnL-UD(1?Q5$c@U3?M+K8*nHv@re4!MY{~FE=ZEDSj8z>%!HtPs6^% +zC4Uw6@fG`F;=pSm59^z3JR0?|j*-ahcZt%dzXmXzzR21b`(Ff52r$Oz|5ylkoJEyQ +z=J5m4HM8b*A)o}lmjG67J-LEr*3fug07i`e24e06FzkoPp1{x_lMOL}H|9?8l6@~5 +zYVN7`ac><&_tgWpD|qfs=RLJRplpaCxCD<^A?B9==DzbIc<{m~9=?#sfXt|X%!bRO +zpq{!kdJE75AhQZExs$SL7Ob1yK9S+$XA39A4?~DyKMVnerIz%>h##h4#!O>4k;zCP +zM%K$_#V5mcv-QREc%o!Z^kiw~x^xy#md#>A`5d0QIxpHNATy6mSGi_prZP`oo5QAS +zi+H+n37Z9E7O}N*4$oCDU`xe3UaU=HTXh-_SJ?Pn{yhF8XHGzd@M2cT7V+ghN6N0{%XglO38U& +z=JA8oHXf?A@NjJ!57nmeKy3>5*IIb6E-lj-12zusuXS)=jU{@pUV(bJA&Cv4B%TW| +z}kxOGgBB&VuExsn)?6Rmhr{3 +zn}}tJS#G!SUWX;gWFL3i*m1+djvFqRBuDM&&Qgzw%@&C1(b(1F;HzE-oWktxQzGMy +z(FS5Tk?C_qEW|uG;7SSR(E$yLJu=cIGo-{X!_~smLk><8Xht2J8Flc(h=q$I7OpU= +zc*H?*g5ctUT@O_4q**7ap9bouy^LJcO|i%>Q+_#>>5Z9mP(S6MVOohy5vCS@OlVFa +zI&TzPaL}@#L>)^mx|Te2FMBXB;|k35r??`qXh{tEF{&YAj|0`B@k6V|*%lY4V#>fwj31Pgd}ulv(V&iml`##6 +zH1;=X>}yc?w%(D|vv2BLd|j($?To8uvVK;r@wEg7&|BkXyfwUbu(QSifnrrP3cL84 +z)z=vx4u9?|uCdh;I?ROR>n0apH!F!~-Ag}8#KWGD58melFx6#lcoiT7X0C9u9YC9B)hGV&^hqbHJ3(5A!}8rI55O +zX`^5CeXLNNywKDx-`bm4P&Q&CG@C}BqcN;q4BJ3rS&MN$vgG6J%@p>xr*Za%kCIU!f51V`AWwyYAs?5A +zffF}?{jJN$A6&+;3rxA3uDTevxhCpjiqn=A!U~YEe2iHx#w-UDj)&o-l1?73j4{Ty +zs&heB#-=zS(~LMyns{T2ojhE*@{m+Y`d$_Z3~6K54wvW?$_5y=z& +zB+jL+<&3w6-WT(}mQuzClT5itrj$Sn!DW`IXIvZefKeOB>*4fu8C4^|XeI)CJn5l* +z%)+JEvP@i##v%V-IUNViaz!iVVN+8Q+hYo~xYB`DI{@@90oP|N +z^s~Tn42X^TXdCv?HRhmi+QRi|AH@T}yUjLUY-Tu*kLR0QJlAX@h&RPFHb*^d;UuQX +z$Cj{*XX08?$sP@9Y>B$~TigeyDxZXX{JjNuCgR}nn2i_XKE7-Lj)y$#Z+5Uftnp#Y +z#}^TRUsUXk`1pvR6msxHvyJsJ59{K(;F`Y3U?rmDr +zJ&i5`1%UHE0n9If3!l3a!0_Ik0EX~lrZ*<>Y!zaDwti;T(SCLJ`BB_^ApwHS1LueE +z=*3YyevuQIQ9PM5h9`3pcq-@ismwSw<``v9X9zW$^CnmIZ2lBB7cf$JLMAYTmjGY_ +zhK@{;(E!WH}{ +z0VZp;>^Fr=_+8<$=(k17_)pOaepkGL|0+q|qW>;UArPVEccrPdg3IzG{`+bQcU7b_ +zXA-}!FdmoyV0ivf?yW%#%P%RGTdqM2frKDqt%{G0GEs +zJY1K?h0_Tar$;qT4B0p`U}JxuEgzV_=yha*@P3z#ce)rW +zoWh%JNxa^g!ppHFUT8_<`4$V$wOH83RkWx{LSu~b3lR@5MqIocrIbuvUX3^i^jcKm +zwP>bXGXplOP$NlW#?QiZHA2#hErc0sb)Afpp8#HXuEG&h)-ncu12qm_YjyB?o5CCI +z8gH}_PLvde3Xl*=T5SOn!bt!qL4>lL?BvPP+pRYK(&mc(+V0|S?K-2iz8Jy`|Cupf +znQ3G@yIg$Lt?^a2gD-p1_^d05PkPe$=(a#?<`)%y$ +z*Z8*Iz{`O?7c4=g$v^POun_YI@w5K7`rUd%k;{OYFtRTxHRVB +zN`lipEkHvfZ`Fj0`big|86UA353y+%tuwx;W!gi_tcUoFM$4>5e8v&6FD5$YgMJv% +zyh51!_lwS|2r^tN>sT_YWrP^<$1J4@SxQ1q~_tx2<_SD($k_^E9UEz=q^Oz2|yq*h2PC97G1uSCu)s0gMgEQ`!8j11z719Sc@KOYoD +z-odwWr`PeGOk^a&c+Kp;x(X)7e7@g6zJv)dP(X?^eKRqlxqW=umtGepiJ71Gk@Nu; +z8ul%CXq(~RPZzDTE?Vb(#20+|yBMZtVIF9h_Hm7WzlUs;a$RiN!wnmv)@2u!qb!c~ +zEwP9d)= +zB}sSuZz-9wBr4hXY%>0w%v4Ac(2}mK19_ +zDd{0Lz%NM@jz%?(w4`w|nnq3&G4c1$10}-_K8UVhQ0{bE^w#R|z`TDTNx|oYcW3K$#PsdqKY2f8auBkCXIkE;Igcc^0vCvYKNhu?o +z+)13Q1W9JW>Y16g1kkcJc?rPfXJ?olGyW|lmz=;D8FN34{8Rubt7j8%Pe#GLe+Dr3 +zHn3C1$G!C)?yL8IHi5|on>#_wJ+(flJ3SZNPxF7EXP9WlG_z|=Gh4=%>Li}2PGVz?g@?+P@%#J*{5EeM|CzTaYh}MKWHK3j +zFa(+v{H|~Xzb#xgDq6;Gik1an0*E2B1Td2gF#lba26b1tg}bh%@ZaTxmNb6PX-h>C +zf4KT{fT4;17FDDKU<}0Y+Dv1(P8KKtnE+r`frM~Un_2^u46Fno^H7}w>fw5YM{6}6 +ztTrJ#OQ}HV0pHDSUI?#drOl +zd=vjeLgB)M!lem?+zEyJ3Hlvu@y_tfW3lFV8dt_FTpqJS8|`v(HBEw +zzf5B~9K73Z;~(udKI*XXS(nD=-R$k41rq+EP+)5V^C58rYM)9>OyzXn&z_75l=7;y02po2q$rb9?3F$0d6{s}Sc +z7NVG9Mvyr(qVdCs68$)$#5;9<)W*e8OV$r_M=ca2(kLC{Dw&O|6HLW(#LQnarWUYJCm)Ma9wyShd_WpY@inH@j=xvqND|ljS5PtFpnT8; +zOY};Ifbu~f6$3gWg=+%}RRao@{WdE598~rxRNi!drfWAeDz2+lUG3FU7+2n{QPxGd +zDD9*)N;^E1bb2W2a76_j8u=ZJboNAf?JlS*t!v8Rb(<&3Y4<=~Zg+9Hb4`~zU0m#P +zalTXIT)W1PZ3;iME1YRFI^C*qy2Zu!aTh1!9!|tunbL5*^W&KP`sUC~*L>IH;JappgJCWDE~N2Yvx@^%6DK?#4y?*NcQE4OP|U~SxQD|nE{?Q% +zIM(KicrEu@d>qM=yq2$zdvgD18*sP{INIjpc)P~;?HVWB6;5_)F^7NO3!LppqO3oO +zo}`B<7#{?uDyt=rY^WE*zFEEE{a|`RLp_TsjSRquc|VglmhE%76PN^RVm$Bk{O$La +zwFipeVPcTY8GwtF7L?_S24UZx!ax%>iT#7u39MuCfiz~Np8$J!TBF{Zq +z#Z181d{2N0;N_p40mu+os3j(UF)G<|Wp%J~+DA=)Qc~L%IgxW*0k_sEANlm~G^Yes +zj>x*0gYQEroCw>pLiSw@*xNvONlRok|63v?Ey#LU5E_tKT}zu4Hv)|Ka4dys+mltZ +zC8m#AK>1AvXCkwx9af+(kS2cmp6W&&oQ}FU)$HR$l-tA+}C)k?q>{h<1eUzYiVmhbYH{I*T`;%nBZ{$DF5sXCN~Ch{`nN=S9hHo +z0wLxeLd>~g+;?sm51bppLq8?(2>mgaMzQ|#7}j4(;E78KY`ADv%$~fQz=oVL(Nj6& +z5DCmoVB?huJauJU#OtRCF?ocTDLh>;ji>2}DV)Zp!f9;eDp|o4)-ztYU|QmpA1frl +zWFV%%K+L0s)1cNBaVo=U3@0<3#>|PZt~}9*+x!f=#k+%8I^&V +z%@s>{rh-$MWo)im!Djkms*`xEdK#=(9D1t{#LujYn@9oKDq(qrNM&J^BlPvdP) +zG+NX6Q%f3e(qGd;Z%+!Z@;XYtjU~R6*P{+zkIc&lCi%&;#oBYu~_ +z_oBeKYRbS%05HbbA3)4|?HccOD7@RjsAU`f=wOh7CFx{e^t#yB>)~*>iv!&nd%7I# +z?6R?g6Pq4|kFLA;h#d*N3SUzKJubfLbFsVM#n=5V_71rCwqIl4pvJxd12P8(=#No2 +z(r;aV}xw!nnevF@?)x3RlJya+y{( +zPWZKuKk1-o!baJI!nFwpH4{p9=$j^8gl9CuGYZjJh4`FCE8~?HRVIzhL-&%0o+VCP +zJejuitpEmKJTdbVT1JvS_+g3XC=-ZMzO0roWoW`8r1| +zij;QbgVCtvqjO%Pc8CyT;p(u5vSFZ%)0iPGx;m&)F{n^Es8BsXKaGv*ehXE78dd!+ +zs`@=tXH?ZksL`t;&|JIWqN3O6YLAQZ?lqNldnoJjP}=39q|2QTt)QMlZraj9G5LYKn%E{&f$70z|K__0IdM^0(l +zU7T(AaHh@0DXyNixHuV8I7u%})WwO2&d9@wh%4TjV_}6OA;&1};3(sVW7;U{;wV2X +zMJSq-T^tVka`K)$7jtp6#l!J7S9GGo#mP<&-*5QV?Gnc +zvcbgwj2QMa{Vn`(9KZ_`t(MiAsXiM@0)WZB_e +z`U)_&>|;J<;*{Cvl9V`R^Y@^4!9nY+BPoEg9!8(bl84Z;i_iiM`an&>!?k`JHA6O< +zCp0=%fIjWxx`O!BDuyhS4{2N*^HDPkR8G?mXQ63MNstCXf~#H((-_x4AB!myHV$=K +zI6J_Ib`OQa8pXptN=Jag1n~WU!q=V4IMI`qg3KwVYdIdK(~iU=^YL_AV=ColzI5Q< +zXDv$bHI^1{&7_8$?UObd`j#aXYu<*K^wSnsyo~=R02nig`Jds1P(#QeAQ-T4Wd)60 +zFZ^eJeGaJXOCvg_Bt(E78+NWVO?tS{X5mnyjYA1CxB(%t0$4j3+$Ycbv3T6Wgv#rA*P>6A5EqZl}UH(+!^z6GQ5Q1-ers? +zJ&ZG|IR$7N&^`bFAOJ~3K~%&O9!|%Xa4f>-A;$ghV?K_x@I$|cm+7GbkDhHn+1OCb7gw+Y!jy}!1ECY +z&xO)>mfbEu@p)9^{fNe^5mRKjF5+Qb +zNaNM8E1SYbod!v^|XxGKiUOAD}x{u*|? +zaHTAIE4*+L^LTho>-jh%_QBjqcLJ85-!o;H0mz8ACMdro#01k9CY}k@5NueKX@G^$ +z@=&9XhZ`Z{wRFie`FJoR0uNtzClP#Bbz5AsOm-bJgtjd%>^w +ztKXg-!hiiZj6a+k#UFnh#XUcb;ohIdaL>5}9{6e0_+u`O;n7RucVk6%oP;s1%t +z31rKxn~h<^mGN8jRPF>e5n^&Du_=E_v@vfI)aqj?x?Jt%Czte6lpFS-R{$`)>kUZzh*Aci1wo9K@TJThD{3*wkJS1;qq$|N2xU%~GS +z7xA0?1^j2hB7R%2gx_Ysg#g2Avre|S3NhI*lMOP2n7c}{wSv1!R`C1MB>qsA!rc`q +z+)a=vH@f?(g?lRO)oBZXg?^X&u34+1f&bo$WX8yE;ejeku6aMu157BZUV|8VVIHhW +zt%{EyuCrG4NWBe;t7DJUTUaNcLRc|CBWJC`ql6lfBQV6kfJbXBJW`X!=I6IuinPD3zhtfFGZ%K;Ufqs@XI@sOI@E~dk3-j89PIP3=Z1w{ +zy-5jNV9!sWFK^h={UgTy>khb1CTV2@8uZ0{*KZ8|gqXk^b98{$Tr0cHBa`t#(ezJ$ +z%-InK?36h-s_|38#rcGbi({VX(zuJ935_e`8o3iL3MNeKvh>GHGEhRHY}!HDj6(U0 +zgNj*&YcmR!vkq$J6zb+2)XzC+nsE@44_*#pa|$hUHd^N$v@ZmpW4dE{7ZoUW$gm7k +zI%H_vUok!z@ycXATuEA)82l9yX%oFXk+Lx^31%jmc`ya^TR`Jz3YGm!s2a9WKBQ2_ +zZ=OdoKr`&(+OS6DutwF8M)jb(s+s{8fvWp8YWg*5`!%wG=GqNTW}M7)hLf6%dOcKR +zWB^B_tj9B+8cuC8*W$71(kRJzZ0NHQuT8f`VYeeH=y5=?v{Q6LA@7D3sJYy$aj8e) +zQa2|wTA=1UCp9vy@$plKhacPMrBOKBVss|%;7nYL=&w23!fS=oaR=YWEO0fAYig%j +zIo)w_s@28!Ejl9)CuPcG?(w-(?JiDtuzlUd*)9)fyET67@$qA?j~}{ybFYi%ns}e$ +z&ji<}dlXLhdN^|v_@NIt*K4D!KPAPJi!f$p_$7I>S0()6(;PMRcZhr}Xx@}6q^7$fgHs|AV*2k3`aD)^3 +z-ZJ(Kl+ZE>&^N*~v>DUHv{^yH_T}qL8cgwWW%41tFNTLn%axU}yv?;S4-+A;d7vjb52~6X>6^ +z&@i%uz8N1AWhRCNNKFBsbz9gUsbF`fi}yQe)DN&PVq#(Gi_x&(c#G2*p3*mGwNYS#KXhU01rn!Y>T?sN@!u{3)jXX +z7Pdvpcs}9d%_#8Sap0#BNBl7amj{^=7Ezwp-*-X!nO^O5@KV&qs|goeA0>p*u)i&0 +zV`I$4#$qrjw9?9WbM>6;}{V_+gxbM>()_j)7hT{|1 +za6FH?69s{n4JWeLcrv#_b)V-!)t@R3@ +zEW^v1vs0k%1TnQB!$}O+$@IyzGMfFh(Vr(FX4BO<(dKLOpft!Rh?x_g%+{M_Y`$5+ +znyY#mGmC#cJ&S)kO^{LWawmY%&{BKqDNHTE5L~nfF!x+3;agWK0yBgd0u1%7t7Qc@ +z*J#>bh8G1gl@$P^p@pZ0nU(Ousf#l7*PgWi!)pPUmI~IkRb +zXrjJB0m}L&6YCktT&u=P_}Ij{1{)h1Y;0_FP}gK*Q?rSO+YCI?X<}QXBHb`QiqTWU +z8*3M@^tt%Mpd(PjckSt``6O-P)2xkSOg3X&GgHnAPE{;MWKp6jOH{8pk~VQDZQMsUBe2P-X3C%Fr$Snyxec&g+3F{_A1}V&$~@LlQQsh%D|6POa(Kva5VJD&?iHXIgxd7GUo}z5M)jlJ<*vd7iXtE +z>5#cJ>Ep_jFY(LQr+n#=X_#Wmw+9yHHO=~Hp7YTbs(sE?5zO;05{o{POD=krJkjk% +zPmKP3ORgCGhsyy*N-VZi9+@%I#klE8BR5;QnN+5vQp=Vfd&pZ5j|^j22}T`x1J_0k +z+{n1NnG0}n%*K^;AUzn@1Y|tiOnYb;UsmI|2ho^|rcnZnBR3Shsn8>p|@}$V~^niy`{mVc@ +zsL>+W9P4p#tjERCE*nR?92{Y4mx#|Pe+|zgDHn&6jsOp#hwyW>Cs5O!ZccYxnecGR +zLmlq+WcqXHwui&L9**?+INI;w=zxP`gFcQ82KaP9J$GavfD)%F9uD>KXWhfmK|XeI +zXn^K$;Mj0NqVOv8#kweLk6>+f{_Ie5_@uZ5Np +z<8FCF9VUv^PFZ+uy1oJzn)9phqQHf~#hde4!^cd;!GhzWq6;{r18sY#`7SK24pm}5w +z@uDr=IrOazO*=T=W#e7Omv`8*qP0H~;6T*FzKDt4F&pp1f!}um@3fV1D-+1tm`Tv0 +z2|p~OGwbvoD= +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 +z{i}Fn9AQAJ;~du8w#Rje58` +z=1EAw3I6v&++>nQ}gC5QdxH!|V<>7RnU)8BTAJoZSPIEZb +z@o{$pIfHL;+3=csM!e;pC8y&xe6iqrmAg;MBN}Q)wTk(*aJ6`SSed +zW9$|Qq+>+&j089_;;WAj+tLa@YN+YMdQKZiykOp_&uooR4ldgj)&&OcJ!;w6LL_B=R +z&ZJ_1rg;xd(=J-40K&_@AqOA!n7A~~1VBi^$hz* +zP5~1O4hCidbc|YP9nJmzx*0lLmvwtnb(D+}gmBxRjnh`|49AwmM6tECX +zz6@OS$No})A-oV`sIPo=PZnR@lg8ig8OJ~D9m7BEAIHCZoW{Q&%HZpVGWf=!G`@8- +zr`E}i<#7Ko<%?PKSr%)L=R~}&K0cAf+7lV9JDJ7$&vT-6C-PW-vQUK>!pz1~#buo? +zV&fTAZdrGBN><49$>%A;%-StDs=-f2cgq|42F0VO1Q=P`p6H|9_ +zUbTuiyIQ78FIO1*Wdfu8FzaLzW5^mA +zVP#XZ1;Wb47IpIR<|d_wn{8n#LZQLum&` +z(iV=6n>dy>aHK#Jxrt+011H#9lQra;QO``u;^c-R6cLUDbjB>O?}XYrYGW_W>YVC~ +znD}5=d2#sbzB6LU_we?x4eG5SOB(Or7<6Q1?)L&gE`B%YfgtodnfO%jN*`t7*DU{} +z`c&-k%PgquH}GO8UNaV%=L-V{emQ91*L?euhL +z@CsM!22A{B(8kL{Hhw+G37Coh9yGCQ$igQhHcpMXxH`@oZLT^wxISj%>ZpY)BQ`FL +zSU4BH=ESInV`DCkj4|$%e`YrJXPl}IragQ-&IoQ(JWTA1`6O@SP{F}bf(!p=UU0?# +zLJti6FJ}ra&K7K3C^)!Ow8j5&b<)Na@xM5@O8?8OiyN~pZq7OaF1!Jf$;+&V_Bmg= +zDL8$JF0iA*M{GVoVj)0sF+fUg)_jRuR*}mdZZCQ0Em5w705D-}aLL1P$rqqu876yV +z7{AP}m~cHJa5L-U +zR?bIbo^sKgqX;!F+OoE&J>#M+qoy^@X`n6bRnY{-s +z1PFdj4I=+P=koXX#qvqQPu1TdzkVR!BmEZa{#dF2CEk>C>f$??_G!@e&@*i#Iql0N +zB|Zxz<{;ogc;VyD8K7|zxRUc_-LWYjppP9Yj*qnM<2EOoc^fxIE3z`yTx7Sa_C){y +zAOJ~3K~xWnic;=iL1E5Cl*N_v>~v9P_W6p3IUg8s0$iJ6EPn~_43=?in*JD|x#Xdt +zq39c$h?o+ +z`3lmr%8x?uBcyOmY^6zGO;A77io{3@&!HoA@|xpnZboFadrVxA5VBN)3D|LbHE>b#V_H;}+H@ENqAv_(8hBE*?z=cp?cro&>gY0+S5H`@+c!eK!;h{QR}4+H3k^Rwx$8s+n3h3)jkO +zz=jZ`0Y>{{2q_yo7~8C*{W0{&tX>(@am=fq|8k$q9ahWQm%)b9m|D2G^Yt>+5M1u0 +zF9V*{ufN-CHLTp}{L0^cl)>MAG%f)1kNd{)kNd~)PY1^EFCUNN-#$rK4gU9jniq(< +zkLzS1#5{B?BjB6Q%ggPhL>;OWYJ|!yfUXU +zH2|Xx{l(QZwhS>F>5Ji1rAdikBM{SU3E&W3G}u%jrp3X-tq$s2 +zZPZcijub?(Bua{++Dxo(U)H)d1MAu?tZOI0SRlYK!@a)UKwVn}b!}yA;tE=88JpWG +z*xFXc&h|2%>?q?uB4zw2R>9BW27ZxL=KYs@RFUIr0}kF~yF9y1MjY(oI@5@UPexoZ +zgdQFDWOBomv!fX`u{kEw8m^_;B0gU$!jP<}ja&F++``9WCO+0T?c+A~rEQ6oW~{L8 +zN}(5o$!s5tIrw1I6}>;^;$2y1v+>TDjd#a9G04*-&-J-?#sd6t#1Xwc>fo(02XZpB +zphhgA)OusYg_e|5a)Kmfm1-?d7gy@nygBAT>y1$x6n~9(M=g9XY+&zj1&2pXoES6Y +zX7xq}Xv_gETod7$_2uTeDeIvjpXF_w +zm~e5T=;CD2#VPT*_&77Utg}-A&QCE;)yJi2Pjq!A^t(*EXqa}RfySN^3Y#$ +zF<5diRCY03@xtkhA3}^LoiQr`hB3`7)KilfMm00}jLqWXyqTGD(UP~&m@&cCoCf|m +zW&=@EE|6&q;e|JlEqM>EIS=hQ2c0<|?YzzgXw3xzGwm54U(mRR_E2r(0jSl}n(E_m +zA5C0i(;gi9a>m>h{v7V#->i`WF5pHs!1atTKO;PAMVPrX#@2PlOS3!2#pMxSbV(*S +zzD)Z#@e_>&xH!J73u8Xcj(Ipc8i>w~u?r-S0>pFa02eYoE@lH<$^#ekz}Y--ItQH0 +zu{R{Z*|dYJX#=roOS&!Q0nCSS$IEcA5=6B5ev!q3&T?v)1{WrYRaLWIR{Qm8um4{G +zruJ*pPFi@)iHsH@h8_-?1XNrs@*R51txl2%WQ-UdnFqQj7#Zv%H5&+E#OFQnh4H_E +zj#(GYldeo#ZjRb$PFvE$G{ki=7wBFBBJ?n139b%q<$*RGtvur*TC@GX +zAUD`^Tx0Vg<+A&R%2Jg4Y1%`q0>lgp?G+ozvhvU{osz*KM+Zx?rbd5G$#t=4+0v!M +z-^Z*Kh^J#Fgq76*Gh;(QM!)mm~eSS(3L2`3`-&(J?Y&x-&IA*Mzwnyfyy{VJ>w +zS_m>cYyC+qDJ|Op$^-^REIXb+RCl3*&dd_J=3Vp|Kx;9;>3$RYJD0Gp)0C;pegPLp +zQuQR-I}u=4dkLQ=m(Vk*rbL_!%@L#|D1d(!1QpdUqajB8O{R|-lkmiXN={&axg{5d +zX@gU$R>s>iE;;95*Z{g_0s7fK?6f4J`Eb<6{!SD7q9uG11742;Pj{5@R@Wkuvnn)! +zeJw;-14<+N2O-e2~g;@%G?=YS022Twz +zl`vlUivUAlsRbB){Xk7xnOZZeV0~i+8ycB1wtOw-{&2lauab%PMLaQTTC-VCXqvfN +zW}}{JwNc;Zpsv+WYA2YOsP7=mnAk{ln5g694jUUgtW{DU=kx129IU4quHD6kHU}G9 +zEo^FIV1R`!Z6>z1S=ioTU`MBc$0Dj5=BX$X$1MCf$?g>wFEU7g>s|dWemUgfH=K_2 +z+jytXz^=iHm_>IFoA_wNl1a<{Q47>Th7F7}aKILDQBxYOq**vLZpz7PEy9hKn(C<6 +z@wF5~3l64D97r2DAlEhyj9WO!sZWM6)D8}eD>0IIUyb;f{+^G=xQgXrf5yW;kt-3# +zj4{5O_GMh`&DhwNaj-ADS}ykFTzr)Gu!qVy*qe92iOJD%8^_Z&&SY6w>f%O$69OBp +z1qbZ~3vC4p?F9!N1qYo47wvfmtrISqiY^)^UEG**#IJI5(!!XpHA@DdM@OWsR_0Tfwp>@_p`z%fVF4%7&H*{k5S3Vi8nstle-$n0|i#|?gN*)GF +zF2|;B8+{eC@hxZa5-s1DgGTL%3vL&vr5sDn?qgk-n^Rf&r`f=6c68?G2R2b9% +z%vOK}!$HaMkX-<-^%^)Dna9nni`yj@2h)G!Vt35Pt~ey3d4I&h;h2kkNgFT5T>Mw7 +ziL0X?Mp;l<0(vHaWG+BY#zc4CMJgZ2q$SCeu|j}U&O<8gp*sWg(!8GsP7MJsCro@V +zQNg20mPNZV{n(iT9!WvK<%xueCz2L+rhGgSHs9}vdU!GEVRtX^ryk%(?XGxM>bgB_ +zrgtT(yfKeQE&MhfU|*8I2jK0Pi?=&%?25PoFE1p0Jf5_%qszheUSL}f1Yig+I|wcb +z4_p2Wz(|}jCoeH2HEr>g!JpkRF)d&t{Wvw!W`3Rg6^Z&YNAYC);o6-70 +z*9?6yp>)5@>T^veCppW~kaDNz^vCXWKG@EP=1?8LL#w3YoAoIX&S9jpe(ukm3=+`r +z@=%zh#*@!|<*z>+!{2;3hQIx241e>{D89O<24eP)YX14Lt{0h}wo`+Wbl?70nuF?y$ +zsIK|=GR1W>Y7X_+=CJAd0_v|Xq5kS3?z^~zZ*hg}?3~j11$>=Tn3}aRLd*XOV6K$$ +zEvg1y7_&^@%l(8Fu8v(T$@yLSTx#^d4FmTPTx8lpV5xzYRj^W>wuH~uK33O^Tvk3A +z`exQPD6MO#fLbpT8D;X<@KWDoU}IAm8=A_>52GhC+AkBXpAls0T1_$W)5xzTDizeV +z8!}<3C%kadB2r+psnbS%r=x(T)5eAlE0m3m5m!{#;b3FCjrw*Qn`%_wZV4O_Y&O%Z +z*H)I`fGzD6Z0#`cL}wX~#>&_lFJWt{jK@AnTheJgNhYL227Ssgg^SlMd +zUbBSqTEWGQ2^)!3Yrpe1La +zDd(XfAE2=SffqG}@zGZB(Vq9wUU1Qw_Yldu=qv=w$_MDo2Z->@`8D#;N#M!4cM&H# +zoZ=|RY0G+Otx*fF^M0rRt@!}0g#ayu0IiJ54b@z5(L}f{_|=ow{Jn5Bj_=;{CQ6;W +zW<$FdPHh-B?cr*c@ZsZn!N=7+K}P9v*2CrS`icNdfQysB#cANeq>pRU0j?Gd+$x&r +zD>*0zz+9k`#AwhreBRhoD<>`*R`gl>@hY4UQ0}IhRWw3MwJdVgl;rM^@|vJvDAVm0TwKmjETV>XeGF$eKasQ +zqM!`?ecGU33D7<3BUd +znGJAYw2Y6&4P2QI&}#-5wSDxNmaJ5@&H+cpUA)`BC=vSIWni8YE{E_!pNEA7n$>N! +zK1M*{O*_r?>^vdJ%n@RE1J7%VQwUG>z?3~qmHC=*ozGz`vJ1m@1zs%6UjZ=HsY?hi +z6~d0a3@Un(ra?wOmhY8Q5!XeQZ*~+NM2j9`OF-*ffYU=R4km3JWL$XM#({*7y-Aj+ +z0w47NyHhUSk1pX*S6TjjWP#|S!__-w!e3wt8vhKKDyDzW{Jn<1-&y{9Vz`(wxLRfl +zyv%X>V!Ftg0WJ?ZI2to>bIeD72}sTbxHxR%!_Klq3iHPQ!>ErB69L{!0l$m6_*Lf; +zPLFyh&H>YNE(Rt&B=SIlurg^QmG_X~iDpS->^$9>fotl +zfTy}#Je6|rcnToEJeCB$7xnSIn1?5m^uqv~y8>)U*?2Z-;ouN(U;ub7>R@ZcMO_N0 +zPX*Y*QcFG;_who^$NOEthe_bwn2UE~9zI}S6eFLz0d~CY?DDXq+r##r0NcBO9pbkM +z#AmZP>0vW{I5q2IYK=^-kLfisPG0Io%itmjWnoW@f|!-?QVTM2y&7ItrIxLi$B@!Y +z7H5idw@id^69Ud%O#a#*Qwu8US{whDp+--0G`OsOte@BC7r!P@3mmJj?*t_pOlm*I +z>(!sDU-y;2`fwB!Aw~dZ?>N4?cN~AWFO7fLKdz=R`_o|DGQBa3TmJgttmqp@2{U2b +z^06H56OT+D-~Fr*f()lJd8|265Uo8qQ9XH0t^2%)b*Cn==JR4zYfnu=Yu)K7tUoiY +z;DrElrYIdT>(5MKof!Lo}ZVsG69zhOZX`Zl&E`%6n>&>+hTa%zYo~!nBBn$(^YP{mM@0V& +z#Wgg2@_KuF1wV{9_-Vw&f3}pcwRsNf+UN0Lq>POb2b(#~i7@`z#G?@tPed(zKWd7k +z6f?>6FiXf+tBi}%KD>>jr8AvJ2_-L#EeSr@y~YAtPV#*vANOjXiqg{{_q +z!u}ObP!41)IX}+vq|B-gWi1@0G6WtMhjTs-XFZ8J=5y?9p=afjyn|2jymoO&J|5t3 +zCcx2jfa4h#XL1CN01XA8Ee}Lw7urQK?I1C3Ba*cd%Q}eXTu~zLB9V6xD=0n^un|je6&pjp**zn&xjyX;Heau@Szng_@E*JI)oji&YX+Y(jVhl`>~EZCp=#i +ze?9*CS_D#xrf<;%zh4(^6P`4+H%|~$2{jIy1ads__%!5QP>qEE4S63o^B!(Y=)boB +zH;VzTPx!c2@NlibGr&!XU^C(2(yWh*GY+oISZJLyF~)c3p^~`Ri$b6vkT6kfK_)F~ +z{fnI_8dz#izP5IC>u%RH>aUiDi#wfnhZps|-f2aw_Bs7E`D^k9nyW*+k>`4mcy-w2 +z;``vuFS}fBPXoy*$UE(^*#Pkc579XX(b)hI#v2#7QlubN%=U|%h5#ds`z-;{X`rPT +zpk>NO%cPCSl!xSWAVAX0)yJ%bXwJj%EaYdGoidAd1tq5H0X`c+wT7QfHj_YFH +zP}C@If!|Uc$nj4b@2z!NbakH-S} +z_?B*9UAKqFVr9IRawW{;KtJ$8w}YLXC2XTnpB|YcusP*pd(^~FlRownUJ?P`N;r5s +z?qGK!z=vJHo87=qXw*-+c%my%&=e13?QAQP#c0rvIjE02*c5lG-WTnG(crTBtgetn +ze6>y%u96ANL~Ej#8Na+rH2#aR|1J|6J&E~C&o9I>{~5s1ptJg9C_q)=${7Jh!;6L) +zed_1+sh_Vsb+~{I7+}ait=6^ycT*K$2r+-XdsNoRzPdLp5JQlml)0Y}lg7V(lEJ?p +zRwBqq0p`&h?&U;AASRFdk125)qu0wc#PHPcq5)=Y2rmy2a6T^zyy%kvL&@|d1Q>c{ +z)}NmIUjxj8=chrf1{n=6wdZP((NLoSrj8JEX#qSpURe~?U0qTsW()xc$Jfry;orGl7EWWn@g)#Lfcef{0OsB+WtBd5WvL1<8e~?V3TR6B +z?)5V6yHTz}%zd{?xW8ffF(IWEVyf$74GLrkFSP(un_kAWG7T{sZ<(mORl&mzCbl-2 +zc%<3FmPSS^FZ*MbCp4x608|spnhh|eOyGr6n=po1gN#0_KqFHd6ZLHtHnkhrEHF|* +zeY+C9FpOlTwi0Bt+AVC=>aei2!*T>QW;OF*&{iz2qWa@)XFFy>M-e@S;J6Cu3dJL}rTdwi0pcsr47rmlc@_ +z3z+bLp%P(Y5zSds;GiY%C}aPGFE^KjIt>my`Hr}T7kz4oiA}H_TLH}-&+vwXe=oH# +zBS53!sNf=^HQ|AfNkxl%m);lH?3{E#aSGQ?@T?KRrlsgX!HkEdLZ})jZJZ#qc(^s` +zhe8!%6v+6v&bZx4;MR12TN4Iar^^^*Ty5xYVe`G*{Cl3j2%$t7^HpJ^cv-?^F#28i +zajh=`%N@+~cYqgyg@z1$S{`8W##z1}brXFjkdYf}>2hI=^Rf(w-7W$6bvV`GJO1Ls +za8#-of1fO&b +z*^|Q8$Rr^YXd}c-dFYt65uI_tpP@EFY0*R9Jfx3=&Gq8LuwC)Fu-%?-I?%(ie{e}W +zXycBFoao9g$lNV9s$hhYTbC6V$+OF;}lMt&WFi{)aT +zD^;O1z|=+@GX;#3kuqbkX~++!EgDRC5>5y(7NMyIT2^1{$xOxcK$&(RpTp1PYZn|( +zCa~Sp0Xn9D#%bWhppAWT2m2E~4tBXX(B@dP$T?jJBrbY}lP)s=W21Fo!L;p3gfwHM=RBZ)KES!Y3Jyk>&`jSG +z!y0CRYncF_BrSXpwIw`YZ`{D{l!JG=fZw*4u{&8pOBNVj0(z!t!uKHmCQtC%menz? +zh;e;PfsBXlf`{HIAUO>%IOFw%>OXrTY2(oz;89Ln5?mMau`}ta#IJ;pZ3zcl<$5d* +zY)ClR5}(5deI70j1BZKopF}N5BHO`;<(MlFL+{HY5f{%fZL9}UCB%pT03ZNKL_t(I +zm;`o3ExePk@j-VWD`&5F13yc+cs%KdVV@DnI}!o5#XW3|`O@*SDXz}VoaV%oabLrW +zn#Qc0!0^6cHOy>YZRn2%D||8XFSVro{#{aAlaEx_=4T?eYEX#|ohy0847 +z-6PNeBy&zu +z%j&K#VePdN?&l=s;v&9reo>kCYbGzXAfu-+_g*Tk0GR3&=1K_~U?Q2?VLrUU{Er9tJ-orIgaPhl*qYotsNVCo4lw@hqnFtEL`f^7mY?1NG9%PRmz +zM>01OUX +zs^Dj#SjPEGmnm_~PxI`t@l&c>#WAx(hB3^~vhEV~j+#a5LwjIZvOAnzjh6@PCwCM`85pM5v;JF8)t* +z(n8Oq38vrlOi`xj_Oy-O83*iGp!#M#^v`%0q^3O#&G;A;xfq-c#i`1ykD;pg*u~JS +zi{UvBBlDCSo<2qwJki*q2d<2XmTZhI*)o9>^+BP%r~YB$CxK +z6S7*Sp{8Il9f&}qCNk5!i7`A(SGX3!E(>7D0AhUCJ7=SXH~o2ErWwse8iRebPf#8@ +z1Sk~5aP5bR6$8YJkekow#N7cVR`3zaFYAkt;~`e$-JZe3U#V6uVFYXrn&ChVWA6*Pv?F!PNCi +zfLT3t(T`WJjcIuKe+3xZhXNN#%kr^cyI7!!-0>v-m%lGgEVwF`E!*<5&l|}2On~^D +zC&3hq5AU4e6cgx}0NVNUFdd+aiCl{w`j6qqvK&-g8}mVcL7O-30gm)J*fZ$iY|+Dj8(_ls!Qx1URsvDY@MTqwF~%iE2y<#_`7(`J4KOU3 +zEE)8+02aT70E{CAp!`|{Bh!Fs<3oCIxH{J5xf%Mp0mk>pC6hb<`|4=0#-7NB0F0OpaHi>=ks*4Ap=&iXEz^s0bvC;auI|5A&xYWXohL*qNBuM%Q_=yNB^tAB>0yFdAZ%u|JK!*+-4ztNYTTzdw-1Kj@UQ +zL*w|j!)g56ku<(`B%_S}N3s&TeD9}O-1}Khbl+!rP~SaXzyrr8Lgn!QjsGVKq6beD +zP%8~I8frAm=!s12$rZEpXQ>%EB~tmUGWiR@oSni0=ce%B*%?tS$Y_9BK9^U`G{n#= +zqx~`hG?(YG?(#ecFPy>7{y&fyyu +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 +z>70l7kSSd*T;o;BZFJB*cR)PRT75O8Y{U2 +zQ7-@pmPA@u9$`GPi)9JmDf(Dqkbft4q%AO>|7aF?snNlbItPoQE|$hEEKOK=Dq+j# +z@$+A6w6HDi;b4-GXyafK*q;VI%K(2#*w_@e#IR4`;Vh0)bzy3mKLi+F^PU=(RuW(s +z$-Jb|!{T5Rgvx@Vpbi@V>091yRi5IA&QdivW*DAP}RJ7zH#u`7u+U6Na5x +z9vkJkdAPv|C8JHRsHwCx|M?$QaUKbka?UQ~R7q-&($f=)hMt0y0804y(H|KFD|4L! +zFoc(%?;yPR^NXFGxO-P8ez~g~ckllG_$y^SxO-nOe!0I#%>CkxImqHmu9HoBV+b<$ +z9PP)w#|FL!GK3g43S!i$U}j2*IWvTLrw3&SG74V803#3+0vINfg#kt>FyT|di~^bY +z7jjr|(Kq`mfZ@p$vxhi=*O`%A(Ykxz5>sm$@E4aIFN6QeSuySd=t2S8e-J-Y>-hZ%#zz0ID{Ah8mcn44J@m+v8=|y(pvrx)5elI3rng?c&c&? +zn;Xh_J8fZqKX7=^!x!x)UXJ-|X^U=aSRws08rIj_5(e;0gMnunH9Xx=7SGGtMhj~q +zHrCd&J=nzBh$Zl{Hs(r%r2p8$dZx29&YX=A6X9Wk%Ep9+RcRBek{UL|O884u$H#FS +z+Y&Bzrd)iPa`0)w!Y6Tmw!~~vYu-!Q_*crp+bIk0CJeljH1KxHz&}$aUQZi%Ev@6v +zX&o=8HN23~@M22COMw^X)wGV+(taSp>lqVoWNiE`W#TU>{~m)1UTre)=VlXsZZ+^~ +zyNSQFoA_J1h1c6{ywPssA55TWbMO{RJKJ2D_u3rs=!j1z>)?Z|E!{J!<7R8tz$YCV +zKF?~{o@I9KIU&%##&E-v<&;ESRggEZwk64Oji1-%yBy=TIi?|*To)|j}; +z)Hq^Er$uDcMuhJ?^F?={6v(warcZ{?+hXjex!)gp0IXn4X&G-EvmlM*6DFb)EbX%p +zXKLA`h18^2>~76Qui+P9_USJAbO-$c +zGkhUy%8OZP)MiYq=_@jWHjv5bxYeim-v_Q>4MS9nTf`? +z`Xm&1G>!z112rZLG=vv_d{t})#1LpgAVYZJzP$pN$b<)u-@D_YZqi2Gq$Ou9yGJH` +zkg3jj@CUd#0aT1b662~z8DH&T*!97M@7fbY@+_mI|HJlE#gw`tXW)4uxZDw5<^Ycw +zAaMtu%bh+(sVw1B0ZaJg^Msd@=ml* +zwM6yorebJ8yhQ{JusG8N5@p~>kB-lpi#XD0fIb^`uJ};tU;sdq2b}3K1#oUp0NwO> +z*#6p8f#r&pg9)z1u~3vz#R0G=K=IedLJ(t2LySrRE18TM_LIU07_uf7GUii>QT`U1 +z^f_U8;kEi4fgG-w>5%m>|Kpfi=Ks1}U-MNM7o)lduCHEfE8}3w!ND|eIOX9`!j{<| +z<@%V1{Y}6gssnX8b~Y4I(QQirNXg{Sxr|X=_t(FQe(dommDeAbT*3F!^_o7!=9t)K +z`+m79M(i?<>g-jC#Qvkz#`0d4dI +z4*9A}V#xOtQh8y&OMJjUX3#)-z(it@ZwLW3{lLy99e<7Gu{oh*ecZvis0+T4w>)NI +z5ep)zgb-e0y4<7RM>y@d>w`uUQa<#pw7tZTEv~vCo`j0CIA>h%=adMm#L2r0ZbTj +z!q*B^cq&ClU90D~hNdR0=J1;LALH|(LQYYBLQtb1=EqJ37ldav&`3W{NPSTdM4A~-g_Tu;Kk2%r{DZ)HHfP0Vo>tr)j8LpR|2(On7 +zV&18tshR)PFdq17UUE>SHhGU +z!{;8Osh@tAP&%0cl{?)h!2CN9!!CFu7<^I +zY=~J{A2aZ5q=YvjWqcGjurpy}N7BaUNef#N20ly}_$X;&OVYw81e>IVPg52?P22c1 +zW8ssug)M0lAEga^n9}hN{6K|&pIJ%r~rFF<;47}BB;$KWrYj*Hq)=T^ +z_nY{{?TSYrrpFpIxPIN-NKt47XH<4;hlC{R?6OQxA9@SEoGxy+8u1^ +zaPd*6i!GfVKI!zN(DRF|gY6v_c6K<}-QoHrq1`6-_Lw-(f0SlJ~ELR$_yiWh +z2Tyf98(R2SsWK(qhZy-BoeE1Z;*ar7{`9&q5FlrHqPX73S~#7ya5(MYP_u)BO&$&> +zJsgVZIFxh*TDGNt&l^qbZkWW?b`8x1PXMn-pH9KVWYGfwWK;vjN(RQu<`2RP!DhSw +zNjdCiBzwsQqmtY69=>G{S^YS!w*s}jjK+3xv6HG0@MQ$}JnrDjl!Y&o9zKk__#mob +zUs6ZI2+)%A!1dhJppNvQh2}vZIp9e_Wr9jezk|$xg>)aihaULM%H11((gi*;l{z;Xn%@gJ2lZ=B+^$wOa +z0xRPVR-_CpO&C}n16ITswd~@hgo9lv;Omr!GYK1~(=LuSQ+aXmV${N#s3|eYi<6$f +zi>NQ+y`c)@LkiWHr(!Oiq#sA3m>r2xCR9-^T1@beaph!0b9fY#s8cC4e9VM2j(Sec +z&}x|gPLwNiYTeBD_B`20)n?{A8SxOF+0Q>7@xBK+VR)JAS}8NLpL>+C&;mq+6|SqP +z$2_SB&4idR&=6c^KMuo;dhYRtnE(@pnW&vbg&|7XNXm6Tdprjb9(_!LN_>;5SEm@!KOl#QgDCKR71(>;4I*r8}=s*FM$_EjQyeYF{QlB +zKIfg!fiwTY7#0vz1Xc(v{ycbLT+|p*Wt19oX&et-_Q7T9B*4r8F;rz9yH=D=8Bu0f +zfO)-uc~=X#muqDgCjGfI2?Z@Y)wO~bp7(|3{;Nf(nNnS@7Datgj|nml1PaV-fKiX9 +zRTm9vos8h3=6mXktd04q3zZi&KENo5DPj4yC9JE^vG$gMRaF|6RhIE&MM;3=ktz)j +z1#4u!AEqqP%a2$39+xn{CfNn;1wF|Yl~P}Q^K+u9n0yFX>_nLV&S=H881dlcqwY*xrl|Qsj@WaSldv>nnn$4 +zg3_*4Ecc2Sp_zWXK5Ae97eVO0ebmIdxQ2BxO;njpjTSaVn3!f_Q&h+1Xb~^ON_aD- +zn6>fsByW*`FZ+xVo##@03) +zTiV#4L;s73_u34+CnporOg}xX!^FE;3-5GUc(2RChglmRciPyRb@553i_fwSzR246 +zGV5Slr-RSC9embfiU>~EPZ5-*dajehA@qPy< +z`(2#scW`>Z#hC#cX9q2u8?y1ukc0EX4la$jxXhx=oF{!EH<)lW$^uLm6{9XHb1tgJ +z{Gl27R?bHCI04325x64Nz<0(cY{VuUF-oTq6N`AV)KA9tq_D7C_mCn~4H>vSY@=$#6OgIO +zF-;1%J;GHi54EG7tQz?c;|Rnwj8M69(J<;8y=nH21S4>g1LC8e4C8e9f_Z9!wXqrS +zGVXVZuqcu03ri0h3T#_<#C%^j0Rfnr0&pu2+|GNrHEHAaxPj)fiDA!=L*~j9RSHJo +zO7t<;s2mTIF3Ttb1AfTI685CbzE;rj@19f}erO0Q%4|1}SizFHm0yvh*_znurXVk~r0sXR?gH6-yMB0+kliM9DN|EsW}k +zWXGrSd^;Qi>A|+gC +zby3&PXlxIc+AR6~u-}Dd_iZWu|KGs-F&BTY)v&k8l9V|rFX=%I$w3pD0T<0o6C1XX +z8S;=EaM3gfWcn?n`%R>%+KvO4`hbrcCh>CAz>9Gg&&7ca5g%R%F)L#ZRK3 +ziF)FTp*M!0qej-tB0lIWju337XGw(M;$aC_<)ZM1j~o4uA^a>R81ZXQ!H@zN|6C-n +zqSDa(^T~({HC#PY>dn+Og9v6pk3fxhZMdpNz#)K4U#olSNW%sRkv_0D=D&~i +z$@n1ChkK6q&48KvP7WYE_n#UB=e}U>|7r-F2Tl`UMy6)|*-^|tH!LHoW5G4=DJ5n$ +ztb`vcRpx;UW4Qmq80MWH!~6^5Q?uZL?~x(MNRP}nqq0)QvP^noXyTV>WvVivwKAo~ +zsC6=`HdJKP*Tcf_G8e!opdrXiLCe)5<^^yw +zb&ntucwfS&QeVRNcs>8yA{Kl%_bj|w!a{;erDI)X +z8LKMGc&eg^$196?q_QxjzHpU{^F#<>WQ~ll5=1B8@vJUS7h&GvnmsNYNho743{C&H +zHE{iF$!%R$#kej;fDxGCSxpcze6v3d|J5dz)mf5S#txZ9H5%63n#9`)9S6IBb0fgP +zUJqMaO#C^bVb!fXmftF1MNJWF>kHTvDd3ex6Mu==cq0M)EoS4DMh(w4l(4>`fVB-p +ztcsMeu2Gj&GOm+xW}+a4-zImN?O>OwDAeo&(bcwNIT-GA;idJ9DLs7;jS4f6s2cCQI9)?+nIaQSD$1tViV+&+xnAbVV|q^5uFjOOdNny0^*KV!%$bUxR-h7`Y6WjfaS5p} +ze4)(MBC0P07_N%d=e?<^oAf}4shi{rBMb2{1AQ(q0tG5AxIQ)R(SPBJ4}^+^s4)Z= +zdSCdlbF6}W4_xN>n12UiW_wwtz=ZM0fubU+N&qkXntai(Mqq`30)aP2DMpecX85UF +z5{*n_KGhf|i#ZU3dl$Q0a+W|#lxvM#6AP_8@@K?*QLc~?SSJ0G_ojb-exD0f7pg6d +zR9pxygDjZU5gXDZxPrhuPL+#)E(5T*?&U#}#jcJS*w>lEH$xiI1Zw%Su(Z+tnGAS9 +zWgghwRKmgLJZ=q{=r$mIH1zKfw5b%7H5Zm)pk$etux*qr!pqFzJ%$wcoidKBm*owb +z{Fy*Dt;kS$@zoXI>!KiK>f{>Oj8!n@cbR4AXA+s|uZhWeSkMteupvxR9rGiJfop9B +z&JbEMz@Zl4aGQ%`O(u>dZ5&UVIGi@IBgO{!0uDy=sOdE%L2!a^GB90?3QXR`c-imo +z$>}C?njv17u@e0+nEvlr{r9X9ery^3H_mH`Qr3Zf1E}oMaW-M#a=UM&zto}QWUGxm +zQ4_lw9P!_5UI#!6Go_#Mi)C +zzr(_JL%@YL;Jp~baC~3Pilm1XDGSSzHr7Ug%@JTj)WPOhQU1+3*92TiI=GktPG%T9 +z;9*VN#Nwod6;y2qECiRhhvjiUFo4R+QbJ4|Si;^I`fs>0*60J$+7uNZ`0>nCX9C}h +z^3EuTkuwB9Qy?@2Hq&slypg{KT6Ej6S#tSZ`Ar)_*Bu*>SRPTpASFgz1hGr`?0SM +zO)EW9Do&lOkhS4w+uLy0j#m8V&KCS;cPoCsuMPJe>cGOo9eC_;I~Jel#Ol-CSbw$` +z>(2IK)!AMwKhulFr~B~OiGD0R)`JI*bm5-EU836j?qC;wcd#43KiDVp+o1UJcSm{z +zVhA#SJnF-X01P399Wt|3nGnqUiPv*L3_)fJX3h>_-r1okkeLlM3R3QPev`xf=X1F4 +zd=3wMLnUS!WC$>R)UppS1Q+qdTo}W{=g08Kg>fmkeDvak6k>)U=D`432rdK|zeA=d +zo|uQOjN`#;6Tz@Mri6#D7BT;7X=-(BF7@S30HahGo&*}g%lyCxqX0(E8)fmu%!U>9 +zSi#J^Z)XC`{BH|0V8#a+LQDy~o((Sq7!CpCiJJwiswiV)g@(-)8rD~8SW#8RQ&sGI +zDdJJCl~wp@WK1xVBFtO<3YjwX-w|9C*xUhH9u3{U6TonljB8`!fw}F+EH7p+OdY#o +zbS$Yg1Y#t;jH_k@nmS!hSwp*}VP(}Mo~tY1;}#9a2W^}k2TqLuJ34gyGd77A>xx)e +zZDL7{ht;+8#T4;sqmI8vO}rDg@OI3`n-L3tYcTL~gMm#^%P+`m(6Nz#5;O(s5XHnFYQ#I9xo2U<-WX)$r4&B9l07S6Ui_`2P}g$@r_+JS2w +z9&WS)H`+b9=HsiKz?H0r%bmcbE)N&FJ$%#c;_EIKXS*Dn>9ldC%fadHV0t{9?s0Ld +z*Tu;m2Pb=6obEAky4%E=9!vJ{&-Pk4*JtDFejDfe9b6dj=i;D?O9L)04cfRm?BeQ> +ziyK3p40}kXiZ4f8+#dB)nQA0Wi!bzPkah%GWNnA5J5!x9E;3^-GUE=K7*$)aW!j1^ +zI5hN6k1J3^u;IOI*+pkCU1b;DA(KC&mkBNGe&8AzPrg88)G`b3xDU@_L$;QWS-^-3 +z2_L8))KDqOUOvRIobYzg&%!cK1u%Z(u^)X*AI0z6DGnq{I4pxXg%jCnZJVd7A88T3;zRgB+jdUY6{z_rC>$;CH4CXTe4xYFk$ +zUIhA?{>G1C+_P!O>X>PG&`kuTl7tp>3SgMLra(pkj3liEVFr@E7AP^wuR>6fuNf+( +z{2si_0vM&b@Z;3As5b&p^v2NRVnH)(QCFK2HGW?US6qG1sC*nw_jRKgd +z&kdgEeJVAwZuSEZvm^>E4h@StISMfTom0We51k5>W_x+mV_9ztg${(_B6(;yRi9uFV>yw!RoVJSn^dCk5QpH(S-+&^x#j2 +z2k?i3{rLUiZv5BbE{R&^O4;v@`YOyHkFx-?7xx_N#=XaTf(gOQ@j?9Q_#o~(F$4lk +z7-9rwP7mQvr-yLgnPHhJkU7J(veEBPNTE@xjOve3urrSxGQp_gOHo|7Qg%Lvh39i1 +zyeMCczhX8fD$L`T^LYHC?|orX8N&bwFN78~;)kJM=GvGH0fs6Jy)jCa;cD5#vRYQe +zyeoO!cX?9G{!A{LGU{LPW0dc^LQpB`>zym|J4HSyOziO*LiOe^RDJGpQW0? +zEVy2Tnt4B<#3+b);JXqyYJF_MO$}4?T^VBB|F(pOzAJ&NV;s4zpt9l@Qi{)|qKGFL +ztz4;NU6mmKv$0acMyfG43wYudDjM{|iDN$8%)B?# +zz(3o(Kc%+F3Yo8*P(29`dts==_#T*`FNRO)qvPYGj*k)=xPJC=lFE)PO3k*6jU5>WJ2N(RH#xG7us362JN-2o6I(MTwlo>| +zxY@u*%_cr>F|oD9!WV5WwzpZ>-EQMxr;8H=k*tjiSwDjGW|xhMZU+@TKxL1IiXIQQ +zdOh6k1*#dd+~cCA$Hnb_8&v}~Sn7DI&q8(3C&Nye>OLFQeSS|0yHcbtWgz%?NiuU$ +z%}$FU{~u-k!_1D02ChfQNmDylr~EDj_9;l}8B?`J*>ytW^z=053`BA!qI{=3XCgL6 +zCBZ~u%tUhBLV})!33_2Xr1P$r(VJ-MFSuwaxM(d9Xl!&8Y-CFgx&&5ShzCaVFsK7V +z?07IujN5$I+mp$&(9puvFwJPf=8HyGUO4i_BWK+9FisP;4fN>TU)NAQXo!-;Zk380 +zP&w-0)~JQsqZX=19Z{BQ7{41@Gi#LZhyOyD=5IcxKZdJiQ9j3ee3zfYRk|S7m-p&& +zRA7MHlOAprJXGf$)a7j?iVk{gV3cP3zz?EI9%m~kR9F7v|`HkvK6^l>!;8H*CiNZotKEYG|j*jSv()TjrO8-l> +zcpDfC9z-EK9!$%D!IH-yAfZhMz8P_GpreQ*U1ijad+4DOL11)UWlUlF@I +zM{%ZKL(?S9^nAhYN#MkoZeYT+P;eZS9baXUGD)s|Nl_;il<83b!&8(Q`dj$>vb<@N +zKK(L5cMH!cV434ud0)!nZ}B}YC58nUra+2eSTJ>ec&(YXd~JRn!6?sS&oSWJE)PdD +zHjXx#IN9pqM3ak?O&(4(14o)Y9Bc)4Wo&GVlyI)qM9ZZA1_J#&1eD>TiP55giL!}F +zo#6~NCN)=vO3YMLa@j+^WS~?mV^niRT^Z1UT*oLkcw~yexvYbIQ3q!; +zz=c)|=eS0eG_W_~VsFgB7bzESr7XP4e+TMyeANO(2l-}(gY=k*^oWb5VFN8gB{`)( +zh(5PL51By+DSphDgY+nHrGxz{CjJuBq=!S`IALOG(gh(&R=^T2RwbzZc>YLXCe;@|2w*9pCSphe=;k=^ +zG~uOzYi(3z*iGX}-~d&c@UXikJWILi77RTzvqu1h&?IUQ1kgkQ3Oy#Yse7}}*+9g{ +zVF=>n{N#UaZ-;cjY;VQSI6GSK^PR2u<(@YDYF`_Ed!QA6I@*Cpj(1|o +z$xf^}-HFZTy71iB-FW_+ZoGKD8!uew!Sffo@$~sFtpBD9tIu^~@#$_ncCr`qkM-cb +zW8JvtXczuSQ$LF@kM;?~{Qg)!et)bFe>h5$f3K{QDMg0hGGhXO2}8`Ez8VyOQ4qtG +zGNs7OKKY!26a_D{Pr}T+uh|#l4?%{|5(XNTMy3EpC6-Z*q5AUJrAbj>!X6m~FY0{o +z@;DY=%VFVF1uxTa%(8NJHIIj`+#VMGf(n5ft+QNC@ +zS^@VHV6No_USZDY((!bqjt!Me0@JXBYh^bzftM#L4Ot^2zzD=t5l(&>VCDjr +z+4oczjGVLJg&^}(wI)!a;3RyqFJ?uJIh|M*0L;=l9cs9C_GDcdPt+B$xTb)OwFSH$ +zDPemXeHI?Bjslm4=)KVJMMnW|#K-Y;?F81;}rTw1ZDFHaad@#>M=!anl0N=^t +zNwubgR~k!ri)u=e=`Bnvv++?v$D6Sd{t?&kMw|d+wJgbAuR +z@1-2PoAU53f3GPUAE!)gp@$|=VYa0$?95o$&GoS+7yFxB>}hhay~)Ps83Ug*>Dbbw +zVN0`)kDD}nl-4CYfPnK^vxzU7Eo^JHu(Q?1-VP6kI)PIi2F_$TCcf@6aiPn`#cmsy +zdmLQpb#bl7#*JPZ-}TzK+3TRPk5J>GX274?0ieFmMFUG22Rt+m`2R4o(}2T-9d^vH +z7e$h{#K7(#$`^hTD{RThMr}5cSJOKpg^Mg*^l+Q%1tWi%>NP@hG}F#p)Q_^j(N8#w +zvKWw_gfScGF-wfUeDTnhx6x5_(OGgqb)~oLf`(j)Po}yOB#iN$-!YT1wf;M~Tsh*q +z_A()GDe%Q*uCiy%khrf_MDKY!AaM6|^BqXbm|Nl|!cVuF&68L5LAWhHdSx +z82t$_RGVbRY}AZ7sAd$hjEnklf9l4$9_CNYB;%5S+6kbV(86=lLp9gO=zSSCk8%2=-ymRToNff)evKV-xYuY}$4+6x)*15bP3!9+^H*G6L8L2`mclk~8#kkXY=Yhr{Ji9? +zBmyNCJ8$SI@#n_?hTkvoxe$6xe|`*HWu;Oc|$IcmjvgEL^nlMM}fTHWN(~fPiYzz+}FRk-UN7qAM$3 +zdEJ$DI3}*C?wT~Ovnt3y6do5$frhZqzEvKnPdv +zEwl|==o|&;XFJ~G;H^Xnuh7>SbMSn^!_x^5YuQhh0#>CgtVx#q$jsR>n*$kK0%gcd;VjiV8z`;mR6;hAUwLHNmy7$oN|d8xtO$NfEYOtYJq@ +zpwK)OB%OufWv=Tmu<+LiKj!sZ07GDz3t9*#VSow43-43?QKKM+0R+B6u&FZySDhpbhsNZo`AeIRx!8s0E_7kTe`@zl001BWNklNbML7E-22tw)KHaC{+KYp2)vvf +z#rK=tL3tJ9ts!V6Q( +z9=uk>gY?F5t_L7mqS_LI7lr{4Si+-}m)R#FX5Nh=9te#x +z>(6y61%}U2by2gB(aCcF%tJQ|c(|e{^GJmzYK$l{6-DvHEUzq!3d41>r*CT5c*|F2 +z2sZ?oMOC^04AaSEolH{6W-2VR6US!5%3P17)N-oavOGh5Q2?`8N-ceLg#e=>mSue` +z9J#CjrlyQ#V(zEGU&D&J5|-DMv83L_lXWf@)i_vwtAtIrCh*V5BzAR_WoNvi2wW`! +zM~8vWIt)K@vUU<{Y6@6YUBaeXL)O0jp3v|?lZMY*4Sd;Z;fodB56g%SS^we+ +z*tp47aevq>E&w7B;vg?;IMXoV0|^9d2sbl^Yh+w03s%cUbl3OC7%q6t1SNLL3|cJkaZNJ7=LfXQF!4L`}|;kvO%tYgJNP0`fQ7yhrgM27bk|1Nb5Zi#DPKz%Sf&!ilxhEe +z3Se9pdU$3T@eS97<+(5e13tln(akx>hYxmd^qV#YEE^-HBfwZxUJ?s1Ennr}uc5({ +z&YE$;fCY)trZN|$l9J~tm={DIds6gBfKfxBiA{3d&P8;>1ONVUU5tLE+EG{fbn3av +zHwv&Iv}(w2MyFENp7&pr3qZLp%JAfS%vkEiyo=+#I(D=daJbz7UugExvjP4YH55Dt +z6AsX(0av>XoNk%GrTzk9eBo`f%n~pP4hk${G)+v}e%Ypi7Ijit@k=`S{a`xS_th8W +zMd2xmOaLu3(}xZCvms^npMk^a +zG7b`4TIjj(a54=XYX$bVd)U?DU`Nu#o@f!5+DuW-M(LGdn%KC8v0NUxu>!`*z8XjH +zm@GS@zOdUz0nE7WNh#%+=1CDHdtLhJF_OoG8=6H*RubM2J +zO)*j!*qa1)WPmLx4}XoC_*jg3e;8L$8E7mKbHa5nA%`q42n_O&avaq4a!`ck6Ddyt6n1%E0KxHcs +zOM9ql1`ad>&qs=qY(`LFR5QymY4%^9aAj3(b;9%EB>{n&)kzPlrMAGqhPaF8(!etr +zCZ%!xj3EPDIh*#)@R}h2cba7h-|$axnG0SNz;LZC3@mp77zHot`S9l`U{NPMIpNhd +zmV$;?%;vhD6KX;}n>kgR(DS|z##dFsF!H_Yz<2Y#`=Qk{Dlv0Gl2T|?+FAHiF!Ph2 +ze$kHq{bd_|x~&~Q+unhn?g&6;XFGl_31yx5*{%-UwYLqw+TV`f9c;zD1ev29c>H)L +z7N2Uv>a$sF{5p#lzUjnk7rOA53*Gq3r7paBr3=qr>cq3>yRqS17gn92GSh=cPWE8l +z3BMnPUKkqt>5Jj~;W!h@25}D~mleF62vW;tK@0)ro)E++gFjEgjDnbd2Ve*)gc)@z +zupzvtYXvR}XcV}FPXY>8!FVcwq4F{nx2$59FZmz$*p)mUz3hho@Z%O-nE)Zh2beKg +zFOwCsYXqCT3?XO!l?mL(^|By|Oq3U{i(ScM!PUal%!ZcPj|nhy4WWjhLTH)yT|s94 +z%_2B7^o#d}27dZpWM#}>8&m3woMC{u>3dx0WqG)=h=*_Hu}C~I8aCY2@l1t|XDiC0 +z#;mK-K)6|QOT$xDWh|X;e!mlEgD{n +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 +z3r+b>y28DFDgh^a#WhTqIe1n&&E+ +zud+nM`{GFfWrX1oIp4s~C}f#YpkbI1**0Q>d^g=hXTim=?*DA%`)PY9(cc1362&4V +z7uQA%QCm(7*k~+y=nGce%BG(h*6Vs`wt)HpzM-JuN@p3-5gR=vh{D7`2(BoO8UE@b +z{|=QM2Zm$9bZi)oC!i`nbE<2zR2YJc8a^leDukAhF`r;Ug(VCx3Sh#}LeSxa;YERq +zf*1L^(&YmGYtpz+a4~K9`_9BZ#+I`K=j)~d4mVpk)D9eJ2Tr!ptgqo%s)RGi5*pfU +zbWPY8HB1y;8+pyc$heE{0Sg18E`}xvbpH2$O!oxtCS_gBz=UQ9$c$+Y!jse3@nR#V +zJ2In&EoHU2f`Pp0ztQqd*21ooj(trY4rYKoY2awW#)+hfohc3fNa=W)-6{!9lnw%L +zPtHJV&PFN+v~Y!x5Ho5bopX@M0nMZIyYR6k-BgW}!0BH8|67xPFBpydOwz-%DOZxf +zHl!T!s?e{pG2weKH;WI`#=4A)Wf=!cQWjoMYB<$lAvFP9>w-l3KhMsxq>HCpY;0`R +z@pOxYmy^J=gr2m8R}*C%NI9}HmS_iVw|m&rYU6K79c!cz)5YSXBLK5L;=gcTnsNew +zaj-T<^@WLI9@ZutPz~A;HStW+#fur>1seZjmJc?Bl_cTE!OE0_RVf#%Qw#v$*K;9J +z&Wv*oW;V?D{u*B~nGGi4$6>`~3Q|I_LdEBY=6jz*I254qc|AJGyO3D6`dIqbmGXp;F=vdOkE4lbfGBl +z6Porpj8Xpi_7?nNXB&R8vmL+K*@3%ub>L@vTk*49Z9&;(7I*LL!ri;FxO;a8e!05? +zzuwb{U+vD~S9?3~>jPQ*_D~1@`%oM1J<^JW$J(VgX6flptT@|=wO@B*-8bFXc%fHj +z-8a2hbB=0EFCIJHgNMKB!h(}sxc?*prVIC+=)oUP^x^-Uyz>f~0vDbNSmrtjF@HKc +zD0APrAr^8}_+AHoZb7 +z@WM2*Acc&+7rDM!#A7#0GVFL^;@D$B2h5|Dc`Ut|$Lh)wo~zRFa%CAW-z?z;f=p!@ +z>u!~>x=O>!N`F>VF@jmc@>?2~Rh6;ymL@A_RAabi_WyDA-v4!#XV!QAs`s5|Qb{tI +z%sZK665Md1gM07BU>n<%$s~jX3>a*{RMT6Gdy!SFUXM;w@6wTU+U{+=&${k?OGiRL +zW`0(d2c%;$5`UV3V>Md-%LvgsJkM#|d2bR(|Hkf#{(Z$2fAs%W9@IbvIM*d9=CF$!u +z*=ghTfdF5O`lz1?FZDE-xlMypZ(pH!7tDT)vRspiRWrp)P7C_0l0@MhY_I~gDE +zWqo{*RqyA+UI!obDX|TWz86Zjq;dVU*TE;fE!2s_JhInr< +z#Q8yQfj$`W@BxQjj(9RR=F?%uFuPy`vz{6A<(MzCW4;^@@b`%jUyrNVF_$MfJI0^W +z)yV+Yrb1lH`M8k_P&LC7{|MD0`a(k7DFmo5hLXtDSmcb9Ks*U;az#Ew2TyKGp`843 +zn^*36BFx_pUd`t~%-(V&)ubT{60J%z_BdmedD5*j?t_?Kkr3vtBQ+6Tu=IFobUuJGDTpF?S=wX5iI(N0(x9jn^-C~ +z=AZ8`7`4VpV-*0S+ru=#RGRk%SO_f~hUvt^ +zE#qp-lJF7_xpc$}$210<(am6t?Gj*LmxtY*A+{3; +zSpDb4?9l#e~#5%zWg +zySsr+X&al{Z5(R{K2L^d82~bUKvNbt(-le}4ToRyBz;qRgw1V{RCxGW8{0x`Y74Nw +zlj1BG#x*N|;XIlh?Ewz*vysY6h;1?q+7nPAtZZOH8q?3>mB$`QsA`M`m&L0F8CIFJ +zz5y9Apj3hh-xsBi>HY6p`7`OCtMa~lo^O5K_`T`d>BadrX;4{w`@@|JAM<_t;`iwU +z9@Ju`XbDxmYjG&+001BWNklN7+d+<+;R<6(wU+=|_Uhf50>c_A5;3seN;>U0H;wR_&VkwyUmv{Q{ukZHZcONJ) +zS^3Ej)_gLAdp{k)gP(Gi%m^O(RLzrF{pl!HeLRe1H2Qxyg#Y+p7{8I0G8L=LnC1WY +zh_hmb@$VlE<3Bzb75(OuQT+Ry7D9}M8v>00%%@}ckI%+MH1umzzg`I~-_}}I2{ODN +z_jQZd+MlgA3iDbo|9D>3xRT$sknucxr`Vs1`6!R3kix(h>C +zad{GVUoK$n*9O*oUB(K|i@7$9l~<;*igRPG8CZFhb7Kn9R>pPtHHto&g7VT_nw^6f +zskU5Y+t~cjO!3rQXVTfcmft7~%n)cO!pdTR(fis5vy2s)TcvME8~B&sDq>|-0n2VX +z_`~fGE2|u=t(w7_>KUxADS@qDYi|}oh*?{0V12ELy)_OF-!$>~O%wa7O>C|$V_S`h +z?b2>$VndaIhpP<%m`7_JP>)pGxWC50eUe&cU`?%oHFYM|GHI-y?P89!jY<1hMeEqQ +z1{0McxGa{2n)@47+L-pbuw_ic3)l7aN{==uh~cakYGZ>P%f*HU7aJQ1Fpg+rY`)*n +z?1S3W#M>Rwqm4E;HJaGnTE@wQi8FmZJ{_fjS`DU4lmLpR-CM&ZE)SUaFk|6#!W4-3 +zW1EZTT5UYv>fkS}gbW{l?r_C)|Hp1mVCF=ZjVC)yJlSD`^IvGv=RBCFI|9*(b{{9& +zL-D^n-KwDI)s%-12O|7^1h_m5Tpfcz&Bwhi-cDI~Em6j)&Jvz$FXPXQgYI_m=cFsK +z$$v{LNMSny;pJ4ymr#P2(%g0y=%us^ty38nFJ^qakcQ~RG;k^dyqFFE^gs*0aVj0) +zA_G +zt2y9WF2c23fa|fhLJ&Lq`dCggDOJA=LG$LYZ` +zUgmz!#v`ED1zHNg%@G%udP=Ap_9ZrVl<>>%Hzc?+S>OWS+jsU;}EaQ8_hmm?+WpHCd8Q}15yH<>-O>bv8hH+DB46FF`MTC066cAC*eGKezemUNMgDfp@JS4p4dxx +z0HK8tC1C=-41nI<5#ewOIGhA_cQ64h5Ks|t>GH8L5r|kd+7Rz^o5wdKR5eB_GM$Ws +z4g`7#H(C#OsrR7)hwq0iXwrtp>Q0C9;;3p6u#vu@3T=`1P7hItP4p6VMcBerw8Xr& +zb^#OtaWh-r;>Yv3Hg-m$4IPoBzKQ=Q2C+?D3{+6bZcKNR`|~jskJFDQyiw|NiLjw7 +z!o~z--=!8|W-%DeK@UNQ +z02Bie0~G{dG`w(~2bc_gcs7H7j`hRWv!J-o^+#{?d_xN%rVl@RdjNO6GZ0s0dhzS` +z`tY0g2c*^P_wNs2`3D17@xg$klimH{AbwAH`CtgY{gAC>1ehTiZuuYdzI-?=03#6d +z@rZ(#k4NzD)EvN!;y0g;iFi!I3Riuct3F-{F_qw=w{;ap1B-^3Ibew+mMiyV`|BM3 +zaA8W!`GlBNOdY#0BdumM>fe2F2Fou_VcEs$xV3Bs%PvgezAH1>)8Jv(?IP~GIF4nP +zrm^C38TVW^vFdUGE3eLA#kCw(Ud!X2s~m*MW8W^`&O|f9i&SAM;e~*5tvIJjh*`XS +zcSZY{h8M2$08{=3yev#0D`VA71NT;!vHEr%%WoI4yvo5E#wFk4u`*WGSXgtrjMY^| +ztgB)rri@+H1`bx6I9y}mu^J19Y81@y__k^Tn`;bgs5Y_bwvElV9c-y~@o1fehwCgn +zP-}x``L(qM))HdslumuS!pnvR +zdx12ZY;3ZiwW-;b|70uI%}qA8HM!W*yg0$p{y7jMNTsmFD;<57%=( +zs&XD~PkE@B^rSWGPR>Kqw1<{iA8oT9x(WeO@r;;WBa|px&TpYve3I!<9Ih7+tdwd; +z3@Um)4BNBvtSH1&(xtkV-vg{#Ygy=HZDi%ovO*}3Ipo3{+k~qeSOQ0YoABoqcYc@jHEYKmt +zC^K|rfGJyny!Jf2R00eQ`yQsO0OCPo|DdA*i5v&5U;?Z9Sk738vf+ +z(Ko{xRBRdJg{~6zx4YPxh_EXeV0XgBt}Y)t2}cPZ+q!&gON7{zWMUYN_7Qe>K`Jvl +z+YP*y4RD9C-X`$*u#e-N26lIpu{+~oSJubQEL8O+>0(E>kFALSyE_=b5}|$sNDl$+ +zgTTjGA5V9du&JeljU6Gjwkd$xknpiS;Y;<0C+8dGB%LSNYFkxP0&J!KGZo?SEU>>j +z!mf5--s4t6LN`y&18nB(npg}C;5OGeai3An-JztSZB0ek+#O<5cMwZG7oSg#S3I9Q +z7pqfjxl2H_ou5+|B(`~17lD%i$NdPqn24s;6=BCB@p1Zj^tz=R_%0EGHdTs|)ZZih +zc`miiL5zm77;H48=~Y*x^r|aBdY@}0yhzn%QTkhD5?kdqTiL#&0+YcH&nW%qY!+Iq +zxM;ERQVB8ym`eTht$u-+pS|6OyWZ)?FW&9PFW>FQuiqQMzr8nze}BJU^qcbo_|5r2 +z1uO&?R$1l-Th3Qr2rsO@{H6k6^foIp8e|A5+^&R`r2s~Qj0Tp)>rw!-7*-ZTjUfCFb{+XYhwBR33MWVSg6)T$sfAYk3@~_p$4?fi;&V +z@VhJ1xci2I6_*QGb%j-!SuydiyHr&Em?Z#4jQ%wHi%K$6hRJ23xMgfHr09KCV6^lx +z-7?0N-WR>EeK5;!siS}^08DJ+XVRD$_3Jpil71BBcloxJ^IixrOcx`xR90bh +z1x5o*CA`dmOI%&i@WQncT=e$lW*b|ZOl)m&q;Gd)i;E4-4!CY?GO($!gq=;C2~)z; +z2@|J#9lY0XnQRo{lR+OJaDsQn!5e8CXHpJMCmp<;w4_yx6`50M +zR%HUItei@RcwtTi7-wEt7cXU8oXWa*xyKVRrHp#5H=NU%z6jLW{s?FLBD~Q*uX6*y +zTZ6#cgVCIH8`*n90p6uXe7wt~pAir5j=7@uhC_(~{a`r4hroU3){n_LP6;H9>e`yb>(~R +zCoN(Nz=iS3@rkqctO)2-y!W_mjaSO)L0~j3B`HvjYMqmxl|G!ftxTPSGjWU&%Bng< +z!#(HHj06$-y$~6jCx?2za-Smdb?ZL<;jO=Ys@>lQ;FWj_$eWLsCC +z2UM3Le3|p{M!$`-{Wjhkb#bc@qK}_P9Gt+a*@zz@?RaRO3UFuGLBptvPM**jkpK`Y +zNb&=?ct04l{G0QsI@UJVpOdR+p?f#U{}-j_A#RkQHHu!FaxoixM;*$`i3Lww!mpkdO*NSW=G +z5g6NCGJ!$PN9l9WnlUguY0K}FfQzl+h3#yCB$<`J17KuerKLPoOahbvm8{m3Etm$= +z#v-)MvUSbCnNH44apeCyM(V%L*;)zUxkQA6G|#u#c%|3Jtz3w~vX7y>jcm?GmR^?} +zkj;exF)4{kCb+mrPFqOlePsDNISYI;5a5|ETZUZjO#w92?@9;Q-R)pkmxG;&5Zk+L +zl@ykUur1|bb0)yXG_a*Tz@b(P?+&lKy%`_7GA{PA64D)D +zN5;nHq>a5@YzYQhhY5v1`xx+UZ-k?5MQraVVtvxZ=5AnzcyIvm-gE`xp^>VDR4WJ{ +z5w=hQSOE@YBODn3_VTruxS8;=y*t2m#x!>`syV{;ZYZwNOk- +z6IDJ(BEt5rZ)!((B;f};yFyUA5`;blegv4s+C{HXg$OwR6M(6#-c$n2cR|Su4`Gf!GZ^|o4n@$LYA_1+-}GMU%EIl+eF2mz +zV?JrD%D|jyKR&+lb_w@Xm9XQEgJZ28jL +z?yV_d=j}3%SJ^mOW#UA&f#WqMj@1}=qNa?;Y7A*H+kM-_u4)TAsvT^vaj><{#fCat +zX0Om6!?v>fYgH_=YALg^u3m{rWD=KLXXC-z?*|xy%|8M#mGHvt{|UelYSuSdc&ObF +zv;X>52b-FGY;F!job|G`mHoeg^!#pYa^oTp#msWdyh|6yb~h2%q$ac(32XTRk4m +zNEL;1T0Hzs%=)T=!z#{SIz9Zk)xcj{%XqP^gtJ{1-bvZwmHDdQ!Sx|W(u;130p7>; +zi3nH6LtGqnabeiSmwf>~>kaTx#>d-f2X7K^(iUDxn|LX0;#ArKeK4Z5FKuI-i6iZ3 +zY)NC4riT?6uR=af^(wv87vQD75U=zFqSI2D@o{D##B2Ql&h+~@)6eQmh}Q=op!3#1 +zh_?m;ygd-$-9aDk4|$>wM;v@KY~#~m2cHew_;S?7g)ti!Mr~Xgw{dO4LG`4XkJ2;~ +zNEM}hHjpYxl2sIg=6YbjQVC)7rwE|%M4Mm|`%eTcXsnkjy7QCA+3RmOfif!7qhfpN +zim&efXH~%tMe1rWAFEnk<|f+5Em1s)pJgiy4d;X-F=IzEc#$naIorn+&BXC>HD89+ +z7X>%E+Mrv>xNpQh7J4r#t0$^bqAMl~Z{z*`5ulMOO$PMf@f +zt)`x{;=(KEIyAtGXSeY6*h;3WK?D$1j98V>^IQgOLWqr2(L%Q5V8{++$Rw*WHXzHX-f%cr3%X9!U~(Jx^R|@GV*hxI%i~baF$Ly +zYo~SAMGuFYIs{4uUAmRZ2nn#tzrpsOvqLuiHc-G@<0fv+2GSD7)H7CS*zPv&GJ!5a +zvKZjbq=(xRKANUXqzzv}7G_v+B9zf|Zbed6kfEroQpJXR@ev8YL<(N~5N<%PO=a8I +z_d^T8WN}5N5>}Snj?=>wyzt+Fs=DY33_*qPLP-mm8N#GkeRG+z=cC_-3~Bvp*u+Nz +z4n7cW3_%1>5g +z`H4`erSp@*%PuQaQok5*MBM0(z%yWO9M3#LPtK +z$%pbc;o<~vng;oH2M4+%?Bj_$;U&Y9cTcpl+s6)lqRy&J(#8ISEw^pUL^zZ%@aCY0 +zj0=1UOLu^+ +zNrD#yCg{6a3>!Pxt`-9bw|5G}gxJwd1=z`m=OiIWfzb9Cg7{t*Ydc{kJ}%W5w%)~J +zfWczzpudR6I|8*Xy3f`Q^>{{0Q+zJ%LsDxf)fL?erdRFnVQbl3OP6l#`ku8CT=e!* +zEnvEuqSs0=;r8O=gcWHCjN_#jZ*#x0>cVY4k3RMT4KG|P{V=+fO!;9l3o0;`!19wf +zd!Y5xbG=wfKRY*opPd`T&(8JZuD1r}^z*j|@r!qc@QZh;LHv>fF5e%m6_ +zUAeCzhUF-8f>}jat_NbPvOytitB1PCR@mqZ>Au}czh`> +z1vo2imY_vgSxP!O`JQSMci%R#{I-L2HwxHYSCGl;&m~RluFK)U8&g<)J&%>OWtsJI +zZWiwtm@=qR +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 +z;b8+$;-yWDX=NUEbn|bShnd<8ct +zLWjC9eJ=!+ZLtSNd@#}u7D3v;*b26U__`|cnf{jmJ5m9*rvhwC`O5zyuMuH8+tN~y +z7BvMm5w_6qpCWLv^^K527-J=gt!xT<7!E){A&_im`&t63RWDxIwl^o`7sU)+dwig3U<^B); +z>6LE$pVLbJ{Av>OO5umEr9g-gRaRoos!GgH-{`?l-^}7?Z}#A4=jL_SxnA7$Rxf`3 +zRv&)OL6`3+{rsI?{PNwt3Jr*<|6kr20QIYP>4h1>uLv>k4dPet58+=4FXxBB3XD`? +zVh@a%`5C87h|&6v>dSwAK8D|ZF|Xf!!Ai^6A`xB|>i2(VI~hS{LUi|qNi5c~ujzG( +z6>l&9I;UXdB3sC&<|30P$w)oCodn!`Pp$Fbqs +z6pl5zI8a;0eOD*2{PHALT%W}~SEsQ0>I_z2En(HQ5?0^0%SjubkA(7{>ao@tJXFn?Wkcq +zuPfo<8Uv5kmazR!2}c^r`0qOg{(8s6^YteF)M(=AdIL|@n^K`UUT5KGttBvXxW0@7 +z^+g=GQ^etV2ZtI6H5T?ZnAl!#U{gaG>+8#SxS@zf^HXmP}7zd4J)(#U}+6`=JH?gI|#I|-D+uLpI5IO1!Q@e#79VT{BT^4qAn%I?auq)wXSHi>I +zgo(Wg3;Pn5TDxr=NU+b@m342z!>*){9SIlP6TIqWV|$0C43B)SE(Zs?OdRR9@MOxu +z(`ggW_1Ji+&&F#54&EAKDp!b06RyAwt2ec|5cRnb?bATl43LX +zN|2gsG7l-CyiZP-r`YDi>WV}j#}U#qOzAQrOcGX1LJUOo#t?3JvaXZMoVbEyGuaG$ +zEj7o69w5G_AvZ+78)Co-(eFe8B|UbCtfkt(GF(l_{ve^kRwvLCAp}Ck0u@`FVIo=4 +zM|(lFk!1@llh3I8mGJj_|kA@(|HbD;LjAxM)SlI~G3?BJBVmM({#rIj2V1*@$ +zr4q*~0Y(Ffh8GPWdS9;sC`@{z=zo#msxVdv +z+X5^TFs#@c#`!VwJE&&vw9JO6o^VhzZlNV<69TI)KA6=_g|~lovb<%Y|oihD-#T?Q2%-#gRY(RV6Yk9~J?{45h-t*1TEU +zN5KkFEQc@*1`hy(25@yEkU_qEy0EhY9 +zSs#z5LmWs4IFNSnSk}VhSr>Xf)KDK3D>`J=WBY(%}!||~_6JmRsiX;SpUYEn^2*-MW#|TZlNXH9w=?I(C^tvdM +z{f=Y^5zYL1J6?CD2q;R6w^>Odv~XU{VzDKT;&DO^JwrQE1Q{*$+I$aN2|H;8J=>Cg +z1^npyC_ocXiQfwY1o*yoCL`>ke~9lTKBkWIcBMJ+ntN^i9{3sXv!91Q!qwIkBvDN& +zM=63HG*(}pkxI;JR$VUTu<~+F=DTpl3q>edb9EMLuH~`(`Ye`RnZQF=CvddBgyT&n +zw%nS*%Bz#O=XwsS2r$=6s;Y8x7VB>2L~CPUA*57_W_i8O?fa{WqWdJixPW!H)cx1o +zDne`R%@Wq|adAS}y4&=sP@LgXj8}b3t!rxxXsu(MaZO3IuC@&7-r5rGt1XJw-k!w+ +zRWo?9p@cX3LtLB*@!miYPqY;9!0i&&-f{6@eF+cN=W%aC9%~y4xVNE*^>@lRP;23t +zI}V;}u<=5Zg;R|tPBmM2zRAKL8!VitFXPGjvV3+&8VEflJlg>p9`+?E +z2YdK@NgMl;2KILwIM7|fp+pIX|8HjJk&K1o857TB4g4`{;00bu9CUGp>0Ki(J{@)N +zcMf#S1-LO2qIM=i;|$Q2S8ZXsqQa_5CRR^ALJ$8C=Qy{(MN2M}VSNqbHtvj?s2wv= +zH*U?XHDfkv$62v)V{zL?{iHLe#t94GrG`lhcczr;b2jR7HfpD=1**we_%7AuTr^Dj +zsGsmeO&l^f9-wI=MDt`MGd!3$)|$7_HaoA5f&;3n=ps?_kS;k$mt2|g!q%@L)5oY8 +z2nZ0krX?Cy8Pr)d;)y%kn<^#47Q?v8LUX-7d5l+{X!!OURxjpE^Ko^7@Wb2b?;zYvn4CTyO7)4* +zMYxcJu!^}NJh|rcXb{uY6?!%DHYb`#$dw~Zm4i7=vrWflBAZG^qXAvoo+=W|#FSp~ +z-2B-Ko~lg9dn0@iV5M>qVcY}8_*t+j#`jJrW7Uj45>`U!;bDb}{+dwTmnY8jCbZ24 +z;)7u{Hd_^$az=wa2YWKbja8IBA80Tmd{uDp@wAE0au%)@JXDuMbaN;v5=Cg_t +zV#EnBX!*z*K6=bRX3`8fkqi`N3^KnzzAt_+{G1ui!02m!FRYl!44p;ocN#kWH)|!p +z=xwe7E=#O)0HZ;s5@r^)kkNZ0341imGp;yp*WzbEFc~+29>!6Rn`j)j#7{)1&0kd4LxL;kPfMG8VNgA!Dm+I;I;<-WygYb+Z0DLp*Xw0zj6 +z50ils;(=4Gr6&C@{C)8mn+<$0d2ffq9_{@NGeZ#@A{_eOZ7C%`jl8_%T5I5*&; +zxvVN?Q{@n&vknFeAqI*O1_~ki(E94g6Qi#IdA>qpYU% +zMR=k&#E~8)+3xdkv_HfX{lKw);6$%4I^G-NXxhWGSqJa*xza9HV*xJ>mvOYGguO`z +zk7are@ll>v!-(qKsV$Q|_}b4eZHA +z61TiJ?L%vK#s{@86R2Zsb4&R+mW^<%k3Jh$+SPVvLhKU70R$=uwr7;Kr9_U +z1~Kf&D)IIBT9vEb-kJ`fwLJ|9I$+pArPw;Rl;}kF{(Z?6V +zjD{E9M{jFzS;3aESR7PIXd%cfkHus6UY^0dS7x#H$_!RtCe+Mp&6OFfy)un8S94f? +zeHzPe&S2&B3EY2e6#MG(IMHn5U{ygt=kBZ1SXouX>YFoo@J0>~U(4aaYk91>VPMrw +za}HK2p@rb0ML?K?7|x%e|AcYI75Ay!X2dZ8MyZ5#)kUnUDbK-*h8C^_mwCnDQfJ`a +zIs^CB8Mwc$ELD{U>kT|uXX2r18|$kLJlS5tha)Dwp0x1(kb^^w1w2Stx>Lfs#v&fA +zH?h8s$zc}OHrsfp(ZDXYlr=bbvB|_sEf!9-n)qvrfxonv_+zt)ryEV2Xs~d+(ZaDt +z6HhiN9cwahwAmINYj*KOlZXAy4t6zL*xF=BT=ApLCLW1lhG}2~nGG?tY-}~Lsm)R? +zUac0kwiwvnVqj~ltzf3zg#b*OgMA%74t98WqMb=E0giCH!^V+z8%Ha2ti#4pId0)t +zha)=L;egWnM>-r(PjtC>JmKPSmxIFz2ahEj9I99kCT#4Z*vl+e+*}-BTYy$tfy&{e +zhf2-CO$;zk8shSQ@pAXR{J^~haTj3Y6{j4JNVha$GQvE3~_8^~2b +zK8Dev>3o1pL5a7??Yz2~50RlXXcblDG27UB%Sr?E(Ue^bmpu#{Y~S)RYK0iHL$D2O +zf~`9|8Mfm#vACa}6%&2J&y#zpoWv*c9HywnE5cNnGe_9+6Pw+|{4Om(JWdY-C!q(@ +z2F8{jbs{;R#%0A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 +zfSKE7um<1qH0Wcb5bmc`uOeMgmmNK@LErc1} +zR;EEl+RFZi6`6m1zaNx_7`-k9GrFy8ag6d(l^FsJ+si5;hTDJma^f4ucziL?=zSfd +z%vA%-@(YuoSdCd;(N;!~S#fDfK!xpM1eWC&C$ap}lxW439F||BnV*0%i+ipVu;OYF +zcVC^w@~e}$_v!?8*B0=^oieuH%whGVG4aH#yi&%RYX;U_D`4%-X{@?FiM7}B5?w4H +za-;B#eI8$^f`H6@H}bguWU_(_NCz@vQ`B;F9lOE0w1$d^z#KxLQtgD&A+B-!& +zT*ruH8xPf$abJA_58NqY!<{1b-6`SOCKG>aD&tgR886ls@j^ohe`_@He1nZY*PHkw +z?^9pI)Ac1h)o9=(t2B)^PBvON*<|5(vxOtg77jNPW-RP#FtEM8jBO1jHc(CU!6-3l +zjOP5!^t*6vvaqGel9gutO#~cPYg$cgZe@~~g?%k1j5Cm%8q5sU<|1ecnIncXv8L$FkjZ>Z&SiXY+lBhVAWD?C4-&q%OyJd`E|doh*^; +z)Ul(}6m0J_vCYT!ZVTJHEFm~=b(z@O&9oPVEfEV_A|~GOvANs81}Zj`|9z~D83?e3 +zewnB)V`EH@;h2CRs^*&2SeY6vdo5nU+PH?baUHKG428If*ZH4X!ovEvjZJX}8-1)# +zI9L~`H3J&+iui_+VEVZ$bkB#v^O%oe_n1|Sus$fg1f?cU9_NB@=mM-IX +zwu)1|8qN=pY{rM#rR!NRFvY9uheqmE*|COcGgt +z*~4Jj!*GS;D9Y?RR)O3w(@Vh??#ZgcR24#WgzzvDl?2BpHbQV1=_&-rUskx>Y}scpsi@4wP>QHXrQ&EqrGCFt!kiKGbAdQH^IZED>vUvIis4QNR(12sG^AH +z#r6F3Gv#v`F>DO$9A9#g)jSzr;uur1Y#~vxkgVEBX|}wd4Alav4>lxWYnYuRBrC2b +z5x-djNE!5yxQLf+B+3?&WfNJ(8CNX~=&pEcsK!wB5EUUb_QZ%}fv+qC@yR3|Y)>cA +z$swm$B$Ip1X&)HdI +z?~)^ZFWs6VF3P;`px?C6XM4yn&X+f{B?nh>2EG{A@x{1>nw*Q4l7|8MfjCx1VrRRe +z+EHEMXT;B$ey72T1A47UOvY{h_ko`+Lmn91P_)GRHKp-ef92^R2%`VEAWE;!osE2SX(bnMo6oVFTU6782u*{GFXN +zZ4~%-iR4qv^|tt2bb3=PpugZEGGd@@P(yOk!EnWs&&Dzx7`iFMg?~TA>mr8zAn9yo +zR4hPdlEVhq%0gw+BlH0aU|{GNE+CY +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 +zn7DAHOyLh_GYIgN{+%X&#w;_XOfZ1|{G14) +zmIv@(j9L~9;=jHe#D9~#d^LpsxiBpF)7L}z(}f}Y`Ridk@XZMR62`@u{Rb|N;;+QF +zW7Bx>+c6NLx_m#TqLVL;)V)?61iyQ$PJNS0+K_ +z<&kS+c;xyR7SxPm(bXIlUoA+28B@w0x;ljgSI4mO<^Z;Jkf%7T%!pLZVW|;_DSGx=!*kCWM9R%c7eB3Rrw2kEOSYSbn>V<+UX&t1Vy| +zNzCmWmfkL4X>9>iWtP^K1WP2%jNX|UEF!t7En)GU5*F2#6hV>EF^-Rsq?Bdlw%}d` +zi|$mg +zU|qu$mfy)^(d|5h{L~v*R>Oz~ak$+Q6=y%yoDPM99VUoFoi_Fp +zT?%`sxJ2}6?C#docGSS$n2CLH3;Ux64hm5*aV%=!y{L&(F%zd_CeFl6d=RtnLDa@a +zF&iJn9ekK@@L}A>2MG%wCb-%-mvC?<;o$v*jZ<+G?D +zaioXJi;W{$OK>b};q6`v@AlYux7Wn+UJECBZJg?LaH`kF`@K|TY@8+fEQyW&u-_Kq +z@yVctPlhafHfZ7VK?`3EQk}7Jag?eI%R6=47&A~iVd3tijryF2hCI-i2bv2&TLI`| +z0$U#FE~s=Wc8A1$B>Z-Ec8sJ6k_`jWJ;Gu_CR#~Bp+8oX(K$M%JQ4Ioq;-Ca%MmUI +z@v4Jp)kas@Mn}a(TiHW>&c@xGg*&p^xSz97m$Olqvt)#+jjizvPvDJul^za81uG(w +zlGowux#~4JCRSl{y+X3g=w8)FlPa@hM)&kfMWxnj;{j}AR5^m>Rf-H!vdE!AJb +zn|ARP(Idg@g2-ssf$n->7YsuPf&?*+Z_yYXDcR_*I8s!}Pzfqd(*I&Y$V$@m&|`VX +zm>wET;8xkirJRXtEDtO?5AIDc%=s7WL8@i)nvSlQY=X_s~s8vkb3K5y7Z&ms7j9#JuS-TBI<_4u`cBcqq-uHMte2> +zC1Y5+>TSxiONFGv;^>|&z7io7j3g%6&=jeaLQV!{Fg|@kL(jN@ft-W!3c&J7Mj)3A +z6YOvz*^x+Nk{6;;hK!k4C=ibcE?5oG} +z@v5*>c};@nWr3%H>#xE7%u2#C9|H2ib#)RxJgiRgvHt6Dm7-AJ<3i63-;4hl1wR+B +z;d>@ISse$~B-9#gui-JD)bZF)LC8($wO5JHhh85aagrH#I=Y!8N5x6cUHRt~AUHR( +zucE0{%rhS!#6qj%jI9oi&8+P934 +zOiU{;!6;ckVAS{+jr~6#vpm-uGoQ)-U(fe|_&1W6k9+a&pY+Yz=6-5*%R&4P$x8@-zAy;lFJBMgfp17+=E22b{FP&37f0|Q4g2$A3=e%j +zhH26gkQZNtdB|5^sK5v=jSFF6(Iv?XP5yI}$+*viGGbv36U<6@0SC_X0YgkD|Iu88OBOIY1d#`fkaj<)MK +z)v4oyP7UX}44mrFalEyRBh4ioXsTdeQw2NgS)N(Njs{Ie%c#ukYt(R{fw9d7_B3hO +z(OkurmI~IlRI$26!>SeyFSb;~-2Ze7Q_UFB%=l#;D}z{OSsA^Y}CiX>0WK0~4m^d6U +zaWrD!?I@d~Eu4s%I2pBYDoR3Q3!yn5v+!xm!sl@dUnMMjov`t3(!uvB2ba#=dQ$CkCG*FsIdiyQqeZuU92)9>N#poe>dYP~z;;SMqE;_isQ4mr3t?BX8F)P`Kt +zjku^E^-w>`)kVXYhsH4%jpL4>i4n{b9vUY+G)(}_6CPT|J+w{&tz5@lv`={GnDWq> +z^Uyivp)2PhlJ^kH1F-_(AyEL*{8qO@9|GY@LJ-HE2CBTF1~}p)iC#?X($#Suhj9MNhkdT1$lQXtxtCmC{4pJ&pLi@P}occ&cOnR0P^ +z(!=dZ;MN3ibHYQ-q>C%#Hm;6aGPYL3@w0IYx7j0-bJ55Vu#$`J3e^-}K`;R(Wznxf +zHHE|@ATQD~PX(srB2sh^DcFb* +zL70TUk}xtHp-dybC@em4u^my*ib7`m1U(W7A0#FM(?#A?{t@~~NGhmeOrIy|Aki`W +zUKI&mP_f%V@hcU$zMO^ZgpU541(ubv_lN!`KA$KhR7*sCQLiD#{nrb&MfIUFL*JBy +zJ5aHqXUd1hJ{Jc$jmdXZh%7PvQ@I(e05?W#oJ<(l6EUzO>0(dH#lEDA{YejdlOA@& +zExgrT#=98{4O0$!`0qy<7%17|cgc$1#YOLwhu$1j7sw`A8hz$hOBSmc9#kh^vNnm2G5RkPjsZ8ovm12*WgSDLwj>lcx90IyVflECejzp{25UKcGDJqeS +zWJO~6NmOF4jGU32P^ox@V_`p(8f{8=cr)Q)gP%(FTGRo-a!es5Ayp$x5W?HRDAzOz +z2@##}F_MJv<9=y-K9UlsE#b!o*M*O*;m;F7aLwE`{Fq=nxJF0{iAtQr&Ih+cSWA^F +zj2N)ihY%bRAC7gCQ2E%3AX23rwL4$ypYULefiDL5SZVcih~Ffm_UIE)?Z6tg7L91aS6vQbNin^ +z%-~->%KnJN1f(Ur2IPh7TmtidKcAn(kjx07xiEnL@$sjx2l3}`h6I1PIE?x50Ex^T +z{FUAp9}m*RAHqYy7#aO8A&|s8`2FZ~A{mp(rpe7^U#;PIS%}zh>}-J$m^>c1I)TTo +zOyb!ad2DMlu&1Mf&5cu7er*a5Uz)vfckKf8;`OTcHPjLG-kCW)kAQ(Xta&xO7BxjkZIaG9%aVQHg=#~YP5=85_e9+oykEkL_sV#!PQx3moIft% +zWVDQPaUGvT4SdpN;=?u_@3&QPjD&`%W_3FD)oIvMuli>8HtX2eq~lPNh9iv{jyC8x +z+GyfnlPM!DF-~X5n1Y!AB_@pCv4OnX>RjQpcA` +z9iOFje3H^|K28|;C`Qs_;54HxyA2%g(nZCglJj;K36H|zE**zD2?P7PEbQyDWZm0o +zVNaKh-CY)TciGs}?TC-&K-9p22uI0G88185ZQ|XCi4##9r{gZp#vObVv+zm6!eEUwP!?i4MwbulR%#B_XcLp5XA9PSZ#9~VqE#pAjI1n9m5FhuDoB+~O +zkZ&jX4Q0X41gBR0Mtc5rdn +z79Y)*!;CmpV5>Uu>7ap626VxB*>-S#z{SUd4$cob_-Moxd^qajgHZ<`jJo(}6!>ri +z_-Gh7PYikZWC-|_aiwFx<#FKpBvXliCK93w5G8@)=#k+!%KLOwPfgkcEgw(WE +zT-4`G+@G?9P&SuUspJHsj~Rf#sAfhWvs_cglTUM +zr7d2tkjR@zDQ3(jkoHe+Xs~RIyXO;3z{2 +zn9^0WFkE)z?=KVTrVJpbdjh7+Nz$C=$k>;VqtI({6l@m!*PCJjpW%rzCaX>ljq=gt +zOH3lPP_`TlXf|#R8#tTNurpG{_LPgADPVWP!=AK-ojpwaqDkMx+X)jjqprkYGbp5| +zU?MApwm_!fA(L~_le5v6H!(oJO9AN41D6L~oK5Q3AJeftX<}>E#G4rdn^Tq$7m^ne +z6%v-9&x?eGK`9b@PvXLF+o^^`syNweXS +z6D+HAu+IOc{{@bEMKyewv_*O0ztJCLisF-8-K}9Y)t#7&bx{ZFqc+yY4ZM=lRADAZ +zzLJg@_?bM$o|w1dz=njU&XctGBxly@6Pe)V{%>6aa`RJb`1yo5$hev!TWjJRpPLQ7 +zxA0?rYC9kyf6E#?SMZo%pDSNCcrW4Y;MmWuAtEJ2hKf)Kt5X2MV^n>9jgKZEF~J)4 +z^n^)HaGq;0q86+qD&g(9#3g)gn!p63W3$%?esf&mx9>#}#_vwVK+q3EGk;*}=XQYK +zpGx5$-cRFq?OhkFeEKu1j@`KS5=Z3jr|YQl<=3DJRZCo2cxOmx6p<-oS#1T&Yb$uXwuT8=I@x+o9uB)WP{U +zZ@4X7NNM;oQO2j7Rqia|y|x05wHBpwW`DDW{VgW;HCs5)WZ-aOvJegrd>n5WwetZ3Eoe5;A)TP-}_X5s~bf#=&5p&_Yx +zmgSpm23~2^@p_w%H#>Cf=`e7l%ffpR2d85$K8>6BDrw`JjEis6iY#1CIk=i~aV_QI +za>~WGDF+vl7A_tx1;pNm^cvE +z1^eO}_QrIDxPd(}Q?N6xOCj4%DP_~ZeU4NF*cUT#Fy`P;%)voEXVk{qFe7d;j(^qRQPYv4kkfp7XPTpTcQaZuq~ +zn(v1!e8c@ALhW<=+hG$IM=X3ZthT=&ws3LC5PUPt@h}5l4jA~1#{NDXANOzBR&ofm^d_O;_#4#V*~7aaByPK!O1}v +zrv_cT@8is%hqFV#*;z=a3cy*|*u-C;< +z?~5db%1^JM(8CDjDo4;9>7yBCL8f06N#a3Lz;FI(;AT9sx*?x2kdw5?O?-&hP^Dnv +z7}M6M_Vls*vE(3L_S9$?6&B4yG#C%lA=^}5I4%~|JhWGtAO_sayQnK#Xs+0Z>JEB1 +z3dS3D>1aFQhFIGD6;OxR2eV~ny&E*r6JjLN7nIr}BX=Y=LRK6|myhmXQnwWeArWCLxW>{`5~6_IsBLXR0h +zQZl`+YKn@JXR=;d`B09htJoShu_f+dClkdo^vhY;m2|N)VPi*9$KG@qUypGFOnn)` +zaDkzMN*PNtxi4p+hw9oCM+1RK#Y1i0!-Y{7ClVFxi|E)Dcd6Z)uaz*I#$^hQZo~?%)~Qw6F-aG%tv_s#$&wk +z4?m}5a1t3SbY59ObTKA@oZWM3rWj-2$L9YQ-KLo +zm@tu)gQjbU@!I1YAKvAwQ{ +zmun^@EZ~9b1w3?<#AO0YuIGfnET$4e_=f)3DP=PRX8BD;OrE}7#7g3pA~Vy3#V0O2 +zFW1zT@bsM$p14Of#rMwmBu3O3fBW&fRUs>Z+A`nzWNj5s*J^nDUJ=Xc@>p6wDJx0M +zqWd})-Z!xPb{->{h9Xwh=kR2`jwk93JW*G{GYuuIZZ2Ug=RF24^ib(A@mW;I +zN9`4yY1i;>O9e-oN;uR~#etRz4mOu@xK)$*<|9oE3ovo4iLmf?vxy_khK&8~l$jUXYzR8IT7s9_OuXD~;^j6StJ_ViX*aQ+{+V_S +zhdT_s(@oEcjgOPAkdtpx7A|FMTuIxwlCp3$ZR1+T!nG_{8&@-yLe|1{9_z7jCCkTH +z_%3VX>x_x7G6ufPSokz$;C#}=hY17cQZ`Ppd@X6>SiFkEaUBQa8ur9A?1~xK5!J9g +zs$*Ns#8x71V@pC|Tb!nU3)^BAw#OI(U^U{){Qum$k4jV`Fc|#-6l|-DyUNI@pud +zu{T@AzMcRY_VpUr*JogVzl{U^Hjeh$IM%01I*<3cIML_fWIyo!0C0K$I6L6sg8^4? +zo(jvLi%*CF2cHf)_U19?^w +zzL@l-Mz>g6IAl5KH*EA74zjw3M8%bHsJ0wO>TEQO+h`oK&@yR@vJz*rcU6sTu{4r5 +z%)HsBYN6nYhl0Kb9%tNgUTz8|ZNE8eiFY7LN=q>_Lsw`A~NK8nce4^4X +z1)9pFo^@0wN>cZbq@Sj2OLQ#9#8?VR;!@!F70WUG*CuhHsvyM0R4RjP`!Ucm9!AAM +z%0B(3cE13UQN;A;(5I6qyYksE2!SbTaYK!SvGqQpD=$!c1!yfnLKNzY4w^Xf$Dc?1 +zDJq?e?~6S-dB+iwLZTwYrMB{}P-Pi$JPbMBbeW})7D+Wz#g{#07wLkHK9UxG(@$@U +zUz$l$z?=SQBH>31lWdS!kep2ujDXPiqg@>D`rm-*bbMT(p2+L-7|9d~h^dV8(htk{=%&`%)^(Y!VY3<0{uy9ZXdm*c@}Q +zG45gmNrw;@dR!a@77-^stc?I~MKzoqFmQ34O09=oOmXz%^XYNnXqg0}#4Pc+te2={ +zMSkerSd+4`Hd4XKjElA*pl1wd9JcUYx`a2Pn)ooppOK{R!^YZ#DWNOtVk}Np<4;T> +zTg_PfsD(G9F198h?_1I_CLk`s8ju&RVe-Q5Fo6kg2V_Q(7LJYuPy}W^5)-H~KQ%@cC^3QZ5~wdE +zEWxorg_*0s%u8VW(XzQCWphW#xF3v?1?$W>*(e^mM5Dh#FisYbnujir{YZhKA~Qo^ +zCcwTJ7G5s6I*x@`NAYOQ7#_Ypi3dfADdEA(IV`?DfQ|LzINn*t(bf_++|6TY%_JUW +z2_{L*O{SG8^=0u58u(`t$-@0G?1YhSn44;RjH6>u30cTv}t2Lt<97qve!CwyxO5-ReKdLi62JCOYH_;Y&Y>zr;S%SG_2~V +zVpS)h$^I*yI$rM3@k+afSK17$YB%s&hmN%!IyQDzv9+s$U0o&YkCgCsLc`gFj!)t` +zK2I9>DrMs9w25ysHoni0teCi*v2eY|!p&YAH9e-_dY>($UNtiEW#U?oftzU;H_|Sy +zXFXh^+LLi`A?@IcjDwGpCe9^HoJ?4FhhYE=1&ETA7}yy#u#JeD*iMy(V-X2MMkBVR +zENmx|Hg@pa%Y=F{Z(81Hb3;sNxuro0Zso*C8M9Fxx_eB5BH~B+?%j* +zcg)1SQ3DNQCP-o;B}G{1uOL~GQc3ZJc+edix^0W9!h|s1L`#{Xt$aT8@}!FN2)XDg +zxai2+g6^V&XvvlFs~~(p%=?-xC7PoCa9qs>GM4IoVX9Ym*+ysCK%~TkB^v{p?`!e> +zGjj9pk4$lFYWhZcDFP(3mgVo~+}3;Uv3o +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 +zOJ)jL+L6w!tuYd0g+U%uz@B$jj*_ul +z)57k!jhzW#tGt#YG07ZRZa*LLnh@yE2Jom&dT=+hIKV{V*Q7 +zJSxh|qwIvCs&aV>+~yeB!&k@f=+*IASa59uVJxhfz@lqoc#P4@HF+$kDadm^UNeNX +zbrU$$UBx?*3f^kU3jWA1P*;F-Gxym+sKRrktRbGL{!wFS9u +zm9OTkyj#H&_c&Ho7XQqX9P7GY!ixJvthiSaJbkxk{mI!?740(RKE({A8Mhlv9$tL(C|wZp*14h`!%b*yQx$|%{(9U5Nh +zFz|9GN6&P;EGmqFm%B~DE8QkmMQp5!SXk9<;gv3PhUk#&L{z-xYMLv%b*zmTSl6Xv +zeV2xfT{_iDY&SV^ab#W%+;%wH%xvVEE$0SZ?9h~WL +zahlh0zsHsRGd=3~nI0RnAjWlRCUUa3AzAqRqszD?#98>d;b0mus5?J!$ktB|h#8Bbk4Zlw|)wq?fbdYrVnD&nZ +zK9V^ruluEI<~u)&^!NmZ&n3i(<6;I&B-wJWeqMg|nX-p8TjEPhhhw^&Cw?XQIb<}9 +zsdGwYp}Hcf35g6z4aej-x~NluaWHPUU|Hv=?Funw;6r4}LDz(hK;b8AFPbio(EK92#$pjyq+bmBL+!|qfoJ={E`Kje2!d2krxv2?}lw0PwUto +zXR)n^ZM`mbP;tq4*wN!+Th_r=CXFRD9M2lKG43Hz0WJp{JY7DeB +z&y+$JACM5l4eX6nu_s|*ciO`4w2eI}8+(%ub|yV+NqG{L%!1yH>43bjAlMQg;f{od +z?I~bO#>J*2g9J3}&pLQ#5IEH9V*3wy-hLC?WGWyYGpmgaBv4d{QX~lK`NAY-?)Hzakq`m~5&SergutIgpYZF1kNxa63q6D9oU?BDg>yXr)7Q+XKlCdFMCF&(jY;6Aus#h%WaRfm6^XJ; +zGys*l*#zgu<7XUe{3V3L1OC=+AuuE{bBPQIOqj&XB`*PyA&DXWa3Vene>|B$fN3Qr +zL}bDw=8vb7_@}cZF)94>xwMcKt^r710t6%`AT6`j^F8=?cEo(#i~nF6nUDWuoU))7 +z|M_Vz{x6frd<0`;^AQ+DVibWPd6~vHgLvQ~6&ETmgTDHr_W%0r@N_SXbj64dX0{jR +zf$vp!jP%3^i5bJf??$ln(l{Q!I)NvzOknYqF+6g41dm=C#bZ}kbUBHI)0n`cRBNs( +z|BI~GCa}v^*fqu`7sUIrpk@S%uM7xj+23m5WYola(K6m@7{xO;$FPtl +ze->WeDq+cu2`sxchGjRWq}+1ZtqPXkDr5QWBA&Q4g(q&0?o2=MQ_& +z+1>GecV;wB4kv-|9w8*WHv(h;A@2YQCpaW}GU$@SE?=ohNa@(hx)j#dXRx6@i`N@-*w&cAmiiRd)y1)@ +zE`itT6IjuZ#=6EFHZ>LTdQ%Bon{>R{RKi=$Ic#f6VRK^~>l+hT*^t80#;j;rV-Cxj +z@>teX!1BfdRyO6Zsv(0l4H>L$$YN!qf)R0wJO^TT~PY-&qlMN1mX2tb6Q))H2=YXUW^ +z+jOjLGq8?oHL$kDz^WD>(} +z_3HSNGhq4*oar<0uFQKW;ZSc0`+G~+-BZN&o&vV@7O;gSWKwcgz=pmOHuh=QG@xVS +zAc4lfh5=Ku{Wmb*ebC0%0UKNUEo|#E@n*k;H~YDo*xqMid%uqD18lnV?!xKVIjCdz +zfQG$39S3}D*e~L+PsM)HIr$)9;8VXYvCrRzOk9oFxE=#;$4uNEF;O{c;vr#X)I$BJ +zj)pNEjpGKICrq?WIA|Sr&@$$rY21a%L*|Z4iX#_!Q$-7t +zB?}V-7$${j3TVXX$XL?*(v{%dS~ +z&pA+0z-iNRBY{~KrTSUegTW?p0$6~t#hQb@qJ^GfMqk!JUs{JRqalzp5G~mlBY3#LLidNF6C!;omTJDA;jl@Qa(h`MIn2To +z0~0)maiNAkCmpCjk%L5agbJpB7NL*eBePuyD{eU%j}cyYE?)S15F=$*x@w4LQ#>6E +zuJgsF`En_zhHla0<6gO$wh~uJSgs1o&D5@Dq!K@+h +z63f}(P|+#3&xdeA2ZaMj3EbZ%oGR>rVK1)_ynPtV9sEPN23K) +z4QJ6Xk%yl%Zy4lIRDCd$1sfDoHBquKR#1}q#25MT&7CU&uOmgk8&I3BTa;Cq7K=_`nH!?`d!f+lvjj>w)t +z6T1i=Ll$;1EsW`2l2m5m1aoM4vzaB9HQ$JRKP&^_|Xe~7hcMr;{l5tbIaveGWP?~&5@ZmbakFB +z1xt^eo$~kcwgo!oeO3>s_#AHkZzM4Cl-GHX^5d(8w}L8|!F!(P#3(1o5f~&8{y;$o +zJA%qBlE>VA9-FW2eBO^pxkbvY@k-Fj%gIJllu=`mi6~%5Bld1Ng6x2k_HR2A|N+KJ~%V&p#VNxqk7vAHVz}FsEN|+Xa?# +zknxUr@Zz~JPe6<7zWnwA!6hR4-M3Mci_lUo4_>(bk#k`frOX}}4z|2HBJy0AKYd3> +zW<*?=Ie@u7hUZu^c4HiWrR(CZ+@}8S>TkCuL9yS((_e2BW+r9k3wvJJ2lM=$NxX1- +z5-;AGz=GRT0x&D?$FcH$982y^&4l7lg;r?9qe3P(E<_4SX7zA%QZPHtjS_YO%kuwB<8fVHi;#5DZEmj276toW$yMeIxV$ntYGO_ +z9o>~Aw%4bzyCI8R^%=Zbm&V5W6jn5(@M=>MOPexSS5Ma_kL}Gl>}kzlZ(9bt+tPTm +zC5?@ZX{>5Y;kBlW453`yoW`P-G?uhv@M?1gOPe!NGPa^A2Tv=TbD&nVv#OH^W6- +zAEI-U$F=@EZVnc4Ye2*8J{@-kOx$1u^pJ_mJ_8qgrVN_oY?d<|NZHQ;mL(h>C`ohw +z?w&k$_9$27t$sFT8WL%_tzXBReXh7Yp!C)tR}F8letD2hnQXo^RsA&Y&b<=3%C +zVnq!c95QgsZ{noi!f84*ZXEMxL!1?(^o5`EY;0T(JGjO$fQW^PsM}{VtfOwEg!)kp +z&0_{y#tpPinCO_Y(K&6&5XymBV33LfeN;l-Ib_)bdq}zxyqEy`XMx^XpnDeRoOaMQ +zqtr5O$pFmeDWGZ6LF0t|gm{cZ`qu`Dnla%46QFQ#U)HfFO9CUX|1Wu}EHd11;DXJ2qIA7_bV +z829QRY4T^;75ib>Y|aaD +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 +z)nOCW5et$d>1ywEumv_Eo|X>M6K7t +zCa!a4OvJ=3&X9@dxEC>SKVryS88-Ici<#2Ae`lBgQo_Sn3Dt~e9;OUY6_d>(oK0h* +zBIckX>YyTGqatF-{F?ir$8&5dT&TG(V56fts^L*oLrtWFx~PV_sE&sMe+FuXP1KFp +zXc)H8G;E_eW}zi!qjkhW+o*~5F&iD@wzw-D;|@B4W^&Y2SWlLlB;#^(MgoAXPY55pNV4yNVqx`A0uN4%(ERyUpYnT`MKnF;4@_&9Jg&3IxR9Z6l1(&*;2r`3fd9UTS$Frmzg +zJoeFTDFJ;N&{lBJl($jOVSia0wHXU784Ep(aOTfWN6DRPPjF$1S4ubMlE6H8@Bqbg +zRlNNi6h{!e2ik*;V4V;$~0265GxSuY>6Ib8W$7by0egId&Y({Lj3xegKOiE +zvdiijO&;d})Ug~eopUgeH8GMi5GfeaZ$nsN>6(BG;l0T4?j`}4rv855sHixLbXb5>#m7#&9=I*x@M91TO#v)=aUI2)itPe6h6x(sCu +z^redENNQ+H*l14x?Xy5N9hVUu@A?Wj$}~j|pbVDDtE<7HzaUjTk +z8Vh^E7IuX#90-~?5wP%X7}08$&%q%dUvFY> +zkfm!T4*6^x^jX;FbKfUGz|iG0F@^0&m>2REb_NZ3oy^Gb6O`0v%Fu!Fz{OiV*X5UAD1affcq)e&4_>@=KE!x#j0ZA=nLmCT +z6R6?p>Ax>VF<<|4DJHH9!Nt?l92hz=;=EiN!C$`{#^0`u;P2N*MgO=l2I`+T$3-vP +z9L0;b#_-bZalCkE951+f@$Lku=kJWm`oi4_C{5u7x-0jl@d6zd_P^X$JuVCHO=9WY +zNo=T0U`urp>#7r2{$K`+?oHsOiYdH&e_DXWgBSvhCrKi!BGAlWQRNI4R?Xn0YKj9a +z<5*J3q_J56npZ31c;$Wy3o6rip(=$Jt0u9!b_6@yrf_y3kF$Oghr3JC$Fi(yO3t_V +zVO(4m0hOARI5Dr*q}A#|49m=3t4(8NO%5w-vshM}!K-y?yi%XSvbqFT)h4jMK8>C$kb*TQ@Krc9ha(Nn^q +zj=Yqdz1f_^)}|yjHYBm8fn{eZNo)m6%bN38(Zb#pB{tiyVNXnJUac)^du^*G{VZ$R +zN?6@q1k1muRqc7KmL~lY*0vNSM)^&NQ7+(kR~8@i5Bd7K<5;q;J(PknSTEL;iLxE^$HGvwe_2)Gk=P!Y0mKWL&l +zXrLx!pf+gWVMs@1q=c$SNiOzlm=qSFOw>eJ#%7@|YN5szk3SSy0y_krs+f(cVO!F~ +zI3tFt9=7ms*v7*VQ)$=~V5l87Q9Ep)Zp0FJs2OInzKt60$BJkg)zLU=pkdq;HI7+m +z9=FguW}<1#M#HF6CZK-ALH&p==c*gFQ8(sDKMaEa*c;Ozvd}PUpmEFu&sR5Yqi)S&!Vp?OwAi`&0KH-~d$=&JBe^aw9-c_HmJr@Q4%yi@O86i@OwbR2kb +zT5=ou^DH%T5Mfh4%eJzrNxnC2qMP9W2?IR|Mlc)bW9nDhL{HX1ZyxBStHO)PqDl#q +zsrPi7+-7`6FSq6#)MaecrcFFbmr$E7p(SUcqhMixWp9KHPO}Fv?Wmp;x+*MhVrf-e +zx0RdXx<3Lbo(ob26l}mBvw#spl@x^td>QsH===bcUuPJ9-@O1HnBHkh`4<)tomZ!4G~~$abOr1zduM2AOu))@w_8! +z3h?YF*!WHClf<&e4$i(H&q?TE3^Q;b0D0Y>p#t6+OyfdS6X>d$0zMtq@Ma)~?O_x9 +zC6?a80hv8x;Xs)2^d=4m2xFFfj=h8@I!gfyCpbGRz~7aE9lAX7o_t^TGt((5hnJ^s +zKZXy2hd4@QPD(kLJZqc3gC7%N>{+knaSuwK1|8+c_R*31H{_jg +z0OIkgAZE9~$zwOD{4;vn9(*Z~dGfhDCdZ==_Cy`*j@UmCfqIV%#q&QifyQ%e9)Gs~ +z8<=_L^3Lb2o(uF7IxkOiV19b07eD==?+N|vY(M79gBUt7>AijN^@_IQDg9 +zaHK1bLmfrzX(`}M2?WSsc|#H_>SnOMK8|h8N$hP;;dpNW@AejOs=tW$`!u}YuSv}C +zp7sp3wWhGSC51K3X{>0;&h^5uncvgO)}r*TuzzJ$n~v2jX{>9{U>)6))*RNi=I6Ab +zt$=my1+4E>F~uu;3wVwFEZsSAakjJ+u(Qp;kuH9oG(Pqh@pYKZ-=@qC`6R64RH%UC +z{sIp65o|QP)uUl^Pf>U<(HumHogDv|?*wjmqDPcpe +zA(DhKf=_n=Te@@D+LObZJz4DN&EZgA9&h&*B<}eA!6H5k6v2e9FT)zX4imUaxD-_l +z=+|N;+>C0tJ8a-S-H({kgJ?;%Jvfo$5rU5{LoPY!vXU1cF%6ZmqBtpBWt;o5&2y;d +zSBL5N=y(`0=0s?!j2NKXQaxE5p^R)G>mGfcboeg#tA%1E#o#? +z$0!S}<0e|hP3f0m&rH*ViIzzVZR0xH#|^Yim}q4m&A95PX&yJwIIg34%0Tn9Qsbln +zs%gqZ!=!=wNdt8gh6)WBb5K2IqH5ekB{gA*IDh5Ns3!AW7>#^&gnhZ_n{pWvz&qT$z~)7?ch{c#-o>c& +z!0--y#s_f{vk_A#Mv@1E#03&nQN);rkjYSYbq5 +zE;ZbcJw@_&F%;Z*`wA)_L*aaInGYPQ+=`G;4k`*nMhJ|qIP8-uf1Y>DJ5CrSSa@P| +z^?dPs0yi={$3~b#6>}Csc}L=~)%17|S_rJx+-D#lP;}NfbBAysG28t66cvE>WGvKA +z6>)Qn0IuWe1e8V$+#1o)G;2xJHB;>-*jtmO+d`OeRM{YVtFmeUWF*T(H>DusxHFtT +zL$`=drh=JJ!4j8`#|brjj1H3LBC(v3HxX`(XgC?jxk+Nckr;3|W{dMe7vT`^Mh9&i +zi5U2F%#eSFbOZw|%Zyv-V5wrlMpsfmtH#F3be +zqfwTlSvbxzF!s8H`5gAHnAjJ!q~C_AW=GiP!a=&yAH#jlwKA|jAvSo@+H_7OJxHum}~9P$lT}poXJEMVXy- +zC~V1WEzZ+A7-4{cjy+)wd&8Q12EGrSB7)K3h>a5w;5d(kZRy`R#`x!eBT>`*Y?L@e +zuEVsC@HNkgA5R3tSQO$~7No<^zle7v+HA +zfrkeH-pY&pe+OL3pW~ftKZl$~9>3m$haX$%$cf5I*1XT692DgQJwEo>8Jhb!Lyq)r +zv42Zoh3=6HE?jw>@KO#i-ag?)phny^^}0Rt+#0$!yXHAIJVqC1zW$ZdLs;Rto~EDt +z^mGUQ>vR|X(-pUWdb%4wJJo}qp6S6)KT!JF*hmE`zy88Mr{8=TK)HVVRS?wgz79R1-=7P^(;v=9K>hwgNc1d-Q2-Og +zpDq(txJL2kD>3}#YE<;+D-i)1mW>f;%FD-|)(hkH#Qd-qMwOFE`4~&cq>M~CG3;*< +zV7WVnm+p?^0&QbP2r^~x-g7Tp23UNvv|2mm6Q=oC;|)nU=}c0>|q>qQp&aD +zVM6xRn!v(`De0kETQ!E=O*8nwSHu?_J~*V|#P@X`I~x;NQ!|6*52vx@Q5*|v6IfK2 +z!7KGyEG4Marm?KfgO(JQ*Qc?<)$+Owme*ymyeT_Bn%5dqSl5)s*5))0bmZ|) +zua5V6G@R%vVt-o}Z?$Bwjy)=k39PP9V0~i>ueWBfy)%RTQestfQ8e3PF*%|VnD;u{v!7G7qRF2E5DtDk?uU+?4j#Y!0X+4ye?}2Tik(^ +zn|qlo#vzrIj`jT-)-xt~po9$rMQrL<+R|6R8ysNSTfp|dB6jzcuy3GEljQ46PI7Tz1NaB|qhiI{;CQ3EF;I*vzm9FJ%+AL2w*!@DsZ +zr(+sEis|@r#KzZS7QPubadpDP?P&{DaSKhH^qvO>*=)|_FkTo+oj)&JRY}hX%asbe +zi)_lBWL}UB5fYM2F;jPeyOOrdagiaD>{rRC{t`wA(_xW$D4aac2KbbL-h_^xq@j9W +z;%ufi(LQUTGj5_QZlIg99X2Gx92s2TP +zz{2V4oR?!bWm5e+?BStej7-+~xZ0N?p8O21Yr&PrynSx-Gg2JjDRPH-dfNm6PwauB +zxKBu!6Zd~02hq~A72)gUarIiJrtut+qK!~qxpv-jxJFnCCbH#q;i7|3(E)pa_;{E@ +zEb}ZEQ+-+lQwA>7B-oEd7&mZr%)*sP;OZ1`ZIq6Sj`oCwe!>U=k#W-!Iqk+XXKjHK +z4^rkF~S7Py$pO3)le~GqLofz&PG?#KxcwOSRFK`Y*b8}xH4hj!$=8l +z2RTsJkQA_k?3WQYhrKh8MKCx*po!SvHsR%9#1e7;V91o?d|aLvwdFBB&wH-7?X8D` +zj7nx1nTdT70|z1;=BtMH(luc!8B@S^6C%PToQV`sIi}p@ig6C+G;qLQ#6B02=&~>@ +z;2;%LjsJw9eT<8a5Jc2tbe4`2#v(S3F-AI|$>-`~d+#qlNCqF;kiJzV76o~ohnQkcc;Ae!F9|0H-S_m~i1}_3MW#B?!A;>%p +zUI;Sf@WSmmfH@b$?_B--x-u*&`;1eb5`bBBcM?nQO=JCoI5t-$ +zv86hVbrrK%es2n|R7~Qf%1J!`a2o%7CluT;mSF@G^#mw6(H +zFcMkB?b;+3KZ;|?qiL*bh~rRa7H9j4xG+$}`N2HS_M~vUEspK=ajdOLVELm2UU`%N +zoBNm7C$OqME?QZi#PS9LN(RdsvU6HqpT(+r4#Lb}RYMl58nakgpTL^>1U5G%vAsQu +z{atyuDS`9=03ZNKL_t&;zApp$@tZGhTV{;0-+VeQk +ztKrl@2_O3l_&kutXMqgP1WI^+pnwydIUH@zVNXjAuQwO4o{jwNEFU9$WJOZy#d5EX +z4Aym|v7sY_O;l@6w3*HM9jg3m6CtLvfDN4mtna2nQ@}c|9XV|1%(}15VhbUvD~Fw( +zdF-Xj)LX)dejV@j8#p^?;!~fEFNPd^Ib`FDfP*iB4n7UoIP16Y-jFUcR*nvqaA=@_ +z{R2hpi9fl +z;7f@dws9`v;9L|qA7v?pg-cNrmtz*L4BH~vj#{`9wMAE>7OqBZeCH`*;XC%zL>*j< +z*s^^&%7JP;mnA^;P1u0MA4eF0Y(dR#G4V;rz{g<|A4V*kjav91YU6a&#wo556Q`pV +zPDL%eA2sn#)Wpe{DFAYE#KJqnHr^X{MDN5boQzs{Cu-p&Cv3ao-BVuZ9E)0_<1rH_ +z+;j1~AC1`fd_>3BqXsV0Nnum{jD@Nh8+CC9ttr*x!3(z`cYX@Xwqixr>vIMMQP3i%G2u(IWo0QB9Vu~0*k@zdper)$Iwd2vf{?HQ1T=!14PSwCZgdRf +z4Gb163>IzpN)G%ShG_ubm+vED15rzXPSkJ^Wl5gyAfnr{dcfjA%lv&0PGt4qil9Z8 +zqojI5yz(jn1f#O&Lx%?u<*?yBM}Y<5K?N0fYlKkYN*yC)sQwjiC4l@uoaaM;aLcP$ +zV&y%@8%nC&GXft|)_4vBp_1v!mY$%_l!bbhiH(bQfe30-+rTBdfr|6Q{7|iH0 +zIFt?yos&CLHa;FM;NWl``^R(~88vY{sv?K!zEH=)CQgKOyb~_q+_;IFB+$!$6Dbug +z!S7~$7N|@C7si3JVGZvEOE?-R;c%F4goPs_Q>{@)K!h+tm0zS2Qs&?#V$DI#9K3`H +zCM+dWL9pC+;f!WaCC3Fc;V~He>Xn{ +zF^BkEmaWZyuQC|)erGJhQ@=C*O!E}t@3&maF=DyfAs0^OLjd>7;e?5Fbl5x{l)owe +zu4RfkI5bXa?i450qiF+Tp2 +zU!Ly7FHU#j=X74?0LBHG4|?!3S3f7Hl<60ATwK?M&P%zYLNAKO4fY +z2r!@d@N2p+W%|t*e*E@}0Dk*r0KcQ_Qm%6W{O();zbB-)`oo0~o+*}+x%%&KBM`9% +zMz+KF)5R$Md?|{*UK+;Vu0-(w;Xoe0_sdGpT^@F!CI;EQI)dls>$_n{DH+SjM5Fi{ +z`(bX3;qNz8AB@)z!}a-_<9Olbe!TO`oF6jmW6jbh?&B|dsBFs +z;BtT3U8k_9ViJq*PGIr92`sxmB_JbZWe<|r_#loI52ht?Y#~#}DyOipipgWsSWrEK +zg>2%ln!&48vslJbF*fu+RCxW7C!SCINe{s@m@kw +z0&lcuv55`+Eg7tD%}R5>l#{WftRssJ?RjizD_~1o5nDP+*xXSB9hmiOS@_6ri#{B(aMs6YVx=>K2F?tcI6Y|L{XrA& +z4VpMPXyDj@jw1s)4i4xzz*#NdHx29@EMbSM?Y4rwCpzwL^z6NNNc`PfmGIs`Q-t2i1qL9t%_a6}WaOyg*T|C2RE$HTUi +zV@NY@6gcYYNR)R&EgXqiI5O<6F$+gygcB3TBZl0meJ85p{g{qZ!zMnC>G&+BOLOjp +zQ4^Qhh&*B9F3ZR!f%;jXEdg{S89%HX5^2uQL&}i?B^yEB>E?x^G!xq(7%--mQ@dkX +z2g5li2%sZS0NDT0lT~oinp8bAjnj^rBQx!waoR@Hj3eS)877Cd%$R7N(qyJa+YDV5 +zIw}^r6P)|PG%?lpA{TxImFz`#h8L@xW5F^TN*t9OSJi*O2I^?WK!jyJZ0^qL2o&e0 +zCxMs^j7pi7D(Q;pCL)?CWk$TaPp2d(t`7TrY$XDQ=^*NY$M+#i0waSZejW!s9C9gl +z(G3g`V2UPunvL%Rl0+;=`#xYt%F;rF7?zUh%B2bG4m^e2ZMsRGIOoRO_ErTYs{g|S +z6y6)7*uPp;LK1ec-#f6+uhSEYd*B3e7Ey*G4t@cX4GLxI7MA9d+>C +zh=B*=8fvC=bY%esGVr_21g{~&3&EVQ%kO@U&G8O~SiYE1{U-jLgCV*#GQr+KAj2W1 +z1QV7XDlzzijwHh}0%;&fu*o@SN!qwEY2b9UghPx&9Pobvs0Frm9rzVB`G{k(0i +zbMPaOr`)Z%W3H>?xnAD!!y%Ttxe7b7t$q*cnEYKsgdReR(jk@>mg%sR2eL%a7AeS7 +z+upImF$WZfo<2=az>W((bngU;1Y*>8i=~D0#qS)C@f;qgJZn7|1`=&pp>Y=i|o|z;WLLxyMkWAk2fYxyKozF$~fEn1gctF_w*$iN~m4e=;cg&8I&6`m+K2>eGH% +zx&52Z2j}$LFMObQ%-iPr`>*_>KYSek_1mxg0x*P_a*!zpnE$yD#?$ntZzA~fw{%{V +z{&bQ1O3!^8#Xl}Z@z2XK(cdmd;py*JV))zDC-wL5hVhSUBO-49^ZMuy#O8hvUV&Ld+xX}A%wlU*0$U%xZjdfbPNvXrYffR!!x?dASU$GAA%hi-S*&Uzq$IGaaTd#) +z5?J0C$Lhv3R@Y~+wowhKTuC>kIVUM#YwB}Y(~!m5#tb$zB(SqBfs=h{d^nVoUXJhl +z7A_9z_-v>s5yV^DX0f3yCBrP2HAVMAvLTRJpsZC84o +zVBi!r?#(2mDIR@836MVXx1`-XWzuLnf4T +znf1b$%yK<`Ts@CTHrqowc8E0W2zk=6J7ko}lxR;je(njIlCHCdq=||t6Vh{l10!h@!zl~Vl!b7{k|ZTgFK1IS9Shz$W)e~dBY-mw8j=9Tv +zcEZG^DH}H@E$Qc}Ni*(Py_VqvypU(F2+Oo$CZud@i1S|44u*3KBwe2R(TUZ8uc0QFM1WlP1W%4vM8`WeU2FmmlM6eoO>KzK)W=&%Aw>vOP`SbG`Lx&*8Bl$}Neb +zb0Xm9_E7l=4{jVaFYqb;O$ijr&ERWQ{|ZAC&%I+r7vq^AZuVSXNqJyVKLvaxy(%hsif+Q;u#SV#qWbTmd!a9LZ``srmXi@)P6X*% +z1Mf#2yh9h7!304aM_4-MIyVFZ{&$!<5h%J+Zr>oZ;W)#H>h8H*fXbJengmg +ztY3ZHhhKlvKPT@0=2HSqzpUK;?Pr5?`rYR~{FZV-hU@RX9Ga5{GF&~F;rhpO!6)?J +z=R^4K^FjR2h0vV1?;ZQoH{m&e`7_-Y7hwMKO$5(f4CAktA_6kcUl|5PpdrBg?i*AkK#Kf +zOKS^wx5+C&!ao%6Tl~4(n16h3G&*S}`Bo2Q+sTMj!~a@g3M!OEs2UTcYCMQaLc +z+tb+Ek;ksi0uFZ@_@KXtFN3-?-k;;t^{|OA0vbLVR6hfUe(q!$SbIi>S#qG|=8haT +zF=4E;fQ?;D5G!FL8}qyKqD?(Hyxx-+vBCb0-n=y0%XUuzZ}gP#MvsO!dkwtRZHcz` +z*m$GY5WU`~O262|?=|vo?knK+o*cIJ=CHLdhi(0NZ0pP6&HlXTt$_lz4;Ha&pn%=| +zR1tdyO4vK7VgG=E1A`_G4w^VTXyE98E1!wOKE`7jI51>jzb7Wz3>h*E%^Q^F#a-@V +zd?#Z(18!3(8!S0AZO9#9>C>^-r(>Ta(x_%kuPKx3el~c{$&wTsCfQK(KVvq}GLn;t +zH@vIp0*hGV@;`O=Km6YRoa7FnjiW*S&y_OeB7^_4eJ|$V{TLhPi<0Pdeq3ExU!62@ +zgYL<+BSYrsp0v(7;-0V!Yaj~@@~*D*lGt)_FQqFiQAq**lnsB%fBj+|j^BC`T^EfY7sjLez?tBl<`0zB8 +zvN7noM*=KvoG}~nJMut74yaB8cay-483&iA9b6b^Uyp$+6FRPPCe5^l%7lqWSzDU% +zyNWgl5#P_`lZazN3;R$AG5rNcO5r+_KudxEXP`D&LVc!$Hb&I)^Af&FCc>5@j>(`2 +z^cp~Op8Ycp9wlu&N|>lgXaZB54b!Uu-wzrWSA`{Ed~X5^0Yu8l7%EUCv^)tegcO#X +zdGf$SUc=WCW<02IA;g1`e|IH-5G*_iaCqQRbl_u8jtd+D5$<;RF@XpUf+WI^r#|SLvIQVcJI6r3N(wK%j +zlbR%Uv8<6UBENqGl>zCYGT_Tw7|dA$DJ-e<)WhDaw28iq>XG5`ft=$$&SM7pvKsm_ +zMf7Jhff)rl>fZ!=s%|H2d^o~hGzvIDV2L?6Ib!3)81VKOFR*MJ4Hxi9w1j&THri6W +zi2xY{%d|k2dlI<6owV@5a0y4kMR8J&@_Z5CNJQNTIm&*Ts3qbB>EW0XkCnqqIhc6c +z-i0hLZoTJvkICxYh$#b@`9O0l1RM>j88rv_yif_J!X=y=wQzqLsGJ7A8!6#*u!w_0 +zwj_~Bq%%|2Vj2#_=mHt)h7Ui7_ny2d6f$r!Y~xf6cz+l!yy!R@VoKZN&+L8n`Rjae +zng6)AU;aEE^Y*#@0~neEHy7Yo*5-nfw|eJ&;&)jFhEF@r*Uo>PxBs+Nox{OVrq;QD +z;d-uIvXzMdvN +z&R(-06QA?6*Yem;esQ`39>fr21ZD^{bYnhHz~X^R`C1Mw-Zo*yQ#r5@TFUif08jv48g^d2QXZ{W8V70jWN7u|?b+m*qA)+}~3 +z<8v7Sj}4N0u7Pbnv+F^#p&SrL0%R<*>js+EoRS*&ekN>~vaT1qn8Wo=Uy +zYg-c7+?K%J);K=s$>5v8JgyEEa5GrKwLk$E{ds)sFX5fO91eD8v7;l6O)VL$ZOLMF +za}jG=b*yX2V@pR7Z*>;L;dp94rU`uyasVj@k-8pRTq4H8zwxy?t&3$M5 +zz_xx3+xj%T*{5TBpN_YBHSD1JH0DX)vW6j~>o1Nvkq1mXI|kfSOsLYL=hF#0_co +z)p2pOi1T9_z8*7hepHvxfNLWf?oU~$_a@t?0Sm+?;h#!Hc~dOTmB+&T7$t?}ulLW5IH+0aG38)*Q6tlv~48 +zvC6oGN`hPhsAnlz2IzDX*ZNtWWT-p+K8=Gb9kgaSJW#`9eQ_) +zou(XDwtP3c*$0*4=TzTSZ|#=PNcYo3p9?xH4Qww0H5uUgv?b-8@BRP1z2|onXWH#O +z|Jym|nQ@%xnemKsz!77x!8ifVi7X@`az-Q(B!mJANJ0`QqJScjI;(THI#=4S_f>U^ +zLV)La-m}*Eu-9F=s+*R5|7u@hzKEZF27V0Ku(I0=?DAOH;nA_xt6{sRh`pX7E{AQ0 +zWiVl(KVhObVc~}4X8~t|CMvxJY+EQ`t5gruv3YPX=dBF +z2vmES`d5@Z*ApA3bz??B}Fg{qwvXdb?v*Lm6`i7a-at=h)%8 +za^D5pW#aJ+*WJoSo%ikofST|xKcfQ=YP)+>$GEq-LBtIfa*PY++{bYrbC_0&|1L^u +zAJ=)jx;IDn_rG$V`#3H?Za=T_kQkEuTXN1(&)|Lzbzk*6dHnbwv?%vSL5UjO5aK?D +z&WX4u{{bw1rpvejOn&jwO|iEtcu@eteUH*MFYjml|I+XNcX>a4UonU$D~9nz`4Il# +zK+Nwehwxu6fT8R1UoPimr3<6LMUBdZaf8cB_k|!s2j;2AxGw}4<-jO#Q6m9{Qs5#^ +z%gGu1`P8iFFQ@OpEjleWz|1`WFihnCE0gz~ME-xCox{H`c<^G44=>bs@j{Ic|Elrg +zc>$RP{G(=eaRzw{*w0rfT0ufLakrmg;mF1yyC$dwR3pC(U0}* +zF?`q>#j1KAUaj}p5OXakO)Ot-4CB?tMZDG+!s`t#HHPp;(<0uu9>E*U5dj!N%&O*y +z=*{a9*b3vV7Q#{p>slgM&t5Vu34Gj^!iQ~1yw?)P+pST&)fUCu?J?0i4zSp+OB`>v +z$MJ4^9PhNo@h;D4PvgCgG~Vq@f@P22xf#N{T~WN#Nr*|}-J8sFiR0~#2;RRD#hUgA +zHg+Yj<8~5hdbVl0EI;U)akpT$?bX>7ciz}lNJtd`KS +zq?9#&zc+<7Jz0FzoyUj0OIUp?fz^F6yx$kahkZ$`y`9EKw{o^q)04x8-5G4?6mOBOfGG4&`i8PMRWTXu7@q4ygb9~mo(J37V#)~K$ +z%VXi1FiK}6tEzB5v9X)YF8afWi1dSmm8tyI?MN?@VlPO(bL^%Z3w!PG%=hsFqAMbm^3kvv_xze$v5MJ +z{ESQdjKD31ucb`fNSJ7jny3%!xD+yQE@+@Sq@#LK$GNbM%P|9uDVBG(aGO0`vL@~p +zOdAI1dQhC4^Uc3ZQZ4i(fVQZG=7^5^a1o7B4J~YuvhQ^*ZogS?O0sz+1X_lR06}N6Xkw;lV1{`uMN@!8LeWZg<4eNLFhkyoT({($ +zaSgajK+>#b5xNL8l!TPI9F~=?iQ5?wH^d3MqD#UY5BD}!m*Y0Ik3gWDj+OAi?P?qI +zcf=`iT$Gir$w-#rQl^Oi4iCtI4p!fym`z +z(wZ=FF{t6RpFN5!oCpHP0|rh9bV2U+cGhdwxLA9(Qw)X|2_#L +zLuo#fDe%wm$030k(*-mZhSQXN9ARZB$0Y+TOD5_QCe8+m*z3z4{&Sc +zx#~WT0v!IG5PAe){?8s8VhA#Ss2Ic(j>M7KJB;7ERdolyU!gzj8^II%M<39W2gabJ +zAja*yxR;+gLXffbH1l5^J#%alN>3l36!(Py^Eikhy!^?57&p8uFIUgtuV-c@WQ<{B +zZZU-Hx$|}z<-eV`^I~4T;K3Ugym;fn0$#0|$ICTyc(G<4|0d8}^x|KaJowiYdwlWo +z0$#rC!7Gc^^vIlOdj +zUh-XDZiwQw#zo0*d9%Tfw;BTCy1dyC#T$(=yxtfVCx-bgbY0$P4vJPaha~UiE#|(o +zghg+*MzE@75%0ATD&knz7RSe}aeUYok=&HkZDEMoqjH36)0qUt?W;R@Tm&EW#IU6|f$alJI5?8U>G36;C(KMFMKz-- +zoEc5y$XF6(BMJOCl*Cs9X>4HVSXT;bx>HhN>;v{`VS;^c1|Rh>HzkYpy;*$R!|<>? +z*51xbua-4^OZeb66Y-N+-=vPN#NNMF3y%vJ&{4> +z9lJ5+=Kd7c_b2heP!g+$Q&>Hi#@c}_J|4(n-R%@U=}+T}0fJ8k+sAXLn8@JBY#yf= +zzP3=prFk6}=M2=$XgD{e;n+kT2k+)kHIc`jyIJg_b2FR~$oYOahi`_n*m5U_O(S`H +zap%6i94W}QEu#f&8L{=vC@X{6&|<@j4KbU?i`X)*xm3cY$pXG~wCUGb+2#kN<7oyg&b$vl1}v`8*YQSxE7Ghb##$F6A|WsHHI(nXb1I;aZf+DsYPGtFu?B`G?< +zbC{6-^GsgEWc&Lt!iI60lhDtk{v3AA=CMceb=cur!@+6xswv^rd6#S$79H8d=mxEeI1FAFOwo%858<1ui0L6>JdHkZc{hNgK6IO5CWm@kKm +zp*(6Mc7l3m61bhVLsLfCPlaJ=3@ckQCHFw(AV}=L#P&l<6sxcqd1EdUOFN;MNyP(H +z8j|zE7=8IH35LL!xScX_D`|*&S8>ygh!eTm7;qtC;8dt2 +zst$3Ir=upKqc*Oikv&)lLMa=hBxH?Mz35=%?Fn-Kl8KvX12pV(+|;9X=CV{RVdWirD4Tu*+*<6`+N!~d^yzlOkST_FtHuv%l +zR%l!xOx!=-{W;b0wmG{RoLc9|ZI6=s7`3d&v4L*yghy5TV|^?QzZup=3MH=jhz$aU)+m$jgUE94BRzr3#tj#4w!fiOL~7Svh2f +zmhBzF?;ZW2Y8b!Y_ptu3{|=rwF!F$&JU9xaKOAIU%qX5b%>0)JrND)w8(g@o;6;tk +zG7sk1Bsl)@#Pl+(DA&b3El2Vs%`KVh +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 +zF+hH$ +zCznNqJ26j%jta%Rm_d$I(T1AdjGd>`5!cX}D4{EzDhCwlWtY~Yn1PnPECcu<{ +z;i9>GZFP^Kf`yeLAjxyMM;Exz*%@@iYFrf8S)uK>)X&g4mu_bm7H3I#6hov4j_&=; +zB~i!x*4Udi1Uw0!%vI?k490Y{#|(6)P29{{=*d_D3oO%380GgRE?CyW)iiJ+X5o0q +zz>$E7Ljem1gBFg4Oq^P@a4urvDnXY(nqdf_h2D&b+e-{rG^Nl(Z_2*D0uq9XT9#4r +ztL%R}=2_h&tU6-Czgp(llQM8Cp`kZk5|@#`k@gf&7Xc23OziQMu!p%UJ`0t8pdtY5 +z=G)(Zi5(#mI|DlQ`bszxAShetNC53gpf(AdjcPa?&`{~oQ0Ad?L-^r2CU*NRad9d< +z4!{s%91&u6d(8*5i$LL$4LbI=oeSDS``r80d1VVaD7DV>lp^-c +zYdGVh(+QjnnmFn&V(+|$oy=C|2F1Js% +zJHI*JPhIbE%J8nY;+#%K+z@R*uf!+b+KiJN(;oYZ*Kg +z3=u|rj-2J?&&zx9{1x|*=XlKa-#t^&k0ak%xzV|PLQ>G%Zxd}8vE +z`pd~Fxb@dl(@^>w!Nt*Y)wB5fnR||A@b@z__{Z7VhxE^L_dpR;o`f?8Wo<@Jh{`z{^{;e!O=z=)lZ8UcWSlH!jZ$h~BtL +zpz+~lChc?iY6x%CFWS9d*axP`hkrMF@LHn}?_Kj_eRBYt+ZXYDcLZN`2C=>+fYr@G +zyw$jf)lDJ1*A&3J%|X1=6abwUC4rdc`%Vn|!K`WJ`XW|yYzyPP_OQSVmkBl0nvN(w +zq|4F~k&0jhl?`3dhxEzK7?jlh^<7aYeS9;DkGo?M>cx<+PrIV{ygQChdblly^|unD +zPi`ggX)l$*hFf-b`?a@ISbIBxPj1Dq<#rr92GclrCy!&JS*d1rmSvL1mvD;J%?LMR +zSzDud93L;>&`1H5BU$ViTEe#j32Yfi;PZhvJ{e$zvIIWu&)Ooe3{hEpKAgdqLrk?sAMd<lJPs4R@Nz~-k#o1vG5sD#g*MiyuY6!8MuOX@r8j^d$ +z{1c_C0YiEUu&+R^bk){y(QAroJO(I28Fgm9AUZv-;rJX~86Agbi#RZ6Yu`PFKon4M +zFOPk*S^4}Nm8$OLu0?3()w^hlSQ4292lzZ)e5RO*E+#;W^J2&46HFMN +zPhepqNah)|CM`523^c?v$ql&>F>yA;{u?EncXYvDLQO!E@!U``HQpdKd0CoKWEhNvN-VCNQ@w6CE$Wa3;1QY!gE1i0wr%hbo2kWU$?O9Gcu +zz@;SjTeuW4QL|{`e9**&5O8VHc7hnb)5)Z3hAQPBRDZ$30GnCn4D@GB^yTfG7y<#^ +z1Lnr?^S3#U4jq8*9OStEyotda!>M?l30_OC=fI4D8jj4h8O&S%K@L2zqMDOqvT~H? +z<1;#9_?laM=Kmyt3WCK7u{1R0-rmh})JvvpQ_CC~mdEdbFhU@03YVl8Piw-ELI<5o +z{LU@;-dXsdGiz6iYi6n81YuVbDA*e`urFZXNXWv;u!)+8iMqJ`ebb%cv&eI04D>AN +z=uR2pe$ka_XBSQE3uxFK(6EbcjWbbW +z*cpLkuh&GS&qRgK#2!DTi-SWKr`&7Ec8+^Ix+BxIthU`B%N7VoI(F0Pc!UT>++I%D +z@RqRK(JoI>iU;iR6tQQah%(Ak#DRHMECenEAb(Sbylk$U!>;)ZcrQW+wcDeid_e;N +zh0nU3VPru%E+qlBeG58{cuXAiS~$31N^@SGQ$`6S*#IN?KVIe$X>$EN{5+4){qKVy +zrY(Obk2==9-+i81cAulRaddCzGM`s{-p7sZd#yZQ?XzKyK=&AV9t75v;K6kTMUUEd +zf7_#f1Mc620_Dez_pfEzVBxh#1sm@DYT3Py%X|C~sqJc=qkEfLcAuk;E%RF_3z*mw +zw3fwnC5B%r7*P=N$kBl$b={RCzX$v8(EfWY4_Hw8-QTMQ@Z8=3{IUENo-XUdlY9E{ +zL^%`rhwxP8Af9$ah2l?BnNS`Xf?_2S(+AKts_$2;}+^}4`|?aaJ>H6SqaN__w?Ukl)+ +z#sFSz3gY!^eyqB>fcLM>8-z)MJSUYPg7{1*i> +z3>#bBN{3}p684vq_S+Y+x_uEJxU}X*7|UvpVoe9b#A5ikGlunDact;}3&?!h6$ACz +z%{V@HiR;wHZd(ML4URT;#~|vBV`Fa|pY|pMTt2&%f)aC6KIvP+1}4h)FX5BEGzd6f +z_QdebtvG(_i(}Vt5_`v%a9})xqjz&SeK(8h@hr}arE!i;G)EYEmc^O7Ih>HB`7A2$ +zX0T&?2|tY`@!d!QTLzb~so$+MwhX4RWhjL$L-zj7Ls@(|OgANqjShT#ekY4Be+|NC +z1I+L5#PG{#3_I_pv1cNSy^~pKp2;w?b2A#MX9_qmo5#`V9QFy&q_AxyjbBEW@ZIPV +zzWudv$L3Kc=i3STY)rXjWC>r5r10%%8sCkv$z~cmdG0hP^LZRypmU&0@&Pgs&F{EM +zXm1D@Xb$MO&hGD2pd|f52rl=PN3$=7>)ryIJ$W>G^JwxF(CDR#Xz~})6eyz6Uy!jm +zSOTT4#r`9*EucI1(r`V<>RE>5sW4ZiHDsbS2(*P9G2|*_E{loxqOg4q8{Rd9?Bw`s +zizQs8=n8~QTnU?~jT*QbxvzRw!g9nACGNXMMKv_>Exx?T*U%a(p)GFWMhxhTLCO)| +zj9QWl!w&Vg!WMejsXoq5)HY~zMKw@#K@@QGL^a%su&ce@*`9eg-MmiJa;^!x-$+77 +zTiieg9UFF%kJ>pq-C@&lQ0T7ME()*F!)iw{;3kU@L?I=ETa%oS1I-CrO>CBzupJF1 +ztzU{+sEL}W39}KThBKl3vZ{kQh(dXs3m0)EYDg&9b-FPQ^r(EiXoy?#y`PWhIJH>Bu}}fWBL+^!fYWi{T*RJ0UXB8y2;CU_Z8-l;_-|Jo +zHE<$o;#61z!RKPwl(*$g%vDH3CeobT_YpWKC;X^4YoaG_p|=3s%$w*f*vl-5%*k>$ +z6Z+-f)kH^(mB@fDZqEZf1v{69AVi1|=*d~QowJsqqK}0ER){W*f{y>2@m9{lec4b( +zFjMgHxUq*Y=7^u~QBwN}Co4smpafj9KxYnU%RoZ#>cg6Z=e49Q++cs4457x9f(Wf_ +zIGF|NGQfo-a4KxzSU|@Szb*iCbkRU{)Iv=hXdp1B0m4r=0hh_{NgZ7&9i3?%U1@@b +zxeOkJ4uYuy5j83x;ktqr>DQAmWu41vJICdHDWD|<)W?D9fR00c1AF~C$`(yj1`O;C +zny3hwC=Xev;JRPOLBED-HlKCE7#mZ-j=f$D2mA&O`Ar;T(SwB& +z%I9q;A*66JttR@sCc!{mTaE7hYTNR6;UxrU0z`b4$LcZPm-=30bbrSWK%)(1W%9iD +zp-;h|dsL9(em?cg|J~7ju3G-BbJZ~`$Hzg5+P?C5wXS}1966a+$GgYJZRarx0Nlr` +zWwlR@3J%oz<3=7=5rjyc^Pk4YT}y3$)cM?}?xjX`-{1XfZy)|u)sN@*4dJ<}A^fFk +z2+vdw;;HgMJXt=7rz!@PAx6OqN5TvN=IH}>M9O`U^@AfIyeNPn#JKhB;W4=N$0PS0 +z7zHyN2{g)yA*d)fMnQ`LnEUWDiNBtj#NSR&E$g}JX>ncXyeO>%83is1TK-K~xiF6x +zD1nv*ftP>P*yWR1eT-GdSdr|ti}P4@aUSp2d9mi24{PeZc(0D&;=!sb^LXou2X9|t +z*crF`@cvalR$mR^y*fYMx$4K8*SvV8egQAnd+>UF0B_a>uf8^x;*)OhZt5 +z$Gm;bhqaA4_zrnabcSHNk=a8JwHQicU{v +zacG(@$`UHZGuSnn#m{%L_|hvw5t5 +zFGg7*tbi|n4V2$}Cy%d(3;6y{7QftCLfLp$s*D|)%H!Bn9w%p*uR@^FaC%0=saYLI +zXG%CYRY28b0TmN@lus5VH)ZQY5kF28@a^3Kn0U_;$Wl>kj6GlS_--tRAICHJWqb+S +zCo?D`*i2_|XgZ7I^F^GIuqYih-V!ePN~jBHsAs`|UzBsf6p{5}G3= +zfsK}!hL#w++G}Ww>dR`4TA*4Y%!gqWFaw=2mPIzuDeJm4e7q4eV9S(=Eho3O?1qpX +z3`>&G86E9$P1G9K(3YUM&xVd0aZ`Y&ogq@JLZsGXb~qM8vZyxRFK$XG4zG73p`$ZS +z*M!fbqmv;zQ937lRui33r*HuCd18>x^YskBi4qb_T#6W|32V5pXyCk~vz$0C>Nve< +z;6zZv@n8wZS*kX~?IzBJEnJEMwNc<|6yV$BX1XeINN5Zvm@*0GB$F;n+RoAGNt@D( +zqa$fZZV5xWYU37aViu|yE))fhgbbVvS~yNcfDz9;blw@O +z!v;U%EYiI +z0v10@N5YWry)~|*HEEzdW8sFA@K0bM^biiZvX;0GbROtHus8s>-^yCji{?=-k8*to +zE(D#&={}fP;uN{p-OG=I6mC}#qDEF;gb$+>O^%L?=P2tp~!t_-KD!?n`cpcBSY+7b??qcdfQ1H^4^wKAN|5nUmrc5dUp +zwd|w2$OL;!`T|{A)NnLV!al!-ihwDwQ5gXC1%axdDZsMVugU&HejUd{rhr#{61Wiv^SG=g_T@g^{=U@r=6r|z9+j4l +zb)WbDaM}GkQ4@7FuAHz}(n0iF;wExb=eoD^9CiNxWOSdWuFKJVZME#axBD3Pe*PU+ +z5Mo3?Wr$9w4KhezPnpN@>;k4MHpi22jeyP`iIn^<1vHd#MDjz6Eci@%(lcu0g60hd#g +zc<%HR{!VCd=^tli@Xxcec>e4(o)yzx6 +z{!32PF;*TEh`Ge=b9n9Y9Nw<;VD&Y>K+FgA9=umKk9V%jVbvwNG6WhQ-l_}WZ2=e$ +z-mmwG-n~kv#fLZQy%1-nK7iM*1@QW{0A6bd;I+n}h^3TQUGw6tdN0pG)$b4h1po{QwabVVdwj4sQ@n=yQPGcKU=d3OR|bjL+scE|B$cLJNb +z6ZpK>hMA2$wgW>KW&?Gbxhf1Nvt60bdXxBquFLI|X!Eb7XEy&@&WRZ|WD4h|)6!70dOCwM +zGkF}J%Hz;f4*MpvD7%}&*3lfkzmvhY!x>4^-#nbgraMd6#18l4Iq7o0c{DFjL9qB{ +zG$&zV-`q({Gt2KsGZH?=GRb9k^Qf9EN*>73nY_3%XJ)fFJDoxGOiq&VnUGJ=IW}F8 +zWc+>81yoMixh1=13fMN8!!HwA{5+Avk9RZpemsM3$1?bCJd3aIvf5Z4-`=(RwQQRz +zVE0TBm9r)6pVx3`z9bd1PO=Ayr-*7+So4-}&ckY3CDiyesl0W;r=iBL<0AX11PmEv +zS=Q~QbhQB;SNs~T_}Rlm6LDFsUk+-x!jASK9d$ul5`IP?3Yn;1)KR}!Lj9tKYhhar +zVGRvoU36`cqakXH7}86kDPp2oWJrh-!<3rYLnLZ}`>sa~v_zfiVzNvaBK#O=jc5Wv +z1R;V_D}jj)O|&FETLf~VI@+T)(6q;Fm?6Y)xm`v}uGb>_EHJl&c^>SI!p4*=HqaQh +z&=6+z9}~496PH6KE(Q#o3+R&Y%%ta&0TagqI!^cvTLBFxS&lZqQpFlh1&gQ-7Eu#6 +za4D>#E@FVd)1;m$Vckx +zWXZ(+CM%ZZfv&ur;Ljv~icZWU#c-;;4K;LjSn*6j2Z4p|j#NThF%p7Sisw=fZC~NE +z5K`PQLs*f}Erx6^hKFT~E69+<;I4%Sf +zp0iR_0Ta}|pk)J5z{Flh%8l78t`FUv`%?SVxDsBtuJ);Muh-tDCg%)Id+<0D6&}I@ +zot_f*`7|8#m2f)95KIfl{U-K14iudxg3CTWKXX@n9PMHS +zroI>ZzNO`D4;;_$%wy*%apY%}@6n^lxR;KZ^IfRXeZKoXE4M$e?sC>RVRwHXS!QKB +zx?!$x!iWCNo$piKQ;q6#^7-W7JHX%VqvigM@i+Up;~uwNJrno4mw)Sc?pyhH!FB#! +zJn%ezL$;~y>ThRx=acq +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 +zJs!YIY56+GEDNM^9X-f+YNtnjhkgos-4t@ +zx!intU{fW-^=Z-wtnPBoWGBwRB>fQjSW!A74X~vBIYJ_qU>lhj;DG?*DX&#|L2QnU +z+=|X0bLx$b>kW{6)WDKa#d}_mPesa_K?7mN>Z;SL=EX5}@sh#8Yyc4TjS(B5QKxEj +zp3Jwo%*moI00IN0xyuVj*_c98BPLSxYU^F-`VLz+c8p03?w^mpm&vnMmX=YE@}h!B +zY0W5{jrpfgZ4^i2g5^Wk$pLpWCZ}kDI>bW@kLAyh@cN +z<&labl|oL!ih@)o4SQ +zw!|3=K|}~c*U-=qMB(_7_osct!btsbzgxIy1Qxjeyh`+qew)^sVbDcQ@Dy8@iI>w- +zXEWeqeGlspuceM0*|)QqThExca@%K(#!6>Wl(N=V +z9?Ps_Q8t$=sX!ANy<_fkhe_S7mtI?Hdf=vHid{f`udcS*hFVtjtEO7lBT_cX% +zpAY#Yt*x!$Hn?leE5ZjQ?K5@CFf>6#t(^dnsTvamM_*3^xy% +zOoaUj03RU02OffpeYLlbMYYFntHar1n{sc`I?uP5umfNREpV)JvM;}Csqu8WH@L-U-0CZ4v&*rs1;a|#$dZ_ksfqL@Ak +zgz$Fq5^igcKjI*WqwLY-Q0e;QVB5}x$Oi7!;F;REkjTYBhIukVPTEqV-5wc3&lIGz +z7tOGO)pKBh;OdeG9%2;KM<=Z=hG={3Qbt7-fk6TZ?fAWHRm9)_L&vUZHdL)a33?i2 +zB@XfKu9YQy@7;pronPUR_5o=fikac%8_M54i|(+{q6Uz?<3QqjI)x*pl`3G434b{K +z==zsX^_^ez;C2$tFEJ3SN(jG;N<-ziPR+EDU?G!3^~${Wt!0{&;gSM(wR5SW1E&+ +z4t&96L80w_forPEivAH#UQnV(?zau%I!Md +zd<~Rnf;LfF+1hRpFJ2;!ab6`aez)?U66%kSNEt+=$vVPOWHQzw2L71DoR81&w7sve +zqHGEgk)e>b%Jk-E-3B$+aF4n0<1|lLQRAfw|8bmwgj!|Tzj(Us10rz<*y8bw*Sz#T +z;-sTAW$5z;`Wqcxs@W@rajO3nHvE>$ybRcPmY4i-)fCysSN`za%Tz55m#cZHSMTF7 +z#nFCR(%B!i#Qry?!ST}(OVpm=sCZW-8z#hjCXf5NDmW^!Td@bePlX^w{CH?e;Tp+9@ai-f;O5ksl=JVLO%o7o<% +zf)7Hx%gn*pd$T;266i{=dg}AzVnJH?C;JFero=&)tTQ~0cR-iL%!@=q-?6mTRKYNz +z)sok$8& +zD;-~|z#LW}z^nO&NZiCGbL2_AfvU914L3gI9pv<6?S~OfwMX3*1A+9>RH)pmFF|HU +zOnyZ@i`84s?seYmhB}{gXy0rcBma|<;FFz?I|@5>Tb>G*4|xTH%PK>wI +zvOU?A#iOuQx&pDGqJ^6zCswo~mKjs+Gy*hj0_)9Bg0vTD4f{mbE`+Z;q^IE_kFM*; +z3(bt=qHz!@i+Cj*f=X6o#^{y9BexpGQ&f13hj%J`CVx+aXU2lpWne0bL!~0AUo=Fak>@5a5va +zjlV-00|l4>0EagxOE0ld_^S8_)eg(w;6!)^C2}M~kmPFghYJYE=#)rah6Q9E+XxMujNl!*?=L*Ai2Z;X?#?8yca`KP=zgJKEXj} +zWeJFaP&sfP>QV=1kLPA*3wzC#fAqA!1V41zejH;wVdUc}(n_YoZ!v;g2jFBP$AZ^jCgeKVBO}Jdj0i1jP=rXpi1dv5UC;HG~i<=SmtjsVG(uWHa +zNU#`ApKkvg8ttepwTjIEV9io)N$e&jWXozFFIK**2i~KJ)sup38jnp?|8Gjy>d4|s +zoA>zVv_Ndn4 +z>KBhlt2U1t8#o=J-kdHC|vV4R(pi+5Eg7B$(X3^6DL1Jv(Zil +zsM>7}za^#ED=O*U+u?NcaN-DJ6xpDdj#oYAP9-h)F+J`hL2^?Xtu1cy7KUv8-kz%Z +zZYr5Um!7{txo3-15#xkG1JIB^LT@zEb2bllU(AhsUpAWC6QoJ@ubJiB>cpldPfBvB +z@>Nz>ITEyD*)^v>6KwJDmN5q!6Iv3LhtmXey`Eh03jj^axtg(fAz|K1^Yu!Tnnk^H +zT!hVD(p4QxWm{;7!5p$o_N5w{duu6mDD_TmbyN8@91cEAulKU#*qW1{)1VIUQ}0eAPz^zx7I}Bo-dQ5AC?gEJp5#Rw0B!3zU{bF() +z#G}N3+?ikNUzY5srmOV5sY*)uFXrG8B~Fv3Ym~~PRe(WdNXO+l9&Ds;E{4K?{DYaD +z*3wp$e0Km*msf#y<0v1iC0CVh`5T#xt)}b|bG+&TJs=9zJ+A4hR`j(YtAJl^2%Krz +zRZM7M3fP>4R?%8j7RmD5*pZ%$cXCtGK*@))Ni6PW<2LC75P<3X7%a1BeTF53v_|N~ +z+J7|A-C7IIbIDSoQ+Nb$)onEl?s`uh-(J5<-PmFOvyuPWYgnK=U37miVIDe>E{ISt +z%$MJEbJh@`d>GyM)OvHwpg__Fz(p>cFPQ}9>ZR>=6Q&z(la;#dr_kP2&1gc49EHP& +z8g>;cBP_>t#UVZ5q-kq^ti^d4*imJ5Df|A~1_f{#3=uw4F;a$A6h2*RI_=~Q_?g#K +zp4Bta&2i9{{z!Fl@ww1CD$-E?Pq{%_XM@VYB0%Y-arf9c)2yu<+4pSZ0twr1ogRhz +z%UE!p%Ww_iybXL^|x0=i7MS~Bkrd9{*U6(tRH +zR;VYP4-{LoFx@h}Gh-d3XiRlQlyxg0G$I%-5q&-qxwYD33=cJCxKWs-K3XeZ)=Zw2 +z1YvvOFq$Z~NFS({k2mPakCOw1(Bgy{sj%4M^6l^(O2#^PJ-?oH^3k`Rn^Gl`841b8 +z@q)7WT0}<6Ug!;61k#BD>Xugf8Ut=B^1A>&g6}gL7Rza?>t>b2xP(PbV!5o5W?^T0 +zqE3U0sy&Kk%z&W~uuk{$nUI<5Kd(o6!}WP}7q#zz0QA&r*ZtVQ(TVr+esmkaT-W0?+OnP+KUKx=Osuj;! +zfF$&*X2d8TJn^>$x@RjbI{0Z6c1iNV-b +z@;zGmq|T)F2;I~9tlU(Md)EZKWc-a6ENU%jwO<}cfW2m6l9bC}aPJyXbp=K}`&4!Z +zUI>pl81-uc?@T4VR@4FM_(X>B_3l%qVxzxGVeeUM5~6=wi)?hOyply~Y|~_H-z-O-+QcS_IL?^O{kc=wTT2l+ +zM?)VwQs&f{%>ZY0S-TNijA?m8vk6yXAlwJJW})Cww_Qe +zod<-lK(XO$P{VD*0lL5@lxdI!u>}V}iA*#{>dsl9aabFTn2G}l2ryRPmS*Oz+-X!) +zrps?Bf6OmbrBL3sfMgIgG6%2pB)>y%5{oP_VO^?Od+weiEizj~Mouj?H*K_=`~l2& +zn!uRva(aeDm7k@Ig!f0kM`?9xspoL6hYJlG6-u%<(A0eW_jmR{Lqqg2=hMtdIDfbE +z2UrafKjj`G;|1U{i@uQA +ze8Jp&HP|S^7qGUrh@;1CIGw9GrPPwSXNZHKCpCQG5Z4p7+j@P!f(X4<0Cq@yTFeeD +zx!^{ZmWQ@!PB!}H&WWP({{7?&(m4AiSr6BNg=F!|>)V2BDp`t*5;KZL57xvqCy!~x +zMo$ZRiIJT{(zDQyi?B@pe*3>ks65&qqWH>iiQ#er?+mlPMbpaKHsL3nnLmR)UL#Lh#zpZ>Vu-+bJzUeF80tq} +zPMhCbLBy(Y5R(=Z?c45TLfLh32}Lt<&&Juc(^?)cg3eu&v9_S>5+qjtYQM2>FUTk; +zbE_*n7a%^)h4F8|R`B@VnQ@7eW1puU!Z{(SF`5TPA7CagP`{_;*d5t*J +zp)whQN{;yayoNV)Xjs6on2?7PmnysZn7dP1agFMW(bQfBxPrJ$?yLS*&zs^mcT395 +z{1XAslae7GC7u>I;vKf8M_Poi2Pl!3&a3%doc3V-2K}{!;GoEF|8DL&N}rx581Xpr +z`t#RXH1~Tms>iYg_4MCf5AaPIS%d9%7NU1DW{0eb3X2SNIzGn|cQOlAq6npSc1XVQ!xd?=CJS((kj#!qN+j^1*x5X +zJ;VK$32|q9s;yx%@C(G(&AL7xkM-EgS+XIkyL +zo#8bT+hxOL9y<97-;Z9 +z`n!^Rd`)$wvL%x-6b1XZO7Is;pt@K?T0~nx9d!cK8eczzy7o_2o=uLU1Tav%8O@1c +zRuYJfYLEjWQ7cc2b%iy<*%gIqgw1~YrKB^Y9LASum9-bgZu6~%{AI*8?qos-Bj$b@ +z`m&yr1vVAVN}QL2wGKLHpPjC+!sAZ>0E}9&syM&HPW~w?xFi&Y%m0J{07+1P_M37( +zXbwNXuuTcY|45+BcLabjGgdrlwdfEE5pz?8c>NV0k|<#lqn(4hm^^Cfgiiw-SYu{W +z#kX9$VMQ153DU`=LB6>3thi_fQcAlz!R_&(HQhzCJE#O8VybFr2C1eTdaPx&T*hR# +z^@D7Hx-ej*E2d)ORAE{7Nb<2Vdg*O@HIf&E3;fiZ)b*}ePT`*uDQhVACr!>QMmf^y +z-6`d)PUvT1s!~%dBGrfaf0#H8<|t(Vd0(7ZpRYZ?@k3piJLUbJeXdfIy{D8E4c0+P +zgPo1j|1;C>&AHCgw&Ufu+-|T|j?`skFFR)j$}XW^>$428^0xj|;+tqO+cUkT7TC=? +z4;++<(gb(J52|LLX9>bhu^gF&PoykaF+^6QYZ;K4+!lJ!KmvX7GF`vWqCa0YxAdX| +z>-ygtshMy|bH^8wcPLha!_2FxBl9`cXt7V<1wg5xwrRxIbDvNpTvGc~8$+Z_Mx|-% +zR$MBwm=7C5q)e=afq<_BIyPS&wDz(ZzKe5l_<3Bk(Y;ix^gkJCgLeBG7Y@YMlofx~ +zU*hhpU)mKtV{MVz4W@zWv6cD9VZ)WV5KNeVw!w9gjcZnK_UhOdw_D;v;{smwd1a@1 +zhKsxbVXw^g_YE+Bh*4w!G=QKsga-pC%fS-Seb?hKUrctezYh_bR{ODZH?WvKD)->( +zo<6iz`Nt93Io&;}z<$zsp>)oQ`pcsEe~Z%vr=Qe*hMl}w#v9W3sKkzT-yt!Fc+5|` +zBAAHxM~J$f<94fGEOe>(x+;f#V`8senz_uFcBbVSQRw7-olje@)l~IYeB*+?;Dz{M +z4o)(uoGK4~MEd}Xulkwtt8)gCTRSNGYVas2v+&8IB+Kv9z8fiAr9abdewTel;sUXA +z+X_vlbUk@qT|oI#VX@8U1R*O92}!Nh$Uc=)*CiKCrx&*NE^pe3UpqE?2aFF{?8g@d +z!qO#{J0d0{R=Pgom$*bxRV1jDruT+LYn%*u!Dla#5Fe(RoN%3!e52>Py_0T6iBv4_ +zhQB3V(7&3P@!YLm0i9~=EuL=_G=<-cv68|TU*{02w#pF!7SI_EFEH5%Rkf_tS==GD +zBvK?TP%yR2>xOux*eKI-+J4GU +z!Q~B%7_GNoo*IeK3PZ3j=VTvlqD?TJDZXah>!tZwwSVPh!VHeSW1CpuE9n0MttC`Y +z!|C5ROmoi6FU-yviOUkh3LaByDo~9@ypFJ^6c6Rc6Knh-1Wf1oEipL +zRxCdd-LgcXa+Gv6wy#h89M%{M;T^K+&1`CD;8FveEbcQu`J!V@QDd=Hz=cvNb33Pr +zZ4Mfp4K3}$5-XBQt4&QzSACsXaC`Y4DTn?{%K8loNMOqiQtStFN1>9MiQ5l(Sc`To +zX{RtH(8+mtf~bHOixu8SR;JmY3M1t>A45w`?~{!wHqoKb4EUi@XyCXl_02x85s~lA +zaM{nu#Hyq+`mX!OyNbc@cSr^xqJ_4O@|uan{rX|E&5~ANV`Xk^+je-3!JUelT;XEy +zbwG`2vz{5>S`WAC^-FPDMiW8;+xx_U@{=XCPmAu|L%|Go&YX1e +zdOwVcpZVi&NG0|>+Y5=kevr|yS2fN|_dHW&fXF#AKfR3Ct-Rxq*?N2K!c)cf*w2im +z+x(-VQ2yemqWkFl`b}-@N0=|-Mwi*<9ua-%kW-SEncnGELAN`VaQQ#^-&%68?X)gQ +z@~_M~OHgEadqH~6@>^r5_*mCdTfg9cS~uoV2ZIWxA6~MSSlda@U3;g+!ld&Cpe0HWzwScMPzjOQS +zuNgUuAcQ0|a%;y!@cSlev*O*Xy;N|3&-Wu0qBM0B31VBuc>gc+){?1eOdzE)F(F +zozL=MKb-0@C1%g~D$g!n(`Cr_ef&^-7A$~y5wqVg-{^y=_=XuczuPk>s*>yI$k*Py=Eg?m!w5Uka?E1T +z$rGD8>7HAEGRzwrZ1|&^O5}i<3yCak`kn8LX}o$AkTa8oYPIfV_z=Z8TV#)H&? +z>Ei)f^4CZril8tyIW;4vIj}9sYamAr!5irA>bE~=ul_JFw%2v`13CJB~| +zgFRgrU=&C!F~Z8XpA=7qoNq=Az=KeY0m>!iKEA~!Hr{bSON&riRnc01Y-`DP;T}B! +zCl=dJf53cUp$VSXin$?ztdZ4M(`Pt`!lYOf0LxXOikwY_9vYDGm-b!Q|MBxLX{7&g +zvT!f}lo(7V{sgKH*Clvr`Z`g7MKE`Q>d))(u%VK|Ia!c*^?Y@AD}K&G$O`=69}2nq +z4E57H+P9sO3rs_{AGM|p0ORPew|e8(HULlUHuFPRi!lrLG2DM@#7qzc&qY(v3s3E- +zb*o6zY0qPBFCFH+FcGM@^N7-A+g>>wLpqf(4Ijc1drvexn_Z%A$#t1nsjzAw0Kli! +zSy<1pLeP)M2Xy`M4o(a4TC`S=()^y&(B;vT{$JYmKr+<}wA+Yusp4Xr^1jewHiHw@ +z9RuUw(j;dLjYdU6Lpma%u!Di1cTWUYY#XsCZ2$#Alo1V>*A>vE&1Br-R`B;VU53co +zBtpk9|M?yJH20$RX9DC1L9V^sEv+~07udO~9ey3JM_YZG$+&AQEUd!iQzP_wC1j4* +zTiXJerzVXPzv%{VX?ogp>F?0DcK+hzXOp%I#2PG&ihOV(?_`^^jHwlRoDqQmx^9Q8 +zp2CKHPfJA+@g{a9o_Uz1@*@y+^7M`+++FLv_!&7zLJaS>O9IFWIt66s{T~l3hUY}3 +zC#u78hxVlQEI9}7BY&w<(P{nAM&TUMYwfsIG_kp!V{ujzzG#xjZ_=Ds|LWgZ8oQK| +zZJIZG0UBuyt_#s5FkK1P?4m=9HbRBU`^QmtSRpWgZ0`pmAV7U^2O=x?uKrz3$I({A +z4F_KRj%;#U6P4hoS!YuRCYXQG8idN9to?xXzGR@q-?3{}f*A<-6#e%r5R;3Q7AM*N +zuVl&MO?+(kUs?)j(ilPWWxCIKN_I!KK-yh$dq+kgNzV0BMh^d;$K%?`+7cM~kbjG~W#fBT}QB%DCjJr-RAKh&+BSPfF>ApLw +zkfYyg-(`1>v5|RfT-ba@Ms>M|MI +zVp%Ok(Qmn_FATpI?@v~?DM+gJQ#8PAi!_sMLqfxhjbBr(GY&9btWeQhSFTUmk7)hx +z)5co@9G+iMjA&d_Vf#;Qd5eW-%v6|63!)W!cFP5*w;RXTATjOjlhbAY;&h|fruso; +zTFgr!LF9O)EDqMH_6n9CkgsnoW6ei^2ueOHJnRiSIJa~&kjh-nIfg-^FpG7k4`=2^ +zZcjVNihStd=fpWUGw&eZ`Z*g0G7jHQ;n4g#i8?qq(D@qN11-whn%sUhd +zU%KQLj3VX``5uXYDt7wQ@O3Zt?r#-D~-Rki2 +z4B?Z0l6_c8@z#97MLla}T}71nYoM$(Z*m@GdK!76^2W?&zqKt`&9!&&y-uq-3IM=! +zSZc#F>D%tJQA{`8HSL(MPVEu4M(Wueb8*$p)rmXP5d;tOf5ODw{`FBG8gK;y68CEB +zVQ+e=xASJ977E%v+P5Fi4dWZqu6a3igaL2y)gLdTuyy9xBDJz^j2|{aUk&1Asqs7B +zJg@M@XcNEiKD;h_GH@CjM;(o?$68C>cECk_|I49B#Dw(j84cfJ4?=iN(4eZgW{x!1 +z^kiOZuY^{H%)^O0?u3h-6^UR=-2xXUw(f{%beQ<)`eH25-qu9NJOP6v15 +zxY3zzQfgB-EBL9G5sU-fb_^8fy#k??8)51YH0Du;;ufC`rAa%?($f~K5CSS|rsUnE +zs}~xMU3f*zP?#nK7j-bA86swK*Ugd;L+8ii8EA+n_fN9zS*yfzqc*xgXLfcr>Q^<# +z5#iOAjRadkrNX@KA7yR?ExE-zdCz)zS!hzct9bX;%*5*NN%eb1D7E_7jJ*zu$Qf|* +zAF!O2_yzY6!5uB#h6C&Px&3u^ZAriJdFu|fd7^Z=M>|}9wNB`PEJ1?P_sBPH_BVya +znW&99Y|36sv|jVi5|df+#`J#0s4O#@{_$7UHGQfbwi?+qulf&Nn=Ore7k9^JpGFC}kI3k+t~u)Ea688`##@8~V$yUj1OLqET(LR% +z88laEDE=nXg#z4|c<;KsNm^P?D;o~xZ$^H9N$}UI|{I%|dV+j;S6JCE8-xH~+)*@gx)IcL;G57SxAoCxeT +zU+;d14%UJc+(4tu@fI6;xa3!;k;Dh8Bz6Fa7bop(EP=k_9EdVG9(pI~qdF52kU3b4beb1za*Lqja3W)UN +zZ+^SY=i+Q;ZrVlwVqQ{1Pr_-Hbv%WhLSJ`@lW*M$J_)}(XAU9C2t8L>~>7`QX8ltRdsaPrT=D(-~U_*UYCd7|>kpY^Px6 +zw5*E}@umMne&Xhf>zbLKdPR~P%(H*ba#gSYO;bY@R15@Bu>Xu`!uvJ&Bycfs=OrY9 +z@k`(BZlZGd1xQrREp`gLv$_C;xS#8n7tyL6Ky!4}Vj7b*MsR)lo87T?YCt$j9 +z9>@vFNx_N2lzD!VdJikgnW9}d#(`39Y*R`X0j7zvezv6M*)L~C=OomENq|RUZ}ql2 +zzsXR~e-88aOS`tPV1Xds8BTn#xpe#6NUso4htfGP_Wo^i!GOa{U+c?!{dX`=NpNuz +zex$T1h=9Ku*%p7lljdDX9K2Z6jLcmkQ<7k(Lj%_< +zcn+N8$B~3U*M+Z5?%TMd0msdF=t{fR>J4cJd+N+V9w;fLI`WJ({bV+~FZbQ#=ced( +za_>R;>_S(X4xZr~=3OW26S`wo6MFKbzRoz0k3|hh@TfT%g4oOvuZZI8s?6%bdi)nv +z>S-}nYgI=-%_2$_$D>ggg8~JY4>C^If3Dn5xz5f0l~8BDKmr@?m;WA)=T9&*ZLm!| +z24*zwh0zn3cf8IAd6l==QE$xXK@yy@Z$oOPvaeLtK(+cN&34hh*Z%S?R^FUXTL +zgJQrIJ?d-s-OLfXM{Cl)lFy1SVOm%6$uR0&ESu>-kful`)<9X-9Jg^%-YKL +z->|FfPguJg#pdkXBoKoCAm*_&DSYwnZhog0lJP}gx^VHWXfGf3Mluxiqy7#I95^{j +zb|V+)dQo#4Z>E9|29#aBWGEmyqMYEgz1hbaYTsUQ_&{+o}+1lf{lwAq}+O4m!3XAidKvT;@zjhX=e#=c2Nx1Tl#WH~#mX1Lg +zg3-SR51v?-@b32D#&uSIYm76&KL_zBTr7dDx}iZaI~Z!Ueduh3$3Li|kY1Y<18a3e +zrrdP353|TI6>rL&$fM|XDBM#C^TM(EV +zTn#Tb(pFd)4{0tD*zs!F+Z@`HRNQ%d35^g+)0rHnvwdzO1^P@u?gax6&;TjE41#<& +zy?Xhd(C%)W4L)$SOhA7yGwMPQUy@2Ltk2* +z=WwyoCufyqEhcEeAm&f)k>Eiq;UKX32Sx^nyJpcjXf!$QH<5<>So#YN$L)IhQ- +zicc`S9h+nUYX+$bSFf|$=^t(juOugKa&3WtmE^m(d4pR1d-ofg)%!JlEH-!jDwV@2 +z8|pGQFM{(+PM^!Nhc_8Vqq^5fQOJDzLs&5fB8BMt?iCXJW#)usCzA8;?23+DJ(x +zV0F|4{U-KLOirzS7T?F}r{ky0qflJFWM{0|PE4x%$0!d{7i6VzYK{Ce;+gwrl$%pw +zDF({b&fe|rZvNS;Cd+!6L}>QNs~MmaHdV$5wH8YXbba?_UB`C{x8gR=RKxufEOdOM +zvkechR6B5^*b!Dzo@ML(ptbpc|Dxh#mNW39$oVFSlT@t%S~jK8Pl;4PYYO{vu%?hG +zV~Rf6#88LEzT7Q!VT@v7N~u+8T6crZbaj@3{*)mxZ65D^(DqZ +zo%~o?bK4gSk*#|wYw;gtzJ8S?kba-fIwOn;D@!R01pj(@=J~X>2W}EO!22%#*MLi{ +zzNlt;1PV}a{S0owP{T{>lLG=Ix454BZ36t|hzuW(l+Vuvuk{{|lAXJ_&nF$S+%I6e +zmJ5K9NPOkdMyVBBj-T62R_nt1a6U{eNV5&>t*_9)e43?1IxpdjL*}G-naL6V!nF6| +zHkcbmD;LOC++!Ol8@`zr<66=EdQ@+2(6_m-k))~F3A#JjJFPw}Z9=ceZJNvY~TVf3)soj>NaVZ%bN3rEuJd5E^w$j~;P<*szWqsr3u|`Lt$R%E0Vg +zS69R5VG?OU7fANi^U4!6bb1sA9p;U#7Z}}FMTRiJO+j15cxf-kujPVHte;E|*z2u8 +z=6ZRD?Xwjz$DAptXy(rR>?DQX>_8l3i}1E9g#P3gXtqT>IO1#GA@#vUrsz}u@3UiX +zEVw-j;Im+tvyawGeE9Mq6fmi#9}qegP;t4hJoY#mvv=ujlU{A)ZZweq@c6Prp^muP +zzYCaUdfTW;sYhb1L?fe-qS8Ia`l~KXsr<=JflG8S +z?h6NluD%Pm8dyd_W2e3Fz$;WLxZ8TVP8W)7qm>mIj7wo$5ZFU?A@s{W>8qt!JH?Ta +zK#812_dTDFp;sCIvb)NUSR|C6bcoJ1{zuwyvDc9r^}Kf>8z3M20OHXs3^0%UIgH!q +zhZ-~xG>YHsJXJXD32yozWwd5;0QGWiVidP#4@=ZPxupj&o3pU$jmo#8t!-UKoquW;VyXuZ(^wBz@oK +za6j5FvtxO%i8PRzKv~W{F2LIR-0RBNkd~g%t!zxa@N;5Ks*lhq=d?LUN8O +z%7?CYQY|UI$#Pvc-pf|%3X!GiSSYAPQ|LxTB4*RbdUM$ +z?@SL}vCO3nz1A0{A;^KrRMNkB4CgmdZZb}*FSrL9iGo43XiQz3;`AFnKfDiSX$8Um +z3P2Mq2Ok%3XwG_LSru-(=h6>N%%phoFLGP0UIQB!2#EDzf1XT$ae(gx>l<9QAXyo+ +zwz$?5`5*?9?pl?d`=bfU<^N{^_$nEOAY40?OO8(Sf+FL=aShs;OGWNf9slgA9$Z_W +z7@{=YvmCF*Z-)r|PF#Z*9Zsb>95b5uKLA~3n%f>mTYHv;Nvx?4WKNTtX1OQ>m78$W +z4RT@q3Kb-qL(n~M3?177pAs*et +z>F$m3@pUjaREtp43rYu7r@>a&0&}`YR!8c2_ZF>mzx2gm4IFoye<8UwjnFXt5FhQ% +z++F-&qF1FGyucpbyuCm19oe+qYV+@an=zyVB0CO0Es^ocN)v%TBq{q8gxFHlw{xMD +zi0L}Bz`|D0(`ALUrO6>>#>Y6BUZeLUBfj;odP_@I+n#i{wo_nSH5aqa +z+UI%p{%Lzy&abs*v>)Egt*>^{l*L9NiG0EmdaGY;)G}0*f-UYW*7}c_|KjH3wMRwu +z_DIQ%l@WH%oC8k-l(@iL6^J+uOtKva<$}L?BpQp)ZxRmESB9s? +zWXGvbFqv`oR^z)L4wK&N-W=h@m!=c$N$9-Nh}nPzzEkaXF*}mx+swKmR2FJ^7h*!k +zkO`4ve*yq;JKG~&>f5&3+~Tc#DGD@_R@yP9W2rpOCP5CV%Cm|4LjIn0eZLc`m06HIhx{e_>&q+SAHaQS +z{31I~cKdShiL_b +z?4-s{3>UkU#{{vEGh>SUQDA{P8_Y7OVVxLh)@DDN?0}-U1UTR1**^eT<9RoA5YgPe +zf +z8MUX!A~!vPI&$i|y=yDR=AvYq6ZW&EF85dDivt>#pToIQQ^7#XdN)#=_L>(H;`b3E@R9>u;&62aTI3RC}6(x +zfd}89xmI$OLVEY?;59}LnYNOduzY$Us4ZB$Nf6#>8Y~EHpSW9gxQ*#8Dq1EQ!;Xa_ +z1qr&OSv*8fl-1yndNl}Nj^&>E##e;k8M0Z$i*j(`7T~P?DEF +zr93Z?$8Tb1zFgrn@@^;X3jnqW_*_4K7yXFJgaYX4T~d&ME@g39Kg=CAf3jB>ZnowQ +zih%s_yx%<9EgywGns1GiC9#Etx8@hLX25UvXZKZt8nCNU*wPX$a^ANLWFa?AZw4F< +z=Bd5c;sEALxAQgrCA;fo9pF10?3WMuWg<(eB5?@`Agx(sY)CIE?zxu}yJ$X8J!E%7 +zhyZa-_So<^iCj?uvig{ILMB7)u2XQEw70Tj!aR~#Z*AJ{L72Z-zT_l7CR8%0XciqH +zZ7iP?ah>)A_mP( +z;weEx#T-=M5vA?xJeuwU@v9eq>scVZTrqtl!%N3cosuJ4?3X4C^mg+%<+QyF}Db$e>C# +z9>b453Uleaqwc_vEumFrQXe#}r5^Fz@P6B!kFFwad#O`es4zK=C;4p1wwHWASSUe6 +zd6E=p$kzH#`tEU)%kQ%E`d{#b9A(7{gs0o5|MU|U{s_=tG~|FTJt`T)#(9OyzopbO +zz)zOFMX4+3RO!b^fbrSf)&1t8JACjN@BV`FY0;uom_H(yGMcDkX+U1*mqD`|{or2% +z+@Nk<@fhQ__Ts&((o*jjn3MWt;pZDoW|LoC3VK@fhac=jE)O7QS_7!|>wkzjCB4qw +zk8EjTYXzMTCe>ZMQ(@zTjlxrh$4^_;tU={vvww883w`3YqhvuZqMzie$GoDwPZO;>XYPRM +z=F(}iGJB*(W#cV9GsID!%%4=^=k#xK-m`_hMQ0v0ySAF#^sw!~j?nugm{=UU(@wz^ +zcI-h!-sew`vp5r(NLqq#UBmz>76ydmx=UmKkTAVkEw6jXSt{9H_Bg@;Rm;0g? +zb@e(Fl-0`WT_bdix{msy>lZ`A355$Py|IXz>_+On{yjDk863%!eARc^%HP|AYvh4%~KCK^t=>Gh&c(%9LY2-`bUwT +zdi1B$wPR$amUTK@*5=qK+R{4yu7x>TJfZKOi1a2)b@G_ls;^t%HsCI)XVJKR&fF5$ +zHp2)NH{#**A*JS1XnC;^*kIE{*t`ysLjf-Riz^*$NK5*=%vG>}6zFw3jdiu3iL^ji +z3un<=O9I9GtsPDWVLSW*NU9lQyYaK(Y0im;tL0Slv>tb9wN8#MA!910e(9{W!04c9?2=*u)fiP?A!DpNBhhQ`NO6XAtCVj +zY`|1ex)nv)2Fc-BfuBJK9q5*mNe^ePZ*@I_`xKUFx +zxMUUnT8Hdx2TM(zj;jeKjt04Hd%XcSsTS-NU^hTE1P^pkMM$A4;S@*aA6{JH4-6Jb +z5>X-$*m9m +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 +zM*D8-lwaz=@_(e0&ALjn#5y +zouV*9Z8)&4``Z9F<&UQUdVE?&$xtH4f1@_?xY>%nO~uyQ-l;O+tV@mQNtF-HiRyHp +zmzVxpvlo#tx2|#SQ~rJt+O3V5Shu$|V+{DxMn}Dz!*-n`^ypoN8LTD!jB0Yz +z)2w4#P;Q&X%&T3>73OK@tRVNEeyDZaPiQ=LY0>%}cdi0IQs9jCSBEoPodxcv9uwr- +zO@re*YQ&t2BA*GwW)`I6FA1U0V=BM@zzGl&b0}>IP9XjnLnbWbV->5HnPA}-QqA{H +zdPibu*PJu`_m^qteC3BMMr@3?5gpdFb(cnOMF{2=J|9iy5G&fVKqffdaTGw5+C8IJ +zEnmweBihHTa=v}Aq{ZPda*Bc+5VdXA_a>zmYmUbno`Qm?&9k&dYUW8W9lfG_tv<8f6>QIRbT6fwFEPHg9P0i#IXo;4%pM;QI{ +zjj9j!0t!!cRBdyv1%IY_s1BUAUPda(&mc#aUp@viJ8=XIrYWVg5B5KRBeLs_Mobr& +zw{*0Wrvh*Lt>8a`4#a>>W-vWizFR~9s@@fqC&*51i$CQTn55(=N@O>)oFm{H7qkS!>*x>+ +zPuqFqP~EYAv+Y3vd^vfae0K1;2^UxeA3)FB#BeGY7f@HK%^y3Ift)^SIYQ|s1;^%M +z6WLik5(=sm>N0b&c2qBjjC%$I@C(K(nNZ5fK0xOoA-4T;LzqIs7pQTjx0QIj-8eXE +zzkBwg*Nfqm(9VCTy&T>=tl22M4BLinITyQYiyD~vF3WoVEo8678xBxs%C6N|A}A$s +zh#>s_#kSt^LDhKa@UUyo5DQ*MK7F4XgkkREr+FmpqZuzGMtImu?f$hVMd^NnDnQk` +zvqR{5Pf*x|_OvRz=8e;Z(Ye)nRb4Tenqia9f8n{WVa!C^8NzYS~p&E?}YIV2fC#|wI_5h^`vtV~v<5rUK_qegfizz_piaJzwK +z{pK5i#vgIpwptf-!Q}IegO=t-#KDL0@Q5L*Al?5+izNFp`jXd>8O|q-{|$F$#_bc2 +zO}#1ptGa!eLiAv7G@MUop0}08 +zqft`eL8qt}j!vi!Xs!|#o@|(HTNZ?Zrm1T}%tCg+US(#DPxp&$xTQ@Q(eYGk;`;I+ +zCj@HH&+RKb@3=IzIdeDmRO&727SW?K5<|&zjqGZdtEo|U>W>NT&NF$*AQ=ob$4?P0 +zSMEQ1vrq?ljY^C2zV`1+`6-Re-~3=L%rX2Ki=K~OI}SDn +z&|SBxBL294v$k3GRRI9nyPvQqA_P$SHW#58vwinPbJw1$Wh9bcCA1&!Ik?}?Je+jm +zKW8fzmF{4G(TPps`G2oIu?{i7kTst>+I#|he^kW0F+Cj8?bsm-`P8lQn4gLSH)R{6 +z_$&C1|NDmmqH9t5%9e$3|AAR|D#L-_V_+kNjgrAO3zr--d$L1f*@{RhbKUcZ#pJ#E +zH{_LpB;{BY4Y=UqhYIv}O}f$Ve%B@1(34G+t0C<7G_?V>88|XuqNK; +zf7iwWd_mL4*%d;ik4bbX7BfoJnvKwGVSN*r?)vMcRvz&EjmkI;YCtrf8&BXoOz%{X +z90-D$7ht0>iQ`WE9k3~e_{0)!*=DUUuTqEV-G&~T +z+PUs-IabC_H7tn%S+<=D=AIroV(!Pec8QGol`YiR)2Po|J3 +z*}#c>y!TISk9L$$KQq@aW4WTBNk6oA)EuPRNgNbKG|HXBiV3uf_d}4&smd6MCDi5( +zQgDwf369W%ONPTNldGyHA_C6Yr%Ci0=pY__n7swRl?umJ=GRW@N(A<^bJk6d!G}0$ +z{Jl!g)uwc&EVTRWD<&Hnysw@wnUq6v(@!m}XWU4Cb~!{ub{e~n$F8of08Ok2;^Dj< +zW2C=;du&D|=%s3(@L!A{&m8Y1&HynL%)Q+6&e{ij4E~^*S#cf|ULBv95N6qdBZY6GthW$%7Tl +zVI?;}_&lM$GN*orXsz8EBr9~}6Q2)+LGT?Owqj-Gh5T^r5{|fh5C=GD4GfdV5^0oi +zEvqFV^1e3I9{m?0=e6>+AaW_xfNB%l0SXGXKhQ-KK_Z6lw~y6z21gnKSod{R#*oGY}t&(<~f7H{?(Hx1yXX?zqRKR>CLUk8E&Nn9Q?uT+loR< +zy5e8#Rqh#5N#?vT;hmr6X6vO&l^q?BfrBDtuE*FKTytyP$ntcUzKSH&YT6301|w4Q +zO@~sYUMqW^47Z1@qWFkwSzRvD{1Uj~Q&0?N7t@#=L=LGcim%~hIm%Bw-7OE|$6td$&-NsqaY3P3sd`DB0=J +z`qSR+@ljk_%?KfXcrR}J;eVKUD1byzSl7YP61xCL8+v+e?H5!bd8XS`Xd7$|;yYUi +z|7Ub;BFcdiJ +zYRQy`b9$Dwz6$7Q@fYqKX8Z9;pNDD`no@UYHUAMDlUY?vs0nvNJDjTQFgwwsJFNsOilz5^{K%4d +z87bzCaG#pP$m3 +zUtJe{kksF_U^arAG{9RJ@q^TN9MQ(gRvkLw?BaN@*A{#sX6)c>8VfBQ>d11Hi${;0 +zy|%!j$jplJHA2?e;@`tlSdvR6v#pUx*6=|{WQbCTdZGp;vnV@}n|J +z|ECE5$zpZR$T%cGLh_o^zoOzB^|0i*g_CxER!mdO%)BwxS4OX?2_E+6#4bp{lSB&b +zu^{$5-N-vd*6X*^0{NShIz=b|Q77PGYC!2D?&FNX(Hn{&wAyeB5BXx!`xcB;cFX8$ +zY*8@?=nV)yPYzGbIQ2R}`~AcRBeMGVU&zvjXMi~2{GuI0!d`hrY4LTP{NIX~*;5MzdK}%Azw7_0gC!wGZjr)r&UHLajQYhanmrtUgq~a~Q +z4%?s9R{>AfH_K3)njJ;s-kcQhtVdZcA#fTxJ7&6 +zuhI~&a};@5NPv@eDtE9eZP0B$uH*)&SeBWzClIRsaDNed9sCl*2e$Nw6&fL|;<5y@ +z_iSPY<{ltYI7hqXWv(c6eLGhZ;W`5O)Vsp>Otys-S`4OfI{5vOg8?Ogwn;8rP9cBx +z)g$DoZ?LyMS4fl`Eiz^5jL$2$UR1Z@)wd`o6u@Q2StuOHRJ;#Ahf_Jbe(V%Eta^H( +z+)jC-u*v_?HU3P|)v_XsqI`u`4l1WDVS*!?zTnhf5DwZcW7M5JN~GZ5M`_Q5fx5`! +zw=LOW#mfJ#6*Lyzp<7y9QN@gqP9taEzx?r^GlA7`+N@=SF5=Es{KX>|rnAfDa3539 +zGf%0)WdRS^HVIpv@V_f|N>ieL{zzl8ca1Qw_dwSH@qRuWL{E{ftz$+Z2L+~v%}w-w +z?IgXRm3sB3_pocptzlaILDjZ9nCyJA+1OYv{_)38rRg-c6Nh4vb6ko(*C9X}}r?WQQ9WA@~92H}j4&od1Ca6*mE&u#Ac>Bfx-~ +z6TZf+cMFtH>DQ=;fHFU_Sx6>*DM`!Usl^smOHhj=;+cM`MD)jqvq4C2ViOF(W53@~ +zw(uw`0CJbFsPDU+jExB$(kY0T_2}H6 +zG(J?%`XDAG5hJf8344>_(73~Q(xh;(pq#*(dBBG8t%hNAZeIUl7S($F+Xp1DN5&}F4%rof3PK})8)=e@#8{<= +zGP`h;6ZSmt!`-sltDl-`0`!zsr=N^xsh01Lf?WgTBQSb4j?Pcbt<+1-*$$8^;t0}o +zcmCLIVe#STPqzJUagr3nmr6T4?DqGrY`=DIc=Y{buA;QD=GYc(^BcMw^=@sY{X{+& +z&0h;uSv>IKjMBq)ZKGS}2emHc3|Cr5S|<_QwgqAyBK2k7(!Y+_*4v~yimfh++$p?! +zQVK-%GF(Vkb~BpA55BU~*Ty4->W2n2&mo~=7W$X@(}blY92#j;6O3*gnK;U(GrN3t +zVhqkM@v+4drD3Dz$FWNB{84hK?qzg*TQXmF!2{x~{8MaIzk25ylgqO0f)RMkk@pxi +zYt*Sf$^3DvGYKb<&ULIP>p%yxEDn<;z?@Ai<$a +z6$ZJB9_92Fv$ +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 +z7^1*Ure?v*><$-%z~(Y-2+JQAfBhNEF?7R4h +z#O~~86M67uco>jmI2BnzRbGuXSuZks8WH1eko~~)CzcEmzx=9Jc#(vBuAM-4aX3FU&WS)3rv +zcj_9_Fq1UxY +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 +z86e9SJfr<`|?{F?G9l2LBcnYRmLz +zwO0`Kpt#@2>q#01l1Y992WVInqP-X>{gRhlbaZnc4L&Jvs*Z|Mf?5F^(|=vjg0!KE +z78g8wPb0UyGD8GZs7BDhK)mM6UkP7#ulDh3;iC&XU*m~Jv6{B@^Nh`^p#E&Beet~c +zvc|s}1><@1;3fSsC6Ke=RcqO_q2WQX1u?-I|3_XN9p^(I)Rlz+!2tlJ>)puquZ$g2!A2A_c1VhV;~I{G1; +zMcRr5|B{Rq1kL*h+XLQ-a56i+;BraYC@h+LzwSk=JLh{}1nFu0H(B0dFzqf6NrU+tuV^H18eiwX(^*Pf4_R}wd3`uC9 +z_4Ri1oe=TY=ge5TI&!(b#9vC`%OzlG8IXBc$@JZprBtR+wlz_x3K4gX^#ttvWcyW| +zka(d1cGa@0`&(#}r;va3jtrkwiNZefYZzD#lw_z4l(c|mLCF$Ro93jS^fQegSnI&DjU=d5CL^}NtAH0!^-7pQp#E9iw3s)5JvsK^UvH1#{qlQ8CG`S5Lqdz14 +zceY1GxY}OeG@c_;Q&1@+tXIhl`YzUI_+qh*ad5DOjguC;^! +z*WV(RSca0?p8qLay3fYfNZ2y)JSXYAXQEiaGyGDb|L^)hyPHJop17jV{@>GL-1FNk +zsnOU;b6Q6O?fEF7h{=W#x*R!vPX|txObM^?=S#G9q(KC8rFqBv>!W)?=iNixmSRDA!T}7R +zj$ax34Ra(VaOhB0)T9BOST2S}1Uh&d_Oq(R#{k$`OX(;q3b1ATnv*$0k^rju%qS$4 +z+D@IS#!mfg-E*9nqh$sDs(ykk61A-8mDK#V4<`VxoED2)MfWg}^Lg3piSQ@VnMB4j +zsRf)NzGjKS_AyG+4KE(@*|>oaw+zv)Wi|jTK+lH|^?a_5hUsl@L6z?_dF;kAf>&8cc1&>CuJQ1g)_x3g|fx30(%B9%j(XK^M7 +zQ96uYV~dI&Z)!Q^l**!{pj?ScW*_M7cU`EhqqCQesibOADT(2?pqFmB<#cFNP`G?- +z)Lbf_VyV_+Gus}<7u$bxWQI(S*-l0t(whGGf!~DAqyGN5Ikbjc-dZv4)_O3%5XGH$ +z@Ll|;O7&g!QvMx5_?TBd6Hnr%q>+Pkom5e8O$6LDR)~wOBEr#7e&FfA(*@mITy4>g +z(Yyaogu2qU3^iKoB;ThRiHEI6O9iB|MWd;9tvEEV6WY?ZsY0WZnBN+V!chW@^~M)6 +zKKgc%*z}Ah;FfuOZo@A`zDhFDZFUDBWJScp*9P|nxcwrx-9+GP`I;4*ph(qNK8IPT +zp5<(dNgI-K%vQmL^k;uoGaCv(0teZvUz+m!_?vrM4eB)^IC-%Yh!za~)@dhdp;$Y= +zz3-9wi9NN6y7GgKHKqozo{Ml&V{(XIP^8?IoCHH9{aAVNjX)70IwR#6Ni$2g%NeOvC0)c +zcCmYDW*fmMY_c>8$%g#qBbXXI#^_|?6D)q$ziCT7OU_(~fpxWcqK}j=Y2B}u{XdIj +zTG(QJ<#r;5}zj?7#L*b2;PMoAx3Z`ZNq +zde@N9_F3fn5%ha`0y@6-R)45SawWA9brSq)lD@*5Df#^$C}S-h41Wi?q7@O2<%7;7 +z_g?0iJIkX^b_evRhvrf-rDk29oAI$H%nQ}B`Z7SgT3urXl@{isSZGfUvLi5(u@@9& +zYb+H~BeMnyD447ec=x4)FiXuHBH-`EgR;&K)tZ&~fGkWx@;N6{$1&09R<2>A8uuVfByZiEBZdwMPX6cqwN0Ss~&|Ul6 +z70HL+)v&|+Ym>0OsrP#I?`5p#x*6;{{i{*JIP?#AC`?wk>ts>@62>U{!?*m|5vaUTsclc%Z$V)KAU4vg69H +zeo^^s&=qyNxz85N--th0Tw`ZMvs7H5tifMeCeVoPb|Qq>bZ3Q^ZdO!`ZtJA3ChgID8Zj80AYF0)q->6V+hGAq +z%g~5~R!${r4|X5LTDxdSIAghnX5BRk`(cbjpSYwM7wMGD1065Q +zKAunrp!nd$smc(e(8qd+UpVt0a@c3rN2?=8D%5T$VXK}TrXKs)z%jpP1)=agYnG;( +zI&SlEBV|Hod~C&Vb(1+Vm3XGtE)n}3#Ywj!(PQB(vRt^3R2J_M9FQtFW1BY0|47kP +zEL+;=$#)?jh+DVHeN)+Z_isvf9v~wHGH)Iw7utWol_ELMl^&^Z0voP-`OhC;K?6p) +zQA!64KsH|dbLY-AR0o82bYOUw)RZc?IlaEk7t0H$I~$vW<2YsUR+`VZfdFVG_!=-r +zwNlNxDU`~x@D&w^ad0pc1a?eyVYvU73SNOc0SI#qcGkNl0zmVs%GH^5P}|3AgC*f( +zPT&Bp2kRa+4oVnIn4X;e2>^Bu{bTC;@nv~Nq>fNu2H9WFG3B~OO~JPH +zD?a$Qc_jS;yQ4npNVl7hNF3=U1!5($TRqQIza93PFUR&-Pxt*VuM@$ +z(sG$Ur5zrJEc+Odh7bS-((H{v3>_~gy0hz@=i5i1{c1kcZ6U6?H2(vkYsXo{D4*^U +znYdlR3^V`&*a|U>ota{VeJr-9d`ONNyz6(#E*v|jwAY5Rigk54#Mbt$(MMK*=D1ny +z@@^|AvksB8)}ohJQFaUqDAr23>J%?Kd+k0U2^Eb?GByBamo# +z4ZG7sOS3GM6L_uJQeG#rBt!gTx%b4!>pLGaJI=yeU^DW|f0(2}^|{alI`>)wqd6*F +zMLp>gxZswBZfQ{UP74D%3k(7bSV1}LEy52GHLYq9_~3MNsFJ{llQZ@Ey%=z^OPj6R +z`Ua3)A6p{DC&a6M%Ju$YQS+OwuHGlggRldFAi3XB5nX}xcL><9q&~9QRL~_t6+%r# +z;`4E_h4M?N7;-XI)xtSifdf`~KC9^tImFP_)%?fm{BEth63!Ag3#CuR>IJH= +z?44Ca>qX@HY_AcY{@c(gs9Gb%-4{2TmBtR>CH*7nC`?=HCPo;&JMM~t;Z-4kB8CH| +zQx_^pYgYYH_FXSHdyG@Z7xcLD{fCaxbXi{vFBfBxO1A3Kx5r>SRW(5cUV_ufT##;s +zQIL8Nu*ST7mF05O`Zs2hE4`!1k|CDjx@#i7)zXS^;=|om +zSm1GN?6=T!RBM_PY3l7i3i(%oIvq~=RardqYJsg*8b@aIsPFnx2%(-6isnhM6k +z_?w&R&9Z3uk_Ook%fsQ!Y_v=B+jC-_QK|QMpB490GOM(vdU9hl5&teW!wqf`yg`nI +z^5qX=!w`z0y}lvez +z*Ihqo^N-K<%uX>P8_eH8)V_@oW)8#6VQC4hLCTw|v*OMFU1S$9K{KoE$d%xp5n8&8 +zNUKt&bR}2vX9SHe@gtY*-!grV9vTZ@H^WSm!)Slsva|LBvGs>5r&sHJcATkq|Am4o!OP{)*yj|yrx%0z+k~f)f>Wi@ +zmS4wuj707#PKFXzYfN%Kc$pexU7od0;(g=fPtk|1B2K_U5DH+qIp%)G4npQmuFn^pU(OhmA4b?l9qqp60;^O1_xf* +z_@74bt)?#?w|N(M7a1)5Qbd5XurcOIlasK&2fUz$xpwLgfmkGl8yO~nG%|q1m3)S`dY~^sVW16>2d5)5HZvzdSH;k*CBx +z`Yq81TI{1!mt6}t)~ELK|JMSz(y!TNX)8Ayg)P&$(w~|A*2Zc+EFf_duy!+IxJe?+ +zl{#hc#B!Oq5#em&7WuZEcjRut&_qm)uql)#or3Fo|1y_kxj8h9#H$19fwJ4w%3^D+ +z4>|5nay}X0k-S0P_3OUnQw6DNT&Mn=*JX1esEi)k5M*U;z;cC59yES!8mDxd{n`4* +zG-q#vHwKw=mW5^ +zUz#XpaPVin(ak|G;{#p}0Y7=N)YKH0)43;UP^L|GcG;YN9}7aLbaDP<(^p3jMCM0E +zMq-`m@_w;mdjA6rz}x4s&y960_Rmlo!%Jmhj+3rEn5?Yan$n`A0rmc)dq&q@Z{}al +zd>M*;zzKprU2qhv-``)MAw{yLW2R_;puydXgR@V6jlXI?bQ_)0Jv*7B??wFnKu5NhU3b +zqP%D$xycagY1!5@aoJGo&z%EhxneVxrb*boU#RD~%>g}#g#Kt+UVbj&sT9vuQYWlB +zYLv0ak7P+Hv`A?B!zrcn4YSZjZDpr!Tl?s}R47(=)GzbX{JW76whN1$xKfv=F}WH(b#&MAb` +za5%o|kk#;&F#w%qSq~g2C)bP*X@l6)F%M!2wg|m(&ssQOBFxHr*Qe)G;tHrw%E}t- +zDDKx!c^Z48vxkYgYJnTDl7=)>7M3G&WflqOO6G{1iITr%NR6+TTqdB&jT%0|AeKGt +z7Sv2H^Wpi9C3q`}G4mpm@;clMZ(n<3dvyJnc&mLIZ|L-`cW!xo5`1BIds&CXY-L+k +zn)S$lSI;R2;Iy1o<7oR%xe4wj^1UJY^_0hcaFh3!hjg8S8}w2`x+h$;LP9Ut+tvy- +z3Xzm8?65^J{`LL3T^OHde|7&szO`jARmREN!Vrk35&1UDaCL~p!KgpQENh(tUBzO^ +zhU$J(^QmnV%*wi|k$)KvT%Xs}%u!e@oWzs@CLX`<6hbAYi<;P<4{2Ghy((sXps)Wq +zUOMekz2{J0BtPIf3^MYZf7laxXqPO`>f?R1EjL!)%fJ>E54iL7?%<)GcAGamThFma +zDgSkRWg83YbGz9cQX}d@NnFGiSfxAf+Ej={de+v?+j4i|lb!3n8@6tY9K`P;Gf7}lQ}cscV5 +zM+F7Te4v6qzl4tuEAOK=v^>wcy!ga@+coaYik~z;c=;7dlDs<2TmG7J0pn*IxZW{* +za?O0Vbsh+&FZLvDGT+*T*&fxTd~d?FaR!)gJe~DST7#g@zCwTpu~|>B4NwATK<)~! +zAxn8Vk5)?&r619Z!L6}ItFfH7i6koUJj8@rH<;CVl!nKiaO@e5>+V_$vqpdN+jCNT +z&A3b~JGKs;yG!Yhox7e7tVyMtV^8h!37~wz$LWF2wTef#=eqsO0^x;{D-0br0+w-}LlzE^%28T&(q|7tU?fQO<6 +zzqLFU9}6f8AGlxfGjYu+dy-pSHr>39BbAfQN?CL-W%R;yZ)Lf6#?g_efXZR%kW_hl +zTRc_BEBsg_-I76F_%K3g=N#F{==%qkT7$x0{y&8iXQR1krhMHTIaW6+Lu&Zth^-zi +z$DK0OM-8ro3?Eend~#_ZR4Qlo_A&A1KHc-q?8gT?&rs_OjC))wC9IX|>q>wAQ~_Ef)OMcs0z^J_Rv +zh`2Y8YoWCpDfMeriD(*qv;7i5_vX@~w{LElvIAX^4`>1A-6w(EN}E@JyUkPWQiY?= +zHLer;yk}b{nO&~<|9WptlZ9+j_E)Zz6Xa9hy*_+-EkI3*st*pPR$cYg +zi{eIx8a~r}W@=9-;mwWa0%l$nb&f;F6r2kVQm(`9l9iAmL%pp}2@frokbq=0 +zOj@=chqB4v61~s7bv-uFBU>-S8#CS9sK6Ab_H%5u%C>zC+%gg2fq@e?K*nZ*_3&`+ +z|IQ>q9e1fGsDx$fr}uu?X?!dS%9e4f>me*ark?LN(8~@pCs4Oz=YFGO|2PX|ewI`! +zRg~f(RZ?mK0I<`k=B&CRkzS{RU>LIk?6oth+@SvAdCd7n^W#?&&B>0+ib_RYHPZDV3d`hp59@>-QQZ#_~hW7jZ1raKliJeu9;yQ+Pr@>N^J9nH0V;A%Ui*FST8~|sE>r6Oz+ZmT4YahX?wsiE+x^OIweqvJenivW+n}FiFVtx)6DAo~>DBLPwRr*kGaPAq +zti0Ln`zM9S*+*8qp_Z$1+;961ZB*;xOX{s~ +zfSju+m@z#~-lF!em_g#5$EL%SqjbUP0lk9MOX1g#cx35ZG!jP*r?7yqPbvqQiVvu` +z>Ua|?w!1kRr@Q9%DD8_6gRf;reG=^wpbo@y_fmPsLPUH?F+FepCHH4e7-)G+NS9Tq +zKV#Cf{MSIvvJ~?2QEz)tRki?9G#s^GE+EV;654MRM)Pe=q|2Byg^4uPDVnp-PiS{6&UPgb- +zs0h-#8b0)05P_IHXSnE3g%dCr?z>*Z@4v4oB`4nQqxEvA%D-JC>%B*rl3-l2Lg!SC +zIm)J;tEkLg6h^Fj34vB92;B8qYL)=OXN!n)w`+CnC|D2w_@w+H$p0IDoA72&qhJjaY%m=aX_s7e_u} +z6Z)arDp+w40k@zM3IStljyqF1;sPwqTR^l#Zm_Xhy~Vj&D=2fz5j#uO`^DXF*B&XY +zEpd=*-DZcA`((!}12&@10|tRtj?$W8)Waz^y4^^4tA?J>XY32sfiz(_I=y%#`jBoK +zB3W&*gvR~7i*jg>t{@!P;USKktmGWq{@eGzDWu>c4`!~T8SzBi`>F3j<*dmMcB&Fk*4AfihSsO +ztAkjg?m12zZM#L|uj}=saaKpuQn)i>w;lHxWt){6j +z_A6^UzI@T&5`{BifDd`B&8kbFKofn+=|M^HHnA4~-lUCA*C>6x=t_q))2_CBtj<4t +zH(hm8HqTM~rAHLq>_*g&*jG!76)XjjUb9_pc0a8d>C=Zuyk};YC2L+k4$_JxLRCGF +z_Z{AAxIM~9K7~6IRM=)ndc9u~iNp;2mJsI^*iVoCG9oENRXQk$?RkCGwz<5P1W3jr +zgo*B~{-Z@rk{{zT?xp6A)@&yP{Jx5Oj7$(Fl3hFn{OToVm$ze!1zJ690-hUuhNu4J +z8cZZrBK#844@Dqa>JoQhZ8x4sre9R%Tpf6PT-e@f2UU8(Bs(S~Z+&#$x2i$Ui>4;z +z0l_*UTp3W=KD5pYPUNOTSs~)eHmybM#LWC?Q$po1fFBc%=yh6^I~H!*;)TRW54t@rQQ10;ai>9}RJnKvR- +zh0a7UTqI30izPRWhe#j9stf?efRQ4eRuVxOMeR|R{UAq3`Z>Nrf#tHJkiVtNBDw~@ +zt#D6??ykGJn0=k7nAxlpQltS>`S32gk9%;-YojBBB&HblKaXSL28Sj{)35N%zmdM` +zMB!ar;j_g!V#E^V+$LD;B?afHjxFC})g#FeFd*?s;AGjzF0zIKRovFKBKa!}FyV^A +zjSl!Tej=^uLRp)%4MH{t#2 +zg0}smqI!bG9_jXq@TPkF-*HLd7agH1`kK2P9%3HB8O?yu5*!cudSV?bKD#x{l((A1 +z5*$OSFr`oWi#j^?-kTFJ^nDfm%qs05ccW^)Z)yt-;7VorORdb1+ug<~r^lg}W`H~y +z)c@3Nj&*dj^mk`D^Z?mFW9x<7Ro2G51%qOv&*01ii2ywIt%jR7L%AXkCM5pKwu{PX +zPBp&PyM7wIB*&EaeFtPk86I_;XhW1D%2$1z@qktZNcg1Y)mzy8&Gz+c>J1^`aLxX{ +z?~BP|uJACL9&6P~V>_tC8+;UW2H{tEEJwVK;l*e!sNBQ5M~!X+HF3J0iv^ek9k?N$q9yx6cJ%4%6tMXnNRzkNQ)xO@fp7ktmr@4ay>@q4Xbu_=q<<>T3 +z{~DT0$%?I&`8Yg7e#}O4u7Gf~2LsH^sxX+3`FeMn?iDG5AI{ONrki6Sv??&~+l{P6 +zL~S6m0%{e=fVzC6C+kKTZEbHQ^4rr&D#&^h1{;eiKu*{4o?oW~=|VQoxA+P;r8 +zCD1(oIKThiX!y3H2`gfxK(~qn;9K_dQoFf7=US*L5mKRgj&3BCPP5d1k4$Iwrd_Y! +z-wDtREvU^h`>_-JNEo>iEC+HZJ)my4Pe59a%#w~vo!ewa9*asAeb({7lY3@d8x8^5 +zA}QwmVpl?_PK9}$;h;aVdagKhZ90nOFM9+90w&wE>8piFXDh{T%ZH3%Sac|$PhRq6 +z7*`$eE7X$`=pHj^m8LiMU1U`4|HCzyT|*bhG_O4<=aaa6vb9$O;k|^+f&4oRI1Tf0 +z(_6SJKlTCT1fv6A@VpAm;RDA&LD_aNY-Lf=wmilcT#J* +zP&4$g90JwXreJ+HghS!KFBpH|Z0J1}SDUWNiI$FaS*Lw@koM>GIL=)7ra2x2L_+ +z(6~}{8ApJK@+~p+RMU@gMQq*{k^Th(!m!B+wa_Ky +z6@?u#OGaOSf`{w&O0b&p=5_Ukiq5>~kRgM`L*{nFaD%X&3h +z?}W-S-_`HiUzHAcRm!B2sf$Mm9N)!I?;9*(!xRbJ<`#!^5vxpL;v*<-ORbRT%$Vj%sb +zw`P*>_|L$>!$;2RY0YGW%0|MAGg#qo>en(+*4gcXZ&W~M6J?vqbB+zsm>W(@1!&n} +z2~#}Uu!a05sHb^R(scfp7QlG8J3C|oSphG+=|NdfK1p&sj%gma@M#i>Qxm($dn9_c +z==9dtbe2lr4QO}iCJi@Zc4RPt(gMP0TNah-#N4Z(o!G&5zL`#Wn21a43TZlVSG~Hu +z#Ktz5Gvybgw`6qvagb~WI&n~pu13+ZAo1e8%i$DhmfVUZv5V-JtdD+*_%^oWAssG= +zixbi%e`FDEuG7^n?Di!?*2pEA+;5|ncxK6i|81;@6`|k)ez{o(foh++I26*reC5{*>kw>rSZ$ye>~nXCNU!e~0#~2Zy1r +zGgI{+A@Q{{JjQ81MJG0djV@1JGg{4^!2ReS!W0!y!b +zZhad@{dlD5+YCM-SQ_%@s{^_ORmTG3LzX@ZGrupd=1Q8Y6Rz@{(kJ`G$xmB|($Di! +zVeQZ~;1Ry6mi^_u*{Jn*B!rD8h+gkXuJ3)ok}>s;b1ETC0GC71`)Z8S**I3ou5Nn|WTkHuWvSqy$y$3u&4w +zZ_3sst$H$s&OLGr7 +zQ>AWZE=Y)e1{%?TdHd8%XM=)4VsS0|RQ$=qmlc6YWRlY}Mx`VtoXWyM0JsD&qPJmj +zx)o&Qh&ns(0!3~KqVaB#bq+||Jbr=zYQ$$Fbs&Fb9}DKYkb8`m+l?&H7`hD`WPidlKQ5R53U>rnu17fSj)IS(S#;siGSvCOc56UN8X8bW6jX{x#5b&!EMPo9t+w(gNFxtcCMif*oCg5?3=e6EN{;e}M +zh2Ac8!RGWG>xiUvga7~&;l&h61<%*!MjjOpTh;{IS!5WnE^badz|)_v&FsFDY^1n< +z?=Y&Z40H}#9{v6lxrm5-RO3sG1`O&l`7R1$_UOR{;K@N?_qWzMpL4RRxaC&P8&2-_ +zilbSyf^EDd`k9>~UneL50HkwCmfhH0ShExbyjpAn!Aa|9H&Z1MgDr-@o;uERArsT< +zQ;!A&I>F}zE~%y9@dY!rr_STj2jf14i= +z4?4d?(~a1M#jIpc&H`Om^ZC>a_Uji2EuWB|^?2)q8u}~UJ!6qI?+2EPTT7qbO6%D5 +z|3`b-B0fRBAKkh4n#s^1!a5kO#|{hLy_El=1sRDdS5J66xrKWJCa$enH%03+l?W-< +z?pcQ`p)#m98${5D0{Rypiv+h>WErr`icsXhZOcN%rt>8WlLhZLy*We{PyiI{2f8`M +z`0;!?zGV>%Y%xG2i@qJVd*Y6Z%O$d)>Xzh}rDFwYi`z4^e~CYZB;TJQ1)mzSI114$ +z78B)wFDW4T;8lb6CG4sNL&zBHn{XWk_CCU)PGiqX_7S_Q)PifUOXl~^+u6U*Lj}VM +z`9}wp^?^?e-XBP-m8f1g6n!7JP6yFii^(NTNRWRyoBz^6v1w2OR +z5#k>WiT&A(1=E$h*ibuXAxj9H#KUWBqpPQ#GV-J_jBS!3BD7u1D%VXimBMA8Xgr9P +zDA5U5!7O-?DB$#1K4Sd*%|Sxjp{}v?Ao_JS_F7A3Ui;OdT%&Z&tk2YDiML3iF%3}y +z3Sc&haSqaCv>GhIl|5#6n^>ZtgM2lJ*@hVjM~tl2q``LinIhBvs2?%rLyCK{01d?4 +zRR8pd}+fhK&>6SWP!anBZhrG!>M$Z +zNhKoia!m0j^l_eXy;!C!A9lS=a`wQ9!m=Wh)TXsLsxe+aH7Yl1u$iOzPf;7Wq0D{J +z+yp;zwwe4$_b*7q9Mj5_6Zg-!FAPa*hyXy`k6^JJVSg#jW2;&^p5J=vdmwMI>Uu{Y +z1lK>2YP-G7V%wPZ%i7qrvFwXU(!P8PI?F@8G&Y^=PFXI5Pdf)%JBRg{=iD%(Cvcg( +z@XP8>mr&3kh%8Ao^YEj6RE-T*+1!-H=9pSRzWAODp}2Q8?DKo?Je8;13deV_%t%7Q +zPhD1qPT#*%oi#ObVYIRh)>xt_XH(hE)*L>TKJ+e{uR11CWM=6|ZdrW5XbdK;=1V%c +z;07>rSQLdZ?3W%jSVc>sj0u*|5OtmGNI^Q39q>!nvGt@{m(h9QFSebm!GalD(}t+u +z++<4hzvO)KBZH)5YM@|?e}fhING3T!*SpgN|M=9~k$%+AVy_*4e=>4~x{oDaViJJc +zl$m~R(WUyHB;-I%z;yVd_f?`a?gBlWjcHKQUGMf2RcEdO20pLz|}sPX_nHcgT8I(S)}(9SFo0aLhm=B_bc>NmBH_Aa=$`QMrZ|`;9@)Xgx5Nv3h5OztmRO&8)Js +zeTp+Xr%<;j^o7wtd*>NH9u99)b9Z3-l2VL_nE2ijJ62p^U#Inm6xa1@V*hJaMuRt) +z0T`0F|H;g3fa~oS-Wk=~?_;>_lN#1=utpeg!t5QPC2Ozt*1w?MGXJ!NfT~P8EI@4$ +zUB@ACj7{^~>}2%i)rq}*WdREsV0Y>Mc#gYtBHyBKd@yeJBFO?eKu)kSaQR*CyfijQ5}M`WS!VwktYLH@G#|E~pr*_&AO7@hb?9sz3N +z9ThA^V2RR&sUqDrr%Pe^el}73b1~BX&RZ}h%B~>-P`2udQe}m +z@ZL3{6sI(oR2vQqpK%bu0)Y5I2vm~xkcnd7Ox7m-)BEk{{=LVs +zb!Qqnd4+`LsRio`BrN)UgdCEeI;o!MDeJ=`^0}%~^gXD(M$Ycq#MEqK2jGA<6%n`% +z&yT!Iu3;%2SQ_IobF(uWx35vdjZA6lll&f{cK@B)b~dr0#4}>Kev^x#qrCv!@HOsY +z@xL@6>I|-xD8P>z><4)WeVpuJfx-dz^*C$e45FF-9B^;-L}BdAl$t4aZ+6+xjxER`co%gVeHO>lX#xZUPl2DLATJU7j00kcn(TIHbp? +zDq0n*tsd%KzhgvrnC=Afbjdfs?dGK?J%yR>KAxzaTyno(@cnLg922lAd%?_BmC9=4 +z7Z6|5JQTcFd1Bn(sN;wt@t&ax;{4(ye}w?*_W__aolXAaKFyozXZN<}N^~108#t!a +ziGCA`%yx{lydphMB&Wd*E!p`9cBDFIH3xlfaRp2^)^UZs_>r<;xb0~*e|f0K?oU7} +zx)noyb_@0qT@#_oGr7N+Bq6mA6xo&*i?`pJdk8d?D&CDsFZ0Pk5m7s7^%Nt5dR!Ls +zKcFuvAzy`=^B6rt$mXOoJHPonS6Okw4ABTh+^cTMhR!Kh+A>>lVjpBeo%=* +z0iO=IeH}B>lm&EMDR&REnV^A2{5jA23*mDEr*eZDQ0_S2e91Ts=&xR3^uteVsd@^^^rZGWh~UwF0Ij%tP$Ro8iOdn5}E>I +z>+EdFhH_sbkjycyZobX4!ud?#mj9JP=QTbWvL55w+TGJ?F^LiK_WY9{+}6>2p9aG& +z+kGKtEnGLR_F5KG+LHY5Ek@JvSbAo;>@&Tq7yx8sZacmttPZa`kgKk+p7pffVl=hr +zMVdeRjiN+V3I$|}$l!Wv{>%HYX^Q8f1R9Qwb%QltPY=%Yi#uCWK3GMg6Oc+ +zeBD#i)<5aGIytq%A1mSX9oyTnKS@E8` +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 +z@>1}If?VZ78gTSjiX +z;rbdCN=Pt;6g|u0vytOeg&h2R?b8Yoh2+Ou+>X+Yj?%7+h3Y2aJWXBfdbiDN1zy2B +z=oGOB>oiL_cV^^Ub>^@Tu5c}%uNJO8@&D$MaUe5$$W1}86vYZ1w&IVw +z%+MhY*6L_ti8)nU$kl{d*RIqiW9V +z=_1LF0xa+;UBfd!HSDYRzS19jQ9lPd(*0jj()gA5yES~A+caE_a{fyL9mUk4s%g5D +zlDpQ?w4&yb`d4#M`euOZ;p`7(j62K}${a;x +z8P->fX)bj0WnwuRRo0C&#TjS)CIC^Wc9Xnnip%Wa^cDbbE)OI{@8i74D_rs3W +z+tpIcCn%V-j@F$t7pF21hD_}Ijju*Ho5+a9u(G8+$Ew;p^Rd;H;ycQO=ElA>EAxdf +z0m-KCea?I|CNPO`Rr>AWo8#B;1HcW4N#Qn%25YUqQ0UAxr6%$E@*d`i-7$ujX4 +z{Hf%jsLvbmdt%U(m0ACvxhX+n+S5|W8dJYZZgJA9LjKpWP^-8?G{IpGctGN(z*Em9 +zW_^%{AwTh{CG|sJdrFK4!z^2Vma_`j$_h|pvU +z%3S`xJ~NE}bd-1%z4>Ljsqm*a^5?ypNtEua)!c*ClujyL%arr4)t?JX7YeE?$Otfb +zN{epr_lw(XY*T-$Gu8|nhiTK_{w;Bd;|G!^*g|bzr#UoCSm^TQE%g{@ +zBH1`MBhixot!s34b?mARHe^Dg7usut`Q2_w#!)>BJ)JSGlNRb>U#;IjV>ly5X$3XA +zF?s0AHmciN!m7xNHcI6bTe&`~d~0m3PkUmzdzqBTkp{kFF?LqHoUR#BBafj{C5l}@ +z5+8ab3%AbO;+x0z7VCmwF9TiAVGkv40!?b^rocC%(D%GRQ&d%U( +zf)h# +zZJavR_Ur7G*6=cE+tCRlr6--Qa~%_-k*$ksxRT;%DlfStVj46BtheVo6&>@pk>hiF +zzxOF=pZU4@cQBCuZ~8>>c{q-! +zxClx0E{f$orp0v51LZe@7}o?hnSCn1-Ga=*BSx$it!YdLAj_eypr@%Wp$N~O8dEfh +z3cBd`g!P);O-Pds1~Oeh&Lw=1tLQ;&8Z~%R5;6bUWs9+~7N}lD`NWLChdyVk$Jgr* +z2gm>b1JVrpz!E0^S~&KB!{tedSj10A+Yzj!BK#>Y2lHaDm--|!mcE~+I5U_5D{D9? +zh5bXDNG*F&(4l7+H-iKvB_}V*E|S!0l#@|TVHU#zF{EsKfM0Jwzben=br?^%nf=X4 +zA@Nhq-x`HeKSN|2Y3z2%rrh7YA96jAVC3u{3S+kHVoDOAWL8fCaf9NFd96X2pCsgSzX4*ieeC{poM&*I<636Q1M76&#J45 +zl`_XVli)qdiZfjQky1qBlOmWy`IW?45n&dtUkH} +z7Fc#Yio%5;$?k%;Q~ll)09BD8AQ8s{E7EZsJ4wln!WHZnX&&nH0Cy+w%Sp5Wt6tPt +zUN6K#Y#d7b6YLPdfsKcs-9Ij}(_PnoUmIqE0HJDJ^SA1z^;}H+n0OtA +zjY;_7{2i8R1wx8DpG)}xEJZ8>zueyyx)q{etm&BGbU;vKPgp7J_x7kgR(`kxITY9^ +zjwcd0SXpvJ`TzqeN%ZAd+`!xdi^-=^KBN2?WjU-Q?up1{Ui+Y0vnWY?i-@1LL0%8B +zvTqA2xA{?VE`3DsH}>x$y79b7!pscCGYB2&>D)zb8&GHn^=X2)7iw>{^iTu85{M8Y +zT2*iLT>alMuzB~XKfP7|h|~J2cfnI^S(A|E{s%5Xgi~7<5#ti?D?+z~1)k>vG>SL_ +z>8AD9#mXs#wJVxk7^)O8u&2<~nSc2!35Yp$?k)?Pd~1?J)l6Jy#DjtxJzg|)Ga|F7 +z2t{}_@$A?CJd8>jy_C_U#N!j=N4GGyXy1JhopL1?6#>_3)hk-f=SOQV=?0xSQR0HV?N;(H6Ki-WsW=|^$ZS+?Y#tF2`P%_f#|yD0+bfWdAE656n2Ban +z<|tuI^NsJYsES&mXZ4mF2FVO0khMHlnARiW4;r|z`03h@p@sM;W +z79MPEAICnGF@yr3KX6RJ)AMHjj@Tf<&|ab9+`Vq}l!vttaxjgBw=vzcv;cdOOj^Aj +zm-8`zXx@xrI{M}!*zvQSRq`~Os9A#4t?7xc)7t7Rd2?OfL$IdiH+>{o2l`8*6k{_Q +zd6>>yqK0Xb;<_EBKi?OcN@M*mwid3Wsi2Sft$#UyG;KMv3bLqtXaQ|%ndip`Yr@@H +z2go%NBH+j5fN5!>DH9dAe=Kq2E*lsO4NMQ{YO}6)5GCs{gh2?kE{*Rl?fP64QC9kY +zan_<(BR-a}#Ev84nG7;?1o=5)BlFv<+{)l)eav&V?3R60t9h$8EHk)Qr)^H=nj;?yhI2 +zGnsehp7eq~SA1HS@#J5v@cT%1AIC4$-K8kSy_c>ZJ|g{5G&8Q4z=H!AAFNk%xhK=oA(y+~X3Q$vo_9f6IJ!(&fo#C(KZUPk4$A3S-T3?!U$WW3?Vz5-|8akOy&K?)mCv`d-Dfb +zbCPob7v98z!|QPo)xX2|p{z~x6`1{-&SZ5`sIfzF0DyeMF(&&YkAZdl2Jwup$3aEt +zR+>vBM#{icK4U)25|Gx<`$UkE2CkB5OtepNJ5@|25a{>p&FyzC9Q9r^T>JxOZ);ii +z>m+Fuh5h%Uo3PHifhYq+{fvqwH=V(`rZH{@Y +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 +z$gQ$h_O{cBqSc*=B>Jjc( +z18UKpuBgvQ3LY5rnx3`WRbRwbXIrNwNMZJ-cRKwU^14D{;K{)7eorY3HX;eL!pxLU +zqo1KBsHD`xeaA(^UWCoS7kQ=IEUsyPR^H)SCg5Sb$=rI* +zrBx+U_B;smIV(jn@f8xH-!9!`)Y9_7xE*vXu9_TZ&IHgvXnp6iY@&-+4o(XabowckkgB72rqDskn5u?W)xj +zv2J@vN_Uo0o$^78=*Ll)wWs9 +z#0m&G{1uw?nN7f4$*480PqWfOVsegbkSZ-g`vA~O7WqOlD(-YI1oD^bj&ro4se*&5 +zf+(EM*P1;l_m^>m$tANn(JE1m?0Q@6)am4e*3eDGcqdyWM07lMmCc +zw?2~aa{TfTmy94W)gJa~qt~9(5vz8!uS6+_cpS3}t)rV#A+#PdjPvxF7ealW@thzip-msc1 +z^57pq4Wy-|1X7RT|>8EQ$k3)Uj5G*YJT#OiUUwlBSR1wqh +zDLD}O1iNSZ9$%*~)4^?T^1Km?8$#FouyPyLZ};q*=Q$5c^fDn4V4uV#r9|Ghb9lX< +z@jw9$oF2lZ%Vl~cjI`aTW7CxmIu3o1*vC~zogB8j2CZtT`^*f+JWBfJW9-)Z@+lX} +zTfFupK~!K{t{pm;>vjt@`_N`XycNyXn2b-A<_DYg@zaTlee +z6wUpF$%sDCRSPqFeGD=*jHu(VpQ~_6jkUEwI2K;hykYs*_4(eRrJ!(Cli=||WmY(a +z6c1B!@gOe79vFm8Sw_WNf)l>{z$QDyjO|t>Rg4VfxAAvorPcweY{>x{^;8{xgoF5L +zND3eI&Ku{;FR6k+3QJ0=H|O+!2UQBPZ0%hvstd9n^o#2MZ +zL=OL*t@uxA!0&69LZIEMuq*r_$;1E{_2T+IGxVI=y8=hV-WbZ0VNy#5~U4jMUT%s=tJ)wyQ%V +zye=6_6~#m|uWEvvs9~UYnoB0UZ-3JO +zjQBOWwqnL6+n%gi7{uqRq#LWY(r0*V*!{ducZ8}QCK`!~PPqj%c><~HE2YLLsHu!T +za_?U5vuIt5X7?~%UALZmR*MG~<$qwRZ3-tcUJF!zl^=05JvK*y4H!IP`~I$LuqP|{ +zMw91<7!8)WRTG#g`*3W`)7&g9Wc!<41g6H8f +zQBk9a8ri2674>XLoUFZ!CCqVUV=#}{^rOq8rL&?J2T!y_Tp*q>7)Yn{V{gfCr5T7j +z>~Iwn9JY|K1=v}3O0-p2)A15n&yXFs3eUi3&3wUy#mYmkMG<5#}emp3;Q$NM0qkfKFbJu{esb?5IJ8L1BlfPtUrze3{mdX!m +zX>-{70}(*Xb@Sazz{G;R(|+zQ@5$`KTk}A9^0JM#^Bz2P?%FP@%hrU@Z_JGy-yUM= +zAkC8?1*H4t&b}2Uz9Zm<`x9dz)YqYRU5NfEUP@GQ8qPpo#_|@`tsDBK$@7E0 +z*cfloO=lQ8wGfoZp5@7>;^l|#s)Gtf5bC|C0)FTa{!JqXHK<;}4sd%bcodODDcejb4OLa}?-d|A9jVCsOf +zjB@YH1`(TKgRSu8E!q!un@MBO +zVHFG>R^axfwArZZ4L5 +ztpT|MDa47V;TWSlIo8@QcZV&)E2L`W_=lq}3A(N4>tRK-j#vgzzy(LX$8ciai8nrd +zU%JmusgAQ(zlMg*l0Lk+`}k?pSQj*^NTtXGVhhP?i&Ode9vW+XO*1R*IN$5dZHQ+} +zH*5HH2H>pYJi<;!=FOO`LPh&=W}@Algr7+CKfmLs+-{BxZ$W(E6LVD4)^#dnNLv9B +zL3#Xw?x!T~OewhseEh1td|aT@Z9HFtT$Ci&!lR^&^f+Bs=s%0F7C3;(e72HUUK;wN +zQPooT-U9~E85`jvc$4>oDVQ-dr>x?d@h2>BuzB0&jM0~TR`T@up#IHeMXcwQ27`=Y +zUxjAgsn-<8coz?YCN^_p9V=t2_-m1Hy@mqXYX1o?JYY{&lT=zn&-2qVo`4Cnx@7Fp +zng98E4J_ITUG6@+<(}eH#$N-~yosTZeHyDU0YG*s8G<4j@6tyAYC}HXHi+Rp<+xee +ztEvthH5{_9<1*&ifX@A%+|ZPGl0{fphflDg8eGHQBtP==jnIxv|Cd@=!l)%>i3RrO +zvPWi~9X>)WVcYRQ7C8*QO6$s#b0T~3-op@@d;`C}eqV3b3Cgd4I)+s8W3+N2u_%*Q +zV?2~v^@B_+IF5EnG;ZiH-;!=Wo6AY-yP@J2NkvlwH{x}Js>gMi44Wr_m@tbwnc}|7mk}Bv8YA>Kes(ha*8tVcLq%rO(~=eMB7-$0q|wt9rlb8I;%LfCKhYCc_W{j@UgSGVsj*+ +zQS@f`boHvX@}4Am^`~baF){IzN;2F=(XJ| +zbZl5BNiYRu-DjV +z&h6&oKE9@vk$|uED5pbXv-eC&5Leg$qA&L0g{}BRttRBv=R3XN2Ow*p&mm>98A0}R +zoL_q*H@pjd9^H}~9$+$XuXIiu1Kk4u79W1Psj?@0z~gz2l5MTN8tbn2JdXb +zY?IMHYyK@SIYDLlkw%at^#Zm>zD8Jc%_HMxgAHnhWM?X?jP^~!QiTriv%y#kt-pH0 +z1oS~Vex=1nL3#fVGd!=H^%h^>+?drdDA7x0QUA&}>pcalJ2XOPb#7}oku_gKoa9Cu +z@(uyNq~sLq?cbw;kp8MTe8fp8oN*(cC)}O)MwtRp-#jzbzQ?9WR22U$02A +z0qPWZ*gkn!QLN-Bw|HNEe)iWP3SZf4r62Ybh3!iF6)p$?ooP^a%bwuq#|(^npH6O% +zmVA@LCEVCRwm?sR_>Vv4b(b>(aFvxk%JK4Nn97iwj8hxYLC1se_i;YLpC!9`AWW;2 +z`$p}5ZUYznmqKK^93>Ju?C!Z%FMSy-g}TW0NQQ?4q%`#Yo$?+#hl5xX4ult=*X_bl +zYm*_Z&vSh9x2-<%T~D2-)+k7^*n8g-2I_3#K`R!bn%Il#w1X?MyW4CB+CRCrESqY* +z$F9!^-s^*H4Y+-@9w<=FkzU;#Ze$sO#>dl_)^_;FwP4VzzzTWFYp$N=cwR~ME_UO% +zG!MnEh+iO}*W+smVo482B&xNZ9CWbd5@)2py`BjX3CL9i<*#x9)>ul_(`M{8DY9Z3 +z#Psd-buW|=b!f7+T+ap_uu|gThyGC(!>Ae_Ad?R*oN93ugo~ +z-`=dLK)E7TvTNe8SAmTiY^jijh#a}u3Br}?71Mh;@_H#y5`iks7^P(YxLcTO1a^0} +zEkDEd1W}8Ot_6{-0?)SqLxfO3d8e0_89Rz}_G%N2*VAmh!N`yUGfugLv9VBa2jZqMfBw#8A1n~V+hG#2~{#^ZizVi#G` +zF{TKVs4>YNwThj+%nqyPL@)3tlKY<~t(eh=ZV`d5^DB7s5`D1R9$c9rVrOS=zM%Uw +z3mH||5|a%OI(G=uV@n{v#z~JvTXsFF4$H0;Ja@6*6an;eabdbNTKE3@1n>8SJRmCp +z+9?qsJ7{IHD^ORA&=fW_SvzIi^s}eqH(W8H$a!^3=BT#+f0Z01Y +zj^%Utnf3MNxdQ~VOFlfC)a3}Ab$d?^Hllp0d*mnGnS(ezcx9NJBp-f=9KBPV5I`U3 +zSATh%o}Tr*pTCv=aZ2!`?^k3o@zm04_^d@UTbyZ@4o>hl=VV`gbhGPkbR2~*?=+oy +zhJH!G1s2eK>XzU@xkJkTuCsYHeN=$}zyC%iq1kRJ#viT>!{n%=DYP}2^Vh^Dd9aH4CY?TOX-z@eQI<6~6MN<(h +zciC4$WNgZchL{(aX}$zCy@Hi!p2OEM6tX-IK|hsb9tPd +zq=~eejFgE&Zh!(1)So|!%UctU?@2#FQp7@+A@l13Ee%Gow0@u*Xt*K=4)x%<5=T1u +zr +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 +z|D)*~gY#;;D16eOal=N9)7WgR#a{Td^oLER +zWfd{>$wb1HO{YK1%l?%ZdHMU%14NAPU-9^}SX8i^-nqwD(fb%}#iy>G5x`b6c-z7Re>rz0=k$k{|T_$=WtHFlvzK +z4azjI$s2X`ulgu6ShrAstHb +zSqyTdm7~U&Gb&5!`Ar;76bZ4P1W1T(N3&7rM|zt$bBY+ +zp+jm+3pmMKK9>91@kr`(%pJYoX*RdTzgoZqS-vq@O7b@qyD0mdae>j`zVi%SQbdC| +zDM{nqyB(u}I^A8f#K*y&P+=SnPw5xQJVqaWFa)5^>=1S+(e3Z!=n|@m5 +zHK~KvFEK;xGQYb%U3n2KzuQcn@|wnMmraoQJ)F8(v;Ff4TkR3pT6dSTlg`Lq +zUyKZ`*BQ>JV%myL{T@gvCF`|O&U0^XD6bqbUT?KHjk}z`Fb`4`5^uxy$GWs^=|7qb +z%o@BN2|lN*A1clf^}HQ4p??a+MxOR-xVhxTWFgw%+;0gEZ>(%~9M!YWmle~h(Nc1(_zihtFGx)!`2raknh@H-6)G{2_%m+5!&W>)KQFcMH^KLK6E!p?Gyv$*p +zmHsGxDUGJ=6RZkYd(=QstDesg}lnS6q +zXX*so>A!q0(?7WaPhzPDJ_M&-q@DcG*HdIrjN|xYcsrxP3C;GwQHDNOHniU(Ms2l9 +ztc1vdmP@npUx8W6a>=@9nyycsPEjLv+oacKJk~Cr61>)nEbWoemGcK2KcdOM{k`lz +zqe+B9`(OT`E1Nn7ouCLRK9W8iM2r+4O%z+Aos&^Xs))ts6H$d&9!9aCKtVxzn74gd +z6XUSxnN+T-O^^yiQF>tijHaT|PnnrZoL +zbTM5HX|>f%8+{SZlaUc_3Ir1)iJTTijA(oqb-X_B8z(AXZLSRyN`8DxADxb_oqZ@h +zSbiiA4D+})vsiYW6rm?h)V6+j`I+;hGFqza#6z#5tir%`W+%gj?wN7e!~gwhzDu|{ +z^0!&!iSJh{mse$>r({+W4kkNfwSEV)tK!83y�==0;j%F=Kq0P>U~X0$-7~AA^Z= +z+a*N*`&^{e~`k2;E=>+k2~oi>DYz9mXO^Wm*!9>B5#JZ*F0Ggz4>VU +z3x6Dv%XT!XzkC(DndqFCglqX2(#qabHLRxC0Z{^7b8XtU~yj}3Mv3h~Ed*LwN +z=@H3R6U +zCeF6W&Eu77Vrffut>>^ccJ3|FRS9F_v +z8Jd30bX6t8G-%&OC8>0qyYW*t6Ti|;w$J#ULfu^5t)?m$VvOboj)=m=eNV3I6KVl6 +zm0j{Z3&i?B~#oW3Jxydgt5B{n#ntUHU +zQMexpP1{P{HeHHLq7JSH{`$$K_|)1q)@u@Pb^Wn?nWw&-hc{tN5eEs@^2h41%}>LD +zB927avo|Ftof>__pWiwJqI~$>P=z&Wx~n3uTMoj{c3O;LMQGVx-MEyBAG>=+%vw1p +z{)(P@7}ae*nWbCR{Ya6$mi>enGQ`Aj#G%sfJ%!x;wUCd|j6kx>y6?vf^R2GF+m-=p +zY!2lC3y1VHcyVTrA&lJ;{Jn%j>X#@e%Knod1!wXZa=$bcNwW+A*Z_+!(T;qzw&%+B +zW4>4Y>J*dHCR^)a+CX|U+?!h_rxaJsWz!Q;7`6VZhnU^c=2a-4#X|(Mv)2R<$NqfY +z_j#ty)_XZm%SDewed+vGy6osxf(p4$yq#YPpg&f-d2m42xl_@Hj)5GQIkTb4t3RpF=;3o4fG!aF#i>$!XcBfyI^STTNaaLRz^cO<+|{(D%q_&+}b +z)BFh>CK5+m>9wyg2okFF4O7IvG!VMG%mFLr;>`MO`ltjG#Uh1qUM)rwL +z%0BG+l%)YRZp~V+<7U_m@m{T8(OKy%=%t&rHFRpO`nu12`^>kxqS2fk69;KkRvR!R +zr0=nr>I(DP?z)RfpCOwgRk=y^4|_xyxo_IwfzFD@^#0Rm?sZ02v6E;1u@_T(SwRcw +zh+OH3oA1j%HdGXp7U!EZ+fuLeY|kfMeF??7-O&9EWkLg!cY#i&ur6<^AH`p^?l0dg +z34$`HcIOXCU~_D3M@U6vOsM>YhGOgI9TpJFQsl+8mTCB*l`tMV7racN=uyRg<%Doq +zUdy=mwM{Sy274%ad;Jk2Z{>75nQ4+-`fM4#IQ~3>XQ-JS1%Dk7p1-}Msg(%P3G)>x +z_m1FlJ~}B`~&?|LA=554tZAEZGUcLs*YV +zG1w5X4QW&+6N!(ed~)Sg2xABDfw46`d}@gg`(PX2tF3jcx#B#PbAPeOmUEsH+U|m0 +zZvnatWFZVmT^wkIqYL5eKfEVtqaR +zqegF21Br`!$}VXXurZUEaa&><3n+-fU;=wd3v-C`Ii()qwOx#mz26BkvEnR=cfYB= +zB$Qx|&R^s^=tN=EtZdkcGjcT+9M&1>z}QyxODG3#IT`Kzxv%m+r%o-@xF$%xU5bsH}?8oO^^tJ+MzG|p?rH2aZB +z_>b)o?SBu~$2 +zT_($Xk=d32A3v6_mxZ5Gnq{c0s3ZytY*()bUk|4vELg%oH)`kHd2u*Y +zPtCjA{7GF7K+pJmu?%CA+VbeSiod~eq6LG=`p(c><;bk4PDW3-pb%?CR>nY0Y;0%) +z$^v?|Y3FsPABBfFDCC8-ApkItak1R>%WP|hz=_teD +z3e^goTJ-<$Zbamkaz1osl~HA+s%4>R3y$V+iX~DVtFto3v4MeSr&ZvS5h=x +z3;+v0+;W2^n~Rb-vcazB6x!3oJC}tBwR^9B^P!R3YFmXF88BU>fBzE&(JeWYSp}1bLyEuPriW}m!(!j~oZ+c<( +zTs+`po`M@DZczsDI|>Fm0^TsW^UMz4i<^n_`%H~v`*$*wY4xFMLL0+^xwf38A-*s5 +z*sYWe`3H2zquKThKK=^raGuC>x$~1Bp?LNofbTH6e#FaqliG*R(@G6_NpQ#GHC{wY<4%gKsXI4U`n +z)3DZ*;h!!YMDuI9%HT8m_iapI8hT3()lmN2v~#@lGuX3ns+Vk#(ffDy%kRdOp>H*^ +z4NC;gflF&uUT8xR3Veua7-N)`1=XZ^LP-9~3Lrtpbap(_{~C_s|NZQ(aAmI5!rQfL +zcssH1VgD{fnjw)`i5(U%M2{4fdBA8^hLl_lf&1Y20RkX8TB{-5+8atq||H4Tm({qok#66%bg+59FZ7W{;@kzdI|h$2_5SyMcdOA?qZ4hEuH9tR_* +zk5!d9Ld)ZmSUu5gB4j-5OE&{0>am>NMqGoNMqP!B5cXjDcaV@hl`+)TC^II$&Td+h +zv(xPSczfcVY}#Iix}x)v;CW0Bd_#mST^c)5;E~PZ3&Tu2x)GjQiLoc5|ofub9X%oZrqM2AP_mJgW_X +zBY9wUBO3a2ALDlps)oS}20&9n2|qrfIr4rvMsDl~fQlv>uuWdGYrG=Ve~#c +zIg&{b1At>>zCwUpcc0x1(*0cC`toKI$(H_F8xedWyn-{!J`7by`=q_-#bYMh>(Mk` +z`qBVhhC5=#9#lcK$5zwt)K5#1>)&6Z>)Fl)VV6{&h)0ZM$};cwpm@E#265uXzNEj~ +z@jD;rLU@{Q9RJwcY`yrZ9j)-1}997=~}R#2nP#-PU+ +zMh%e%f`{P%AV7NHD~2MMq**j}2w2o9`Wg~p)hP`NtNEawNPt1rV?Fo<=Y+(&^R^w0 +zw!IG)xhu9ru+(QmGDsMcyLXRx?V^C6JO(|*p*1E3B^nvC9{@}+Rk8Hui2Sflv(#%W1B5bL^kAu80Gfp4y +z-BSGZp7vUG1ASpE4C0@9lq_08~8WgYCOXwirb +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 +zQjl1B$0gL)W$z)Ub6-1E#$`B=|K +zcPydA%XQEq90LD*#?RX}qq2zx%fC3LM=O07h`ie-?}R+c@ERhySpMdwwOUi&o@COA$&P1B7op +z#d#jSyg1j%IQ}ZPgNVSzNwpdlhdQDTdtp%UQOm;oX6E9Ns1y?-9XF_#uJvlSZcINX +zhJqdzqHX0%t<`hitQ4VFk>gVmN*zcME(N6hgXip^Ud9wuU;``9Lb`x+vXU=P9m*6e +zNoBGxHWI*yMsri@r5Bz3`yXO&hWPhM)Ys?ce%I%2>`d9`&KWYFgZ)Q582Q-vP9a9F +zGma&+cdq%I_ZiIeDfzMCT+m2UBNIWQEXGp34*QZEsoUN_1Sf(lrs0@6{I3Sn0xLlp +z9I@l6uNXYJL&D9j7%7tY!>tHyFV<kh^k<_z$CP-5<+{# +zAAUpZ@MT(%;v$x9o~d5{wjP3cAz&&im?#l6Pl>vO&}X9Hwk^Fb(}U%Si5Z{H$6_8^r6 +zW|c6`_18l-#}s`!&xO-$hC#u(2ba-a{zU_TMM!xS1w>KugbBqolD6u;TfF@F*mOv{ +z2Wl(4In4E)CCzy#K>Q$vsN==eRk0xQVqKyk=nX$TIX$A^8}VeojR1eqW3g?nCmqP9w{6hvLvs%IuA-}%uV +z0#*!PnxsFMbPmGZ-riDl6JW|+*>fm|d+T@{{7Y{bt{z(QNnAuqgauIYgyr>|LI-D4 +zoEh!dbTsBI0ZF4BX6!JYH!}g=KqCb@NVDcpG0;?Mu4og~tGViKtFEAe9mGDXW)Ju(}Sgg(Y~m +z-&7;F=u>&d65qM^_tDf6Q2A4db~>n!H94cA~^DX1uDLZ;_?p>Fb6m*skTF7pM+9TcBTOuL;u +z+h3G-bZ1UxVIE4w!BYnUZvvuM+$ZncJ{vt{4exW!c--!19Pi!90baixZ+**TX>E%4jsa>^XvOh<@eip3KC>LrP{_CyU +zKNFAR*B(lbTi?)dUdOVf^P?1u=)tO6S`U+&GjwP)LJiv^Xd1J*o*_p5D9U{tkL)~S +zabQ#|LTXn``uojuYCxnM9B)}N`eUmpCR4Fj?HkqJsQfLCB-ohkE0=6ER4x3j9ZeR0 +zX5YrbUDDtDk)EOKk80zh(i@5&0D*@20il2*o9@sun6(GqUtMigZ{wbM-gw +zPYHJOh7)V&Rng%kE^`GcPe1(9e}0~>5lRhFG@f)N&_w>iYmy1#bXa~_N8y~8-74`1 +zdRr`SaR6obF99>ec3ak|X%4-1DTO!(&{uiZ9OnB@oF3ivF0XOHUdXOIH`(dwY5dRL +z+j-0$iKgKadx?rJT?6Z`+pOe#r@OtEyX*aDV7%PLG8>ejCARrdmtU3Rrn_mItV!$u +z1fM+PvE5J_ib4%B*gf~fC=u>~ +ziMn@3yAbbj9fzn74fyyXDJ7w22+Fnh7fz!-;T{hjsrP&SS0H#(fo);$-<#Q6l)>d` +zJ3$-78j|Bnwt4_exY|k+2wR(-XT(QK=3s~SZBMWahw>dGBK^eA)S9h&^2;3Fm+k!^ +zbJwq_9s>mx09pq>ue+oSb8Y*2AOuu*TLx6Z +zzG?6lp0p3iE9Me<$`5GrkLCwe^_R)DOU<+Ybz5q{X2$jZn2Mrd7H7Ag5`C( +z#fL<5PpwT|)_7O)0g21O9!_jHEEcuuCv2?eY({n-7qnm%gSNkrJnrQ=W!6*Ui7zO; +z7qCa}CaJ7d{M(*TNkT*vM5Sb%-HJ0m#tFWM0<4$cI|vyv(0+qCqN$a}O+)rmJI~vf +z{%sPOO;7d2NSttj6~j9wyoG0@iVX)G;=%#EZDk6qI^9d8!Fus+U5>B0az`c9r(hr8 +zwf99v<|XOjTjz>}dK74{5YuCRj&0O7wJP%4W@b`&dTfinPr!n_o#ng@aMw`Orv5IW +zE&HGA>3AiJEP{5kU4sS@YoZ_pPkbW+if*?vAWdKrbI0Bg{v!#mu^m${0|=}%zf$KA`@ +zs5z)LM1vUTo?Asz&D~;d3j(w=ba;KG(H#SCI$v3Ziea^z%m$_+{o-ytv+3BfrS6SL1YO;I%D>I2cjZdb= +zPQTS$kf)_7G5_0>FBDGvtC9{Q23aSI(nYW@^(~@C2oliGid)ymOw_G3+1Tn9V&WQ7 +z<$yIQIp|r4T%W0F))+bcCuHpObvCzAnkTGhSHV`eUkX{LwLi|8^$wFGKKnI6_cjqO +z$)}TX~D389bM!zvp*|=Nzn4M~Q)Z +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 +zsk;(u=9Yi)AUCoMb$iBIPJy< +z_)d9ry@0>21-D-=y3jpK>Kot1F5J%szU{M6H|UPOkz-~q4<%KBVoLl7=!IeY!L)vs +z;FfKA6lnlgV>aHWY9&v%PKPlp{cx#V&+y66i2MN1ay|aKt7CuZ>CUljCDZ;awsQ1V +zpm)>G*IwADcd`2eMlK3lFlybd7u4_y+$wzHYW58G^pVAD70VdOtr#(L0@zh_NBpZZn4ELp<#$tvpofkS1lrzGzHq> +z&e-)gG($D+v*b>XrV*WNXAJ6RwNL9b>Uz`E8Xz8sn8rU7_Ze5KHoCVHxy0cB%ykX; +zq#9Y%jB=U7gC>X)`Y0^@ab2eP@+4}*fU9JL7aZUv4ZNMRanV9$Qzf_NqdzvU9&Bro +z+62iI&48qiuiRV$HKD}VJP|%^+9K;?xw#ct(Sx&GaSn!-M^UGhqV=lY86yfD&HhpW +zzr}_45OZtvo)8bcc-e~?<)>7Q09cQ`?fkDy007S6vGkkd*nkE%Tga3!NIC}N<34!E +zYsqvSb(d1W*mB`l3T|D^HcG2o8SggkzOh&0f{?Q|RfoYBz(jPz!Lz<(Egr<;G6Ppe +z&B%UQ?l76d+Nj&=thzqZ*)&_0C4hYx0szEhWI~S{bc|=Ya8)c^^_5N)HcH1mpB?1c +z^W$a~am15GtcbUQuz%Pb}(Fc~Ya@z*^1=uY^EU%Z=Am19Xl +z=+jC3dJfvE|9vXdi_?yM?&@Ta$zrqu>>;ty9NXq@=4Ow$6_gK!*wrhiT2|!N>J|{i +zQo$QqYLcBXb0!l-qkjt_niPUNEAPqcbxf)a-D{Ra7^ +zBae$5D?dVk8auEb?NvNg3l4L;`nrxl1S_F{v1)Yi?IZYIbOVBk-|h*2q5=8_>bM+l +zI&(~32x5GGIa2l#Vx`(MDL*gWi|K$JREI(17_tf`_azMAOALHU{i;{Gr;LiqDLXjZ +zBuQ+^eevX&ySA_zJPmyta31G=6co=YlerB)$m>Uh3Jx)9tY|OZiyH3ok*hf(NvUwi +z6Yt%tpv;V1JTQN!w_XjN!iH3K8lh)g;Gr|{n$!d*U2birbS;O%3U6n3?W5&b=I2=v +z&VJJVaBsdht>6Y;q8=dtT7nlM%xzm2)r +zp61IPIT$S4$Ms>qj!VD!0FW<*FZ+@@vj~&}+>nqTldm8)f~eq0&srbfm$mk +zI{5Z7elcp3==)QW6m8&iqLWZgHZqYz_tB6yD`IbxYr4_bnKP0#i}n^V1%78;L_u4` +zE^j1I5SFn485Jdz#K7iYt)t+(v*)w@{NFN=0u +z{*B`(b-r1~hUzU^n4^P*)O3D-7y@@0aT_3-uw=r_TxX9}Z|f*%%z4?65~J_!*gN<^ +z(`n*eJ3r^V_3w^j9q;O@Pe1TRoiW;Yee#sSE3xfSNMFa*(W7*YZqMD0#xJ)35mw1% +zmC2(OIbs)#u#rQoW79_ZtEN{P&%@!;Q=0?bZJqnsXGyZA)oF8wlCMU$!QRb)3_d(CM_dt3EX#!+-COMn6pxVjR~ +z+5DZk=dv4iQjQ_u{)&O +zG2EV-bjG42)!JLpdF}@x7|IJ8f02T&ys%2bWAqi*4~Q~9Z*6b0B +zB_(pNmjxFIbZ^fbikHI?v1Cu<7w%)6KnGihjA0h8fv(Ipw!lQ_yIfc;wW3KuaKtSn +zl6{*;jOKMW2c&qqy`n$dLM!S?3wYMvyKg}FW+r2t;nw8c{3&hWl+b#SocmkkTbW(x +z5_`PL4=srD^6PptbM#dap68uP3LVqze*v2XWcmtI*D8a;YY<<3UQe5zAj&ZmlC%2? +zcGu*I#Bgy(#hS5qGYd5HtVZ2@R3x1j5fQn|Wzp}RoL`yJtH|BUl@@ER*U +z0|Qx#kZ>#$1OVcG$+P<-D5l0F@<5j5Fq4xE;aFNEm*C-!u7(jT=`kfOE1!JzX6Ian +zaNsiv&yDv|Y+sJ0#X1WS%(5JIuE8W@D8iqnnb5=`F>(MHW$&n!O!@pwrcLpW0^YmIYqrbL&V+%R!RPw?hAu|l2j&AE;fvHe4Km*pjI#W0lI_-edP +zBvo1v1UTX85dxsVpPaPyr~O>|TN2V?JWyR-odN)SRATCCu{?kf$yC!1txvUy6aiU0 +zLj{_3?dwro>>n4?f9_9v7E-M`dz{DA{)xwU+gCnP>?sXQb~!BIq3NRYZr;uoxuOR$9U(+zUUZ8=zXxsqJ*+4X)O9BLfv +zHng0vwO?~Jb~sp6Ec=JDPt0tuO&=Z`6TL(7RG87=%SJgKfS_12$I^{XhwXI6h=}?5 +z+3}TgKfD+N2&x(v7j$p6j$9p4OVdpBgV(?ErMLrPRba8rVp_Jj>{8Xj9T%VTCAA!i +zi-+94s|$&X^t;;YZ?KWQD@KHO-`|Na2_o=+r|s;1JAz{S0f6^9x)Cq^2L1i|aZTBq +zwJ#VPB&$}6scWUnEYmlhopz`00*XtORLQc@RAE*dkaoiTX1YsPw~Z8-Zwa%>=3xNjw|3L8{K +zxh%+y_9T{J*bc9?OGCMB2x0A@Ql`!>Y`jHn4eAr_$<2I*U(spVmyrEeeKm@_AZ_rw5k?RJfhVN?jvZNDS~Jn+ +zBz7Pep0PV;q#>@K|Gn4JaVx(6+GFiXeLgK^+?5t9<#al~V`*|))z%j~rxctmrAQJ> +zcqV9mb;I4aajDWB9j5xC;b!Xuu~NNA^M1yRVY4^y#Kbb>a!Ky8iFrpWr3$}Jmqovz +zByXxZ=cAuagaxWTF3U?U7JA~z!Gv2NAn;`P4SzMlXeZw_cQsqa4j(uOLy@Yy*GJLM +zr#%B@73bmF@z0MPx?&&Mrnhfo0h{Hgl>Pn3_oix_{4%2ry3WxEhR3KBGP~L4YU4R( +zgGwQv>+n#qxi7@85yfZ4dU@$9(x<|BJHeh&$Ynpa-fn+6D75cDgPjyNx851V;&T6a +zOIB7@e!I&f^oEcD3JCn6BriWCkthQcQ%Cfnbr!E8P$f3zXUDSu07uI5VS3gEU|CMQ +zc-NId5o)Pv!X?aZ-X?gQc_T@U%}`!M@A|9j2CkcVtbvwq!wTS2POAy3GE0mx>kzNpN^6951J +M07*qoM6N<$g8o@6NdN!< + +diff --git a/src/branding/default/squid.png b/src/branding/default/squid.png +index 452e4450c56c10cda33dcc9c5d03753ace458862..21b7820a00dde943d7088a4300adf7039db415fc 100644 +GIT binary patch +literal 962 +zcmV;z13mnSP)Px&d`Uz>R7gv`ms^NcWfaGM|Gga@t%z<9Ne@zp5p(t#B8mu%Xy}6Uk}~5t3JEDW +z5HuED#&DbmL-Fz;^i%_d>DgoCM4>i4#88n>p`LwIFuGYPMu^bZXy)vd`y6%7K4;pq +zkIwi#?r*L2+w1bJZ+)WCHP4?-Gw%S)F#8#)mtyXtM$9O+@Vw7%VaCW?h*iMMxSkzE +z?#mqP_%4mT6wsk*WKO+=!&>03M5D&%NUu{|{6mslGBn%&JcJuSbJKWmS>_@}AFkWO +zf%ZSg(;FY!;y;ALyNE{`fYn6YhB0mAjJt*7?dPgD?_~uXqwzL-FW` +z&>KeE73lo~cQE~*9%P-Mrbz^jnKCN@ZxG}MMP_FkPWTCM>y*H1jT!^O^M6F#mkMY$ +zjMT+x*DvQOj)cNh4ftVkx2tJzD0I~ +z(7KWHB%-gJ4zu%^`!uDFZ>~aG`~|q|#_Txgt4p2hS6~j}>dz*7YJAT{cOggGe=8e( +z;NzQV8Xc}V8^=IV8;lylQs60!0fOAZm|V91Rj@6U>P_-AWDTX!z6BP`A-Q^KTq#tS88= +zt}ifu2O^)&Q?Kw7(!FVfFUyRSdu%cHX;rS*A-$c}Ms%M>x5lo9FLC2+rI45lx;rfp +zvt5;OC9~r;H +zj=_hfk^N&Oglj=}CKk-3JS(aR(F1Dw->Y%-O5Fo08fzSq7XU=Lg*m9b1NOBD!qt82&ggiqDZeQRRmO|6RLn9 +zMGz2a2I&Zf8X(|5{$4*H;K^E9XU~;6vu9s3d(LDhv8Kkl=jeIp0RT9sucu`W03hlR +z1i)d`i(O!uJM{t$($KerQ(qBqH#}9Q^Vj~7d2f!uynjDv`1ix(nX#3V-}C>?dEr>@ +z9|$!h22gGzR|N60?cBbERn-W|)m>5b0xUnCtN}x_aN`)U{L+lvfVvw}8i?sbxdG5r +z=RN=~*p&ie(ZUHp`0oK{lTu>?7TmQ~3%X{29gG)as^@#xk1P +zMyU$VorzFC*;*i>rF!Atlge}tOT +z7p4@tOPo#K-Dw{Xgw;z|CpfNB0j4IG$I36>DYFusq7C^2M!pHEtm#k$^8};a)NSHc +z<3fqFg9=R&`+(32Jm1m}0#@wi885oE^Y +zs-GbIh2|QjWEs`qetUrT&MgrZQ8z%qoSHB4e}8vP{W;=`S)w=NDs}B-`Fm7A;B6)x +z!Ep-P-uOFj$R_tdc6u@3;h$|KY0OGl%+B~y$Fk6PToXX-E(mOQ*; +z3KRjipn#phT@tg=H}k%aJ=WSz0YT9UM6T}d&|(%s`xof1Eg%aWl>#CgN>b5LXfZnh +zEf1>yhf;OPdTLa(A4=rMsQ=i)stb>Zy8)`wfu!bRHbUO;Wd+w$kL|eNp27m+Jn85k +zh~~{|e>dwFbd5O+?MF4xxAzyr`|L2{dq#^+H3hwC&3N!&#W8&UBvR?`=tDx1LeyT~ +ziyio9H?X}XY(d6?IbuKofwv0dkEwB7UTt;kr7F#t=P!@hFyf@M(7pfspEl$dBi4J+ +z_Cc@X82S0Xx`6c&1ih=1{m|>tjQr>{UvMlUYRvtS8`$68Dfr +ztc2G0ELmsq;HC6jlgLDJZ=*g87BOyXbl +z&7N%?P3WlBgb)=)vV{GMq6=)^g!J(Bz-;uJB&wP2#|_!&DI#qrYn05lglvEtoq*4w +zbJL~>7Gyj7%4c8h16*|M46$C{*$9Q7-roW51ur0__uK2SGk|p@xiWG^F0lU#Qsw0H +zTebQ%=C+s_+rK|@K>e&#ZP0jh%sQ!vU7ZzenAP;xr%fB&x@nPVMT%bx88R(@7=hBJ +zI)GGbhM1*Tk{I4Of!zQpk#gabU=qVuU#dXI?tS|(C27UM&~C!cwGTcn~baLpFHIJ?at$fHZ00loS`X*@du6HP6Z1dXzxbkS(P8i~vMW +z43mWxA^PcgDix>te*EnqeFI12TBZBvGy7OI9knJZ@Cd>)4(-NVuVU2M46&a8bK`1P +zumdr9rj3~ba;gX#!1pXmcDxcg%76`p! +za&w0dqo62>VSOeJ<^tnJ<7_`e-|=IH54+XCEClKn_xR_&RLdvmyQ>&peTsUb`YH^d +zF>O8tgQ$Upc_l%mCC_kb7F!OK*(CLDF}6ZD|4aPSA~?+ +zN6p5e_Uu~f92$`E0{mc4CW_(J-`ZiUpRnE`0V%tePh&ey_%e +zTDv{fEwH1xpiex)efQG%Fu(b$w=o>R>p!ixRw1u-Wh5T@!G=2x_O=Yq> +zjj9x)uQJ^~uS@hRFkvQUaCscRwV@htMPdc|p)+$~ +zMk1s`%Zne3J8I;=??JhNQI3yvqE%~ed!LaXUNPalbNtV^)+7qhtk^{xvPGRlL|jdt +zx$vil$|gRa+fr%g;x&9XLF>UbF@yQ{kAG+z(o|`uVt3kSjGBG(y5ZB;n6?I>o|-Jh +ze)Mr-2Gz8#2VXVxDe?})jIsZ67N@BkkTukQ0<_*OwPGiiW!a*1*X%XzfldYbipFYe +zyJV5vuXI+D3}*`&6bHZy`o#f=?zdHA?||V?jhs(3gK8dJgA68_fD)HzZh@$hXL_&BCRNxAFO3D=%pc&S3bTYUiYC#$Qm4!=kKN0%+^&zvqoF>IhOLCy!q*ib(Hxv-gVagp#D2OQqX_$|Ktrc$Hld(nBhT-MAR~GM55%wkT2RVrm7e3-9zggJS2S +zs3Dn3wYb$w&F2nkl6I%%##}DY_(c;-2%3uRFNZ`IXjda45o +zQ_MiSDd{T_&BV4Kx?M8%>*$1bpz7A4Z8hchA%mv2=aILK$OcGWIqdp#8d~V6c+*?W +zNuL8B$<&ACGX{4943fdqta$v5?2>3HSgZA}s;Ik*aSR#61L0?jsi+tUR60~}6<&UY +z=cAIz_PC;=Z)rC%Rtgc6*8MLSbed-DW6JEEK$qFSJX_xw`S5kU+LM#5^Rp$rtk~I&9x9%Hf`C +zKHO;5H{oFiv6PoQ)8mg1!+;X0V_j!@M&J9xOm1bv^Ne4>ELm7F`gWxTXT8`p`-L&F +z4@}rT#)OWD1w +zYAdSgOkfNF;Rie02bCkZW}`o-+XFG4($OEDo=SgU!SgR%-O?WuEHK7n7@Y!m6e)^R +zl_t>z54i6x%N5>&?$M(f7?Ih)Cu>NK1kHQ|O-+D83NQZSpuXEW%HK_L%Ets`Q4KJ> +zM|*LWZJ;r5+mDb +zzjB}!pTTrNtM1ksIVeGFs=-Sp)ZxB>yzlgR{XNzuP>qlY_Qu}1g1 +zfuRnCpEvu_=BS*X68oGH!QOa?;c)VHTEQ!C_W2dgoMfQGRZ}R9*yJdYT#S+G}_j~N{uZ66YV&j3^7&NY9@>{D45>iICh^vBslQ&mzm +zHm%ho|J|vY{5A#Gw$~Avhj%`^R?sn`teT^QKruqpP6-7I`;!jmD0W?4LgdrK7UltA +zVek!;nlbFINc&dPHFgpNz4b?E;V=@k`d;mY?3B;LB9%W&3q8z0uInagyO=z%O%wGN +z*`d_iMWASl5^1qLJv0<@2d)3|U>17#<=k0mRH!b$(uS4iJb~lxPCEMCp+?pN?j~pK +zy=Lk0T^*X72Q=$Z82Yjo8aMoYt~v}}n~(1N?>1Gi-28FKexP<@Shn(JqCzp8s5mrR +zD^%lY0HTc{n_gd3lFglxr>z^(*LEiT! +z={Pcj{u&w?yUfqErskfE_ghSzbo+q^)G{U7%Qa2&Tf|e|D0h}=hA#}1S$!T&7l2M# +z9AaC4?s`UXdG_f4;yaO8cJ~kx*BtTpT^MydrN_0T>h*0#Epr>17}2EFvpudARXZ^b +zi+>2_S39MTOP+_cIwT*%*al7N;QL&Ei9UJzo#c3C7ZTYZGcPB;%@|Bp3jV_{EYii@ +zwbO}WR5|+P2R_2kD?Tky+nm}pb--L5r{8f2{(Gtzvh%7@=FRZD%sSuF8Xt}P>?DWI +z1;ojAZzn}%Xs{ru#eqWkiHklR*5Y#RZy_CTWaek@ohl!zI+l=IM@pG@-s_^sL`}sT +zK}^CgjL>FZW$wLJA)S`RJIMr+x$Ym$FuR8Oa=v`&isZhS)TGyjl95Tw%E~H>2LTJY +ziwn_^hUKP>$S;%gYP8ECHCz{WWP02F+h0}FvVT1Oay(9P|4)>2)V*`<$er+WjpwiN +z9^`aM5*}Apw+>BmgB)o=-)kXGk#BE^r1i_^zEhZfGvPh5&oXhzEg`TmA@ +zVw$wITj#G8XnXqxtUcV?__g_E1RRU#O+HbEE%X(CS?OFFq-o?m0Yi`?1fpAa +ziw5w#b@0NSwr6wmDrNi)!5%x-OBqbkV~HzreVlQZ6mPFkuDl=_&%n^OTpE3{D)LSH +z?~Wjw?#1iK+^4?&Kmz2OH%CI&@S4!^%Uf0LCSQ(!(BSWrm|3q~sfJ8gia*_FVamjq +zR#}^gvKNYeICn=4iDR9Y00Kw1{B*PotfWfMvZ>!DEGttb%8eixKX&3q5Qsby_*Yse +zjmA~92pG!g_N$W|W5;^Gj*BP)F1tRYBlono^HZIzZU*mi+>RKC*W+BGC|>DnoI6s= +zrM>6xKVHG{D=>VWX|Mg=oq>f?cPcrkiTrI>U#+yvp#mD@AlpL=#GOH&dTG9{JN`kT +z{22qObiw^Q>EesZFw^<_SxU@?Zb_5h>HwZ?N@&a_%u(j8Djip_eW57*(5?3qlPaf? +z@=ng|pI%fJoIq8d#K!uevJr4KO)dNh8?BQ%seQU9l_s4=r3Ccv}wwwcDK^VDsh7)TIbnpFA +z&aMWGzdd%l+jM)k`HP1%^?VAp+mZX)Tr6}pIzlx$X!r+fh!g;H2?(=5HH@C1I0;SW* +z>5FfqtPJDz!^vjD)W_<0*bGv~>f`Ho4`^?0RDWpWdcX1G{60d?^INUGTFsdA=`u{W +z(Gq8-K)IJ3d1hA=WaG)a=GohmVF!C6))uAqr0efr?`Ac?b#^GFvMlwxxayPRKQ{qv +zYiL}+dxOt|fpNx)Tmk_zR`%I8E!C@d!G{$mlt +zjy<_3kmy97eTA;su%J;J?A$(ND#Xhll75pLrU3R#Z#`9zl}<2_BnZwtxaab1{hQ*+ +zOc3M<)6tz`sJ`?gDWAQoyvkfFIV;F%le(+@T4A4m35bqW!!Qy+*_-RkrM}0?{#E>m*kF;f +zi4LpGNKkoGLq`WY&AC|C)PbcM-!9mBCCaJMHQe+X_(I9}z+Z8_R5GPxVdO7Qgjqfa?7b^1l*TKYEJ%=$(VvaeOc>?&6MBk`HS +zES&?As$`LIil2Y0?4DF#=B?tc41>XHoX3P)0`^3`RaH3}IB=EKjhxC7aLjq5(_kzs +zwy@~|Z3(S{3z@7c3cBhbRuCd!+;);vmR$8EpG;$@e(y(!t>`2wI8ZHOb_E0=yVe-g +z@N2wn@O)lIJIXC3^F&A%LwjI%FWv`W+VE+K4J*fpmR* +zKisioWA`Mw;}2|DQwC_4jkYKiHp^7Oatxm;=*-P9)XKi%U4IgAHTNOHc>9=T{SktN +z!SI~~CfXU9nU$~gv!}r2sDoAtb!u*MG_EuGb5EPEr&DPgYE#$OEjj6vYX|^wJ%UUs +z1U|_N*YP)*lZ#!Q{?}ptZi9;3RM8hcHpu-;YCX}o;Qh@<&d}JXvy8Vdy##fzE`(J5 +z$P9TVsZst=*(=hM<|g$tF5vWz?ac8*taS}9Uo3%RNXfm#!}RTQ6e<$#TCIvJvKV%C +zT1K_E+RRw>DinX%a=Gf;2uhdZx|J>(dtHMx(EBN|>Fr{jP4YsbLK5*;?4l@Ve15NY +z1HK+4puU&gRTUQ=59DvD`tGUvxAaB^~* +zUg0z=e{Lp`QB;2AgB_Er>mu?3Z~T`-d^Z4~CqoR4sEh@nK2_m_d9p4!Rhp%eA3h37 +z`ri1T<;^?Fw_>b@jc=$&=(9zA`V*pC_}2JMxouM+#BZ^M)(gL2ou>}T1 +z+U_(vcbbBaW_kju{DOv>-Zg@W3a_&Cae2wlhAxu~yb|Q{#4j>f&p0vKs!ByG4HjEU +z{6~Cxuj%9aX`Rni!&3emNSX3FjAFxOOsQ&*(vwp8aYWdTUyHDWmwBsjQU0?yLNhol +zw!+J{EkeoN-Myn~*0?9{vBK<;cICp?JU;WLT|bMDC31?9;iH1Tl?(frYqlvZVzVvI +zaC!$Wy0@%lzM- +z{RxyA?Pvbq)K&S{_JEL9*jt%fAhJuu0*FbN0TyYIR-Tz{t|urG!W)4$-^#C0`K`<<4A8a+j;hh +z8wB8jSN!OmZ#RMIm`_@f7r38vB5(Gj*{cCOU6|&%S8p@IEe)pT?;E|U;qxr>Si5NA +z9L0#&=0fX?$tFnNhLv0ijbis)XR@UWMP7*~h;3$+?oZ=R1NCy>)y&8L{K?A5bnbiD +z=0|5jnOQ~+ft3A$?j%o({=`+|)qB99EE`u_8!$LLd^;5Y3_c9ORW?H)i7&^OYmIFO +za{o*)o#eqJblxgukEJP1&tKE*>H=h%A)&fAD-0lsuA+f?{gYbo*^9TIf6bMMKH}#2 +zoy?qC1+k?!vXHtiANS-a94PLfE4m$a^5V$L;}SamJ#Ks@<43)1kdyr9lAud&`SZ*; +z9IOLrDv_T1z_WQmW9I0~WXgIuX-IN?`bFb&_ejn@!yCP+wuvCwXBKh^2}wl_HBQNN +znJAPdThr>U!Hw~x6Uu?CZPN+GKuQq>r*UzrsU7x9X6=)aDfYd-wtJg_$=2c&^1X7U +zfptIvn^59~=Kvz_opZfl`p6vn|;kv(0Mi|%Dw|AUResXn39Cqe3@iFD1Brb26B_N>Ka*Kx!EJg +z|AZW>U`bB`nNH2qK51#3bbM`|x=wSgQcP^qM74Gs+()H7x=5h8z&lJ+Z1XVBPL&x| +zXkLEnN@ - #include - #include -+#include - - #define UPDATE_BUTTON_PROPERTY( name, value ) \ - do \ -@@ -220,7 +222,7 @@ ViewManager::onInitComplete() - m_steps.first()->onActivate(); - } - -- emit currentStepChanged(); -+ emit currentStepChanged(m_currentStep); - } - - void -@@ -368,7 +370,7 @@ ViewManager::next() - { - m_steps.at( m_currentStep )->onActivate(); - executing = qobject_cast< ExecutionViewStep* >( m_steps.at( m_currentStep ) ) != nullptr; -- emit currentStepChanged(); -+ emit currentStepChanged(m_currentStep); - } - else - { -@@ -466,7 +468,7 @@ ViewManager::back() - m_stack->setCurrentIndex( m_currentStep ); - step->onLeave(); - m_steps.at( m_currentStep )->onActivate(); -- emit currentStepChanged(); -+ emit currentStepChanged(m_currentStep); - } - else if ( !step->isAtBeginning() ) - { -@@ -486,6 +488,20 @@ ViewManager::back() - updateButtonLabels(); - } - -+void -+ViewManager::restartInstallation() -+{ -+ QString restartNowCommand = QStringLiteral( "shutdown -r now" ); -+ QProcess::execute( "/bin/sh", { "-c", restartNowCommand } ); -+} -+ -+void -+ViewManager::startDebugTerminal() -+{ -+ //QProcess::startDetached("/bin/bash", QStringList()); -+ QApplication::quit(); -+} -+ - void - ViewManager::quit() - { -@@ -524,13 +540,33 @@ ViewManager::confirmCancelInstallation() - QString title = settings->isSetupMode() ? tr( "Cancel Setup?", "@title" ) : tr( "Cancel Installation?", "@title" ); - QString question = settings->isSetupMode() ? tr( "Do you really want to cancel the current setup process?\n" - "The setup program will quit and all changes will be lost." ) -- : tr( "Do you really want to cancel the current install process?\n" -- "The installer will quit and all changes will be lost." ); -- QMessageBox mb( QMessageBox::Question, title, question, QMessageBox::Yes | QMessageBox::No, m_widget ); -- mb.setDefaultButton( QMessageBox::No ); -+ : tr( "Do you really want to cancel the current installation process?\n" -+ "The system will reboot or you can enter the debug mode for further investigation." ); -+ QMessageBox mb( QMessageBox::Question, title, question, QMessageBox::NoButton, m_widget ); -+ QPushButton* rebootButton = mb.addButton( tr( "&Reboot", "@button" ), QMessageBox::ActionRole ); -+ QPushButton* debugButton = mb.addButton( tr( "&Try Now", "@button" ), QMessageBox::ActionRole ); -+ QPushButton* cancelButton = mb.addButton( QMessageBox::Cancel ); -+ mb.setIconPixmap( -+ Calamares::defaultPixmap( Calamares::BigLogo,//Biglogo.svgz -+ Calamares::Original, -+ QSize( 321/5, 297/5 ) )); -+ mb.setDefaultButton( cancelButton ); -+ mb.setWindowFlags(Qt::FramelessWindowHint | Qt::Dialog); - Calamares::fixButtonLabels( &mb ); -- int response = mb.exec(); -- return response == QMessageBox::Yes; -+ -+ mb.exec(); -+ -+ if ( mb.clickedButton() == rebootButton ) -+ { -+ restartInstallation(); -+ return false; -+ } -+ else if ( mb.clickedButton() == debugButton ) -+ { -+ startDebugTerminal(); -+ return true; -+ } -+ return false; - } - - void -diff --git a/src/libcalamaresui/ViewManager.h b/src/libcalamaresui/ViewManager.h -index 5a449a1..da9e9bd 100644 ---- a/src/libcalamaresui/ViewManager.h -+++ b/src/libcalamaresui/ViewManager.h -@@ -87,6 +87,9 @@ public: - */ - ViewStepList viewSteps() const; - -+ void restartInstallation(); -+ void startDebugTerminal(); -+ - /** - * @brief currentStep returns the currently active ViewStep, i.e. the ViewStep - * which owns the currently visible view page. -@@ -213,7 +216,7 @@ public Q_SLOTS: - QString logFilePath() const; - - signals: -- void currentStepChanged(); -+ void currentStepChanged(int m_currentStep); - void ensureSize( QSize size ) const; // See ViewStep::ensureSize() - void cancelEnabled( bool enabled ) const; - -diff --git a/src/libcalamaresui/libcalamaresui.qrc b/src/libcalamaresui/libcalamaresui.qrc -index 62a7df2..ddb197d 100644 ---- a/src/libcalamaresui/libcalamaresui.qrc -+++ b/src/libcalamaresui/libcalamaresui.qrc -@@ -24,5 +24,7 @@ - ../../data/images/state-ok.svg - ../../data/images/state-warning.svg - ../../data/images/state-error.svg -+ ../../data/images/Biglogo.svg -+ ../../data/images/Biglogo.svgz - - -diff --git a/src/libcalamaresui/utils/Gui.cpp b/src/libcalamaresui/utils/Gui.cpp -index 57f67ae..3915cb7 100644 ---- a/src/libcalamaresui/utils/Gui.cpp -+++ b/src/libcalamaresui/utils/Gui.cpp -@@ -101,7 +101,7 @@ defaultPixmap( ImageType type, ImageMode mode, const QSize& size ) - break; - - case Squid: -- pixmap = ImageRegistry::instance()->pixmap( RESPATH "images/squid.svg", size ); -+ pixmap = ImageRegistry::instance()->pixmap( RESPATH "images/Biglogo.svg", size ); - break; - - case StatusOk: -@@ -115,6 +115,10 @@ defaultPixmap( ImageType type, ImageMode mode, const QSize& size ) - case StatusError: - pixmap = ImageRegistry::instance()->pixmap( RESPATH "images/state-error.svg", size ); - break; -+ -+ case BigLogo: -+ pixmap = ImageRegistry::instance()->pixmap( RESPATH "images/Biglogo.svgz", size ); -+ break; - } - - if ( pixmap.isNull() ) -diff --git a/src/libcalamaresui/utils/Gui.h b/src/libcalamaresui/utils/Gui.h -index 1264bc1..947be64 100644 ---- a/src/libcalamaresui/utils/Gui.h -+++ b/src/libcalamaresui/utils/Gui.h -@@ -50,7 +50,8 @@ enum ImageType : int - Squid, - StatusOk, // Icons for the requirements checker - StatusWarning, -- StatusError -+ StatusError, -+ BigLogo - }; - - /** -@@ -94,7 +95,7 @@ UIDLLEXPORT QSize defaultIconSize(); - */ - constexpr int windowMinimumWidth = 800; - constexpr int windowMinimumHeight = 520; --constexpr int windowPreferredWidth = 1024; -+constexpr int windowPreferredWidth = 912; - constexpr int windowPreferredHeight = 520; - - } // namespace Calamares -diff --git a/src/libcalamaresui/viewpages/ExecutionViewStep.cpp b/src/libcalamaresui/viewpages/ExecutionViewStep.cpp -index 71ea85b..c34d308 100644 ---- a/src/libcalamaresui/viewpages/ExecutionViewStep.cpp -+++ b/src/libcalamaresui/viewpages/ExecutionViewStep.cpp -@@ -38,6 +38,7 @@ - #include - #include - #include -+#include - - static Calamares::Slideshow* - makeSlideshow( QWidget* parent ) -@@ -101,7 +102,7 @@ ExecutionViewStep::ExecutionViewStep( QObject* parent ) - Branding::instance()->image( - { "utilities-log-viewer", "utilities-terminal", "text-x-log", "text-x-changelog", "preferences-log" }, - QSize( 32, 32 ) ), -- "Toggle log" ); -+ QCoreApplication::translate("Calamares::ExecutionViewStep","Toggle log" ) ); - auto toggleLogButton = dynamic_cast< QToolButton* >( toolBar->widgetForAction( toggleLogAction ) ); - connect( toggleLogButton, &QToolButton::clicked, this, &ExecutionViewStep::toggleLog ); - -- -2.43.0 +2.46.0 diff --git a/0006-modules-file.patch b/0006-modules-file.patch index d7473ea..fd74598 100644 --- a/0006-modules-file.patch +++ b/0006-modules-file.patch @@ -1,60 +1,120 @@ -From 572a273a33d05cb2811df32bccd361e3b99a7c61 Mon Sep 17 00:00:00 2001 -From: cui-gaoleng <562344211@qq.com> -Date: Fri, 8 Nov 2024 02:44:45 +0800 -Subject: [PATCH 4/4] modules Commit without .png, .svg, and .svgz files +From 80f4857847a58070aa1f96b08b4a084d7747ed38 Mon Sep 17 00:00:00 2001 +From: lizixin <2271170409@qq.com> +Date: Fri, 27 Dec 2024 12:22:58 +0800 +Subject: [PATCH 5/8] modules patch --- src/modules/bootloader/bootloader.conf | 8 +- src/modules/bootloader/main.py | 45 +- - src/modules/fstab/main.py | 0 + .../ContextualProcessJob.cpp | 37 +- + src/modules/displaymanager/main.py | 10 + + src/modules/dracut/dracut.conf | 4 - + src/modules/dracut/dracut.schema.yaml | 1 - + src/modules/dracut/main.py | 16 +- + src/modules/finished/FinishedPage.cpp | 6 +- src/modules/initcpiocfg/initcpiocfg.conf | 2 +- - src/modules/initramfscfg/encrypt_hook | 0 - src/modules/initramfscfg/encrypt_hook_nokey | 0 + .../initcpiocfg/initcpiocfg.schema.yaml | 6 +- + src/modules/keyboard/Config.cpp | 185 ++--- + src/modules/keyboard/Config.h | 23 +- src/modules/keyboard/KeyboardPage.cpp | 39 +- src/modules/keyboard/KeyboardPage.ui | 4 +- - src/modules/locale/Config.cpp | 14 + + src/modules/keyboard/SetKeyboardLayoutJob.cpp | 2 +- + src/modules/keyboard/keyboard.conf | 12 - + src/modules/keyboard/keyboard.schema.yaml | 5 - + src/modules/locale/Config.cpp | 65 +- src/modules/locale/Config.h | 4 + src/modules/locale/LocalePage.cpp | 54 +- src/modules/locale/LocalePage.h | 1 + src/modules/locale/SetTimezoneJob.cpp | 4 + + src/modules/locale/Tests.cpp | 4 +- src/modules/locale/locale.conf | 6 +- src/modules/localeq/localeq.conf | 2 +- + src/modules/mount/main.py | 5 +- src/modules/mount/mount.conf | 9 + + src/modules/netinstall/PackageModel.cpp | 2 +- + src/modules/netinstall/netinstall.schema.yaml | 4 + src/modules/packagechooser/Config.cpp | 2 +- .../packagechooser/PackageChooserPage.cpp | 24 +- - .../packagechooser/packagechooser.conf | 41 +- - src/modules/packagechooser/packagechooser.qrc | 6 + - src/modules/packages/main.py | 132 +++- - src/modules/packages/packages.conf | 37 +- - src/modules/partition/PartitionViewStep.cpp | 3 +- + src/modules/packagechooser/PackageModel.cpp | 4 +- + .../packagechooser/packagechooser.conf | 43 +- + src/modules/packagechooser/packagechooser.qrc | 3 +- + src/modules/packages/main.py | 190 +++-- + src/modules/packages/module.desc | 1 + + src/modules/packages/packages.conf | 35 +- + src/modules/partition/CMakeLists.txt | 1 - + src/modules/partition/Config.cpp | 6 - + src/modules/partition/Config.h | 5 - + src/modules/partition/PartitionViewStep.cpp | 240 +----- + src/modules/partition/PartitionViewStep.h | 15 - + src/modules/partition/core/DeviceList.cpp | 23 +- + src/modules/partition/core/KPMHelpers.h | 13 - + src/modules/partition/core/PartUtils.cpp | 2 + + .../partition/core/PartitionActions.cpp | 10 +- + src/modules/partition/core/PartitionActions.h | 8 +- + .../partition/core/PartitionCoreModule.cpp | 2 +- + .../partition/core/PartitionCoreModule.h | 5 - + .../partition/core/PartitionLayout.cpp | 8 +- src/modules/partition/gui/BootInfoWidget.cpp | 10 +- - src/modules/partition/gui/ChoicePage.cpp | 10 +- - .../partition/gui/DeviceInfoWidget.cpp | 13 +- - src/modules/partition/gui/EncryptWidget.cpp | 2 +- + src/modules/partition/gui/ChoicePage.cpp | 229 +++--- + src/modules/partition/gui/ChoicePage.h | 4 - + .../partition/gui/CreatePartitionDialog.cpp | 33 +- + .../partition/gui/CreatePartitionDialog.h | 12 +- + .../partition/gui/DeviceInfoWidget.cpp | 21 +- + .../gui/EditExistingPartitionDialog.cpp | 13 +- + .../gui/EditExistingPartitionDialog.h | 4 +- + src/modules/partition/gui/EncryptWidget.cpp | 19 +- + src/modules/partition/gui/EncryptWidget.h | 6 +- + .../partition/gui/PartitionDialogHelpers.cpp | 57 +- + .../partition/gui/PartitionDialogHelpers.h | 11 +- + src/modules/partition/gui/PartitionPage.cpp | 29 +- + src/modules/partition/gui/PartitionPage.h | 3 +- + src/modules/partition/gui/PartitionPage.ui | 64 +- + src/modules/partition/jobs/ClearMountsJob.cpp | 55 +- + .../partition/jobs/ClearTempMountsJob.cpp | 2 +- + src/modules/partition/partition.conf | 60 +- + src/modules/partition/partition.schema.yaml | 7 - + .../partition/tests/CreateLayoutsTests.cpp | 27 +- + src/modules/plasmalnf/CMakeLists.txt | 2 +- + src/modules/preservefiles/PreserveFiles.cpp | 2 +- + src/modules/shellprocess/ShellProcessJob.cpp | 2 - + src/modules/shellprocess/Tests.cpp | 2 +- + src/modules/shellprocess/shellprocess.conf | 35 +- + .../shellprocess/shellprocess.schema.yaml | 10 +- src/modules/summary/SummaryPage.cpp | 9 +- - src/modules/umount/UmountJob.cpp | 23 + - src/modules/unpackfs/main.py | 82 +- - src/modules/unpackfs/unpackfs.conf | 12 +- - src/modules/users/UsersPage.cpp | 2 +- + src/modules/tracking/TrackingPage.cpp | 7 +- + src/modules/umount/UmountJob.cpp | 38 +- + src/modules/unpackfs/main.py | 144 ++-- + src/modules/unpackfs/unpackfs.conf | 40 +- + src/modules/unpackfs/unpackfs.schema.yaml | 5 - + src/modules/users/Config.cpp | 41 - + src/modules/users/Config.h | 5 - + src/modules/users/CreateUserJob.cpp | 29 +- + src/modules/users/SetPasswordJob.cpp | 2 +- + src/modules/users/TestPasswordJob.cpp | 6 +- + src/modules/users/Tests.cpp | 71 -- + src/modules/users/UsersPage.cpp | 112 ++- + src/modules/users/UsersPage.h | 15 + src/modules/users/page_usersetup.bak.ui | 710 ++++++++++++++++++ src/modules/users/page_usersetup.ui | 158 ++-- - src/modules/users/users.conf | 2 +- - src/modules/welcome/Config.cpp | 3 +- + src/modules/users/users.conf | 14 +- + src/modules/users/users.schema.yaml | 1 - + src/modules/welcome/Config.cpp | 20 +- src/modules/welcome/WelcomePage.cpp | 143 ++-- src/modules/welcome/WelcomePage.ui | 73 +- - .../welcome/checker/ResultsListWidget.cpp | 20 +- + .../welcome/checker/CheckerContainer.cpp | 2 +- + .../welcome/checker/GeneralRequirements.cpp | 2 +- + .../welcome/checker/ResultDelegate.cpp | 2 +- + .../welcome/checker/ResultsListWidget.cpp | 22 +- src/modules/welcome/welcome.conf | 6 +- - src/modules/welcome/welcome.qrc | 10 +- + src/modules/welcome/welcome.qrc | 9 +- + src/modules/welcomeq/img/squid.png | Bin 8313 -> 17377 bytes src/modules/welcomeq/welcomeq.conf | 2 +- - 43 files changed, 1392 insertions(+), 340 deletions(-) - mode change 100755 => 100644 src/modules/fstab/main.py - mode change 100755 => 100644 src/modules/initramfscfg/encrypt_hook - mode change 100755 => 100644 src/modules/initramfscfg/encrypt_hook_nokey + src/modules/zfs/ZfsJob.cpp | 6 +- + 106 files changed, 2054 insertions(+), 1564 deletions(-) create mode 100644 src/modules/users/page_usersetup.bak.ui - diff --git a/src/modules/bootloader/bootloader.conf b/src/modules/bootloader/bootloader.conf -index 9679f66..acaf424 100644 +index 9679f6696..acaf424b5 100644 --- a/src/modules/bootloader/bootloader.conf +++ b/src/modules/bootloader/bootloader.conf @@ -41,10 +41,10 @@ kernelParams: [ "quiet" ] @@ -73,7 +133,7 @@ index 9679f66..acaf424 100644 # Optionally set the bootloader ID to use for EFI. This is passed to diff --git a/src/modules/bootloader/main.py b/src/modules/bootloader/main.py -index 0a9e965..570fc87 100644 +index 0a9e96598..570fc8797 100644 --- a/src/modules/bootloader/main.py +++ b/src/modules/bootloader/main.py @@ -25,7 +25,7 @@ import os @@ -163,11 +223,164 @@ index 0a9e965..570fc87 100644 else: assert efi_directory is None if libcalamares.globalstorage.value("bootLoader") is None: -diff --git a/src/modules/fstab/main.py b/src/modules/fstab/main.py -old mode 100755 -new mode 100644 +diff --git a/src/modules/contextualprocess/ContextualProcessJob.cpp b/src/modules/contextualprocess/ContextualProcessJob.cpp +index 9b34db42f..30d57947e 100644 +--- a/src/modules/contextualprocess/ContextualProcessJob.cpp ++++ b/src/modules/contextualprocess/ContextualProcessJob.cpp +@@ -58,18 +58,45 @@ ContextualProcessBinding::run( const QString& value ) const + return Calamares::JobResult::ok(); + } + ++///@brief Implementation of fetch() for recursively looking up dotted selector parts. ++static bool ++fetch( QString& value, QStringList& selector, int index, const QVariant& v ) ++{ ++ if ( !v.canConvert< QVariantMap >() ) ++ { ++ return false; ++ } ++ const QVariantMap map = v.toMap(); ++ const QString& key = selector.at( index ); ++ if ( index == selector.length() - 1 ) ++ { ++ value = map.value( key ).toString(); ++ return map.contains( key ); ++ } ++ else ++ { ++ return fetch( value, selector, index + 1, map.value( key ) ); ++ } ++} ++ + bool + ContextualProcessBinding::fetch( Calamares::GlobalStorage* storage, QString& value ) const + { + value.clear(); +- bool ok = false; +- const auto v = Calamares::lookup( storage, m_variable, ok ); +- if ( !ok ) ++ if ( !storage ) + { + return false; + } +- value = v.toString(); +- return true; ++ if ( m_variable.contains( '.' ) ) ++ { ++ QStringList steps = m_variable.split( '.' ); ++ return ::fetch( value, steps, 1, storage->value( steps.first() ) ); ++ } ++ else ++ { ++ value = storage->value( m_variable ).toString(); ++ return storage->contains( m_variable ); ++ } + } + + ContextualProcessJob::ContextualProcessJob( QObject* parent ) +diff --git a/src/modules/displaymanager/main.py b/src/modules/displaymanager/main.py +index 6ca279e18..02fec0f6e 100644 +--- a/src/modules/displaymanager/main.py ++++ b/src/modules/displaymanager/main.py +@@ -410,6 +410,11 @@ class DMgdm(DisplayManager): + if self.config is None: + raise ValueError( "No config file for GDM has been set." ) + ++ ++ libcalamares.utils.target_env_call( ++ ['hostnamectl', 'set-hostname', username] ++ ) ++ + # Systems with GDM as Desktop Manager + gdm_conf_path = os.path.join(self.root_mount_point, self.config) + +@@ -571,6 +576,11 @@ class DMlightdm(DisplayManager): + # Ideally, we should use configparser for the ini conf file, + # but we just do a simple text replacement for now, as it + # worksforme(tm) ++ ++ libcalamares.utils.target_env_call( ++ ['hostnamectl', 'set-hostname', username] ++ ) ++ + lightdm_conf_path = os.path.join( + self.root_mount_point, "etc/lightdm/lightdm.conf" + ) +diff --git a/src/modules/dracut/dracut.conf b/src/modules/dracut/dracut.conf +index 190933bcd..ba1a7b08c 100644 +--- a/src/modules/dracut/dracut.conf ++++ b/src/modules/dracut/dracut.conf +@@ -8,7 +8,3 @@ + # set a custom name, including the path + # + initramfsName: /boot/initramfs-freebsd.img +- +-# Optional: define a list of strings to be passed as arguments to Dracut +-# By default, -f is always included +-options: [ "-f" ] +diff --git a/src/modules/dracut/dracut.schema.yaml b/src/modules/dracut/dracut.schema.yaml +index de1114ccc..d6008e1bf 100644 +--- a/src/modules/dracut/dracut.schema.yaml ++++ b/src/modules/dracut/dracut.schema.yaml +@@ -7,4 +7,3 @@ additionalProperties: false + type: object + properties: + initramfsName: { type: string } +- options: { type: array, items: { type: string } } +diff --git a/src/modules/dracut/main.py b/src/modules/dracut/main.py +index 9e2bc318f..85e6f3e7f 100644 +--- a/src/modules/dracut/main.py ++++ b/src/modules/dracut/main.py +@@ -35,15 +35,15 @@ def run_dracut(): + + :return: + """ +- # Fetch the job configuration +- initramfs_name = libcalamares.job.configuration.get('initramfsName', None) +- dracut_options = libcalamares.job.configuration.get('options', ['-f']) +- +- if initramfs_name: +- dracut_options.append(initramfs_name) +- + try: +- target_env_process_output(['dracut'] + dracut_options) ++ initramfs_name = libcalamares.job.configuration['initramfsName'] ++ target_env_process_output(['dracut', '-f', initramfs_name]) ++ except KeyError: ++ try: ++ target_env_process_output(['dracut', '-f']) ++ except subprocess.CalledProcessError as cpe: ++ libcalamares.utils.warning(f"Dracut failed with output: {cpe.output}") ++ return cpe.returncode + except subprocess.CalledProcessError as cpe: + libcalamares.utils.warning(f"Dracut failed with output: {cpe.output}") + return cpe.returncode +diff --git a/src/modules/finished/FinishedPage.cpp b/src/modules/finished/FinishedPage.cpp +index a31595f91..51be52678 100644 +--- a/src/modules/finished/FinishedPage.cpp ++++ b/src/modules/finished/FinishedPage.cpp +@@ -16,7 +16,6 @@ + + #include "Branding.h" + #include "Settings.h" +-#include "compat/CheckBox.h" + #include "utils/Retranslator.h" + + #include +@@ -43,9 +42,8 @@ FinishedPage::FinishedPage( Config* config, QWidget* parent ) + } ); + connect( config, &Config::restartNowWantedChanged, ui->restartCheckBox, &QCheckBox::setChecked ); + connect( ui->restartCheckBox, +- Calamares::checkBoxStateChangedSignal, +- [ config ]( Calamares::checkBoxStateType state ) +- { config->setRestartNowWanted( state != Calamares::checkBoxUncheckedValue ); } ); ++ &QCheckBox::stateChanged, ++ [ config ]( int state ) { config->setRestartNowWanted( state != 0 ); } ); + + CALAMARES_RETRANSLATE_SLOT( &FinishedPage::retranslate ); + } diff --git a/src/modules/initcpiocfg/initcpiocfg.conf b/src/modules/initcpiocfg/initcpiocfg.conf -index a660393..549157c 100644 +index a66039397..549157c13 100644 --- a/src/modules/initcpiocfg/initcpiocfg.conf +++ b/src/modules/initcpiocfg/initcpiocfg.conf @@ -35,4 +35,4 @@ hooks: @@ -176,14 +389,395 @@ index a660393..549157c 100644 # -source: "/etc/mkinitcpio.conf" +source: "/etc/dracut.conf" -diff --git a/src/modules/initramfscfg/encrypt_hook b/src/modules/initramfscfg/encrypt_hook -old mode 100755 -new mode 100644 -diff --git a/src/modules/initramfscfg/encrypt_hook_nokey b/src/modules/initramfscfg/encrypt_hook_nokey -old mode 100755 -new mode 100644 +diff --git a/src/modules/initcpiocfg/initcpiocfg.schema.yaml b/src/modules/initcpiocfg/initcpiocfg.schema.yaml +index ddbe43b7f..5595b6093 100644 +--- a/src/modules/initcpiocfg/initcpiocfg.schema.yaml ++++ b/src/modules/initcpiocfg/initcpiocfg.schema.yaml +@@ -11,7 +11,7 @@ properties: + type: object + additionalProperties: false + properties: +- prepend: { type: array, items: { type: string } } +- append: { type: array, items: { type: string } } +- remove: { type: array, items: { type: string } } ++ prepend: { type: array, items: string } ++ append: { type: array, items: string } ++ remove: { type: array, items: string } + source: { type: string } +diff --git a/src/modules/keyboard/Config.cpp b/src/modules/keyboard/Config.cpp +index 54ee7649c..ad6bee6f7 100644 +--- a/src/modules/keyboard/Config.cpp ++++ b/src/modules/keyboard/Config.cpp +@@ -11,6 +11,7 @@ + #include "Config.h" + + #include "SetKeyboardLayoutJob.h" ++#include "keyboardwidget/keyboardpreview.h" + + #include "GlobalStorage.h" + #include "JobQueue.h" +@@ -26,7 +27,6 @@ + #include + #include + #include +-#include + #include + + #include +@@ -36,7 +36,7 @@ + /* Returns stringlist with suitable setxkbmap command-line arguments + * to set the given @p model. + */ +-static QStringList ++static inline QStringList + xkbmap_model_args( const QString& model ) + { + QStringList r { "-model", model }; +@@ -46,7 +46,7 @@ xkbmap_model_args( const QString& model ) + /* Returns stringlist with suitable setxkbmap command-line arguments + * to set the given @p layout and @p variant. + */ +-static QStringList ++static inline QStringList + xkbmap_layout_args( const QString& layout, const QString& variant ) + { + QStringList r { "-layout", layout }; +@@ -57,10 +57,10 @@ xkbmap_layout_args( const QString& layout, const QString& variant ) + return r; + } + +-static QStringList +-xkbmap_layout_args_with_group_switch( const QStringList& layouts, +- const QStringList& variants, +- const QString& switchOption ) ++static inline QStringList ++xkbmap_layout_args( const QStringList& layouts, ++ const QStringList& variants, ++ const QString& switchOption = "grp:alt_shift_toggle" ) + { + if ( layouts.size() != variants.size() ) + { +@@ -161,16 +161,24 @@ Config::Config( QObject* parent ) + , m_keyboardVariantsModel( new KeyboardVariantsModel( this ) ) + , m_KeyboardGroupSwitcherModel( new KeyboardGroupsSwitchersModel( this ) ) + { +- m_applyTimer.setSingleShot( true ); +- connect( &m_applyTimer, &QTimer::timeout, this, &Config::apply ); ++ m_setxkbmapTimer.setSingleShot( true ); + + // Connect signals and slots + connect( m_keyboardModelsModel, + &KeyboardModelsModel::currentIndexChanged, + [ & ]( int index ) + { ++ // Set Xorg keyboard model + m_selectedModel = m_keyboardModelsModel->key( index ); +- somethingChanged(); ++ if ( m_useLocale1 ) ++ { ++ locale1Apply(); ++ } ++ else ++ { ++ QProcess::execute( "setxkbmap", xkbmap_model_args( m_selectedModel ) ); ++ } ++ emit prettyStatusChanged(); + } ); + + connect( m_keyboardLayoutsModel, +@@ -187,14 +195,16 @@ Config::Config( QObject* parent ) + [ & ]( int index ) + { + m_selectedVariant = m_keyboardVariantsModel->key( index ); +- somethingChanged(); ++ xkbChanged(); ++ emit prettyStatusChanged(); + } ); + connect( m_KeyboardGroupSwitcherModel, + &KeyboardGroupsSwitchersModel::currentIndexChanged, + [ & ]( int index ) + { + m_selectedGroup = m_KeyboardGroupSwitcherModel->key( index ); +- somethingChanged(); ++ xkbChanged(); ++ emit prettyStatusChanged(); + } ); + + // If the user picks something explicitly -- not a consequence of +@@ -214,36 +224,30 @@ Config::Config( QObject* parent ) + } + + void +-Config::somethingChanged() ++Config::xkbChanged() + { +- if ( m_applyTimer.isActive() ) ++ // Set Xorg keyboard layout + variant ++ if ( m_setxkbmapTimer.isActive() ) + { +- m_applyTimer.stop(); ++ m_setxkbmapTimer.stop(); ++ m_setxkbmapTimer.disconnect( this ); + } +- m_applyTimer.start( QApplication::keyboardInputInterval() ); +- emit prettyStatusChanged(); +-} + +-void +-Config::apply() +-{ +- if ( m_configureXkb ) ++ if ( m_useLocale1 ) + { +- applyXkb(); ++ connect( &m_setxkbmapTimer, &QTimer::timeout, this, &Config::locale1Apply ); + } +- if ( m_configureLocale1 ) +- { +- applyLocale1(); +- } +- if ( m_configureKWin ) ++ else + { +- applyKWin(); ++ connect( &m_setxkbmapTimer, &QTimer::timeout, this, &Config::xkbApply ); + } +- // Writing /etc/ files is not needed "live" ++ ++ m_setxkbmapTimer.start( QApplication::keyboardInputInterval() ); ++ emit prettyStatusChanged(); + } + + void +-Config::applyLocale1() ++Config::locale1Apply() + { + m_additionalLayoutInfo = getAdditionalLayoutInfo( m_selectedLayout ); + +@@ -279,11 +283,10 @@ Config::applyLocale1() + } + + void +-Config::applyXkb() ++Config::xkbApply() + { + m_additionalLayoutInfo = getAdditionalLayoutInfo( m_selectedLayout ); + +- QStringList basicArguments = xkbmap_model_args( m_selectedModel ); + if ( !m_additionalLayoutInfo.additionalLayout.isEmpty() ) + { + if ( !m_selectedGroup.isEmpty() ) +@@ -300,11 +303,10 @@ Config::applyXkb() + m_additionalLayoutInfo.groupSwitcher = "grp:alt_shift_toggle"; + } + +- basicArguments.append( +- xkbmap_layout_args_with_group_switch( { m_additionalLayoutInfo.additionalLayout, m_selectedLayout }, +- { m_additionalLayoutInfo.additionalVariant, m_selectedVariant }, +- m_additionalLayoutInfo.groupSwitcher ) ); +- QProcess::execute( "setxkbmap", basicArguments ); ++ QProcess::execute( "setxkbmap", ++ xkbmap_layout_args( { m_additionalLayoutInfo.additionalLayout, m_selectedLayout }, ++ { m_additionalLayoutInfo.additionalVariant, m_selectedVariant }, ++ m_additionalLayoutInfo.groupSwitcher ) ); + + cDebug() << "xkbmap selection changed to: " << m_selectedLayout << '-' << m_selectedVariant << "(added " + << m_additionalLayoutInfo.additionalLayout << "-" << m_additionalLayoutInfo.additionalVariant +@@ -312,92 +314,12 @@ Config::applyXkb() + } + else + { +- basicArguments.append( xkbmap_layout_args( m_selectedLayout, m_selectedVariant ) ); +- QProcess::execute( "setxkbmap", basicArguments ); ++ QProcess::execute( "setxkbmap", xkbmap_layout_args( m_selectedLayout, m_selectedVariant ) ); + cDebug() << "xkbmap selection changed to: " << m_selectedLayout << '-' << m_selectedVariant; + } +- m_applyTimer.stop(); ++ m_setxkbmapTimer.disconnect( this ); + } + +-// In a config-file's list of lines, replace lines = by = +-static void +-replaceKey( QStringList& content, const QString& key, const QString& value ) +-{ +- for ( int i = 0; i < content.length(); ++i ) +- { +- if ( content.at( i ).startsWith( key ) ) +- { +- content[ i ] = key + value; +- } +- } +-} +- +-static bool +-rewriteKWin( const QString& path, const QString& model, const QString& layouts, const QString& variants ) +-{ +- if ( !QFile::exists( path ) ) +- { +- return false; +- } +- +- QFile config( path ); +- if ( !config.open( QIODevice::ReadOnly ) ) +- { +- return false; +- } +- QStringList content = []( QFile& f ) +- { +- QTextStream s( &f ); +- return s.readAll().split( '\n' ); +- }( config ); +- config.close(); +- +- if ( !config.open( QIODevice::WriteOnly ) ) +- { +- return false; +- } +- +- replaceKey( content, QStringLiteral( "Model=" ), model ); +- replaceKey( content, QStringLiteral( "LayoutList=" ), layouts ); +- replaceKey( content, QStringLiteral( "VariantList=" ), variants ); +- +- config.write( content.join( '\n' ).toUtf8() ); +- config.close(); +- +- return true; +-} +- +-void +-Config::applyKWin() +-{ +- const auto paths = QStandardPaths::standardLocations( QStandardPaths::ConfigLocation ); +- +- auto join = [ &additional = m_additionalLayoutInfo.additionalLayout ]( const QString& s1, const QString& s2 ) +- { return additional.isEmpty() ? s1 : QStringLiteral( "%1,%2" ).arg( s1, s2 ); }; +- +- const QString layouts = join( m_selectedLayout, m_additionalLayoutInfo.additionalLayout ); +- const QString variants = join( m_selectedVariant, m_additionalLayoutInfo.additionalVariant ); +- +- bool updated = false; +- for ( const auto& path : paths ) +- { +- const QString candidate = path + QStringLiteral( "/kxkbrc" ); +- if ( rewriteKWin( candidate, m_selectedModel, layouts, variants ) ) +- { +- updated = true; +- break; +- } +- } +- +- if ( updated ) +- { +- auto kwin = QDBusMessage::createSignal( +- QStringLiteral( "/Layouts" ), QStringLiteral( "org.kde.keyboard" ), QStringLiteral( "reloadConfig" ) ); +- QDBusConnection::sessionBus().send( kwin ); +- } +-} +- +- + KeyboardModelsModel* + Config::keyboardModels() const + { +@@ -533,7 +455,7 @@ Config::detectCurrentKeyboardLayout() + QString currentVariant; + QString currentModel; + +- if ( m_configureLocale1 ) ++ if ( m_useLocale1 ) + { + getCurrentKeyboardLayoutLocale1( currentLayout, currentVariant, currentModel ); + } +@@ -579,10 +501,10 @@ Config::detectCurrentKeyboardLayout() + QString + Config::prettyStatus() const + { +- QString status +- = tr( "Keyboard model has been set to %1.", "@label, %1 is keyboard model, as in Apple Magic Keyboard" ) +- .arg( m_keyboardModelsModel->label( m_keyboardModelsModel->currentIndex() ) ); +- status += QStringLiteral( "
" ); ++ QString status; ++ status ++ += tr( "Keyboard model has been set to %1
.", "@label, %1 is keyboard model, as in Apple Magic Keyboard" ) ++ .arg( m_keyboardModelsModel->label( m_keyboardModelsModel->currentIndex() ) ); + + QString layout = m_keyboardLayoutsModel->item( m_keyboardLayoutsModel->currentIndex() ).second.description; + QString variant = m_keyboardVariantsModel->currentIndex() >= 0 +@@ -605,8 +527,8 @@ Config::createJobs() + m_additionalLayoutInfo, + m_xOrgConfFileName, + m_convertedKeymapPath, +- m_configureEtcDefaultKeyboard, +- m_configureLocale1 ); ++ m_writeEtcDefaultKeyboard, ++ m_useLocale1 ); + list.append( Calamares::job_ptr( j ) ); + + return list; +@@ -796,13 +718,8 @@ Config::setConfigurationMap( const QVariantMap& configurationMap ) + m_xOrgConfFileName = xorgConfDefault; + } + m_convertedKeymapPath = getString( configurationMap, "convertedKeymapPath" ); +- m_configureEtcDefaultKeyboard = getBool( configurationMap, "writeEtcDefaultKeyboard", true ); +- m_configureLocale1 = getBool( configurationMap, "useLocale1", !isX11 ); +- +- bool bogus = false; +- const auto configureItems = getSubMap( configurationMap, "configure", bogus ); +- m_configureKWin = getBool( configureItems, "kwin", false ); +- ++ m_writeEtcDefaultKeyboard = getBool( configurationMap, "writeEtcDefaultKeyboard", true ); ++ m_useLocale1 = getBool( configurationMap, "useLocale1", !isX11 ); + m_guessLayout = getBool( configurationMap, "guessLayout", true ); + } + +diff --git a/src/modules/keyboard/Config.h b/src/modules/keyboard/Config.h +index e2a8c4f0e..04659514d 100644 +--- a/src/modules/keyboard/Config.h ++++ b/src/modules/keyboard/Config.h +@@ -86,17 +86,14 @@ private: + * keyboard layout. This introduces a slight delay between selecting + * a keyboard, and applying it to the system -- so that if you + * scroll through or down-arrow through the list of keyboards, +- * you don't get buried under updates which might take some time. ++ * you don't get buried under xkbset processes. + * +- * somethingChanged() is called when the selection changes, and triggers +- * a delayed call to apply() which does the actual work by calling the +- * relevant apply*() functions. ++ * xkbChanged() is called when the selection changes, and triggers ++ * a delayed call to xkbApply() which does the actual work. + */ +- void somethingChanged(); +- void apply(); +- void applyLocale1(); +- void applyXkb(); +- void applyKWin(); ++ void xkbChanged(); ++ void xkbApply(); ++ void locale1Apply(); + + void getCurrentKeyboardLayoutXkb( QString& currentLayout, QString& currentVariant, QString& currentModel ); + void getCurrentKeyboardLayoutLocale1( QString& currentLayout, QString& currentVariant, QString& currentModel ); +@@ -114,15 +111,13 @@ private: + // Layout (and corresponding info) added if current one doesn't support ASCII (e.g. Russian or Japanese) + AdditionalLayoutInfo m_additionalLayoutInfo; + +- QTimer m_applyTimer; ++ QTimer m_setxkbmapTimer; + + // From configuration + QString m_xOrgConfFileName; + QString m_convertedKeymapPath; +- bool m_configureXkb = true; +- bool m_configureEtcDefaultKeyboard = true; +- bool m_configureLocale1 = false; +- bool m_configureKWin = false; ++ bool m_writeEtcDefaultKeyboard = true; ++ bool m_useLocale1 = false; + bool m_guessLayout = false; + + // The state determines whether we guess settings or preserve them: diff --git a/src/modules/keyboard/KeyboardPage.cpp b/src/modules/keyboard/KeyboardPage.cpp -index dbb80c6..3f06158 100644 +index dbb80c600..3f0615809 100644 --- a/src/modules/keyboard/KeyboardPage.cpp +++ b/src/modules/keyboard/KeyboardPage.cpp @@ -43,13 +43,14 @@ LayoutItem::~LayoutItem() {} @@ -249,7 +843,7 @@ index dbb80c6..3f06158 100644 connect( ui->groupSelector, QOverload< int >::of( &QComboBox::currentIndexChanged ), diff --git a/src/modules/keyboard/KeyboardPage.ui b/src/modules/keyboard/KeyboardPage.ui -index e131e5c..1d6afbf 100644 +index e131e5c9a..1d6afbf21 100644 --- a/src/modules/keyboard/KeyboardPage.ui +++ b/src/modules/keyboard/KeyboardPage.ui @@ -45,9 +45,9 @@ SPDX-License-Identifier: GPL-3.0-or-later @@ -264,8 +858,55 @@ index e131e5c..1d6afbf 100644 +diff --git a/src/modules/keyboard/SetKeyboardLayoutJob.cpp b/src/modules/keyboard/SetKeyboardLayoutJob.cpp +index 81eba130b..beb5780a2 100644 +--- a/src/modules/keyboard/SetKeyboardLayoutJob.cpp ++++ b/src/modules/keyboard/SetKeyboardLayoutJob.cpp +@@ -233,7 +233,7 @@ SetKeyboardLayoutJob::writeVConsoleData( const QString& vconsoleConfPath, const + } + QTextStream stream( &file ); + bool found = false; +- for ( const QString& existingLine : std::as_const( existingLines ) ) ++ for ( const QString& existingLine : qAsConst( existingLines ) ) + { + if ( existingLine.trimmed().startsWith( "KEYMAP=" ) ) + { +diff --git a/src/modules/keyboard/keyboard.conf b/src/modules/keyboard/keyboard.conf +index fe82a9b61..2a8e85149 100644 +--- a/src/modules/keyboard/keyboard.conf ++++ b/src/modules/keyboard/keyboard.conf +@@ -31,15 +31,3 @@ convertedKeymapPath: "/lib/kbd/keymaps/xkb" + # Guess the default layout from the user locale. If false, keeps the current + # OS keyboard layout as the default (useful if the layout is pre-configured). + #guessLayout: true +- +-# Things that should be configured. +-configure: +- # Configure KWin (KDE Plasma) directly by editing the +- # configuration file and informing KWin over DBus. This is +- # useful in a system that uses Wayland but does **not** connect +- # locale1 with KWin. +- # +- # Systems that use KDE Plasma Wayland and locale1 can instead start the +- # compositor KWin with command-line argument `--locale1`. That +- # argument makes this configuration option unnecessary. +- kwin: false +diff --git a/src/modules/keyboard/keyboard.schema.yaml b/src/modules/keyboard/keyboard.schema.yaml +index 0fb1fdcf3..9db89b2e3 100644 +--- a/src/modules/keyboard/keyboard.schema.yaml ++++ b/src/modules/keyboard/keyboard.schema.yaml +@@ -11,9 +11,4 @@ properties: + writeEtcDefaultKeyboard: { type: boolean, default: true } + useLocale1: { type: boolean, default: false } + guessLayout: { type: boolean, default: true } +- configure: +- additionalProperties: false +- type: object +- properties: +- kwin: { type: boolean, default: false } + required: [ xOrgConfFileName, convertedKeymapPath ] diff --git a/src/modules/locale/Config.cpp b/src/modules/locale/Config.cpp -index 8fa17a7..0d70ff3 100644 +index b2ef0e890..fbcbf488c 100644 --- a/src/modules/locale/Config.cpp +++ b/src/modules/locale/Config.cpp @@ -305,6 +305,7 @@ Config::setCurrentLocation( const Calamares::Locale::TimeZoneData* location ) @@ -276,7 +917,7 @@ index 8fa17a7..0d70ff3 100644 } emit currentLocationChanged( m_currentLocation ); // Other signals come from the LocationChanged signal -@@ -370,6 +371,7 @@ Config::setLCLocaleExplicitly( const QString& locale ) +@@ -370,17 +371,16 @@ Config::setLCLocaleExplicitly( const QString& locale ) m_selectedLocaleConfiguration.explicit_lc = true; emit currentLCStatusChanged( currentLCStatus() ); @@ -284,10 +925,51 @@ index 8fa17a7..0d70ff3 100644 emit currentLCCodeChanged( currentLCCode() ); } -@@ -424,6 +426,18 @@ Config::currentLCStatus() const + QString + Config::currentLocationStatus() const + { +- if ( m_currentLocation ) +- { +- return tr( "Set timezone to %1.", "@action" ).arg( currentTimezoneName()); +- } +- return QString(); ++ return tr( "Set timezone to %1/%2", "@action" ) ++ .arg( m_currentLocation ? m_currentLocation->region() : QString(), ++ m_currentLocation ? m_currentLocation->zone() : QString() ); + } + + QString +@@ -426,6 +426,61 @@ Config::currentLCStatus() const .arg( localeLabel( m_selectedLocaleConfiguration.lc_numeric ) ); } ++ ++static QString ++getTranRes(QString& filePath,QString& keyWord) { ++ QFile file(filePath); ++ if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) { ++ qDebug() << "无法打开文件"; ++ return QString(); ++ } ++ ++ QTextStream in(&file); ++ QString currentLine; ++ QString resLine; ++ ++ while (!in.atEnd()) { ++ currentLine = in.readLine(); ++ if (currentLine.contains(keyWord, Qt::CaseInsensitive)) { ++ in.readLine(); ++ resLine = in.readLine(); ++ file.close(); ++ return resLine.trimmed().replace("","").replace("",""); ++ } ++ } ++ ++ return keyWord; ++} ++ ++ +QString +Config::currentTimeZoneStatus() const +{ @@ -296,6 +978,22 @@ index 8fa17a7..0d70ff3 100644 + { + zone = "Hong Kong(China)"; + } ++ ++ ++ zone.replace("_"," "); ++ QString translationFile = ""; ++ if( m_selectedLocaleConfiguration.language() == "zh_CN.utf8"){ ++ translationFile = "tz_zh_CN.ts"; ++ } else if( m_selectedLocaleConfiguration.language() == "zh_TW.utf8"){ ++ translationFile="tz_zh_TW.ts"; ++ } ++ ++ QString transFilePath = QStringLiteral("/usr/share/calamares/") + translationFile; ++ cDebug() << "transFilePath" << transFilePath; ++ if(translationFile != ""){ ++ zone = getTranRes(transFilePath, zone); ++ } ++ + return tr("The timezone will be set to %1.","@info") + .arg( zone ); +} @@ -304,7 +1002,7 @@ index 8fa17a7..0d70ff3 100644 Config::prettyStatus() const { diff --git a/src/modules/locale/Config.h b/src/modules/locale/Config.h -index a26d25a..6a8bea1 100644 +index a26d25a9c..6a8bea12b 100644 --- a/src/modules/locale/Config.h +++ b/src/modules/locale/Config.h @@ -34,6 +34,7 @@ class Config : public QObject @@ -333,7 +1031,7 @@ index a26d25a..6a8bea1 100644 private: /// A list of supported locale identifiers (e.g. "en_US.UTF-8") diff --git a/src/modules/locale/LocalePage.cpp b/src/modules/locale/LocalePage.cpp -index e74373a..0568067 100644 +index e74373ad7..0568067fb 100644 --- a/src/modules/locale/LocalePage.cpp +++ b/src/modules/locale/LocalePage.cpp @@ -31,20 +31,21 @@ LocalePage::LocalePage( Config* config, QWidget* parent ) @@ -458,7 +1156,7 @@ index e74373a..0568067 100644 diff --git a/src/modules/locale/LocalePage.h b/src/modules/locale/LocalePage.h -index 66502e6..b5fb06d 100644 +index 66502e69c..b5fb06d8a 100644 --- a/src/modules/locale/LocalePage.h +++ b/src/modules/locale/LocalePage.h @@ -58,6 +58,7 @@ private: @@ -470,7 +1168,7 @@ index 66502e6..b5fb06d 100644 bool m_blockTzWidgetSet; diff --git a/src/modules/locale/SetTimezoneJob.cpp b/src/modules/locale/SetTimezoneJob.cpp -index 3d88bd0..2a586f7 100644 +index 3d88bd02c..2a586f7d2 100644 --- a/src/modules/locale/SetTimezoneJob.cpp +++ b/src/modules/locale/SetTimezoneJob.cpp @@ -50,6 +50,10 @@ SetTimezoneJob::exec() @@ -484,8 +1182,23 @@ index 3d88bd0..2a586f7 100644 zoneinfoPath.append( QDir::separator() + m_region ); zoneinfoPath.append( QDir::separator() + m_zone ); +diff --git a/src/modules/locale/Tests.cpp b/src/modules/locale/Tests.cpp +index a321b2f89..bc92a8882 100644 +--- a/src/modules/locale/Tests.cpp ++++ b/src/modules/locale/Tests.cpp +@@ -293,8 +293,8 @@ LocaleTests::testConfigInitialization() + { + Config c; + +- QCOMPARE( c.currentLocation(), nullptr ); +- QVERIFY( c.currentLocationStatus().isEmpty() ); ++ QVERIFY( !c.currentLocation() ); ++ QVERIFY( !c.currentLocationStatus().isEmpty() ); + } + + void diff --git a/src/modules/locale/locale.conf b/src/modules/locale/locale.conf -index 4463f7a..028071f 100644 +index 4463f7a94..028071f75 100644 --- a/src/modules/locale/locale.conf +++ b/src/modules/locale/locale.conf @@ -17,8 +17,8 @@ @@ -509,7 +1222,7 @@ index 4463f7a..028071f 100644 selector: "" # leave blank for the default diff --git a/src/modules/localeq/localeq.conf b/src/modules/localeq/localeq.conf -index bb2a7e8..35a819a 100644 +index bb2a7e816..35a819a05 100644 --- a/src/modules/localeq/localeq.conf +++ b/src/modules/localeq/localeq.conf @@ -95,6 +95,6 @@ zone: "New_York" @@ -520,8 +1233,24 @@ index bb2a7e8..35a819a 100644 + style: "none" url: "https://geoip.kde.org/v1/calamares" selector: "" # leave blank for the default +diff --git a/src/modules/mount/main.py b/src/modules/mount/main.py +index 4a16f8872..bfeb23ea6 100644 +--- a/src/modules/mount/main.py ++++ b/src/modules/mount/main.py +@@ -345,10 +345,7 @@ def run(): + _("No partitions are defined for

{!s}
to use.").format("mount")) + + # Find existing swap partitions that are part of the installation and enable them now +- claimed_swap_partitions = [p for p in partitions if p["fs"] == "linuxswap" and p.get("claimed", False)] +- plain_swap = [p for p in claimed_swap_partitions if p["fsName"] == "linuxswap"] +- luks_swap = [p for p in claimed_swap_partitions if p["fsName"] == "luks" or p["fsName"] == "luks2"] +- swap_devices = [p["device"] for p in plain_swap] + ["/dev/mapper/" + p["luksMapperName"] for p in luks_swap] ++ swap_devices = [p["device"] for p in partitions if (p["fs"] == "linuxswap" and p.get("claimed", False))] + + enable_swap_partition(swap_devices) + diff --git a/src/modules/mount/mount.conf b/src/modules/mount/mount.conf -index da95395..bf06fe9 100644 +index da9539569..bf06fe955 100644 --- a/src/modules/mount/mount.conf +++ b/src/modules/mount/mount.conf @@ -28,12 +28,21 @@ extraMounts: @@ -546,8 +1275,51 @@ index da95395..bf06fe9 100644 - device: efivarfs fs: efivarfs mountPoint: /sys/firmware/efi/efivars +diff --git a/src/modules/netinstall/PackageModel.cpp b/src/modules/netinstall/PackageModel.cpp +index 98eb446eb..01a0205e7 100644 +--- a/src/modules/netinstall/PackageModel.cpp ++++ b/src/modules/netinstall/PackageModel.cpp +@@ -378,7 +378,7 @@ PackageModel::appendModelData( const QVariantList& groupList ) + removeList.insert( 0, i ); + } + } +- for ( const int& item : std::as_const( removeList ) ) ++ for ( const int& item : qAsConst( removeList ) ) + { + m_rootItem->removeChild( item ); + } +diff --git a/src/modules/netinstall/netinstall.schema.yaml b/src/modules/netinstall/netinstall.schema.yaml +index 1faf65651..8f057b503 100644 +--- a/src/modules/netinstall/netinstall.schema.yaml ++++ b/src/modules/netinstall/netinstall.schema.yaml +@@ -6,6 +6,7 @@ $schema: https://json-schema.org/draft-07/schema# + $id: https://calamares.io/schemas/netinstall + definitions: + package: ++ $id: 'definitions/package' + oneOf: + - + type: string +@@ -19,6 +20,7 @@ definitions: + name: { type: string } + description: { type: string } + group: ++ $id: 'definitions/group' + type: object + description: Longer discussion in `netinstall.conf` file under 'Groups Format' + properties: +@@ -53,7 +55,9 @@ definitions: + maxItems: 0 + then: + required: [name, description, packages] # bottom-most (sub)group requires some package (otherwise, why bother?) ++ # This should validate `netinstall.yaml` also. + groups: ++ $id: 'definitions/groups' + type: array + items: { $ref: '#/definitions/group' } + diff --git a/src/modules/packagechooser/Config.cpp b/src/modules/packagechooser/Config.cpp -index 642311b..0abeafa 100644 +index 642311b33..0abeafafc 100644 --- a/src/modules/packagechooser/Config.cpp +++ b/src/modules/packagechooser/Config.cpp @@ -238,7 +238,7 @@ Config::setPackageChoice( const QString& packageChoice ) @@ -560,7 +1332,7 @@ index 642311b..0abeafa 100644 QString diff --git a/src/modules/packagechooser/PackageChooserPage.cpp b/src/modules/packagechooser/PackageChooserPage.cpp -index 44a570d..53bd82a 100644 +index 44a570d2f..53bd82a1b 100644 --- a/src/modules/packagechooser/PackageChooserPage.cpp +++ b/src/modules/packagechooser/PackageChooserPage.cpp @@ -16,7 +16,8 @@ @@ -608,8 +1380,30 @@ index 44a570d..53bd82a 100644 } } } +diff --git a/src/modules/packagechooser/PackageModel.cpp b/src/modules/packagechooser/PackageModel.cpp +index f2a0b434d..d183680b0 100644 +--- a/src/modules/packagechooser/PackageModel.cpp ++++ b/src/modules/packagechooser/PackageModel.cpp +@@ -112,7 +112,7 @@ PackageListModel::addPackage( PackageItem&& p ) + QStringList + PackageListModel::getInstallPackagesForName( const QString& id ) const + { +- for ( const auto& p : std::as_const( m_packages ) ) ++ for ( const auto& p : qAsConst( m_packages ) ) + { + if ( p.id == id ) + { +@@ -126,7 +126,7 @@ QStringList + PackageListModel::getInstallPackagesForNames( const QStringList& ids ) const + { + QStringList l; +- for ( const auto& p : std::as_const( m_packages ) ) ++ for ( const auto& p : qAsConst( m_packages ) ) + { + if ( ids.contains( p.id ) ) + { diff --git a/src/modules/packagechooser/packagechooser.conf b/src/modules/packagechooser/packagechooser.conf -index 5b40aeb..e7b9b00 100644 +index 5b40aeb80..3f356382e 100644 --- a/src/modules/packagechooser/packagechooser.conf +++ b/src/modules/packagechooser/packagechooser.conf @@ -9,7 +9,7 @@ @@ -630,7 +1424,12 @@ index 5b40aeb..e7b9b00 100644 # Human-visible strings in this module. These are all optional. -@@ -150,23 +150,32 @@ labels: +@@ -147,26 +147,37 @@ labels: + # + # An item for AppStream may also contain an *id* and a *screenshot* + # key which will override the data from AppStream. ++# liberation-fonts, gnu-*-fonts, google-*-fonts, adwaita-icon-theme, atk, atkmm, at-spi2-atk, at-spi2-core, baobab, abattis-cantarell-fonts, cheese, clutter, clutter-gst3, clutter-gtk, cogl, dconf, dconf-editor, devhelp, eog, epiphany, evince, evolution-data-server, file-roller, folks, gcab, gcr, gdk-pixbuf2, gdm, gedit, geocode-glib, gfbgraph, gjs, glib2, glibmm24, glib-networking, gmime30, gnome-autoar, gnome-backgrounds, gnome-bluetooth, gnome-builder, gnome-calculator, gnome-calendar, gnome-characters, gnome-clocks, gnome-color-manager, gnome-contacts, gnome-control-center, gnome-desktop3, gnome-disk-utility, gnome-font-viewer, gnome-getting-started-docs, gnome-initial-setup, gnome-keyring, gnome-logs, gnome-menus, gnome-music, gnome-online-accounts, gnome-online-miners, gnome-photos, gnome-remote-desktop, gnome-screenshot, gnome-session, gnome-settings-daemon, gnome-shell, gnome-shell-extensions, gnome-software, gnome-system-monitor, gnome-terminal, gnome-tour, gnome-user-docs, gnome-user-share, gnome-video-effects, gnome-weather, gobject-introspection, gom, grilo, grilo-plugins, gsettings-desktop-schemas, gsound, gspell, gssdp, gtk3, gtk4, gtk-doc, gtkmm30, gtksourceview4, gtk-vnc2, gupnp, gupnp-av, gupnp-dlna, gvfs, json-glib, libchamplain, libdazzle, libgdata, libgee, libgnomekbd, libgsf, libgtop2, libgweather, libgxps, libhandy, libmediaart, libnma, libnotify, libpeas, librsvg2, libsecret, libsigc++20, libsoup, mm-common, mutter, nautilus, orca, pango, pangomm, libphodav, python3-pyatspi, python3-gobject, rest, rygel, simple-scan, sushi, sysprof, tepl, totem, totem-pl-parser, tracker3, tracker3-miners, vala, vte291, yelp, yelp-tools, yelp-xsl, zenity, devstation-config, ibus-libpinyin ] ++ items: - id: "" # packages: [] # This item installs no packages @@ -656,7 +1455,7 @@ index 5b40aeb..e7b9b00 100644 - id: gnome - packages: [ gnome-all ] - name: GNOME -+ packages: [ checkpolicy, code, xorg-*, dejavu-fonts, liberation-fonts, gnu-*-fonts, google-*-fonts, adwaita-icon-theme, atk, atkmm, at-spi2-atk, at-spi2-core, baobab, abattis-cantarell-fonts, cheese, clutter, clutter-gst3, clutter-gtk, cogl, dconf, dconf-editor, devhelp, eog, epiphany, evince, evolution-data-server, file-roller, folks, gcab, gcr, gdk-pixbuf2, gdm, gedit, geocode-glib, gfbgraph, gjs, glib2, glibmm24, glib-networking, gmime30, gnome-autoar, gnome-backgrounds, gnome-bluetooth, gnome-builder, gnome-calculator, gnome-calendar, gnome-characters, gnome-clocks, gnome-color-manager, gnome-contacts, gnome-control-center, gnome-desktop3, gnome-disk-utility, gnome-font-viewer, gnome-getting-started-docs, gnome-initial-setup, gnome-keyring, gnome-logs, gnome-menus, gnome-music, gnome-online-accounts, gnome-online-miners, gnome-photos, gnome-remote-desktop, gnome-screenshot, gnome-session, gnome-settings-daemon, gnome-shell, gnome-shell-extensions, gnome-software, gnome-system-monitor, gnome-terminal, gnome-tour, gnome-user-docs, gnome-user-share, gnome-video-effects, gnome-weather, gobject-introspection, gom, grilo, grilo-plugins, gsettings-desktop-schemas, gsound, gspell, gssdp, gtk3, gtk4, gtk-doc, gtkmm30, gtksourceview4, gtk-vnc2, gupnp, gupnp-av, gupnp-dlna, gvfs, json-glib, libchamplain, libdazzle, libgdata, libgee, libgnomekbd, libgsf, libgtop2, libgweather, libgxps, libhandy, libmediaart, libnma, libnotify, libpeas, librsvg2, libsecret, libsigc++20, libsoup, mm-common, mutter, nautilus, orca, pango, pangomm, libphodav, python3-pyatspi, python3-gobject, rest, rygel, simple-scan, sushi, sysprof, tepl, totem, totem-pl-parser, tracker3, tracker3-miners, vala, vte291, yelp, yelp-tools, yelp-xsl, zenity, devstation-config, ibus-libpinyin ] ++ packages: [ checkpolicy, code, dejavu-fonts, liberation-fonts, gnome-shell, gnome-session, gnome-terminal, gnome-software, gnome-menus, nautilus, xdg-utils, google-droid-sans-fonts, google-noto-fonts-common, google-noto-sans-arabic-vf-fonts, google-noto-sans-armenian-vf-fonts, google-noto-sans-bengali-vf-fonts, google-noto-sans-canadian-aboriginal-vf-fonts, google-noto-sans-cherokee-vf-fonts, google-noto-sans-devanagari-vf-fonts, google-noto-sans-ethiopic-vf-fonts, google-noto-sans-georgian-vf-fonts, google-noto-sans-hebrew-vf-fonts, google-noto-sans-kannada-vf-fonts, google-noto-sans-khmer-vf-fonts, google-noto-sans-lao-vf-fonts, google-noto-sans-math-fonts, google-noto-sans-mono-vf-fonts, google-noto-sans-sinhala-vf-fonts, google-noto-sans-symbols2-fonts, google-noto-sans-symbols-vf-fonts, google-noto-sans-tamil-vf-fonts, google-noto-sans-thaana-vf-fonts, google-noto-sans-thai-vf-fonts, google-noto-sans-vf-fonts, google-noto-serif-armenian-vf-fonts, google-noto-serif-ethiopic-vf-fonts, google-noto-serif-georgian-vf-fonts, google-noto-serif-gujarati-vf-fonts, google-noto-serif-gurmukhi-vf-fonts, google-noto-serif-hebrew-vf-fonts, google-noto-serif-kannada-vf-fonts, google-noto-serif-khmer-vf-fonts, google-noto-serif-lao-vf-fonts, google-noto-serif-sinhala-vf-fonts, google-noto-serif-tamil-vf-fonts, google-noto-serif-thai-vf-fonts, google-noto-serif-vf-fonts, gdm, ibus-libpinyin, webp-pixbuf-loader, firefox, devstation-config, wqy-zenhei-fonts ] + name: DevStation + name[zh]: DevStation description: GNU Networked Object Modeling Environment Desktop @@ -678,23 +1477,20 @@ index 5b40aeb..e7b9b00 100644 + # - id: kate + # appstream: org.kde.kwrite.desktop diff --git a/src/modules/packagechooser/packagechooser.qrc b/src/modules/packagechooser/packagechooser.qrc -index 3b9c96a..05944ce 100644 +index 3b9c96a5b..b5c4a9cde 100644 --- a/src/modules/packagechooser/packagechooser.qrc +++ b/src/modules/packagechooser/packagechooser.qrc -@@ -2,5 +2,11 @@ +@@ -1,6 +1,7 @@ + images/no-selection.png - images/calamares.png -+ +- images/calamares.png + images/gnome.png -+ -+ -+ + images/Minimal-Install.png diff --git a/src/modules/packages/main.py b/src/modules/packages/main.py -index d2a2552..8c165e8 100644 +index b1aa6e3ff..2c6e6adb4 100644 --- a/src/modules/packages/main.py +++ b/src/modules/packages/main.py @@ -123,7 +123,7 @@ class PackageManager(metaclass=abc.ABCMeta): @@ -706,7 +1502,7 @@ index d2a2552..8c165e8 100644 """ Install a package from a single entry in the install list. This can be either a single package name, or an object -@@ -135,11 +135,18 @@ class PackageManager(metaclass=abc.ABCMeta): +@@ -135,11 +135,19 @@ class PackageManager(metaclass=abc.ABCMeta): see install.from_local """ if isinstance(packagedata, str): @@ -716,10 +1512,11 @@ index d2a2552..8c165e8 100644 self.run(packagedata["pre-script"]) - self.install([packagedata["package"]], from_local=from_local) - self.run(packagedata["post-script"]) -+ if isinstance(packagedata["package"], list): -+ self.install(packagedata["package"], from_local=from_local, options=options) -+ else: -+ self.install([packagedata["package"]], from_local=from_local, options=options) ++ if "package" in packagedata: ++ if isinstance(packagedata["package"], list): ++ self.install(packagedata["package"], from_local=from_local, options=options) ++ else: ++ self.install([packagedata["package"]], from_local=from_local, options=options) + if isinstance(packagedata["post-script"], list): + for script in packagedata["post-script"]: + self.run(script) @@ -728,7 +1525,7 @@ index d2a2552..8c165e8 100644 def remove_package(self, packagedata): """ -@@ -155,9 +162,15 @@ class PackageManager(metaclass=abc.ABCMeta): +@@ -155,9 +163,15 @@ class PackageManager(metaclass=abc.ABCMeta): else: self.run(packagedata["pre-script"]) self.remove([packagedata["package"]]) @@ -746,7 +1543,7 @@ index d2a2552..8c165e8 100644 """ Installs the list of packages named in @p package_list . These can be strings -- plain package names -- or -@@ -172,11 +185,14 @@ class PackageManager(metaclass=abc.ABCMeta): +@@ -172,11 +186,14 @@ class PackageManager(metaclass=abc.ABCMeta): NOTE: exceptions are expected to leave this method, to indicate failure of the installation. """ @@ -763,7 +1560,7 @@ index d2a2552..8c165e8 100644 def operation_try_install(self, package_list): """ -@@ -286,8 +302,10 @@ class PMDnf(PackageManager): +@@ -286,8 +303,10 @@ class PMDnf(PackageManager): """ backend = "dnf" @@ -776,7 +1573,35 @@ index d2a2552..8c165e8 100644 def remove(self, pkgs): # ignore the error code for now because dnf thinks removing a -@@ -651,6 +669,55 @@ def subst_locale(plist): +@@ -583,23 +602,17 @@ class PMPortage(PackageManager): + class PMXbps(PackageManager): + backend = "xbps" + +- def line_cb(self, line): +- libcalamares.utils.debug(line) +- +- def run_xbps(self, command): +- libcalamares.utils.target_env_process_output(command, self.line_cb); +- + def install(self, pkgs, from_local=False): +- self.run_xbps(["xbps-install", "-Sy"] + pkgs) ++ check_target_env_call(["xbps-install", "-Sy"] + pkgs) + + def remove(self, pkgs): +- self.run_xbps(["xbps-remove", "-Ry"] + pkgs) ++ check_target_env_call(["xbps-remove", "-Ry", "--noconfirm"] + pkgs) + + def update_db(self): +- self.run_xbps(["xbps-install", "-S"]) ++ check_target_env_call(["xbps-install", "-S"]) + + def update_system(self): +- self.run_xbps(["xbps", "-Suy"]) ++ check_target_env_call(["xbps", "-Suy"]) + + + class PMYum(PackageManager): +@@ -657,6 +670,55 @@ def subst_locale(plist): locale is 'en' (e.g. English, US) then these localized packages are dropped from the list. @@ -832,12 +1657,12 @@ index d2a2552..8c165e8 100644 @param plist: list[str|dict] Candidate packages to install. @return: list[str|dict] -@@ -688,7 +755,24 @@ def subst_locale(plist): +@@ -694,7 +756,22 @@ def subst_locale(plist): return ret -def run_operations(pkgman, entry): -+def handle_packagechooser(entry): ++def handle_packagechooser(): + """ + Handle special logic for entries with source "packagechooser@packagechooser". + Modifies the entry to include specific pre- and post-scripts. @@ -845,54 +1670,94 @@ index d2a2552..8c165e8 100644 + :param entry: dict + The operation entry to process. + """ -+ if "install" in entry: -+ item = { -+ "package": entry["install"], -+ "pre-script": "", -+ "post-script": ["/bin/bash /etc/add_selinux_policy.sh", "systemctl enable gdm", "systemctl set-default graphical.target"] -+ } -+ entry["install"] = [item] ++ item = { ++ "pre-script": "", ++ "post-script": ["/bin/bash /etc/add_selinux_policy.sh", "systemctl enable gdm", "systemctl set-default graphical.target"] ++ } ++ return item + + +def run_operations(pkgman, entry, options): """ Call package manager with suitable parameters for the given package actions. -@@ -705,24 +789,28 @@ def run_operations(pkgman, entry): +@@ -709,37 +786,54 @@ def run_operations(pkgman, entry): + names (strings) or package information dictionaries with pre- + and post-scripts. """ - global group_packages, completed_packages, mode_packages +- global group_packages, completed_packages, mode_packages ++ global group_packages, completed_packages, mode_packages, custom_status_message -+ if "source" in entry and entry["source"] == "packagechooser@packagechooser": -+ handle_packagechooser(entry) -+ for key in entry.keys(): package_list = subst_locale(entry[key]) ++ libcalamares.utils.warning(str(package_list)) group_packages = len(package_list) -+ - if key == "install": - _change_mode(INSTALL) +- if key == "install": +- _change_mode(INSTALL) - pkgman.operation_install(package_list) -+ pkgman.operation_install(package_list, options=options) - elif key == "try_install": +- elif key == "try_install": ++ ++ if key in ["install", "try_install", "localInstall"]: _change_mode(INSTALL) - pkgman.operation_try_install(package_list) -+ pkgman.operation_try_install(package_list, options=options) - elif key == "remove": - _change_mode(REMOVE) +- elif key == "remove": +- _change_mode(REMOVE) - pkgman.operation_remove(package_list) -+ pkgman.operation_remove(package_list, options=options) - elif key == "try_remove": +- elif key == "try_remove": ++ for package in package_list: ++ custom_status_message = f"Installing package: {package}" ++ try: ++ if key == "localInstall": ++ pkgman.operation_install([package], from_local=True, options=options) ++ elif key == "try_install": ++ pkgman.operation_try_install([package], options=options) ++ else: ++ pkgman.operation_install([package], options=options) ++ except Exception as e: ++ libcalamares.utils.warning("Failed to install package {}: {}".format(package, str(e))) ++ ++ completed_packages += 1 ++ progress = completed_packages / total_packages ++ libcalamares.job.setprogress(progress) ++ libcalamares.utils.debug("Progress: {:.2f}, Package: {}".format(progress, package)) ++ elif key in ["remove", "try_remove"]: _change_mode(REMOVE) - pkgman.operation_try_remove(package_list) -+ pkgman.operation_try_remove(package_list, options=options) - elif key == "localInstall": - _change_mode(INSTALL) +- elif key == "localInstall": +- _change_mode(INSTALL) - pkgman.operation_install(package_list, from_local=True) -+ pkgman.operation_install(package_list, from_local=True, options=options) - elif key == "source": - libcalamares.utils.debug("Package-list from {!s}".format(entry[key])) +- elif key == "source": +- libcalamares.utils.debug("Package-list from {!s}".format(entry[key])) ++ for package in package_list: ++ try: ++ if key == "remove": ++ pkgman.operation_remove([package], options=options) ++ elif key == "try_remove": ++ pkgman.operation_try_remove([package], options=options) ++ except Exception as e: ++ libcalamares.utils.warning("Failed to remove package {}: {}".format(package, str(e))) ++ ++ completed_packages += 1 ++ progress = completed_packages / total_packages ++ libcalamares.job.setprogress(progress) ++ libcalamares.utils.debug("Progress: {:.2f}, Package: {}".format(progress, package)) else: -@@ -796,12 +884,21 @@ def run(): + libcalamares.utils.warning("Unknown package-operation key {!s}".format(key)) +- completed_packages += len(package_list) +- libcalamares.job.setprogress(completed_packages * 1.0 / total_packages) +- libcalamares.utils.debug("Pretty name: {!s}, setting progress..".format(pretty_name())) + ++ if "source" in entry and entry["source"] == "packagechooser@packagechooser": ++ packagemeta = handle_packagechooser() ++ pkgman.operation_install([packagemeta], from_local=True, options=options) + group_packages = 0 +- _change_mode(None) +- ++ _change_mode(None) + + def run(): + """ +@@ -802,12 +896,21 @@ def run(): if not total_packages: # Avoids potential divide-by-zero in progress reporting return None @@ -915,7 +1780,7 @@ index d2a2552..8c165e8 100644 except subprocess.CalledProcessError as e: libcalamares.utils.warning(str(e)) libcalamares.utils.debug("stdout:" + str(e.stdout)) -@@ -811,6 +908,7 @@ def run(): +@@ -817,6 +920,7 @@ def run(): .format(e.cmd, e.returncode)) mode_packages = None @@ -923,8 +1788,17 @@ index d2a2552..8c165e8 100644 libcalamares.job.setprogress(1.0) +diff --git a/src/modules/packages/module.desc b/src/modules/packages/module.desc +index 3e3053bfa..9529af615 100644 +--- a/src/modules/packages/module.desc ++++ b/src/modules/packages/module.desc +@@ -5,3 +5,4 @@ type: "job" + name: "packages" + interface: "python" + script: "main.py" ++weight: 50 diff --git a/src/modules/packages/packages.conf b/src/modules/packages/packages.conf -index b9777f6..490c289 100644 +index b9777f606..31e51c29d 100644 --- a/src/modules/packages/packages.conf +++ b/src/modules/packages/packages.conf @@ -36,7 +36,7 @@ @@ -936,7 +1810,7 @@ index b9777f6..490c289 100644 # # Often package installation needs an internet connection. -@@ -202,13 +202,32 @@ pacman: +@@ -202,13 +202,30 @@ pacman: # "binutils", and then a second time for "wget". When installing large numbers # of packages, this can lead to a considerable time savings. # @@ -961,7 +1835,7 @@ index b9777f6..490c289 100644 + - coreutils + - efibootmgr + - shim -+ - java-11-openjdk-devel ++ - java-21-openjdk-devel + - vim + - gdb + - perf @@ -975,13 +1849,86 @@ index b9777f6..490c289 100644 + options: + - --nogpgcheck + - --setopt=sslverify=0 -+ - --disablerepo=* -+ - --enablerepo=local-repo +diff --git a/src/modules/partition/CMakeLists.txt b/src/modules/partition/CMakeLists.txt +index b5185bcea..3af8e4465 100644 +--- a/src/modules/partition/CMakeLists.txt ++++ b/src/modules/partition/CMakeLists.txt +@@ -60,7 +60,6 @@ if(KPMcore_FOUND) + core/DeviceList.cpp + core/DeviceModel.cpp + core/KPMHelpers.cpp +- core/DirFSRestrictLayout.cpp + core/OsproberEntry.cpp + core/PartitionActions.cpp + core/PartitionCoreModule.cpp +diff --git a/src/modules/partition/Config.cpp b/src/modules/partition/Config.cpp +index 085c45179..f4e404c28 100644 +--- a/src/modules/partition/Config.cpp ++++ b/src/modules/partition/Config.cpp +@@ -448,12 +448,6 @@ Config::setConfigurationMap( const QVariantMap& configurationMap ) + m_showNotEncryptedBootMessage = Calamares::getBool( configurationMap, "showNotEncryptedBootMessage", true ); + m_requiredPartitionTableType = Calamares::getStringList( configurationMap, "requiredPartitionTableType" ); + +- { +- bool bogus = true; +- const auto lvmConfiguration = Calamares::getSubMap( configurationMap, "lvm", bogus ); +- m_isLVMEnabled = Calamares::getBool( lvmConfiguration, "enable", true); +- } +- + Calamares::GlobalStorage* gs = Calamares::JobQueue::instance()->globalStorage(); + gs->insert( "armInstall", Calamares::getBool( configurationMap, "armInstall", false ) ); + fillGSConfigurationEFI( gs, configurationMap ); +diff --git a/src/modules/partition/Config.h b/src/modules/partition/Config.h +index 13da58ac4..8ec139169 100644 +--- a/src/modules/partition/Config.h ++++ b/src/modules/partition/Config.h +@@ -38,8 +38,6 @@ class Config : public QObject + Q_PROPERTY( bool preCheckEncryption READ preCheckEncryption CONSTANT FINAL ) + Q_PROPERTY( bool showNotEncryptedBootMessage READ showNotEncryptedBootMessage CONSTANT FINAL ) + +- Q_PROPERTY( bool lvmEnabled READ isLVMEnabled CONSTANT FINAL ) +- + public: + Config( QObject* parent ); + ~Config() override = default; +@@ -176,8 +174,6 @@ public: + /// @brief If zfs encryption should be allowed + bool allowZfsEncryption() const { return m_allowZfsEncryption; } + +- bool isLVMEnabled() const { return m_isLVMEnabled; } +- + public Q_SLOTS: + void setInstallChoice( int ); ///< Translates a button ID or so to InstallChoice + void setInstallChoice( InstallChoice ); +@@ -212,7 +208,6 @@ private: + bool m_allowManualPartitioning = true; + bool m_preCheckEncryption = false; + bool m_showNotEncryptedBootMessage = true; +- bool m_isLVMEnabled = true; + }; + + /** @brief Given a set of swap choices, return a sensible value from it. diff --git a/src/modules/partition/PartitionViewStep.cpp b/src/modules/partition/PartitionViewStep.cpp -index db087b5..2f98fe1 100644 +index f356c7168..2f98fe1a3 100644 --- a/src/modules/partition/PartitionViewStep.cpp +++ b/src/modules/partition/PartitionViewStep.cpp -@@ -48,8 +48,7 @@ PartitionViewStep::PartitionViewStep( QObject* parent ) +@@ -21,7 +21,6 @@ + #include "gui/PartitionBarsView.h" + #include "gui/PartitionLabelsView.h" + #include "gui/PartitionPage.h" +-#include "partition/FileSystem.h" + + #include "Branding.h" + #include "GlobalStorage.h" +@@ -34,7 +33,6 @@ + #include "widgets/TranslationFix.h" + #include "widgets/WaitingWidget.h" + +-#include + #include + + #include +@@ -50,8 +48,7 @@ PartitionViewStep::PartitionViewStep( QObject* parent ) , m_choicePage( nullptr ) , m_manualPartitionPage( nullptr ) { @@ -991,122 +1938,2111 @@ index db087b5..2f98fe1 100644 m_waitingWidget = new WaitingWidget( QString() ); m_widget->addWidget( m_waitingWidget ); CALAMARES_RETRANSLATE( -diff --git a/src/modules/partition/gui/BootInfoWidget.cpp b/src/modules/partition/gui/BootInfoWidget.cpp -index b4339be..eb70b4a 100644 ---- a/src/modules/partition/gui/BootInfoWidget.cpp -+++ b/src/modules/partition/gui/BootInfoWidget.cpp -@@ -42,7 +42,8 @@ BootInfoWidget::BootInfoWidget( QWidget* parent ) - QFontMetrics fm = QFontMetrics( QFont() ); - m_bootLabel->setMinimumWidth( fm.boundingRect( "BIOS" ).width() + Calamares::defaultFontHeight() / 2 ); - m_bootLabel->setAlignment( Qt::AlignCenter ); +@@ -61,18 +58,6 @@ PartitionViewStep::PartitionViewStep( QObject* parent ) + // We're not done loading, but we need the configuration map first. + } + +-PartitionViewStep::FSConflictEntry::FSConflictEntry() {} - -+ m_bootLabel->setStyleSheet("background-color:#FFFFFF;"); -+ m_bootIcon->setStyleSheet("background-color:#FFFFFF;"); - QPalette palette; - palette.setBrush( WindowText, QColor( "#4D4D4D" ) ); //dark grey +-PartitionViewStep::FSConflictEntry::FSConflictEntry( const QString& conflictingPathArg, +- const QString& conflictingFilesystemArg, +- const QString& conflictedPathArg, +- QStringList allowableFilesystemsArg ) +- : conflictingPath( conflictingPathArg ) +- , conflictingFilesystem( conflictingFilesystemArg ) +- , conflictedPath( conflictedPathArg ) +- , allowableFilesystems( allowableFilesystemsArg ) +-{} +- + void + PartitionViewStep::initPartitionCoreModule() + { +@@ -124,19 +109,18 @@ PartitionViewStep::prettyName() const + /** @brief Gather the pretty descriptions of all the partitioning jobs + * + * Returns a QStringList of each job's pretty description, including +- * duplicates (but no empty lines). The list is in-order of how the +- * jobs will be run. If no job has a non-empty description, the list is empty. ++ * empty strings and duplicates. The list is in-order of how the ++ * jobs will be run. + */ + static QStringList + jobDescriptions( const Calamares::JobList& jobs ) + { + QStringList jobsLines; +- for ( const Calamares::job_ptr& job : std::as_const( jobs ) ) ++ for ( const Calamares::job_ptr& job : qAsConst( jobs ) ) + { +- const auto description = job->prettyDescription(); +- if ( !description.isEmpty() ) ++ if ( !job->prettyDescription().isEmpty() ) + { +- jobsLines.append( description ); ++ jobsLines.append( job->prettyDescription() ); + } + } + return jobsLines; +@@ -247,12 +231,8 @@ PartitionViewStep::prettyStatus() const + } + return s.join( QString() ); + }(); +- QStringList jobsLabels = jobDescriptions( jobs() ); +- if ( m_config->swapChoice() == Config::SwapChoice::SwapFile ) +- { +- jobsLabels.append( tr( "Create a swap file." ) ); +- } +- return diskInfoLabel + "
" + jobsLabels.join( QStringLiteral( "
" ) ); ++ const QString jobsLabel = jobDescriptions( jobs() ).join( QStringLiteral( "
" ) ); ++ return diskInfoLabel + "
" + jobsLabel; + } + + QWidget* +@@ -375,7 +355,7 @@ PartitionViewStep::next() + { + if ( !m_manualPartitionPage ) + { +- m_manualPartitionPage = new PartitionPage( m_core, *m_config ); ++ m_manualPartitionPage = new PartitionPage( m_core ); + m_widget->addWidget( m_manualPartitionPage ); + } + +@@ -473,12 +453,6 @@ PartitionViewStep::onActivate() + } + } + +-static QString +-listItem( QString s ) +-{ +- return s.prepend( QStringLiteral( "
  • " ) ).append( QStringLiteral( "
  • " ) ); +-} +- + static bool + shouldWarnForGPTOnBIOS( const PartitionCoreModule* core ) + { +@@ -498,7 +472,7 @@ shouldWarnForGPTOnBIOS( const PartitionCoreModule* core ) + if ( table && table->type() == PartitionTable::TableType::gpt ) + { + // So this is a BIOS system, and the bootloader will be installed on a GPT system +- for ( const auto& partition : std::as_const( table->children() ) ) ++ for ( const auto& partition : qAsConst( table->children() ) ) + { + using Calamares::Units::operator""_MiB; + if ( ( partition->activeFlags() & KPM_PARTITION_FLAG( BiosGrub ) ) +@@ -542,143 +516,6 @@ shouldWarnForNotEncryptedBoot( const Config* config, const PartitionCoreModule* + return false; + } + +-static PartitionViewStep::FSConflictEntry +-calcFSConflictEntry( PartitionCoreModule* core, PartitionModel* partModel, QModelIndex partFsIdx, QModelIndex partMountPointIdx, QStringList mountPointList ) +-{ +- PartitionViewStep::FSConflictEntry result; +- +- QString partFs = partModel->data( partFsIdx ).toString().toLower(); +- QString partMountPoint = partModel->data( partMountPointIdx ).toString(); +- FileSystem::Type fsType; +- PartUtils::canonicalFilesystemName( partFs, &fsType ); +- bool fsTypeIsAllowed = false; +- if ( fsType == FileSystem::Type::Unknown ) +- { +- fsTypeIsAllowed = true; +- } +- else +- { +- QList< FileSystem::Type > allowedFsTypes = core->dirFSRestrictLayout().allowedFSTypes( partMountPoint, mountPointList, true ); +- for ( const auto& allowedFsType : allowedFsTypes ) +- { +- if ( fsType == allowedFsType ) +- { +- fsTypeIsAllowed = true; +- break; +- } +- } +- } +- +- if ( !fsTypeIsAllowed ) +- { +- QString conflictedPath = core->dirFSRestrictLayout().diagnoseFSConflict( partMountPoint, fsType, mountPointList ); +- QList< FileSystem::Type > nonConflictingFilesystemTypes = core->dirFSRestrictLayout().allowedFSTypes( conflictedPath, mountPointList, true ); +- QStringList nonConflictingFilesystems; +- for ( const auto& fsType : nonConflictingFilesystemTypes ) +- { +- nonConflictingFilesystems.append( Calamares::Partition::prettyNameForFileSystemType( fsType ) ); +- } +- result = PartitionViewStep::FSConflictEntry( partMountPoint, partFs, conflictedPath, nonConflictingFilesystems ); +- } +- +- return result; +-} +- +-static QList< PartitionViewStep::FSConflictEntry > +-checkForFilesystemConflicts( PartitionCoreModule* core ) +-{ +- QList< PartitionViewStep::FSConflictEntry > result; +- +- DeviceModel* dm = core->deviceModel(); +- QStringList mountPointList; +- +- // Walk the device and partition tree, extracting mountpoints from it +- for ( int i = 0; i < dm->rowCount(); i++ ) +- { +- Device* dev = dm->deviceForIndex( dm->index( i ) ); +- PartitionModel* pm = core->partitionModelForDevice( dev ); +- +- QModelIndex extPartMountPointIdx = QModelIndex(); +- bool extPartFound = false; +- for ( int j = 0; j < pm->rowCount(); j++ ) +- { +- QModelIndex partFsIdx = pm->index( j, PartitionModel::FileSystemColumn ); +- QModelIndex partMountPointIdx = pm->index( j, PartitionModel::MountPointColumn ); +- +- if ( pm->data( partFsIdx ).toString().toLower() == "extended" ) +- { +- extPartFound = true; +- extPartMountPointIdx = partMountPointIdx; +- break; +- } +- +- QString mountPoint = pm->data( partMountPointIdx ).toString(); +- if ( !mountPoint.isEmpty() ) +- { +- mountPointList.append( mountPoint ); +- } +- } +- if ( extPartFound ) +- { +- for ( int j = 0; j < pm->rowCount( extPartMountPointIdx ); j++ ) +- { +- QModelIndex partMountPointIdx = pm->index( j, PartitionModel::MountPointColumn, extPartMountPointIdx ); +- QString mountPoint = pm->data( partMountPointIdx ).toString(); +- if ( !mountPoint.isEmpty() ) +- { +- mountPointList.append( mountPoint ); +- } +- } +- } +- } +- +- // Walk the device and partition tree again, validating it this time +- for ( int i = 0; i < dm->rowCount(); i++ ) +- { +- Device* dev = dm->deviceForIndex( dm->index( i ) ); +- PartitionModel* pm = core->partitionModelForDevice( dev ); +- +- QModelIndex extPartFsIdx = QModelIndex(); +- QModelIndex extPartMountPointIdx = QModelIndex(); +- bool extPartFound = false; +- +- for ( int j = 0; j < pm->rowCount(); j++ ) +- { +- QModelIndex partFsIdx = pm->index( j, PartitionModel::FileSystemColumn ); +- QModelIndex partMountPointIdx = pm->index( j, PartitionModel::MountPointColumn ); +- +- if ( pm->data( partFsIdx ).toString().toLower() == "extended" ) +- { +- extPartFound = true; +- extPartFsIdx = partFsIdx; +- extPartMountPointIdx = partMountPointIdx; +- break; +- } +- +- PartitionViewStep::FSConflictEntry conflictEntry = calcFSConflictEntry( core, pm, partFsIdx, partMountPointIdx, mountPointList ); +- if ( !conflictEntry.conflictedPath.isEmpty() ) +- { +- result.append( conflictEntry ); +- } +- } +- if ( extPartFound ) +- { +- for ( int j = 0; j < pm->rowCount( extPartFsIdx ); j++ ) +- { +- QModelIndex partFsIdx = pm->index( j, PartitionModel::FileSystemColumn, extPartFsIdx ); +- QModelIndex partMountPointIdx = pm->index( j, PartitionModel::MountPointColumn, extPartMountPointIdx ); +- PartitionViewStep::FSConflictEntry conflictEntry = calcFSConflictEntry( core, pm, partFsIdx, partMountPointIdx, mountPointList ); +- if ( !conflictEntry.conflictedPath.isEmpty() ) +- { +- result.append( conflictEntry ); +- } +- } +- } +- } +- +- return result; +-} +- + void + PartitionViewStep::onLeave() + { +@@ -689,10 +526,6 @@ PartitionViewStep::onLeave() + } + + const auto* branding = Calamares::Branding::instance(); +- +- const QString startList = QStringLiteral( "

      " ); +- const QString endList = QStringLiteral( "


    " ); +- + if ( m_widget->currentWidget() == m_manualPartitionPage ) + { + if ( PartUtils::isEfiSystem() ) +@@ -748,6 +581,12 @@ PartitionViewStep::onLeave() + const QString possibleFail = tr( "You can continue with this EFI system " + "partition configuration but your system may fail to start." ); + ++ const QString startList = QStringLiteral( "

      " ); ++ const QString endList = QStringLiteral( "


    " ); ++ ++ auto listItem = []( QString s ) -> QString ++ { return s.prepend( QStringLiteral( "
  • " ) ).append( QStringLiteral( "
  • " ) ); }; ++ + if ( !esp ) + { + cDebug() << o << "No ESP mounted"; +@@ -839,52 +678,6 @@ PartitionViewStep::onLeave() + Calamares::fixButtonLabels( &mb ); + mb.exec(); + } +- +- QList< FSConflictEntry > conflictMap = checkForFilesystemConflicts( m_core ); +- if ( !conflictMap.isEmpty() ) +- { +- QString message = tr( "Filesystem conflicts found" ); +- const QString descHeader = tr( "The chosen manual partitioning layout does not " +- "comply with the filesystem restrictions set by the " +- "distro. The following issues were found:"); +- +- QStringList issueList; +- for ( const auto& entry : conflictMap ) +- { +- QString buildString; +- if ( entry.conflictedPath == "any" ) +- { +- buildString = tr( "The %1 directory uses filesystem %2, but this distro only allows the following filesystems: %3." ) +- .arg( entry.conflictingPath ) +- .arg( entry.conflictingFilesystem ) +- .arg( entry.allowableFilesystems.join( ", " ) ); +- issueList.append( buildString ); +- } +- else +- { +- buildString = tr( "The %1 directory uses filesystem %2, but the %3 directory must use one of the following filesystems: %4." ) +- .arg( entry.conflictingPath ) +- .arg( entry.conflictingFilesystem ) +- .arg( entry.conflictedPath ) +- .arg( entry.allowableFilesystems.join( ", " ) ); +- issueList.append( buildString ); +- } +- } +- +- const QString descFooter = tr( "You can continue without setting up filesystems " +- "properly, but your system may fail to start." ); +- +- QString description = descHeader + startList; +- for ( const auto& item : issueList ) +- { +- description += listItem( item ); +- } +- description += endList + descFooter; +- +- QMessageBox mb( QMessageBox::Warning, message, description, QMessageBox::Ok, m_manualPartitionPage ); +- Calamares::fixButtonLabels( &mb ); +- mb.exec(); +- } + } + } + +@@ -941,7 +734,6 @@ PartitionViewStep::setConfigurationMap( const QVariantMap& configurationMap ) + m_future->setFuture( future ); + + m_core->partitionLayout().init( m_config->defaultFsType(), configurationMap.value( "partitionLayout" ).toList() ); +- m_core->dirFSRestrictLayout().init( configurationMap.value( "directoryFilesystemRestrictions" ).toList() ); + } + + Calamares::JobList +diff --git a/src/modules/partition/PartitionViewStep.h b/src/modules/partition/PartitionViewStep.h +index 8224154dd..ecba73f45 100644 +--- a/src/modules/partition/PartitionViewStep.h ++++ b/src/modules/partition/PartitionViewStep.h +@@ -39,21 +39,6 @@ class PLUGINDLLEXPORT PartitionViewStep : public Calamares::ViewStep + Q_OBJECT + + public: +- struct FSConflictEntry +- { +- QString conflictingPath; +- QString conflictingFilesystem; +- QString conflictedPath; +- QStringList allowableFilesystems; +- +- FSConflictEntry(); +- FSConflictEntry( const QString& conflictingPathArg, +- const QString& conflictingFilesystemArg, +- const QString& conflictedPathArg, +- QStringList allowableFilesystemsArg ); +- FSConflictEntry( const FSConflictEntry& e ) = default; +- }; +- + explicit PartitionViewStep( QObject* parent = nullptr ); + ~PartitionViewStep() override; + +diff --git a/src/modules/partition/core/DeviceList.cpp b/src/modules/partition/core/DeviceList.cpp +index 16723c750..188594963 100644 +--- a/src/modules/partition/core/DeviceList.cpp ++++ b/src/modules/partition/core/DeviceList.cpp +@@ -43,6 +43,17 @@ hasRootPartition( Device* device ) + return false; + } + ++/** ++ * Does the given @p device path should point to a device ++ */ ++static bool ++isValidDevice(const QString& devicePath) ++{ ++ auto result = Calamares::System::runCommand({ "blkid", devicePath }, std::chrono::seconds(30)); ++ ++ return result.getExitCode() == 0 && !result.getOutput().isEmpty(); ++} ++ + /** @brief Check if @p path holds an iso9660 filesystem + * + * The @p path should point to a device; blkid is used to check the FS type. +@@ -187,7 +198,17 @@ getDevices( DeviceType which ) + } + else + { +- ++it; ++ const QString devicePath = (*it)->deviceNode(); ++ ++ if (!isValidDevice(devicePath)) ++ { ++ cDebug() << Logger::SubEntry << "Skipping device due to blkid failure: " << devicePath; ++ it = removeInAllModes(devices, it); ++ } ++ else ++ { ++ ++it; ++ } + } + } + cDebug() << Logger::SubEntry << "there are" << devices.count() << "devices left."; +diff --git a/src/modules/partition/core/KPMHelpers.h b/src/modules/partition/core/KPMHelpers.h +index b8e6fca18..3ceafb003 100644 +--- a/src/modules/partition/core/KPMHelpers.h ++++ b/src/modules/partition/core/KPMHelpers.h +@@ -149,19 +149,6 @@ execute( Operation&& operation, const QString& failureMessage ) + return execute( operation, failureMessage ); + } + +-/** @brief Is this an MSDOS partition table? +- * +- * Deals with KPMcore deprecations in the TableType enum. +- */ +-inline bool isMSDOSPartition(PartitionTable::TableType t) +-{ +-#if WITH_KPMcore > 0x240801 +- return t == PartitionTable::TableType::msdos; +-#else +- return t == PartitionTable::TableType::msdos || t == PartitionTable::TableType::msdos_sectorbased; +-#endif +-} +- + } // namespace KPMHelpers + + #endif /* KPMHELPERS_H */ +diff --git a/src/modules/partition/core/PartUtils.cpp b/src/modules/partition/core/PartUtils.cpp +index 8da0aee81..9818ea71f 100644 +--- a/src/modules/partition/core/PartUtils.cpp ++++ b/src/modules/partition/core/PartUtils.cpp +@@ -245,6 +245,8 @@ lookForFstabEntries( const QString& partitionPath ) + + cDebug() << "Checking device" << partitionPath << "for fstab (fs=" << r.getOutput() << ')'; + ++ FstabEntryList fstabEntries; ++ + Calamares::Partition::TemporaryMount mount( partitionPath, QString(), mountOptions.join( ',' ) ); + if ( mount.isValid() ) + { +diff --git a/src/modules/partition/core/PartitionActions.cpp b/src/modules/partition/core/PartitionActions.cpp +index ddfabaf85..b5fb0cafb 100644 +--- a/src/modules/partition/core/PartitionActions.cpp ++++ b/src/modules/partition/core/PartitionActions.cpp +@@ -107,8 +107,6 @@ doAutopartition( PartitionCoreModule* core, Device* dev, Choices::AutoPartitionO + { + partType = isEfi ? PartitionTable::gpt : PartitionTable::msdos; + } +- // last usable sector possibly allowing for secondary GPT using 66 sectors (256 entries) +- const qint64 lastUsableSector = dev->totalLogical() - ( partType == PartitionTable::gpt ? 67 : 1 ); + + // Looking up the defaultFsType (which should name a filesystem type) + // will log an error and set the type to Unknown if there's something wrong. +@@ -154,7 +152,7 @@ doAutopartition( PartitionCoreModule* core, Device* dev, Choices::AutoPartitionO + const quint64 sectorSize = quint64( dev->logicalSize() ); + if ( mayCreateSwap ) + { +- quint64 availableSpaceB = quint64( lastUsableSector - firstFreeSector + 1 ) * sectorSize; ++ quint64 availableSpaceB = quint64( dev->totalLogical() - firstFreeSector ) * sectorSize; + suggestedSwapSizeB = swapSuggestion( availableSpaceB, o.swap ); + // Space required by this installation is what the distro claims is needed + // (via global configuration) plus the swap size plus a fudge factor of +@@ -165,7 +163,7 @@ doAutopartition( PartitionCoreModule* core, Device* dev, Choices::AutoPartitionO + shouldCreateSwap = availableSpaceB > requiredSpaceB; + } + +- qint64 lastSectorForRoot = lastUsableSector; ++ qint64 lastSectorForRoot = dev->totalLogical() - 1; //last sector of the device + if ( shouldCreateSwap ) + { + lastSectorForRoot -= suggestedSwapSizeB / sectorSize + 1; +@@ -184,7 +182,7 @@ doAutopartition( PartitionCoreModule* core, Device* dev, Choices::AutoPartitionO + FileSystem::LinuxSwap, + QStringLiteral( "swap" ), + lastSectorForRoot + 1, +- lastUsableSector, ++ dev->totalLogical() - 1, + KPM_PARTITION_FLAG( None ) ); + } + else +@@ -195,7 +193,7 @@ doAutopartition( PartitionCoreModule* core, Device* dev, Choices::AutoPartitionO + FileSystem::LinuxSwap, + QStringLiteral( "swap" ), + lastSectorForRoot + 1, +- lastUsableSector, ++ dev->totalLogical() - 1, + o.luksFsType, + o.luksPassphrase, + KPM_PARTITION_FLAG( None ) ); +diff --git a/src/modules/partition/core/PartitionActions.h b/src/modules/partition/core/PartitionActions.h +index 24969bb43..fdf56e56e 100644 +--- a/src/modules/partition/core/PartitionActions.h ++++ b/src/modules/partition/core/PartitionActions.h +@@ -37,11 +37,11 @@ struct ReplacePartitionOptions + ReplacePartitionOptions( const QString& pt, + const QString& fs, + Config::LuksGeneration luksFs, +- const QString& passphrase ) ++ const QString& luksPassphrase ) + : defaultPartitionTableType( pt ) + , defaultFsType( fs ) + , luksFsType( luksFs ) +- , luksPassphrase( passphrase ) ++ , luksPassphrase( luksPassphrase ) + { + } + }; +@@ -55,11 +55,11 @@ struct AutoPartitionOptions : ReplacePartitionOptions + AutoPartitionOptions( const QString& pt, + const QString& fs, + Config::LuksGeneration luksFs, +- const QString& passphrase, ++ const QString& luksPassphrase, + const QString& efi, + qint64 requiredBytes, + Config::SwapChoice s ) +- : ReplacePartitionOptions( pt, fs, luksFs, passphrase ) ++ : ReplacePartitionOptions( pt, fs, luksFs, luksPassphrase ) + , efiPartitionMountPoint( efi ) + , requiredSpaceB( requiredBytes > 0 ? quint64( requiredBytes ) : 0U ) + , swap( s ) +diff --git a/src/modules/partition/core/PartitionCoreModule.cpp b/src/modules/partition/core/PartitionCoreModule.cpp +index c2fd61db9..51e99f2d2 100644 +--- a/src/modules/partition/core/PartitionCoreModule.cpp ++++ b/src/modules/partition/core/PartitionCoreModule.cpp +@@ -619,7 +619,7 @@ findEssentialLVs( const QList< PartitionCoreModule::DeviceInfo* >& infos ) + continue; + } + +- for ( const auto& j : std::as_const( info->jobs() ) ) ++ for ( const auto& j : qAsConst( info->jobs() ) ) + { + FormatPartitionJob* format = dynamic_cast< FormatPartitionJob* >( j.data() ); + if ( format ) +diff --git a/src/modules/partition/core/PartitionCoreModule.h b/src/modules/partition/core/PartitionCoreModule.h +index 08b92abab..40a1916a9 100644 +--- a/src/modules/partition/core/PartitionCoreModule.h ++++ b/src/modules/partition/core/PartitionCoreModule.h +@@ -16,7 +16,6 @@ + #include "core/KPMHelpers.h" + #include "core/PartitionLayout.h" + #include "core/PartitionModel.h" +-#include "core/DirFSRestrictLayout.h" + #include "jobs/PartitionJob.h" + + #include "Job.h" +@@ -168,9 +167,6 @@ public: + */ + PartitionLayout& partitionLayout() { return m_partLayout; } + +- /// @brief Get the directory filesystem restriction layout. +- DirFSRestrictLayout& dirFSRestrictLayout() { return m_dirFSRestrictLayout; } +- + void layoutApply( Device* dev, + qint64 firstSector, + qint64 lastSector, +@@ -274,7 +270,6 @@ private: + bool m_isDirty = false; + QString m_bootLoaderInstallPath; + PartitionLayout m_partLayout; +- DirFSRestrictLayout m_dirFSRestrictLayout; + + OsproberEntryList m_osproberLines; + +diff --git a/src/modules/partition/core/PartitionLayout.cpp b/src/modules/partition/core/PartitionLayout.cpp +index ff049784a..b476a3181 100644 +--- a/src/modules/partition/core/PartitionLayout.cpp ++++ b/src/modules/partition/core/PartitionLayout.cpp +@@ -221,7 +221,7 @@ PartitionLayout::createPartitions( Device* dev, + + // Let's check if we have enough space for each partitions, using the size + // propery or the min-size property if unit is in percentage. +- for ( const auto& entry : std::as_const( m_partLayout ) ) ++ for ( const auto& entry : qAsConst( m_partLayout ) ) + { + if ( !entry.partSize.isValid() ) + { +@@ -250,7 +250,7 @@ PartitionLayout::createPartitions( Device* dev, + if ( availableSectors < 0 ) + { + availableSectors = totalSectors; +- for ( const auto& entry : std::as_const( m_partLayout ) ) ++ for ( const auto& entry : qAsConst( m_partLayout ) ) + { + qint64 sectors = partSectorsMap.value( &entry ); + if ( entry.partMinSize.isValid() ) +@@ -263,7 +263,7 @@ PartitionLayout::createPartitions( Device* dev, + } + + // Assign sectors for percentage-defined partitions. +- for ( const auto& entry : std::as_const( m_partLayout ) ) ++ for ( const auto& entry : qAsConst( m_partLayout ) ) + { + if ( entry.partSize.unit() == Calamares::Partition::SizeUnit::Percent ) + { +@@ -286,7 +286,7 @@ PartitionLayout::createPartitions( Device* dev, + // Create the partitions. + currentSector = firstSector; + availableSectors = totalSectors; +- for ( const auto& entry : std::as_const( m_partLayout ) ) ++ for ( const auto& entry : qAsConst( m_partLayout ) ) + { + // Adjust partition size based on available space. + qint64 sectors = partSectorsMap.value( &entry ); +diff --git a/src/modules/partition/gui/BootInfoWidget.cpp b/src/modules/partition/gui/BootInfoWidget.cpp +index b4339be9a..eb70b4aaf 100644 +--- a/src/modules/partition/gui/BootInfoWidget.cpp ++++ b/src/modules/partition/gui/BootInfoWidget.cpp +@@ -42,7 +42,8 @@ BootInfoWidget::BootInfoWidget( QWidget* parent ) + QFontMetrics fm = QFontMetrics( QFont() ); + m_bootLabel->setMinimumWidth( fm.boundingRect( "BIOS" ).width() + Calamares::defaultFontHeight() / 2 ); + m_bootLabel->setAlignment( Qt::AlignCenter ); +- ++ m_bootLabel->setStyleSheet("background-color:#FFFFFF;"); ++ m_bootIcon->setStyleSheet("background-color:#FFFFFF;"); + QPalette palette; + palette.setBrush( WindowText, QColor( "#4D4D4D" ) ); //dark grey + +@@ -62,7 +63,12 @@ BootInfoWidget::retranslateUi() + "Modern systems usually use EFI, but " + "may also show up as BIOS if started in compatibility " + "mode." ) ); +- ++ m_bootIcon->setStyleSheet( ++ "QLabel {" ++ "background-color: #ffffff;" ++ "color: black;" ++ "}" ++ ); + QString bootToolTip; + if ( PartUtils::isEfiSystem() ) + { +diff --git a/src/modules/partition/gui/ChoicePage.cpp b/src/modules/partition/gui/ChoicePage.cpp +index a7665bbbc..6185d3ff5 100644 +--- a/src/modules/partition/gui/ChoicePage.cpp ++++ b/src/modules/partition/gui/ChoicePage.cpp +@@ -34,7 +34,6 @@ + #include "Branding.h" + #include "GlobalStorage.h" + #include "JobQueue.h" +-#include "compat/CheckBox.h" + #include "partition/PartitionIterator.h" + #include "partition/PartitionQuery.h" + #include "utils/Gui.h" +@@ -141,7 +140,6 @@ ChoicePage::retranslate() + + updateSwapChoicesTr(); + updateChoiceButtonsTr(); +- updateActionDescriptionsTr(); + } + + /** @brief Sets the @p model for the given @p box and adjusts UI sizes to match. +@@ -188,7 +186,7 @@ ChoicePage::init( PartitionCoreModule* core ) + + connect( m_drivesCombo, qOverload< int >( &QComboBox::currentIndexChanged ), this, &ChoicePage::applyDeviceChoice ); + connect( m_encryptWidget, &EncryptWidget::stateChanged, this, &ChoicePage::onEncryptWidgetStateChanged ); +- connect( m_reuseHomeCheckBox, Calamares::checkBoxStateChangedSignal, this, &ChoicePage::onHomeCheckBoxStateChanged ); ++ connect( m_reuseHomeCheckBox, &QCheckBox::stateChanged, this, &ChoicePage::onHomeCheckBoxStateChanged ); + + ChoicePage::applyDeviceChoice(); + } +@@ -362,8 +360,10 @@ ChoicePage::setupChoices() + Device* + ChoicePage::selectedDevice() + { +- Device* const currentDevice ++ Device* currentDevice = nullptr; ++ currentDevice + = m_core->deviceModel()->deviceForIndex( m_core->deviceModel()->index( m_drivesCombo->currentIndex() ) ); ++ + return currentDevice; + } + +@@ -467,6 +467,8 @@ ChoicePage::onActionChanged() + { + m_encryptWidget->setFilesystem( FileSystem::typeForName( m_replaceFsTypesChoiceComboBox->currentText() ) ); + } ++ ++ m_encryptWidget->setEncryptionCheckbox( m_config->preCheckEncryption() ); + } + + Device* currd = selectedDevice(); +@@ -586,21 +588,8 @@ ChoicePage::applyActionChoice( InstallChoice choice ) + &ChoicePage::doAlongsideSetupSplitter, + Qt::UniqueConnection ); + break; +- case InstallChoice::Manual: +- if ( m_core->isDirty() ) +- { +- ScanningDialog::run( +- QtConcurrent::run( +- [ = ] +- { +- QMutexLocker locker( &m_coreMutex ); +- m_core->revertDevice( selectedDevice() ); +- } ), +- [] {}, +- this ); +- } +- break; + case InstallChoice::NoChoice: ++ case InstallChoice::Manual: + break; + } + updateNextEnabled(); +@@ -1046,11 +1035,6 @@ ChoicePage::updateActionChoicePreview( InstallChoice choice ) + if ( m_enableEncryptionWidget ) + { + m_encryptWidget->show(); +- if ( m_config->preCheckEncryption() && !m_preCheckActivated ) +- { +- m_encryptWidget->setEncryptionCheckbox( true ); +- m_preCheckActivated = true; +- } + } + m_previewBeforeLabel->setText( tr( "Current:", "@label" ) ); + m_selectLabel->setText( tr( "Select a partition to shrink, " +@@ -1103,15 +1087,7 @@ ChoicePage::updateActionChoicePreview( InstallChoice choice ) + case InstallChoice::Erase: + case InstallChoice::Replace: + { +- if ( shouldShowEncryptWidget( choice ) ) +- { +- m_encryptWidget->show(); +- if ( m_config->preCheckEncryption() && !m_preCheckActivated ) +- { +- m_encryptWidget->setEncryptionCheckbox( true ); +- m_preCheckActivated = true; +- } +- } ++ m_encryptWidget->setVisible( shouldShowEncryptWidget( choice ) ); + m_previewBeforeLabel->setText( tr( "Current:", "@label" ) ); + m_afterPartitionBarsView = new PartitionBarsView( m_previewAfterFrame ); + m_afterPartitionBarsView->setNestedPartitionsMode( mode ); +@@ -1359,10 +1335,27 @@ ChoicePage::setupActions() + } + } + +- m_osproberEntriesCount = osproberEntriesForCurrentDevice.count(); +- if ( m_osproberEntriesCount == 0 ) ++ if ( osproberEntriesForCurrentDevice.count() == 0 ) + { +- m_osproberOneEntryName.clear(); ++ CALAMARES_RETRANSLATE( ++ cDebug() << "Setting texts for 0 osprober entries"; ++ m_messageLabel->setText( tr( "This storage device does not seem to have an operating system on it. " ++ "What would you like to do?
    " ++ "You will be able to review and confirm your choices " ++ "before any change is made to the storage device." ) ); ++ ++ m_eraseButton->setText( tr( "Automatic partitioning
    " ++ "This will delete all data " ++ "currently present on the selected storage device." ) ); ++ ++ m_alongsideButton->setText( tr( "Install alongside
    " ++ "The installer will shrink a partition to make room for %1." ) ++ .arg( Calamares::Branding::instance()->shortVersionedName() ) ); ++ ++ m_replaceButton->setText( tr( "Replace a partition
    " ++ "Replaces a partition with %1." ) ++ .arg( Calamares::Branding::instance()->shortVersionedName() ) ); ); ++ + m_replaceButton->hide(); + m_alongsideButton->hide(); + m_grp->setExclusive( false ); +@@ -1370,16 +1363,78 @@ ChoicePage::setupActions() + m_alongsideButton->setChecked( false ); + m_grp->setExclusive( true ); + } +- else if ( m_osproberEntriesCount == 1 ) ++ else if ( osproberEntriesForCurrentDevice.count() == 1 ) + { +- m_osproberOneEntryName = osproberEntriesForCurrentDevice.first().prettyName; ++ QString osName = osproberEntriesForCurrentDevice.first().prettyName; ++ ++ if ( !osName.isEmpty() ) ++ { ++ CALAMARES_RETRANSLATE( ++ cDebug() << "Setting texts for 1 non-empty osprober entry"; ++ m_messageLabel->setText( tr( "This storage device has %1 on it. " ++ "What would you like to do?
    " ++ "You will be able to review and confirm your choices " ++ "before any change is made to the storage device." ) ++ .arg( osName ) ); ++ ++ m_alongsideButton->setText( tr( "Install alongside
    " ++ "The installer will shrink a partition to make room for %1." ) ++ .arg( Calamares::Branding::instance()->shortVersionedName() ) ); ++ ++ m_eraseButton->setText( tr( "Automatic partitioning
    " ++ "This will delete all data " ++ "currently present on the selected storage device." ) ); ++ ++ m_replaceButton->setText( tr( "Replace a partition
    " ++ "Replaces a partition with %1." ) ++ .arg( Calamares::Branding::instance()->shortVersionedName() ) ); ); ++ } ++ else ++ { ++ CALAMARES_RETRANSLATE( ++ cDebug() << "Setting texts for 1 empty osprober entry"; ++ m_messageLabel->setText( tr( "This storage device already has an operating system on it. " ++ "What would you like to do?
    " ++ "You will be able to review and confirm your choices " ++ "before any change is made to the storage device." ) ); ++ ++ m_alongsideButton->setText( tr( "Install alongside
    " ++ "The installer will shrink a partition to make room for %1." ) ++ .arg( Calamares::Branding::instance()->shortVersionedName() ) ); ++ ++ m_eraseButton->setText( tr( "Automatic partitioning
    " ++ "This will delete all data " ++ "currently present on the selected storage device." ) ); ++ ++ m_replaceButton->setText( tr( "Replace a partition
    " ++ "Replaces a partition with %1." ) ++ .arg( Calamares::Branding::instance()->shortVersionedName() ) ); ); ++ } + } + else + { + // osproberEntriesForCurrentDevice has at least 2 items. +- m_osproberOneEntryName.clear(); ++ ++ CALAMARES_RETRANSLATE( ++ cDebug() << "Setting texts for >= 2 osprober entries"; ++ ++ m_messageLabel->setText( tr( "This storage device has multiple operating systems on it. " ++ "What would you like to do?
    " ++ "You will be able to review and confirm your choices " ++ "before any change is made to the storage device." ) ); ++ ++ m_alongsideButton->setText( tr( "Install alongside
    " ++ "The installer will shrink a partition to make room for %1." ) ++ .arg( Calamares::Branding::instance()->shortVersionedName() ) ); ++ ++ m_eraseButton->setText( tr( "Automatic partitioning
    " ++ "This will delete all data " ++ "currently present on the selected storage device." ) ); ++ ++ m_replaceButton->setText( tr( "Replace a partition
    " ++ "Replaces a partition with %1." ) ++ .arg( Calamares::Branding::instance()->shortVersionedName() ) ); ); + } +- updateActionDescriptionsTr(); + + #ifdef DEBUG_PARTITION_UNSAFE + #ifdef DEBUG_PARTITION_BAIL_OUT +@@ -1538,7 +1593,7 @@ ChoicePage::calculateNextEnabled() const + { + case EncryptWidget::Encryption::Unconfirmed: + cDebug() << "No passphrase provided or passphrase mismatch."; +- return false; ++ //return false; + case EncryptWidget::Encryption::Disabled: + case EncryptWidget::Encryption::Confirmed: + // Checkbox not checked, **or** passphrases match +@@ -1717,97 +1772,3 @@ ChoicePage::shouldShowEncryptWidget( Config::InstallChoice choice ) const + = choice == InstallChoice::Erase || choice == InstallChoice::Alongside || choice == InstallChoice::Replace; + return suitableChoice && m_enableEncryptionWidget && suitableFS; + } +- +-void +-ChoicePage::updateActionDescriptionsTr() +-{ +- if ( m_osproberEntriesCount == 0 ) +- { +- cDebug() << "Setting texts for 0 osprober entries"; +- m_messageLabel->setText( tr( "This storage device does not seem to have an operating system on it. " +- "What would you like to do?
    " +- "You will be able to review and confirm your choices " +- "before any change is made to the storage device." ) ); +- +- m_eraseButton->setText( tr( "Erase disk
    " +- "This will delete all data " +- "currently present on the selected storage device." ) ); +- +- m_alongsideButton->setText( tr( "Install alongside
    " +- "The installer will shrink a partition to make room for %1." ) +- .arg( Calamares::Branding::instance()->shortVersionedName() ) ); +- +- m_replaceButton->setText( tr( "Replace a partition
    " +- "Replaces a partition with %1." ) +- .arg( Calamares::Branding::instance()->shortVersionedName() ) ); +- } +- if ( m_osproberEntriesCount == 1 ) +- { +- if ( !m_osproberOneEntryName.isEmpty() ) +- { +- cDebug() << "Setting texts for 1 non-empty osprober entry"; +- m_messageLabel->setText( tr( "This storage device has %1 on it. " +- "What would you like to do?
    " +- "You will be able to review and confirm your choices " +- "before any change is made to the storage device." ) +- .arg( m_osproberOneEntryName ) ); +- +- m_alongsideButton->setText( tr( "Install alongside
    " +- "The installer will shrink a partition to make room for %1." ) +- .arg( Calamares::Branding::instance()->shortVersionedName() ) ); +- +- m_eraseButton->setText( tr( "Erase disk
    " +- "This will delete all data " +- "currently present on the selected storage device." ) ); +- +- m_replaceButton->setText( tr( "Replace a partition
    " +- "Replaces a partition with %1." ) +- .arg( Calamares::Branding::instance()->shortVersionedName() ) ); +- } +- else +- { +- cDebug() << "Setting texts for 1 empty osprober entry"; +- m_messageLabel->setText( tr( "This storage device already has an operating system on it. " +- "What would you like to do?
    " +- "You will be able to review and confirm your choices " +- "before any change is made to the storage device." ) ); +- +- m_alongsideButton->setText( tr( "Install alongside
    " +- "The installer will shrink a partition to make room for %1." ) +- .arg( Calamares::Branding::instance()->shortVersionedName() ) ); +- +- m_eraseButton->setText( tr( "Erase disk
    " +- "This will delete all data " +- "currently present on the selected storage device." ) ); +- +- m_replaceButton->setText( tr( "Replace a partition
    " +- "Replaces a partition with %1." ) +- .arg( Calamares::Branding::instance()->shortVersionedName() ) ); +- } +- } +- if ( m_osproberEntriesCount >= 2 ) +- { +- cDebug() << "Setting texts for >= 2 osprober entries"; +- +- m_messageLabel->setText( tr( "This storage device has multiple operating systems on it. " +- "What would you like to do?
    " +- "You will be able to review and confirm your choices " +- "before any change is made to the storage device." ) ); +- +- m_alongsideButton->setText( tr( "Install alongside
    " +- "The installer will shrink a partition to make room for %1." ) +- .arg( Calamares::Branding::instance()->shortVersionedName() ) ); +- +- m_eraseButton->setText( tr( "Erase disk
    " +- "This will delete all data " +- "currently present on the selected storage device." ) ); +- +- m_replaceButton->setText( tr( "Replace a partition
    " +- "Replaces a partition with %1." ) +- .arg( Calamares::Branding::instance()->shortVersionedName() ) ); +- } +- if ( m_osproberEntriesCount < 0 ) +- { +- cWarning() << "Invalid osprober count, labels and buttons not updated."; +- } +-} +diff --git a/src/modules/partition/gui/ChoicePage.h b/src/modules/partition/gui/ChoicePage.h +index 6a777e20d..7deb4dec6 100644 +--- a/src/modules/partition/gui/ChoicePage.h ++++ b/src/modules/partition/gui/ChoicePage.h +@@ -136,7 +136,6 @@ private: + // Translations support + void updateSwapChoicesTr(); + void updateChoiceButtonsTr(); +- void updateActionDescriptionsTr(); + + Config* m_config; + bool m_nextEnabled; +@@ -169,11 +168,8 @@ private: + QPointer< QComboBox > m_efiComboBox; + + int m_lastSelectedDeviceIndex = -1; +- int m_osproberEntriesCount = -1; +- QString m_osproberOneEntryName; + + bool m_enableEncryptionWidget = false; +- bool m_preCheckActivated = false; + + QMutex m_coreMutex; + }; +diff --git a/src/modules/partition/gui/CreatePartitionDialog.cpp b/src/modules/partition/gui/CreatePartitionDialog.cpp +index 213f5c793..d18676138 100644 +--- a/src/modules/partition/gui/CreatePartitionDialog.cpp ++++ b/src/modules/partition/gui/CreatePartitionDialog.cpp +@@ -18,7 +18,6 @@ + #include "core/KPMHelpers.h" + #include "core/PartUtils.h" + #include "core/PartitionInfo.h" +-#include "core/PartitionCoreModule.h" + #include "gui/PartitionDialogHelpers.h" + #include "gui/PartitionSizeController.h" + +@@ -47,14 +46,18 @@ + using Calamares::Partition::untranslatedFS; + using Calamares::Partition::userVisibleFS; + +-CreatePartitionDialog::CreatePartitionDialog( PartitionCoreModule* core, +- Device* device, ++static QSet< FileSystem::Type > s_unmountableFS( { FileSystem::Unformatted, ++ FileSystem::LinuxSwap, ++ FileSystem::Extended, ++ FileSystem::Unknown, ++ FileSystem::Lvm2_PV } ); ++ ++CreatePartitionDialog::CreatePartitionDialog( Device* device, + PartitionNode* parentPartition, + const QStringList& usedMountPoints, + QWidget* parentWidget ) + : QDialog( parentWidget ) + , m_ui( new Ui_CreatePartitionDialog ) +- , m_core( core ) + , m_partitionSizeController( new PartitionSizeController( this ) ) + , m_device( device ) + , m_parent( parentPartition ) +@@ -79,7 +82,8 @@ CreatePartitionDialog::CreatePartitionDialog( PartitionCoreModule* core, + m_ui->lvNameLineEdit->setValidator( validator ); + } + +- if ( KPMHelpers::isMSDOSPartition( device->partitionTable()->type() ) ) ++ if ( device->partitionTable()->type() == PartitionTable::msdos ++ || device->partitionTable()->type() == PartitionTable::msdos_sectorbased ) + { + initMbrPartitionTypeUi(); + } +@@ -125,23 +129,17 @@ CreatePartitionDialog::CreatePartitionDialog( PartitionCoreModule* core, + this, + &CreatePartitionDialog::checkMountPointSelection ); + +- connect( m_ui->fsComboBox, +- &QComboBox::currentTextChanged, +- this, +- &CreatePartitionDialog::checkMountPointSelection ); +- + // Select a default + m_ui->fsComboBox->setCurrentIndex( defaultFsIndex ); + updateMountPointUi(); + checkMountPointSelection(); + } + +-CreatePartitionDialog::CreatePartitionDialog( PartitionCoreModule* core, +- Device* device, ++CreatePartitionDialog::CreatePartitionDialog( Device* device, + const FreeSpace& freeSpacePartition, + const QStringList& usedMountPoints, + QWidget* parentWidget ) +- : CreatePartitionDialog( core, device, freeSpacePartition.p->parent(), usedMountPoints, parentWidget ) ++ : CreatePartitionDialog( device, freeSpacePartition.p->parent(), usedMountPoints, parentWidget ) + { + standardMountPoints( *( m_ui->mountPointComboBox ), QString() ); + setFlagList( *( m_ui->m_listFlags ), +@@ -150,12 +148,11 @@ CreatePartitionDialog::CreatePartitionDialog( PartitionCoreModule* core, + initPartResizerWidget( freeSpacePartition.p ); + } + +-CreatePartitionDialog::CreatePartitionDialog( PartitionCoreModule* core, +- Device* device, ++CreatePartitionDialog::CreatePartitionDialog( Device* device, + const FreshPartition& existingNewPartition, + const QStringList& usedMountPoints, + QWidget* parentWidget ) +- : CreatePartitionDialog( core, device, existingNewPartition.p->parent(), usedMountPoints, parentWidget ) ++ : CreatePartitionDialog( device, existingNewPartition.p->parent(), usedMountPoints, parentWidget ) + { + standardMountPoints( *( m_ui->mountPointComboBox ), PartitionInfo::mountPoint( existingNewPartition.p ) ); + setFlagList( *( m_ui->m_listFlags ), +@@ -347,10 +344,8 @@ CreatePartitionDialog::updateMountPointUi() + void + CreatePartitionDialog::checkMountPointSelection() + { +- validateMountPoint( m_core, +- selectedMountPoint( m_ui->mountPointComboBox ), ++ validateMountPoint( selectedMountPoint( m_ui->mountPointComboBox ), + m_usedMountPoints, +- m_ui->fsComboBox->currentText(), + m_ui->mountPointExplanation, + m_ui->buttonBox->button( QDialogButtonBox::Ok ) ); + } +diff --git a/src/modules/partition/gui/CreatePartitionDialog.h b/src/modules/partition/gui/CreatePartitionDialog.h +index 75a0da096..38c65aaf6 100644 +--- a/src/modules/partition/gui/CreatePartitionDialog.h ++++ b/src/modules/partition/gui/CreatePartitionDialog.h +@@ -19,7 +19,7 @@ + #include + #include + +-class PartitionCoreModule; ++ + class Device; + class Partition; + class PartitionNode; +@@ -39,8 +39,7 @@ private: + * + * This does all the shared UI setup. + */ +- CreatePartitionDialog( PartitionCoreModule* core, +- Device* device, ++ CreatePartitionDialog( Device* device, + PartitionNode* parentPartition, + const QStringList& usedMountPoints, + QWidget* parentWidget ); +@@ -60,8 +59,7 @@ public: + * Creating from free space makes a wholly new partition with + * no flags set at all. + */ +- CreatePartitionDialog( PartitionCoreModule* core, +- Device* device, ++ CreatePartitionDialog( Device* device, + const FreeSpace& freeSpacePartition, + const QStringList& usedMountPoints, + QWidget* parentWidget = nullptr ); +@@ -70,8 +68,7 @@ public: + * A partition previously newly created (e.g. via this dialog + * and the constructor above) can be re-edited. + */ +- CreatePartitionDialog( PartitionCoreModule* core, +- Device* device, ++ CreatePartitionDialog( Device* device, + const FreshPartition& existingNewPartition, + const QStringList& usedMountPoints, + QWidget* parentWidget = nullptr ); +@@ -87,7 +84,6 @@ private Q_SLOTS: + + private: + QScopedPointer< Ui_CreatePartitionDialog > m_ui; +- PartitionCoreModule* m_core; + PartitionSizeController* m_partitionSizeController; + Device* m_device; + PartitionNode* m_parent; +diff --git a/src/modules/partition/gui/DeviceInfoWidget.cpp b/src/modules/partition/gui/DeviceInfoWidget.cpp +index 628560fa4..a22344df9 100644 +--- a/src/modules/partition/gui/DeviceInfoWidget.cpp ++++ b/src/modules/partition/gui/DeviceInfoWidget.cpp +@@ -52,7 +52,18 @@ DeviceInfoWidget::DeviceInfoWidget( QWidget* parent ) + m_ptLabel->setAutoFillBackground( true ); + m_ptIcon->setPalette( palette ); + m_ptLabel->setPalette( palette ); +- ++ m_ptLabel->setStyleSheet( ++ "QLabel {" ++ "background-color: #ffffff;" ++ "color: black;" ++ "}" ++ ); ++ m_ptIcon->setStyleSheet( ++ "QLabel {" ++ "background-color: #ffffff;" ++ "color: black;" ++ "}" ++ ); + CALAMARES_RETRANSLATE_SLOT( &DeviceInfoWidget::retranslateUi ); + } + +@@ -73,15 +84,7 @@ DeviceInfoWidget::retranslateUi() + switch ( m_tableType ) + { + case PartitionTable::msdos: +-#if WITH_KPMcore > 0x240801 +- // Pick your warning: either deprecation warning, or unchecked enum-switch +-QT_WARNING_PUSH +-QT_WARNING_DISABLE_DEPRECATED +-#endif + case PartitionTable::msdos_sectorbased: +-#if WITH_KPMcore > 0x240801 +-QT_WARNING_POP +-#endif + typeString = "MBR"; + toolTipString += tr( "

    This partition table type is only advisable on older " + "systems which start from a BIOS boot " +diff --git a/src/modules/partition/gui/EditExistingPartitionDialog.cpp b/src/modules/partition/gui/EditExistingPartitionDialog.cpp +index 2b9b9405b..7a3f4951a 100644 +--- a/src/modules/partition/gui/EditExistingPartitionDialog.cpp ++++ b/src/modules/partition/gui/EditExistingPartitionDialog.cpp +@@ -57,14 +57,12 @@ updateLabel( PartitionCoreModule* core, Device* device, Partition* partition, co + } + } + +-EditExistingPartitionDialog::EditExistingPartitionDialog( PartitionCoreModule* core, +- Device* device, ++EditExistingPartitionDialog::EditExistingPartitionDialog( Device* device, + Partition* partition, + const QStringList& usedMountPoints, + QWidget* parentWidget ) + : QDialog( parentWidget ) + , m_ui( new Ui_EditExistingPartitionDialog ) +- , m_core( core ) + , m_device( device ) + , m_partition( partition ) + , m_partitionSizeController( new PartitionSizeController( this ) ) +@@ -83,11 +81,6 @@ EditExistingPartitionDialog::EditExistingPartitionDialog( PartitionCoreModule* c + this, + &EditExistingPartitionDialog::checkMountPointSelection ); + +- connect( m_ui->fileSystemComboBox, +- &QComboBox::currentTextChanged, +- this, +- &EditExistingPartitionDialog::checkMountPointSelection ); +- + // The filesystem label field is always enabled, because we may want to change + // the label on the current filesystem without formatting. + m_ui->fileSystemLabelEdit->setText( PartitionInfo::label( m_partition ) ); +@@ -352,10 +345,8 @@ EditExistingPartitionDialog::updateMountPointPicker() + void + EditExistingPartitionDialog::checkMountPointSelection() + { +- if ( validateMountPoint( m_core, +- selectedMountPoint( m_ui->mountPointComboBox ), ++ if ( validateMountPoint( selectedMountPoint( m_ui->mountPointComboBox ), + m_usedMountPoints, +- m_ui->fileSystemComboBox->currentText(), + m_ui->mountPointExplanation, + m_ui->buttonBox->button( QDialogButtonBox::Ok ) ) ) + { +diff --git a/src/modules/partition/gui/EditExistingPartitionDialog.h b/src/modules/partition/gui/EditExistingPartitionDialog.h +index 8674b8b62..5d1e7fd65 100644 +--- a/src/modules/partition/gui/EditExistingPartitionDialog.h ++++ b/src/modules/partition/gui/EditExistingPartitionDialog.h +@@ -37,8 +37,7 @@ public: + Partition* p; + }; + +- EditExistingPartitionDialog( PartitionCoreModule* core, +- Device* device, ++ EditExistingPartitionDialog( Device* device, + Partition* partition, + const QStringList& usedMountPoints, + QWidget* parentWidget = nullptr ); +@@ -51,7 +50,6 @@ private slots: + + private: + QScopedPointer< Ui_EditExistingPartitionDialog > m_ui; +- PartitionCoreModule* m_core; + Device* m_device; + Partition* m_partition; + PartitionSizeController* m_partitionSizeController; +diff --git a/src/modules/partition/gui/EncryptWidget.cpp b/src/modules/partition/gui/EncryptWidget.cpp +index 58c1f5143..ebb076ecf 100644 +--- a/src/modules/partition/gui/EncryptWidget.cpp ++++ b/src/modules/partition/gui/EncryptWidget.cpp +@@ -59,9 +59,8 @@ EncryptWidget::EncryptWidget( QWidget* parent ) + m_ui->m_encryptionUnsupportedLabel->setText( QStringLiteral( "🔓" ) ); + m_ui->m_encryptionUnsupportedLabel->show(); + } +- +- connect( +- m_ui->m_encryptCheckBox, Calamares::checkBoxStateChangedSignal, this, &EncryptWidget::onCheckBoxStateChanged ); ++ m_ui->m_encryptCheckBox->hide(); ++ connect( m_ui->m_encryptCheckBox, &QCheckBox::stateChanged, this, &EncryptWidget::onCheckBoxStateChanged ); + connect( m_ui->m_passphraseLineEdit, &QLineEdit::textEdited, this, &EncryptWidget::onPassphraseEdited ); + connect( m_ui->m_confirmLineEdit, &QLineEdit::textEdited, this, &EncryptWidget::onPassphraseEdited ); + +@@ -183,9 +182,7 @@ EncryptWidget::updateState( const bool notify ) + } + } + +- Encryption newState = state(); +- +- m_state = newState; ++ m_state = state(); + if ( notify ) + { + Q_EMIT stateChanged( m_state ); +@@ -204,12 +201,12 @@ EncryptWidget::onPassphraseEdited() + } + + void +-EncryptWidget::onCheckBoxStateChanged( Calamares::checkBoxStateType checked ) ++EncryptWidget::onCheckBoxStateChanged( int checked ) + { +- const bool visible = ( checked != Calamares::checkBoxUncheckedValue ); +- m_ui->m_passphraseLineEdit->setVisible( visible ); +- m_ui->m_confirmLineEdit->setVisible( visible ); +- m_ui->m_iconLabel->setVisible( visible ); ++ // @p checked is a Qt::CheckState, 0 is "unchecked" and 2 is "checked" ++ m_ui->m_passphraseLineEdit->setVisible( checked ); ++ m_ui->m_confirmLineEdit->setVisible( checked ); ++ m_ui->m_iconLabel->setVisible( checked ); + m_ui->m_passphraseLineEdit->clear(); + m_ui->m_confirmLineEdit->clear(); + m_ui->m_iconLabel->clear(); +diff --git a/src/modules/partition/gui/EncryptWidget.h b/src/modules/partition/gui/EncryptWidget.h +index 6f3db7532..c7cc23daa 100644 +--- a/src/modules/partition/gui/EncryptWidget.h ++++ b/src/modules/partition/gui/EncryptWidget.h +@@ -13,8 +13,6 @@ + #ifndef ENCRYPTWIDGET_H + #define ENCRYPTWIDGET_H + +-#include "compat/CheckBox.h" +- + #include + + #include +@@ -38,7 +36,7 @@ public: + + explicit EncryptWidget( QWidget* parent = nullptr ); + +- void setEncryptionCheckbox( bool preCheckEncrypt = false ); ++ void setEncryptionCheckbox( bool preCheckEncrypt = false); + void reset( bool checkVisible = true ); + + bool isEncryptionCheckboxChecked(); +@@ -61,7 +59,7 @@ signals: + private: + void updateState( const bool notify = true ); + void onPassphraseEdited(); +- void onCheckBoxStateChanged( Calamares::checkBoxStateType checked ); ++ void onCheckBoxStateChanged( int checked ); + + Ui::EncryptWidget* m_ui; + Encryption m_state; +diff --git a/src/modules/partition/gui/PartitionDialogHelpers.cpp b/src/modules/partition/gui/PartitionDialogHelpers.cpp +index db1943a23..b41c12cc9 100644 +--- a/src/modules/partition/gui/PartitionDialogHelpers.cpp ++++ b/src/modules/partition/gui/PartitionDialogHelpers.cpp +@@ -12,15 +12,12 @@ + #include "PartitionDialogHelpers.h" + + #include "core/PartUtils.h" +-#include "core/PartitionCoreModule.h" + #include "gui/CreatePartitionDialog.h" + + #include "GlobalStorage.h" + #include "JobQueue.h" + #include "utils/Logger.h" + +-#include +- + #include + #include + #include +@@ -84,7 +81,7 @@ setSelectedMountPoint( QComboBox& combo, const QString& selected ) + } + + bool +-validateMountPoint( PartitionCoreModule* core, const QString& mountPoint, const QStringList& inUse, const QString& fileSystem, QLabel* label, QPushButton* button ) ++validateMountPoint( const QString& mountPoint, const QStringList& inUse, QLabel* label, QPushButton* button ) + { + QString msg; + bool ok = true; +@@ -98,58 +95,6 @@ validateMountPoint( PartitionCoreModule* core, const QString& mountPoint, const + { + msg = CreatePartitionDialog::tr( "Mountpoint must start with a /.", "@info" ); + ok = false; +- } else { +- // Validate the chosen filesystem + mountpoint combination. +- FileSystem::Type selectedFsType; +- PartUtils::canonicalFilesystemName( fileSystem, &selectedFsType ); +- bool fsTypeIsAllowed = false; +- if ( selectedFsType == FileSystem::Type::Unknown ) +- { +- fsTypeIsAllowed = true; +- } +- else +- { +- QList< FileSystem::Type > anyAllowedFsTypes = core->dirFSRestrictLayout().anyAllowedFSTypes(); +- for ( auto& anyAllowedFsType : anyAllowedFsTypes ) +- { +- if ( selectedFsType == anyAllowedFsType ) +- { +- fsTypeIsAllowed = true; +- break; +- } +- } +- } +- +- bool fsTypeIsAllowedForMountPoint = false; +- // We allow arbitrary unmountable filesystems here since an +- // unmountable filesystem has no mount point associated with it, thus +- // any filesystem restriction we'd find at this point would be +- // irrelevant. +- if ( selectedFsType == FileSystem::Type::Unknown || s_unmountableFS.contains( selectedFsType ) ) +- { +- fsTypeIsAllowedForMountPoint = true; +- } +- else +- { +- QList< FileSystem::Type > allowedFsTypes = core->dirFSRestrictLayout().allowedFSTypes( mountPoint, inUse, false ); +- for ( auto& allowedFsType : allowedFsTypes ) +- { +- if ( selectedFsType == allowedFsType ) +- { +- fsTypeIsAllowedForMountPoint = true; +- break; +- } +- } +- } +- +- if ( !fsTypeIsAllowed ) { +- msg = CreatePartitionDialog::tr( "Filesystem is prohibited by this distro. Consider selecting another one.", "@info" ); +- ok = true; +- } +- else if ( !fsTypeIsAllowedForMountPoint ) { +- msg = CreatePartitionDialog::tr( "Filesystem is prohibited for use on this mountpoint. Consider selecting a different filesystem or mountpoint.", "@info" ); +- ok = true; +- } + } + + if ( label ) +diff --git a/src/modules/partition/gui/PartitionDialogHelpers.h b/src/modules/partition/gui/PartitionDialogHelpers.h +index 4f77c3a71..eea0998c4 100644 +--- a/src/modules/partition/gui/PartitionDialogHelpers.h ++++ b/src/modules/partition/gui/PartitionDialogHelpers.h +@@ -13,23 +13,14 @@ + #define PARTITION_GUI_PARTITIONDIALOGHELPERS + + #include +-#include + + #include +-#include + +-class PartitionCoreModule; + class QPushButton; + class QComboBox; + class QLabel; + class QListWidget; + +-static QSet< FileSystem::Type > s_unmountableFS( { FileSystem::Unformatted, +- FileSystem::LinuxSwap, +- FileSystem::Extended, +- FileSystem::Unknown, +- FileSystem::Lvm2_PV } ); +- + /** + * Returns a list of standard mount points (e.g. /, /usr, ...). + * This also includes the EFI mount point if that is necessary +@@ -77,7 +68,7 @@ setSelectedMountPoint( QComboBox* combo, const QString& selected ) + * If it is not valid, returns @c false and sets the UI + * to explain why. + */ +-bool validateMountPoint( PartitionCoreModule* core, const QString& mountPoint, const QStringList& inUse, const QString& fileSystem, QLabel* label, QPushButton* button ); ++bool validateMountPoint( const QString& mountPoint, const QStringList& inUse, QLabel* label, QPushButton* button ); + + /** + * Get the flags that have been checked in the list widget. +diff --git a/src/modules/partition/gui/PartitionPage.cpp b/src/modules/partition/gui/PartitionPage.cpp +index a5f4365d7..28b4d8583 100644 +--- a/src/modules/partition/gui/PartitionPage.cpp ++++ b/src/modules/partition/gui/PartitionPage.cpp +@@ -15,7 +15,6 @@ + #include "PartitionPage.h" + + // Local +-#include "Config.h" + #include "core/BootLoaderModel.h" + #include "core/DeviceModel.h" + #include "core/KPMHelpers.h" +@@ -40,12 +39,14 @@ + #include "utils/Retranslator.h" + #include "widgets/TranslationFix.h" + ++// KPMcore + #include + #include + #include + #include + #include + ++// Qt + #include + #include + #include +@@ -54,17 +55,14 @@ + #include + #include + +-PartitionPage::PartitionPage( PartitionCoreModule* core, const Config & config, QWidget* parent ) ++PartitionPage::PartitionPage( PartitionCoreModule* core, QWidget* parent ) + : QWidget( parent ) + , m_ui( new Ui_PartitionPage ) + , m_core( core ) + , m_lastSelectedBootLoaderIndex( -1 ) +- , m_isEfi( PartUtils::isEfiSystem() ) ++ , m_isEfi( false ) + { +- if ( config.installChoice() != Config::InstallChoice::Manual ) +- { +- cWarning() << "Manual partitioning page created without user choosing manual-partitioning."; +- } ++ m_isEfi = PartUtils::isEfiSystem(); + + m_ui->setupUi( this ); + m_ui->partitionLabelsView->setVisible( +@@ -78,8 +76,6 @@ PartitionPage::PartitionPage( PartitionCoreModule* core, const Config & config, + ? PartitionBarsView::DrawNestedPartitions + : PartitionBarsView::NoNestedPartitions; + m_ui->partitionBarsView->setNestedPartitionsMode( mode ); +- m_ui->lvmButtonPanel->setVisible( config.isLVMEnabled() ); +- + updateButtons(); + updateBootLoaderInstallPath(); + +@@ -119,10 +115,7 @@ PartitionPage::PartitionPage( PartitionCoreModule* core, const Config & config, + m_ui->label_3->hide(); + } + +- CALAMARES_RETRANSLATE( +- m_ui->retranslateUi( this ); +- m_core->bootLoaderModel()->update(); // Need to re-translate entries in the combo-box +- ); ++ CALAMARES_RETRANSLATE( m_ui->retranslateUi( this ); ); + } + + PartitionPage::~PartitionPage() {} +@@ -255,7 +248,7 @@ PartitionPage::checkCanCreate( Device* device ) + { + auto table = device->partitionTable(); + +- if ( KPMHelpers::isMSDOSPartition( table->type() ) ) ++ if ( table->type() == PartitionTable::msdos || table->type() == PartitionTable::msdos_sectorbased ) + { + cDebug() << "Checking MSDOS partition" << table->numPrimaries() << "primaries, max" << table->maxPrimaries(); + +@@ -411,7 +404,7 @@ PartitionPage::onCreateClicked() + } + + QPointer< CreatePartitionDialog > dlg = new CreatePartitionDialog( +- m_core, model->device(), CreatePartitionDialog::FreeSpace { partition }, getCurrentUsedMountpoints(), this ); ++ model->device(), CreatePartitionDialog::FreeSpace { partition }, getCurrentUsedMountpoints(), this ); + if ( dlg->exec() == QDialog::Accepted ) + { + Partition* newPart = dlg->getNewlyCreatedPartition(); +@@ -515,7 +508,7 @@ PartitionPage::updatePartitionToCreate( Device* device, Partition* partition ) + mountPoints.removeOne( PartitionInfo::mountPoint( partition ) ); + + QPointer< CreatePartitionDialog > dlg +- = new CreatePartitionDialog( m_core, device, CreatePartitionDialog::FreshPartition { partition }, mountPoints, this ); ++ = new CreatePartitionDialog( device, CreatePartitionDialog::FreshPartition { partition }, mountPoints, this ); + if ( dlg->exec() == QDialog::Accepted ) + { + Partition* newPartition = dlg->getNewlyCreatedPartition(); +@@ -532,14 +525,12 @@ PartitionPage::editExistingPartition( Device* device, Partition* partition ) + mountPoints.removeOne( PartitionInfo::mountPoint( partition ) ); + + QPointer< EditExistingPartitionDialog > dlg +- = new EditExistingPartitionDialog( m_core, device, partition, mountPoints, this ); ++ = new EditExistingPartitionDialog( device, partition, mountPoints, this ); + if ( dlg->exec() == QDialog::Accepted ) + { + dlg->applyChanges( m_core ); + } + delete dlg; +- +- updateBootLoaderInstallPath(); + } + + void +diff --git a/src/modules/partition/gui/PartitionPage.h b/src/modules/partition/gui/PartitionPage.h +index 85021d5a0..d3ae60eb8 100644 +--- a/src/modules/partition/gui/PartitionPage.h ++++ b/src/modules/partition/gui/PartitionPage.h +@@ -16,7 +16,6 @@ + #include + #include + +-class Config; + class PartitionCoreModule; + class Ui_PartitionPage; + +@@ -33,7 +32,7 @@ class PartitionPage : public QWidget + { + Q_OBJECT + public: +- explicit PartitionPage( PartitionCoreModule* core, const Config & config, QWidget* parent = nullptr ); ++ explicit PartitionPage( PartitionCoreModule* core, QWidget* parent = nullptr ); + ~PartitionPage() override; + + void onRevertClicked(); +diff --git a/src/modules/partition/gui/PartitionPage.ui b/src/modules/partition/gui/PartitionPage.ui +index 7de478c33..ddbd21bf6 100644 +--- a/src/modules/partition/gui/PartitionPage.ui ++++ b/src/modules/partition/gui/PartitionPage.ui +@@ -11,7 +11,7 @@ SPDX-License-Identifier: GPL-3.0-or-later + 0 + 0 + 684 +- 327 ++ 304 + + + +@@ -129,38 +129,36 @@ SPDX-License-Identifier: GPL-3.0-or-later + + + +- +- +- +- +- +- New Volume Group +- +- +- +- +- +- +- Resize Volume Group +- +- +- +- +- +- +- Deactivate Volume Group +- +- +- +- +- +- +- Remove Volume Group +- +- +- +- +- ++ ++ ++ ++ ++ New Volume Group ++ ++ ++ ++ ++ ++ ++ Resize Volume Group ++ ++ ++ ++ ++ ++ ++ Deactivate Volume Group ++ ++ ++ ++ ++ ++ ++ Remove Volume Group ++ ++ ++ ++ + + + +diff --git a/src/modules/partition/jobs/ClearMountsJob.cpp b/src/modules/partition/jobs/ClearMountsJob.cpp +index 2865d9538..d36c4e512 100644 +--- a/src/modules/partition/jobs/ClearMountsJob.cpp ++++ b/src/modules/partition/jobs/ClearMountsJob.cpp +@@ -260,7 +260,7 @@ STATICTEST MessageAndPath + tryUmount( const QString& partPath ) + { + QProcess process; +- process.start( "umount", { partPath } ); ++ process.start( "umount", { "-l", partPath } ); + process.waitForFinished(); + if ( process.exitCode() == 0 ) + { +@@ -317,6 +317,51 @@ tryCryptoClose( const QString& mapperPath ) + return {}; + } + ++STATICTEST MessageAndPath ++tryClearLVM(const QString& LVMPath) ++{ ++ tryUmount( LVMPath ); ++ ++ QProcess process; ++ process.start( "dmsetup", {"remove", LVMPath } ); ++ process.waitForFinished(); ++ if ( process.exitCode() == 0 ) ++ { ++ return { QT_TRANSLATE_NOOP( "ClearMountsJob", "Successfully removed LVM %1." ), LVMPath }; ++ } ++ return {}; ++} ++ ++STATICTEST MessageAndPath ++mpathClear(const QString& deviceName) ++{ ++ QString devicePath = "/dev/" + deviceName; ++ QProcess process; ++ process.start("multipath", { "-ll", devicePath } ); ++ process.waitForFinished(); ++ if( process.exitCode() == 0 ) ++ { ++ QStringList multiPathLines = QString::fromLocal8Bit( process.readAllStandardOutput() ).split( '\n' ); ++ QStringList firstLines = multiPathLines.first().split(' '); ++ QString mpath = firstLines.first(); ++ return tryClearLVM("/dev/mapper/" + mpath); ++ } ++ return {}; ++} ++ ++STATICTEST MessageAndPath ++diskClear(const QString& diskPath) ++{ ++ QString devicePath = "/dev/" + diskPath; ++ QProcess process; ++ process.start( "wipefs", { "-af", devicePath } ); ++ process.waitForFinished(); ++ if( process.exitCode() == 0 ) ++ { ++ return { QT_TRANSLATE_NOOP( "ClearMountsJob", "Successfully cleared %1." ), diskPath }; ++ } ++ return {}; ++} + STATICTEST MessageAndPath + tryVGDisable( const QString& vgName ) + { +@@ -333,7 +378,7 @@ template < typename F > + void + apply( const QStringList& paths, F f, QList< MessageAndPath >& news ) + { +- for ( const QString& p : std::as_const( paths ) ) ++ for ( const QString& p : qAsConst( paths ) ) + { + auto n = f( p ); + if ( !n.isEmpty() ) +@@ -347,7 +392,7 @@ STATICTEST QStringList + stringify( const QList< MessageAndPath >& news ) + { + QStringList l; +- for ( const auto& m : std::as_const( news ) ) ++ for ( const auto& m : qAsConst( news ) ) + { + l << QString( m ); + } +@@ -380,12 +425,14 @@ ClearMountsJob::exec() + QList< MessageAndPath > goodNews; + + apply( getCryptoDevices( m_mapperExceptions ), tryCryptoClose, goodNews ); +- apply( getLVMVolumes(), tryUmount, goodNews ); ++ apply( getLVMVolumes(), tryClearLVM, goodNews ); + apply( getPVGroups( deviceName ), tryVGDisable, goodNews ); + + apply( getCryptoDevices( m_mapperExceptions ), tryCryptoClose, goodNews ); + apply( getPartitionsForDevice( deviceName ), tryUmount, goodNews ); + apply( getSwapsForDevice( m_deviceNode ), tryClearSwap, goodNews ); ++ diskClear(deviceName); ++ mpathClear(deviceName); + + Calamares::JobResult ok = Calamares::JobResult::ok(); + ok.setMessage( tr( "Cleared all mounts for %1" ).arg( m_deviceNode ) ); +diff --git a/src/modules/partition/jobs/ClearTempMountsJob.cpp b/src/modules/partition/jobs/ClearTempMountsJob.cpp +index f231983de..cb0fb572e 100644 +--- a/src/modules/partition/jobs/ClearTempMountsJob.cpp ++++ b/src/modules/partition/jobs/ClearTempMountsJob.cpp +@@ -56,7 +56,7 @@ ClearTempMountsJob::exec() + std::sort( targetMounts.begin(), targetMounts.end(), MtabInfo::mountPointOrder ); + + QStringList goodNews; +- for ( const auto& m : std::as_const( targetMounts ) ) ++ for ( const auto& m : qAsConst( targetMounts ) ) + { + cDebug() << o << "Will try to umount path" << m.mountPoint; + if ( Calamares::Partition::unmount( m.mountPoint, { "-lv" } ) == 0 ) +diff --git a/src/modules/partition/partition.conf b/src/modules/partition/partition.conf +index 2f56df715..3d335432f 100644 +--- a/src/modules/partition/partition.conf ++++ b/src/modules/partition/partition.conf +@@ -170,12 +170,11 @@ initialSwapChoice: none + # manual partitioning, this partition table exists already on disk + # and it is left unmodified. + # +-# Possible values: gpt, msdos (or other names defined by KPMcore). +-# Names are case-sensitive. +-# ++# Suggested values: gpt, msdos + # If nothing is specified, Calamares defaults to "gpt" if system is +-# efi or "msdos" otherwise. ++# efi or "msdos". + # ++# Names are case-sensitive and defined by KPMCore. + # defaultPartitionTableType: msdos + + # Requirement for partition table type +@@ -183,8 +182,7 @@ initialSwapChoice: none + # Restrict the installation on disks that match the type of partition + # tables that are specified. + # +-# Possible values: msdos, gpt (or other names defined by KPMcore). +-# Names are case-sensitive. ++# Possible values: msdos, gpt. Names are case-sensitive and defined by KPMCore. + # + # If nothing is specified, Calamares defaults to both "msdos" and "gpt". + # +@@ -223,49 +221,6 @@ defaultFileSystemType: "ext4" + # warning (this matches traditional no-choice-available behavior best). + # availableFileSystemTypes: ["ext4","f2fs"] + +-# Per-directory filesystem restrictions. +-# +-# This optional setting specifies what filesystems the user can and cannot use +-# for various directories and mountpoints when using manual partitioning. +-# +-# If nothing is specified, the only restriction enforced by default is that +-# the EFI system partition must use the fat32 filesystem. +-# +-# Otherwise, the filesystem restrictions are defined as follow: +-# +-# directoryFilesystemRestrictions: +-# - directory: "any" +-# allowedFilesystemTypes: ["all"] +-# - directory: "/" +-# allowedFilesystemTypes: ["ext4","xfs","btrfs","jfs","f2fs"] +-# - mountpoint: "efi" +-# allowedFilesystemTypes: ["fat32"] +-# onlyWhenMountpoint: true +-# +-# There can be any number of mountpoints listed, each entry having the +-# following attributes: +-# - mountpoint: mountpoint's full path +-# or +-# "any" to specify a global whitelist that applies to all +-# mountpoints +-# or +-# "efi" to specify a whitelist specific to the EFI system +-# partition, wherever that partition is located +-# - allowedFilesystemTypes: the list of all filesystems valid for this +-# mountpoint. If the list contains exactly one +-# element, and that element is the special value +-# "any", all filesystem types recognized by +-# Calamares will be allowed. +-# - onlyWhenMountpoint: Whether the restriction should apply only when the +-# specified directory is a mountpoint. When set to +-# true, Calamares will only enforce the listed +-# restrictions when the user makes a separate partition +-# for this directory and assigns the mountpoint +-# accordingly. When set to false, Calamares will +-# ensure this directory uses the specified filesystem +-# even if the directory is part of a filesystem on a +-# different mountpoint. Defaults to false. +- + # Show/hide LUKS related functionality in automated partitioning modes. + # Disable this if you choose not to deploy early unlocking support in GRUB2 + # and/or your distribution's initramfs solution. +@@ -290,13 +245,6 @@ defaultFileSystemType: "ext4" + # to cypher their disk when installing in enterprise (for exemple). + #preCheckEncryption: false + +-# LVM support +-# +-# There is only one sub-key available, *enable* (defaults to true) +-# which can be used to show (default) or hide the LVM buttons in the partitioning module. +-lvm: +- enable: true +- + # Partition layout. + # + # This optional setting specifies a custom partition layout. +diff --git a/src/modules/partition/partition.schema.yaml b/src/modules/partition/partition.schema.yaml +index 4bd2fa4ae..65bc723f5 100644 +--- a/src/modules/partition/partition.schema.yaml ++++ b/src/modules/partition/partition.schema.yaml +@@ -20,12 +20,6 @@ properties: + mountPoint: { type: string } + additionalProperties: false + +- lvm: +- type: object +- properties: +- enable: { type: boolean, default: true } +- additionalProperties: false +- + userSwapChoices: { type: array, items: { type: string, enum: [ none, reuse, small, suspend, file ] } } + # ensureSuspendToDisk: { type: boolean, default: true } # Legacy + # neverCreateSwap: { type: boolean, default: false } # Legacy +@@ -37,7 +31,6 @@ properties: + + defaultFileSystemType: { type: string } + availableFileSystemTypes: { type: array, items: { type: string } } +- mountpointFilesystemRestrictions: { type: array } # TODO: specify items + + luksGeneration: { type: string, enum: [luks1, luks2] } # Also allows "luks" as alias of "luks1" + enableLuksAutomatedPartitioning: { type: boolean, default: false } +diff --git a/src/modules/partition/tests/CreateLayoutsTests.cpp b/src/modules/partition/tests/CreateLayoutsTests.cpp +index 3562ab958..87a1ea484 100644 +--- a/src/modules/partition/tests/CreateLayoutsTests.cpp ++++ b/src/modules/partition/tests/CreateLayoutsTests.cpp +@@ -53,19 +53,18 @@ CreateLayoutsTests::cleanup() + void + CreateLayoutsTests::testFixedSizePartition() + { +- const PartitionRole role( PartitionRole::Role::Any ); +- + PartitionLayout layout = PartitionLayout(); + TestDevice dev( QString( "test" ), LOGICAL_SIZE, 5_GiB / LOGICAL_SIZE ); +- PartitionTable table( PartitionTable::TableType::msdos, 0, 5_GiB ); ++ PartitionRole role( PartitionRole::Role::Any ); ++ QList< Partition* > partitions; + + if ( !layout.addEntry( { FileSystem::Type::Ext4, QString( "/" ), QString( "5MiB" ) } ) ) + { + QFAIL( qPrintable( "Unable to create / partition" ) ); + } + +- const auto partitions = layout.createPartitions( +- static_cast< Device* >( &dev ), 0, dev.totalLogical(), Config::LuksGeneration::Luks1, nullptr, &table, role ); ++ partitions = layout.createPartitions( ++ static_cast< Device* >( &dev ), 0, dev.totalLogical(), Config::LuksGeneration::Luks1, nullptr, nullptr, role ); -@@ -62,7 +63,12 @@ BootInfoWidget::retranslateUi() - "Modern systems usually use EFI, but " - "may also show up as BIOS if started in compatibility " - "mode." ) ); + QCOMPARE( partitions.count(), 1 ); + +@@ -75,19 +74,18 @@ CreateLayoutsTests::testFixedSizePartition() + void + CreateLayoutsTests::testPercentSizePartition() + { +- const PartitionRole role( PartitionRole::Role::Any ); - -+ m_bootIcon->setStyleSheet( -+ "QLabel {" -+ "background-color: #ffffff;" -+ "color: black;" -+ "}" -+ ); - QString bootToolTip; - if ( PartUtils::isEfiSystem() ) + PartitionLayout layout = PartitionLayout(); + TestDevice dev( QString( "test" ), LOGICAL_SIZE, 5_GiB / LOGICAL_SIZE ); +- PartitionTable table( PartitionTable::TableType::msdos, 0, 5_GiB ); ++ PartitionRole role( PartitionRole::Role::Any ); ++ QList< Partition* > partitions; + + if ( !layout.addEntry( { FileSystem::Type::Ext4, QString( "/" ), QString( "50%" ) } ) ) { -diff --git a/src/modules/partition/gui/ChoicePage.cpp b/src/modules/partition/gui/ChoicePage.cpp -index 62cf0f6..6185d3f 100644 ---- a/src/modules/partition/gui/ChoicePage.cpp -+++ b/src/modules/partition/gui/ChoicePage.cpp -@@ -1344,7 +1344,7 @@ ChoicePage::setupActions() - "You will be able to review and confirm your choices " - "before any change is made to the storage device." ) ); + QFAIL( qPrintable( "Unable to create / partition" ) ); + } -- m_eraseButton->setText( tr( "Erase disk
    " -+ m_eraseButton->setText( tr( "Automatic partitioning
    " - "This will delete all data " - "currently present on the selected storage device." ) ); +- const auto partitions = layout.createPartitions( +- static_cast< Device* >( &dev ), 0, dev.totalLogical(), Config::LuksGeneration::Luks1, nullptr, &table, role ); ++ partitions = layout.createPartitions( ++ static_cast< Device* >( &dev ), 0, dev.totalLogical(), Config::LuksGeneration::Luks1, nullptr, nullptr, role ); -@@ -1381,7 +1381,7 @@ ChoicePage::setupActions() - "The installer will shrink a partition to make room for %1." ) - .arg( Calamares::Branding::instance()->shortVersionedName() ) ); + QCOMPARE( partitions.count(), 1 ); -- m_eraseButton->setText( tr( "Erase disk
    " -+ m_eraseButton->setText( tr( "Automatic partitioning
    " - "This will delete all data " - "currently present on the selected storage device." ) ); +@@ -97,11 +95,10 @@ CreateLayoutsTests::testPercentSizePartition() + void + CreateLayoutsTests::testMixedSizePartition() + { +- const PartitionRole role( PartitionRole::Role::Any ); +- + PartitionLayout layout = PartitionLayout(); + TestDevice dev( QString( "test" ), LOGICAL_SIZE, 5_GiB / LOGICAL_SIZE ); +- PartitionTable table( PartitionTable::TableType::msdos, 0, 5_GiB ); ++ PartitionRole role( PartitionRole::Role::Any ); ++ QList< Partition* > partitions; -@@ -1402,7 +1402,7 @@ ChoicePage::setupActions() - "The installer will shrink a partition to make room for %1." ) - .arg( Calamares::Branding::instance()->shortVersionedName() ) ); + if ( !layout.addEntry( { FileSystem::Type::Ext4, QString( "/" ), QString( "5MiB" ) } ) ) + { +@@ -118,8 +115,8 @@ CreateLayoutsTests::testMixedSizePartition() + QFAIL( qPrintable( "Unable to create /bkup partition" ) ); + } -- m_eraseButton->setText( tr( "Erase disk
    " -+ m_eraseButton->setText( tr( "Automatic partitioning
    " - "This will delete all data " - "currently present on the selected storage device." ) ); +- const auto partitions = layout.createPartitions( +- static_cast< Device* >( &dev ), 0, dev.totalLogical(), Config::LuksGeneration::Luks1, nullptr, &table, role ); ++ partitions = layout.createPartitions( ++ static_cast< Device* >( &dev ), 0, dev.totalLogical(), Config::LuksGeneration::Luks1, nullptr, nullptr, role ); -@@ -1427,7 +1427,7 @@ ChoicePage::setupActions() - "The installer will shrink a partition to make room for %1." ) - .arg( Calamares::Branding::instance()->shortVersionedName() ) ); + QCOMPARE( partitions.count(), 3 ); -- m_eraseButton->setText( tr( "Erase disk
    " -+ m_eraseButton->setText( tr( "Automatic partitioning
    " - "This will delete all data " - "currently present on the selected storage device." ) ); +diff --git a/src/modules/plasmalnf/CMakeLists.txt b/src/modules/plasmalnf/CMakeLists.txt +index 930b3e441..50cb630f2 100644 +--- a/src/modules/plasmalnf/CMakeLists.txt ++++ b/src/modules/plasmalnf/CMakeLists.txt +@@ -13,7 +13,7 @@ if(WITH_QT6) + set(_plasma_libraries "Plasma::Plasma") + set(_plasma_name "Plasma") + find_package(${kfname} ${KF_VERSION} QUIET COMPONENTS Config Package) +- find_package(Plasma ${PLASMA_VERSION} QUIET) ++ find_package(Plasma ${PLASMA_VERSION}) + else() + set(_plasma_libraries "${kfname}::Plasma") + set(_plasma_name "KF5Plasma") +diff --git a/src/modules/preservefiles/PreserveFiles.cpp b/src/modules/preservefiles/PreserveFiles.cpp +index 8419d4c94..743b51fc4 100644 +--- a/src/modules/preservefiles/PreserveFiles.cpp ++++ b/src/modules/preservefiles/PreserveFiles.cpp +@@ -65,7 +65,7 @@ PreserveFiles::exec() + } -@@ -1593,7 +1593,7 @@ ChoicePage::calculateNextEnabled() const + int count = 0; +- for ( const auto& it : std::as_const( m_items ) ) ++ for ( const auto& it : qAsConst( m_items ) ) + { + if ( !it ) { - case EncryptWidget::Encryption::Unconfirmed: - cDebug() << "No passphrase provided or passphrase mismatch."; -- return false; -+ //return false; - case EncryptWidget::Encryption::Disabled: - case EncryptWidget::Encryption::Confirmed: - // Checkbox not checked, **or** passphrases match -diff --git a/src/modules/partition/gui/DeviceInfoWidget.cpp b/src/modules/partition/gui/DeviceInfoWidget.cpp -index f57ed91..a22344d 100644 ---- a/src/modules/partition/gui/DeviceInfoWidget.cpp -+++ b/src/modules/partition/gui/DeviceInfoWidget.cpp -@@ -52,7 +52,18 @@ DeviceInfoWidget::DeviceInfoWidget( QWidget* parent ) - m_ptLabel->setAutoFillBackground( true ); - m_ptIcon->setPalette( palette ); - m_ptLabel->setPalette( palette ); -- -+ m_ptLabel->setStyleSheet( -+ "QLabel {" -+ "background-color: #ffffff;" -+ "color: black;" -+ "}" -+ ); -+ m_ptIcon->setStyleSheet( -+ "QLabel {" -+ "background-color: #ffffff;" -+ "color: black;" -+ "}" -+ ); - CALAMARES_RETRANSLATE_SLOT( &DeviceInfoWidget::retranslateUi ); - } +diff --git a/src/modules/shellprocess/ShellProcessJob.cpp b/src/modules/shellprocess/ShellProcessJob.cpp +index d6fa9acfa..3fe8cc613 100644 +--- a/src/modules/shellprocess/ShellProcessJob.cpp ++++ b/src/modules/shellprocess/ShellProcessJob.cpp +@@ -60,7 +60,6 @@ ShellProcessJob::setConfigurationMap( const QVariantMap& configurationMap ) + { + timeout = 30; + } +- bool verbose = Calamares::getBool( configurationMap, "verbose", false ); -diff --git a/src/modules/partition/gui/EncryptWidget.cpp b/src/modules/partition/gui/EncryptWidget.cpp -index 8726df1..ebb076e 100644 ---- a/src/modules/partition/gui/EncryptWidget.cpp -+++ b/src/modules/partition/gui/EncryptWidget.cpp -@@ -59,7 +59,7 @@ EncryptWidget::EncryptWidget( QWidget* parent ) - m_ui->m_encryptionUnsupportedLabel->setText( QStringLiteral( "🔓" ) ); - m_ui->m_encryptionUnsupportedLabel->show(); + if ( configurationMap.contains( "script" ) ) + { +@@ -70,7 +69,6 @@ ShellProcessJob::setConfigurationMap( const QVariantMap& configurationMap ) + { + cDebug() << "ShellProcessJob: \"script\" contains no commands for" << moduleInstanceKey(); + } +- m_commands->updateVerbose( verbose ); } + else + { +diff --git a/src/modules/shellprocess/Tests.cpp b/src/modules/shellprocess/Tests.cpp +index 58957681d..be0028f6d 100644 +--- a/src/modules/shellprocess/Tests.cpp ++++ b/src/modules/shellprocess/Tests.cpp +@@ -49,7 +49,7 @@ ShellProcessTests::testProcessListSampleConfig() + + CommandList cl( Calamares::YAML::mapToVariant( doc ).value( "script" ) ); + QVERIFY( !cl.isEmpty() ); +- QCOMPARE( cl.count(), 4 ); ++ QCOMPARE( cl.count(), 3 ); + + QCOMPARE( cl.at( 0 ).timeout(), Calamares::CommandLine::TimeoutNotSet() ); + QCOMPARE( cl.at( 2 ).timeout(), 3600s ); // slowloris +diff --git a/src/modules/shellprocess/shellprocess.conf b/src/modules/shellprocess/shellprocess.conf +index 709d2a80f..41a7d2733 100644 +--- a/src/modules/shellprocess/shellprocess.conf ++++ b/src/modules/shellprocess/shellprocess.conf +@@ -46,12 +46,6 @@ + # - Setting a timeout of 3600 for a 1GB download is going to leave + # the user in uncertainty for a loooong time. + # +-# The (global) verbosity of a command can be set to `true` or `false`. +-# When set to `true`, command output is logged one line at a time. +-# Otherwise the output is logged when the command completes. +-# Line-at-a-time logging is appropriate for commands that take +-# a long time to complete and produce their own (progress) output. +-# + # If a command starts with "-" (a single minus sign), then the + # return value of the command following the - is ignored; otherwise, + # a failing command will abort the installation. This is much like +@@ -68,8 +62,7 @@ + # a key *timeout* to set the timeout for this specific + # command differently from the global setting. An optional + # key *environment* is a list of strings to put into the +-# environment of the command. An optional key *verbose* +-# overrides the global *verbose* setting in this file. ++# environment of the command. + # + # Using a single object is not generally useful because the same effect + # can be obtained with a single string and a global timeout, except +@@ -91,20 +84,8 @@ + --- + # Set to true to run in host, rather than target system + dontChroot: false - -+ m_ui->m_encryptCheckBox->hide(); - connect( m_ui->m_encryptCheckBox, &QCheckBox::stateChanged, this, &EncryptWidget::onCheckBoxStateChanged ); - connect( m_ui->m_passphraseLineEdit, &QLineEdit::textEdited, this, &EncryptWidget::onPassphraseEdited ); - connect( m_ui->m_confirmLineEdit, &QLineEdit::textEdited, this, &EncryptWidget::onPassphraseEdited ); +-# Tune this for the commands you're actually running, or +-# use the list-of-items form of commands to tune the timeout +-# for each command individually. +-timeout: 10 +- +-# This will copy the output from the command into the Calamares +-# log file. No processing is done beyond log-each-line-separately, +-# so this can introduce weirdness in the log if the script +-# outputs e.g. escape codes. +-# +-# The default is `false`. This can also be set for each +-# command individually. +-verbose: false ++# Tune this for the commands you're actually running ++# timeout: 10 + + # Script may be a single string (because false returns an error exit + # code, this will trigger a failure in the installation): +@@ -120,18 +101,14 @@ verbose: false + # - "/bin/ls" + # - "/usr/bin/true" + +-# Script may be a list of items +-# - if the touch command fails, it is ignored +-# - there is nothing special about the invocation of true +-# - the slowloris command has a different timeout from the other commands +-# - the echo command logs its output line-by-line ++# Script may be a list of items (if the touch command fails, it is ++# ignored; the slowloris command has a different timeout from the ++# other commands in the list): + script: + - "-touch ${ROOT}/tmp/thingy" + - "/usr/bin/true" + - command: "/usr/local/bin/slowloris" + timeout: 3600 +- - command: "echo -e '\e[33;2mred\e[33;0m' ; echo second line" +- verbose: true + + # You can change the description of the job (as it is displayed in the + # progress bar during installation) by defining an *i18n* key, which +diff --git a/src/modules/shellprocess/shellprocess.schema.yaml b/src/modules/shellprocess/shellprocess.schema.yaml +index c9f6c3410..af56707b7 100644 +--- a/src/modules/shellprocess/shellprocess.schema.yaml ++++ b/src/modules/shellprocess/shellprocess.schema.yaml +@@ -19,10 +19,7 @@ definitions: + timeout: + type: number + description: the (optional) timeout for this specific command (differently +- from the global setting). +- verbose: +- type: boolean +- description: when true, log output from the command to the Calamares log. ++ from the global setting) + required: + - command + type: object +@@ -37,9 +34,6 @@ properties: + type: number + description: The (global) timeout for the command list in seconds. If unset, defaults + to 30 seconds. +- verbose: +- type: boolean +- description: when true, log output from the command to the Calamares log. + script: + anyOf: + - $ref: '#definitions/command' +@@ -61,5 +55,3 @@ properties: + type: string + required: + - name +-required: +- - script diff --git a/src/modules/summary/SummaryPage.cpp b/src/modules/summary/SummaryPage.cpp -index 41881e4..08a4d51 100644 +index 41881e479..08a4d5142 100644 --- a/src/modules/summary/SummaryPage.cpp +++ b/src/modules/summary/SummaryPage.cpp @@ -35,7 +35,7 @@ SummaryPage::SummaryPage( Config* config, QWidget* parent ) @@ -1141,8 +4077,41 @@ index 41881e4..08a4d51 100644 QPalette bodyPalette( palette() ); bodyPalette.setColor( WindowBackground, palette().window().color().lighter( 108 ) ); +diff --git a/src/modules/tracking/TrackingPage.cpp b/src/modules/tracking/TrackingPage.cpp +index 859abdfd9..df4b52385 100644 +--- a/src/modules/tracking/TrackingPage.cpp ++++ b/src/modules/tracking/TrackingPage.cpp +@@ -16,7 +16,6 @@ + #include "GlobalStorage.h" + #include "JobQueue.h" + #include "ViewManager.h" +-#include "compat/CheckBox.h" + #include "utils/Gui.h" + #include "utils/Logger.h" + #include "utils/Retranslator.h" +@@ -33,7 +32,7 @@ TrackingPage::TrackingPage( Config* config, QWidget* parent ) + + ui->noneCheckBox->setChecked( true ); + ui->noneCheckBox->setEnabled( false ); +- connect( ui->noneCheckBox, Calamares::checkBoxStateChangedSignal, this, &TrackingPage::buttonNoneChecked ); ++ connect( ui->noneCheckBox, &QCheckBox::stateChanged, this, &TrackingPage::buttonNoneChecked ); + + // Each "panel" of configuration has the same kind of setup, + // where the xButton and xCheckBox is connected to the xTracking +@@ -41,9 +40,9 @@ TrackingPage::TrackingPage( Config* config, QWidget* parent ) + #define trackingSetup( x ) \ + do \ + { \ +- connect( ui->x##CheckBox, Calamares::checkBoxStateChangedSignal, this, &TrackingPage::buttonChecked ); \ ++ connect( ui->x##CheckBox, &QCheckBox::stateChanged, this, &TrackingPage::buttonChecked ); \ + connect( ui->x##CheckBox, \ +- Calamares::checkBoxStateChangedSignal, \ ++ &QCheckBox::stateChanged, \ + config->x##Tracking(), \ + QOverload< bool >::of( &TrackingStyleConfig::setTracking ) ); \ + connect( config->x##Tracking(), \ diff --git a/src/modules/umount/UmountJob.cpp b/src/modules/umount/UmountJob.cpp -index 83cf2f1..90f2373 100644 +index f899d8e27..90f237316 100644 --- a/src/modules/umount/UmountJob.cpp +++ b/src/modules/umount/UmountJob.cpp @@ -42,6 +42,29 @@ UmountJob::prettyName() const @@ -1175,19 +4144,77 @@ index 83cf2f1..90f2373 100644 QDir targetMount( rootMountPoint ); if ( !targetMount.exists() ) { +@@ -63,7 +86,7 @@ unmountTargetMounts( const QString& rootMountPoint ) + std::sort( targetMounts.begin(), targetMounts.end(), MtabInfo::mountPointOrder ); + + cDebug() << "Read" << targetMounts.count() << "entries from" << targetMountPath; +- for ( const auto& m : std::as_const( targetMounts ) ) ++ for ( const auto& m : qAsConst( targetMounts ) ) + { + // Returns the program's exit code, so 0 is success and non-0 + // (truthy) is a failure. +@@ -78,18 +101,6 @@ unmountTargetMounts( const QString& rootMountPoint ) + .arg( m.device, m.mountPoint ) ); + } + } +- +- // Last we unmount the root +- if ( Calamares::Partition::unmount( rootMountPoint, { "-lv" } ) ) +- { +- return Calamares::JobResult::error( +- QCoreApplication::translate( UmountJob::staticMetaObject.className(), +- "Could not unmount the root of the target system." ), +- QCoreApplication::translate( UmountJob::staticMetaObject.className(), +- "The device mounted at '%1' could not be unmounted." ) +- .arg( rootMountPoint ) ); +- } +- + return Calamares::JobResult::ok(); + } + +@@ -151,7 +162,6 @@ UmountJob::exec() + return r; + } + } +- + // For ZFS systems, export the pools + { + auto r = exportZFSPools(); diff --git a/src/modules/unpackfs/main.py b/src/modules/unpackfs/main.py -index 814556f..4148720 100644 +index fdb4fc9a8..7db5f2ea6 100644 --- a/src/modules/unpackfs/main.py +++ b/src/modules/unpackfs/main.py -@@ -23,6 +23,7 @@ import sys +@@ -23,8 +23,11 @@ import sys import tempfile import libcalamares +import platform import gettext ++ ++import libcalamares.utils _ = gettext.translation("calamares-python", -@@ -153,6 +154,40 @@ def global_excludes(): + localedir=libcalamares.utils.gettext_path(), + languages=libcalamares.utils.gettext_languages(), +@@ -48,7 +51,7 @@ class UnpackEntry: + :param destination: + """ + __slots__ = ('source', 'sourcefs', 'destination', 'copied', 'total', 'exclude', 'excludeFile', +- 'mountPoint', 'weight', 'condition', 'optional') ++ 'mountPoint', 'weight') + + def __init__(self, source, sourcefs, destination): + """ +@@ -71,8 +74,6 @@ class UnpackEntry: + self.total = 0 + self.mountPoint = None + self.weight = 1 +- self.condition = True +- self.optional = False + + def is_file(self): + return self.sourcefs == "file" +@@ -155,6 +156,40 @@ def global_excludes(): return lst @@ -1228,7 +4255,16 @@ index 814556f..4148720 100644 def file_copy(source, entry, progress_cb): """ Extract given image using rsync. -@@ -226,9 +261,44 @@ def file_copy(source, entry, progress_cb): +@@ -172,7 +207,7 @@ def file_copy(source, entry, progress_cb): + # `source` *must* end with '/' otherwise a directory named after the source + # will be created in `dest`: ie if `source` is "/foo/bar" and `dest` is + # "/dest", then files will be copied in "/dest/bar". +- if not source.endswith("/") and not os.path.isfile(source): ++ if source and not source.endswith("/") and not os.path.isfile(source): + source += "/" + + num_files_total_local = 0 +@@ -228,9 +263,54 @@ def file_copy(source, entry, progress_cb): counter.last_timestamp_reported = now counter.last_total_reported = num_files_total_local progress_cb(num_files_copied, num_files_total_local) @@ -1236,6 +4272,7 @@ index 814556f..4148720 100644 try: - returncode = libcalamares.utils.host_env_process_output(args, output_cb) + returncode = 0 ++ + arch = platform.machine() + + libcalamares.utils.host_env_process_output(["mkdir", "-p", entry.destination + "/etc/yum.repos.d/"], output_cb) @@ -1245,6 +4282,7 @@ index 814556f..4148720 100644 + libcalamares.utils.host_env_process_output(["cp", "-af", "/etc/add_selinux_policy.sh", entry.destination + "/etc/add_selinux_policy.sh"], output_cb) + libcalamares.utils.host_env_process_output(["chmod", "+x", entry.destination + "/etc/add_selinux_policy.sh"], output_cb) + ++ completed_packages = 0 + if os.path.exists("/etc/yum.repos.d/local.repo"): + libcalamares.utils.host_env_process_output( + ["cp", "-af", "/etc/yum.repos.d/local.repo", entry.destination + "/etc/yum.repos.d/"], output_cb) @@ -1254,9 +4292,13 @@ index 814556f..4148720 100644 + else: + packages = ["yum", "grub2", "grub2-efi-x64", "grub2-pc", "passwd", "sudo"] + -+ libcalamares.utils.host_env_process_output( -+ ["yum", "--installroot=" + entry.destination, "--disablerepo=*", "--enablerepo=local-repo", -+ "--releasever=/", "--nogpgcheck", "--setopt=sslverify=0", "install", "-y"] + packages, output_cb) ++ for package in packages: ++ libcalamares.job.setprogress(completed_packages / len(packages)) ++ libcalamares.utils.host_env_process_output( ++ ["yum", "--installroot=" + entry.destination, "--disablerepo=*", "--enablerepo=local-repo", ++ "--releasever=/", "--nogpgcheck", "--setopt=sslverify=0", "install", "-y", package], output_cb) ++ completed_packages += 1 ++ libcalamares.job.setprogress(completed_packages / len(packages)) + else: + libcalamares.utils.host_env_process_output( + ["cp", "-af", "/etc/yum.repos.d/openEuler.repo", entry.destination + "/etc/yum.repos.d/"], output_cb) @@ -1265,9 +4307,13 @@ index 814556f..4148720 100644 + else: + packages = ["yum", "grub2", "grub2-efi-x64", "grub2-pc", "passwd", "sudo"] + -+ libcalamares.utils.host_env_process_output( -+ ["yum", "--installroot=" + entry.destination, "--releasever=/", "--nogpgcheck", "--setopt=sslverify=0", -+ "install", "-y"] + packages, output_cb) ++ for package in packages: ++ libcalamares.job.setprogress(completed_packages / len(packages)) ++ libcalamares.utils.host_env_process_output( ++ ["yum", "--installroot=" + entry.destination, "--releasever=/", "--nogpgcheck", "--setopt=sslverify=0", ++ "install", "-y", package], output_cb) ++ completed_packages += 1 ++ libcalamares.job.setprogress(completed_packages / len(packages)) + + libcalamares.utils.host_env_process_output(["rm", "-f", entry.destination + "/etc/shadow"], output_cb) + libcalamares.utils.host_env_process_output(["cp", "-af", "/etc/shadow", entry.destination + "/etc/shadow"], output_cb) @@ -1275,14 +4321,63 @@ index 814556f..4148720 100644 except subprocess.CalledProcessError as e: returncode = e.returncode -@@ -454,10 +524,10 @@ def run(): +@@ -315,8 +395,6 @@ class UnpackOperation: + for entry in self.entries: + status = _("Starting to unpack {}").format(entry.source) + libcalamares.job.setprogress( ( 1.0 * complete ) / len(self.entries) ) +- entry.do_mount(source_mount_path) +- entry.do_count() # Fill in the entry.total + + self.report_progress() + error_msg = self.unpack_image(entry, entry.mountPoint) +@@ -357,7 +435,7 @@ class UnpackOperation: + + return file_copy(source, entry, progress_cb) + finally: +- if not entry.is_file(): ++ if imgmountdir and not entry.is_file() and os.path.isdir(imgmountdir): + subprocess.check_call(["umount", "-l", imgmountdir]) + + +@@ -421,18 +499,6 @@ def extract_weight(entry): + return 1 + + +-def fetch_from_globalstorage(keys_list): +- value = libcalamares.globalstorage.value(keys_list[0]) +- if value is None: +- return None +- for key in keys_list[1:]: +- if isinstance(value, dict) and key in value: +- value = value[key] +- else: +- return None +- return value +- +- + def run(): + """ + Unsquash filesystem. +@@ -462,22 +528,16 @@ def run(): + for entry in libcalamares.job.configuration["unpack"]: + source = os.path.abspath(entry["source"]) + sourcefs = entry["sourcefs"] +- optional = entry.get("optional", False) + + if sourcefs not in supported_filesystems: + libcalamares.utils.warning("The filesystem for \"{}\" ({}) is not supported by your current kernel".format(source, sourcefs)) libcalamares.utils.warning(" ... modprobe {} may solve the problem".format(sourcefs)) return (_("Bad unpackfs configuration"), _("The filesystem for \"{}\" ({}) is not supported by your current kernel").format(source, sourcefs)) - if not os.path.exists(source): -- libcalamares.utils.warning("The source filesystem \"{}\" does not exist".format(source)) -- return (_("Bad unpackfs configuration"), -- _("The source filesystem \"{}\" does not exist").format(source)) +- if optional: +- libcalamares.utils.warning("The source filesystem \"{}\" does not exist but is marked as optional, skipping".format(source)) +- entry["condition"] = False +- continue +- else: +- libcalamares.utils.warning("The source filesystem \"{}\" does not exist".format(source)) +- return (_("Bad unpackfs configuration"), +- _("The source filesystem \"{}\" does not exist").format(source)) + #if not os.path.exists(source): + # libcalamares.utils.warning("The source filesystem \"{}\" does not exist".format(source)) + # return (_("Bad unpackfs configuration"), @@ -1290,12 +4385,71 @@ index 814556f..4148720 100644 if sourcefs == "squashfs": if shutil.which("unsquashfs") is None: libcalamares.utils.warning("Failed to find unsquashfs") +@@ -494,28 +554,6 @@ def run(): + sourcefs = entry["sourcefs"] + destination = os.path.abspath(root_mount_point + entry["destination"]) + +- condition = entry.get("condition", True) +- if isinstance(condition, bool): +- pass # 'condition' is already True or False +- elif isinstance(condition, str): +- keys = condition.split(".") +- gs_value = fetch_from_globalstorage(keys) +- if gs_value is None: +- libcalamares.utils.warning("Condition key '{}' not found in global storage, assuming False".format(condition)) +- condition = False +- elif isinstance(gs_value, bool): +- condition = gs_value +- else: +- libcalamares.utils.warning("Condition key '{}' is not a boolean, assuming True".format(condition)) +- condition = True +- else: +- libcalamares.utils.warning("Invalid 'condition' value '{}', assuming True".format(condition)) +- condition = True +- +- if not condition: +- libcalamares.utils.debug("Skipping unpack of {} due to 'condition' being False".format(source)) +- continue +- + if not os.path.isdir(destination) and sourcefs != "file": + libcalamares.utils.warning(("The destination \"{}\" in the target system is not a directory").format(destination)) + if is_first: diff --git a/src/modules/unpackfs/unpackfs.conf b/src/modules/unpackfs/unpackfs.conf -index d12110b..1b053a6 100644 +index 1576fa7f3..1b053a6aa 100644 --- a/src/modules/unpackfs/unpackfs.conf +++ b/src/modules/unpackfs/unpackfs.conf -@@ -88,13 +88,7 @@ +@@ -86,43 +86,9 @@ + # of trailing slashes apply. In order to *rename* a file as it is + # copied, specify one single file (e.g. CHANGES) and a full pathname # for its destination name, as in the example below. +-# +-# It is also possible to dynamically (conditionally) unpack a source by passing a boolean +-# value for *condition*. This may be true or false (constant) or name a globalstorage +-# value. Use '.' to separate parts of a globalstorage name if it is nested. +-# +-# This is used in e.g. stacked squashfses, where the user can select a specific +-# install type. The default value of *condition* is true. +-# +-# - source: ./example.minimal.sqfs +-# sourcefs: squashfs +-# destination: "" +-# condition: false +-# - source: ./example.standard.sqfs +-# sourcefs: squashfs +-# destination: "" +-# condition: exampleGlobalStorageVariable.subkey +-# +-# You may also wish to include optional squashfses, which may not exist at certain times +-# depending on your image tooling. If an optional squashfs is not found, it is simply +-# skipped. +-# +-# - source: ./example.standard.sqfs +-# sourcefs: squashfs +-# destination: "" +-# - source: ./example.extras.sqfs +-# sourcefs: squashfs +-# destination: "" +-# optional: true unpack: - - source: ../CHANGES @@ -1311,22 +4465,503 @@ index d12110b..1b053a6 100644 - exclude: [ "*.qmlc", "qmldir" ] - weight: 5 # Lots of files - # excludeFile: /etc/calamares/modules/unpackfs/exclude-list.txt +diff --git a/src/modules/unpackfs/unpackfs.schema.yaml b/src/modules/unpackfs/unpackfs.schema.yaml +index 9dc53c446..0d96fe9cb 100644 +--- a/src/modules/unpackfs/unpackfs.schema.yaml ++++ b/src/modules/unpackfs/unpackfs.schema.yaml +@@ -18,9 +18,4 @@ properties: + excludeFile: { type: string } + exclude: { type: array, items: { type: string } } + weight: { type: integer, exclusiveMinimum: 0 } +- optional: { type: boolean } +- condition: +- anyOf: +- - type: boolean +- - type: string + required: [ source , sourcefs, destination ] +diff --git a/src/modules/users/Config.cpp b/src/modules/users/Config.cpp +index be754774b..cd56bc3e2 100644 +--- a/src/modules/users/Config.cpp ++++ b/src/modules/users/Config.cpp +@@ -19,7 +19,6 @@ + #include "JobQueue.h" + #include "compat/Variant.h" + #include "utils/Logger.h" +-#include "utils/Permissions.h" + #include "utils/String.h" + #include "utils/StringExpander.h" + #include "utils/Variant.h" +@@ -928,30 +927,6 @@ tidy( QStringList& l ) + l.removeDuplicates(); + } + +-static QString +-unscrambleYAML( const QVariant& v ) +-{ +- if ( Calamares::isIntegerVariantType( v ) ) +- { +- // YAML takes a string like "0755" and makes it an integer **anyway** +- const auto number = v.toLongLong(); +- if ( number < 0 ) +- { +- return QString(); +- } +- // Since YAML has parsed it as a decimal number, +- // turn it back into the string representation of +- // that decimal number, even though we intended it +- // to be octal (e.g. "755" written down becomes +- // seven-hundred-fifty-five, needs to be the string +- // "755" again, even though we meant octal 755 which +- // is four-hundred-ninety-three. +- if ( number > 777 ) { return QString(); } +- return QString::number( number ); +- } +- return v.toString(); +-} +- + void + Config::setConfigurationMap( const QVariantMap& configurationMap ) + { +@@ -971,22 +946,6 @@ Config::setConfigurationMap( const QVariantMap& configurationMap ) + m_forbiddenLoginNames = Calamares::getStringList( userSettings, "forbidden_names" ); + m_forbiddenLoginNames << alwaysForbiddenLoginNames(); + tidy( m_forbiddenLoginNames ); +- +- const auto permissionKey = QStringLiteral( "home_permissions" ); +- if ( userSettings.contains( permissionKey ) ) +- { +- const auto value = unscrambleYAML( userSettings.value( permissionKey ) ); +- m_homeDirPermissions = Calamares::parseFileMode( value ); +- if ( m_homeDirPermissions < 0 ) +- { +- cWarning() << "Setting for" << permissionKey << '(' << value << userSettings[ permissionKey ] +- << ") is invalid."; +- } +- } +- else +- { +- m_homeDirPermissions = -1; +- } + } + + setAutoLoginGroup( either< QString, const QString& >( +diff --git a/src/modules/users/Config.h b/src/modules/users/Config.h +index 5d3776c62..07fa40d1f 100644 +--- a/src/modules/users/Config.h ++++ b/src/modules/users/Config.h +@@ -259,9 +259,6 @@ public: + const QStringList& forbiddenLoginNames() const; + const QStringList& forbiddenHostNames() const; + +- int homePermissions() const { return m_homeDirPermissions; } +- int homeUMask() const { return m_homeDirPermissions >= 0 ? ( ( ~m_homeDirPermissions ) & 0777 ) : -1; } +- + public Q_SLOTS: + /** @brief Sets the user's shell if possible + * +@@ -371,8 +368,6 @@ private: + QStringList m_forbiddenLoginNames; + + PasswordCheckList m_passwordChecks; +- +- int m_homeDirPermissions = -1; + }; + + #endif +diff --git a/src/modules/users/CreateUserJob.cpp b/src/modules/users/CreateUserJob.cpp +index c55ee1858..9699141a8 100644 +--- a/src/modules/users/CreateUserJob.cpp ++++ b/src/modules/users/CreateUserJob.cpp +@@ -46,7 +46,7 @@ CreateUserJob::prettyStatusMessage() const + } + + static Calamares::JobResult +-createUser( const QString& loginName, const QString& fullName, const QString& shell, int umask ) ++createUser( const QString& loginName, const QString& fullName, const QString& shell ) + { + QStringList useraddCommand; + #ifdef __FreeBSD__ +@@ -58,7 +58,6 @@ createUser( const QString& loginName, const QString& fullName, const QString& sh + { + useraddCommand << "-s" << shell; + } +- Q_UNUSED( umask ) + #else + useraddCommand << "useradd" + << "-m" +@@ -68,11 +67,6 @@ createUser( const QString& loginName, const QString& fullName, const QString& sh + useraddCommand << "-s" << shell; + } + useraddCommand << "-c" << fullName; +- if ( umask >= 0 ) +- { +- // The QChar() is needed to disambiguate from the overload that takes a double +- useraddCommand << "-K" << ( QStringLiteral( "UMASK=%1" ).arg( umask, 3, 8, QChar( '0' ) ) ); +- } + useraddCommand << loginName; + #endif + +@@ -85,6 +79,23 @@ createUser( const QString& loginName, const QString& fullName, const QString& sh + return Calamares::JobResult::ok(); + } + ++static Calamares::JobResult ++config_root_bash(const QString& loginName) ++{ ++ QStringList copyBashFilesCommand; ++ copyBashFilesCommand << "cp" ++ << QString("/home/%1/.bashrc").arg(loginName) ++ << QString("/home/%1/.bash_profile").arg(loginName) ++ << "/root/"; ++ auto commandResult = Calamares::System::instance()->targetEnvCommand( copyBashFilesCommand ); ++ if ( commandResult.getExitCode() ) ++ { ++ cError() << "copy bash config file failed" << commandResult.getExitCode(); ++ return commandResult.explainProcess( copyBashFilesCommand, std::chrono::seconds( 10 ) /* bogus timeout */ ); ++ } ++ return Calamares::JobResult::ok(); ++} ++ + static Calamares::JobResult + setUserGroups( const QString& loginName, const QStringList& groups ) + { +@@ -142,8 +153,7 @@ CreateUserJob::exec() + + m_status = tr( "Creating user %1…", "@status" ).arg( m_config->loginName() ); + emit progress( 0.5 ); +- auto useraddResult +- = createUser( m_config->loginName(), m_config->fullName(), m_config->userShell(), m_config->homeUMask() ); ++ auto useraddResult = createUser( m_config->loginName(), m_config->fullName(), m_config->userShell() ); + if ( !useraddResult ) + { + return useraddResult; +@@ -162,6 +172,7 @@ CreateUserJob::exec() + QString userGroup = QString( "%1:%2" ).arg( m_config->loginName() ).arg( m_config->loginName() ); + QString homeDir = QString( "/home/%1" ).arg( m_config->loginName() ); + auto commandResult = Calamares::System::instance()->targetEnvCommand( { "chown", "-R", userGroup, homeDir } ); ++ config_root_bash(m_config->loginName()); + if ( commandResult.getExitCode() ) + { + cError() << "chown failed" << commandResult.getExitCode(); +diff --git a/src/modules/users/SetPasswordJob.cpp b/src/modules/users/SetPasswordJob.cpp +index ad1cebcda..f0c8b0b71 100644 +--- a/src/modules/users/SetPasswordJob.cpp ++++ b/src/modules/users/SetPasswordJob.cpp +@@ -64,7 +64,7 @@ SetPasswordJob::make_salt( int length ) + cWarning() << "Entropy data for salt is low-quality."; + } + +- salt_string.insert( 0, "$y$" ); ++ salt_string.insert( 0, "$6$" ); + salt_string.append( '$' ); + return salt_string; + } +diff --git a/src/modules/users/TestPasswordJob.cpp b/src/modules/users/TestPasswordJob.cpp +index 18e9b8ec2..1409e37b6 100644 +--- a/src/modules/users/TestPasswordJob.cpp ++++ b/src/modules/users/TestPasswordJob.cpp +@@ -36,14 +36,14 @@ void + PasswordTests::testSalt() + { + QString s = SetPasswordJob::make_salt( 8 ); +- QCOMPARE( s.length(), 4 + 8 ); // 8 salt chars, plus $y$, plus trailing $ +- QVERIFY( s.startsWith( "$y$" ) ); ++ QCOMPARE( s.length(), 4 + 8 ); // 8 salt chars, plus $6$, plus trailing $ ++ QVERIFY( s.startsWith( "$6$" ) ); + QVERIFY( s.endsWith( '$' ) ); + qDebug() << "Obtained salt" << s; + + s = SetPasswordJob::make_salt( 11 ); + QCOMPARE( s.length(), 4 + 11 ); +- QVERIFY( s.startsWith( "$y$" ) ); ++ QVERIFY( s.startsWith( "$6$" ) ); + QVERIFY( s.endsWith( '$' ) ); + qDebug() << "Obtained salt" << s; + } +diff --git a/src/modules/users/Tests.cpp b/src/modules/users/Tests.cpp +index 76446064c..ba2fd2dab 100644 +--- a/src/modules/users/Tests.cpp ++++ b/src/modules/users/Tests.cpp +@@ -56,8 +56,6 @@ private Q_SLOTS: + + void testUserYAML_data(); + void testUserYAML(); +- void testUserUmask_data(); +- void testUserUmask(); + }; + + UserTests::UserTests() {} +@@ -513,75 +511,6 @@ UserTests::testUserYAML() + QCOMPARE( c.userShell(), shell ); + } + +-void +-UserTests::testUserUmask_data() +-{ +- QTest::addColumn< QString >( "filename" ); +- QTest::addColumn< int >( "permission" ); +- QTest::addColumn< int >( "umask" ); +- QTest::addColumn< QString >( "umask_string" ); +- +- QTest::newRow( "good " ) << "tests/8a-issue-2362.conf" << 0700 << 0077 << QStringLiteral( "077" ); +- QTest::newRow( "open " ) << "tests/8b-issue-2362.conf" << 0755 << 0022 << QStringLiteral( "022" ); +- QTest::newRow( "weird" ) << "tests/8c-issue-2362.conf" << 0126 << 0651 << QStringLiteral( "651" ); +- QTest::newRow( "rwxx " ) << "tests/8d-issue-2362.conf" << 0710 << 0067 << QStringLiteral( "067" ); +- QTest::newRow( "-wrd " ) << "tests/8e-issue-2362.conf" << 0214 << 0563 << QStringLiteral( "563" ); +- QTest::newRow( "bogus" ) << "tests/8f-issue-2362.conf" << -1 << -1 +- << QStringLiteral( "-01" ); // Bogus 3-character representation +- QTest::newRow( "good2" ) << "tests/8g-issue-2362.conf" << 0750 << 0027 << QStringLiteral( "027" ); +- QTest::newRow( "numrc" ) << "tests/8h-issue-2362.conf" << 0751 << 0026 << QStringLiteral( "026" ); +-} +- +-void +-UserTests::testUserUmask() +-{ +- static constexpr int no_permissions = -1; +- const QString old_shell = QStringLiteral( "/bin/ls" ); +- const QString new_shell = QStringLiteral( "/usr/bin/new" ); +- // nobody and root are always forbidden, even if not mentioned in the config, entries are alphabetical +- const QStringList forbidden { QStringLiteral( "me" ), +- QStringLiteral( "moi" ), +- QStringLiteral( "myself" ), +- QStringLiteral( "nobody" ), +- QStringLiteral( "root" ) }; +- Config c; +- c.setUserShell( old_shell ); +- QCOMPARE( c.homePermissions(), no_permissions ); +- QCOMPARE( c.homeUMask(), no_permissions ); +- +- QFETCH( QString, filename ); +- QFETCH( int, permission ); +- QFETCH( int, umask ); +- QFETCH( QString, umask_string ); +- +- // Checks that the test-data is valid +- if ( permission != -1 ) +- { +- QCOMPARE( permission & umask, 0 ); +- QCOMPARE( permission | umask, 0777 ); +- } +- +- QFileInfo fi( QString( "%1/%2" ).arg( BUILD_AS_TEST, filename ) ); +- QVERIFY( fi.exists() ); +- +- bool ok = false; +- const auto map = Calamares::YAML::load( fi, &ok ); +- QVERIFY( ok ); +- QVERIFY( map.count() > 0 ); +- +- QCOMPARE( c.userShell(), old_shell ); +- c.setConfigurationMap( map ); +- QCOMPARE( c.userShell(), new_shell ); +- +- QCOMPARE( c.homePermissions(), permission ); +- QCOMPARE( c.homeUMask(), umask ); +- // The QChar() is needed to disambiguate from the overload that takes a double +- QCOMPARE( QStringLiteral( "%1" ).arg( umask, 3, 8, QChar( '0' ) ), umask_string ); +- +- QCOMPARE( c.forbiddenLoginNames(), forbidden ); +-} +- +- + QTEST_GUILESS_MAIN( UserTests ) + + #include "utils/moc-warnings.h" diff --git a/src/modules/users/UsersPage.cpp b/src/modules/users/UsersPage.cpp -index 1ecc0eb..72fb3e0 100644 +index da235326c..a4edddfb0 100644 --- a/src/modules/users/UsersPage.cpp +++ b/src/modules/users/UsersPage.cpp -@@ -82,7 +82,7 @@ UsersPage::UsersPage( Config* config, QWidget* parent ) +@@ -22,7 +22,6 @@ + #include "GlobalStorage.h" + #include "JobQueue.h" + #include "Settings.h" +-#include "compat/CheckBox.h" + #include "utils/Gui.h" + #include "utils/Logger.h" + #include "utils/Retranslator.h" +@@ -32,6 +31,9 @@ + #include + #include + #include ++#include ++#include ++#include + + /** @brief Add an error message and pixmap to a label. */ + static inline void +@@ -83,6 +85,105 @@ UsersPage::UsersPage( Config* config, QWidget* parent ) , m_config( config ) { ui->setupUi( this ); -- + this->setContentsMargins(50,15,50,0); ++ ++ ++ //初始化参数 ++ userPassword=false; ++ userVertifyPassword=false; ++ rootPassword=false; ++ rootVertifyPassword=false; ++ ++ userButton=new QPushButton(); ++ userVertifyButton=new QPushButton(); ++ rootButton=new QPushButton(); ++ rootVertifyButton=new QPushButton(); ++ ++ hIcon = QIcon(imagePath + "password-hide.png"); ++ sIcon = QIcon(imagePath + "password-show.png"); ++ userButton->setIcon(hIcon); ++ userVertifyButton->setIcon(hIcon); ++ rootButton->setIcon(hIcon); ++ rootVertifyButton->setIcon(hIcon); ++ ++ userButton->setCursor(Qt::PointingHandCursor); ++ userButton->setStyleSheet("QPushButton:hover {background-color:transparent;border-style:outset;}"); ++ userButton->setWindowFlags(Qt::FramelessWindowHint); ++ userButton->setFlat(true); ++ ++ userVertifyButton->setCursor(Qt::PointingHandCursor); ++ userVertifyButton->setStyleSheet("QPushButton:hover {background-color:transparent;border-style:outset;}"); ++ userVertifyButton->setWindowFlags(Qt::FramelessWindowHint); ++ userVertifyButton->setFlat(true); ++ ++ rootButton->setCursor(Qt::PointingHandCursor); ++ rootButton->setStyleSheet("QPushButton:hover {background-color:transparent;border-style:outset;}"); ++ rootButton->setWindowFlags(Qt::FramelessWindowHint); ++ rootButton->setFlat(true); ++ ++ rootVertifyButton->setCursor(Qt::PointingHandCursor); ++ rootVertifyButton->setStyleSheet("QPushButton:hover {background-color:transparent;border-style:outset;}"); ++ rootVertifyButton->setWindowFlags(Qt::FramelessWindowHint); ++ rootVertifyButton->setFlat(true); ++ ++ QWidgetAction* userPasswordAction = new QWidgetAction(ui->textBoxUserPassword); ++ QWidgetAction* userVerifiedPasswordAction = new QWidgetAction(ui->textBoxUserVerifiedPassword); ++ QWidgetAction* rootPasswordAction = new QWidgetAction(ui->textBoxRootPassword); ++ QWidgetAction* rootVerifiedPasswordAction = new QWidgetAction(ui->textBoxVerifiedRootPassword); ++ ++ userPasswordAction->setDefaultWidget(userButton); ++ ui->textBoxUserPassword->addAction(userPasswordAction,QLineEdit::TrailingPosition); ++ userVerifiedPasswordAction->setDefaultWidget(userVertifyButton); ++ ui->textBoxUserVerifiedPassword->addAction(userVerifiedPasswordAction,QLineEdit::TrailingPosition); ++ rootPasswordAction->setDefaultWidget(rootButton); ++ ui->textBoxRootPassword->addAction(rootPasswordAction,QLineEdit::TrailingPosition); ++ rootVerifiedPasswordAction->setDefaultWidget(rootVertifyButton); ++ ui->textBoxVerifiedRootPassword->addAction(rootVerifiedPasswordAction,QLineEdit::TrailingPosition); ++ ++ connect( ++ userButton, ++ &QPushButton::clicked, ++ [this] ( ) { ++ userPassword =! userPassword; ++ if(userPassword){ ++ userButton->setIcon(sIcon); ++ ui->textBoxUserPassword->setEchoMode(QLineEdit::Normal); ++ } else { ++ userButton->setIcon(hIcon); ++ ui->textBoxUserPassword->setEchoMode(QLineEdit::Password); ++ } ++ }); ++ connect(userVertifyButton,&QPushButton::clicked, [this](){ ++ userVertifyPassword =! userVertifyPassword; ++ if(userVertifyPassword){ ++ userVertifyButton->setIcon(sIcon); ++ ui->textBoxUserVerifiedPassword->setEchoMode(QLineEdit::Normal); ++ } else { ++ userVertifyButton->setIcon(hIcon); ++ ui->textBoxUserVerifiedPassword->setEchoMode(QLineEdit::Password); ++ } ++ }); ++ connect(rootButton,&QPushButton::clicked, [this](){ ++ rootPassword =! rootPassword; ++ if(rootPassword){ ++ rootButton->setIcon(sIcon); ++ ui->textBoxRootPassword->setEchoMode(QLineEdit::Normal); ++ } else { ++ rootButton->setIcon(hIcon); ++ ui->textBoxRootPassword->setEchoMode(QLineEdit::Password); ++ } ++ }); ++ connect(rootVertifyButton,&QPushButton::clicked, [this](){ ++ rootVertifyPassword =! rootVertifyPassword; ++ if(rootVertifyPassword){ ++ rootVertifyButton->setIcon(sIcon); ++ ui->textBoxVerifiedRootPassword->setEchoMode(QLineEdit::Normal); ++ } else { ++ rootVertifyButton->setIcon(hIcon); ++ ui->textBoxVerifiedRootPassword->setEchoMode(QLineEdit::Password); ++ } ++ }); ++ + // Connect signals and slots ui->textBoxUserPassword->setText( config->userPassword() ); - connect( ui->textBoxUserPassword, &QLineEdit::textChanged, config, &Config::setUserPassword ); +@@ -138,10 +239,9 @@ UsersPage::UsersPage( Config* config, QWidget* parent ) + + ui->checkBoxDoAutoLogin->setChecked( m_config->doAutoLogin() ); + connect( ui->checkBoxDoAutoLogin, +- Calamares::checkBoxStateChangedSignal, ++ &QCheckBox::stateChanged, + this, +- [ this ]( Calamares::checkBoxStateType checked ) +- { m_config->setAutoLogin( checked != Calamares::checkBoxUncheckedValue ); } ); ++ [ this ]( int checked ) { m_config->setAutoLogin( checked != Qt::Unchecked ); } ); + connect( config, &Config::autoLoginChanged, ui->checkBoxDoAutoLogin, &QCheckBox::setChecked ); + + ui->checkBoxReusePassword->setVisible( m_config->writeRootPassword() ); +@@ -149,7 +249,7 @@ UsersPage::UsersPage( Config* config, QWidget* parent ) + if ( m_config->writeRootPassword() ) + { + connect( config, &Config::reuseUserPasswordForRootChanged, ui->checkBoxReusePassword, &QCheckBox::setChecked ); +- connect( ui->checkBoxReusePassword, Calamares::checkBoxStateChangedSignal, this, &UsersPage::onReuseUserPasswordChanged ); ++ connect( ui->checkBoxReusePassword, &QCheckBox::stateChanged, this, &UsersPage::onReuseUserPasswordChanged ); + } + + ui->checkBoxRequireStrongPassword->setVisible( m_config->permitWeakPasswords() ); +@@ -157,7 +257,7 @@ UsersPage::UsersPage( Config* config, QWidget* parent ) + if ( m_config->permitWeakPasswords() ) + { + connect( ui->checkBoxRequireStrongPassword, +- Calamares::checkBoxStateChangedSignal, ++ &QCheckBox::stateChanged, + this, + [ this ]( int checked ) { m_config->setRequireStrongPasswords( checked != Qt::Unchecked ); } ); + connect( +diff --git a/src/modules/users/UsersPage.h b/src/modules/users/UsersPage.h +index 379176ab2..fcee0f09b 100644 +--- a/src/modules/users/UsersPage.h ++++ b/src/modules/users/UsersPage.h +@@ -17,6 +17,10 @@ + #define USERSPAGE_H + + #include ++#include ++#include ++#include ++ + + class Config; + +@@ -51,6 +55,17 @@ private: + + Ui::Page_UserSetup* ui; + Config* m_config; ++ bool userPassword; ++ bool userVertifyPassword; ++ bool rootPassword; ++ bool rootVertifyPassword; ++ QIcon hIcon; ++ QIcon sIcon; ++ QPushButton* userButton; ++ QPushButton* userVertifyButton; ++ QPushButton* rootButton; ++ QPushButton* rootVertifyButton; ++ QString imagePath="/usr/share/calamares/branding/default/"; + }; + + #endif // USERSPAGE_H diff --git a/src/modules/users/page_usersetup.bak.ui b/src/modules/users/page_usersetup.bak.ui new file mode 100644 -index 0000000..f808c89 +index 000000000..f808c8943 --- /dev/null +++ b/src/modules/users/page_usersetup.bak.ui @@ -0,0 +1,710 @@ @@ -2041,7 +5676,7 @@ index 0000000..f808c89 + + diff --git a/src/modules/users/page_usersetup.ui b/src/modules/users/page_usersetup.ui -index 6e6e542..2a5ccd2 100644 +index 6e6e5423e..2a5ccd298 100644 --- a/src/modules/users/page_usersetup.ui +++ b/src/modules/users/page_usersetup.ui @@ -21,10 +21,10 @@ SPDX-License-Identifier: GPL-3.0-or-later @@ -2379,7 +6014,7 @@ index 6e6e542..2a5ccd2 100644 diff --git a/src/modules/users/users.conf b/src/modules/users/users.conf -index e6910bc..57a82dd 100644 +index d2624bf4d..57a82ddc9 100644 --- a/src/modules/users/users.conf +++ b/src/modules/users/users.conf @@ -88,7 +88,7 @@ setRootPassword: true @@ -2391,8 +6026,42 @@ index e6910bc..57a82dd 100644 ### PASSWORDS AND LOGIN +@@ -214,21 +214,9 @@ allowWeakPasswordsDefault: false + # contains "root" and "nobody", but may be extended to list other special + # names for a given distro (eg. "video", or "mysql" might not be a valid + # end-user login name). +-# - *home_permissions* Home directory of the user is given **approximately** +-# this set of permissions. If not set, there is no default and no +-# permission-setting is done (uses defaults of `useradd` in the target). +-# A umask is computed from these permissions +-# and passed to `useradd`. +-# +-# You may write permissions as: +-# - write "NNN" (three octal digits) or +-# - write "oNNN" (small 'o' and three octal digits) or +-# - write "rwxrwxrwx" (like the output of ls, with a - for unset bits) +-# The following permissions mean the same thing: "o750", "rwxr-x---" . + user: + shell: /bin/bash + forbidden_names: [ root ] +- home_permissions: "o700" + + + # Hostname settings +diff --git a/src/modules/users/users.schema.yaml b/src/modules/users/users.schema.yaml +index e0647e497..c751a5226 100644 +--- a/src/modules/users/users.schema.yaml ++++ b/src/modules/users/users.schema.yaml +@@ -13,7 +13,6 @@ properties: + # User shell, should be path to /bin/sh or so + shell: { type: string } + forbidden_names: { type: array, items: { type: string } } +- home_permissions: { type: string } + # Group settings + defaultGroups: + type: array diff --git a/src/modules/welcome/Config.cpp b/src/modules/welcome/Config.cpp -index 2bce564..7e50dc6 100644 +index ad5e2d8bc..7e50dc6c9 100644 --- a/src/modules/welcome/Config.cpp +++ b/src/modules/welcome/Config.cpp @@ -77,8 +77,7 @@ Config::retranslate() @@ -2405,8 +6074,39 @@ index 2bce564..7e50dc6 100644 .arg( branding ? branding->productName() : QString() ); } +@@ -116,18 +115,6 @@ Config::languageIcon() const + return m_languageIcon; + } + +-static bool +-languageAndTerritoryMatch( const QLocale& a, const QLocale& b ) +-{ +- const bool languageMatch = a.language() == b.language(); +-#if QT_VERSION < QT_VERSION_CHECK( 6, 6, 0 ) +- const bool placeMatch = a.country() == b.country(); +-#else +- const bool placeMatch = a.territory() == b.territory(); +-#endif +- return languageMatch && placeMatch; +-} +- + void + Config::initLanguages() + { +@@ -143,8 +130,9 @@ Config::initLanguages() + QLocale defaultLocale = defaultTranslation.locale(); + + cDebug() << "Trying to match locale" << defaultLocale; +- matchedLocaleIndex = m_languages->find( [ &defaultLocale ]( const QLocale& x ) +- { return languageAndTerritoryMatch( defaultLocale, x ); } ); ++ matchedLocaleIndex = m_languages->find( ++ [ & ]( const QLocale& x ) ++ { return x.language() == defaultLocale.language() && x.country() == defaultLocale.country(); } ); + + if ( matchedLocaleIndex < 0 ) + { diff --git a/src/modules/welcome/WelcomePage.cpp b/src/modules/welcome/WelcomePage.cpp -index 30e3d6b..88f38c2 100644 +index 30e3d6b21..88f38c256 100644 --- a/src/modules/welcome/WelcomePage.cpp +++ b/src/modules/welcome/WelcomePage.cpp @@ -44,10 +44,10 @@ WelcomePage::WelcomePage( Config* config, QWidget* parent ) @@ -2599,7 +6299,7 @@ index 30e3d6b..88f38c2 100644 void diff --git a/src/modules/welcome/WelcomePage.ui b/src/modules/welcome/WelcomePage.ui -index 0e3dcb0..b25b4e0 100644 +index 0e3dcb09c..b25b4e0c2 100644 --- a/src/modules/welcome/WelcomePage.ui +++ b/src/modules/welcome/WelcomePage.ui @@ -17,6 +17,9 @@ SPDX-License-Identifier: GPL-3.0-or-later @@ -2711,8 +6411,47 @@ index 0e3dcb0..b25b4e0 100644 +diff --git a/src/modules/welcome/checker/CheckerContainer.cpp b/src/modules/welcome/checker/CheckerContainer.cpp +index 4b5698700..4e1ad6db5 100644 +--- a/src/modules/welcome/checker/CheckerContainer.cpp ++++ b/src/modules/welcome/checker/CheckerContainer.cpp +@@ -35,7 +35,7 @@ CheckerContainer::CheckerContainer( Config* config, QWidget* parent ) + + mainLayout->addWidget( m_waitingWidget ); + CALAMARES_RETRANSLATE( if ( m_waitingWidget ) +- m_waitingWidget->setText( tr( "Gathering system information…" ) ); ); ++ m_waitingWidget->setText( tr( "Gathering system information..." ) ); ); + } + + CheckerContainer::~CheckerContainer() +diff --git a/src/modules/welcome/checker/GeneralRequirements.cpp b/src/modules/welcome/checker/GeneralRequirements.cpp +index 693f81248..a58f3df83 100644 +--- a/src/modules/welcome/checker/GeneralRequirements.cpp ++++ b/src/modules/welcome/checker/GeneralRequirements.cpp +@@ -288,7 +288,7 @@ getCheckInternetUrls( const QVariantMap& configurationMap ) + if ( !checkInternetSetting.isEmpty() ) + { + QVector< QUrl > urls; +- for ( const auto& urlString : std::as_const( checkInternetSetting ) ) ++ for ( const auto& urlString : qAsConst( checkInternetSetting ) ) + { + QUrl url( urlString.trimmed() ); + if ( url.isValid() ) +diff --git a/src/modules/welcome/checker/ResultDelegate.cpp b/src/modules/welcome/checker/ResultDelegate.cpp +index ae74a36ed..19f906a0d 100644 +--- a/src/modules/welcome/checker/ResultDelegate.cpp ++++ b/src/modules/welcome/checker/ResultDelegate.cpp +@@ -35,7 +35,7 @@ paintRequirement( QPainter* painter, const QStyleOptionViewItem& option, const Q + + Calamares::ImageType statusImage = Calamares::StatusOk; + +- painter->setPen( option.palette.text().color() ); ++ painter->setPen( Qt::black ); + if ( index.data( Calamares::RequirementsModel::Satisfied ).toBool() ) + { + painter->fillRect( textRect, option.palette.window().color() ); diff --git a/src/modules/welcome/checker/ResultsListWidget.cpp b/src/modules/welcome/checker/ResultsListWidget.cpp -index 3f70c61..e191b26 100644 +index 92e6668a5..e191b26ef 100644 --- a/src/modules/welcome/checker/ResultsListWidget.cpp +++ b/src/modules/welcome/checker/ResultsListWidget.cpp @@ -26,7 +26,8 @@ @@ -2725,6 +6464,15 @@ index 3f70c61..e191b26 100644 ResultsListWidget::ResultsListWidget( Config* config, QWidget* parent ) : QWidget( parent ) , m_config( config ) +@@ -44,7 +45,7 @@ ResultsListWidget::ResultsListWidget( Config* config, QWidget* parent ) + m_explanation->setObjectName( "resultsExplanation" ); + explanationLayout->addWidget( m_explanation ); + m_countdown = new CountdownWaitingWidget; +- m_countdown->setToolTip( tr( "Checking requirements again in a few seconds…" ) ); ++ m_countdown->setToolTip( tr( "Checking requirements again in a few seconds ..." ) ); + m_countdown->start(); + explanationLayout->addWidget( m_countdown ); + @@ -91,21 +92,28 @@ ResultsListWidget::requirementsComplete() if ( !Calamares::Branding::instance()->imagePath( Calamares::Branding::ProductWelcome ).isEmpty() ) @@ -2760,7 +6508,7 @@ index 3f70c61..e191b26 100644 imageLabel->setContentsMargins( 4, Calamares::defaultFontHeight() * 3 / 4, 4, 4 ); diff --git a/src/modules/welcome/welcome.conf b/src/modules/welcome/welcome.conf -index b988eb2..15e08ce 100644 +index b988eb2ff..15e08ce7b 100644 --- a/src/modules/welcome/welcome.conf +++ b/src/modules/welcome/welcome.conf @@ -81,9 +81,9 @@ requirements: @@ -2785,24 +6533,519 @@ index b988eb2..15e08ce 100644 # GeoIP checking diff --git a/src/modules/welcome/welcome.qrc b/src/modules/welcome/welcome.qrc -index f270ee5..8806101 100644 +index f270ee591..7182a4db6 100644 --- a/src/modules/welcome/welcome.qrc +++ b/src/modules/welcome/welcome.qrc -@@ -1,6 +1,8 @@ +@@ -1,6 +1,7 @@ - - language-icon-128px.png - language-icon-48px.png - + -+ + WelcomePage.cpp + language-icon-128px.png + language-icon-48px.png + +diff --git a/src/modules/welcomeq/img/squid.png b/src/modules/welcomeq/img/squid.png +index 452e4450c56c10cda33dcc9c5d03753ace458862..4a7ac244e8d16f4d0252014c3e4e8556d246b6d5 100644 +GIT binary patch +literal 17377 +zcmaHTWmH>D)NXNiZSg?S;_fcR9g4fVJH-hOMT-?H?(P=c-7Q#gce{DNyYA2XW#z1_ +zmCTvhGiPSo^XveX6{XRTzaW45^a<^|jD+f^Pf((eivSTG@(ugS{Tk#0)>Z7gIwIud +zhiDf0=@a>$d +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 +zhlwKf@eP-uMYF7Vi18yrqi~lV<w(NwZS9 +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 +z12$*iF# +zlw1h0k?~PL&jM;Wy9-YO_Yltn3y68MLj=R%vwL=~+jW4R4teHhjzF9btkWNQET@Ca +zwhbi%@|YHy*5lRf%G4M~*U57_yoK^pB&*Y$<>PTB6|1Kfef +zM<^tUmp%FIxg!;*CQ%iR*X4EsZ3<|~ngP@9GW+8UGSKiIsMGHwCLxX558nh%dYQ3H +z5@OY{d#wE(D=$jOQ6Rs +z-k-RK`G$Di9#)Q{RU`BR7lRpefi2ZI?wc5T(bEb~a3Ih)BLKoLt#|a8TJ-`7F%~fJ{UV6gVg{QRTMg_-Q +zNT?MY%#!Uag6A+gOImNcNB=fAU?06EdPi4WMqHnfF9BQDoV~iG_SasAhsY$eu%g0* +ztVk$wZ=43Y{Us1VICp7%(}|c{L9}I0XC+N +z6xQD3T%`ksGrGwv>tH-m>k<@n)u>-4yyXp03fWS+auxV|17xC)3b2os2VR@DW^o_N +z*_VT*izBO`Tgw{cR>De>Dc9n4dg-FK%FRDV!{YRshtTI(G_ZL5oDZsIY5Bmbs}3Jc +zDG+yPY$K4ZslFuzB_skGqO +z(npiIAj1`7=HVZA%jG|Ypi_vkqJ&6pKLzBWkl +zndrIOCJ{X7(PlS)iP*2}ULWA(n|=LuPW-UN=7P~Qt0SQfKuD+a%8dEHL&Rj+VdB|5z@G=>v#H(lbM5Gz +z!qGJ~7{Uha)%dn*MY>rEpy-JTBt-~c{yx77#AZ(ovwXJi||$) +z#F5thRdk4Gi&_zkp{xnx5MoIU_ce+qt^a^93mF@AJgl^S)$XV>w2Hxzz?q-%sbq#$ +z9+rSaC#te2QcK1MQg +zBw_1uC$og%*lt!Mt=fV^Gt{)+T(=4@qS4c1+I8X#TmKFpN2DMTA~=`8gfhevpQ9ly +z`~X@G-xkpw+?YwDBxEpkYM3LxI+M#C#@qkdPcp>HVkmWJYEqPNY6xR=e5GSU=mO1{ +z;;5S`q|5D`dRb;Yx_e?CJ+go+Y(z4`ujr|RqoD(h9q;OjWpdx}#ixX&p9fG1nF<+v +z{CC`i`+$5f-035>h7A=jtj;Em%y(J8ZF{t6q&iN-_qc`7_#?Kr^><l9-m9>1yvW +zqFcyB%^0IC#X#EB5UDxJNWH9G3Z~dD`(I?vgeU$T8CgrWv<#(Lx=5vOAL{+HjAwAT +zpiXKbF~hrI4WT=ZBHGBS)D4Ks7S0H<%{komw?4-1ZO>nC@n_7@lLPrTN4}iTx@+e{ +z73@H|r!6btt~yeCa6PRzq+a7DeGMA<&eJd0MUG{&&4oRwuIIwHiA5Q(pR#QbHooNf +z4O-&stWR;Lsv+3v-YBcei@@QQ8|1zfRD&eP +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 +zEPr;H1A)Dk-J?A?FW*Us^3oYaC +zP!{PQ`|@cJCnA=jC7#KgH72bI_ML^-j^P_W>=6I1ozI~IUzJZ9Xw@?xThtD0wvt~a +zqJn}$BSZ3pT-@~zQ+F5~T4D@^8p@o0JFH6j3{M%qO=ya~%u-QHyHDZFl8h8S(t8o| +z=9kA{LE+yN4`iPrcTqRl(8VlX2p=B9R6AD;69?Y|Wmmsk*j8&OZuZn$44z5R?W5d_=Rt(qrQP!mz^9ZFKx-@n%*MYxRG +z&pz_bN|M%Ge|$Vq;s2%-z1D@}tn-=`Hkc&V39t$mJ1{>B1gpgmdu7Zgs{AFrx5%)& +zKoRQ4A)^jZfN-6jLQRceSW&5!bb`44VvCWbF}%;k&vd=fP|bRD4gi=baFwEu(qwX9 +z;Ug~I@XfBP-}gEGYp*aY65%IaCclp@!p#@xl`ho%i_Y0|?l{K>6pH{DtcJ}k0b`80S5>-j +zW3v8BO^4Tk8R%XA-9n|T-mx>9#hoY|-7p!{af22fWl1^+EItt{FtYvY!R2^OiPgvK +z57p10_Axh)?#sdmq%8qcjOjkiCITtiHROJ-{+>>1oz)@F@}riDknMg2F`sBX#;2pb!WBPwj +z5XbZ$o27jV+Eg%dKy*32X0{uX$>#^2K-3ZRQxMd(_*6(%^1m`ha-p`*&O}l-{Z|;e`B8$lwl{ +zih2#ISe0Jn=(0x~kwbZJvcU_0p>G^XB222s3Bw +zd*+G;tVzt^=GIs=VUKLL&I5gkRS)nKRi^HQ9)!?@jLSCUep*!R6fmWR=iFtyW|;7= +zVHVyhku(|?r*~jX{TGesdEY1q^{cNjK&*pP*3O^E*1$8?P5+I(1<071Zj4@nf9YcB +zemk7@@1ysZe3sHL1#<>fJvcA{k3fX~yWK1#HQ&E8poB)@1xKrhJ91}9`!}4n(6A>K +zV|TD!G7DdBPY0$fphWlJw41%-gW>k$@>2nGjI#XU-|x-XiD#Tyn$mLiQmeQ%>BBnm`5FVEl`n@M?$}wqJ}vQnFElNW#L?9>DKRi;WEp=11{z=uiJ_tyM5(8~z9-OxO)ThEHUeG3_q>NRIc>0~)I +z)IPF06Y2X(8jr0@V)|y!J>$IaGN53miw)uL!`-nJ6AC|ZP72%#x`eDGoiP(1<9oPO +zo!(_^IKtJsZJtU|B3c$?2xW49f-6dgM9ZUzWF%B+KBPmuG>P|jk@Y-k9;Ip0H!#12 +zUOvJ2URZ8l!4$^Ds*dCTMRG?`)eEcd(7tdCgBZD#?>xs;r?NPtqzEIQgXK9f4cGcs +zb*s%L&@OJZdR_Vb(td|E5TvFy6!KI(-O8boJ+d8=`Ujmt()K6;3ELb3uW0RE=^Kt= +zCV&@Em}T@~HuaG$(fV +zC#{c*0{2dvyCpt03(OGM)ml12E&UkhCt473L@ECaChH$T;~cW#B81c88jvRqZ-Z7P +zvlb7+wx7fe?~ni8`?~MA5DaY4UJ?`}Czb|e)yGpE9 +zGkvwR(nHL#f#Q&J28W^x+*ya`@Hx;`#Yh%(Y-bl^aV2 +zfCVw6Z}i0%YvLAEWUp`#&ht1H5jxSFis2{|G7IapQkSFfKNX;dVbpvpa!xL|%usDe +zs6R~l!g3E{!wiSnyj%Vof!7#P3?s!z*Z%4sT>v-uGWc0I0Dgi5uzD1Ub0m_rB7PbC +z*^m*{1_F)2=ROk`cekg_P`>TKmm#^=<7!DMEITciq^_uXgl*X7hZ00zv@~R&XEGI> +zwB;sSEh$9)`bnqNd($&!4N<@$FWsY;o0O^GQ7bM;eNg3p2hzAM&=|$s@?Qxv7p8S*V@))1-xLe^zIBvdG5TLBuiLM#FxncS!1UxJ;U%*nbhbF_h1gK-f7P^RA%a* +zQVNjh*R{wcofvUvoWg706s8Z%sZpZK@;brdE$T{i|HZYBS}H~gGv_P1Qfep-P4FAN +zFodd^HKFF=MQT~s@5%zp)t)_J?Mv(BZwYR3CG?jT0Nahk+V*TiYURt!*uyl +ze*3@gmIDnEK(9aw0)ma59zCJdR^W>xWmsbd|0`l5V4JW^FQr!eU+Uie +z_n%^-tu2Il4UCj<#<(@PI#Jv<1tC}KH2=WG{kSU$K4UC?ufaBR5YbPZ97Vo0{bzW=+ph+uJEtlncpYKz+iLS5XM#!clK0*&hhoh +z-<@c+PMy;>Ug0a%JJ8WDUk*}A@!Lzo4E(NM*xuKQZNvSAqkwr3_#~z^(g@otePy5; +z8%MmK1t0CMf +z7ZGocpzmQ` +zoanGw^@q((B)~^CDgo9^DQv_H$E5w8M&` +zb)S+Vrbg9jL?M*{*1IU9x=}ujmv0x91?bA{h}7clxyLUy%LBKQs#kxoC%lZl+zrgv +zFT6-9O4kA16}U>`I@Px@%k9M%7ApyGdNZnOKLeKKO!?(fbQ#@)RwY<|Oa!=Ew=6^& +zeqB&6TMXZ*U@p!u+*22jcV#a`-FZMh6m!Hm(V9Rh`oDM20MaY!NL}sIQkGb87B(}> +z?#pR{`dGRWZv-C)Hw8IKb3xqN0d}cxsb4VIxhXoD-Tc@s58E$em+u6Ux0fz00BG1S@IyRXT)qN@ZQ7C)EHZHH|r(q9jh%Z?~@Y+^!MU;H;Z +z-e+KwTl+d>pe^k`U+#%a`nHxlf;uLRt)WlWp +z;#w(Q-+t2Q(3oJhlN3sATXE>OVEY$T)QRHN9j7&4p4v7q+u6S}RL*13wBzKMa%fQE +zu_EK^rr*C~F^xL)?(^B=ymYOcWcKToF9XW{pLeV>g1&gJTGAA^op?-qqG-m1KR>?R +zc7D*_5Z1M8OE|G!etT!R7c4q6?J2&>7O^!aTJQ(nAJ0c2EpWD& +z#qNinV9lRN#G2dntM)933wBPjbk37)&@;j@jDwe)_(KhFp^uErie`nO#hta(> +z#V4X)7_u8P!u#(~IT=orzcb%GC3Drq_2M^lo3*@38Q67x3q|Bw>$Gfw^Zv3ieO!5H +zhhd$x8d}~Q)wXcWqCTs;dlkE$+K#yBBG}m02)oanKe5CRJSTJ$TQaZr0}-ntjcS2A +z`N$`vlQTJQUie$ZewU(WoEe%qRe6P0qq*W8;0OXj{Plg;#v78S30}ylCxt>~Upj2i +z#1arv^FMJ;{BfMs(_FA1hrM-{|D`$S=>Dk4htk)`Fax-09T3R9(9Zix>9m5|UA;K4 +zH#bimys+NS^lH1NX5Jbu%>Vk#7hk!kaR&SDIjd{>)cf8@oN0ERUHy6OKo+-Ghjj6% +zL{l$3t${UQxg<2*_tG*2Ury;SRu$14(tQ(se5HT`*LiVU&X8V}eN~lW +zid*fYZ;>ljug!&f=hk<@p^5#kUcvNy0t^bUL@SZDpKZdAik`X8{pyyF=MaS^!32z^ +z7EKG@>n!i=d<_3JI!o4%P4A2zAhW@n9=pbg6-3bw^8O3KD=GU?(r}{(e)x3xP&{zg +zR0z&%T^M{3mS>Oo=_Bb>i=A$5Q*^9iSP58;X_icS(p|P@?Kr!y5s1hMuca#0fOY)C +z69KQ>i~a*2g!Pp(%UO76)~m%R&drfjVj2Q6xa5K+VJ6 +z*2&u#e|HaP-1AB;(3(rV=6=Y>dX42r(UNvd|J%$M#B9XJo#68*lRb2n$LCBmsI*s8 +zJb6PXmuX|LO!N0~!*3bZc0#|9AUv;VLP +z7PJ;RT?}+D+Pl*3N~FBln`Usf;K^=t7&3nUO%TLR;#;=vNOY5R;VAU4h?n6zXTkUp +zsC?1o80}N_oq>X9oX*%$Wqp;eWr=vBy05TprD@%09Ygnx0sfSjobua)SJv^liet(? +zobJ~TN65xa6QTIg?_J)RQ#y&&Fy<2%(OStbU^?)HLUm%@;<$4`ZPVFCcex0{y2M!! +z61WqXR$I6;IJR|Ln798Lz1^>|SoE9kZc%%&Q!V+5MuV7JjlNQ6?NNRShnjcd>aMWC +zHVV^PeEHKSn4kasF90HZih!ai{&&aQ)U2ZOSlVvSC>P&SVTwIF_w%Bz&1*aN?8~-!Wy0IH98M +z6yjpkH_4J#)n~OfR3EJ_f2a*O*E2S#JNnaC7cbhD-)A_sA;MGHcKnpGzx#IFg?X3d +zz^`~Gn6N3SytVn`So_SAOP4o=s{EU8EpXcnXb?YTN@8JS8jIOWh2k4;nb~4jf;hPc +z_+=JA@ICh=|2#SfXFj#s3FG}uKT;d~e*%I6ef?poOW116&K~A>Hg}lm+gQ~P{|qGY +zGw>`F^Xi9Kjh|qWxvjibEgxs;ieJEgP`e!}$-*?arLd6rQsPa_UnIp$BGCvD1ix)8 +z#8S9#n(q@<>nxoFeu25ArJs&x@h?2tgtF(0pcnfKbsnFj`7fC;bE&H_J@e6nnNN|p +zk@*$EH?aVnpjsnFk~C(B9Eir7So*!cAcgl_AAnz=IWL(oC-Cp}vI=`zWHhr!SdBoQJRv3FI3&)8D +zl^Jvx_EfQNqeT$>7j!dBHYf1gyRfu7LO}I1eaR-Bzm{|FsdE2?x|V=sgX*dHE*!me +z)}xy8SNiPmY}a^v4(Cf&d9HvzuA8Wr`nF!acu$f<|0!oNy?2xD}H{s +z$>*-8F(s=!E_@w(nVX>0!@XR5U#n?gK_i=MU8_A`t>;NrS@u*SI2Tcw>o!-xpRMlU +z@2(y`R^@fndJSQEne0nj%QKXm1A}DjL%v2;xpYNi)(8-=AoF_~*7d%t$!`{-i +z4YkaHsL4Ef$@Vpq7XU=Lg*m9b1NOBD!qt82&ggiqDZeQRRmO|6RLn9 +zMGz2a2I&Zf8X(|5{$4*H;K^E9XU~;6vu9s3d(LDhv8Kkl=jeIp0RT9sucu`W03hlR +z1i)d`i(O!uJM{t$($KerQ(qBqH#}9Q^Vj~7d2f!uynjDv`1ix(nX#3V-}C>?dEr>@ +z9|$!h22gGzR|N60?cBbERn-W|)m>5b0xUnCtN}x_aN`)U{L+lvfVvw}8i?sbxdG5r +z=RN=~*p&ie(ZUHp`0oK{lTu>?7TmQ~3%X{29gG)as^@#xk1P +zMyU$VorzFC*;*i>rF!Atlge}tOT +z7p4@tOPo#K-Dw{Xgw;z|CpfNB0j4IG$I36>DYFusq7C^2M!pHEtm#k$^8};a)NSHc +z<3fqFg9=R&`+(32Jm1m}0#@wi885oE^Y +zs-GbIh2|QjWEs`qetUrT&MgrZQ8z%qoSHB4e}8vP{W;=`S)w=NDs}B-`Fm7A;B6)x +z!Ep-P-uOFj$R_tdc6u@3;h$|KY0OGl%+B~y$Fk6PToXX-E(mOQ*; +z3KRjipn#phT@tg=H}k%aJ=WSz0YT9UM6T}d&|(%s`xof1Eg%aWl>#CgN>b5LXfZnh +zEf1>yhf;OPdTLa(A4=rMsQ=i)stb>Zy8)`wfu!bRHbUO;Wd+w$kL|eNp27m+Jn85k +zh~~{|e>dwFbd5O+?MF4xxAzyr`|L2{dq#^+H3hwC&3N!&#W8&UBvR?`=tDx1LeyT~ +ziyio9H?X}XY(d6?IbuKofwv0dkEwB7UTt;kr7F#t=P!@hFyf@M(7pfspEl$dBi4J+ +z_Cc@X82S0Xx`6c&1ih=1{m|>tjQr>{UvMlUYRvtS8`$68Dfr +ztc2G0ELmsq;HC6jlgLDJZ=*g87BOyXbl +z&7N%?P3WlBgb)=)vV{GMq6=)^g!J(Bz-;uJB&wP2#|_!&DI#qrYn05lglvEtoq*4w +zbJL~>7Gyj7%4c8h16*|M46$C{*$9Q7-roW51ur0__uK2SGk|p@xiWG^F0lU#Qsw0H +zTebQ%=C+s_+rK|@K>e&#ZP0jh%sQ!vU7ZzenAP;xr%fB&x@nPVMT%bx88R(@7=hBJ +zI)GGbhM1*Tk{I4Of!zQpk#gabU=qVuU#dXI?tS|(C27UM&~C!cwGTcn~baLpFHIJ?at$fHZ00loS`X*@du6HP6Z1dXzxbkS(P8i~vMW +z43mWxA^PcgDix>te*EnqeFI12TBZBvGy7OI9knJZ@Cd>)4(-NVuVU2M46&a8bK`1P +zumdr9rj3~ba;gX#!1pXmcDxcg%76`p! +za&w0dqo62>VSOeJ<^tnJ<7_`e-|=IH54+XCEClKn_xR_&RLdvmyQ>&peTsUb`YH^d +zF>O8tgQ$Upc_l%mCC_kb7F!OK*(CLDF}6ZD|4aPSA~?+ +zN6p5e_Uu~f92$`E0{mc4CW_(J-`ZiUpRnE`0V%tePh&ey_%e +zTDv{fEwH1xpiex)efQG%Fu(b$w=o>R>p!ixRw1u-Wh5T@!G=2x_O=Yq> +zjj9x)uQJ^~uS@hRFkvQUaCscRwV@htMPdc|p)+$~ +zMk1s`%Zne3J8I;=??JhNQI3yvqE%~ed!LaXUNPalbNtV^)+7qhtk^{xvPGRlL|jdt +zx$vil$|gRa+fr%g;x&9XLF>UbF@yQ{kAG+z(o|`uVt3kSjGBG(y5ZB;n6?I>o|-Jh +ze)Mr-2Gz8#2VXVxDe?})jIsZ67N@BkkTukQ0<_*OwPGiiW!a*1*X%XzfldYbipFYe +zyJV5vuXI+D3}*`&6bHZy`o#f=?zdHA?||V?jhs(3gK8dJgA68_fD)HzZh@$hXL_&BCRNxAFO3D=%pc&S3bTYUiYC#$Qm4!=kKN0%+^&zvqoF>IhOLCy!q*ib(Hxv-gVagp#D2OQqX_$|Ktrc$Hld(nBhT-MAR~GM55%wkT2RVrm7e3-9zggJS2S +zs3Dn3wYb$w&F2nkl6I%%##}DY_(c;-2%3uRFNZ`IXjda45o +zQ_MiSDd{T_&BV4Kx?M8%>*$1bpz7A4Z8hchA%mv2=aILK$OcGWIqdp#8d~V6c+*?W +zNuL8B$<&ACGX{4943fdqta$v5?2>3HSgZA}s;Ik*aSR#61L0?jsi+tUR60~}6<&UY +z=cAIz_PC;=Z)rC%Rtgc6*8MLSbed-DW6JEEK$qFSJX_xw`S5kU+LM#5^Rp$rtk~I&9x9%Hf`C +zKHO;5H{oFiv6PoQ)8mg1!+;X0V_j!@M&J9xOm1bv^Ne4>ELm7F`gWxTXT8`p`-L&F +z4@}rT#)OWD1w +zYAdSgOkfNF;Rie02bCkZW}`o-+XFG4($OEDo=SgU!SgR%-O?WuEHK7n7@Y!m6e)^R +zl_t>z54i6x%N5>&?$M(f7?Ih)Cu>NK1kHQ|O-+D83NQZSpuXEW%HK_L%Ets`Q4KJ> +zM|*LWZJ;r5+mDb +zzjB}!pTTrNtM1ksIVeGFs=-Sp)ZxB>yzlgR{XNzuP>qlY_Qu}1g1 +zfuRnCpEvu_=BS*X68oGH!QOa?;c)VHTEQ!C_W2dgoMfQGRZ}R9*yJdYT#S+G}_j~N{uZ66YV&j3^7&NY9@>{D45>iICh^vBslQ&mzm +zHm%ho|J|vY{5A#Gw$~Avhj%`^R?sn`teT^QKruqpP6-7I`;!jmD0W?4LgdrK7UltA +zVek!;nlbFINc&dPHFgpNz4b?E;V=@k`d;mY?3B;LB9%W&3q8z0uInagyO=z%O%wGN +z*`d_iMWASl5^1qLJv0<@2d)3|U>17#<=k0mRH!b$(uS4iJb~lxPCEMCp+?pN?j~pK +zy=Lk0T^*X72Q=$Z82Yjo8aMoYt~v}}n~(1N?>1Gi-28FKexP<@Shn(JqCzp8s5mrR +zD^%lY0HTc{n_gd3lFglxr>z^(*LEiT! +z={Pcj{u&w?yUfqErskfE_ghSzbo+q^)G{U7%Qa2&Tf|e|D0h}=hA#}1S$!T&7l2M# +z9AaC4?s`UXdG_f4;yaO8cJ~kx*BtTpT^MydrN_0T>h*0#Epr>17}2EFvpudARXZ^b +zi+>2_S39MTOP+_cIwT*%*al7N;QL&Ei9UJzo#c3C7ZTYZGcPB;%@|Bp3jV_{EYii@ +zwbO}WR5|+P2R_2kD?Tky+nm}pb--L5r{8f2{(Gtzvh%7@=FRZD%sSuF8Xt}P>?DWI +z1;ojAZzn}%Xs{ru#eqWkiHklR*5Y#RZy_CTWaek@ohl!zI+l=IM@pG@-s_^sL`}sT +zK}^CgjL>FZW$wLJA)S`RJIMr+x$Ym$FuR8Oa=v`&isZhS)TGyjl95Tw%E~H>2LTJY +ziwn_^hUKP>$S;%gYP8ECHCz{WWP02F+h0}FvVT1Oay(9P|4)>2)V*`<$er+WjpwiN +z9^`aM5*}Apw+>BmgB)o=-)kXGk#BE^r1i_^zEhZfGvPh5&oXhzEg`TmA@ +zVw$wITj#G8XnXqxtUcV?__g_E1RRU#O+HbEE%X(CS?OFFq-o?m0Yi`?1fpAa +ziw5w#b@0NSwr6wmDrNi)!5%x-OBqbkV~HzreVlQZ6mPFkuDl=_&%n^OTpE3{D)LSH +z?~Wjw?#1iK+^4?&Kmz2OH%CI&@S4!^%Uf0LCSQ(!(BSWrm|3q~sfJ8gia*_FVamjq +zR#}^gvKNYeICn=4iDR9Y00Kw1{B*PotfWfMvZ>!DEGttb%8eixKX&3q5Qsby_*Yse +zjmA~92pG!g_N$W|W5;^Gj*BP)F1tRYBlono^HZIzZU*mi+>RKC*W+BGC|>DnoI6s= +zrM>6xKVHG{D=>VWX|Mg=oq>f?cPcrkiTrI>U#+yvp#mD@AlpL=#GOH&dTG9{JN`kT +z{22qObiw^Q>EesZFw^<_SxU@?Zb_5h>HwZ?N@&a_%u(j8Djip_eW57*(5?3qlPaf? +z@=ng|pI%fJoIq8d#K!uevJr4KO)dNh8?BQ%seQU9l_s4=r3Ccv}wwwcDK^VDsh7)TIbnpFA +z&aMWGzdd%l+jM)k`HP1%^?VAp+mZX)Tr6}pIzlx$X!r+fh!g;H2?(=5HH@C1I0;SW* +z>5FfqtPJDz!^vjD)W_<0*bGv~>f`Ho4`^?0RDWpWdcX1G{60d?^INUGTFsdA=`u{W +z(Gq8-K)IJ3d1hA=WaG)a=GohmVF!C6))uAqr0efr?`Ac?b#^GFvMlwxxayPRKQ{qv +zYiL}+dxOt|fpNx)Tmk_zR`%I8E!C@d!G{$mlt +zjy<_3kmy97eTA;su%J;J?A$(ND#Xhll75pLrU3R#Z#`9zl}<2_BnZwtxaab1{hQ*+ +zOc3M<)6tz`sJ`?gDWAQoyvkfFIV;F%le(+@T4A4m35bqW!!Qy+*_-RkrM}0?{#E>m*kF;f +zi4LpGNKkoGLq`WY&AC|C)PbcM-!9mBCCaJMHQe+X_(I9}z+Z8_R5GPxVdO7Qgjqfa?7b^1l*TKYEJ%=$(VvaeOc>?&6MBk`HS +zES&?As$`LIil2Y0?4DF#=B?tc41>XHoX3P)0`^3`RaH3}IB=EKjhxC7aLjq5(_kzs +zwy@~|Z3(S{3z@7c3cBhbRuCd!+;);vmR$8EpG;$@e(y(!t>`2wI8ZHOb_E0=yVe-g +z@N2wn@O)lIJIXC3^F&A%LwjI%FWv`W+VE+K4J*fpmR* +zKisioWA`Mw;}2|DQwC_4jkYKiHp^7Oatxm;=*-P9)XKi%U4IgAHTNOHc>9=T{SktN +z!SI~~CfXU9nU$~gv!}r2sDoAtb!u*MG_EuGb5EPEr&DPgYE#$OEjj6vYX|^wJ%UUs +z1U|_N*YP)*lZ#!Q{?}ptZi9;3RM8hcHpu-;YCX}o;Qh@<&d}JXvy8Vdy##fzE`(J5 +z$P9TVsZst=*(=hM<|g$tF5vWz?ac8*taS}9Uo3%RNXfm#!}RTQ6e<$#TCIvJvKV%C +zT1K_E+RRw>DinX%a=Gf;2uhdZx|J>(dtHMx(EBN|>Fr{jP4YsbLK5*;?4l@Ve15NY +z1HK+4puU&gRTUQ=59DvD`tGUvxAaB^~* +zUg0z=e{Lp`QB;2AgB_Er>mu?3Z~T`-d^Z4~CqoR4sEh@nK2_m_d9p4!Rhp%eA3h37 +z`ri1T<;^?Fw_>b@jc=$&=(9zA`V*pC_}2JMxouM+#BZ^M)(gL2ou>}T1 +z+U_(vcbbBaW_kju{DOv>-Zg@W3a_&Cae2wlhAxu~yb|Q{#4j>f&p0vKs!ByG4HjEU +z{6~Cxuj%9aX`Rni!&3emNSX3FjAFxOOsQ&*(vwp8aYWdTUyHDWmwBsjQU0?yLNhol +zw!+J{EkeoN-Myn~*0?9{vBK<;cICp?JU;WLT|bMDC31?9;iH1Tl?(frYqlvZVzVvI +zaC!$Wy0@%lzM- +z{RxyA?Pvbq)K&S{_JEL9*jt%fAhJuu0*FbN0TyYIR-Tz{t|urG!W)4$-^#C0`K`<<4A8a+j;hh +z8wB8jSN!OmZ#RMIm`_@f7r38vB5(Gj*{cCOU6|&%S8p@IEe)pT?;E|U;qxr>Si5NA +z9L0#&=0fX?$tFnNhLv0ijbis)XR@UWMP7*~h;3$+?oZ=R1NCy>)y&8L{K?A5bnbiD +z=0|5jnOQ~+ft3A$?j%o({=`+|)qB99EE`u_8!$LLd^;5Y3_c9ORW?H)i7&^OYmIFO +za{o*)o#eqJblxgukEJP1&tKE*>H=h%A)&fAD-0lsuA+f?{gYbo*^9TIf6bMMKH}#2 +zoy?qC1+k?!vXHtiANS-a94PLfE4m$a^5V$L;}SamJ#Ks@<43)1kdyr9lAud&`SZ*; +z9IOLrDv_T1z_WQmW9I0~WXgIuX-IN?`bFb&_ejn@!yCP+wuvCwXBKh^2}wl_HBQNN +znJAPdThr>U!Hw~x6Uu?CZPN+GKuQq>r*UzrsU7x9X6=)aDfYd-wtJg_$=2c&^1X7U +zfptIvn^59~=Kvz_opZfl`p6vn|;kv(0Mi|%Dw|AUResXn39Cqe3@iFD1Brb26B_N>Ka*Kx!EJg +z|AZW>U`bB`nNH2qK51#3bbM`|x=wSgQcP^qM74Gs+()H7x=5h8z&lJ+Z1XVBPL&x| +zXkLEnN@value( "zfsInfo" ).toList(); + +- for ( auto& partition : std::as_const( partitions ) ) ++ for ( auto& partition : qAsConst( partitions ) ) + { + QVariantMap pMap; + if ( partition.canConvert< QVariantMap >() ) +@@ -231,7 +231,7 @@ ZfsJob::exec() + // Look in the zfs info list to see if this partition should be encrypted + bool encrypt = false; + QString passphrase; +- for ( const QVariant& zfsInfo : std::as_const( zfsInfoList ) ) ++ for ( const QVariant& zfsInfo : qAsConst( zfsInfoList ) ) + { + if ( zfsInfo.canConvert< QVariantMap >() && zfsInfo.toMap().value( "encrypted" ).toBool() + && mountpoint == zfsInfo.toMap().value( "mountpoint" ) ) +@@ -276,7 +276,7 @@ ZfsJob::exec() + { + collectMountpoints( partitions ); + QVariantList datasetList; +- for ( const auto& dataset : std::as_const( m_datasets ) ) ++ for ( const auto& dataset : qAsConst( m_datasets ) ) + { + QVariantMap datasetMap = dataset.toMap(); + -- -2.43.0 +2.46.0 diff --git a/0007-root.patch b/0007-root.patch index 3966aae..3d88564 100644 --- a/0007-root.patch +++ b/0007-root.patch @@ -1,175 +1,25 @@ -From 1c55eb532ed186baf5b0ac4b7b8504c8e84bfc8e Mon Sep 17 00:00:00 2001 -From: cui-gaoleng <562344211@qq.com> -Date: Fri, 8 Nov 2024 02:53:37 +0800 -Subject: [PATCH] =?UTF-8?q?/=E7=9B=AE=E5=BD=95=E4=B8=8B=E7=9A=84=E9=85=8D?= - =?UTF-8?q?=E7=BD=AE=E6=96=87=E4=BB=B6=E4=BF=AE=E6=94=B9?= -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit +From 1aa2969cfc3d28e0da99f549cbf0ad28cfc95e78 Mon Sep 17 00:00:00 2001 +From: lizixin <2271170409@qq.com> +Date: Fri, 27 Dec 2024 15:19:04 +0800 +Subject: [PATCH 5/6] root --- - .editorconfig | 29 +++++++++++++++++++++++++++++ - .gitattributes | 14 ++++++++++++++ - .gitmodules | 0 - CMakeLists.txt | 21 +++++++++------------ - settings.conf | 18 ++++++++++-------- - 8 files changed, 114 insertions(+), 20 deletions(-) - create mode 100644 .editorconfig - create mode 100644 .gitattributes - create mode 100644 .gitmodules + CMakeLists.txt | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) -diff --git a/.editorconfig b/.editorconfig -new file mode 100644 -index 0000000..44e191e ---- /dev/null -+++ b/.editorconfig -@@ -0,0 +1,29 @@ -+# SPDX-FileCopyrightText: no -+# SPDX-License-Identifier: CC0-1.0 -+ -+root = true -+ -+[*] -+charset = utf-8 -+end_of_line = lf -+trim_trailing_whitespace = true -+ -+[CMakeLists.txt] -+indent_style = space -+indent_size = 4 -+insert_final_newline = true -+ -+[*.cmake] -+indent_style = space -+indent_size = 4 -+insert_final_newline = true -+ -+[*.{py,cpp,h}] -+indent_style = space -+indent_size = 4 -+insert_final_newline = true -+ -+[*.sh] -+indent_style = tab -+insert_final_newline = true -+ -diff --git a/.gitattributes b/.gitattributes -new file mode 100644 -index 0000000..6a8126f ---- /dev/null -+++ b/.gitattributes -@@ -0,0 +1,14 @@ -+# SPDX-FileCopyrightText: no -+# SPDX-License-Identifier: CC0-1.0 -+ -+.editorconfig export-ignore -+.gitattributes export-ignore -+.github export-ignore -+.gitignore export-ignore -+.gitmodules export-ignore -+.travis.yml export-ignore -+.tx export-ignore -+ -+src/modules/testmodule.py export-ignore -+src/modules/globalStorage.yaml export-ignore -+ -diff --git a/.gitmodules b/.gitmodules -new file mode 100644 -index 0000000..e69de29 diff --git a/CMakeLists.txt b/CMakeLists.txt -index 9da614e..19395d4 100644 +index 21e6a1a..40ae7e0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt -@@ -78,8 +78,8 @@ set(CALAMARES_SOVERSION "${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}") - ### OPTIONS - # - option(INSTALL_POLKIT "Install Polkit configuration" ON) --option(INSTALL_COMPLETION "Install shell completions" OFF) --option(INSTALL_CONFIG "Install configuration files" OFF) -+option(INSTALL_COMPLETION "Install shell completions" ON) -+option(INSTALL_CONFIG "Install configuration files" ON) - # When adding WITH_* that affects the ABI offered by libcalamares, - # also update libcalamares/CalamaresConfig.h.in - option(WITH_PYBIND11 "Use bundled pybind11 instead of Boost::Python" ON) -@@ -128,9 +128,9 @@ set(USE_services "" CACHE STRING "Select the services module to use") +@@ -741,6 +741,7 @@ set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "A Linux system installer") + set(CPACK_PACKAGE_DESCRIPTION + "Calamares is a Linux system installer, intended for Linux distributions to use on their ISOs and other bootable media to install the distribution to the end-user's computer. Calamares can also be used as an OEM configuration tool. It is modular, extensible and highly-configurable for Linux distributions from all five major Linux families." + ) +-set(CPACK_PACKAGE_ICON "/usr/share/calamares/branching/default/openEuler-icon.png") ++set(CPACK_PACKAGE_ICON "data/images/squid.png") - ### Calamares application info - # --set(CALAMARES_ORGANIZATION_NAME "Calamares") --set(CALAMARES_ORGANIZATION_DOMAIN "github.com/calamares") --set(CALAMARES_APPLICATION_NAME "Calamares") -+set(CALAMARES_ORGANIZATION_NAME "openEuler") -+set(CALAMARES_ORGANIZATION_DOMAIN "https://gitee.com/organizations/openeuler/") -+set(CALAMARES_APPLICATION_NAME "easysoftware") - set(CALAMARES_DESCRIPTION_SUMMARY "The distribution-independent installer framework") - - ### Transifex (languages) info -@@ -155,13 +155,10 @@ set(CALAMARES_DESCRIPTION_SUMMARY "The distribution-independent installer framew - # `txstats.py -e`. See also - # - # Total 80 languages --set( _tx_complete de en es_AR fi_FI hr hu ja lt tr_TR uk zh_TW ) --set( _tx_good az az_AZ be bg ca cs_CZ es fr fur he hi is it_IT ko -- pl pt_BR pt_PT ru si sq sv zh_CN ) --set( _tx_ok ar as ast bn ca@valencia da el en_GB eo es_MX et eu fa -- gl id ka ml mr nb nl oc ro sk sl sr sr@latin tg th vi ) --set( _tx_incomplete bqi es_PR gu ie ja-Hira kk kn lo lv mk ne_NP -- ro_RO ta_IN te ur uz zh zh_HK ) -+set( _tx_complete zh_TW ) -+set( _tx_good zh_CN ) -+set( _tx_ok en_GB ) -+set( _tx_incomplete ) - # Total 80 languages - - ### Required versions -diff --git a/settings.conf b/settings.conf -index f4cbd05..f2d1106 100644 ---- a/settings.conf -+++ b/settings.conf -@@ -118,9 +118,10 @@ sequence: - # - notesqml - # - packagechooserq@licenseq - - locale -- - keyboard -- - partition -+# - keyboard - - users -+ - packagechooser -+ - partition - # - tracking - - summary - - exec: -@@ -134,23 +135,24 @@ sequence: - - machineid - - fstab - - locale -- - keyboard -+# - keyboard - - localecfg - # - luksbootkeyfile - # - luksopenswaphookcfg --# - dracutlukscfg -+ - dracutlukscfg - # - plymouthcfg - # - zfshostid -- - initcpiocfg -- - initcpio -+ #- initcpiocfg -+ #- initcpio - - users - - displaymanager - - networkcfg - - hwclock - - services-systemd - # - dracut -- - initramfs --# - grubcfg -+# - initramfs -+ - packages -+ - grubcfg - - bootloader - - umount - - show: + include(CPack) ++ -- -2.43.0 +2.46.0 diff --git a/0008-progromTree.patch b/0008-progromTree.patch index 8063e8f..389fd59 100644 --- a/0008-progromTree.patch +++ b/0008-progromTree.patch @@ -1,660 +1,71 @@ -From dd87845d5196cb45fc409ea0d445ff157cda7d33 Mon Sep 17 00:00:00 2001 -From: cui-gaoleng <562344211@qq.com> -Date: Fri, 8 Nov 2024 00:48:41 +0800 -Subject: [PATCH] =?UTF-8?q?=E8=BF=9B=E5=BA=A6=E6=9D=A1=E9=83=A8=E5=88=86?= -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - ---- - .../progresstree/ProgressTreeDelegate.cpp | 338 ++++++++++++------ - .../progresstree/ProgressTreeDelegate.h | 62 ++-- - .../progresstree/ProgressTreeView.cpp | 142 ++++---- - src/calamares/progresstree/ProgressTreeView.h | 80 +++-- - 5 files changed, 375 insertions(+), 250 deletions(-) - -diff --git a/src/calamares/progresstree/ProgressTreeDelegate.cpp b/src/calamares/progresstree/ProgressTreeDelegate.cpp -index df513f2..6d5f865 100644 ---- a/src/calamares/progresstree/ProgressTreeDelegate.cpp -+++ b/src/calamares/progresstree/ProgressTreeDelegate.cpp -@@ -1,119 +1,219 @@ --/* === This file is part of Calamares - === -- * -- * SPDX-FileCopyrightText: 2014-2015 Teo Mrnjavac -- * SPDX-FileCopyrightText: 2017 Adriaan de Groot -- * SPDX-License-Identifier: GPL-3.0-or-later -- * -- * Calamares is Free Software: see the License-Identifier above. -- * -- */ -- --#include "ProgressTreeDelegate.h" -- --#include "Branding.h" --#include "CalamaresApplication.h" --#include "CalamaresWindow.h" --#include "ViewManager.h" --#include "utils/Gui.h" -- --#include -- --static constexpr int const item_margin = 8; --static inline int --item_fontsize() --{ -- return Calamares::defaultFontSize() + 4; --} -- --static void --paintViewStep( QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index ) --{ -- QRect textRect = option.rect.adjusted( item_margin, item_margin, -item_margin, -item_margin ); -- QFont font = qApp->font(); -- font.setPointSize( item_fontsize() ); -- font.setBold( false ); -- painter->setFont( font ); -- -- if ( index.row() == index.data( Calamares::ViewManager::ProgressTreeItemCurrentIndex ).toInt() ) -- { -- painter->setPen( Calamares::Branding::instance()->styleString( Calamares::Branding::SidebarTextCurrent ) ); -- QString textHighlight -- = Calamares::Branding::instance()->styleString( Calamares::Branding::SidebarBackgroundCurrent ); -- if ( textHighlight.isEmpty() ) -- { -- painter->setBrush( CalamaresApplication::instance()->mainWindow()->palette().window() ); -- } -- else -- { -- painter->setBrush( QColor( textHighlight ) ); -- } -- } -- -- // Draw the text at least once. If it doesn't fit, then shrink the font -- // being used by 1 pt on each iteration, up to a maximum of maximumShrink -- // times. On each loop, we'll have to blank out the rectangle again, so this -- // is an expensive (in terms of drawing operations) thing to do. -- // -- // (The loop uses <= because the counter is incremented at the start). -- static constexpr int const maximumShrink = 4; -- int shrinkSteps = 0; -- do -- { -- painter->fillRect( option.rect, painter->brush().color() ); -- shrinkSteps++; -- -- QRectF boundingBox; -- painter->drawText( -- textRect, Qt::AlignHCenter | Qt::AlignVCenter | Qt::TextSingleLine, index.data().toString(), &boundingBox ); -- -- // The extra check here is to avoid the changing-font-size if we're not going to use -- // it in the next iteration of the loop anyway. -- if ( ( shrinkSteps <= maximumShrink ) && ( boundingBox.width() > textRect.width() ) ) -- { -- font.setPointSize( item_fontsize() - shrinkSteps ); -- painter->setFont( font ); -- } -- else -- { -- break; // It fits -- } -- } while ( shrinkSteps <= maximumShrink ); --} -- --QSize --ProgressTreeDelegate::sizeHint( const QStyleOptionViewItem& option, const QModelIndex& index ) const --{ -- if ( !index.isValid() ) -- { -- return option.rect.size(); -- } -- -- QFont font = qApp->font(); -- -- font.setPointSize( item_fontsize() ); -- QFontMetrics fm( font ); -- int height = fm.height(); -- -- height += 2 * item_margin; -- -- return QSize( option.rect.width(), height ); --} -- --void --ProgressTreeDelegate::paint( QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index ) const --{ -- QStyleOptionViewItem opt = option; -- -- painter->save(); -- -- initStyleOption( &opt, index ); -- opt.text.clear(); -- -- painter->setBrush( -- QColor( Calamares::Branding::instance()->styleString( Calamares::Branding::SidebarBackground ) ) ); -- painter->setPen( QColor( Calamares::Branding::instance()->styleString( Calamares::Branding::SidebarText ) ) ); -- -- paintViewStep( painter, opt, index ); -- -- painter->restore(); --} -+/* === This file is part of Calamares - === -+ * -+ * SPDX-FileCopyrightText: 2014-2015 Teo Mrnjavac -+ * SPDX-FileCopyrightText: 2017 Adriaan de Groot -+ * SPDX-License-Identifier: GPL-3.0-or-later -+ * -+ * Calamares is Free Software: see the License-Identifier above. -+ * -+ */ -+ -+#include "ProgressTreeDelegate.h" -+ -+#include "Branding.h" -+#include "CalamaresApplication.h" -+#include "CalamaresWindow.h" -+#include "ViewManager.h" -+#include "utils/Gui.h" -+#include "utils/Logger.h" -+ -+#include -+#include -+static constexpr int const item_margin = 8; -+static inline int -+item_fontsize() -+{ -+ return Calamares::defaultFontSize(); -+} -+static bool contains(const std::vector& vec,const QString& value){ -+ for(const QString& v : vec){ -+ if(v==value){ -+ return true; -+ } -+ } -+ return false; -+} -+static QString getTypeOfStep(const QString& stepString){ -+ std::vector baseSetting1 = {"Location","Keyboard"}; -+ std::vector userSetting1 = {"Users","Packages"}; -+ std::vector installSteps1 = {"Partitions","Summary","Install","Finish"}; -+ std::vector baseSetting2 = {"位置","键盘"}; -+ std::vector userSetting2 = {"用户","桌面"}; -+ std::vector installSteps2 = {"分区","摘要","安装","结束"}; -+ std::vector baseSetting3 = {"位置", "鍵盤"}; -+ std::vector userSetting3 = {"使用者", "軟體包"}; -+ std::vector installSteps3 = {"分割區", "總覽", "安裝", "完成"}; -+ // 获取当前系统的语言设置 -+ QLocale locale; -+ QLocale::Language lang = locale.language(); -+ -+ // 将语言枚举值转换为字符串 -+ QString languageString = QLocale::languageToString(lang); -+ QLocale::Country country = locale.country(); -+ -+ // 将地区枚举值转换为字符串 -+ QString countryString = QLocale::countryToString(country); +From d85d6cfbf0b690335e0817a6c4c28e9cfd7d15c5 Mon Sep 17 00:00:00 2001 +From: lizixin <2271170409@qq.com> +Date: Fri, 27 Dec 2024 15:21:56 +0800 +Subject: [PATCH 6/6] progromTree + +--- + src/calamares/progresstree/ProgressTreeDelegate.cpp | 2 ++ + src/calamares/progresstree/ProgressTreeView.cpp | 6 +----- + 2 files changed, 3 insertions(+), 5 deletions(-) + +diff --git a/src/calamares/progresstree/ProgressTreeDelegate.cpp b/src/calamares/progresstree/ProgressTreeDelegate.cpp +index 7541356..5b988d6 100644 +--- a/src/calamares/progresstree/ProgressTreeDelegate.cpp ++++ b/src/calamares/progresstree/ProgressTreeDelegate.cpp +@@ -53,6 +53,7 @@ static QString getTypeOfStep(const QString& stepString){ + + // 将地区枚举值转换为字符串 + QString countryString = QLocale::countryToString(country); + // 输出当前语言 -+ cDebug() << "-------------------------------------------当前系统语言:" << languageString; -+ cDebug() << "-------------------------------------------当前系统地区:" << countryString; -+ if(contains(baseSetting1,stepString)){ -+ return "BaseSetting"; -+ } -+ if(contains(userSetting1,stepString)){ -+ return "UserSetting"; -+ } -+ if(contains(installSteps1,stepString)){ -+ return "InstallSetting"; -+ } -+ if(contains(baseSetting2,stepString) && countryString=="China"){ -+ return "基础设置"; -+ } -+ if(contains(userSetting2,stepString) && countryString=="China"){ -+ return "用户设置"; -+ } -+ if(contains(installSteps2,stepString) && countryString=="China"){ -+ return "安装设置"; -+ } -+ if (contains(baseSetting3, stepString) && countryString=="Taiwan") { -+ return "基礎設定"; -+ } -+ if (contains(userSetting3, stepString) && countryString=="Taiwan"){ -+ return "使用者設定"; -+ } -+ if (contains(installSteps3, stepString) && countryString=="Taiwan") { -+ return "安裝設定"; -+ } -+ return 0; -+} -+static int getTypeOfStep(int val){ -+ if(val<=1){ -+ return 1; -+ } -+ else if(val<=3){ -+ return 2; -+ } -+ else if(val<=8){ -+ return 3; -+ } -+ else{ -+ return 0; -+ } -+} -+static bool isVisable(const QString& stepString){ -+ std::vector installSteps = {"鍵盤", "軟體包", "總覽", "安裝", "完成", -+ "Keyboard","Packages","Summary","Install","Finish", -+ "键盘","桌面","摘要","安装","结束"}; -+ return !contains(installSteps, stepString); -+} -+static void -+paintViewStep( QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index ) -+{ -+ QRect textRect = option.rect.adjusted( item_margin, item_margin, -item_margin, -item_margin ); -+ QFont font = qApp->font(); -+ font.setPointSize( item_fontsize() ); -+ font.setBold( false ); -+ painter->setFont( font ); -+ -+ int CurrentTypeOfStep = getTypeOfStep(index.data( Calamares::ViewManager::ProgressTreeItemCurrentIndex ).toInt()); -+ int TypeOfStep = getTypeOfStep(index.row()); -+ if ( CurrentTypeOfStep == TypeOfStep ) -+ { -+ painter->setPen( Calamares::Branding::instance()->styleString( Calamares::Branding::SidebarTextCurrent ) ); -+ QString textHighlight -+ = Calamares::Branding::instance()->styleString( Calamares::Branding::SidebarBackgroundCurrent ); -+ if ( textHighlight.isEmpty() ) -+ { -+ painter->setBrush( CalamaresApplication::instance()->mainWindow()->palette().window() ); -+ } -+ else -+ { -+ painter->setBrush( QColor( textHighlight ) ); -+ } -+ } -+ -+ // Draw the text at least once. If it doesn't fit, then shrink the font -+ // being used by 1 pt on each iteration, up to a maximum of maximumShrink -+ // times. On each loop, we'll have to blank out the rectangle again, so this -+ // is an expensive (in terms of drawing operations) thing to do. -+ // -+ // (The loop uses <= because the counter is incremented at the start). -+ static constexpr int const maximumShrink = 4; -+ int shrinkSteps = 0; -+ do -+ { -+ -+ shrinkSteps++; -+ -+ QRectF boundingBox; -+ cDebug() << "index.data().toString()" << index.data().toString(); -+ QString text; -+ if(index.data().toString()=="欢迎" || index.data().toString()=="Welcome"||!isVisable(index.data().toString())){ -+ text = ""; -+ }else{ -+ text = getTypeOfStep(index.data().toString()); -+ painter->fillRect( option.rect, painter->brush().color() ); -+ } -+ painter->drawText( -+ textRect, Qt::AlignHCenter | Qt::AlignVCenter | Qt::TextSingleLine, text, &boundingBox ); -+ -+ // The extra check here is to avoid the changing-font-size if we're not going to use -+ // it in the next iteration of the loop anyway. -+ if ( ( shrinkSteps <= maximumShrink ) && ( boundingBox.width() > textRect.width() ) ) -+ { -+ font.setPointSize( item_fontsize() ); -+ painter->setFont( font ); -+ } -+ else -+ { -+ break; // It fits -+ } -+ } while ( shrinkSteps <= maximumShrink ); -+} -+ -+QSize -+ProgressTreeDelegate::sizeHint( const QStyleOptionViewItem& option, const QModelIndex& index ) const -+{ -+ if ( !index.isValid() ) -+ { -+ return option.rect.size(); -+ } -+ -+ QFont font = qApp->font(); -+ cDebug() << "ProgressTreeDelegate::sizeHint"; -+ -+ font.setPointSize( item_fontsize() ); -+ QFontMetrics fm( font ); -+ int height = fm.height(); -+ height += 2 * item_margin; -+ if(index.data().toString()=="欢迎" || index.data().toString()=="Welcome"||!isVisable(index.data().toString())){ -+ return QSize( 0, 0 ); -+ }else{ -+ return QSize( (Calamares::windowMinimumWidth*0.9)/3, height*2 ); -+ } -+// return QSize( option.rect.width(), height ); -+ -+} -+ -+void -+ProgressTreeDelegate::paint( QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index ) const -+{ -+ cDebug() << "ProgressTreeDelegate::paint----------"; -+ QStyleOptionViewItem opt = option; -+ -+ painter->save(); -+ -+ initStyleOption( &opt, index ); -+ opt.text.clear(); -+ -+ painter->setBrush( -+ QColor( Calamares::Branding::instance()->styleString( Calamares::Branding::SidebarBackground ) ) ); -+ painter->setPen( QColor( Calamares::Branding::instance()->styleString( Calamares::Branding::SidebarText ) ) ); -+ if(index.data().toString()=="欢迎" || index.data().toString()=="Welcome"){ -+ cDebug() << "ProgressTreeDelegate::欢迎Welcome--------Nopaint----------"; -+ }else{ -+ paintViewStep( painter, opt, index ); -+ } -+ //paintViewStep( painter, opt, index ); -+ -+ painter->restore(); -+} -diff --git a/src/calamares/progresstree/ProgressTreeDelegate.h b/src/calamares/progresstree/ProgressTreeDelegate.h -index d5a5abc..af4fef9 100644 ---- a/src/calamares/progresstree/ProgressTreeDelegate.h -+++ b/src/calamares/progresstree/ProgressTreeDelegate.h -@@ -1,31 +1,31 @@ --/* === This file is part of Calamares - === -- * -- * SPDX-FileCopyrightText: 2014-2015 Teo Mrnjavac -- * SPDX-FileCopyrightText: 2019 Adriaan de Groot -- * SPDX-License-Identifier: GPL-3.0-or-later -- * -- * Calamares is Free Software: see the License-Identifier above. -- * -- */ -- --#ifndef PROGRESSTREEDELEGATE_H --#define PROGRESSTREEDELEGATE_H -- --#include -- --/** -- * @brief The ProgressTreeDelegate class customizes the look and feel of the -- * ProgressTreeView elements. -- * @see ProgressTreeView -- */ --class ProgressTreeDelegate : public QStyledItemDelegate --{ --public: -- using QStyledItemDelegate::QStyledItemDelegate; -- --protected: -- QSize sizeHint( const QStyleOptionViewItem& option, const QModelIndex& index ) const override; -- void paint( QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index ) const override; --}; -- --#endif // PROGRESSTREEDELEGATE_H -+/* === This file is part of Calamares - === -+ * -+ * SPDX-FileCopyrightText: 2014-2015 Teo Mrnjavac -+ * SPDX-FileCopyrightText: 2019 Adriaan de Groot -+ * SPDX-License-Identifier: GPL-3.0-or-later -+ * -+ * Calamares is Free Software: see the License-Identifier above. -+ * -+ */ -+ -+#ifndef PROGRESSTREEDELEGATE_H -+#define PROGRESSTREEDELEGATE_H -+ -+#include -+ -+/** -+ * @brief The ProgressTreeDelegate class customizes the look and feel of the -+ * ProgressTreeView elements. -+ * @see ProgressTreeView -+ */ -+class ProgressTreeDelegate : public QStyledItemDelegate -+{ -+public: -+ using QStyledItemDelegate::QStyledItemDelegate; -+ -+protected: -+ QSize sizeHint( const QStyleOptionViewItem& option, const QModelIndex& index ) const override; -+ void paint( QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index ) const override; -+}; -+ -+#endif // PROGRESSTREEDELEGATE_H -diff --git a/src/calamares/progresstree/ProgressTreeView.cpp b/src/calamares/progresstree/ProgressTreeView.cpp -index 9d49ea2..29ee7ee 100644 ---- a/src/calamares/progresstree/ProgressTreeView.cpp -+++ b/src/calamares/progresstree/ProgressTreeView.cpp -@@ -1,61 +1,81 @@ --/* === This file is part of Calamares - === -- * -- * SPDX-FileCopyrightText: 2014 Teo Mrnjavac -- * SPDX-License-Identifier: GPL-3.0-or-later -- * -- * Calamares is Free Software: see the License-Identifier above. -- * -- */ -- --#include "ProgressTreeView.h" -- --#include "ProgressTreeDelegate.h" -- --#include "Branding.h" --#include "ViewManager.h" -- --ProgressTreeView::ProgressTreeView( QWidget* parent ) -- : QListView( parent ) --{ -- this->setObjectName( "sidebarMenuApp" ); -- setFrameShape( QFrame::NoFrame ); -- setContentsMargins( 0, 0, 0, 0 ); -- -- setSelectionMode( QAbstractItemView::NoSelection ); -- setDragDropMode( QAbstractItemView::NoDragDrop ); -- setAcceptDrops( false ); -- -- setItemDelegate( new ProgressTreeDelegate( this ) ); -- -- QPalette plt = palette(); -- plt.setColor( QPalette::Base, -- Calamares::Branding::instance()->styleString( Calamares::Branding::SidebarBackground ) ); -- setPalette( plt ); --} -- -- --ProgressTreeView::~ProgressTreeView() {} -- -- --void --ProgressTreeView::setModel( QAbstractItemModel* model ) --{ -- if ( ProgressTreeView::model() ) -- { -- return; -- } -- -- QListView::setModel( model ); -- -- connect( Calamares::ViewManager::instance(), -- &Calamares::ViewManager::currentStepChanged, -- this, -- &ProgressTreeView::update, -- Qt::UniqueConnection ); --} -- --void --ProgressTreeView::update() --{ -- viewport()->update(); --} -+/* === This file is part of Calamares - === -+ * -+ * SPDX-FileCopyrightText: 2014 Teo Mrnjavac -+ * SPDX-License-Identifier: GPL-3.0-or-later -+ * -+ * Calamares is Free Software: see the License-Identifier above. -+ * -+ */ -+ -+#include "ProgressTreeView.h" -+ -+#include "ProgressTreeDelegate.h" -+ -+#include "Branding.h" -+#include "ViewManager.h" -+#include "utils/Logger.h" -+ -+ProgressTreeView::ProgressTreeView( QWidget* parent ) -+ : QListView( parent ) -+{ -+ this->setObjectName( "sidebarMenuApp" ); -+ setFrameShape( QFrame::NoFrame ); -+ setContentsMargins( 0, 0, 0, 0 ); -+ -+ setFlow(QListView::LeftToRight);// -+ setSelectionMode( QAbstractItemView::NoSelection ); -+ setDragDropMode( QAbstractItemView::NoDragDrop ); -+ setAcceptDrops( false ); -+// setVisible( false); -+ -+ setItemDelegate( new ProgressTreeDelegate( this ) ); -+ -+ QPalette plt = palette(); -+ plt.setColor( QPalette::Base, -+ Calamares::Branding::instance()->styleString( Calamares::Branding::SidebarBackground ) ); -+ setPalette( plt ); -+// connect(parent, SIGNAL(currentStepChanged(int)), this, SLOT(updateVisibility(int))); -+ connect( Calamares::ViewManager::instance(), -+ &Calamares::ViewManager::currentStepChanged, -+ this, -+ &ProgressTreeView::updateVisibility, -+ Qt::UniqueConnection ); -+// connect(viewManager, &ViewManager::currentStepChanged, this, &ProgressTreeView::updateVisibility); -+} -+ -+ -+ProgressTreeView::~ProgressTreeView() {} -+ -+ -+ -+void -+ProgressTreeView::setModel( QAbstractItemModel* model ) -+{ -+ if ( ProgressTreeView::model() ) -+ { -+ return; -+ } -+ -+ QListView::setModel( model ); -+ -+ connect( Calamares::ViewManager::instance(), -+ &Calamares::ViewManager::currentStepChanged, -+ this, -+ &ProgressTreeView::update, -+ Qt::UniqueConnection ); -+} -+ -+void -+ProgressTreeView::update() -+{ -+ cDebug() << "update ---------------------"; -+ viewport()->update(); -+} -+ -+void -+ProgressTreeView::updateVisibility(int currentStep) -+{ -+ cDebug() << "int currentStep ------------------ " << currentStep; -+ // 在第一个步骤隐藏,其他步骤显示 -+ this->setVisible(currentStep > 0); -+} -diff --git a/src/calamares/progresstree/ProgressTreeView.h b/src/calamares/progresstree/ProgressTreeView.h -index d845cc7..b02b9ce 100644 ---- a/src/calamares/progresstree/ProgressTreeView.h -+++ b/src/calamares/progresstree/ProgressTreeView.h -@@ -1,39 +1,41 @@ --/* === This file is part of Calamares - === -- * -- * SPDX-FileCopyrightText: 2014 Teo Mrnjavac -- * SPDX-FileCopyrightText: 2017 Adriaan de Groot -- * SPDX-License-Identifier: GPL-3.0-or-later -- * -- * Calamares is Free Software: see the License-Identifier above. -- * -- */ -- --#ifndef PROGRESSTREEVIEW_H --#define PROGRESSTREEVIEW_H -- --#include -- --/** -- * @brief Displays progress through the list of (visible) steps -- * -- * The ProgressTreeView class is a modified QListView which displays the -- * available view steps and the user's progress through them. -- * Since Calamares doesn't support "sub steps", it isn't really a tree. -- */ --class ProgressTreeView : public QListView --{ -- Q_OBJECT --public: -- explicit ProgressTreeView( QWidget* parent = nullptr ); -- ~ProgressTreeView() override; -- -- /** -- * @brief setModel assigns a model to this view. -- */ -- void setModel( QAbstractItemModel* model ) override; -- --public Q_SLOTS: -- void update(); --}; -- --#endif // PROGRESSTREEVIEW_H -+/* === This file is part of Calamares - === -+ * -+ * SPDX-FileCopyrightText: 2014 Teo Mrnjavac -+ * SPDX-FileCopyrightText: 2017 Adriaan de Groot -+ * SPDX-License-Identifier: GPL-3.0-or-later -+ * -+ * Calamares is Free Software: see the License-Identifier above. -+ * -+ */ -+ -+#ifndef PROGRESSTREEVIEW_H -+#define PROGRESSTREEVIEW_H -+ -+#include -+#include "utils/Logger.h" -+ -+/** -+ * @brief Displays progress through the list of (visible) steps -+ * -+ * The ProgressTreeView class is a modified QListView which displays the -+ * available view steps and the user's progress through them. -+ * Since Calamares doesn't support "sub steps", it isn't really a tree. -+ */ -+class ProgressTreeView : public QListView -+{ -+ Q_OBJECT -+public: -+ explicit ProgressTreeView( QWidget* parent = nullptr ); -+ ~ProgressTreeView() override; -+ -+ /** -+ * @brief setModel assigns a model to this view. -+ */ -+ void setModel( QAbstractItemModel* model ) override; -+ -+public Q_SLOTS: -+ void update(); -+ void updateVisibility(int currentStep); -+}; -+ -+#endif // PROGRESSTREEVIEW_H --- -2.43.0 - + if(contains(baseSetting1,stepString)){ + return "BaseSetting"; + } +@@ -202,6 +203,7 @@ ProgressTreeDelegate::paint( QPainter* painter, const QStyleOptionViewItem& opti + QColor( Calamares::Branding::instance()->styleString( Calamares::Branding::SidebarBackground ) ) ); + painter->setPen( QColor( Calamares::Branding::instance()->styleString( Calamares::Branding::SidebarText ) ) ); + if(index.data().toString()=="欢迎" || index.data().toString()=="Welcome"){ ++ + }else{ + paintViewStep( painter, opt, index ); + } +diff --git a/src/calamares/progresstree/ProgressTreeView.cpp b/src/calamares/progresstree/ProgressTreeView.cpp +index a9a15b8..5ea761c 100644 +--- a/src/calamares/progresstree/ProgressTreeView.cpp ++++ b/src/calamares/progresstree/ProgressTreeView.cpp +@@ -22,11 +22,10 @@ ProgressTreeView::ProgressTreeView( QWidget* parent ) + setFrameShape( QFrame::NoFrame ); + setContentsMargins( 0, 0, 0, 0 ); + +- setFlow(QListView::LeftToRight);// ++ setFlow(QListView::LeftToRight); + setSelectionMode( QAbstractItemView::NoSelection ); + setDragDropMode( QAbstractItemView::NoDragDrop ); + setAcceptDrops( false ); +-// setVisible( false); + + setItemDelegate( new ProgressTreeDelegate( this ) ); + +@@ -34,13 +33,11 @@ ProgressTreeView::ProgressTreeView( QWidget* parent ) + plt.setColor( QPalette::Base, + Calamares::Branding::instance()->styleString( Calamares::Branding::SidebarBackground ) ); + setPalette( plt ); +-// connect(parent, SIGNAL(currentStepChanged(int)), this, SLOT(updateVisibility(int))); + connect( Calamares::ViewManager::instance(), + &Calamares::ViewManager::currentStepChanged, + this, + &ProgressTreeView::updateVisibility, + Qt::UniqueConnection ); +-// connect(viewManager, &ViewManager::currentStepChanged, this, &ProgressTreeView::updateVisibility); + } + + +@@ -74,6 +71,5 @@ ProgressTreeView::update() + void + ProgressTreeView::updateVisibility(int currentStep) + { +- // 在第一个步骤隐藏,其他步骤显示 + this->setVisible(currentStep > 0); + } +-- +2.46.0 + diff --git a/0009-qss.patch b/0009-qss.patch index 4078c5d..2f91bb3 100644 --- a/0009-qss.patch +++ b/0009-qss.patch @@ -1,17 +1,14 @@ -From 0c7571051e9bf0a051bb44f40cffe85bc44c1791 Mon Sep 17 00:00:00 2001 -From: cui-gaoleng <562344211@qq.com> -Date: Sat, 9 Nov 2024 11:38:16 +0800 -Subject: [PATCH] =?UTF-8?q?qss=E6=96=87=E4=BB=B6=E6=8F=90=E4=BA=A4?= -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit +From e68872d6412297d49e3824136ba19521f643a77c Mon Sep 17 00:00:00 2001 +From: lizixin <2271170409@qq.com> +Date: Fri, 27 Dec 2024 12:28:51 +0800 +Subject: [PATCH 9/9] qss patch --- src/branding/default/stylesheet.qss | 67 +++++++++++++++++++++++++++-- 1 file changed, 64 insertions(+), 3 deletions(-) diff --git a/src/branding/default/stylesheet.qss b/src/branding/default/stylesheet.qss -index 5c36738..85498f6 100644 +index 5c3673847..85498f600 100644 --- a/src/branding/default/stylesheet.qss +++ b/src/branding/default/stylesheet.qss @@ -34,10 +34,71 @@ The examples are not exhaustive. @@ -90,5 +87,5 @@ index 5c36738..85498f6 100644 * * The main application window has the sidebar, which in turn -- -2.43.0 +2.46.0 diff --git a/calamares.spec b/calamares.spec index 6c36659..68ecff6 100644 --- a/calamares.spec +++ b/calamares.spec @@ -2,7 +2,7 @@ Name: calamares Version: 3.3.7 -Release: 1 +Release: 2 Summary: Installer from a live CD/DVD/USB to disk License: GPL-3.0-or-later @@ -335,5 +335,9 @@ cd %{_builddir} || exit 0 rm -rf %{buildroot} %changelog +* Fri Dec 27 2024 lizixin - 3.3.7-2 +- 1230 patch update + + * Wed Oct 9 2024 Li Ping - 3.3.7-1 - Initial package -- Gitee From a3c8679fd4fd6584432c969f4cd91ed693b8c067 Mon Sep 17 00:00:00 2001 From: xinxin <2271170409@qq.com> Date: Fri, 27 Dec 2024 10:46:49 +0000 Subject: [PATCH 2/5] =?UTF-8?q?Revert=20"1230=20calamares=20=E8=BD=AF?= =?UTF-8?q?=E4=BB=B6=E8=A1=A5=E4=B8=81=E6=9B=B4=E6=96=B0"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit 404650fc764d7d341b7eabffdcc9ed3e0d045787. --- 0001-branding-patch.patch | 12 +- 0002-lang.patch | 33469 ++++++++++++++++++++++++++++++++---- 0003-calamares.patch | 1714 +- 0004-libcalamares.patch | 159 +- 0005-libcalamaresui.patch | 11503 +------------ 0006-modules-file.patch | 4762 +---- 0007-root.patch | 182 +- 0008-progromTree.patch | 729 +- 0009-qss.patch | 15 +- calamares.spec | 6 +- 10 files changed, 32700 insertions(+), 19851 deletions(-) diff --git a/0001-branding-patch.patch b/0001-branding-patch.patch index 474f4df..52f9719 100644 --- a/0001-branding-patch.patch +++ b/0001-branding-patch.patch @@ -1,7 +1,11 @@ -From 8e59b03b3eb539f88787a4cfc7db6b540f2cdff2 Mon Sep 17 00:00:00 2001 -From: lizixin <2271170409@qq.com> -Date: Fri, 27 Dec 2024 11:40:47 +0800 -Subject: [PATCH 1/8] branding patch +From 56fc0430a2ba6876c3e1362e004b5a650994b507 Mon Sep 17 00:00:00 2001 +From: Super User +Date: Fri, 8 Nov 2024 12:38:42 +0800 +Subject: [PATCH] =?UTF-8?q?branding=E6=96=87=E4=BB=B6=E5=A4=B9=E4=BB=A3?= + =?UTF-8?q?=E7=A0=81patch?= +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit --- src/branding/default/branding.desc | 40 ++++++++++++------------- diff --git a/0002-lang.patch b/0002-lang.patch index bf0944d..f63526c 100644 --- a/0002-lang.patch +++ b/0002-lang.patch @@ -1,5279 +1,31662 @@ -From 328c4966fc09dddbe19e69c17debf008b5272e15 Mon Sep 17 00:00:00 2001 -From: lizixin <2271170409@qq.com> -Date: Fri, 27 Dec 2024 15:04:43 +0800 -Subject: [PATCH 1/6] lang +From 18a137ef970bb3cb19227fb5f9a2aec5568fd962 Mon Sep 17 00:00:00 2001 +From: cui-gaoleng <562344211@qq.com> +Date: Thu, 7 Nov 2024 20:01:41 +0800 +Subject: [PATCH 1/2] =?UTF-8?q?=E7=BF=BB=E8=AF=91?= +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit --- - lang/tz_zh_CN.ts | 2626 ++++++++++++++++++++++++++++++++++++++++++++++ - lang/tz_zh_TW.ts | 2626 ++++++++++++++++++++++++++++++++++++++++++++++ - 2 files changed, 5252 insertions(+) - create mode 100644 lang/tz_zh_CN.ts - create mode 100644 lang/tz_zh_TW.ts + lang/calamares_en_GB.ts | 8 +- + lang/calamares_en_US.ts | 5259 ++++++++++++++++++ + lang/calamares_zh_CN.ts | 6744 ++++++++++++----------- + lang/calamares_zh_HK.ts | 6722 +++++++++++----------- + lang/calamares_zh_TW.ts | 6739 +++++++++++----------- + lang/python/en_US/LC_MESSAGES/python.po | 399 ++ + 6 files changed, 15960 insertions(+), 9911 deletions(-) + create mode 100644 lang/calamares_en_US.ts + create mode 100644 lang/python/en_US/LC_MESSAGES/python.po -diff --git a/lang/tz_zh_CN.ts b/lang/tz_zh_CN.ts +diff --git a/lang/calamares_en_GB.ts b/lang/calamares_en_GB.ts +index 0210077..5247c32 100644 +--- a/lang/calamares_en_GB.ts ++++ b/lang/calamares_en_GB.ts +@@ -739,8 +739,8 @@ The installer will quit and all changes will be lost. + + + +- <strong>Erase disk</strong><br/>This will <font color="red">delete</font> all data currently present on the selected storage device. +- <strong>Erase disk</strong><br/>This will <font color="red">delete</font> all data currently present on the selected storage device. ++ <strong>Automatic partitioning</strong><br/>This will <font color="red">delete</font> all data currently present on the selected storage device. ++ <strong>Automatic partitioning</strong><br/>This will <font color="red">delete</font> all data currently present on the selected storage device. +

    _Yt`288y8Dt4HUy@LM +z_wpP}6J!3w3syU=Wm-HupS*E)Nf5Okqop2ZRp#=M*0B1d-yMZ8u=m~(o=K;#E8P|e<4 +zuWzthM(%tlf_aw`tGSY?yFHXdWDm22Pq3R%57lX$-ps2rl@|8Whgc&OPJks*uNNDZ +ziLng6sc$#zgmO&G5Bk_SLxij}c26NdA(`=6F<{kL(r95af&{M8SHYc7TP!(Vw+U!M +zu0J!`X5}?THHs~L>@DZP{mpzV;|+tWFaNJ$dPf) +zENe=kYyWx4Jj0%R-z4UBr+)^VQi853)m&>ERJ0&?g)h0QjcZIt^%>bx9LCwyzF5j_ +zTmaP>cdGKxu;?Hbm@cPx`gs944W(d9{gW)vljT_#P7VIbhDAg%Rsn*K3>bUVNq4IM +z5e$vOt4#I%?rx=oX6ogOlH#zL_oHs~N6Y5~Qe+1UVd==tCO1Dre>U*^RWQ)#zZmuF +z-LC`k8SIi$>_%f7#cs}V>UhbiKMZbqH}#8>dfbN$g@wDf6nV(A{GD^g>cpec?ss(U +z>x;)XLga)K=o)<=ZB{P3>6(16!^iOBg!yw^d|G~Q%#x?;q5G8oM)m?rJGrS5bx9%{ +z6Xl(iLq;5$Mh;y#j=UCrAAg!UtZ6cl#vwLU$8eZ_nzHdHYyBIW6~yzema~DNpP;+F +z#v<_nWX_`!SGRr0;q8d)KD0-=8^A-!-m7*R-m+0iGT%W8u4@;l4u}2I{Dv>09D#cg +zYaRCZxKHwOjkLe`zV4QhI)U8>U6hveKR&U@2L5yT*5xNKye17;k0Qpn?Rk<$u0ccn +zgNzaxS$7}o!~DG~HAm4@4YNL(o~T?8aI_$}`~NF~vXAhXU1apgpbA)|;~W2{{F;0Q +z!m8kS60KKcvx?k^zF|^GQ1P)D3vMFLeFk0NU+Zp1ADEN`#BJKEY5g| +zfe-vB*ErdF3Vx>=+1)I0_iJ$)r|4WONajJ>LA(b^O1I#Dwb9)c{{W`9`fAXlB>{cOsX^dA+InK0EyW=#x!_;wO$e>Ti@*J~L4RZm>^AW|=^q47%x +zxnZIBJI9w405I9lC8bOz9#WL_i7!!ikLDjz_Oh?UgK)u*^Y;^y;1y-I<~v!eizSZ8 +zrJEHT<7CCjlB5Gl@Z$l=UI4l&GI)IjA0JxAbLn7_%9rnOmw;X2K +zG^jz|@zwl7pZB7T*X@C>@jrvdjqfwml)B0R(HFZ(-*9b4_B}>UJd_S0DRWlL!9Y&S +zKWA3_?E#~^A<1S8JaHG-oSz^UiuA6+4f>L86Pp78M0t4MBkAj~*AE#oJ{r&oH!V3F +zMkg(uo*A=9>Qh+%QICCyrDv!N9pYYZ83iyhcq^T{j2ye&UHpP`V>=j2V^q%=w11wR +zm{Z6Iw^N^F1};T+VX(_*w@ilsm)|%Xv>0 +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 +zCQil`lO8B(I+ +z-dhCR_$jKTN0{8GdAdjH_`NN>N~;x8+KzT4!oe?*ZXomjB8 +zk{TKRU;958{XQxUDs2c-=>N*}hEQM+ee4cp>rJ{{1TxvngWLPt>}yMZ +zt-hPMyLsu`3PKm4j!H64+`seWBQtb)wkPbA7+P=J-xem6p*6kdO(o)xqtr8Q746wk +zNwy7Ex|r7H3_O3Iye4UVg#v-zK2g*GPlx=FOcQz2onG7j42znFHFE7!0y9#LX|zUF +zM&-y5GeXgy)JL1H_}a3PN2gu+BJ^p>g*G6(CZAY`r8AjMJs@F`eaz%PTbX@&tuA{~ +zL#Z{`FAj}DuL>Z3_wXWigFAASR*&|J;;$JEiuA@Z82oe1?KR8mPg==jSj+l`Zka}n +zLa!WbuNPKWfumSK +zfYO3|cM*`l^FW3EV^R35*Sml(I`a8H8Kk+@Y6DB2FSb+MZta|7Ldk2Y^`g@0PC|1^ +zHZDP7$H=|6?wp!@{*|b0H}LLt*_f3#i^C%SKypFdg6ilcMYk$$3m$lId(>JL&?QvX +z?oOsk(jdF~qJ3BQbjX*>4_ur^d()RJxnI{c!0fTIQF%<{JbLO%Tv1NZFklwgz15l6 +zw<7r^2|WSRH1LCYmScaAyEPG)w6Afuw!+KeB15@5vWYfWO}mk6WTggM__MD=h1=p6 +z!n~7^47e#czUSNbzAMx}3jE8W^O*EMAeW2p9OtMfkaOo*)q9T9NnBg=N5;H8mw;jI +z?$>N-U2xA9aT98tpRZNY#Ib_7f@P>}f@w5yEMgqkse3UNpBLFzsXi7Z{ApBs{oM=( +zxNYkB=BW9e6His#lLtRAr*bPfAo$MctEcMRpntH&fy$EZmY)fR;d?96fdOn9RO+C} +z;jdX7@>4%HlAFBk~ZVM-cPcBuNUnR%hme@+MEEu&;T-h@hY9+-DdMhZ0a|!u+#( +zOjf;Wq-9YvZ=$(f$bi(c5!k`IrGCLoId^1%E=*&QGtzN77eFY$-dC@x;8gz^ukTw0 +zgQAiNxeyI-U%)wAMWpF?ac5DX6RHde=o?pKHjIs$Nh|3TIo +zRv05SlqT_W+g&+gXyy;m&5`>TkA!`iz2LR)|KPSg3Q;RmQN2`I$vRONUKt%mU*nE^RA1>} +zny2~-nQ8EA1}yCS0`!qnDH8hBav-LHM+$gSFb#OXL1~t|3Sn(BLeS1t(r`s1eXECem2w*2n~K@xg2|zUcXIv;Dt;&oBewo +zqgsu2*>U&Bu*F|G}>rP%KaHl&}biK=zsmh8)H{6a%MVDM#; +zwb|@*Q`Yb31BOI?2W6M?)0%dQ>=3*Zw3;pfM4t!>UzQN|@>GWx61Sy4;y#Wp-xaiG +zscDneUDIM*58%?1>(s|3i=_<<3 +z=Ete-A-A&@Hzy+PmkHnf<+A?-#FAp-QV#7T?*A(zq1>gHbg589=)*MFEp{Hu_1_D9 +z_cvOW)6)mAzs-oGF@fnbsn75s=ybwA58-}y1=?fmSd(cBl>TPp(?VkSI7Hp1Yn0_D +z-97xY$w`KZG)eam)7k_porNh9K08_^=T)npn|v(39jm7`?MG)}55yEW)clDJo}&g9 +zbsORc6m;LlsMa$dTIm~|Z^)-o?f8)fld`mM@Z)}jb=>?q=x=Lf{cjjgA8)+)d%*y! +z2iM@We(V-*!qy0D8+kI;ryN%+nal`bI(qSp)rf=H<%F(^!v{W(oYu>uCX4{HINe3rFWx^&`}k +zXGws=a@E|Q0=K^wStO24Zqpgxem!xvR@~ExOJ4igfRH{s +zLD_Ilw>zqh4#U)qh`qET!oo3`4_sG`S$ET2B9ZdpN8P`=8AUbPWQI2uXkx-q21cW= +zOap{gxQmf9_Do{mFT<$l7CsBPDt(q$jAzXK*0{q?tMT&v-ccCiy)5)MBjZ@hbGfm7BrcAf{|Xh1q)PGVnT +z@W_#&k9(BxU6V>&x8?6 +z9_OVM_mIWsq@mQ;QJi-IT%`d#n~ryvRLyVj85Z$WntWE;2%T0pU1z}=<&Aa&^6NXg +zXaais{k8wK41Fj-zxJgzeb4zQ8AGb=-U{LMWskb!5L-PTf{e>*d#sn!a7aJC{S>Qh7g1%*zvY7 +z4G=;dRC%PJ!~^%D?EV)DsYq)X{d9*%fFu#N(q^NE6eKCcPc`!j|<3 +zlh)iY5?2NB(#;==o;IVo_QdCz^YkQSq$kO4FJ~Ak;d( +zZ+b{dhp|D=zgv?5YRm{3x?rifFGYdC1>ex+%Iu$Qaw0W#V`|LZUwz9Zj;m4@mpwF! +zoC0~dX-~Et?~qg;A5#odyiDH4roWMY|KylkHj0t`1_z)*>otvGi5JSi4>7pEcMTES +zE(FGZ7_9UrEnOQ&3M$#%J3-Aa_;O_e-c=&di~OE`Z^FSU6_@2KEEeNf?r$x3MS%IP +z@46$;w+@gsWTnB+H-(S)BY=Yb$N2*enIKgZ_Q46A!P!R-c}S1}!_J$8!Bkq77(_z< +ztHQVJkzMNSib9?I?1X}7z+_Ef0l7F*({o*f|F?5SxH}qX^hcgCFS)$JNB)&z3q7e6 +zQp%E-*By1jHh~b8J*753ku?LRe3Xky|I{A$wiXX{Xiq&M7UEz#W^u21|6DxX|9Ahq +zqM@=ue!-vo0{YP+xnem@Kf`OU=A%QGvZPC4#W&UsDh2USO(`!Gp3-0bO??l3s#JlR +zLz6?}t~;r6|MGb3jraaa+z|x4$<1H;QU5QC~AOa_44@sQt^D8V$xRX%5um<);#@;6B*yqd%_Tk2_P6Pp$sBX{k%IeWH|D +zl9~~&X*~Loy-d`q<^du*rWb~Or4;|)57E`sck4T}54InVS{Z@&19?fQQ8F8;D&ETL3Xu7!lEO4tBL<%N_Ok9`m<+caME|lj +zG5yLSd6JzG(tB2t=4dEhlJe|c_%DaNcn!T{ed^{}03?k-I((T}_CN)QZ<_9%`YiS~ +zxI)jgu%LDl3Xs{>J0{Yd!Jr&ED^CrD@mcrFt`4W&uCA9(*x6=ZO3=j1_1~_Wh@qhC +zz%>lTw~5c-MD{Rrjt~ +zQoy-{1ar4@f@Png&iHB|ih3s+C|OkXVJQvrHkO0$`Ikzlo-#LoNvoQjz6D*hST^Mg +zWdFCRD9$h)1>1&4XpR~~)b^=1o_aA;*U0Xn7JG<00~;aVz=eErDPJ5_MBJxI6!|f} +z6MdorsX>styJ#$nBaSykU(yC1I=AnMVTW*YHqdEgtPt}PzorDUaj4>njES9rz +zrG!0h%?cTGlZIyhKMrN0+g-=Pdi8%yb2wy;7?#Bi>*ND$U2f}E%~i70m=5alN4Cz5 +zgz+yW8CFnL%6WA@FIVtH4K*&ef3do-Dpd2zV9o70#HQDA{CL*hf17)@z^m-8l^igp +z6yG30cbLdTswDgGbJ9*$5qovoo4Z{|2^yg?tNihgfrkNHJ6a55%j4++wxiz^4L0A3 +zJ>Dt;XlI&dz+ +zWj^y~a!i +z8I;ilkZ!@bHuUMdWBZ#)KiF{6(ux$1sz`2k%!sH?;dT+uiJYR|Qxot5+C@CcjZBPK$3mQBxvkAqsg>I-!T +z_)ws0;NaNm?r#U1eX(5j#KU>=VbL6XEO@5jbeNXg?I;SAy&q6((VAub*Tu*R(y*XY +zkpP2`jP>jOL&e#xkSwg}3*|HAsplGECXb}o61vc$` +z$o@Y7U_qb0vdQH96w?b*2*k*W+3=vjFi}tf38ob!nNw=AqB6--ds3|4ZSlyi6f=vH +zj1})pR-9Y5B^Z{SV0@mK{w?k{}*#P~pysl52`B0%Gh +zTvO-4^H;?b$OvVMQR#y50YnsiVp%l?s#ghiDbXQy!Xe3IKGXmnbo^ +zP9`21@ybl7go)y-snVVpc}|sCN?Mxyp2}P`KEMnwb=7rAEc2t0eTcabU<6)dZYYr` +zWnEx-o(D#hm>v~I1B~*&C?L~O(6Rz2Gq%i4D=)q9GO=|PVbhddrT3{M<&dHT51Q(`Fq^V%7Y*UxwwV9scOkupp1 +zz+4Pqd<90n`P<&&QrhNGC8<Ne@EO2N>Bq7UQ_dkvP0o5@Thq$&wtC +zhqjq4_{QLYFO%H=d6F3$lH9RA$<+4^CcKm2_O%A1-i#}V8TM+7n_rA`{qu3IdoIQ` +zX^8pFQyOA^^+Z&G%r72`DTon}5rFyWia7r+YRscie*8#8uazwoe@sFtF#;}EF4mI? +zF`~$b*FPhe$UgaPxT^v{?93nL6n$2SjNm}Jm` +z1brTC=6ee}mG@!L>~5}{-N|KhA`F@r<6mZWGf>RQb2=F~zl**z>-oV0=lIF2ef;*p +zQto=|D9>bd@Lr`$_F4I0gDQX%!|%tt;i+%hnEU=&u3cKe6%z~j{-nM9a9S;cCpR)+ +zS~K69+Q9!arH($6+UPr}iGCB$FmS>t29B?z|Aa>RPHa{&$lslG_FDk+Ej32LPrZ7b +zdhMhp`b=q6X8ubjo?!f6yLq|5>?(QUo`=b;c*6>nx +zLf|E>yqq&QSZ8pwG0BO>B&V89PPdxWwwcr`c(G{iwrTO<^RVER5FN=<_Pa}5m}8J?I- +zC=n3xNBU*_@vmjx`;P$TLXeQh{|qMnx6fVp>j-f9*Z$di3OIdtPC~7aT{1V*`=dh< +zq=QEQ=F*3f3Sh2WV(^n?20u&tUw-*yieEo%^4n)kM1lEd0Mn9mdg7GZQnD5%#(Wg4 +z_+A%ZdGP^8)R|@rPIg-yZclO|=1^yOG?rAjE3hPe6VtPSXk__q}*fG9*@<#VR?zelRFJQIBt{E +z<`C$BcaFiDok^A#g!$lrrM!N7+r{^i;Bbe-30WKKusIrb71V7y;__U6oK2@>ZOl=j +z26<=Uo4pB&j~R%Uq$%prDiiT&h+5P}O_hSFRG2P-7>nkltvanr&%ydqiw`9JSK8;x +zOt$Q?sjPLB`Xc{LAB{j(4SbZFq~NecohWH3s5e~B#Nn`nowUoU7kqOR))WfBxGMeY +z&H{(&(rFTcNkN#H4^y%tyisKmb+rE_>y*ob!349j3_d%I`T|72O;+csB`NNZ%ZIxx +zUM`0h#A8wbt3w_Sg>)?PLpcsl1YI7>g*hRZlH)Qy+hRt*Wqwe1zeq34f}AAJ6(-rV +z2fnI-&v(P;`#d)6b=bJu;fp=+K@~hw=rSqC=Ei^&H@e)C?Qm1J$IUq@X64zuyhHn6 +z)|EM|Ep=G8!{yBqhZlFi$`Vv?!5<1-1uT*$BFC$h +zd0#9O@P5X;c5mY;Eu#m2D&A1B^gSCddrQw$)z(^%p^)Cfi8^%=r-0 +ztH}7^qL0_9b+fcelLi@Iq4B}xnk-9oykvI0^mM-DII6(%+8jrbr_iU0P)@^$Usfr{ +z3*ja6u_!RT@FM53UUnhGxZIHMD3iXlstUx&+)(7bk12N*oQQ8m63iy=(hwtln9-#=bxhO^6-O+|Wh#PM +zgN&#$x+6xfat+&IGpy86UKsJi_`NU!I74=zQp*HLq}xRRB@5|T%J0rODtbFVJihj0nAyCx6Zn}ea2A=%*6m^bG^;h +zdJ7+53Y%R@T0BZyT`Jl=M1?sR(R~?G*mlma6~HvcB-&R;K?=Z#5%rCd2&?i^JQ6T@ +zILl(uW`lWO8O-`3$;{7E+_gT*v=0m>ziTjVU4qeX#u@oWjNz}w8S+w$8~-K{6XV*y +z#`xni(X<~X%5R>~N{py60x|!ol$a<#T_F?W-~`NbItV4=(@cD5}bZ05foYltJ^N$WcIM;DU&rg;51D10U4tjzG-d1>LIU +zebC$pgXV@AG`EvMbD|8mr;97*#I>kZI{*M607*naR2eKL@7W#nQ6Ljh%FTco9b7&u +zPM;a=^trc{zV|dS;NE5i&TOIYT}|}4vzb13wbJJO=|j0JV(FDXX!Voj=mG?(^E&ki5H(9kWu$HGGJmO{U_JaXL22v +zOqCR}bNp~pDK8hoYXxEDd-s*J@GQX4BAa)70tE+-1|+ZPONZXpcGyTtsmZcnQZ{1uPm| +zY~o2rO(NxDm|o8$EDxEu>8cUHiKL)g(xn7q#3US-wICG4NSvyCb1DUQN5U>O-43Nu +zk6}-@bLss8F5iZiOo$PH@yCZ8A7FZ5M)_wX1V96f4>7)Sk_jYo?t_Yd6o8R)|G5kA +z_aCc!(h5u_L}Z@-GpP9AJmddcUu^LGrAhvE +zg~87rOYom-B$nOaS5Kw*-7^;e%sM|txmSUaGD{y!{Pi#eF=?Z|S~oNu6_+g6C33mN +zl)oS1H#0dNcBxltjHo%#Xrg+RO6n3+wpvPYIhV3IZ92+Nwe^@u?rE3p%^vwJ7NKTQ +zUtEgnJ>^d;6_dMo;i6C=F~(;d-aKsb<`H=Fu*2HJNjBCwDpEPnq*s7*C1SZ*t1zP0 +z1iEc3s1x(gw#Rq$CbiUGUoWIIoo(gj!&Gr_Ig|$U5SYwb!IE0bPzuYZTg|0x}l$ +zQR&LkX8Q)Y7J-I{B*$rg%jRl}4|lqJu*>EBQi)IY$UEY&zX?uu!Rds_p)hRN;jp2= +zVo$ArC)61(wFyThkR1ub(N5Uk3LoxqS(>MdBWL7#+)>~#HP7RY08Gt=+e0>Y=CrG# +z%OofOdbu*itYC`e`8M0n$=aGII-Xhu-f_<3n;KjF{{FVZB{Eso_Qd=0MybaOrLb6%#6k{N6~XTc +zrN~m(a!4APcwt0+@w)`&_!sF~DexFw3<5A>;2#@=8@9+Qn9GPPmw7p`;u~1J)#KhQ +zxMhpWZ?jx}or5y%%Zk`l*)G4$hTmmtXc2JH)4Mh%03-ez38_-0m1#&BS>Q2JAWBxp +zWPPnrkF1pm!2CHNsl6It1d6`%^+}uZb8!yTg(*4{;p3xm9@!OPT3#390#U|h$Cwa^ +zF)=r)lF26JYk*NP$^}s-ghYKwFf!X?0Vc&yrHX{E)ya))U}Hn--ACq}>D?YSu?<)@T-qk;koEXL+qj1Jn2%+ZRA +zGW2KLj7*OJj7lpLqrbq68i(OI0yFyYP*G;G9St)%jslsRvjk=wZb;8xvTeOymhGUx +zMc_pNj6VK3OVk*x$XuJ@f4L^x;ZIULnd5Lxjz0H~a$U}^RVfkNH2`YZ$7{j3cz^WBqfsDT_j$4xcEVK +zavsD;N|$uU+`Ln(Be$1(%KtH~(qoFOiYb4HrvPQlPM6zD9mbbyv;X9@Cq^F2^;^@C +z#J#Yi3ou2Ak&z@bfh6&pjF+jDG%|;wWqO57Vw*>)SY@47Ceh2H#3-Y_S{)ORarsM$ +zr{;PAoHV@n03)wavCZievRfpHY^NwYqC`0im$FW^LMCZz;(hTLCo$0J)iL=qO|Ed& +zOsTS&UgfB$>AS03?%ZQDv&Q71gEp&=c|3F6#LybIsh1MVxF|4|QefWP5oUG1$+D2iqXCP> +z+fpq2CdIrjO=fRQa_^_fG{nT2{BDAAYc<5&`g)wy>D`Na?d4zvou0ckxl*RecQt`&fN?DBW +zDE={M>8=|8D~ehP2|Z0Z>>v4wtKP8dFMn5qPO< +zv#4*kY3#6Q?zCv>wrC4mbVO~sViw`JLqsOw5=l73k{*TtOUfl_dZbKG9p(JONhqih +zi1CP}Tn#Z2jhmEqcCExTsJLZU#aBx=&#`WgJrRRF-5&3j$N0g_76!~pD79sPs4n+) +z)Bip>M$}P$W&>yG86e6_TA2}`$%GlbS{9@K1Bspyi0J{3^lDi@<)x9xW`URl{pLwL +zv!RauHKpF9Uwa+^3E-%Elj9s*kmzbXgBBWG{-DA4A5QV3N0a>P$|V1~D$dVV$N9zM2ETeb#Z}LmT;nS+ue%IQ +zr;y#ZQ3H(lpxROn9Vu6hjz@+LNfr~IR7#$=Xiuf+FdgN2k=3ztQTad`M`E~Z4T(>7 +zX-;{1ZL9;z>rxz)ge`WAP3h +znY_BnWz8;+R6ot +zr=&xs(^L2FZiSai4Hk&{kq5JKJ?_qhJJMY&cND;_ISzC3V=9ul%Y}+YSe$3EC@;l^ +zL$F`Gime_8TcNVaBj>2Y#%hOm%HYX-k2L|CXMzrELK2OvJ71RPy8JaCRs~^7wxd3$ +zPA~MBlPjf_4zoip3j#I*K%ei0O?y2)+YO)X5hK6Lr@Ji`r~FwpJXYjzyVxtFxG^L! +zA_jIxMJP|twRnD~C{?HwvvuXV2j-0ukJrlta$!cH!}WO%R~Kl-MJX_nJSLwp^Q1>m +zD=&Xmt7DS-L^(Gb(Z$L +zNWaVPvbAa%8 +zT)jA5H$pDib7vPx#CBFpIo +z;*l{JA4)JfpjDIM*>Q&FB)BbPFfKo#lF23FuoGdkN~WOkAv0fSMYICtbHm|v1& +zS%uB2-7d?kEf$p~xuYn_h@2!hZ8I36qL!sVQxeY%rWTq^F0h!8YcVD$YK(@I;c^Vf +zxyi^Jt-=VzsMN9?iy;bL^ka1`4K=c2Hay2=XpYN}Y=@h39BvZHPD+EaEw0b9=>eGx +z!~bQSi?;(9K +znNiD`27lEJqe?Da1u#m5k#(}|T6GciMXhm3l(8r>B_2b!d)%~B3MEBp(J{jEL0$kx +z*2N^1?DkTWssHw!Fs>Y=^JS8(h^c!70`yvz6hr#ukfPj3kBoqdS|h85+bZPs4%5mV +z?%WNd$}NVLISemHsXSu%A1SM40v%Fcjbr@qf{7&dHZda9QJtP +zxIm1niY`|jwRrTf$)ksDmP_oV0vLyih=))GahTtI=n0Ja?a+1vo;@|wfW?n +z!)J9Ko9bLP*SQK{0u4?Nz!bN7>=1zIaH#0A*&VSsED_3L*q7o;Wq3BJPnhQeOldc3 +z3R0{LrC1R(S(;_=(B>oyzDhE8QkP)enPBuAaYntGVA#uX +zhP;^IrWX?2@Ye*_KAYf=PsjNElTogEBFgWci1Vv8F*O=uqWtHoDF3lC!p~O-#6{w%uH!g(|@w4C;zjN*JR#1XnZ@DOljnjsb?7=5Hq=*{!^M6vAT(u18uxj*vSfV_F_EDN~-)&kNKf +z(n^eYWV+LS2T@^K3>~#xC%y(51u&>x{(YUUidO#Ff|D7*(nY_SG6FDB1u+_61U|bJ +zfGW7jST$1+(_{V@e@u)455#+>2UvV?Nyjy-c;>k=`lUN&@s++++ahkB$Ua@ +zn8(-6APHw%TOINvE;}M7+mrA~lgG01I17tXEH8uAQdn6ItI9l<6~W(XECO8~JE9P1 +zlP(yKMcG|EU!J729ZndsdTFaQy8UgEI%aY*ZgVgSTaP-tS{UV>N{fP4D2>66PLFT) +zr^wl3a<~~}RZmtsTM{nKhNFCHvPvdinC7sj07e2hMER<&clfL<#k+;@{!TIP+k9G? +zAm^~h-ga4ghB^u8=!UITF7Jda@{hQP_oXS}(vXC@gr`b`CBFV-*keZ%JY5uL-ZqQ7 +z^WlMz%Y6Zu5ri3e9+UGthHdp&QDPz9mlIK0>$RDa?ehFihn;njW(YOyaG(WB&boYa +zz~$3QPnqT=VeIiBJe!;1v5?7vY43R30kb{(0&Mh!`v&>Zm +znD3N}0;5L&=G9VIxm!xF%mKEwU!&t1f>DN!5m=j_J8UC4bqBFNP^;^<`+j +ztD>5(-Xcm1%*ugBvRxk8<}rI4+$w8a0xq&HCW=drKK3dua?MlMua?xXbZMqQj94db +z$jwk+(g35^$UJT>gxiWVM2QdPCh>a*q^d;XleO9-31{E=&v%;{x3!D4hb=1VQyi#^ +zva3GES7!{Ktw}PkB*`RMDGNlAvdYOJQD?%cV?;2_*!%?d7AMpi*~%&lnMGwbcNALO8c1?WmZ_4& +zh6hZ>XclUEk=J!C6?WgWpRV3GTD}%bb8r!qR?cE5+g9Ilm^y?tvJ&?mzAUnTr5SrramzzFOm(`DKO7_rM6m_~-u72N)^1l)0hM +z<;G&vh&rJZm$WBlyTb68@kif03#5yt9PADen0a2RjXuawdMK} +zo9lOYN|h0Kk&)+Rl=|XBj8b4Uz(|0>g#e=Cr`rT$6?h`hgFAdRvxmHKj!hH4o@Dn`Rj2} +zVRR3SnE2P8ae42Y%lqeC1u!3-b68)i0p^Q3mv1rvMwMB%xD>UxDv7MD&0$xkMRnLz +zYh))QQjq9Sn~?v}n=}}f`p3F9ZgVsNYshnEJerl{;VlM>zDY9w%OnqM +zOfqvrf_pxWbH|4UQ{FL{ur|Tix8jU>!(h~F2}ZnZD2Tc7g*bottD%$_@x=V$sVG-J +z72~SMWBhiF1{rPemzAjnTjB?q+*m?07E%X_?m%kRnx`GZq+7a!6mrYesHt&v;Qxhk5 +ze}e6Y5|kcGQgK3*7g-zA@N%d=#j(Z|C!0)8w}|J(roPRhvE8J()25}%qBU&O5wSJA +zL~Xj`Ru8}kyu_0pvM!bhFQx^(<6>G)dV19vBfU~4024Mnx-Gp%Ch1d>P9}aBQ5(-j +zY_&!v#e;{!4!hf7(i^S(K-T?48N0WW0r$$WyJrT@)IU2>(FA4$VAN64$})U1nQDxf +z{bl_1GBN!7@!>@PMwAN`7A;t%o +z%xk^p$(}Vi0T?mxe}8d`A1+Pu!(~Z+wA@et^V2nk0vIvzs~#9pV0?g)6|#4uhyruk +zMy1qsrX2LRbfqM@POhhmDn*46xJjG##jt;*Eum7Z#OETu2}vBQPohlU2O49Xkt8bz +z&N^_^@YvPjP<+N>d!0*3vqw>jM`4qrjQgdH4i(J~)e^`NhMG9+XoqjkB>C`|$=jzr +z)}0Yke3Ew#nS5DmXn2vNvL=t*CY!uAk6^oaWgK!1hcCO~nZM_LuP*Lp!#N0aK~AT~ +zwpMs;Z<1H`8f>VOl1kXr;wsbqrh1RB8ypI{VP_mlUHD8syjP@nFwbOJ87xzqE*7hH +z!Qw)X6{ShOI0rk!P!RTb<*3B{Iy_sPQsD#wZYQE12RaR;sP}NItYUf`OWN#^X8U53 +z7xQ9ltA*0AOJx@XkJ)@x(anJtk5(Ji=hPN=6~HvfG4AT%j0`*=gtS@)@a&L+fNgj*nh;;F{>}i4z^DRE#l~M(jEe5p29JM;y7(*2SpN=>x +zPCa-A9?wg$Fw0|p4$KNV%*=JTFV|Iy%xxi5c+^KnA>lyil*h8dC=ch^Y&|YLGNQm( +zDvYI~7IKeTY^t&OsNCak1smI +zxp^M5Log%Yurk-;lS<&tbzxy4a`)(KnSFI!xGv(4>+7XcK3 +zm`s4VTGGMR>y)`eYr`Lr92oazLzw>s1>pTPr-`-jDU=o`=ul1x*T2lE-H^7 +z&-|V5z23zY@3blN{@eTG6rPS#(-5VyKEl>B25%lpvS53dae)Y<1EQqFm=X#rQ@=pT +z^ujpP3S!C^BgK}IJ~ld-j#|!6Fgj>3E+qbzl=8Sp0p_j27{h~cZV5ygDhXzxgz~^F +zC{41g%2YFNr^y`!rrPxrzlzMzfX(QT$+%qUoDpzJF*)C6T&}Iun32I0BLYd}C=fFu +zDC00Js9&q#MX52O$oM0`qGw1@U`C*(cLZkS`5vH2t1|*KnINO0n9~p=Fe4rp8Q=RN +zt75+5k_j@I*W|nhV0=D_7!i@qI1=Fk*C{P^Cd76Jm5! +zvCD1c4x@KDsw+nBpIYT|ceSGcW@44BwONRPU#U0c8eqf|Bfl4c58uyngCvxtK}L=O +zEjoGZ;sA5Y&h+}&1pqVB|Fy~_BHH)%IE>xpsID7r;J2ApX{&a-FgAoJ_TwHouw$71|K*2z{z +zkhL;_n4c|+^Y6=I{A5{_pDa)G6ktjT=8vR9Mw$Kf(FYj+`2B~|t7U0$5m33<$bB;E +zxd&rh`CyDI7Dc&yVeGuQY(bRE7DTvgL72-IM$|oW@8yf)3VM8q@d4(tc@Zv~7v-{f +zF)ovJve{t;Ednk+!1xd&YRsUSoeaDP#0bdrz)TuqM1>hRy+zH1Ad?9x7dw~NWrEKo +zQyaKsdIJNdHgVacGYo&CmDhH*^I=IB>r0|+C=Vm>vSm-4ZF>`h_QfeY6ldoVgI&jy +z>^`O8Wq)moL-iKN8Z526w3y2GQrE8GrKuyO;iX&P#i1+e&>hnwo)IPC9CQPbt|@RyBT +zdiM#fh|TDr{|s60>xGz1fDw4?=zk%^{9l2K|GokzKD7A9On4C}`Tq+r@_Ur`mld*s3k@z?oZ<%$r!N|U3}?CWqi*zIyq6o?MkbUemKN0YpJ64srDH;;R~eK@H~B17#K`E3@V29$E1+ma$* +z;HA?h6m!|y4Szdgvbr?P+s7c-33=@nx$T}>J$tPt$;Y)GU$r_4UN*ME=M4^D)LGWlz8?Yq;&s4{GI6uMCVpvfID=Sj0s!Fk>*x`{PkJpYQDH7m`z{W;cQfBc`uF2OY +zbdOSP!c`qrhuTscZFM=4R%AqB+IZ05Z}}D<@7DlS6@kK&@Xf9m<)<84)PIK_oe5}5 +zm^8<=`qCDMj+hSaXiL~Mo383?$v@$$#IkpGxa!0ByQL1F?s5qo^Vr)4rz5Cn2i2qZPfpfMrDi;>yy3ESAxlepBl5i!f +zWrcM)xXDQf~Hy#TahPG$qq|` +z7E40#a-qk&JKVE%XaE2p07*naRA9|^m?YMRfW`eGm>2YTAmlMK7trxM9tE%R8AZ!juoFhqPQA&*fZ4KQ+kZ_wfSGI)2F%R6NbZ3!L5^M?HTJ5WXNH|3iAu~4Uv$(oo37*8oL@|jS537!Yn7w9#vTZ=r#3A}9AQN{v3 +zzmiR&EQgsnu=?-4D{D5pJdgu7Z__<2nd*zc%l{N$WOeKoDXUDck7t17m38kQn%$8$A +zCYY3GFfN#6bWT#Ol!=fvgvWfW?x93{i7SyrKBLgW$25ki~!vk`3)cLT0rGQ4D#)lYzlOBi(m<$P| +zdLTyK6SNr`auL8$Fe5+{(5q%QBdSbVkx{Bl8f3(%FNS>?0hJ3OM!>}f +z7=aSK4%U0jgcZFOc0RoLDvN*Yg%ur**ZbI0o)~#73XGWguPcJSFL1COFSrg +zWZmnwwE8hz`A{@Kj8q1Gy&fi|m40!h81lzSv1K}C%s17z4KO3b7b8Gbt|3O^mo>-;tT;U**VL4xi!#$kxh4Q3 +z03?&Cz+4D0qa{YU{Ct2Bh?!EM*T?RubQHkcyVqrAjmxZkHgjrh=I;}TF +zmrow?c;c|j>LV7J03#~Q%O_o4J>@8XS$D?f?K84Q=3X3N8Z^L&0+ZJ)QOdHL?NTOv +zFl{y!9TqhzPT5tx7^mfb@Ci#5ya~WaV#~>-?9O)aTyc`83Q{~N5EC$1mYrbfR)fXg +z7%cqKVD1+Nvo|ET?~^2Vf0X2o_cg>!SR3c|H)7oOT8vSz#2EfkdY$ZV8f5YoY +z8|Rv*MU9Db_2Y4+#)!e+2bup`<%5id7y%jSjPd7RWxY(Tn8gvpzbG_6c_hYy4IgqhTlB12LlD +zTrQw9FQQbK%jZYAa(3N-sFkwm +z+Th>+BFBEyn#r7t-6Piog!)YFr0?`L<+J(EnWuSayA+@`v!T43jb%wTRYusnCrVaL +zoREB(btuM;BMB;w8&sdnR9;MuH(H#Kv@suET1^@{ESfq*eKD13zawnZnE@~YFFwGC +zSzo}#pJdAESrZdL$%GdH7$0Kfx&jzm8~nx8FX?1q>4_2lgLq-2jXj}PhR()xCt3ElckOPr@JkV +zhiz)pvC0C!C&EzLK>}c}X-UK^ZJjz;aYQhc&A|8iSnXSi{r&4@) +z%;1C59`Bunb;n)aK5Ft+t$+yROX^s&^u&1Nx7ieRIplXkZrmk10&hydOIetY>OAFN +z$?Zyz-{q*4;dc+(d~nKPQ>({DG3z(Or*$5mo;ApBH7QL(xe0}FkG~zVSyT{aX^E*; +z$3%4z)BehGm!$o`iHTj+@f?QDqbMqYTF7_B6a+ny1^LmY`f*UFuU`cMA +zCHX0~9EE-D9{W374mY|~*4b=5Z1c?__;fG)t-#{Rpv9_?%kn%}n&+`N$7D^ut-LYs +zm&2l55Akl_k?SxwR{%!V!94B@$|_k(MK7!FmkJQC%SU@W*6$HBzsrVwu&mf-YADXI +z0-IZMU51BXWDtf1UB>3REGuwTdFH$2wleQaq2}5Wo3|u=Y$q&K0OIlIzxUf*BT9;V +z(Vg#cZGpgyt2cMVYLKV<0&kF}`vRBI+cmu0wq1KuewPcs40zm}ZL3J=C%1U4*y=Gw +zR>88-M*TFj`0#Qe!2B^sr;YikW72UbpMgbv87iua#3L7K1!jbp_w#LTEp!#Y2*gMa +zj1*T&TG=16T&~{MTafu%DY6{2Hca2w1Y*JrTHDTVK51i4L6}dEn3UBf*xeWRANtRZaJW^@0s5HgBh0+ZpU?Rr;IKuIC2z_ +zkr9ZIxh3e52{P9Q9R8AH_sn$xn?DC^)toBrsdDZsFaFU7m|jIC6HvZ=u7O6ciD`vJ +zz(lJp7lW0HT@z!!>WA^o{b`7~QC6+w!@gP{)8=_mVk9nE=GIbFN6g5b9;1{uMy}}< +zF&|<^ry)i>E)%O^k{_A8OH>=_SwX#4AV|Pul)#NZj3k^@I!vv0nN}^GGWxxTm)Q(2 +za}~Js0*nBN_OVE!m_#i5(4u@U>9}NxOqP**^nL#rV3g7$z^1xj(h5w*3YkhE6M(6- +zRRY=F6*dAfGj=-)U}o1i%-QQQf1l05{T7Q4iizK0^--56j(R+GOpXqZAGUbnh|SYS +z9iBU8^Wq7IS57*-aoSk;qV?)B_R1!X{=;ry7B+nM6csf7HnA=|0 +z`1`9Ge|t5-jgpU8Gf4KoR2ikrh{bHGmbxUrnUdr; +zlXb40ta0rt8oy56HLvLW`W2mPUe>tgWrJU*-PJGaTy@U<>LrcNd(q&EiJH0yXs&o6 +z!Idw>xk7=Bz)eCaF{0R9`huoTl$stBM12YG(q|J~_H6Pjh)D;S2x6oK>wFL+*%-Nt +z9%=4WVx*ny!m*8=Com$P|2t5Lemwo>sE;3R;)45IxnNAIQga5p*1+OopEc!ed{LF; +z+e(XXYvTO4JxOe5f}GtNMf)_i9MGvgWU%e1$<7m|3hnQ&vlP4>QSf3T%1d2~&6zfb +zdX;%`NQW26zH}rdxbKtDrFAT98;jsYx6|PzR9Su=U;<157$jW4(3~@`C|Fo8B +zBhwrXBm)k#!=4WL=K@w&>Rj>2-W0${9!ai+3m$GI0vJ)rO9(Jw +zquGU0*pRwkKGn_zPj_(P_;~nC*~&Qg_bD@AlTGes{H9z-^ +zz~cYr83EJ3gO>Kpfl4hUcCV>|_1eiKcy-8Hl=Cex+*p@)Oga5-(n@{(fe0Cz>(^FD&?6LBI +z#aAZ+RhOL8D3&pZ$;f4+OJ18zZktbb0y1@2dCXyML6XG>Ju)2o9=aIiH{)y0xK*{AswoqtO@>X2Z1IR?OhCqva*a?aY0(`Tb(cm5b~nSia-HRc +z4$DelX&EfrA_JBN*#~8729CD-YP;;928Fe-U{iu`s~yAw*eHLWRS|$koz$my$Qu>` +zqSUDG&9!+W=CGjLXVp%aQxGsd5AMr{UYjf?6(q?$9?$qE7H#ms=on;kwV3RqPQ@0P+tn_Py+Tpr5_ +z!q%}&crwH1sf{Lcb8J>t!57sM+7DP)6@(VDZLn@9d{_xjWLXT(H0hfwum%0H;NF-| +zpA46=*@4Q~tf-VXpInxd!J=YVQsnY+iO=gL@Nj;BK*`@leUUe)RouYmwp^cEazh11 +z)R%wez@1W0EcP+kekp_j0uA}7fd37daQ!Ba0UJH0Y=Sx82gr_1Ke38Q?j@CZiSjQB +zUNS`#hGZ~(1F*qjUlm-GZeKR!%iJdHFGCF1;1C>Lw +zbOvN;^vTp!xW7+^?9AvqQ)=;YrOV3|F3*)%JX&BeD%((M&fS|0?h=(G(`I0n&G787 +zVtI6~qaa2;ACxKEFrk%fK!&3lC!%bOfK1;^7g1)S3jrns8TmK@mrm71)z`V)C7>hl +zqb{Y&biz#NSCn3B@hS?)$O*vQw%Ji9@RANN0xr=-3QY9*{|qzd0!){>az0==_iJIb +za;UBK1XJOaNw3S&-U+k#@CI2BzF&lw6g^m@1!#DqS9_a(JZL +z1*m@I?Y83xlg3dESa^sUJYUzrMGo?d4#ZjHfXpBg;0O5=g$ +zN$y*sF(L&q0~aLd_n{~;NqS2=+1rWGQue0KKi)79h`HspWSEPY7w50@;tFC^K4!MA +zAm&dqHU2n5R2hL8?d+ST^M`4Mx<5|Q_`?*P-%r-m{cf_xZ>JdiE_J_s#o#wD>*}t3 +zS?AhUy6)F6Yh3+`oY4t25y*%lBPTF(`NRa5PmHTm@bX-|Q>_umxniQB>}6sx6ZJ(P +z=8|XQT&5rHTtS1L=3}_xw`I0`5OUw+CA2HufarSGTdM#AN-JIA7K1d{>>|$88BRcP7c%oupu| +zPT2vS%0oI^59{naX0rFB)FqoL_j1G9rDiwd|qvE*+YA{ +z=#iE*#Y>=3{<^o&{n1u>Jk|v;VNRx1LCh}&YNUoaQe{$=%n`iEQ&lvd2VewVE)pf; +z8Btk6B__(nL;xdCfs_bfqUX`=5X%{l}wUKe;=CD))H$ripyb0t}-YlcEE`{|T#q|;j4=Apanq=6O +z2-s~vNn618CpVG?j&gE7^_G_+^vV;gA~-$TeWi +zsesqEwDR5#lg;grlYqQx6uVyA50NOiQ!F0l#LLTn#w-sADrE_lDlXSTpgHq6QLn3fgr!bXo- +znI0=EU|AKsQW!9Db6C|Zd7H)Ofr_4$XKnlR*gg_(kB6ml2sDOz2GNdq|UqQfK`EW}Nu9rN^Mwd|=17`eyy2mr2 +zXQsyuKlln_(v_EVfQd3Mw{AXr#}vTG-pu##i^~?baoLh)E?L&jg^Nu7-;Z?uYe5UYUe(CZ?^>Bvm|)XU +zo9*>+ww!8Z!(pA7RbuUuam!YQXC&43%kWH%QCS)fb*)nj2?Oc7p!dCU<9sYJ2*gy#&yj3RI9l0f3-m1yR31iv=YiBo5x}4dpZ?`usK9LT2^AT) +z6JP{f(%~f?SfU@3<}&$M8pu?Aa>_z>Z)x~vkUzJa0L#m2i+epL@3on+&sMd{vH|mkY{BgFn13MP +z0Bu2%zRd%E800_X^3h?JMMpfA9Q9Z(LH?5-3Seq|Hq`lQY5ChasZw^>eA*>e?~+sR +zQCNRAz{noV&bENv6245xzufKcKTw7QoL!C@@M%>$ACy?USLE<^eyGCCiy6$?Y%pV! +z#pLfTUi!x5g)cQGY%mzVR%hHAjmJLKd1ST01Isl=E!8`fnEnei`YAhElHTuzO3a;a +zCF%L5!9V6}+&*99me(}}F`~psOW9xN>RdlpyG +z7x_2^Frvhyt1;;y)BRC-Asxbuys(ywASV5p4l3ziKlkJR{orXXdhi6@A8w(?Lx-84 +z<+E;!$=5YH>#I8WaeF(lT^c!ib@KP=lpN5hQgz7&JB}OdK4Br}loSD&2wvp*a{v?C$U=yTwqc?+ +zvZziu0+xe+hJ!1)U?5hvJNhLXn*RjsT3!40b&F&(O-YDm~{fozjfoq&vhjl6(8(h;z=$y2IJX)BaBo0K=2lr{L2 +zNCTCq7H42<3+#!*ZVk%X9KJoS@#!IpPi2_)B&v+9V&*R?KrjUl`gp7B!vZ5wi^ofa8gEw_WVgW<3-z2`YB4q2Wc@xk +zCS#ChI0AdL!{OI12T`>EG{DUiVhC8L5B|w34xU$ +zgcsT2aa^UoNDG-Qv-Y2;O*Qvi?;++oBvk5z{?${&||Jdqu~+1@`32E;(h1_tJc65-K5W-+xC7FNJY`Ri2{u(%8r +z++SSav7i*5lh-&|Hn-=&-}9w)EKrcrQ!>~p#2n*+0Uh3>d8TU2HW*DQ#j=yIA^D;N|92^m{4j?j0>CXBrFqQfrcHsWPCg4@u3Q@Ds-+!VxwL~z +zmnP`3Oyj>6b@0Cyw$NiqE7yI}#tTIWemHJWQKwOH%3$MRkHtGJ=9RZIE~lOQ#7>r> +zGbB@IWLA>*~jcWSjI? +z!#$z(OtLl)=IcCNV)N1#he>4)S>jnd`)(H>V@_C?9A#e4 +z_Y5s%U9b{v!9*3x5x4~OEcof&AwI~00QD?Fh2rli36yFwSOJOHy(F~nD-}glnm#FO +znOMvQ%B8~o{RMWUa#;W-b@K6$atZOLvMuG%S3WNH86cUH%0Q_$qpQO#%;=Q8Y(Pao +zfAxEYzpucDrDF6NB0kKGAq+rOucY +z0x?NOF4h_LvCfc>GzNaC(eDF|dm@N=TjP$mll=2do!jT@-1?fvEw3iIlc$;GfCr`Nd{L>)Vb;fjjJXK +z)Fc(yh_y@rM=3Rvw9X8T%FLvzFcXpp#7HLQlJOzPL{Cv=IxS^Sc7cqjGD?McECd(@ +zF^_qWU77#@AOJ~3K~%QT?a^kssjNm57pkY^Hk!Fmz~HLB|-&xf0o +z^3@{+k0C&YicB}LlBveB&{oz3FFV`Oav$Llpjm~T!1Eon(+5gwaG6ST%=CtB7vBRqP~PVm@6h*Ts_s`+8HJh!2D&t +zMO35w&ks%R`8c5OGKb+Sb)Mdk;G`QijkT-hG0D6H$i_>pE*2<9sV=7lT5Ml^U8;Id +zNh6&s!AtF~WH3@KWHM%1-QZH$;84-xQ{LiJChAL*z)PUimy$D{vL5bB!p?;3y!fm? +zYO?x>&6<-wYflBNKkoA7373s$B;x{7t|I?l&T0tT#`2m13YvV1I-np4-#5YhEzNwi +z$6{lvG>8SNN$ks$HcR)!S$e=?Z5_%oCV7`NwLUA3x-8mn^23>codz7R0xC54aIeFp +zB8{nKHgl^2W>k30DtDPv;WN3!=AE6kYBH-4cuBx}+bt%>+W7Ktz#$ocl`R#`4GS*> +zVA=wXbim#uc%NwS)6zwZZ1fILF(d#gojLO_SKgBm*O7%6Mp~wlrIk +ziScPMELxm^qwVlzh0lUKhovPh%S${~l)$nQk2PB@DozIqTx#0`rNYQ2&(d;}cQ&=N +z<$zcNp~<#s)@>SOtTqXU^njBI`FjsVwXmT^=gTUKq7x{a+gJPGxqOp5#BsC9W$`|! +zmCT$2#iuOZ$kE6>=Cid))R%xg^{Da8oWnXB4@#{wyr1nbH#1;%Hq6fUnVD-dakJ0- +zEcmn>R@O+hF$~}AFgn|2yg*APJf01Y#4KjzIjk&&uPc4l)W9byxF7IUwa*td0yHos +z*JFe@heUbFmR%H|dvkmSN?v3$jL5cluRLH`IY?WZSnn2=1bk3pv$O=>ErR=UJ^r32 +z3QQ0JOSX@Cy(l@D)QR#UuMH(c-!DH^S1iy_h*DqV=L(SA{39w>@j`~n>>mRjmg-{x +zn2m7rW{Bw!?GPl<-3f|b5uTNM2^ES8NU>ei2z3akCJKA +zFEfN6QDu}e6Z7etI^{c*2D5WdsWhV0gm-sl2rd!GL;xeIOz(7n5s1n1>6IODr;xGw +zJfLTm&mGy~4HSU!I!^)2`5;DAmK^aio_$dUCjIN@sxYcLIi&4iXeX2J5jCdY7HJ#{o5>>UnSz+AfRWV!L#hHKUn7vyKb47z07ja~1YXhsrgu>Y +zF@5CERuX1+MDdXma8d9gWdbs`Sr(o^l_*Dp%S37NRfY1fGB*V<{(l58<7+&g+2$&U +zd10r=%e#E0?G9^{=j?TqeM}n2RE_dMpZ8_Z@?h9R_Hjyuks$x76QKgLrq*M9t;bh& +z9-_dc1B_I1<_f?xcnH8q4yL+A><*&B`0S4R98J9|c{~}Y7BT^tHCsDau*K%XQddFD +zI|UYR8~>^dC&7e5>>FS0)oTm^`=Mu=xT$9SL#ZM8NF0z +z%0H%!yHVVc49 +zQ@ifEDMko0kzzB|}b@S>rb^>HOwJlV87RaLpuL0nOEuLVyu?2^AVq +zXS%X8st7>B{E>|;1uz0J67CmxNr#!pQl?-gm5WKYm34ot%gPkl%fg(D)G&v4F0lOE +z*SkI5K)1)6xaR4@d{P77Rwwv&dz|n0Xk_oU$lGgBbikzSkV)lHi>=2^cAPNTTWhfY +zw8`Om8-bUT%^r2FKBwD!>f1dU+C3H8Z%#<#SXh}Xtz%*v3$0^a@DkQ0htO +z1SO)boC`1VdDuqQ1u&M>C`$=|9jFk$+JX@anfT+y8kEYw$P1gpan#Po?l#!g4$rPW +zNskAQ)9t|~x1;rr^b(+w+!c%rNBs#|H>4={APxP`1R02Hs9*3Q5Jyd +zvk>|%a~QT#I}2dcJMm&&vI0))9s;ZKLR?gpGq$hleC1;So0ADkWdQ3X3nT08rc?t< +z*1@2v$)&p4R|Aa|Euz541(el0Y-w<)X>-^q0Gtfe&dU$SEj~S9vi4ZOhEuTqq|4VQ +z9Wuo()&inZh$^1b;F8nik<$`T(Be|s;_%P9?f@%oq&1|Wbfz8nmGR|F;%^~ +z?A`1>?X$ljU~8>I-m!o$cEkI57O!QPD)%xw6BXc}n&UAk!(?F@tlthFR=}7{myw%o +z9*G4!n+@Y~;9&{!=U6P*BEJ``uL^6EKie+V$u8@vT-I!dcPrrWn1j68K1?=bl=9-M +zLC3!GqCdlDT%OOOO34cas&aa9all7K9v@5oMe4E(0{Uk;+@2f4O9U~u%bVRP%UA?2 +zcSyTgYA90etrSAPLby}xW7z>WWCYy45k_Xfv`mhQ`oL +zgW;l}WZMkOu@&U>P1P;;%QDn}=Ho>s&z8D8SLQOVz+#Nb*ockHR@N?gDu~H)7@p%Y +zD$fl!V-(2P43+Uq1u~HmV=*x1C?%%9dOGxrd7al+hJ<3CYOUxKbLqS+k3Q;r`egYE +zWYm64nw6}VK#g>GXNjFG1eXY2L_+J8EnoA(XO7PusgvbYIf0o@fJs4&fQhIv>45U@ +zK8|4KT!87^f9bT2ogZF$$^V%}PAr0+a%vPZ48jYbs6327OnI155zEy8m5E6$+n0vT +zVPYv$nUXEO0*@i(0xn?=MgT}aXox_JWMJe3Vgx3njyVN9qeO+N2^hUqYMEhpWe7t8 +zGSZGF)-_Rp?kbTW|2Y67cCnNaBM@`16ceOWmng8WiU>+Q29^5ZZ3&R}vB9DQr2rAPKK?RJ>EHx=MN==1L3 +zAOx60F8?~@C>zU`)L5hk8Hgh*ys>x;g_c~L) +zwRq`ElNUA^Oju{|^ctOUpBf5c9$KL>cDc^zrA7*3bcQU@82q6|e^s-r(dRvl-tWrj +zrNNzVY25LaK~KrY%-6a7b&cCzOLFV0Nu|!*Hc#hPxw#sDpQ~}}965vA((cyTI=9Z! +zxpk(&-{oeQ{C&Ei?&j$_ayLyk_}g>=n=Zh)VVbFc=7tp1{AH@aU#6N|H`U_L3S>l) +z(G|%2?qx%P%(X9yDkF-FhCs|!6Xil{*%gzLTsbkkE2Pov`2?3gCyiurE>{4faruPs +zB;bGPGXgOQE*T$Jck$C>aAn)%)H$M|eJe7`Nuk2~XR+-H!t$Dv@qNy#CL@*@`2$1S#>wAp>iWPhE> +zK~Y~MwBHn}FLkXRXWCsFIy_|^YmR%gB-3nTQD9&9JC&CZUPOHfm6QJjU_x+-EM;K1 +zfjUzFMvYkpMD{UhA!|;nQI;1#vV$b=`pUb?d)qv!+I{YwS;xf>3$!%RUEn3U2OH_} +za5EP_5(13C%tfhOj6jV1_3Z?hNR5$-CW`@mVX)R?x1r=#86E#N^8~HUPOVf3c0uzBs1TN82zJ31xRgeNc)!iy*{Qll&uvddpK`PF1YDKHVh{Ar%f^(lb4?LCX03oQC9 +z^y#fr?P;Eo?mPBjc0;F1d|9 +z1&u!WjUIVT9(gSRd96^`YEzc7hkdZaVorHn?YUH#P}t)0-3gDyJ4}}Dwba(j+PZ)> +zb*@t0*VF|pKVtF4af{OSfCHY--T(@d@Zk=J83hSuRk%#A4wzX5ua(2x@_>njCU0-G +zRSsvH246M6#GH2K6j)R?`P5q$jq=wl0ks_-``bPCcLZtx`HR?%o%i7}(S?xaG +zA29f#QfFU%K&vCIe-16CL8~RfeYXo>Dod3Uh<#9Mp%>)QPR0pi73HZFmVO_Pux@`d;*TAHFmtpb-d#=x@Oc*J^kOKpx;y62?pX|*P +zz>0EMQWmhZ$Y)`(z>BA`R>H><@ymW=|Kdo~4XcvJp2KbsM#J;c9m@|C^ph76CtWd{5^cjnt +zE8<+aGR_q%6I{L`&ZSG^bYIlLFozhviKf&vj +zamMAgGde4&>|%qmbcW}djFwP;uFj}DUG2B1Y)ndx5nEY*8NZB)GGnNpHzZqQXtt@; +zn0_%!9IZjLjFtCA6hU!`MBWOtk|e3#h|#97g2WjLx&U +zKhI)Bj?3^|mtnacL$X~3GZD~;olIRyi3!yhm;PA-G_E?;UKVrcle&AeTm>)!F%ig! +zDkI8^K+CxoS;!Q~#9Vr13&4bTSB}q}xdJj?>g3~qo|0$D?)o^&xTNP?(!X}TkI#ab +zTu)_Ql=_nApQXNt64R-?2)xKXjHoXufQj~1Bwr$#7lDT%GE^z{uvEBTvMF~LJM=D* +zd`hUs43M@mrN)Gn$pgzpMG12-!z#NVNFYW|!u_JID2S=_8By(XU$w{mTLT{03Zlr2 +ztdgo`fublE6XtZpN)|zk3qIPs00R +z9}6MIWo&i8*y?c5@>~m&B84fAD5W?tJvhde1o@gWp5jF=C;{u#Yqb +zFGw=*gCu?5kJI-(jXv)r>HT(syXD@})b)B(|6o*i6&I +zo33-?bW`15r<>d`-Q>Dy27j7j@Q0Ume)qD*Z(mCC+m|$c^I}q6XfM;a>KsKT%+6?B +zE`k5&!UnStV#G?;b(cOP@Y10!1ez|3nNnravN58_oO|*jT2AVIqlu$AGWHu3?{g_WXi;|5rs}vu%?TUXd)ZrObMTDGp?Z_! +z$~u5=rgO+r4>+c~97)=0>qCOcyV_hbYvG!)2kAEEv;vpz +zV;bnZu?_TisELaoZsw9lTGaC*Wi#sv_eYR;K`I;5?eTVGH|C-z;_5mf=E(%zGpJ-i^fNvhhU?A>?w^4pVZU{rr63PAEPod=@6q-nN+oM8o)$QBOnthEnVdR5dfX_ +zJdb5e;6)%KU4e-JCwv;6@DeI3U7tq~BVUiKW6{?xoDjlG2uE5cz=(ZJ6qw6jvbf@9 +zLjlaMr8E0L%?y1_jFj6JItx4d;rKTNf+5>7@rG7V{O74tDb-k<9>pjVU +z-4;|N;Jc$5>krv%IO_BDiGa)o$Zv)G7LS4khx~e5J&T)t3Yy&TT73%I0t(taaucv< +zm%)Oq3BEfWwt>lyeSOkq`7V=X2Ld+Kq3-ijHln(JRvYliQJ>EaxRkcRK?ja_E|og0 +zI^;0D#A5E2fO%EE0vJ(W-m37KRbnwQFUjh|9#tkPCo{Py!PJrju`}||i)^yENcFLd +zL>_K;*xwd#H11Pt25fH+_->!h=LcX@3w*Xs=c`JGqmp@X0$MdkoivLn)kQ}=!!c1A +z7#(+;1SS^+6&mOq05<&E%WmdUbw +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 +zOG81-#B~PGeWo-16PIQzGG2nfT +z{_pAZdsn01I~x7o(&_h>LEkrZ?wzmEcfQ8GuWR&qP2-+dld03W=T)8F^E7(T)wz3) +z#$B`Z)S2{}C8|u4J7#JMW&~(@&eZwmOpSleH2B91o!h4y+?ukSi82$~%|wj}%K>gs +zAY*aeG*dy0s4)UEol49ky)*28^~5A{Vk?uN|5cN81u?QAb1uNh=h4>`#5|i&HOx_i +znSe|LGXgRfKiQ_j{!!>(1^>r&&^>h#$ejC(fF}BSk0<3tbql{7*UqKmj`3c;%f@{^ +z83%1*M|72YDLrCQdCX?(Nt>OuE_+Vf9IUrF(qM6{$>yZMORIwl?RU5|CH%8(V<~VE +zh)I|}>3Ns4Y-4HgA`laTN;p=T4lqiYaUp`2PW8o-@k&ow$2x2oGDNi>$%~vby1eu5 +zb21TdT(U1o865Q3A?;FaaPzZ=xMXY-mr5I31TO+G57evABY+WzNe38dZT45%ncJjk6#orNGG7x~J5a?#~)$DKY1Rl;~>$E78aD{I~ETVDfJO +zCW04vp8NCvQ-C=OUc~M;p(|4(_OWiyhXHvkd+?*Wmis +zOf_P8%R6=oU`+Zfa_PU^X2fcZXTC~sTxFen1YjCPb(0n{0T|f^F@5R{SJ}w~ZW;t& +z3}4kKpU`1`jjRhs|{8iF!}nFMTri1ZSdtumlX#b +zRv!&mdlEiB8SwcDm$fHdK0O(*S~g`4Iea4(=29!{xE%8Zh~V8V7ITVB=2ZpE*%~mn +z%IEc}fVt%`slZ}hrNQPVDAeJNZ3&*;T*ns&drm)VV4CYF8a!$bHET8e4EM^rrtlI$} +z6vNY*KBICR#^(4uoC6PLiH*!stz>Je;hQR-b=59ww)w1;%H(RF^}Arnc6cG*<33Sb +za$rcd3{?gU%<~wW=c(|%yk;Dk=kltmO!k#(^-&2dD0EpW>Prc{R1AG`#5(3FtC+Nl +ziCs)iAm-KxVC2nn*_M&+U#@89lI2bOaZLx0ZEk1bR)Zf7>uf!pU`Ks|l3JZF4!OKpZK+Yr5m}0>OAj@P(j=|7e$;TKBjhV`3)-Thf +ze@uolE$+*)c`(=I(E^_b@?;anRv@BAD`OJu4>K+j;2)Y3=4(Qb@fex!Gc2zQV!CW) +zVlNACK$b)LNl0oyw)?XH6M@RPPqCND*OU??aFX41y;2|(!At}(5y%L<^pa+Vw3E6! +zxd>qX-7_6*BK76mFn>D0ocnRF0v~lLfDt7|GBJ0^K%_K$N%+0ORS+X8j9AKsN~LlN +zVEU9uy|S+WL)9#og@7WNmjSXDQy%7BhLwA&eN0rG0p&7o89r5@ULdC2=e`P2UjoL| +z1dQG4bAPo!465BsAm-jJ(5EcugqX9yMKzX%024t>q{K*Zz<|;e#FRdBQFRlWZG15X-=`l9dLe`mq5paoK+hj54M~hkCn@s!K +z{5*fmg?NU#9-7SgZma5jQH4K*aD3q +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 +zSyAV3P=mM^{P~D-av^1MJgIRkVJUd2x8R5 +zmQEKf@V2xWLCTmUgUPgu8fv-3ESnD3RViOPt31~1b6A<@v%JU+l!HQ8SLCu~e}d>4 +zxhVo|37g9)hf6kOpM|O4C;2SuAtjcQcGjVJbS7=(k5L^@QdBFk*_OvC3#!k$)Sh)X +z95Xo@cPMLzcM4tl?KYUON29pWq2Bft#O0oLnYXW#<$nW(+KX_s$>l_o!=Xm_@d(V# +z()eUg056~Az}#$`&$D#i&hdD8ufz1*1m7QlMYS+upU3blPl3yr2t1qZGi9&MiZa+y +zBgtbHRo**$&$D-vnE$5nHmcwzQQ;ibeSd#Z0n +zI%hDp#)+V@NZH$}Nw)3wWV+`JzU`AP-El1*%T-2$Q9Q3mm8;?26 +zs7Ucrev&bf6oYe<49QJ0B1dCnj-g=Y>1c|l^EAdrbmf;Bnk@h#@F8)>vfd@iiot*^ +zStpau7aQ@o2%z-eV<=b=m1d+Qjzw*T=Q<3{v4iBXy{1|%>z`%OFUwM3A|Nv`N7R?V +z)IT&LM?1Yz7J!btr+;pGA_2q*$n;N-z>Gl6Q#rxNTA5lcll8LngfMdjTz(p0WG_+X +z@f=@`kZ7Ou2GFX76 +z%wwP=n2ADC8pJCL#E6N1WTn81$M|ZGak5gT*2!GNGb1qcgg{JjkWkjASUfTUD*?DD +zcu@co^uP$Xs5Q6ZzzZ{|#6@OknJ6(b4x`F~)v>25eV(awd9KPs%=_WU3fYVMU0zas +zFp@&%@|s#9^Zu^@X3jB}`Ntg=op4xkDpX+{wMMr7ysQjQnVW4fd!NN;dkj9^Wib7FlMlbMc<*b2cXsG$H72E2 +z%3j-;;?+!@mo^x@xZdFTwFb|uk<~JR8I3V31DF}TTxaxBgON*gMlCiNxkzW!LY)x{ +z4TjA#7&=d9$QL?;=IC7@(|=Zq0kcx{|13qn87caHs-;J#@25IXexmb)%*O_O)R^@7 +z*rd;NU4c#S>B#_UJ~H|9M+SfT(BQ#o`qdCKO%J+ers@302Ri?*%>6;+vPvnF?wGfA +z?s+RvWCURDoFX)xRajJy_w{L{r5lv)2I)|0VCe1!=}u|B^pFG0&`Ng-QqrB$-6fzj +z((s<&`#k^a;bNGJv(MUltOyW`Ip3m$a(`(MAr+W`DvDVXlcvk+;m7Xcn1aG;Ajmt}s +zjfVxM+Z=@>)cgW0u3}O!8<&Ch7@J%nfHIJcpD5SO=KqUJD(b}LyCmQvDlkB8m`dZ! +zx*U6ZG#5x9>fjAt0E)LW5g@YEzO-YXzA{k7e!`vVD|C4*J3^v03sTk89Req{Y`?eN +zCNUuA->a#ZkTW^_sM#jDm1Z0>D4`wi7cFmq{qi>x^OVdt?_|idWU+-zV#uUq5gzr* +z+g)be;DX>8^y3{WDj)aY+tAii8xTDfU9AD|_8MxOA9E{R%T77SYS;ZEbK@ckvZ$BbnUG)_!r-!T#GFE!QtO&Bm7$;7&=K`u*ey-)OHUnzAY8%kN_ggCXT} +zk2zzi_LMgxNK&Fgz`}Ew{Fgf&KR!&>Skb`d&RW-4+>aCkzB{}_@MHyO+RD(s?tG`3 +zZY$f?{KrrF(L+B<&1H2{gT(|F0I@2lig2snKGw_zG+j|_Qp*=7QM+D)d)yp`2Sz +z=ozcHn;<~Je{6^1&RR-5clZ3<1w<9GS*~wwKzcQI|7;+mQ4%_a +zjKsZsj?St#g*oG4<5;FPr$<vA0#;p8x)!+*nYzK>LGlwTr +z3u>)oz`T1UN`?>O5jV1uZ7v7j@6v(t5*;8(4CKtC;F>fuCBDo7s1(`;DTr0;Sh@LA +zh=vS`;=jl^$Yl3V&609{24y59WBI)n>?t2Irs;8qeXyu)IKHrk12~bAg%2Or!v|CY +z!P#r$(+s8D%6DFG|x5n)L3ncg-}GhcP@pIg7?QJt&6rXj3(E^Zxk +z%yIS^WG(8VWYD+$enW-o=@Ff +zw%l5l4`eGR%7wCL?L%9MJX_X|X2^U$s}8fpDzqOE&Iaua&LcqQOp4)vJDlJf6;hlM +z!PT!nj`Es=Gth>>)R`O00IxWarSti?xH#pE7rfc+f?};&15DGR&@(@(#Afu8-3p?P +zj(-F{5=4d)td3hj;D^H1mWxc=fW*!xDKvOZgR+KMp6j7uXi8J(iRtm5aI&y;Ai;}i +z`T|3cml;*7N=kchAo +zyc%aLj9@Xeixin3GNzhlEaR;dr +zDQFZp^Rv>_Oe3c7hQxz~PobV8rA4!an$gd!EN7t~?|(E6lzdyE5`?T-g?w6z;8l^Vw_FKRyjd>z{Q))QPYfLdNJra1srPd|7uVM{_AVJrojT1k7 +z)B=ls_ToC;G5I98+118BS-}=hKcT6~wn3^8be55(P}m($kt9E%A%hdWQuKXh+es|v +z?|;Y>NTeic){Op4W9p6;nqDhu-^<&!>ckzO2FDsc{m*89Jo+Q!l_)t)XLYCy^-_NP(C +z6el6-=|@UJ#LteVm&8*F*Oz>He|)Z9GmFZDCohi5lZ2rdBO`e{)84Je{@k#z`GLD7 +zuY;R3olVH6wv;Ge2YrjUd|;{kqMJsoIO&-S>xBh#L^6L9K=-2~6mH2`CKVsh8>Mc+m!_%zgk^RWu-jJuE_hDN20aZzlGe*IxM<2i;csD_95o0T9Ee}5?ewB%eQpO141dE26*tsakpf3dmrN20PJybsZZGpQ}zEbSC} +z$~uR0=aU8=6gKebA^;;0UoxYUEY{$qv7Zd)cb&qO?m>%4X3$5#D8De$J69Xb81_J? +z1d?K{<-l9`MP&U(Q8Cln9)YJI9GlA>xbQM&?Zo150z^9)K5^b<-QR3@g386=vehTlzz_j0YKa+csZ$VgsdDFoh|K`Q8>zP-;y&u%QQBMhl^ +zBR4xb2d58t3eo_HE92cOkA&!c7UlmMAXP~qQivZ=0sH4!6oz+#L>Pj=6P6M($*X`k +z9=_{i80oI>KWK4d0Bf?N=9?68l02;Y+tH_YgS%;ry_4qq0SH-pjksJ6J7+NPMHi4n +z1Kg%d-B_&*LB8k+YM~)Z+#xF(1;Td-S2nqF2Z-4d=o~`xS=PGQPGtfHW)}4|bDCd9 +zE90?siQpWu$AGGZ!;1OsYI~|^RcufB?)T84Mm>qTeG_g8fAcFn?vJwV| +zH!5hgHWVEVGFtDhU`?#1`jrU(E>z9Ua=JGNLMHwopX#A`re*v9)A)Ar&Yai1tFhV_@rdD|{`)y1PNL|*> +z!HSNc0@fX`6}?NH|9?S~Pl1?W9v)-Oi(I+jJ*&s)@4Vy4BTj)G5g#>(x~^Rk)cTGv +zX)#4LsgE}axw>xORRZTnf>;gY@#mn~-XL$nnm|oD4ZU2@{h8iy8YvTXHOH}XS$EkD +zFDfs!$y<6%aFSQc$FklhQa^vj9`7TfhPS3^xBE9li=~H#>HA$;=55G|zHg3jncsgl +zevK;MDtLVCt%co26Cx?ywLD(f5o#LWwhi78dJ9U(PUFw-XC2n&mrZ|4BRvYvESh#~ +z7{t-?cF{btGSqt=`#FpA@>eV36<&Uoy)4=w`EN@cssJOqHYlGBNtoEej?l=~0zV1$ +z_>)>TmvOp$ZHAkgZ^3xbL6rO&`0Ych0*Ud*Q~<11IP3g>y%1Et>x7AXMQR?Y_`j(} +zbSTqoQVT8ztuU^<*>^9S4*bVVjmj-&x!`)vLK<1zS8O~-YO``1+k9Mc^Rt1vLS<=r +zr=dz{pe=%{l{%U7_WoZ(U$Yhv%;?tDFyk_`Hs)Dku}RmZogyDoUFw{Zw2% +zVwkS>eZy9xb#fdNZnVpDmOOSCZ63fF2(L}?Un=533wd;n0=zz%1^0~ea)A>$a$*|q0u)ajT+&HXX?@lbJxh62~ +zC2-sHNiu{x9)HZ=7X*Ax3(@kr=oDt#uL5Zf$%ak$pP$iHOvJ+bUYMe@#&8eCw!N_a +zh@tP&XI!dIRbL3_hmS>7!5;Q#+zoPU>JQ(H-i35b>{>St)mTY-UZ#Rqt*-oq#wTtv +z^Q#+qh7Q-?bTD0v;K%<(=Pa;O&&$&DG?Cx;hfH1pV|{nsINFA|Gd#_;l1d2nNj{*c +z?sC;3ni`!!zuQK-c@lb@g^zZ4hdn~9)m|N-5pbyVU&BatBp17~MNq6PbKedUtoU9M +z$g0>9_bwSnD|k}VBz8wkBbdLCHR(`f79~ogom?>+&=T%;R(+O}2smsVZQ0b@iHnyA +zP@sNEJGnS<%9ncj&BHil*Czwl+y5msw%ubQ+LdnI;Pf^WW3hja3;+Rz#-~+cb;Mj= +zmN^m0A)m!dXL+?_#{l0d;u|WDF+$1PD3V_2y^MZ3*~@?!fVTaHu=7L1VNBKRru)Aa +z*ybPEp0QfM-$ZJw;*3t|KwwP;X*~GMoKLODXR8-(R_n5V$ZmA+FaNc9Evwvpu|(L{ +z)!}e*B6qDpWHOi1YK@WIHq&`62mi1QJ0jniCtZ{OuH6SPr7wHSmm0sM3a)A!^DX)F +z4a}?%xn?l`D3+?)%p-@dT +z3FfJIDfum1*~r3$p+OytZee@IK|B3OPNInpGV +z0o;fmK0L;Cpk +z5L!}|ZT_0A*$tjzTB$TRmhWn^3QCFuqIK2EKAZqeI9E#fNMSq)w$+1d7Q`71zSURhzVa>%;1H%;O +zELoSV)!GixE{OvqJKu7xgUG7u7n#_U^|f&>zNdH86fc>$veh|9giPbOxh(~DUOB&C +z$zbwSFQ|M7SxSX(3rd76HBWXPtJ4Xn +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 +za?ZlPubCfv?RePoC`C +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 +z3mtC==a68->U(aq^@u%>hRwBOj_n +z6S8JQLBiRI)Gqv50-}=lFpFS;$zy_CdfwmXdj}CRP;!P4Z?i|D*R1{m_E7w*P8PY* +zsRQUS#A-=>6GN>3mcHC-hQjP~L(QvoRFWmAfEmP%eG?bKUBHGZ#NzL2?yunED0wKJ;o=;!AP1)*}y(nzw +z@5Jk;)Y+}@_Dpd&kht)G{3%M450j%~NJeaTp$5hq#q57qMJEG=W_b!BnF7FO1)B>y +zj-4^(kA{Ye#~bkD(f9gS=1>Fm<*@PI3bObLD~_roa|;!*c--%e1%xD~Jd8gI~LCP$%DHG|L;(YG^EzA2*><^Gc}oVf+%GX(m6H;X;3` +z{DwCv-jMD(m&Tuiejt%A2vhuFxc=8+tP7!JhSl9hmv35uA}a*j95^>yX&SSBElj-R +z2XJhx);2N<@tT&SHPVpFLND&7w6q4GGPxT+M#J}Q_*(=J?+JG?)IOBl__$n<&w!CI +zCWV;$qF3DLZ-sw}{LDx{^Df_af(MugfarIH{D;HB4UVm<2L(3N>dpi4jjL`J)RHwT +zaI5rKddhXQwnXof;j*GJM(4xxPv1-JrEr +zD@eY4pp78DX@H~>3#=PQ0mSiJnc^E%NdE9=b}jD3)2c{r+VFiT9jT%P+XmX5AN@ef +z4=m&litbTZ1xv0uT=u|#E9s0s_v}_KcJ7D86R@f4`JiD$Y$ecV&s06*@0mV%twYhM +zOF3@j+~AZxnWe*YqH9oPWZ&SBIap9k;t4Yh?C9UBW)vkP8NSr*RcWzognm~2wDcEa+iQ#)WI&jDX`gjl5xa5F +z*|ns_yJC=2Yro9%N?QdHIE{Xzpnq2=51A#5z)#jV^mr0`TbQSJ@dM-%DADtiko!_e +zK3mC>?Wc8x?#VHe8gT)Q)0HrT%v)Y4At-(pBbpxr&)_H(33O4SsPJjAD3C(4Q&Uq` +zCFKeYm4k(QtT?T|G=NR8!Zh=8zovfRKCOB#T?;ga3h&>diGQT}>m@v6?^(89&_>uP +zigeo*9G5Ns!>tdl8jxUrFvtsQwFeh!nugES+qwj|$t8rtO0!#Ks#65bG|UH^+#(Rh +z`3dURO0>zm(>%lA-;rjo?tKD&{*tLB9k?PW98zQ9(JSY!MKLAQFmGc{jpZ&mL`lf2 +zMMn$PFnUQrqVG&SF1$X +zmB*q0^vlfoC3~z&o`w6S9n){w7YdNwq)#=9 +z?GSyS5QshNOZMg#PAu_V1rVO&YsYp+hZI1b)_|kc;y8d+nw#X#$_M<7s)e +zE7KdKgD!N^>bjNXvOn2G*KQRTP_t#pCDe~NHfi%M|Bn|Kn63`=r&{d4Fl^>{jKqIp +zuuWZexagC+Gfabd*6kJyz(~P9#@G1sK;fgVwtZSNO82zGvVbs2LUX@N;li+LHtuGA +zBTx})?vgt+u9TmIiA^$Zs0cbhRny(rijQE@x)h5szWnU--sNOiDdT#GN`;&XC~^h; +zj*Mc1JGn`q5-MLAja2c^ovDv!H1WoMiuM^QT~AfC##m0)_fn*IyEveJhChq!U9x^T +z=a6Z;V*ESwC%SXS{xS!J6QP>v*e=mRn55`Ezv4R4x?p``S?nSE^ +z(}*sbHy<(ntf={Jx4iW%r-%cpe=^f|j-rgO9!kaWay-lu>5S2i?hRrh`7 +z5Xc9c=|tg1(D4X_w`Hz#AM*)dM$DL|q(tT&`xvO>V#P_2kO*_Iz4dd~&%pA$+D5%# +zRQAyC-%k1bwd1KC;YFRLyn*XyVV=Vez3KjYnk15zo)ITKSvsDB~Rk +z8Z*9~9jsmW;Bgp5=IaFZxE)kIU8g$CQ#mT^9?wAOTFTP)oN5;KbvoIr;fAg?P46{> +zv$KUx*6N!gqPy&^o;Da7N5P#E7FvEidv2eY(X*j{sy`Tn7~9ztC35%;+Mziz`F!+b&83HLGUs#v{Ovn^+N`1 +zXK^limz>()V|*y+6@CgFvVApCDCbdNi_mEh2hmshuvEFHXLfb06ntONvKRfr?eIs~ +zl`V7`pau+D9vWo-wd44IG@WHw)9>5H0fC>S(jg@=8b)`C^yqFF-ICHNC8KMjyQN#Y +zVRVCZN+`leL3s9m@x0oOV|(}AvHQNx>pVZFPfp`%@VrjbuP?(Hyb)8Sfb0_Jw=oNs +zu<`Z4INc6R_C~x68zYW!pn=zDYyUmh!m|5M6=H@R`KDCb=JnCX@*UsL%Mvf%H_aUaWd^VB&H6)^O +zneS>0EgStJ$CuLujWbSa%$ysolgB49M6JkvJ_(y2pZSUYvvs(JIm`w`$t0doN|c>= +z}1)_jPJ*b*Poeg3Dmf@j~W#pw30L99svqK!xO +zErWv%w-VOT>s+!ZCvhnb5c`6!t-Y{TRHeW$@P!41D9uv&eHj|XNfJfT+y^=UDlZxk +zbtr}q$*JylTnh;&M`8nGm7>TyT(ig%@oV?z>KqmS@qU2I=yvfv(45st*Pg#fePRjO +z@vK@twvJD{ui#n?Fi9fGt@w6(#yt{rQ*tM-f9*y%T&(#+)+o2#5HDp4v|LC=<=s(7a%{R`9&|yaPe;jWuZp@TR0R+ +z1y@CnU+If# +zG59~&FruU%$%3-p@F-F^&IeW`lWTWpaFH5b{=GmSVyx!fZOPfQA@FtJs!|?UDJqZ? +zH{7NuiII7EM5)jYnN@n6qjQN-ihB>>jHYa+EMusGr!siwQCL;9G#rm+KRKlI=a;|k +zf_4cm988H&UQ90dh9plbz;V}W8|{1h3*qvqTiGt67akA(pFavzs;nEd?0Oi}F(G3t +z$d)&P&&eI>p|G>g(Zhs@p{m*QXJz_-kQ<(7}2JZ +zG={TX4hW}B%n%_&Tn4aS-EKDoY9fB{_Jr_#U%H3QHnk?P)(Iw&V*Q+;hzg +zzc=msIS0bfIO*Pv%j3RdV1G=`!041$_{YJZ6)9~D>>2tI>%VcU#$<-^7HVGWQkBWy +z_^+-k3Wu1E2hU9sJ48^2CZ|$VpTg{^i{V?lj>V27BnN8t}bM2KT``RL> +zqh&=7L^c|&Lc~E+8)48FY_rCJp@zOLZj>c}N+5U7UvDYW?YPr`ur}F4CIZ+Ku#aD! +znMZAyAbCHGbFUsbD(Y_9$V!3-jyd(4(1RiusN)Jt)jjHtZmQp +z`R?TFYD1Fvt@f}I?*`k9?EWvs|9b(fOV158%>@PioZD(5okvCD-vuTXj1Nao{md4# +z@OX?|5>gv06GnyPece^kd>*~z$CM`=QXyxWY;46jfd#4Fqt-ukBmBzWk?Wbv^yT<> +z+I+mHXBa8p3mI>|7grh4pj+S+3We6Lky7*FE^#u_FiHK|xAHey~G<6b|ZmY05=)X;y!FZ5+EUUBMjh2vh~=}n+)^+u|6P?=hX +z9P&TPLV^jx6_cF` +zfkx?A_h*K_F>J#SLt1v6uNP{^l;+mH3~08^l>x+p}kBspHvg&CXEr7Y%+ +z{9lVSw0+)}l+ghdnmFzbj_-_;UW_Af1iv+9rnn|RO@aGv1P-sgeV&K?s?Bny{z;Rq|$cOA>!8|rZGHxP0O+V +zq`iM+Ka8@8Yuj42wtvDo;t(dPGVe`FOO(W8=sRTnY?;~-jca=$1ii@~hnRbnT`a&_ +z_3b8HBb3DO0Iot5y}EWAw(&gg_95#9Jm8>$5nMy7Kl^O)w0a{Hjr7xFhwdZXE3lq< +z>u2m-5_a$9I^b&Og!Q9xd_0_UnM1&^dDY_Y|JW9IQPV3A9vSl6Fv=j?pV(mkso4{e +z&4R~k#w1wPf{kOnQJJ)D$_N>efMhoLF;T2pMoVKX<~QckC(oP_vHiU+0lod326r>+ +zcgKf3?$4s~``lJu0^G`9K|o4%+*rg%H0zJ?eovz) +z7DfOWP}R^JfDRy@9YR*T*0#&Y%Cr3i8$$lV)PH`5__;zjMYW$?_s-Y)(<@f<5qln> +z{5oB(Z3I~S@}F+-#^?O}x(BK{>~*;M$^eWlw(6!s$Ii21>)=CoF*YMp_E$qN#@4_VYYQW%03&s^F|0`tiZh^*Ro3Uw^5kCkgutgd&hJMJs}HMuSwX&%J%-H +zD@jS9JB-xSHFf?(kk#~e()=M8tLepp$%7$V`ik5W7m`ueS8`pUggsC2PF9>A(Lf<`&nJUMlFCe +zQEkRJE1PP?B4cl`SH0R5e`zqq>#mY#>*T9crBh();;v{VgV(&g!KpW*a8Df>C|HBg +z4$KyB$BZhMcZ6q3TVkb=qLON&;-MRa6BHyYfMaS4N)I)1^`uV31x=1)2{6?Y2$90J +zYtD5yv`cvWfLq%OgS&1T=8I}g10VY2(*(vO2QH5-o?S;16yrrvB{MG((_>A&{r9nu@?uFcFJbPo +ze--M6L!~9_dLcp?OApvI2`l~+xZH0-8l9Y#Ps3S`aH3Q?uzGdC&K +zznM$agJ{|_uw4x^+?rUp)y5?>jRNTtSPT=CspC$Hsti7=s@w>TuS1bZt;L@*fgU<{ +zvv`^QGvy_O8FuX)YHbF_*7dcD^r@D9wQ%lZ4#ui>9%IZ4_&lF-^O9Jn<^~t1;$^Q&35cmexA{*6q)G6%sx* +z%#h5Ds`Mp2)HnImax}de_sT6I<~Ev|XPyV0qiNToJyNTo_a+&31C8f>Kq;Y>!)#eh +zseiUjcf?iXe|MOmI&VMn^#*{71Ij8>M)1=IYqcfM)b2TE5C+CORl1GWas5VXcPBjS +z^&bGa;rXSHY*8I938Ty+f(%!dFlkWjOqa>x1hfK~lEi7WwC8%_ +z+dR5)&TJd9s_}o>;WVUGab6vp&@;wzN#Ueg3rzO-ba{7FOiX?f;m5GKyEI7puL*S1 +zVdAq~`p+`Hmnu@9DO_Z8pCr~s?JijoR=nL4vI7 +z`au3>*4`l8e-|q4p*01Or||bmv`$(U&pq325Dk0@B*2gKulay>-(jgaBbegZ>4OYs +zDhBu~J&3)^a^&)LlkzFl*l1>h2yaq^z{b@uP42LTL(DthhJ?U2$K&MMSc1E*dpNav +zXw`gXVK2^5e}?ZJWg0z_x6Z~hhsOM2wD(rQ +zo2S#=-zik`?B$QY +z3C0h5uW2cY%nt{$GjU0jIyY|Uzg;Nb&^$~n%JJgxc_t79u_S=6R8mpOCbdx*-V&u5`s0e6@HB5If7NNF2pO>jM-DG~ +z3NB2qO=?AEpboLnPBN7fSS*`0q+vH1%0P``dBbflTvYrlk?0LuT|=g7kMYV3 +zLcxboBvNLipjj=&EAZANh8@Fp1>-+h?lFfz!1UVKc@=QYPuXr%36&!E7c*{a2BkC7 +zJT|vxP|{E+Z5Py2Ds8LVIz7P=ad;Ai1{+r3B&88F_%vqGBYv~y20Ye}SnGvOZrA~> +z633fOF|~buf;P%{f>mTt^gA`Hj?LF1J3a`dMvJknMlFbT^|dzdRMr%^Y=n(v`NY +z=~uDxe&(0oAJ(MghAjG;rA$Pfi3?5cz;-cbaEYL?2*~vq?vk&Ey~)(RlzciR0}5hw +zR`?rZze7wJ;Mb_IL(1uOvG^sv-b4xs%sMrsV(iN$+%kMEM42Zwy~NgBXcnBL6emNI +zh&!u0U^r3mpSa*pQ8#?CnOYSM^5_B4xcT+=uSPu@ILB4P9Mt+k5JJNDrn1MU5-qph +zh5ZWhdVML(_mpX22L7>Zr{NuMBd#3tu}^m1dIocXq)@)~uoU=}dy20gV!!A|8;h@3 +zMlB`~%=c83%at3=cW%7@_QOT1^rG~KDF!h9&wNu>S_zg8)G8nQUcWkh&Zz)}@SBDbl12p`KbzFBmpN3tiM|)HPy!2zRUKY7ni7o%>_JkRsI<2h +z19!BNsr^h{q;HeQz=vWKw#kA6CBuqw&6=1F#dz~0(2{sTC2E@_(G5Bqs2bwE%uquG +zJ9a2xb@Wt^lAZyYJ=P+r=2Q5L$)5+JPjmJU+BtfI{1}{xZ^(w__A50-)f1O}eQHK% +zN6xy0HIGZjF+*UsS8XSl*k-oxy2Q43B8CC9oaxhK5$Y@CUaJ=K?x`}{-|&Ovg4WzK +znIhEw=%0H9iJsqryGK~LgfDL^?)#P`ju +z$=#awl--Jp`nLp^)Zdw6_4`O{vR$(NumAGM;992xrVGb;cy}C$*<~|^MCm52f0_pu +zdC9Y@8wx(|k9E@lcbZY*(<0Xrf%#0#MUDbZ>ybaMwreSJ60;{BJ^27Me45rfs9I)N +z)rcy?bRz9;?j@SVVN*(eO$!r8)3|n*qHL~CRCfkNx;RS0WGaY>3Y($H6E_#zxRX`w +z^d4@$?kExk0gw8SolfC?_#&+TY6(xn_`*Z%w31L+)7*8n{xnB6|J4nyN}{&!D6{SN +z#SzNImF>(JpUn~@EiBG_qaS6y89kj&i&Q7LOd4K|*|mQUTJ +zYTMD97&qr*%fjB;%OinY%QF2E(Cp)@1(}FT3K|@AGhT7M1N4c}dImwM--%7FxL;jA +z$O}wLFqI~AT~N*5^Nw1$BkynL+|jDcmP%nYTJO#!T-5CJ$h!RvN +zQP2pSWijq6AEolQ9w6)Z-HenKqvekHP5v)XD@gDD-2`vo~DUQ2ru?Du@ZMAmY5SJouPq9Gb8B=?3j +z{}2+J^tgXi=H9)L?Kutd`z4(kD}|2S5?Pxmu>dV|JYECG*(Q;MmTGxATV+d5Z5*dp +zp&~SvKJL_rIEG0vv*DU6N?WB34?oE8ApvP_0`R6}yssGV$y*jry|&`8vZYZT5Cp^% +z|6UkoCp5uk2(c3yz8@SBo^ee;EDBP@+qF4jyAClU4giMS)yJ23H{uOU6YK%}{xk`V +zT_(q?c-dF~i85F1r-{#s`2Vm#kZAu3!sl-JnQzB5KgO>c#rk%EbwRp|2YhvrY&S14 +zQ|6R6Mb_xyqoZ$$k^;DGs7b2S{hc%>Po;_@Q@Fdi6x6gzy3OkU}sM1{Tuqg!X~3~Tb5K#vOa#tD@nfg0At&9B?7 +zAF2uzQ2+)wkKKmmbW9Ys9~71Jl%C7aJ~wTmD0_6tFEM=~3!_-8egg8x9R3%&@S5v= +z-+=(?WPqO*hr@!Xxy~CQ4J*R`Q31X%%LTHg@Ro(r?|x2RLE^@-lCX5h4ZU$f{~57(l*3w4u4`Qa4#zinnKKUye=^J`_D%-7PfjO!#%AP-+j0D^0y9fu@1BvAC1S@t^K_Hq!Cdzm}eYDCXaGtQ99W0NOO|TW%x!M +zyGlaY5u_FqEuG>;xijXHDM3cs-XC@v){q4?A_!&YHt#!f_2N)y0OF +z)L2DTkXC3-$GWMo&)PJPg%?om3DUF8su`;{$a8JHt{6^XAdPzi;}ErP{1ZC-WX^f? +z?95}AKRhXcJc=nmTQ0<8d!$5{M +zz<`$Vu5?TlJ&GCwtNOr}=|&RFxS^lDW7ZQN;s}syE|?pyeXZKd8sgB7}M=gjPhxOO?*D|cFZf8u;w>4`_XL|D80mv!zN07aLS(s4c!{}x5v<&kf$ +z{;0!KP|gVZzSpy;-u}!!T8y7NWSUmt?8!218V9MCQd^=ITgW3>j~l@F^5A)2f9Te0 +zUUl3#-*e`8J*Bq{LJ;0@WEUL-xv-`r`T+7p4$!Z8#)qM*blU0@LM{A{fC+}}MZ{Q} +z0P^jJi51F3{6$~uq~VY^G0D6YQ5mm(|9Sqx2KZfP`+_ID725fbn%#HxItPLt9HD(9 +zX?GgLcFNTH1FuX?>yHMz{guv>&PTv&tRxazm{psFk}Y1)(dNNJUZ&!|J2tCrEn?uy1hfxT)%?#U(0xVW2Iw8JJ%;kD54v{ZsP9QS;< +zf0D)LPP63^lf&5LAs!6wMz9_`yOkh@ZiZHc`shyh(Whmg2&en-oyDkJs=2G7wZOgg +z5*!&>MeVTc0oOlPO>tdzZ+!XHX0alnX+gD|vmopR->oITji(b)4Su=f)P!)j3b%GP +z%v9YPcq`d~Vbf6OIFU%2-mTEo&Ki%u91_KI2*n5^h13$ssVm|V6G3q{Ei_lgrJ#bOI;(6nK0gS8cu+WgpeF2HVjR?$j +zU^uaGUtn^5+?d^2A1?CeRXR>PY>fjM9I-{=+6~2nwnAVRpw7ZF!)X2dQZpMH+@n{@xpr}5L +zq)K_gN2h>|I(Ly5l-vBTP0UhibACE|t2dbWML+6W`>cMtaTPCE>S5M^q7Mx***$|s +zZ0-Yt#`Gi8Qq+7JFQWfW~w}deKGOV#LmSzB{)gpjb68TQP=ETYeE)k +z4duTDY~s%%aNjO;D$}IC3s@@{zdXsn3*sv!lA}p73iK3Lq{&XbXaX+ivs;1J$=s&* +z#PfGMQmmb>5*SBpeY?^RE0-GDJQz_YaYXe!cK(Uyw;{xz-@nQAEL2TM6sK}E-C;Ph +zuA>!r;NP_DXHD#GvyhG&H~!DXO!+RN{eYoInJhqcFP<-4@d#;<9sp@-SeINJ1|0@q +z35GKA2z4=&_&Q_~p+NfLyau`gI9NJ#{&>V-rFsF?{IbUBOk#mK4l%@dv%r>#O +z_d54ZAFuPy|UfrOf8t<1y*G>Unv4}TxSJ0i>4a-a2O&Ts!VUIpCRv3+2|XucfQP~ +z1Ons#&a +zI;|ljy+?lXdYqx!^cNw+MM#<(!ZL-B=&$#|-JJaVG&VYzQI6wJy%$@GH}6k9Y>5f+ +zziE%y;J-O*{%rL&F_1Eb`eIf5Tna +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 +z2QP4D-m;-3A%S?(hr3vofEb?Eckks6lfL~YC +z>&IeYDOv}W!B7nWf)|xKtxQQ9t{`<`Y-|5azf+0BcveDt_Xm0`GjyXxs?U_EV~n+i +zJ51O8U$8;Fyb2_S_-VZG)E>4bDvrpEl#f31OrhlZHv_m*F8?J@khm^TB5V3Y^uHyu +z#)!BvpfvqS87ztuRN?y3o2c9KyWWuQsB^Po;QYJI`?m~ilZD@F!=aD~6fmQ1dBu96 +zPTog(s&qwdQi7P+#*4s$A#^$hpjFdd*I?Qut3f#ki@76XpCm(@e>imNGl=PjPFBO2g%@>~lPojUq* +z&~47;d)MUQHXP0#LknKtp5aVv+Yd=RKgCqa?`qJ8Cg*<&$`+q-q)zj3O6C(tgT6ap +zx|C%#=Yg;4SOFJmg1$~E(vS=dOMWw0!Q~1T<@>QGo34j|7>aL~Pd|}kYswt)q`1Tf +zlrk*v0aly%32736RWn2y#4yH443oE!|CWg%8Tr;4ZNZzUk6%4J(>e*O4#WCGXtK7< +zeDei`<9$1NU&?xm +zC@OE5Qm@<$lBHZ#7RkcdJSL6RHDXq|8ex2an&32lDb{KFa!S9G +z^0ymBk-pP6rou!1Ll~CyVZ)pUCeq4yPmb&<`4*L3m0x-|YheRg9znC8OB+}@WsVqK +z{4!fqIkU^hpqfW*bG2a~aXd=i1zbKz1W)JNU(H)*_kvn{4f|}OYWogb471qE1MPae +zy2ziLVuuyr0_(N2_Py&RgGSK_^EZvEdIAoV3s6rpYq(Y9m%)B%3obw81>Yv%H)$cSdWKpvd3^w)qS +zO}8T_b5C|*zsuEg`jdzg21cc^+DhY@R$7keSgf=edV+30w~&O7S;N|AxYeWSs{emJ +zn_-)uhmLm}i<%SmV&E<_#q$jv>=FRwpvw-c>!hnm-4*d3)sVhtrv%tIIid^N-CRXpza^+kpYmjL +zk>tS$e;i6{l1Y!)*ed!^a0hv#s4b&B87)LX=idb$_;(wKb~B2oEpYkhq=t*%;PZs- +z4eO=TJ%^a1=T1pq+)$C&Mts(W8&LNyPCA?XAv0|?(7is42bOj9eW^1x+<3ECJ{3(> +zr9X~^8*i^EnZ*w4pZ%u}6DLhpb2~BOt!OMJ8rt89yaa@8`(TRVBv0c6 +zJZfU5a+h{RuVl&Q4cd|O?s*Nw_!ohcu0LTh>zE@|LtiX~<)ddm;w=%vnnb2olV{N( +z7ZH9pJF-YOo;2i%R|a-?fx{^)chnm^R%NAVTY?3?q6e`-fTaadtQbomc0%7u1sw{W +zhZ&AaD?NAWCY3X&w%*L%yyFrX--S*Nt%tzYn${G;soD>0nxqVPyYG`D?-8XzR10lM9l1BT+m@E6JK9AOWsz-vIdAPh>?COyFa_oY=00r= +zUPMf|up$BIS&7*8U+_EhQn%58g%k9W#5^l;$dJs=DNz{B57hgws^P&^OFrNm|S8Nb&$K18g&&ywC4c +z|DgfL8Guc713FD-X@k?LNLrR0G82uQF#3&P!y{;^s#;g+PK{hYEL_UQvvA{6%pRj?{7;e(;w~_^;Wje#=zdum@V^j^DRn +z7VDot%xr*;HWs(E9UqR%Z75|kk=|#}adauA6c^7u61>rdgNMOmF7N>|9x8$vWEYJ> +zRDR46|9dYQRypTa)=$Q#iox@%+@Tp(hL|Ic2vOznHK()vI{qWo+bq8XvHmf>R~3S2 +zi}gpd#(fs;-O7BQxQtA?^4j1xMe>S+_@YWXf{-`B{;3=Qv7nZ7;7Ph4rknhQ?P` +zq0OmYLL2#cco9GC+d?FaP771sUa}x-k-J*yu}WTbqL1>%3=xcm@1Av2A*YkroOh>q +z7Mw|H%I>h%5tTuGX3u5Hl>*4%pX$`1Co20|>W#BV=Jzd-OM*5DkZM4ra>n^p#ijU^ +zuuml(trDf|6paMXAP7KNC^Dz63}V1WLhr1tZ8)ej&CxB==C9rkJ>{c8`rsjGP-_cK +zY`APF5t}tOuop)e^h!HuN0Z=QLk3^Uu|$~?%9gyUw>#Q?d6;$;#fXgb(VKaYnFb8K8Py>24?y6@Q52L +zPdY4j94|uYHWiPUexjp)h$scP=!-TR;{93{^;#t_h68eGjH&+quBT`>w(I-Nvi-Yr +z#*fHVt`sp`G=l&1_NGj(n=_X+h5raJvhOjeA0&eYv?IiPRuMIsi$H@TG}UFMVjbg% +z_WY7RHc}!BPWP9PeO-!ycXCSHL^CQI+EM<7k!efyE_SbcS!2RM@+41zgSrGG0j`~= +z{-Z9d{%=~hB3q6FGe`xJ9{cpa-CaGVLl2A-A{pa1GjuuNM~%NcOd@RToXdz$Ys6gK +z56aZ%f)cNcg#BsDNV02clUx}WvGq$`-8Xqf>P}2%Oi +z@zO4p=MNYG_F6Dy~fs2h1bJSP}M#c!R5hE +z!8f?ZsLI{H*g|8oQp}D#yO;O$A}W{nYK?*2#FCGk(<^@SpGg_tnf3nC@}1xP#6#8l +z+OC?PYq2Be`>UoVm!9Wg3uSzkC8j~kNc1;~*6xB3DIFv#1fNOZQ^UkzX7#MpkNrb) +za3IXh^ABZ-`ISiEGW}U#60r5Bea_TyRCwiJo8@mM{fDv_??o+(%iyS)=us2Nu@sWO +z1$K4bop3u58i_b2=dlBXc%0?~keSx@=r7Al9I^h9zhkbm3=Ps#-{YL!d#rdxj&1fo +z(C^k178~1#kS1TVgTkxtB7(Gs{#6fVzeBb-KKY6*>^?eQy7oiq<68goHj_NM0+V*- +zFxBr}F7spx@n+#Zq5<~;{KRBC?KHk7DpTRK`J#gfC*n#VvDiKdaNZ5!54`w3%qU)kzQ0iVX4~7dwoG|Y{`I=Z+^r+oAM^#17$P2s=uS>qbDewLpj7oPo +zu^O8~m*^wX-#q26lqa~Rh9ZI{*!VT0%O_+1y>k53M_Y_#K((+493t4y)!l8+Y +z0fAcQ3ubaW{~ZN{QN`-Grk>3MxMLJDUS6@su%-11RA!v4n)xAmS`HPtv~4`$_zHIyf`0is-?E55!J$H=k%kT|8c>8C +zt{iejz+HMIPFR?ZzH1kapras1%`xog1`;e<5E{5F-;=Om!nNq#2zX0Qo{YWdoPke_Qf=s;f`vaJ(n>i`35VlkuvqlDB2_TU3xj> +z&N;Yawr>kT`N*|?{(Xmq#P-53JLs5t(Q!=#`HD0+&rqC;IW^othJP;rzN;CXbF{6w +z4}gs;hnERczm2N4l2SP9(OK2=%vcAtj(2jz2~Ys46DexM9UJ#z#v3C5D)>;2zf&63 +zHi%%-L`Z*5Hzwlt=j0ZN-BE%tAJXf*S;c1)H-0b$NEI}Kn7Z-Uc8~vTAuV1ehnRfh +z1E-JFr*~!*!Udu@=I-4aM&88X^_V-e$=Uv)kEr8i3?XT5a#bBdB&HBpbROubvf^;0JrV&15&O;+D +z!+b=Szlnvo^52=#SxEk3&z?{vbEzF9jfN-d&c49#vqN`XiDBD>JW)?cjD&dnNFZzZ +z`DG}nM76`*_f7&mYgG=vtew&*y;qJ7A_WP}!C|L_weh7l)kvGX-BrnT9kZX-fBZ?j +z8pN49AZl_vvp3FkE*g;LIsvWW{NtLvgzkv~+kgxNX@qGr4JjF??tDc(o_#_qt20V-6 +zJR3XXyQ1pxvwlW0%_E*ggb7%Z#UW`kXXq#HJbn%-g$0Lo+SemG4J&r1T|6rLzeFfs +zpmm7fA99!DN`J_eZ(`>r>Yq$hZ2NtaU5V$SZlmzpbeZ#PgBO_64EiiKT@($=DJ{=4 +z!LW-uea)zngZXpny$gp;F(u6mpwfC)a|b8W9&> +z6)h@mWi*(AZD|es@x10s!{|N-TWsY`8{3=Tlr$^e`ZwH4I$ouy1nhs%b;bIPa#^_d +zG&i(qjy-bgiprfh!@|GJga6T(e2AID`ws?nVIOk`0licGXUdu>Tk}2{=3O*2Z0Pa~ +zs5DAs*f>y0x@lbYl{TXORzMRt@aa}ijhNxYnXeAQJhBhWwXCRzvi$&1BG-FzUgq9^ +z6|EbI{jtBqPUyM))lmV;g7)(OX0%E?2t$wQ{fO#Uh6|8~87&(p5KLL$-! +z{oQ%$=yz}Uc`y2&z~q5r)`4X#?||IKphtYC#-I$_{>4H3GZnmvYR!K@G1o^nz=L@& +zERb1qR)6QGZlWw1C%)P3n#NJn4s>{gD!YsQ(@(&p=zf*iKq4fWPd=Zf=m@egnHV-+IH%O!1JqM2?#ELKuqm{%CaawJhJO7>a5-z(7g(>r|XG +zs1`9q8qx>xwYE)L;>BRr1$ +zW&}jz72A7ypYwkJ?LZR0ZE^m%T}!AkQJ&i>W2q#wKW&fl?r%{#rAHZAqOtCh%l=zX +z_(1a9ZHj88ecWc}b)9ABb*7bT{8$ucK%S&X1PNv0i|Lqa&?(oTt0*yr7X1nh`W71W +z$QO@{6#!4BL@*1$=(JBaX`j(FpJbSb8Y7X*opW5e=DPIA_vl&R(?hM6IdqXy%p999 +za%?)}1ZMvB37GjT$KiJ)Ew4$_AstW?wQlspi24%F?>#c%&mll0*8(s~ +zIg#YC1i*Y!5djI5T4N5*2;37Z{dCOb+DwilahD>B$xXt1TgWOJVUV_>m9%Vb@q!J2e~)yFJW +z9yM5g$Y9w)gC+Ze)iN>q%PiPyGHf3sjn#O1bX;|3s2JK&I?qa%#wbHUjDXBja;+f7 +zit7&GmM7~zEQ5}qNv$f*G4+Xh+;uA{}*b)N~=Lp9{(y%t3feZ4vf;We;qCRMQ9-_TYc(C +z?HwUaMw#X-Y2ND&DLn#JrO|{hpprD=Yms%aH1WD5sV)jy`qt30udIvJ(6V1`aQ3gE +z)j)w4IcsS-FhW}Y+5lJ*t7D?Rv=s2_U#})jfmS`K0|a2|)G60#0xtvW8z*&812O`2 +zEx(Q{$V(Mi`AXm=8Yoj=MU|SB_Kik3sS +zHP_(ndAb6Z_ZA4a{C}*y_m@<4`mX)`N8WQBvtmFU9d$;>F=5UKqF?}2auP+dC?Yuv +z7!VN=$)M!WbPmwu+~iEhiaYOpy>owdRd?&mIcvRZy+1r_@2alquC6xhtM2ePJf~{p +zc@D39XYu+EHXVPocypn{dq3H9Tax9yWf|UI<4Qz6x2ricHZUJ(>6=b`K%DUoC#Te +z9+?Pm@tzd=hrVRqgcAlG3ch1ux=U0GrRj`B3g?u;gmUO!81U5gfJY0Zeh41m +ziK39li?p0lN=qJMv~y2NP5eQ!akrS=b|LKqA6tBS7x^qd1ATU6`1_WCzsn*fd)F2% +zmX!Ju@`!f8NP)>&#aeZ=Lfq7tk3@`U@i1^$3h}H^B{``OXZmp;H)&?^MWVY8c +zxS$S&`$rVlp_=8#_vorbytchyONBo +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 +zO6382d_S=%Pl7!adW$2TxK5gO%7(x +z36F11`FwZEXZ|UVA5VGwblQzu$&`mV=dtpPQc#FyYsYM;rM4NE7R7Y}V9xtU4aB>Ue05YmPhocFgAYqgmD+&hq;q +zi{B5biaB7#{)kn3eOB#tS+UzTAhT?j%hF1Rr4=r}mb)w|i$P{#p~H_mq{di$zs2Ue +z%?{sewE1SE!`$^2bJw|i{hQ6~wHCA1*vwpQH-pU7r8bk7I!yZ2X5tcu@jvH4CI>Of +z$c&yJH#RoIv=|02e-RU;(Oc%shyg4{yr|t{a4+h^Kf9)paa<_>{P4ruf#xx&;&kr|og7R?CT%uORK +z;&HfXgu{))ZEhH5as5zPin83GrGsX_jKvKfWx0M(=0E1TfoZNAnEm4nu+4>doQaWT +zDif;>#!i;VK}!l<)W@UqB-i)VMZO>=27zlnY~(LJnz&YzS3|lbxTb4@Yu<|k_W9i{ +z`JDg$`ZxFcjuII+Sja=8e!OXS2 +z8oBnvcvLcQeb0m$o$G#6JkX=58Cq0GpfUEjR;o)LUas$(MI(r5eSWQgCI>HhfYC93 +zo(C3L#ja5xUly@HO&%!o8K&z7+h(C@i<+W_u)L}wOPGZ~MSoY-aNqPv%cz=L72WxU +zyEu&RaOX&ewj({-juNzZ+^w>S&pqz_+~xkUE)RU^@b~e`ws>ZTi@@d4=^jta3VD2H +zz>_n5p8DG3`FSoce4FLv`3^774{84+bX@4u<>xH#EzR)miVR&>I1E@`&+ujE(V|H$ +zpj1Yq!OGC!IHo4I!S`vB!rs?B?PMx +zShUaQ>k@~RXJK7k$kr=Rq_(UJFuKZRa8W&FwNR%Ecx8Fga6A>7%+F;vq`~n}OPA_~ +zFNZ#R8UmK>^jN<;VW2}zZAqhOs0z7dw@cb~47k`{faSSnY{xVA30~4_CUc~~gfx0k +zSQGJGfz6Lq5kKt@m{Xo*)()T5`vLjL*KCXc7szffyFuF2ea%sfZJ78`BOfQZB +zW`_3Blxk_E$74l44;90|1S?WujCD*qUR2l=Tep;hQMg}w_ny@?ot!7-aq-jBTYa9~ +z>N2b%V)_Aid4tbGf`{!M4;2VlV%6ne+avO0;ALB2@-6}wExuG)fM7|lLF+Y?gBGYM +zZ=KJ*n9PeRlecS6Osw3P5`dfn(-PqSqY9(f^Wdh42R4Q=vqpY9v3^1eFwH`UT-OFezJ)YE@!0|U1;Flbwy0hwVXO^hsUWK>B#pO>q0xsEXv +z^?Xs8;ET#6pI0?8W@iIm?o!CVfhju`^3U?sK9Bw-S)N(Z$UQ$?;*OshxovS=oqVTk +zV!tH0YjJ|Reo4`GNydx-CJ!+Jn0uC|o9FK3S?*qLbJud$OxtA^cP>qG=h7zbUzy~Y +z-tb)=w2zP@p!kw7vKhOMa}xTyag+XKAfRMZL$aMg{wQ6MQ|?=yNpTn--tL+LGQFQFz{F +zeNCFR$1TGa+X!TXo21wX9|P9aimgSh>ex#cnAw +z9?Pm+Grv|i{8H|-xYTD+u}2It4nJ&nn7`HG`z?-vnQu3_%vVahUrjKjoVTmv#+{_HUJCzsESwajMZ_i;YvQ>iiEd3^G%&qv?5447ln +zZ;nHsIW9fFw&^k3q5I4%U1!?7JHz4aX;us|Q*7RtV$or;P5Vg}uT0AFf|Qs^mVuad +z6SA}$Z}a4Mi^s=1Jo=T*Kfkhgc)Z0wv=`&6EDwy!@ZeV#4~)~N+ZOkJX>;#5?ay$y +z>x*~^;GJV^%zSQhrzWS;+&EiZd+g$M8I5@)%AEnKOuP%OD#^wfnx<5!TlW75({u%z#H`NR=EzpvOm%RFtG5{lp +zxxTO3$r5G+4b2cC>z48-0uwcawW>7MdA=n~k1=+y?(tF0W*WhZfaQi>8YwM0HgRL` +zMl(0`ZREy&P2A8op6dlux!0lNb-j{Y-&>Fp->=*8s9`PseT+pc2WEM7C9k-cd{95j +zSjh7CH6Q;Az~sRte-zMMH^Bbm&)nUnr38aQ~M!e;;q>0{J%ooMIcb<%t=g +z0hVU9XRO8&qk~{7nl!(R!V`n2tOY2_<3K(>@`wgUDmFPj@rfo&bc1vWFxae +zV*#tEhaakKW>hBm^>V=G1}L};rB@@Cozz9{RX(k}VpJR{C>LcLvja}11I}8J3IA&c +zPRdeKS3s>Fu}9CXXk^{Nv{7eFvT(@B;i$lwjUohdFy;c4@@-1zC2~_|!DQr3_q1cwB0V;z>AMuzXH9@ZCO_ +zuIn1i4xHVMDi}~`Kjf+`V_DTP2PWg9-=)b3XtaEqtbkf86h>z`PyW*#Z-{ +zhkUUm!@1X?hsskCyH7=IJ`gc$n{5_W$~Lz9B2-<5 +zA8VkSoF>Y<7|WPiUUjjr3w&i^LevWON?}CrV)(c`qDQ%M&LQ24Tqagx+Q!u2Hl+|I +z31A8W#+O2`9f64~JX##_PXSD!cJYPgdp}kZFQk07DBgT;RG1Pitc+EVm&)MT3V5s# +zqpb8P4w!#Zc0`{?H@n*!}drj|k5YK;;zytn}^y&PTIz-Kv2*_d)!$(oE3^LbSxpYLpB +z?9N8MtZHIhRTE$B$uM@0&ES$OFRrZPt{-c;bzw5z1@lXSJAR4J?_6Rv1I&M_Fj8bv +z+`TNp-7C`MAx0o`&kBdTjKwTT+h3F1xy<6>RViNElww4+W7?V4UGk}{^Vr{LvA;H; +z>auSXnP1L0%scJylkzl$POQ!px<*-1-Et>mDGPX~*r!{G&--N_AC!B%FMC>7!kIK*pi1d6N4b%v1@)?m5 +zpO-Zz?B1ftNSVnudr6hic{9M6C6%f!{{MSgaxnVd`nhKE5Tl$+F2~ZWzT^}b12C1X +z>}ESd12B4=o|9i{DR7ZGV_M0|wdcjBV})mIWO)_l9pzzmDF+kK(?Ex307mLb&%Gf% +z_J+K_JFZ|>?&a;Ah3wsGs+xIMz=yj6dZ>kLmrtMSkiNU4cpr?ZQx1>{)4GYw +z0F1)?2UM#Zt1zSgpu(tH*~6$XM;)df_n47yBs<~dAjWN0VHTb7SbW+utz@Q|?3~A{ +zbDr^Vt6F)(1&_^UKa9%`*~zZB6kT;Gt#zrW^WqKGIfyx^Mwf)_8X-p#@?q;@Af)KL +z&4!vZzaP)?+p&S##83?cpqI4mqrmBD3FP^*+z2F)R0Ytk@Ng +zK<3xVfF%_^i*ssBOFpJG$hZh%j3Tqn&M7idWnz$-xyoh6O66p112M58<1%5f%eciZ +zV;9+sS*U!B_Q*IU=s)y(haum&4F1+(;5?fF^BnrlbLcbIrq>*Y9&=o}&vu(3MoP?E +z(=0kowdpV=%j=V~ygJ$D<;gZLPPTb|vdwcjka=o?Z9wLU2{w;Uuy}NW#UtahJoHtT +zf9NQn8Lx{)iw6WV;~oC?mCe0hTHG_%;_k5)cje~pFKsk;jdf`IdAxT+yEkqhEv3dX +zma{gaZEpL_LB}?uTy8ZmV;N=U=HY5Fv$!c&&1`H$xeH$NX}tp7gEKjxY563-wMx@` +zJ|N4r{n9bS^i>Arzt8o3Q{2!m#f|;bW&{d(KrkvyPVvaYOsvSnVDgvlF}z%t0~{SS +z*MHd5Y8tqqM+_1C<);1#bG)%%g6sP=ac%Ed5t1sT*B+}xv0|j# +z`TO%n!P+%_l7AT8r}yCc0a-KG_0RnAJ?S302)oKf3VhGIxi|)H+NIbWG>NKk?w|;7K+fawwhRKeo>SHIaJ|69G*Jx#1 +zY?E#I+ZP`9%jPJ!)<2UIvphUmEn*g`Kz@9N&6BfSp8DG7xj7y$%(ZxBo=y92T{?W{ +z@x~7>ofg`>vC!hZ#R1)Z@#wMKPg6H2UC}<4_6K(V@TQG6tFKLcnR6B +zX0n9B{8Exb^H^m`PS_zeKJ3dv;YFVn`%`Sc5>SzW@=QQ^D&E8L+l7D?X99jd59`iH +z{C3vk_lp55&qe%r)Z^Rg1eKRuE-Ga21zdD|F1R7*JY`)1)5LYr)l$uXpZ2(XTb(t} +zT~{Bm>X)}SY4fE +z`(clh37-Z}un^JYcySot^UZ=v%ZiL`%ylC?h4W<-^C0W#Jc5Q?>m0X2x +z>rxD_%y76-nHRW}g?cs0X|biiOQiyqGEP!nA`)4T#;ni9takfA%9W)oVC|WZ&YK$P +zvN^$TXVnr0H5cIMiHJQ1eaa8{>^=pD&%^d3FnV*AKASB*D~y=21Ey_nXEz5!;k4?v6=VjP+5!RiA +z0Xr;S-X8FrY*e`*`%^^<>uV!@ycgy90=aiWJ}QMiQeLEtl==+b5i+AReoa%#BE}U5 +zOx~g9F)jIojs+gi6nJstnCg;cLleXlhdf>ik4tgMHI6-{)e$B}0IwIvODmr!hre&} +zd3CGD{39^4Myij^!`mGmD0GdrOV!BD@KOMesq$C=CTQ6nHY+evVe+Hbpq!6d#$M8T +zkK!1d6y$$O7B_|dRS1xqM+7m(J{A!#u+$REKPoW!F#kWAA*KajT3gEgPayL@UDscs +z+xja;h52AZEj>2Y8i?t;wSj(H8yK*qmVsNZGNiDP;U!5%l*me!8&xg~Xv*stU0%<~ +z$|gouCKy%O$QZ#)WjzzCo0zgE%ZMtM_P;gp_r +ze_avJJu5TZv%=z@6*hle>G0Q;HutS^j52fE%78Y@EZQzj^7#4;Z|_JkbXSINkEBh7 +ztXYIvXS27_p`tEJ;ngg^owxbnq{ZaJHe>c#^r;lcWa(0prBku8D*y +zZQ!R&Ig!BFs9sgby~K+FCI>S4%*ab6VY9vL#au;kGfCvIw +zZ3Y-YjIuEA?i7ebd{`aQGpC@aMJzwYR<_6E{oNj2cYC~B?IVCOvnxOf&HK4MGdd~@ +z(`%=Xs+9Zg4e7H#G-3W2U;?AUd?E#Ae;nplpnuo_myrh?qr!|iC>xoom0czrc3P=0 +zF4K>@%sSyQ=cLEH6RuHV=AUv|csgz+`{hgwF-y;QtUQ;iR#r3Fd5?`3eYRZo*?!rj +z;EG4V)mVusx$2r_mpkh{_SCDvCst$REw4$~oJu;>Bs^o+(1N(iD*@||W%>QM!`i&9 +ztOi!sL?$Qm+Yy`J4%@6bq+E>4s{PI%ASMPGhvmCGmKu=p49Mj3F#?%bk#SkD-80s* +z@3**ow>gFxDKeT^k+EZ#S)C93OO44}%UmY>;_&6qHlP1w8IT#dz-HJFHlNPdIDGQG +z!$;q_^#9hT?>w8{bM07(nd2CUd2d$EN;bpht?4$MWG9=N<@G5RuT61yd5Xh}Q*2(C +z9FG(k12dB>o|l(|MvNL&*F*%w%#0X?Y+s*3CEvDVfLe;nmZ_84ok-bP4!+DU2 +z&+S$UO$*Q%%h>>3xW^aox^TatU(4jx7AY>8JiOdAAj6IQQb++2$QYREorrJizCMj+ +zuIt^%^%`RXi@KZA*1%4s3q*8YjMG|IO~R-vD7@KWtgzM#$*0I +zmo0U${en&TrFfsr!gC%ybS5b;RqUH3m0J&nTxwE#m`i;!%hh_HOAS(CA}*y|>YRvubuhg=O}|2yssto0S=|E8 +z%LG%-{O9)R)#^^FQ4-)S;1$O!MKUdV1uh_m+lS +zE~b`&1r2;$*uBFv0ChEbcJ&vGgARCJ!&Ml}zeOihGtPa}bl^uPZX#yV5e? +zB6zviK#YaprtR_!cdW?Lc4e9eS2yweh9o@-(~Q~U^3z$1wO4J5&E5--ef2iGuG;25 +zCM(Z5{BXkJ%R??7SKIWi%$miQZx%ZyztW}Drb}_g)Gl`~w|HM+|H_=btkTQ1msz~I +z!)nQ-6nS(g_Dt?Y`Iom!Y~C%8ThBf$^XO6T^I>_&`(+Awxx8BvFUQnBd&h!ZW%kKhkYVkU^c&!_iZkDhy7KHTH|$1+Uq +zg6V3YMxlO>4|aL<-s#e3mrI{L9zFNv+Q{}Q2NT=KKH29pWS_@Sqr&)Rx#h?Mo(c4~ +zWMN#!9kyeLIqDe|X4-L=nKf!9^O$qO=bMwBQDGLG%tK5Z>X!;5JDDJ6t=SKgTXK29 +zH+dMflWn`=8i*;nsy#8Dv0m=1_syOJ*)k3{Ivi`VIMI~lWWwfT(&Kn4G8Yi~q_gCb +z!}^*e>uOxq*7&SB7O>`s&$?rwnct51tU2VyBQ@rL+X`f4EAx!4EQT00mMP@#vbZ!3 +z`Ttbpu&~fGLH`BYT@&_?LB=zR%)AX!WMnO~aygk8Vy3T(ZDo^}S|%Seeu>l=HI~_o +z{>f&>I1Ky2F(C8te4ByuZTf$grQbIez2{l=WnqWRav +zjG0F#Sv)$~=HcmC9-fxrq3IbOnr4}KaH_-olO67zU~|tnHJQZ)04f16HZx;2lS0!1 +zHL*gIrOil(J}Z-_9TPdtBQuX+Z6|{wXxq +z4rrO{^m`A=n$dfq^BC&V=6x|=%jHp;m8)FdNEsvDr@Tt*iSNt3#~?(Qv^_ +zycbA+ul&9s?P$^8FkUhlhw%k1cZ{$MxJYRcwA}N#@>X$)glvmaTLdltm=J^WBa>|& +zo$B)BG?%Alx^XCfjuub4yzq@{5nDHEvo@2u2$~at71+cBJ1teWmJK

    + + +@@ -3012,8 +3012,8 @@ The installer will quit and all changes will be lost. + + + +- Use the same password for the administrator account. +- Use the same password for the administrator account. ++ Use the same password for the root account. ++ Use the same password for the root account. + + + +diff --git a/lang/calamares_en_US.ts b/lang/calamares_en_US.ts new file mode 100644 -index 0000000..b154b93 +index 0000000..90f165b --- /dev/null -+++ b/lang/tz_zh_CN.ts -@@ -0,0 +1,2626 @@ ++++ b/lang/calamares_en_US.ts +@@ -0,0 +1,5259 @@ + -+ + -+ -+ -+ QObject -+ -+ -+ Africa -+ tz_regions -+ 非洲 -+ ++ ++ ++ AboutData + -+ -+ America -+ tz_regions -+ 美洲 ++ ++ <h1>%1</h1><br/><strong>%2<br/> for %3</strong><br/><br/> ++ + + -+ -+ Antarctica -+ tz_regions -+ 南极洲 ++ ++ Thanks to <a href="https://calamares.io/team/">the Calamares team</a> and the <a href="https://app.transifex.com/calamares/calamares/">Calamares translators team</a>. ++ + + -+ -+ Arctic -+ tz_regions -+ 北极 ++ ++ Copyright %1-%2 %3 &lt;%4&gt;<br/> ++ Copyright year-year Name <email-address> ++ + ++ ++ ++ ActiveDirectoryJob + -+ -+ Asia -+ tz_regions -+ 亚洲 ++ ++ Enroll system in Active Directory ++ @label ++ + + -+ -+ Atlantic -+ tz_regions -+ 大西洋 ++ ++ Enrolling system in Active Directory… ++ @status ++ + ++ ++ ++ AutoMountManagementJob + -+ -+ Australia -+ tz_regions -+ 澳大利亚 ++ ++ Managing auto-mount settings… ++ @status ++ + ++ ++ ++ BootInfoWidget + -+ -+ Europe -+ tz_regions -+ 欧洲 ++ ++ The <strong>boot environment</strong> of this system.<br><br>Older x86 systems only support <strong>BIOS</strong>.<br>Modern systems usually use <strong>EFI</strong>, but may also show up as BIOS if started in compatibility mode. ++ + + -+ -+ Indian -+ tz_regions -+ 印度 ++ ++ This system was started with an <strong>EFI</strong> boot environment.<br><br>To configure startup from an EFI environment, this installer must deploy a boot loader application, like <strong>GRUB</strong> or <strong>systemd-boot</strong> on an <strong>EFI System Partition</strong>. This is automatic, unless you choose manual partitioning, in which case you must choose it or create it on your own. ++ + + -+ -+ Pacific -+ tz_regions -+ 太平洋 ++ ++ This system was started with a <strong>BIOS</strong> boot environment.<br><br>To configure startup from a BIOS environment, this installer must install a boot loader, like <strong>GRUB</strong>, either at the beginning of a partition or on the <strong>Master Boot Record</strong> near the beginning of the partition table (preferred). This is automatic, unless you choose manual partitioning, in which case you must set it up on your own. ++ + ++ ++ ++ BootLoaderModel + -+ -+ Abidjan -+ tz_names -+ 阿比让 ++ ++ Master Boot Record of %1 ++ @info ++ + + -+ -+ Accra -+ tz_names -+ 阿克拉 ++ ++ Boot Partition ++ @info ++ + + -+ -+ Adak -+ tz_names -+ 阿达克 ++ ++ System Partition ++ @info ++ + + -+ -+ Addis Ababa -+ tz_names -+ 亚的斯亚贝巴 ++ ++ Do not install a boot loader ++ @label ++ + + -+ -+ Adelaide -+ tz_names -+ 阿德莱德 ++ ++ %1 (%2) ++ + ++ ++ ++ Calamares::BlankViewStep + -+ -+ Aden -+ tz_names -+ 亚丁 ++ ++ Blank Page ++ + ++ ++ ++ Calamares::DebugWindow + -+ -+ Algiers -+ tz_names -+ 阿尔及尔 ++ ++ GlobalStorage ++ + + -+ -+ Almaty -+ tz_names -+ 阿拉木图 ++ ++ JobQueue ++ + + -+ -+ Amman -+ tz_names -+ 安曼 ++ ++ Modules ++ + + -+ -+ Amsterdam -+ tz_names -+ 阿姆斯特丹 ++ ++ Type: ++ + + -+ -+ Anadyr -+ tz_names -+ 阿纳迪尔 ++ ++ ++ none ++ + + -+ -+ Anchorage -+ tz_names -+ 安克雷奇 ++ ++ Interface: ++ + + -+ -+ Andorra -+ tz_names -+ 安道尔 ++ ++ Crashes Calamares, so that Dr. Konqi can look at it. ++ + + -+ -+ Anguilla -+ tz_names -+ 安圭拉 ++ ++ Reloads the stylesheet from the branding directory. ++ + + -+ -+ Antananarivo -+ tz_names -+ 塔那那利佛 ++ ++ Reload Stylesheet ++ + + -+ -+ Antigua -+ tz_names -+ 安提瓜 ++ ++ Displays the tree of widget names in the log (for stylesheet debugging). ++ + + -+ -+ Apia -+ tz_names -+ 阿皮亚 ++ ++ Widget Tree ++ + + -+ -+ Aqtau -+ tz_names -+ 阿克托 ++ ++ Uploads the session log to the configured pastebin. ++ + + -+ -+ Aqtobe -+ tz_names -+ 阿克托贝 ++ ++ Send Session Log ++ + + -+ -+ Araguaina -+ tz_names -+ 阿拉瓜伊纳 ++ ++ Debug Information ++ @title ++ + ++ ++ ++ Calamares::ExecutionViewStep + -+ -+ Argentina/Buenos Aires -+ tz_names -+ 阿根廷/布宜诺斯艾利斯 ++ ++ %p% ++ Progress percentage indicator: %p is where the number 0..100 is placed ++ + + -+ -+ Argentina/Catamarca -+ tz_names -+ 阿根廷/卡塔马卡 ++ ++ Set Up ++ @label ++ + + -+ -+ Argentina/Cordoba -+ tz_names -+ 阿根廷/科尔多瓦 ++ ++ Install ++ @label ++ + ++ ++ ++ Calamares::FailJob + -+ -+ Argentina/Jujuy -+ tz_names -+ 阿根廷/胡胡伊 ++ ++ Job failed (%1) ++ + + -+ -+ Argentina/La Rioja -+ tz_names -+ 阿根廷/拉里奥哈 ++ ++ Programmed job failure was explicitly requested. ++ + ++ ++ ++ Calamares::JobThread + -+ -+ Argentina/Mendoza -+ tz_names -+ 阿根廷/门多萨 ++ ++ Done ++ + ++ ++ ++ Calamares::NamedJob + -+ -+ Argentina/Rio Gallegos -+ tz_names -+ 阿根廷/里奥加列戈斯 ++ ++ Example job (%1) ++ + ++ ++ ++ Calamares::ProcessJob + -+ -+ Argentina/Salta -+ tz_names -+ 阿根廷/萨尔塔 ++ ++ Running command %1 in target system… ++ @status ++ + + -+ -+ Argentina/San Juan -+ tz_names -+ 阿根廷/圣胡安 ++ ++ Running command %1… ++ @status ++ + ++ ++ ++ Calamares::Python::Job + -+ -+ Argentina/San Luis -+ tz_names -+ 阿根廷/圣路易斯 ++ ++ Running %1 operation. ++ + + -+ -+ Argentina/Tucuman -+ tz_names -+ 阿根廷/图库曼 ++ ++ Bad working directory path ++ + + -+ -+ Argentina/Ushuaia -+ tz_names -+ 阿根廷/乌斯怀亚 ++ ++ Working directory %1 for python job %2 is not readable. ++ + + -+ -+ Aruba -+ tz_names -+ 阿鲁巴 ++ ++ ++ ++ ++ ++ ++ Bad main script file ++ + + -+ -+ Ashgabat -+ tz_names -+ 阿什哈巴德 ++ ++ Main script file %1 for python job %2 is not readable. ++ + + -+ -+ Asmara -+ tz_names -+ 阿斯马拉 ++ ++ Bad internal script ++ + + -+ -+ Astrakhan -+ tz_names -+ 阿斯特拉罕 ++ ++ Internal script for python job %1 raised an exception. ++ + + -+ -+ Asuncion -+ tz_names -+ 亚松森 ++ ++ Main script file %1 for python job %2 could not be loaded because it raised an exception. ++ + + -+ -+ Athens -+ tz_names -+ 雅典 ++ ++ Main script file %1 for python job %2 raised an exception. ++ + + -+ -+ Atikokan -+ tz_names -+ 阿提科坎 ++ ++ ++ Main script file %1 for python job %2 returned invalid results. ++ + + -+ -+ Atyrau -+ tz_names -+ 阿特劳 ++ ++ Main script file %1 for python job %2 does not contain a run() function. ++ + ++ ++ ++ Calamares::PythonJob + -+ -+ Auckland -+ tz_names -+ 奥克兰 ++ ++ Running %1 operation… ++ @status ++ + + -+ -+ Azores -+ tz_names -+ 亚速尔群岛 ++ ++ Bad working directory path ++ @error ++ + + -+ -+ Baghdad -+ tz_names -+ 巴格达 ++ ++ Working directory %1 for python job %2 is not readable. ++ @error ++ + + -+ -+ Bahia -+ tz_names -+ 巴伊亚 ++ ++ Bad main script file ++ @error ++ + + -+ -+ Bahia Banderas -+ tz_names -+ 巴伊亚·班德拉斯 ++ ++ Main script file %1 for python job %2 is not readable. ++ @error ++ + + -+ -+ Bahrain -+ tz_names -+ 巴林 ++ ++ Boost.Python error in job "%1" ++ @error ++ + ++ ++ ++ Calamares::QmlViewStep + -+ -+ Baku -+ tz_names -+ 巴库 ++ ++ Loading… ++ @status ++ + + -+ -+ Bamako -+ tz_names -+ 巴马科 ++ ++ QML step <i>%1</i>. ++ @label ++ + + -+ -+ Bangkok -+ tz_names -+ 曼谷 ++ ++ Loading failed. ++ @info ++ + ++ ++ ++ Calamares::RequirementsChecker + -+ -+ Bangui -+ tz_names -+ 班吉 ++ ++ Requirements checking for module '%1' is complete. ++ @info ++ + -+ -+ -+ Banjul -+ tz_names -+ 班珠尔 ++ ++ ++ Waiting for %n module(s)… ++ @status ++ ++ ++ ++ + -+ -+ -+ Barbados -+ tz_names -+ 巴巴多斯 ++ ++ ++ (%n second(s)) ++ @status ++ ++ ++ ++ + + -+ -+ Barnaul -+ tz_names -+ 巴尔瑙尔 ++ ++ System-requirements checking is complete. ++ @info ++ + ++ ++ ++ Calamares::ViewManager + -+ -+ Beirut -+ tz_names -+ 贝鲁特 ++ ++ The upload was unsuccessful. No web-paste was done. ++ + + -+ -+ Belem -+ tz_names -+ 贝伦 ++ ++ Install log posted to ++ ++%1 ++ ++Link copied to clipboard ++ + + -+ -+ Belgrade -+ tz_names -+ 贝尔格莱德 ++ ++ Install Log Paste URL ++ + + -+ -+ Belize -+ tz_names -+ 伯利兹 ++ ++ &Yes ++ + + -+ -+ Berlin -+ tz_names -+ 柏林 ++ ++ &No ++ + + -+ -+ Bermuda -+ tz_names -+ 百慕大 ++ ++ &Close ++ + + -+ -+ Bishkek -+ tz_names -+ 比什凯克 ++ ++ Setup Failed ++ @title ++ + + -+ -+ Bissau -+ tz_names -+ 比绍 ++ ++ Installation Failed ++ @title ++ + + -+ -+ Blanc-Sablon -+ tz_names -+ 布兰克·萨布隆 ++ ++ Error ++ @title ++ + + -+ -+ Blantyre -+ tz_names -+ 布兰太尔 ++ ++ Calamares Initialization Failed ++ @title ++ + + -+ -+ Boa Vista -+ tz_names -+ 博阿维斯塔 ++ ++ %1 can not be installed. Calamares was unable to load all of the configured modules. This is a problem with the way Calamares is being used by the distribution. ++ @info ++ + + -+ -+ Bogota -+ tz_names -+ 波哥大 ++ ++ <br/>The following modules could not be loaded: ++ @info ++ + + -+ -+ Boise -+ tz_names -+ 博伊西 ++ ++ Continue with Setup? ++ @title ++ + + -+ -+ Bougainville -+ tz_names -+ 布干维尔 ++ ++ Continue with Installation? ++ @title ++ + + -+ -+ Bratislava -+ tz_names -+ 布拉迪斯拉发 ++ ++ The %1 setup program is about to make changes to your disk in order to set up %2.<br/><strong>You will not be able to undo these changes.</strong> ++ %1 is short product name, %2 is short product name with version ++ + + -+ -+ Brazzaville -+ tz_names -+ 布拉柴维尔 ++ ++ The %1 installer is about to make changes to your disk in order to install %2.<br/><strong>You will not be able to undo these changes.</strong> ++ %1 is short product name, %2 is short product name with version ++ + + -+ -+ Brisbane -+ tz_names -+ 布里斯班 ++ ++ &Set Up Now ++ @button ++ + + -+ -+ Broken Hill -+ tz_names -+ 布罗肯希尔 ++ ++ &Install Now ++ @button ++ + + -+ -+ Brunei -+ tz_names -+ 文莱 ++ ++ Go &Back ++ @button ++ + + -+ -+ Brussels -+ tz_names -+ 布鲁塞尔 ++ ++ &Set Up ++ @button ++ + + -+ -+ Beijing -+ tz_names -+ 北京 ++ ++ &Install ++ @button ++ + + -+ -+ Bucharest -+ tz_names -+ 布加勒斯特 ++ ++ Setup is complete. Close the setup program. ++ @tooltip ++ + + -+ -+ Budapest -+ tz_names -+ 布达佩斯 ++ ++ The installation is complete. Close the installer. ++ @tooltip ++ + + -+ -+ Bujumbura -+ tz_names -+ 布琼布拉 ++ ++ Cancel the setup process without changing the system. ++ @tooltip ++ + + -+ -+ Busingen -+ tz_names -+ 比辛根 ++ ++ Cancel the installation process without changing the system. ++ @tooltip ++ + + -+ -+ Cairo -+ tz_names -+ 开罗 ++ ++ &Next ++ @button ++ + + -+ -+ Cambridge Bay -+ tz_names -+ 剑桥湾 ++ ++ &Back ++ @button ++ + + -+ -+ Campo Grande -+ tz_names -+ 坎波格兰德 ++ ++ &Done ++ @button ++ + + -+ -+ Canary -+ tz_names -+ 加那利群岛 ++ ++ &Cancel ++ @button ++ + + -+ -+ Cancun -+ tz_names -+ 坎昆 ++ ++ Cancel Setup? ++ @title ++ + + -+ -+ Cape Verde -+ tz_names -+ 佛得角 ++ ++ Cancel Installation? ++ @title ++ + + -+ -+ Caracas -+ tz_names -+ 加拉加斯 ++ ++ Do you really want to cancel the current setup process? ++The setup program will quit and all changes will be lost. ++ + + -+ -+ Casablanca -+ tz_names -+ 卡萨布兰卡 ++ ++ Do you really want to cancel the current install process? ++The installer will quit and all changes will be lost. ++ + ++ ++ ++ CalamaresPython::Helper + -+ -+ Casey -+ tz_names -+ 凯西 ++ ++ Unknown exception type ++ @error ++ + + -+ -+ Cayenne -+ tz_names -+ 卡宴 ++ ++ Unparseable Python error ++ @error ++ + + -+ -+ Cayman -+ tz_names -+ 开曼群岛 ++ ++ Unparseable Python traceback ++ @error ++ + + -+ -+ Ceuta -+ tz_names -+ 休达 ++ ++ Unfetchable Python error ++ @error ++ + ++ ++ ++ CalamaresWindow + -+ -+ Chagos -+ tz_names -+ 查戈斯 ++ ++ %1 Setup Program ++ + + -+ -+ Chatham -+ tz_names -+ 查塔姆 ++ ++ %1 Installer ++ + ++ ++ ++ ChangeFilesystemLabelJob + -+ -+ Chicago -+ tz_names -+ 芝加哥 ++ ++ Set filesystem label on %1 ++ @title ++ + + -+ -+ Chihuahua -+ tz_names -+ 吉娃娃 ++ ++ Set filesystem label <strong>%1</strong> to partition <strong>%2</strong> ++ @info ++ + + -+ -+ Chisinau -+ tz_names -+ 基希讷乌 ++ ++ Setting filesystem label <strong>%1</strong> to partition <strong>%2</strong>… ++ @status ++ + + -+ -+ Chita -+ tz_names -+ 赤塔 ++ ++ ++ The installer failed to update partition table on disk '%1'. ++ @info ++ + ++ ++ ++ CheckerContainer + -+ -+ Choibalsan -+ tz_names -+ 乔巴桑 ++ ++ Gathering system information... ++ + ++ ++ ++ ChoicePage + -+ -+ Christmas -+ tz_names -+ 伯利恒 ++ ++ Select storage de&vice: ++ @label ++ + + -+ -+ Chuuk -+ tz_names -+ 楚克 ++ ++ ++ ++ ++ Current: ++ @label ++ + + -+ -+ Cocos -+ tz_names -+ 科科斯 ++ ++ After: ++ @label ++ + + -+ -+ Colombo -+ tz_names -+ 科伦坡 ++ ++ Reuse %1 as home partition for %2 ++ @label ++ + + -+ -+ Comoro -+ tz_names -+ 科摩罗 ++ ++ <strong>Select a partition to shrink, then drag the bottom bar to resize</strong> ++ + + -+ -+ Conakry -+ tz_names -+ 科纳克里 ++ ++ %1 will be shrunk to %2MiB and a new %3MiB partition will be created for %4. ++ @info, %1 is partition name, %4 is product name ++ + + -+ -+ Copenhagen -+ tz_names -+ 哥本哈根 ++ ++ <strong>Select a partition to install on</strong> ++ @label ++ + + -+ -+ Costa Rica -+ tz_names -+ 哥斯达黎加 ++ ++ An EFI system partition cannot be found anywhere on this system. Please go back and use manual partitioning to set up %1. ++ @info, %1 is product name ++ + + -+ -+ Creston -+ tz_names -+ 克雷斯顿 ++ ++ The EFI system partition at %1 will be used for starting %2. ++ @info, %1 is partition path, %2 is product name ++ + + -+ -+ Cuiaba -+ tz_names -+ 库亚巴 ++ ++ EFI system partition: ++ @label ++ + + -+ -+ Curacao -+ tz_names -+ 库拉索 ++ ++ This storage device does not seem to have an operating system on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. ++ + + -+ -+ Currie -+ tz_names -+ 柯里 ++ ++ ++ ++ ++ <strong>Erase disk</strong><br/>This will <font color="red">delete</font> all data currently present on the selected storage device. ++ + + -+ -+ Dakar -+ tz_names -+ 达喀尔 ++ ++ ++ ++ ++ <strong>Install alongside</strong><br/>The installer will shrink a partition to make room for %1. ++ + + -+ -+ Damascus -+ tz_names -+ 大马士革 ++ ++ ++ ++ ++ <strong>Replace a partition</strong><br/>Replaces a partition with %1. ++ + + -+ -+ Danmarkshavn -+ tz_names -+ 丹麦 ++ ++ This storage device has %1 on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. ++ + + -+ -+ Dar es Salaam -+ tz_names -+ 达累斯萨拉姆 ++ ++ This storage device already has an operating system on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. ++ + + -+ -+ Darwin -+ tz_names -+ 达尔文 ++ ++ This storage device has multiple operating systems on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. ++ + + -+ -+ Davis -+ tz_names -+ 戴维斯 ++ ++ This storage device already has an operating system on it, but the partition table <strong>%1</strong> is different from the needed <strong>%2</strong>.<br/> ++ + + -+ -+ Dawson -+ tz_names -+ 道森 ++ ++ This storage device has one of its partitions <strong>mounted</strong>. ++ @info ++ + + -+ -+ Dawson Creek -+ tz_names -+ 道森溪 ++ ++ This storage device is a part of an <strong>inactive RAID</strong> device. ++ @info ++ + + -+ -+ Denver -+ tz_names -+ 丹佛 ++ ++ No swap ++ @label ++ + + -+ -+ Detroit -+ tz_names -+ 底特律 ++ ++ Reuse swap ++ @label ++ + + -+ -+ Dhaka -+ tz_names -+ 达卡 ++ ++ Swap (no Hibernate) ++ @label ++ + + -+ -+ Dili -+ tz_names -+ 帝力 ++ ++ Swap (with Hibernate) ++ @label ++ + + -+ -+ Djibouti -+ tz_names -+ 吉布提 ++ ++ Swap to file ++ @label ++ + + -+ -+ Dominica -+ tz_names -+ 多米尼克 ++ ++ <strong>Manual partitioning</strong><br/>You can create or resize partitions yourself. ++ + + -+ -+ Douala -+ tz_names -+ 杜阿拉 ++ ++ Bootloader location: ++ @label ++ + ++ ++ ++ ClearMountsJob + -+ -+ Dubai -+ tz_names -+ 迪拜 ++ ++ Successfully unmounted %1. ++ + + -+ -+ Dublin -+ tz_names -+ 都柏林 ++ ++ Successfully disabled swap %1. ++ + + -+ -+ DumontDUrville -+ tz_names -+ 杜蒙·杜维尔 ++ ++ Successfully cleared swap %1. ++ + + -+ -+ Dushanbe -+ tz_names -+ 杜尚别 ++ ++ Successfully closed mapper device %1. ++ + + -+ -+ Easter -+ tz_names -+ 伊斯特迪 ++ ++ Successfully disabled volume group %1. ++ + + -+ -+ Edmonton -+ tz_names -+ 埃德蒙顿 ++ ++ Clear mounts for partitioning operations on %1 ++ @title ++ + + -+ -+ Efate -+ tz_names -+ 埃法特岛 ++ ++ Clearing mounts for partitioning operations on %1… ++ @status ++ + + -+ -+ Eirunepe -+ tz_names -+ 埃鲁内佩 ++ ++ Cleared all mounts for %1 ++ + ++ ++ ++ ClearTempMountsJob + -+ -+ El Aaiun -+ tz_names -+ 阿尤恩 ++ ++ ++ Clearing all temporary mounts… ++ @status ++ + + -+ -+ El Salvador -+ tz_names -+ 萨尔瓦多 ++ ++ Cleared all temporary mounts. ++ + ++ ++ ++ CommandList + -+ -+ Enderbury -+ tz_names -+ 恩德伯里 ++ ++ Could not run command. ++ + + -+ -+ Eucla -+ tz_names -+ 尤克拉 ++ ++ The commands use variables that are not defined. Missing variables are: %1. ++ + ++ ++ ++ Config + -+ -+ Fakaofo -+ tz_names -+ 法考福 ++ ++ Setup Failed ++ @title ++ + + -+ -+ Famagusta -+ tz_names -+ 法马古斯塔 ++ ++ Installation Failed ++ @title ++ + + -+ -+ Faroe -+ tz_names -+ 法罗 ++ ++ The setup of %1 did not complete successfully. ++ @info ++ + + -+ -+ Fiji -+ tz_names -+ 斐济 ++ ++ The installation of %1 did not complete successfully. ++ @info ++ + + -+ -+ Fort Nelson -+ tz_names -+ 纳尔逊堡 ++ ++ Setup Complete ++ @title ++ + + -+ -+ Fortaleza -+ tz_names -+ 福塔莱萨 ++ ++ Installation Complete ++ @title ++ + + -+ -+ Freetown -+ tz_names -+ 弗里敦 ++ ++ The setup of %1 is complete. ++ @info ++ + + -+ -+ Funafuti -+ tz_names -+ 富纳富提 ++ ++ The installation of %1 is complete. ++ @info ++ + + -+ -+ Gaborone -+ tz_names -+ 哈博罗内 ++ ++ Keyboard model has been set to %1<br/>. ++ @label, %1 is keyboard model, as in Apple Magic Keyboard ++ + + -+ -+ Galapagos -+ tz_names -+ 加拉帕戈斯群岛 ++ ++ Keyboard layout has been set to %1/%2. ++ @label, %1 is layout, %2 is layout variant ++ + + -+ -+ Gambier -+ tz_names -+ 甘比尔 ++ ++ Set timezone to %1/%2 ++ @action ++ + + -+ -+ Gaza -+ tz_names -+ 加沙 ++ ++ The system language will be set to %1. ++ @info ++ + + -+ -+ Gibraltar -+ tz_names -+ 直布罗陀 ++ ++ The numbers and dates locale will be set to %1. ++ @info ++ + + -+ -+ Glace Bay -+ tz_names -+ 格莱斯湾 ++ ++ Network Installation. (Disabled: Incorrect configuration) ++ + + -+ -+ Godthab -+ tz_names -+ 戈德萨布 ++ ++ Network Installation. (Disabled: Received invalid groups data) ++ + + -+ -+ Goose Bay -+ tz_names -+ 鹅湾 ++ ++ Network Installation. (Disabled: Internal error) ++ + + -+ -+ Grand Turk -+ tz_names -+ 大特克 ++ ++ Network Installation. (Disabled: Unable to fetch package lists, check your network connection) ++ + + -+ -+ Grenada -+ tz_names -+ 格林纳达 ++ ++ Network Installation. (Disabled: No package list) ++ + + -+ -+ Guadalcanal -+ tz_names -+ 瓜达尔卡纳尔岛 ++ ++ Package selection ++ + + -+ -+ Guadeloupe -+ tz_names -+ 瓜德罗普岛 ++ ++ Package Selection ++ + + -+ -+ Guam -+ tz_names -+ 关岛 ++ ++ Please pick a product from the list. The selected product will be installed. ++ + + -+ -+ Guatemala -+ tz_names -+ 危地马拉 ++ ++ Packages ++ + + -+ -+ Guayaquil -+ tz_names -+ 瓜亚基尔 ++ ++ Install option: <strong>%1</strong> ++ + + -+ -+ Guernsey -+ tz_names -+ 根西岛 ++ ++ None ++ + + -+ -+ Guyana -+ tz_names -+ 圭亚那 ++ ++ Summary ++ @label ++ + + -+ -+ Halifax -+ tz_names -+ 哈利法克斯 ++ ++ This is an overview of what will happen once you start the setup procedure. ++ + + -+ -+ Harare -+ tz_names -+ 哈拉雷 ++ ++ This is an overview of what will happen once you start the install procedure. ++ + + -+ -+ Havana -+ tz_names -+ 哈瓦那 ++ ++ Your username is too long. ++ + + -+ -+ Hebron -+ tz_names -+ 希伯伦 ++ ++ Your username must start with a lowercase letter or underscore. ++ + + -+ -+ Helsinki -+ tz_names -+ 赫尔辛基 ++ ++ Only lowercase letters, numbers, underscore and hyphen are allowed. ++ + + -+ -+ Hermosillo -+ tz_names -+ 埃莫西洛 ++ ++ '%1' is not allowed as username. ++ + + -+ -+ Ho Chi Minh -+ tz_names -+ 胡志明 ++ ++ Your hostname is too short. ++ + + -+ -+ Hobart -+ tz_names -+ 霍巴特 ++ ++ Your hostname is too long. ++ + + -+ -+ Hong Kong(China) -+ tz_names -+ 香港(中国) ++ ++ '%1' is not allowed as hostname. ++ + + -+ -+ Honolulu -+ tz_names -+ 檀香山 ++ ++ Only letters, numbers, underscore and hyphen are allowed. ++ + + -+ -+ Hovd -+ tz_names -+ 科布多 ++ ++ Your passwords do not match! ++ + + -+ -+ Indiana/Indianapolis -+ tz_names -+ 印第安纳州/印第安纳波利斯 ++ ++ OK! ++ + + -+ -+ Indiana/Knox -+ tz_names -+ 印第安纳州/诺克斯 ++ ++ This computer does not satisfy the minimum requirements for setting up %1.<br/>Setup cannot continue. ++ + + -+ -+ Indiana/Marengo -+ tz_names -+ 印度/马伦戈 ++ ++ This computer does not satisfy the minimum requirements for installing %1.<br/>Installation cannot continue. ++ + + -+ -+ Indiana/Petersburg -+ tz_names -+ 印第安纳州/彼得堡 ++ ++ This computer does not satisfy some of the recommended requirements for setting up %1.<br/>Setup can continue, but some features might be disabled. ++ + + -+ -+ Indiana/Tell City -+ tz_names -+ 印第安纳州/泰尔城 ++ ++ This computer does not satisfy some of the recommended requirements for installing %1.<br/>Installation can continue, but some features might be disabled. ++ + + -+ -+ Indiana/Vevay -+ tz_names -+ 印度/沃韦 ++ ++ This program will ask you some questions and set up %2 on your computer. ++ + + -+ -+ Indiana/Vincennes -+ tz_names -+ 印第安纳州/文森斯 ++ ++ <h1>Welcome to the Calamares setup program for %1</h1> ++ + + -+ -+ Indiana/Winamac -+ tz_names -+ 印第安纳州/威纳马克 ++ ++ <h1>Welcome to %1 setup</h1> ++ + + -+ -+ Inuvik -+ tz_names -+ 伊努维克 ++ ++ <h1>Welcome to the Calamares installer for %1</h1> ++ + + -+ -+ Iqaluit -+ tz_names -+ 伊魁特 ++ ++ <h1>Welcome to the %1 installer</h1> ++ + ++ ++ ++ ContextualProcessJob + -+ -+ Irkutsk -+ tz_names -+ 伊尔库茨克 ++ ++ Performing contextual processes' job… ++ @status ++ + ++ ++ ++ CreatePartitionDialog + -+ -+ Isle of Man -+ tz_names -+ 马恩岛 ++ ++ Create a Partition ++ + + -+ -+ Istanbul -+ tz_names -+ 伊斯坦布尔 ++ ++ Si&ze: ++ + + -+ -+ Jakarta -+ tz_names -+ 雅加达 ++ ++ MiB ++ + + -+ -+ Jamaica -+ tz_names -+ 牙买加 ++ ++ Partition &Type: ++ + + -+ -+ Jayapura -+ tz_names -+ 查亚普拉 ++ ++ Primar&y ++ + + -+ -+ Jersey -+ tz_names -+ 泽西岛 ++ ++ E&xtended ++ + + -+ -+ Jerusalem -+ tz_names -+ 耶路撒冷 ++ ++ Fi&le System: ++ + + -+ -+ Johannesburg -+ tz_names -+ 约翰内斯堡 ++ ++ LVM LV name ++ + + -+ -+ Juba -+ tz_names -+ 朱巴 ++ ++ &Mount Point: ++ + + -+ -+ Juneau -+ tz_names -+ 朱诺 ++ ++ Flags: ++ + + -+ -+ Kabul -+ tz_names -+ 喀布尔 ++ ++ Label for the filesystem ++ + + -+ -+ Kaliningrad -+ tz_names -+ 加里宁格勒 ++ ++ FS Label: ++ + + -+ -+ Kamchatka -+ tz_names -+ 堪察加半岛 ++ ++ En&crypt ++ @action ++ + + -+ -+ Kampala -+ tz_names -+ 坎帕拉 ++ ++ Logical ++ @label ++ + + -+ -+ Karachi -+ tz_names -+ 卡拉奇 ++ ++ Primary ++ @label ++ + + -+ -+ Kathmandu -+ tz_names -+ 加德满都 ++ ++ GPT ++ @label ++ + + -+ -+ Kentucky/Louisville -+ tz_names -+ 肯塔基州/路易斯维尔 ++ ++ Mountpoint already in use. Please select another one. ++ @info ++ + + -+ -+ Kentucky/Monticello -+ tz_names -+ 肯塔基州/蒙蒂塞洛 ++ ++ Mountpoint must start with a <tt>/</tt>. ++ @info ++ + ++ ++ ++ CreatePartitionJob + -+ -+ Kerguelen -+ tz_names -+ 凯尔盖朗 ++ ++ Create new %1MiB partition on %3 (%2) with entries %4 ++ @title ++ + + -+ -+ Khandyga -+ tz_names -+ 坎代加 ++ ++ Create new %1MiB partition on %3 (%2) ++ @title ++ + + -+ -+ Khartoum -+ tz_names -+ 喀土穆 ++ ++ Create new %2MiB partition on %4 (%3) with file system %1 ++ @title ++ + + -+ -+ Kiev -+ tz_names -+ 基辅 ++ ++ Create new <strong>%1MiB</strong> partition on <strong>%3</strong> (%2) with entries <em>%4</em> ++ @info ++ + + -+ -+ Kigali -+ tz_names -+ 基加利 ++ ++ Create new <strong>%1MiB</strong> partition on <strong>%3</strong> (%2) ++ @info ++ + + -+ -+ Kinshasa -+ tz_names -+ 金沙萨 ++ ++ Create new <strong>%2MiB</strong> partition on <strong>%4</strong> (%3) with file system <strong>%1</strong> ++ @info ++ + + -+ -+ Kiritimati -+ tz_names -+ 基里蒂马提斯 ++ ++ ++ Creating new %1 partition on %2… ++ @status ++ + + -+ -+ Kirov -+ tz_names -+ 基洛夫 ++ ++ The installer failed to create partition on disk '%1'. ++ @info ++ + ++ ++ ++ CreatePartitionTableDialog + -+ -+ Kolkata -+ tz_names -+ 加尔格达 ++ ++ Create Partition Table ++ + + -+ -+ Kosrae -+ tz_names -+ 科斯雷 ++ ++ Creating a new partition table will delete all existing data on the disk. ++ + + -+ -+ Kralendijk -+ tz_names -+ 克罗地亚 ++ ++ What kind of partition table do you want to create? ++ + + -+ -+ Krasnoyarsk -+ tz_names -+ 克拉斯诺亚尔斯克 ++ ++ Master Boot Record (MBR) ++ + + -+ -+ Kuala Lumpur -+ tz_names -+ 吉隆坡 ++ ++ GUID Partition Table (GPT) ++ + ++ ++ ++ CreatePartitionTableJob + -+ -+ Kuching -+ tz_names -+ 古晋 ++ ++ ++ Creating new %1 partition table on %2… ++ @status ++ + + -+ -+ Kuwait -+ tz_names -+ 科威特 ++ ++ Creating new <strong>%1</strong> partition table on <strong>%2</strong> (%3)… ++ @status ++ + + -+ -+ Kwajalein -+ tz_names -+ 夸贾林 ++ ++ The installer failed to create a partition table on %1. ++ + ++ ++ ++ CreateUserJob + -+ -+ La Paz -+ tz_names -+ 拉巴斯 ++ ++ Create user %1 ++ + + -+ -+ Lagos -+ tz_names -+ 拉各斯 ++ ++ Create user <strong>%1</strong> ++ + + -+ -+ Libreville -+ tz_names -+ 利伯维尔 ++ ++ ++ Creating user %1… ++ @status ++ + + -+ -+ Lima -+ tz_names -+ 利马 ++ ++ Preserving home directory… ++ @status ++ + + -+ -+ Lindeman -+ tz_names -+ 林德曼 ++ ++ Configuring user %1 ++ @status ++ + + -+ -+ Lisbon -+ tz_names -+ 里斯本 ++ ++ Setting file permissions… ++ @status ++ + ++ ++ ++ CreateVolumeGroupDialog + -+ -+ Ljubljana -+ tz_names -+ 卢布尔雅那 ++ ++ Create Volume Group ++ @title ++ + ++ ++ ++ CreateVolumeGroupJob + -+ -+ Lome -+ tz_names -+ 多哥 ++ ++ ++ Creating new volume group named %1… ++ @status ++ + + -+ -+ London -+ tz_names -+ 伦敦 ++ ++ Creating new volume group named <strong>%1</strong>… ++ @status ++ + + -+ -+ Longyearbyen -+ tz_names -+ 朗伊尔城 ++ ++ The installer failed to create a volume group named '%1'. ++ + ++ ++ ++ DeactivateVolumeGroupJob + -+ -+ Lord Howe -+ tz_names -+ 豪勋爵 ++ ++ ++ Deactivating volume group named %1… ++ @status ++ + + -+ -+ Los Angeles -+ tz_names -+ 洛杉矶 ++ ++ Deactivating volume group named <strong>%1</strong>… ++ @status ++ + + -+ -+ Lower Princes -+ tz_names -+ 圣马丁 ++ ++ The installer failed to deactivate a volume group named %1. ++ + ++ ++ ++ DeletePartitionJob + -+ -+ Luanda -+ tz_names -+ 罗安达 ++ ++ ++ Deleting partition %1… ++ @status ++ + + -+ -+ Lubumbashi -+ tz_names -+ 卢本巴希 ++ ++ Deleting partition <strong>%1</strong>… ++ @status ++ + + -+ -+ Lusaka -+ tz_names -+ 卢萨卡 ++ ++ The installer failed to delete partition %1. ++ + ++ ++ ++ DeviceInfoWidget + -+ -+ Luxembourg -+ tz_names -+ 卢森堡 ++ ++ <br><br>This partition table type is only advisable on older systems which start from a <strong>BIOS</strong> boot environment. GPT is recommended in most other cases.<br><br><strong>Warning:</strong> the MBR partition table is an obsolete MS-DOS era standard.<br>Only 4 <em>primary</em> partitions may be created, and of those 4, one can be an <em>extended</em> partition, which may in turn contain many <em>logical</em> partitions. ++ + + -+ -+ Macau(China) -+ tz_names -+ 澳门(中国) ++ ++ <br><br>This is the recommended partition table type for modern systems which start from an <strong>EFI</strong> boot environment. ++ + + -+ -+ Maceio -+ tz_names -+ 马塞奥 ++ ++ This is a <strong>loop</strong> device.<br><br>It is a pseudo-device with no partition table that makes a file accessible as a block device. This kind of setup usually only contains a single filesystem. ++ + + -+ -+ Macquarie -+ tz_names -+ 麦格理 ++ ++ This installer <strong>cannot detect a partition table</strong> on the selected storage device.<br><br>The device either has no partition table, or the partition table is corrupted or of an unknown type.<br>This installer can create a new partition table for you, either automatically, or through the manual partitioning page. ++ + + -+ -+ Madeira -+ tz_names -+ 马德拉 ++ ++ This device has a <strong>%1</strong> partition table. ++ + + -+ -+ Madrid -+ tz_names -+ 马德里 ++ ++ The type of <strong>partition table</strong> on the selected storage device.<br><br>The only way to change the partition table type is to erase and recreate the partition table from scratch, which destroys all data on the storage device.<br>This installer will keep the current partition table unless you explicitly choose otherwise.<br>If unsure, on modern systems GPT is preferred. ++ + ++ ++ ++ DeviceModel + -+ -+ Magadan -+ tz_names -+ 马加丹 ++ ++ %1 - %2 (%3) ++ device[name] - size[number] (device-node[name]) ++ + + -+ -+ Mahe -+ tz_names -+ 马埃 ++ ++ %1 - (%2) ++ device[name] - (device-node[name]) ++ + ++ ++ ++ DracutLuksCfgJob + -+ -+ Majuro -+ tz_names -+ 马朱罗 ++ ++ Writing LUKS configuration for Dracut to %1… ++ @status ++ + + -+ -+ Makassar -+ tz_names -+ 望加锡 ++ ++ Skipping writing LUKS configuration for Dracut: "/" partition is not encrypted ++ @info ++ + + -+ -+ Malabo -+ tz_names -+ 马拉博 ++ ++ Failed to open %1 ++ @error ++ + ++ ++ ++ DummyCppJob + -+ -+ Maldives -+ tz_names -+ 马尔代夫 ++ ++ Performing dummy C++ job… ++ @status ++ + ++ ++ ++ EditExistingPartitionDialog + -+ -+ Malta -+ tz_names -+ 马耳他 ++ ++ Edit Existing Partition ++ + + -+ -+ Managua -+ tz_names -+ 马那瓜 ++ ++ Con&tent: ++ + + -+ -+ Manaus -+ tz_names -+ 马瑙斯 ++ ++ &Keep ++ + + -+ -+ Manila -+ tz_names -+ 马尼拉 ++ ++ Format ++ + + -+ -+ Maputo -+ tz_names -+ 马普托 ++ ++ Warning: Formatting the partition will erase all existing data. ++ + + -+ -+ Mariehamn -+ tz_names -+ 玛丽港 ++ ++ &Mount Point: ++ + + -+ -+ Marigot -+ tz_names -+ 马里戈 ++ ++ Si&ze: ++ + + -+ -+ Marquesas -+ tz_names -+ 马克萨斯 ++ ++ MiB ++ + + -+ -+ Martinique -+ tz_names -+ 马提尼克岛 ++ ++ Fi&le System: ++ + + -+ -+ Maseru -+ tz_names -+ 马塞卢 ++ ++ Flags: ++ + + -+ -+ Matamoros -+ tz_names -+ 马塔莫罗斯 ++ ++ Label for the filesystem ++ + + -+ -+ Mauritius -+ tz_names -+ 毛里求斯 ++ ++ FS Label: ++ + + -+ -+ Mawson -+ tz_names -+ 莫森 ++ ++ Passphrase for existing partition ++ + + -+ -+ Mayotte -+ tz_names -+ 马约特岛 ++ ++ Partition %1 could not be decrypted with the given passphrase.<br/><br/>Edit the partition again and give the correct passphrase or delete and create a new encrypted partition. ++ + ++ ++ ++ EncryptWidget + -+ -+ Mazatlan -+ tz_names -+ 马萨特兰 ++ ++ En&crypt system ++ + + -+ -+ Mbabane -+ tz_names -+ 姆巴巴内 ++ ++ Your system does not seem to support encryption well enough to encrypt the entire system. You may enable encryption, but performance may suffer. ++ + + -+ -+ McMurdo -+ tz_names -+ 麦克默多 ++ ++ Passphrase ++ + + -+ -+ Melbourne -+ tz_names -+ 墨尔本 ++ ++ Confirm passphrase ++ + + -+ -+ Menominee -+ tz_names -+ 梅诺米尼 ++ ++ ++ Please enter the same passphrase in both boxes. ++ @tooltip ++ + + -+ -+ Merida -+ tz_names -+ 梅里达 ++ ++ Password must be a minimum of %1 characters. ++ @tooltip ++ + ++ ++ ++ ErrorDialog + -+ -+ Metlakatla -+ tz_names -+ 梅特拉卡特拉 ++ ++ Details: ++ + + -+ -+ Mexico City -+ tz_names -+ 墨西哥城 ++ ++ Would you like to paste the install log to the web? ++ + ++ ++ ++ FillGlobalStorageJob + -+ -+ Midway -+ tz_names -+ 中途岛 ++ ++ Set partition information ++ @title ++ + + -+ -+ Minsk -+ tz_names -+ 明斯克 ++ ++ Install %1 on <strong>new</strong> %2 system partition with features <em>%3</em> ++ @info ++ + + -+ -+ Miquelon -+ tz_names -+ 密克隆 ++ ++ Install %1 on <strong>new</strong> %2 system partition ++ @info ++ + + -+ -+ Mogadishu -+ tz_names -+ 摩加迪沙 ++ ++ Set up <strong>new</strong> %2 partition with mount point <strong>%1</strong> and features <em>%3</em> ++ @info ++ + + -+ -+ Monaco -+ tz_names -+ 摩纳哥 ++ ++ Set up <strong>new</strong> %2 partition with mount point <strong>%1</strong>%3 ++ @info ++ + + -+ -+ Moncton -+ tz_names -+ 蒙克顿 ++ ++ Install %2 on %3 system partition <strong>%1</strong> with features <em>%4</em> ++ @info ++ + + -+ -+ Monrovia -+ tz_names -+ 蒙罗维亚 ++ ++ Install %2 on %3 system partition <strong>%1</strong> ++ @info ++ + + -+ -+ Monterrey -+ tz_names -+ 蒙特雷 ++ ++ Set up %3 partition <strong>%1</strong> with mount point <strong>%2</strong> and features <em>%4</em> ++ @info ++ + + -+ -+ Montevideo -+ tz_names -+ 蒙得维的亚 ++ ++ Set up %3 partition <strong>%1</strong> with mount point <strong>%2</strong>%4… ++ @info ++ + + -+ -+ Montserrat -+ tz_names -+ 蒙特塞拉特 ++ ++ Install boot loader on <strong>%1</strong>… ++ @info ++ + + -+ -+ Moscow -+ tz_names -+ 莫斯科 ++ ++ Setting up mount points… ++ @status ++ + ++ ++ ++ FinishedPage + -+ -+ Muscat -+ tz_names -+ 马斯喀特 ++ ++ &Restart now ++ + + -+ -+ Nairobi -+ tz_names -+ 内罗毕 ++ ++ <h1>All done.</h1><br/>%1 has been set up on your computer.<br/>You may now start using your new system. ++ @info ++ + + -+ -+ Nassau -+ tz_names -+ 拿骚 ++ ++ <html><head/><body><p>When this box is checked, your system will restart immediately when you click on <span style="font-style:italic;">Done</span> or close the setup program.</p></body></html> ++ @tooltip ++ + + -+ -+ Nauru -+ tz_names -+ 瑙鲁 ++ ++ <h1>All done.</h1><br/>%1 has been installed on your computer.<br/>You may now restart into your new system, or continue using the %2 Live environment. ++ @info ++ + + -+ -+ Ndjamena -+ tz_names -+ 恩贾梅纳 ++ ++ <html><head/><body><p>When this box is checked, your system will restart immediately when you click on <span style="font-style:italic;">Done</span> or close the installer.</p></body></html> ++ @tooltip ++ + + -+ -+ New York -+ tz_names -+ 纽约 ++ ++ <h1>Setup Failed</h1><br/>%1 has not been set up on your computer.<br/>The error message was: %2. ++ @info, %1 is product name with version ++ + + -+ -+ Niamey -+ tz_names -+ 尼亚美 ++ ++ <h1>Installation Failed</h1><br/>%1 has not been installed on your computer.<br/>The error message was: %2. ++ @info, %1 is product name with version ++ + ++ ++ ++ FinishedQmlViewStep + -+ -+ Nicosia -+ tz_names -+ 尼科西亚 ++ ++ Finish ++ @label ++ + ++ ++ ++ FinishedViewStep + -+ -+ Nipigon -+ tz_names -+ 尼皮贡 ++ ++ Finish ++ @label ++ + ++ ++ ++ FormatPartitionJob + -+ -+ Niue -+ tz_names -+ 纽埃 ++ ++ Format partition %1 (file system: %2, size: %3 MiB) on %4 ++ @title ++ + + -+ -+ Nome -+ tz_names -+ 诺姆 ++ ++ Format <strong>%3MiB</strong> partition <strong>%1</strong> with file system <strong>%2</strong> ++ @info ++ + + -+ -+ Norfolk -+ tz_names -+ 诺福克 ++ ++ %1 (%2) ++ partition label %1 (device path %2) ++ + + -+ -+ Noronha -+ tz_names -+ 诺罗尼亚 ++ ++ Formatting partition %1 with file system %2… ++ @status ++ + + -+ -+ North Dakota/Beulah -+ tz_names -+ 北达科他州/比拉 ++ ++ The installer failed to format partition %1 on disk '%2'. ++ + ++ ++ ++ GeneralRequirements + -+ -+ North Dakota/Center -+ tz_names -+ 北达科他州/中心 ++ ++ Please ensure the system has at least %1 GiB available drive space. ++ + + -+ -+ North Dakota/New Salem -+ tz_names -+ 北达科他州/新塞勒姆 ++ ++ Available drive space is all of the hard disks and SSDs connected to the system. ++ + + -+ -+ Nouakchott -+ tz_names -+ 努瓦克肖特 ++ ++ There is not enough drive space. At least %1 GiB is required. ++ + + -+ -+ Noumea -+ tz_names -+ 努美阿 ++ ++ has at least %1 GiB working memory ++ + + -+ -+ Novokuznetsk -+ tz_names -+ 新库兹涅茨克 ++ ++ The system does not have enough working memory. At least %1 GiB is required. ++ + + -+ -+ Novosibirsk -+ tz_names -+ 新西伯利亚 ++ ++ is plugged in to a power source ++ + + -+ -+ Ojinaga -+ tz_names -+ 魁北克 ++ ++ The system is not plugged in to a power source. ++ + + -+ -+ Omsk -+ tz_names -+ 鄂木斯克 ++ ++ is connected to the Internet ++ + + -+ -+ Oral -+ tz_names -+ 多拉 ++ ++ The system is not connected to the Internet. ++ + + -+ -+ Oslo -+ tz_names -+ 奥斯陆 ++ ++ is running the installer as an administrator (root) ++ + + -+ -+ Ouagadougou -+ tz_names -+ 瓦加杜古 ++ ++ The setup program is not running with administrator rights. ++ + + -+ -+ Pago Pago -+ tz_names -+ 帕果帕果 ++ ++ The installer is not running with administrator rights. ++ + + -+ -+ Palau -+ tz_names -+ 帕劳 ++ ++ has a screen large enough to show the whole installer ++ + + -+ -+ Palmer -+ tz_names -+ 帕尔默 ++ ++ The screen is too small to display the setup program. ++ + + -+ -+ Panama -+ tz_names -+ 巴拿马 ++ ++ The screen is too small to display the installer. ++ + + -+ -+ Pangnirtung -+ tz_names -+ 巴芬岛的旁涅唐 ++ ++ is always false ++ + + -+ -+ Paramaribo -+ tz_names -+ 帕拉马里博 ++ ++ The computer says no. ++ + + -+ -+ Paris -+ tz_names -+ 巴黎 ++ ++ is always false (slowly) ++ + + -+ -+ Perth -+ tz_names -+ 珀斯 ++ ++ The computer says no (slowly). ++ + + -+ -+ Phnom Penh -+ tz_names -+ 金边 ++ ++ is always true ++ + + -+ -+ Phoenix -+ tz_names -+ 凤凰城 ++ ++ The computer says yes. ++ + + -+ -+ Pitcairn -+ tz_names -+ 皮特凯恩 ++ ++ is always true (slowly) ++ + + -+ -+ Podgorica -+ tz_names -+ 波德戈里察 ++ ++ The computer says yes (slowly). ++ + + -+ -+ Pohnpei -+ tz_names -+ 波纳佩岛 ++ ++ is checked three times. ++ + + -+ -+ Pontianak -+ tz_names -+ 坤甸 ++ ++ The snark has not been checked three times. ++ The (some mythological beast) has not been checked three times. ++ + ++ ++ ++ HostInfoJob + -+ -+ Port Moresby -+ tz_names -+ 莫尔兹比港 ++ ++ Collecting information about your machine… ++ @status ++ + ++ ++ ++ IDJob + -+ -+ Port of Spain -+ tz_names -+ 西班牙港 ++ ++ ++ ++ ++ OEM Batch Identifier ++ + + -+ -+ Port-au-Prince -+ tz_names -+ 太子港 ++ ++ Could not create directories <code>%1</code>. ++ + + -+ -+ Porto Velho -+ tz_names -+ 维略港 ++ ++ Could not open file <code>%1</code>. ++ + + -+ -+ Porto-Novo -+ tz_names -+ 波多诺伏 ++ ++ Could not write to file <code>%1</code>. ++ + ++ ++ ++ InitcpioJob + -+ -+ Prague -+ tz_names -+ 布拉格 ++ ++ Creating initramfs with mkinitcpio… ++ @status ++ + ++ ++ ++ InitramfsJob + -+ -+ Puerto Rico -+ tz_names -+ 波多黎各 ++ ++ Creating initramfs… ++ @status ++ + ++ ++ ++ InteractiveTerminalPage + -+ -+ Punta Arenas -+ tz_names -+ 蓬塔阿雷纳斯 ++ ++ Konsole not installed. ++ @error ++ + + -+ -+ Pyongyang -+ tz_names -+ 平壤 ++ ++ Please install KDE Konsole and try again! ++ @info ++ + + -+ -+ Qatar -+ tz_names -+ 卡塔尔 ++ ++ Executing script: &nbsp;<code>%1</code> ++ @info ++ + ++ ++ ++ InteractiveTerminalViewStep + -+ -+ Qostanay -+ tz_names -+ 库斯塔 ++ ++ Script ++ @label ++ + ++ ++ ++ KeyboardQmlViewStep + -+ -+ Qyzylorda -+ tz_names -+ 克孜勒奥尔达 ++ ++ Keyboard ++ @label ++ + ++ ++ ++ KeyboardViewStep + -+ -+ Rainy River -+ tz_names -+ 雷尼河 ++ ++ Keyboard ++ @label ++ + ++ ++ ++ LCLocaleDialog + -+ -+ Rankin Inlet -+ tz_names -+ 兰京海口 ++ ++ System Locale Setting ++ @title ++ + + -+ -+ Rarotonga -+ tz_names -+ 拉罗汤加 ++ ++ The system locale setting affects the language and character set for some command line user interface elements.<br/>The current setting is <strong>%1</strong>. ++ @info ++ + + -+ -+ Recife -+ tz_names -+ 累西腓 ++ ++ &Cancel ++ @button ++ + + -+ -+ Regina -+ tz_names -+ 里贾纳 ++ ++ &OK ++ @button ++ + ++ ++ ++ LOSHJob + -+ -+ Resolute -+ tz_names -+ 雷索卢特 ++ ++ Configuring encrypted swap. ++ + + -+ -+ Reunion -+ tz_names -+ 留尼旺岛 ++ ++ No target system available. ++ + + -+ -+ Reykjavik -+ tz_names -+ 雷克雅未克 ++ ++ No rootMountPoint is set. ++ + + -+ -+ Riga -+ tz_names -+ 里加 ++ ++ No configFilePath is set. ++ + ++ ++ ++ LicensePage + -+ -+ Rio Branco -+ tz_names -+ 里奥·布兰科 ++ ++ <h1>License Agreement</h1> ++ + + -+ -+ Riyadh -+ tz_names -+ 利雅得 ++ ++ I accept the terms and conditions above. ++ @info ++ + + -+ -+ Rome -+ tz_names -+ 罗马 ++ ++ Please review the End User License Agreements (EULAs). ++ @info ++ + + -+ -+ Rothera -+ tz_names -+ 罗瑟拉 ++ ++ This setup procedure will install proprietary software that is subject to licensing terms. ++ @info ++ + + -+ -+ Saipan -+ tz_names -+ 塞班岛 ++ ++ If you do not agree with the terms, the setup procedure cannot continue. ++ @info ++ + + -+ -+ Sakhalin -+ tz_names -+ 萨哈林 ++ ++ This setup procedure can install proprietary software that is subject to licensing terms in order to provide additional features and enhance the user experience. ++ @info ++ + + -+ -+ Samara -+ tz_names -+ 萨马拉 ++ ++ If you do not agree with the terms, proprietary software will not be installed, and open source alternatives will be used instead. ++ @info ++ + ++ ++ ++ LicenseViewStep + -+ -+ Samarkand -+ tz_names -+ 撒马尔罕 ++ ++ License ++ @label ++ + ++ ++ ++ LicenseWidget + -+ -+ San Marino -+ tz_names -+ 圣马力诺 ++ ++ URL: %1 ++ @label ++ + + -+ -+ Santarem -+ tz_names -+ 圣塔伦 ++ ++ <strong>%1 driver</strong><br/>by %2 ++ @label, %1 is product name, %2 is product vendor ++ %1 is an untranslatable product name, example: Creative Audigy driver ++ + + -+ -+ Santiago -+ tz_names -+ 圣地亚哥 ++ ++ <strong>%1 graphics driver</strong><br/><font color="Grey">by %2</font> ++ @label, %1 is product name, %2 is product vendor ++ %1 is usually a vendor name, example: Nvidia graphics driver ++ + + -+ -+ Santo Domingo -+ tz_names -+ 圣多明各 ++ ++ <strong>%1 browser plugin</strong><br/><font color="Grey">by %2</font> ++ @label, %1 is product name, %2 is product vendor ++ + + -+ -+ Sao Paulo -+ tz_names -+ 圣保罗 ++ ++ <strong>%1 codec</strong><br/><font color="Grey">by %2</font> ++ @label, %1 is product name, %2 is product vendor ++ + + -+ -+ Sao Tome -+ tz_names -+ 圣多美 ++ ++ <strong>%1 package</strong><br/><font color="Grey">by %2</font> ++ @label, %1 is product name, %2 is product vendor ++ + + -+ -+ Sarajevo -+ tz_names -+ 萨拉热窝 ++ ++ <strong>%1</strong><br/><font color="Grey">by %2</font> ++ @label, %1 is product name, %2 is product vendor ++ + + -+ -+ Saratov -+ tz_names -+ 萨拉托夫 ++ ++ File: %1 ++ @label ++ + + -+ -+ Scoresbysund -+ tz_names -+ 斯科斯比基金 ++ ++ Hide the license text ++ @tooltip ++ + + -+ -+ Seoul -+ tz_names -+ 首尔 ++ ++ Show the license text ++ @tooltip ++ + + -+ -+ Shanghai -+ tz_names -+ 上海 ++ ++ Open the license agreement in browser ++ @tooltip ++ + ++ ++ ++ LocalePage + -+ -+ Simferopol -+ tz_names -+ 辛菲罗波尔 ++ ++ Region: ++ @label ++ + + -+ -+ Singapore -+ tz_names -+ 新加坡 ++ ++ Zone: ++ @label ++ + + -+ -+ Sitka -+ tz_names -+ 锡特卡 ++ ++ ++ &Change… ++ @button ++ + ++ ++ ++ LocaleQmlViewStep + -+ -+ Skopje -+ tz_names -+ 斯科普里 ++ ++ Location ++ @label ++ + ++ ++ ++ LocaleTests + -+ -+ Sofia -+ tz_names -+ 索菲亚 ++ ++ Quit ++ + ++ ++ ++ LocaleViewStep + -+ -+ South Georgia -+ tz_names -+ 南乔治亚州 ++ ++ Location ++ @label ++ + ++ ++ ++ LuksBootKeyFileJob + -+ -+ Srednekolymsk -+ tz_names -+ 雅库特 ++ ++ Configuring LUKS key file. ++ + + -+ -+ St Barthelemy -+ tz_names -+ 圣巴泰勒米 ++ ++ ++ No partitions are defined. ++ + + -+ -+ St Helena -+ tz_names -+ 圣赫勒拿 ++ ++ ++ Encrypted rootfs setup error ++ + + -+ -+ St Johns -+ tz_names -+ 圣约翰 ++ ++ Root partition %1 is LUKS but no passphrase has been set. ++ + + -+ -+ St Kitts -+ tz_names -+ 圣基茨 ++ ++ Could not create LUKS key file for root partition %1. ++ + ++ ++ ++ MachineIdJob + -+ -+ St Lucia -+ tz_names -+ 圣卢西亚 ++ ++ Generate machine-id. ++ + + -+ -+ St Thomas -+ tz_names -+ 圣托马斯 ++ ++ Configuration Error ++ + + -+ -+ St Vincent -+ tz_names -+ 圣文森特 ++ ++ No root mount point is set for MachineId. ++ + + -+ -+ Stanley -+ tz_names -+ 斯坦利 ++ ++ ++ ++ ++ File not found ++ + + -+ -+ Stockholm -+ tz_names -+ 斯德哥尔摩 ++ ++ Path <pre>%1</pre> must be an absolute path. ++ + + -+ -+ Swift Current -+ tz_names -+ 斯威夫特卡伦特 ++ ++ Could not create new random file <pre>%1</pre>. ++ + ++ ++ ++ Map + -+ -+ Sydney -+ tz_names -+ 悉尼 ++ ++ Timezone: %1 ++ @label ++ + + -+ -+ Syowa -+ tz_names -+ 圣何塞 ++ ++ Please select your preferred location on the map so the installer can suggest the locale ++ and timezone settings for you. You can fine-tune the suggested settings below. Search the map by dragging ++ to move and using the +/- buttons to zoom in/out or use mouse scrolling for zooming. ++ @info ++ + ++ ++ ++ Map-qt6 + -+ -+ Tahiti -+ tz_names -+ 大溪地 ++ ++ Timezone: %1 ++ @label ++ + + -+ -+ Taipei(China) -+ tz_names -+ 台北(中国) ++ ++ Please select your preferred location on the map so the installer can suggest the locale ++ and timezone settings for you. You can fine-tune the suggested settings below. Search the map by dragging ++ to move and using the +/- buttons to zoom in/out or use mouse scrolling for zooming. ++ @label ++ + ++ ++ ++ NetInstallViewStep + -+ -+ Tallinn -+ tz_names -+ 塔林 ++ ++ Package selection ++ + + -+ -+ Tarawa -+ tz_names -+ 塔拉瓦 ++ ++ Office software ++ + + -+ -+ Tashkent -+ tz_names -+ 塔什干 ++ ++ Office package ++ + + -+ -+ Tbilisi -+ tz_names -+ 第比利斯 ++ ++ Browser software ++ + + -+ -+ Tegucigalpa -+ tz_names -+ 特古西加尔巴 ++ ++ Browser package ++ + + -+ -+ Tehran -+ tz_names -+ 德黑兰 ++ ++ Web browser ++ + + -+ -+ Thimphu -+ tz_names -+ 廷布 ++ ++ Kernel ++ label for netinstall module, Linux kernel ++ + + -+ -+ Thule -+ tz_names -+ 图勒 ++ ++ Services ++ label for netinstall module, system services ++ + + -+ -+ Thunder Bay -+ tz_names -+ 雷湾 ++ ++ Login ++ label for netinstall module, choose login manager ++ + + -+ -+ Tijuana -+ tz_names -+ 蒂华纳 ++ ++ Desktop ++ label for netinstall module, choose desktop environment ++ + + -+ -+ Tirane -+ tz_names -+ 地拉那 ++ ++ Applications ++ + + -+ -+ Tokyo -+ tz_names -+ 东京 ++ ++ Communication ++ label for netinstall module ++ + + -+ -+ Tomsk -+ tz_names -+ 托木斯克 ++ ++ Development ++ label for netinstall module ++ + + -+ -+ Tongatapu -+ tz_names -+ 汤加塔布 ++ ++ Office ++ label for netinstall module ++ + + -+ -+ Toronto -+ tz_names -+ 多伦多 ++ ++ Multimedia ++ label for netinstall module ++ + + -+ -+ Tortola -+ tz_names -+ 托托拉岛 ++ ++ Internet ++ label for netinstall module ++ + + -+ -+ Tripoli -+ tz_names -+ 的黎波里 ++ ++ Theming ++ label for netinstall module ++ + + -+ -+ Troll -+ tz_names -+ 特罗尔海坦 ++ ++ Gaming ++ label for netinstall module ++ + + -+ -+ Tunis -+ tz_names -+ 突尼斯 ++ ++ Utilities ++ label for netinstall module ++ + ++ ++ ++ NotesQmlViewStep + -+ -+ Ulaanbaatar -+ tz_names -+ 乌兰巴托 ++ ++ Notes ++ + ++ ++ ++ OEMPage + -+ -+ Ulyanovsk -+ tz_names -+ 乌里扬诺夫斯克 ++ ++ Ba&tch: ++ + + -+ -+ Urumqi -+ tz_names -+ 乌鲁木齐 ++ ++ <html><head/><body><p>Enter a batch-identifier here. This will be stored in the target system.</p></body></html> ++ + + -+ -+ Ust-Nera -+ tz_names -+ 乌斯季挪拉 ++ ++ <html><head/><body><h1>OEM Configuration</h1><p>Calamares will use OEM settings while configuring the target system.</p></body></html> ++ + ++ ++ ++ OEMViewStep + -+ -+ Uzhgorod -+ tz_names -+ 乌日哥罗德 ++ ++ OEM Configuration ++ + + -+ -+ Vaduz -+ tz_names -+ 瓦杜兹 ++ ++ Set the OEM Batch Identifier to <code>%1</code>. ++ + ++ ++ ++ Offline + -+ -+ Vancouver -+ tz_names -+ 温哥华 ++ ++ Select your preferred region, or use the default settings ++ @label ++ + + -+ -+ Vatican -+ tz_names -+ 梵蒂冈 ++ ++ ++ ++ Timezone: %1 ++ @label ++ + + -+ -+ Vienna -+ tz_names -+ 维也纳 ++ ++ Select your preferred zone within your region ++ @label ++ + + -+ -+ Vientiane -+ tz_names -+ 万象 ++ ++ Zones ++ @button ++ + + -+ -+ Vilnius -+ tz_names -+ 维尔纽斯 ++ ++ You can fine-tune language and locale settings below ++ @label ++ + ++ ++ ++ Offline-qt6 + -+ -+ Vladivostok -+ tz_names -+ 符拉迪沃斯托克 ++ ++ Select your preferred region, or use the default settings ++ @label ++ + + -+ -+ Volgograd -+ tz_names -+ 伏尔加格勒 ++ ++ ++ ++ Timezone: %1 ++ @label ++ + + -+ -+ Vostok -+ tz_names -+ 沃斯托克 ++ ++ Select your preferred zone within your region ++ @label ++ + + -+ -+ Wake -+ tz_names -+ 韦克 ++ ++ Zones ++ @button ++ + + -+ -+ Wallis -+ tz_names -+ 沃利斯 ++ ++ You can fine-tune language and locale settings below ++ @label ++ + ++ ++ ++ PWQ + -+ -+ Warsaw -+ tz_names -+ 华沙 ++ ++ Password is too short ++ + + -+ -+ Whitehorse -+ tz_names -+ 怀特霍斯 ++ ++ Password is too long ++ + + -+ -+ Windhoek -+ tz_names -+ 温得和克 ++ ++ Password is too weak ++ + + -+ -+ Winnipeg -+ tz_names -+ 温尼伯 ++ ++ Memory allocation error when setting '%1' ++ + + -+ -+ Yakutat -+ tz_names -+ 雅库特 ++ ++ Memory allocation error ++ + + -+ -+ Yakutsk -+ tz_names -+ 雅库茨克 ++ ++ The password is the same as the old one ++ + + -+ -+ Yangon -+ tz_names -+ 仰光 ++ ++ The password is a palindrome ++ + + -+ -+ Yekaterinburg -+ tz_names -+ 叶卡捷琳堡 ++ ++ The password differs with case changes only ++ + + -+ -+ Yellowknife -+ tz_names -+ 耶洛奈夫 ++ ++ The password is too similar to the old one ++ + + -+ -+ Yerevan -+ tz_names -+ 埃里温 ++ ++ The password contains the user name in some form ++ + + -+ -+ Zagreb -+ tz_names -+ 萨格勒布 ++ ++ The password contains words from the real name of the user in some form ++ + + -+ -+ Zaporozhye -+ tz_names -+ 扎波罗热 ++ ++ The password contains forbidden words in some form ++ + -+ -+ -+ Zurich -+ tz_names -+ 苏黎世 ++ ++ ++ The password contains fewer than %n digits ++ ++ ++ ++ + -+ -+ -diff --git a/lang/tz_zh_TW.ts b/lang/tz_zh_TW.ts -new file mode 100644 -index 0000000..2713d37 ---- /dev/null -+++ b/lang/tz_zh_TW.ts -@@ -0,0 +1,2626 @@ -+ -+ -+ -+ -+ -+ QObject + -+ -+ Africa -+ tz_regions -+ 非洲 ++ ++ The password contains too few digits ++ + -+ -+ -+ America -+ tz_regions -+ 美洲 ++ ++ ++ The password contains fewer than %n uppercase letters ++ ++ ++ ++ + + -+ -+ Antarctica -+ tz_regions -+ 南極洲 ++ ++ The password contains too few uppercase letters ++ + -+ -+ -+ Arctic -+ tz_regions -+ 北極 ++ ++ ++ The password contains fewer than %n lowercase letters ++ ++ ++ ++ + + -+ -+ Asia -+ tz_regions -+ 亞洲 ++ ++ The password contains too few lowercase letters ++ + -+ -+ -+ Atlantic -+ tz_regions -+ 大西洋 ++ ++ ++ The password contains fewer than %n non-alphanumeric characters ++ ++ ++ ++ + + -+ -+ Australia -+ tz_regions -+ 澳大利亞 ++ ++ The password contains too few non-alphanumeric characters ++ + -+ -+ -+ Europe -+ tz_regions -+ 歐洲 ++ ++ ++ The password is shorter than %n characters ++ ++ ++ ++ + + -+ -+ Indian -+ tz_regions -+ 印度 ++ ++ The password is too short ++ + + -+ -+ Pacific -+ tz_regions -+ 太平洋 ++ ++ The password is a rotated version of the previous one ++ + -+ -+ -+ Abidjan -+ tz_names -+ 阿必尚 ++ ++ ++ The password contains fewer than %n character classes ++ ++ ++ ++ + + -+ -+ Accra -+ tz_names -+ 阿克拉 ++ ++ The password does not contain enough character classes ++ + -+ -+ -+ Adak -+ tz_names -+ 阿達克 ++ ++ ++ The password contains more than %n same characters consecutively ++ ++ ++ ++ + + -+ -+ Addis Ababa -+ tz_names -+ 阿迪斯阿貝巴 ++ ++ The password contains too many same characters consecutively ++ + -+ -+ -+ Adelaide -+ tz_names -+ 阿德萊德 ++ ++ ++ The password contains more than %n characters of the same class consecutively ++ ++ ++ ++ + + -+ -+ Aden -+ tz_names -+ 亞丁 ++ ++ The password contains too many characters of the same class consecutively ++ + -+ -+ -+ Algiers -+ tz_names -+ 阿爾及爾 ++ ++ ++ The password contains monotonic sequence longer than %n characters ++ ++ ++ ++ + + -+ -+ Almaty -+ tz_names -+ 阿拉木圖 ++ ++ The password contains too long of a monotonic character sequence ++ + + -+ -+ Amman -+ tz_names -+ 安曼 ++ ++ No password supplied ++ + + -+ -+ Amsterdam -+ tz_names -+ 阿姆斯特丹 ++ ++ Cannot obtain random numbers from the RNG device ++ + + -+ -+ Anadyr -+ tz_names -+ 阿納迪爾 ++ ++ Password generation failed - required entropy too low for settings ++ + + -+ -+ Anchorage -+ tz_names -+ 安克雷奇 ++ ++ The password fails the dictionary check - %1 ++ + + -+ -+ Andorra -+ tz_names -+ 安道爾 ++ ++ The password fails the dictionary check ++ + + -+ -+ Anguilla -+ tz_names -+ 安圭拉 ++ ++ Unknown setting - %1 ++ + + -+ -+ Antananarivo -+ tz_names -+ 安塔那那利佛 ++ ++ Unknown setting ++ + + -+ -+ Antigua -+ tz_names -+ 安提瓜 ++ ++ Bad integer value of setting - %1 ++ + + -+ -+ Apia -+ tz_names -+ 亞庇 ++ ++ Bad integer value ++ + + -+ -+ Aqtau -+ tz_names -+ 阿克托 ++ ++ Setting %1 is not of integer type ++ + + -+ -+ Aqtobe -+ tz_names -+ 阿克托貝 ++ ++ Setting is not of integer type ++ + + -+ -+ Araguaina -+ tz_names -+ 阿拉瓜伊納 ++ ++ Setting %1 is not of string type ++ + + -+ -+ Argentina/Buenos Aires -+ tz_names -+ 阿根廷/布宜諾賽勒斯 ++ ++ Setting is not of string type ++ + + -+ -+ Argentina/Catamarca -+ tz_names -+ 阿根廷/卡塔馬卡 ++ ++ Opening the configuration file failed ++ + + -+ -+ Argentina/Cordoba -+ tz_names -+ 阿根廷/科爾多瓦 ++ ++ The configuration file is malformed ++ + + -+ -+ Argentina/Jujuy -+ tz_names -+ 阿根廷/胡胡伊 ++ ++ Fatal failure ++ + + -+ -+ Argentina/La Rioja -+ tz_names -+ 阿根廷/拉里奧哈 ++ ++ Unknown error ++ + ++ ++ ++ PackageChooserPage + -+ -+ Argentina/Mendoza -+ tz_names -+ 阿根廷/門多薩 ++ ++ Product Name ++ + + -+ -+ Argentina/Rio Gallegos -+ tz_names -+ 阿根廷/裏奧加列戈斯 ++ ++ TextLabel ++ + + -+ -+ Argentina/Salta -+ tz_names -+ 阿根廷/薩爾塔 ++ ++ Long Product Description ++ + + -+ -+ Argentina/San Juan -+ tz_names -+ 阿根廷/聖胡安 ++ ++ Package Selection ++ + + -+ -+ Argentina/San Luis -+ tz_names -+ 阿根廷/聖路易斯 ++ ++ Please pick a product from the list. The selected product will be installed. ++ + ++ ++ ++ PackageModel + -+ -+ Argentina/Tucuman -+ tz_names -+ 阿根廷/圖庫曼 ++ ++ Name ++ + + -+ -+ Argentina/Ushuaia -+ tz_names -+ 阿根廷/烏斯懷亞 ++ ++ Description ++ + ++ ++ ++ Page_Keyboard + -+ -+ Aruba -+ tz_names -+ 阿魯巴 ++ ++ Keyboard model: ++ + + -+ -+ Ashgabat -+ tz_names -+ 阿什哈巴德 ++ ++ Type here to test your keyboard ++ + + -+ -+ Asmara -+ tz_names -+ 阿斯馬拉 ++ ++ Switch Keyboard: ++ shortcut for switching between keyboard layouts ++ + ++ ++ ++ Page_UserSetup + -+ -+ Astrakhan -+ tz_names -+ 阿斯特拉罕 ++ ++ What is your name? ++ + + -+ -+ Asuncion -+ tz_names -+ 亞松森 ++ ++ Your Full Name ++ + + -+ -+ Athens -+ tz_names -+ 雅典 ++ ++ What name do you want to use to log in? ++ + + -+ -+ Atikokan -+ tz_names -+ 阿提科坎 ++ ++ login ++ + + -+ -+ Atyrau -+ tz_names -+ 阿特勞 ++ ++ What is the name of this computer? ++ + + -+ -+ Auckland -+ tz_names -+ 奧克蘭 ++ ++ <small>This name will be used if you make the computer visible to others on a network.</small> ++ + + -+ -+ Azores -+ tz_names -+ 亞速爾群島 ++ ++ Computer Name ++ + + -+ -+ Baghdad -+ tz_names -+ 巴格達 ++ ++ Choose a password to keep your account safe. ++ + + -+ -+ Bahia -+ tz_names -+ 巴伊亞 ++ ++ ++ <small>Enter the same password twice, so that it can be checked for typing errors. A good password will contain a mixture of letters, numbers and punctuation, should be at least eight characters long, and should be changed at regular intervals.</small> ++ + + -+ -+ Bahia Banderas -+ tz_names -+ 巴伊亞·班德拉斯 ++ ++ ++ Password ++ + + -+ -+ Bahrain -+ tz_names -+ 巴林 ++ ++ ++ Repeat Password ++ + + -+ -+ Baku -+ tz_names -+ 巴庫 ++ ++ When this box is checked, password-strength checking is done and you will not be able to use a weak password. ++ + + -+ -+ Bamako -+ tz_names -+ 巴馬科 ++ ++ Require strong passwords. ++ + + -+ -+ Bangkok -+ tz_names -+ 曼谷 ++ ++ Log in automatically without asking for the password. ++ + + -+ -+ Bangui -+ tz_names -+ 班基 ++ ++ Use the same password for the administrator account. ++ + + -+ -+ Banjul -+ tz_names -+ 班竹 ++ ++ Choose a password for the administrator account. ++ + + -+ -+ Barbados -+ tz_names -+ 巴巴多斯 ++ ++ ++ <small>Enter the same password twice, so that it can be checked for typing errors.</small> ++ + + -+ -+ Barnaul -+ tz_names -+ 巴爾瑙爾 ++ ++ Use Active Directory ++ + + -+ -+ Beirut -+ tz_names -+ 貝魯特 ++ ++ Domain: ++ + + -+ -+ Belem -+ tz_names -+ 貝倫 ++ ++ Domain Administrator: ++ + + -+ -+ Belgrade -+ tz_names -+ 貝爾格勒 ++ ++ Password: ++ + + -+ -+ Belize -+ tz_names -+ 貝裡斯 ++ ++ IP Address (optional): ++ + ++ ++ ++ PartitionLabelsView + -+ -+ Berlin -+ tz_names -+ 柏林 ++ ++ Root ++ + + -+ -+ Bermuda -+ tz_names -+ 百慕大 ++ ++ Home ++ @label ++ + + -+ -+ Bishkek -+ tz_names -+ 比什凱克 ++ ++ Boot ++ @label ++ + + -+ -+ Bissau -+ tz_names -+ 比索 ++ ++ EFI system ++ @label ++ + + -+ -+ Beijing -+ tz_names -+ 北京 -+ -+ -+ -+ Blanc-Sablon -+ tz_names -+ 布蘭克·薩布隆 ++ ++ Swap ++ @label ++ + + -+ -+ Blantyre -+ tz_names -+ 布蘭太爾 ++ ++ New partition for %1 ++ @label ++ + + -+ -+ Boa Vista -+ tz_names -+ 博阿維斯塔 ++ ++ New partition ++ @label ++ + + -+ -+ Bogota -+ tz_names -+ 波哥大 ++ ++ %1 %2 ++ size[number] filesystem[name] ++ + ++ ++ ++ PartitionModel + -+ -+ Boise -+ tz_names -+ 博伊西 ++ ++ ++ Free Space ++ @title ++ + + -+ -+ Bougainville -+ tz_names -+ 布幹維爾 ++ ++ ++ New Partition ++ @title ++ + + -+ -+ Bratislava -+ tz_names -+ 布拉提斯拉瓦 ++ ++ Name ++ @title ++ + + -+ -+ Brazzaville -+ tz_names -+ 布拉柴維爾 ++ ++ File System ++ @title ++ + + -+ -+ Brisbane -+ tz_names -+ 布里斯班 ++ ++ File System Label ++ @title ++ + + -+ -+ Broken Hill -+ tz_names -+ 布羅肯希爾 ++ ++ Mount Point ++ @title ++ + + -+ -+ Brunei -+ tz_names -+ 汶萊 ++ ++ Size ++ @title ++ + ++ ++ ++ PartitionPage + -+ -+ Brussels -+ tz_names -+ 布魯塞爾 ++ ++ Storage de&vice: ++ + + -+ -+ Bucharest -+ tz_names -+ 布加勒斯特 ++ ++ &Revert All Changes ++ + + -+ -+ Budapest -+ tz_names -+ 布達佩斯 ++ ++ New Partition &Table ++ + + -+ -+ Bujumbura -+ tz_names -+ 布松布拉 ++ ++ Cre&ate ++ + + -+ -+ Busingen -+ tz_names -+ 匯流排 ++ ++ &Edit ++ + + -+ -+ Cairo -+ tz_names -+ 開羅 ++ ++ &Delete ++ + + -+ -+ Cambridge Bay -+ tz_names -+ 劍橋灣 ++ ++ New Volume Group ++ + + -+ -+ Campo Grande -+ tz_names -+ 坎波格蘭德 ++ ++ Resize Volume Group ++ + + -+ -+ Canary -+ tz_names -+ 加那利群島 ++ ++ Deactivate Volume Group ++ + + -+ -+ Cancun -+ tz_names -+ 坎昆 ++ ++ Remove Volume Group ++ + + -+ -+ Cape Verde -+ tz_names -+ 佛得角 ++ ++ I&nstall boot loader on: ++ + + -+ -+ Caracas -+ tz_names -+ 卡拉卡斯 ++ ++ Are you sure you want to create a new partition table on %1? ++ + + -+ -+ Casablanca -+ tz_names -+ 卡薩布蘭卡 ++ ++ Can not create new partition ++ + + -+ -+ Casey -+ tz_names -+ 凱西 ++ ++ The partition table on %1 already has %2 primary partitions, and no more can be added. Please remove one primary partition and add an extended partition, instead. ++ + ++ ++ ++ PartitionViewStep + -+ -+ Cayenne -+ tz_names -+ 卡宴 ++ ++ Gathering system information… ++ @status ++ + + -+ -+ Cayman -+ tz_names -+ 開曼群島 ++ ++ Partitions ++ @label ++ + + -+ -+ Ceuta -+ tz_names -+ 休達 ++ ++ Install %1 <strong>alongside</strong> another operating system ++ @label ++ + + -+ -+ Chagos -+ tz_names -+ 查戈斯 ++ ++ <strong>Erase</strong> disk and install %1 ++ @label ++ + + -+ -+ Chatham -+ tz_names -+ 查塔姆 ++ ++ <strong>Replace</strong> a partition with %1 ++ @label ++ + + -+ -+ Chicago -+ tz_names -+ 芝加哥 ++ ++ <strong>Manual</strong> partitioning ++ @label ++ + + -+ -+ Chihuahua -+ tz_names -+ 吉娃娃 ++ ++ Install %1 <strong>alongside</strong> another operating system on disk <strong>%2</strong> (%3) ++ @info ++ + + -+ -+ Chisinau -+ tz_names -+ 基希訥烏 ++ ++ <strong>Erase</strong> disk <strong>%2</strong> (%3) and install %1 ++ @info ++ + + -+ -+ Chita -+ tz_names -+ 赤塔 ++ ++ <strong>Replace</strong> a partition on disk <strong>%2</strong> (%3) with %1 ++ @info ++ + + -+ -+ Choibalsan -+ tz_names -+ 喬巴桑 ++ ++ <strong>Manual</strong> partitioning on disk <strong>%1</strong> (%2) ++ @info ++ + + -+ -+ Christmas -+ tz_names -+ 耶誕節 ++ ++ Disk <strong>%1</strong> (%2) ++ @info ++ + + -+ -+ Chuuk -+ tz_names -+ 楚克 ++ ++ Unsafe partition actions are enabled. ++ + + -+ -+ Cocos -+ tz_names -+ 科科斯 ++ ++ Partitioning is configured to <b>always</b> fail. ++ + + -+ -+ Colombo -+ tz_names -+ 可倫坡 ++ ++ No partitions will be changed. ++ + + -+ -+ Comoro -+ tz_names -+ 科摩羅 ++ ++ Current: ++ @label ++ + + -+ -+ Conakry -+ tz_names -+ 柯那克里 ++ ++ After: ++ @label ++ + + -+ -+ Copenhagen -+ tz_names -+ 哥本哈根 ++ ++ An EFI system partition is necessary to start %1.<br/><br/>To configure an EFI system partition, go back and select or create a suitable filesystem. ++ + + -+ -+ Costa Rica -+ tz_names -+ 哥斯大黎加 ++ ++ An EFI system partition is necessary to start %1.<br/><br/>The EFI system partition does not meet recommendations. It is recommended to go back and select or create a suitable filesystem. ++ + + -+ -+ Creston -+ tz_names -+ 克雷斯頓 ++ ++ The filesystem must be mounted on <strong>%1</strong>. ++ + + -+ -+ Cuiaba -+ tz_names -+ 庫亞巴 ++ ++ The filesystem must have type FAT32. ++ + + -+ -+ Curacao -+ tz_names -+ 庫拉索 ++ ++ The filesystem must have flag <strong>%1</strong> set. ++ + + -+ -+ Currie -+ tz_names -+ 柯裡 ++ ++ ++ The filesystem must be at least %1 MiB in size. ++ + + -+ -+ Dakar -+ tz_names -+ 達喀爾 ++ ++ The minimum recommended size for the filesystem is %1 MiB. ++ + + -+ -+ Damascus -+ tz_names -+ 大馬士革 ++ ++ You can continue without setting up an EFI system partition but your system may fail to start. ++ + + -+ -+ Danmarkshavn -+ tz_names -+ 丹麥 ++ ++ You can continue with this EFI system partition configuration but your system may fail to start. ++ + + -+ -+ Dar es Salaam -+ tz_names -+ 沙蘭港 ++ ++ No EFI system partition configured ++ + + -+ -+ Darwin -+ tz_names -+ 達爾文 ++ ++ EFI system partition configured incorrectly ++ + + -+ -+ Davis -+ tz_names -+ 大衛斯 ++ ++ EFI system partition recommendation ++ + + -+ -+ Dawson -+ tz_names -+ 道森 ++ ++ Option to use GPT on BIOS ++ + + -+ -+ Dawson Creek -+ tz_names -+ 道森溪 ++ ++ A GPT partition table is the best option for all systems. This installer supports such a setup for BIOS systems too.<br/><br/>To configure a GPT partition table on BIOS, (if not done so already) go back and set the partition table to GPT, next create a 8 MB unformatted partition with the <strong>%2</strong> flag enabled.<br/><br/>An unformatted 8 MB partition is necessary to start %1 on a BIOS system with GPT. ++ + + -+ -+ Denver -+ tz_names -+ 丹佛 ++ ++ Boot partition not encrypted ++ + + -+ -+ Detroit -+ tz_names -+ 底特律 ++ ++ A separate boot partition was set up together with an encrypted root partition, but the boot partition is not encrypted.<br/><br/>There are security concerns with this kind of setup, because important system files are kept on an unencrypted partition.<br/>You may continue if you wish, but filesystem unlocking will happen later during system startup.<br/>To encrypt the boot partition, go back and recreate it, selecting <strong>Encrypt</strong> in the partition creation window. ++ + + -+ -+ Dhaka -+ tz_names -+ 達卡 ++ ++ has at least one disk device available. ++ + + -+ -+ Dili -+ tz_names -+ 帝利 ++ ++ There are no partitions to install on. ++ + ++ ++ ++ PlasmaLnfJob + -+ -+ Djibouti -+ tz_names -+ 吉佈提 ++ ++ Applying Plasma Look-and-Feel… ++ @status ++ + + -+ -+ Dominica -+ tz_names -+ 多明尼克 ++ ++ ++ Could not select KDE Plasma Look-and-Feel package ++ + ++ ++ ++ PlasmaLnfPage + -+ -+ Douala -+ tz_names -+ 杜阿拉 ++ ++ Please choose a look-and-feel for the KDE Plasma Desktop. You can also skip this step and configure the look-and-feel once the system is set up. Clicking on a look-and-feel selection will give you a live preview of that look-and-feel. ++ + + -+ -+ Dubai -+ tz_names -+ 迪拜 ++ ++ Please choose a look-and-feel for the KDE Plasma Desktop. You can also skip this step and configure the look-and-feel once the system is installed. Clicking on a look-and-feel selection will give you a live preview of that look-and-feel. ++ + ++ ++ ++ PlasmaLnfViewStep + -+ -+ Dublin -+ tz_names -+ 都柏林 ++ ++ Look-and-Feel ++ @label ++ + ++ ++ ++ PowerManagementInterface + -+ -+ DumontDUrville -+ tz_names -+ 杜蒙·杜維爾 ++ ++ Calamares ++ + + -+ -+ Dushanbe -+ tz_names -+ 杜桑貝 ++ ++ Installation in progress ++ @status ++ + ++ ++ ++ PreserveFiles + -+ -+ Easter -+ tz_names -+ 復活節 ++ ++ Saving files for later… ++ @status ++ + + -+ -+ Edmonton -+ tz_names -+ 埃德蒙頓 ++ ++ No files configured to save for later. ++ + + -+ -+ Efate -+ tz_names -+ 埃法特島 ++ ++ Not all of the configured files could be preserved. ++ + ++ ++ ++ ProcessResult + -+ -+ Eirunepe -+ tz_names -+ 埃魯內佩 ++ ++ ++There was no output from the command. ++ + + -+ -+ El Aaiun -+ tz_names -+ 阿尤恩 ++ ++ ++Output: ++ ++ + + -+ -+ El Salvador -+ tz_names -+ 薩爾瓦多 ++ ++ External command crashed. ++ + + -+ -+ Enderbury -+ tz_names -+ 恩德伯裡 ++ ++ Command <i>%1</i> crashed. ++ + + -+ -+ Eucla -+ tz_names -+ 尤克拉 ++ ++ External command failed to start. ++ + + -+ -+ Fakaofo -+ tz_names -+ 法攷福 ++ ++ Command <i>%1</i> failed to start. ++ + + -+ -+ Famagusta -+ tz_names -+ 法馬古斯塔 ++ ++ Internal error when starting command. ++ + + -+ -+ Faroe -+ tz_names -+ 法羅 ++ ++ Bad parameters for process job call. ++ + + -+ -+ Fiji -+ tz_names -+ 斐濟 ++ ++ External command failed to finish. ++ + + -+ -+ Fort Nelson -+ tz_names -+ 納爾遜堡 ++ ++ Command <i>%1</i> failed to finish in %2 seconds. ++ + + -+ -+ Fortaleza -+ tz_names -+ 福塔雷薩 ++ ++ External command finished with errors. ++ + + -+ -+ Freetown -+ tz_names -+ 弗裏敦 ++ ++ Command <i>%1</i> finished with exit code %2. ++ + ++ ++ ++ QObject + -+ -+ Funafuti -+ tz_names -+ 福納佛提 ++ ++ %1 (%2) ++ + + -+ -+ Gaborone -+ tz_names -+ 嘉柏隆里 ++ ++ unknown ++ @partition info ++ + + -+ -+ Galapagos -+ tz_names -+ 加拉帕戈斯群島 ++ ++ extended ++ @partition info ++ + + -+ -+ Gambier -+ tz_names -+ 甘比爾 ++ ++ unformatted ++ @partition info ++ + + -+ -+ Gaza -+ tz_names -+ 加沙 ++ ++ swap ++ @partition info ++ + + -+ -+ Gibraltar -+ tz_names -+ 直布羅陀 ++ ++ ++ Default ++ + + -+ -+ Glace Bay -+ tz_names -+ 格萊斯灣 ++ ++ Directory not found ++ + + -+ -+ Godthab -+ tz_names -+ 戈德薩布 ++ ++ Could not create new random file <pre>%1</pre>. ++ + + -+ -+ Goose Bay -+ tz_names -+ 鹅灣 ++ ++ No product ++ + + -+ -+ Grand Turk -+ tz_names -+ 大特克 ++ ++ No description provided. ++ + + -+ -+ Grenada -+ tz_names -+ 格林伍德 ++ ++ (no mount point) ++ + + -+ -+ Guadalcanal -+ tz_names -+ 瓜達爾卡納爾島 ++ ++ Unpartitioned space or unknown partition table ++ @info ++ + ++ ++ ++ Recommended + -+ -+ Guadeloupe -+ tz_names -+ 瓜德羅普島 ++ ++ <p>This computer does not satisfy some of the recommended requirements for setting up %1.<br/> ++ Setup can continue, but some features might be disabled.</p> ++ + ++ ++ ++ RemoveUserJob + -+ -+ Guam -+ tz_names -+ 關島 ++ ++ Removing live user from the target system… ++ @status ++ + ++ ++ ++ RemoveVolumeGroupJob + -+ -+ Guatemala -+ tz_names -+ 瓜地馬拉 ++ ++ ++ Removing Volume Group named %1… ++ @status ++ + + -+ -+ Guayaquil -+ tz_names -+ 瓜亞基爾 ++ ++ Removing Volume Group named <strong>%1</strong>… ++ @status ++ + + -+ -+ Guernsey -+ tz_names -+ 根西島 ++ ++ The installer failed to remove a volume group named '%1'. ++ + ++ ++ ++ Requirements + -+ -+ Guyana -+ tz_names -+ 蓋亞那 ++ ++ <p>This computer does not satisfy the minimum requirements for installing %1.<br/> ++ Installation cannot continue.</p> ++ + + -+ -+ Halifax -+ tz_names -+ 哈利法克斯 ++ ++ <p>This computer does not satisfy some of the recommended requirements for setting up %1.<br/> ++ Setup can continue, but some features might be disabled.</p> ++ + ++ ++ ++ ResizeFSJob + -+ -+ Harare -+ tz_names -+ 哈拉雷 ++ ++ Performing file system resize… ++ @status ++ + + -+ -+ Havana -+ tz_names -+ 哈瓦那 ++ ++ Invalid configuration ++ @error ++ + + -+ -+ Hebron -+ tz_names -+ 希伯倫 ++ ++ The file-system resize job has an invalid configuration and will not run. ++ @error ++ + + -+ -+ Helsinki -+ tz_names -+ 赫爾辛基 ++ ++ KPMCore not available ++ @error ++ + + -+ -+ Hermosillo -+ tz_names -+ 埃莫西洛 ++ ++ Calamares cannot start KPMCore for the file system resize job. ++ @error ++ + + -+ -+ Ho Chi Minh -+ tz_names -+ 胡志明 ++ ++ Resize failed. ++ @error ++ + + -+ -+ Hobart -+ tz_names -+ 霍巴特 ++ ++ The filesystem %1 could not be found in this system, and cannot be resized. ++ @info ++ + + -+ -+ Hong Kong(China) -+ tz_names -+ 香港(中国) ++ ++ The device %1 could not be found in this system, and cannot be resized. ++ @info ++ + + -+ -+ Honolulu -+ tz_names -+ 檀香山 ++ ++ ++ ++ ++ Resize Failed ++ @error ++ + + -+ -+ Hovd -+ tz_names -+ 科布多 ++ ++ ++ The filesystem %1 cannot be resized. ++ @error ++ + + -+ -+ Indiana/Indianapolis -+ tz_names -+ 印第安那州/印弟安納波里斯 ++ ++ ++ The device %1 cannot be resized. ++ @error ++ + + -+ -+ Indiana/Knox -+ tz_names -+ 印第安那州/諾克斯 ++ ++ The file system %1 must be resized, but cannot. ++ @info ++ + + -+ -+ Indiana/Marengo -+ tz_names -+ 印度/馬倫戈 ++ ++ The device %1 must be resized, but cannot ++ @info ++ + ++ ++ ++ ResizePartitionJob + -+ -+ Indiana/Petersburg -+ tz_names -+ 印第安那州/彼得堡 ++ ++ Resize partition %1 ++ @title ++ + + -+ -+ Indiana/Tell City -+ tz_names -+ 印第安那州/泰爾城 ++ ++ Resize <strong>%2MiB</strong> partition <strong>%1</strong> to <strong>%3MiB</strong> ++ @info ++ + + -+ -+ Indiana/Vevay -+ tz_names -+ 印度/沃韋 ++ ++ Resizing %2MiB partition %1 to %3MiB… ++ @status ++ + + -+ -+ Indiana/Vincennes -+ tz_names -+ 印第安那州/文森斯 ++ ++ The installer failed to resize partition %1 on disk '%2'. ++ + ++ ++ ++ ResizeVolumeGroupDialog + -+ -+ Indiana/Winamac -+ tz_names -+ 印第安那州/威納馬克 ++ ++ Resize Volume Group ++ @title ++ + ++ ++ ++ ResizeVolumeGroupJob + -+ -+ Inuvik -+ tz_names -+ 伊努維克 ++ ++ Resize volume group named %1 from %2 to %3 ++ @title ++ + + -+ -+ Iqaluit -+ tz_names -+ 伊魁特 ++ ++ Resize volume group named <strong>%1</strong> from <strong>%2</strong> to <strong>%3</strong> ++ @info ++ + + -+ -+ Irkutsk -+ tz_names -+ 伊爾庫茨克 ++ ++ Resizing volume group named %1 from %2 to %3… ++ @status ++ + + -+ -+ Isle of Man -+ tz_names -+ 曼島 ++ ++ The installer failed to resize a volume group named '%1'. ++ + ++ ++ ++ ResultsListWidget + -+ -+ Istanbul -+ tz_names -+ 蓋章 ++ ++ Checking requirements again in a few seconds ... ++ + ++ ++ ++ ScanningDialog + -+ -+ Jakarta -+ tz_names -+ 雅加達 ++ ++ Scanning storage devices… ++ @status ++ + + -+ -+ Jamaica -+ tz_names -+ 牙買加 ++ ++ Partitioning… ++ @status ++ + ++ ++ ++ SetHostNameJob + -+ -+ Jayapura -+ tz_names -+ 查亞普拉 ++ ++ Set hostname %1 ++ + + -+ -+ Jersey -+ tz_names -+ 澤西島 ++ ++ Set hostname <strong>%1</strong>. ++ + + -+ -+ Jerusalem -+ tz_names -+ 耶路撒冷 ++ ++ Setting hostname %1… ++ @status ++ + + -+ -+ Johannesburg -+ tz_names -+ 約翰尼斯堡 ++ ++ ++ Internal Error ++ + + -+ -+ Juba -+ tz_names -+ 朱巴 ++ ++ ++ Cannot write hostname to target system ++ + ++ ++ ++ SetKeyboardLayoutJob + -+ -+ Juneau -+ tz_names -+ 朱諾 ++ ++ Setting keyboard model to %1, layout as %2-%3… ++ @status, %1 model, %2 layout, %3 variant ++ + + -+ -+ Kabul -+ tz_names -+ 喀布爾 ++ ++ Failed to write keyboard configuration for the virtual console. ++ @error ++ + + -+ -+ Kaliningrad -+ tz_names -+ 加里寧格勒 ++ ++ Failed to write to %1 ++ @error, %1 is virtual console configuration path ++ + + -+ -+ Kamchatka -+ tz_names -+ 堪察加半島 ++ ++ Failed to write keyboard configuration for X11. ++ @error ++ + + -+ -+ Kampala -+ tz_names -+ 坎帕拉 ++ ++ Failed to write to %1 ++ @error, %1 is keyboard configuration path ++ + + -+ -+ Karachi -+ tz_names -+ 卡拉奇 ++ ++ Failed to write keyboard configuration to existing /etc/default directory. ++ @error ++ + + -+ -+ Kathmandu -+ tz_names -+ 加德滿都 ++ ++ Failed to write to %1 ++ @error, %1 is default keyboard path ++ + ++ ++ ++ SetPartFlagsJob + -+ -+ Kentucky/Louisville -+ tz_names -+ 肯塔基州/路易斯維爾 ++ ++ Set flags on partition %1 ++ @title ++ + + -+ -+ Kentucky/Monticello -+ tz_names -+ 肯塔基州/蒙蒂塞洛 ++ ++ Set flags on %1MiB %2 partition ++ @title ++ + + -+ -+ Kerguelen -+ tz_names -+ 凱爾蓋朗 ++ ++ Set flags on new partition ++ @title ++ + + -+ -+ Khandyga -+ tz_names -+ 坎代加 ++ ++ Clear flags on partition <strong>%1</strong> ++ @info ++ + + -+ -+ Khartoum -+ tz_names -+ 喀土穆 ++ ++ Clear flags on %1MiB <strong>%2</strong> partition ++ @info ++ + + -+ -+ Kiev -+ tz_names -+ 基輔 ++ ++ Clear flags on new partition ++ @info ++ + + -+ -+ Kigali -+ tz_names -+ 吉佳利 ++ ++ Set flags on partition <strong>%1</strong> to <strong>%2</strong> ++ @info ++ + + -+ -+ Kinshasa -+ tz_names -+ 金夏沙 ++ ++ Set flags on %1MiB <strong>%2</strong> partition to <strong>%3</strong> ++ @info ++ + + -+ -+ Kiritimati -+ tz_names -+ 基裏蒂馬提斯 ++ ++ Set flags on new partition to <strong>%1</strong> ++ @info ++ + + -+ -+ Kirov -+ tz_names -+ 基洛夫 ++ ++ Clearing flags on partition <strong>%1</strong>… ++ @status ++ + + -+ -+ Kolkata -+ tz_names -+ 加爾格達 ++ ++ Clearing flags on %1MiB <strong>%2</strong> partition… ++ @status ++ + + -+ -+ Kosrae -+ tz_names -+ 科斯雷 ++ ++ Clearing flags on new partition… ++ @status ++ + + -+ -+ Kralendijk -+ tz_names -+ 克羅地亞 ++ ++ Setting flags <strong>%2</strong> on partition <strong>%1</strong>… ++ @status ++ + + -+ -+ Krasnoyarsk -+ tz_names -+ 克拉斯諾亞爾斯克 ++ ++ Setting flags <strong>%3</strong> on %1MiB <strong>%2</strong> partition… ++ @status ++ + + -+ -+ Kuala Lumpur -+ tz_names -+ 吉隆玻 ++ ++ Setting flags <strong>%1</strong> on new partition… ++ @status ++ + + -+ -+ Kuching -+ tz_names -+ 古晋 ++ ++ The installer failed to set flags on partition %1. ++ + ++ ++ ++ SetPasswordJob + -+ -+ Kuwait -+ tz_names -+ 科威特 ++ ++ Set password for user %1 ++ + + -+ -+ Kwajalein -+ tz_names -+ 誇賈林 ++ ++ Setting password for user %1… ++ @status ++ + + -+ -+ La Paz -+ tz_names -+ 拉巴斯 ++ ++ Bad destination system path. ++ + + -+ -+ Lagos -+ tz_names -+ 拉各斯 ++ ++ rootMountPoint is %1 ++ + + -+ -+ Libreville -+ tz_names -+ 利伯維爾 ++ ++ Cannot disable root account. ++ + + -+ -+ Lima -+ tz_names -+ 利馬 ++ ++ ++ usermod terminated with error code %1. ++ + + -+ -+ Lindeman -+ tz_names -+ 林德曼 ++ ++ Cannot set password for user %1. ++ + ++ ++ ++ SetTimezoneJob + -+ -+ Lisbon -+ tz_names -+ 里斯本 ++ ++ Setting timezone to %1/%2… ++ @status ++ + + -+ -+ Ljubljana -+ tz_names -+ 盧布亞納 ++ ++ Cannot access selected timezone path. ++ @error ++ + + -+ -+ Lome -+ tz_names -+ 多哥 ++ ++ Bad path: %1 ++ @error ++ + + -+ -+ London -+ tz_names -+ 倫敦 ++ ++ ++ Cannot set timezone. ++ @error ++ + + -+ -+ Longyearbyen -+ tz_names -+ 龍宜爾比恩 ++ ++ Link creation failed, target: %1; link name: %2 ++ @info ++ + + -+ -+ Lord Howe -+ tz_names -+ 豪勳爵 ++ ++ Cannot open /etc/timezone for writing ++ @info ++ + ++ ++ ++ SetupGroupsJob + -+ -+ Los Angeles -+ tz_names -+ 洛杉磯 ++ ++ Preparing groups… ++ @status ++ + + -+ -+ Lower Princes -+ tz_names -+ 聖馬丁 ++ ++ ++ Could not create groups in target system ++ + + -+ -+ Luanda -+ tz_names -+ 魯安達 ++ ++ These groups are missing in the target system: %1 ++ + ++ ++ ++ SetupSudoJob + -+ -+ Lubumbashi -+ tz_names -+ 盧本巴希 ++ ++ Configuring <pre>sudo</pre> users… ++ @status ++ + + -+ -+ Lusaka -+ tz_names -+ 路沙卡 ++ ++ Cannot chmod sudoers file. ++ + + -+ -+ Luxembourg -+ tz_names -+ 盧森堡 ++ ++ Cannot create sudoers file for writing. ++ + ++ ++ ++ ShellProcessJob + -+ -+ Macau -+ tz_names -+ 澳門(中国) ++ ++ Running shell processes… ++ @status ++ + ++ ++ ++ SlideCounter + -+ -+ Maceio -+ tz_names -+ 馬塞奧 ++ ++ ++ %L1 / %L2 ++ slide counter, %1 of %2 (numeric) ++ + ++ ++ ++ StandardButtons + -+ -+ Macquarie -+ tz_names -+ 麥格理 ++ ++ &OK ++ + + -+ -+ Madeira -+ tz_names -+ 馬德拉 ++ ++ &Yes ++ + + -+ -+ Madrid -+ tz_names -+ 馬德里 ++ ++ &No ++ + + -+ -+ Magadan -+ tz_names -+ 馬加丹 ++ ++ &Cancel ++ + + -+ -+ Mahe -+ tz_names -+ 馬埃 ++ ++ &Close ++ + ++ ++ ++ TrackingInstallJob + -+ -+ Majuro -+ tz_names -+ 麥哲魯 ++ ++ Installation feedback ++ + + -+ -+ Makassar -+ tz_names -+ 望加錫 ++ ++ Sending installation feedback… ++ @status ++ + + -+ -+ Malabo -+ tz_names -+ 馬拉博 ++ ++ Internal error in install-tracking. ++ + + -+ -+ Maldives -+ tz_names -+ 瑪律地夫 ++ ++ HTTP request timed out. ++ + ++ ++ ++ TrackingKUserFeedbackJob + -+ -+ Malta -+ tz_names -+ 馬爾他 ++ ++ KDE user feedback ++ + + -+ -+ Managua -+ tz_names -+ 馬納瓜 ++ ++ Configuring KDE user feedback… ++ @status ++ + + -+ -+ Manaus -+ tz_names -+ 馬瑙斯 ++ ++ ++ Error in KDE user feedback configuration. ++ + + -+ -+ Manila -+ tz_names -+ 馬尼拉 ++ ++ Could not configure KDE user feedback correctly, script error %1. ++ + + -+ -+ Maputo -+ tz_names -+ 馬布多 ++ ++ Could not configure KDE user feedback correctly, Calamares error %1. ++ + ++ ++ ++ TrackingMachineUpdateManagerJob + -+ -+ Mariehamn -+ tz_names -+ 瑪麗港 ++ ++ Machine feedback ++ + + -+ -+ Marigot -+ tz_names -+ 馬裏戈 ++ ++ Configuring machine feedback… ++ @status ++ + + -+ -+ Marquesas -+ tz_names -+ 馬克薩斯 ++ ++ ++ Error in machine feedback configuration. ++ + + -+ -+ Martinique -+ tz_names -+ 馬提尼克島 ++ ++ Could not configure machine feedback correctly, script error %1. ++ + + -+ -+ Maseru -+ tz_names -+ 馬塞魯 ++ ++ Could not configure machine feedback correctly, Calamares error %1. ++ + ++ ++ ++ TrackingPage + -+ -+ Matamoros -+ tz_names -+ 馬塔莫羅斯 ++ ++ Placeholder ++ + + -+ -+ Mauritius -+ tz_names -+ 模裡西斯 ++ ++ <html><head/><body><p>Click here to send <span style=" font-weight:600;">no information at all</span> about your installation.</p></body></html> ++ + + -+ -+ Mawson -+ tz_names -+ 莫森 ++ ++ <html><head/><body><p><a href="placeholder"><span style=" text-decoration: underline; color:#2980b9;">Click here for more information about user feedback</span></a></p></body></html> ++ + + -+ -+ Mayotte -+ tz_names -+ 馬約特島 ++ ++ Tracking helps %1 to see how often it is installed, what hardware it is installed on and which applications are used. To see what will be sent, please click the help icon next to each area. ++ + + -+ -+ Mazatlan -+ tz_names -+ 馬薩特蘭 ++ ++ By selecting this you will send information about your installation and hardware. This information will only be sent <b>once</b> after the installation finishes. ++ + + -+ -+ Mbabane -+ tz_names -+ 姆巴班 ++ ++ By selecting this you will periodically send information about your <b>machine</b> installation, hardware and applications, to %1. ++ + + -+ -+ McMurdo -+ tz_names -+ 麥克默多 ++ ++ By selecting this you will regularly send information about your <b>user</b> installation, hardware, applications and application usage patterns, to %1. ++ + ++ ++ ++ TrackingViewStep + -+ -+ Melbourne -+ tz_names -+ 墨爾本 ++ ++ Feedback ++ @title ++ + ++ ++ ++ UmountJob + -+ -+ Menominee -+ tz_names -+ 梅諾米尼 ++ ++ Unmounting file systems… ++ @status ++ + + -+ -+ Merida -+ tz_names -+ 梅里達 ++ ++ No target system available. ++ + + -+ -+ Metlakatla -+ tz_names -+ 梅特拉卡特拉 ++ ++ No rootMountPoint is set. ++ + ++ ++ ++ UsersPage + -+ -+ Mexico City -+ tz_names -+ 墨西哥城 ++ ++ <small>If more than one person will use this computer, you can create multiple accounts after setup.</small> ++ + + -+ -+ Midway -+ tz_names -+ 中途島 ++ ++ <small>If more than one person will use this computer, you can create multiple accounts after installation.</small> ++ + ++ ++ ++ UsersQmlViewStep + -+ -+ Minsk -+ tz_names -+ 明斯克 ++ ++ Users ++ + ++ ++ ++ UsersViewStep + -+ -+ Miquelon -+ tz_names -+ 密克隆 ++ ++ Users ++ + ++ ++ ++ VariantModel + -+ -+ Mogadishu -+ tz_names -+ 摩加迪休 ++ ++ Key ++ Column header for key/value ++ + + -+ -+ Monaco -+ tz_names -+ 摩納哥 ++ ++ Value ++ Column header for key/value ++ + ++ ++ ++ VolumeGroupBaseDialog + -+ -+ Moncton -+ tz_names -+ 蒙克頓 ++ ++ Create Volume Group ++ + + -+ -+ Monrovia -+ tz_names -+ 蒙羅維亞 ++ ++ List of Physical Volumes ++ + + -+ -+ Monterrey -+ tz_names -+ 蒙特雷 ++ ++ Volume Group Name: ++ + + -+ -+ Montevideo -+ tz_names -+ 蒙特維多 ++ ++ Volume Group Type: ++ + + -+ -+ Montserrat -+ tz_names -+ 蒙特塞拉特 ++ ++ Physical Extent Size: ++ + + -+ -+ Moscow -+ tz_names -+ 莫斯科 ++ ++ MiB ++ + + -+ -+ Muscat -+ tz_names -+ 馬斯喀特 ++ ++ Total Size: ++ + + -+ -+ Nairobi -+ tz_names -+ 奈洛比 ++ ++ Used Size: ++ + + -+ -+ Nassau -+ tz_names -+ 拿索 ++ ++ Total Sectors: ++ + + -+ -+ Nauru -+ tz_names -+ 瑙魯 ++ ++ Quantity of LVs: ++ + ++ ++ ++ WelcomePage + -+ -+ Ndjamena -+ tz_names -+ 恩賈梅納 ++ ++ ++ Select application and system language ++ + + -+ -+ New York -+ tz_names -+ 紐約 ++ ++ Open donations website ++ + + -+ -+ Niamey -+ tz_names -+ 尼阿美 ++ ++ &Donate ++ + + -+ -+ Nicosia -+ tz_names -+ 尼古西亞 ++ ++ Open help and support website ++ + + -+ -+ Nipigon -+ tz_names -+ 尼皮貢 ++ ++ &Support ++ + + -+ -+ Niue -+ tz_names -+ 紐埃 ++ ++ Open issues and bug-tracking website ++ + + -+ -+ Nome -+ tz_names -+ 諾姆 ++ ++ &Known issues ++ + + -+ -+ Norfolk -+ tz_names -+ 諾福克 ++ ++ Open release notes website ++ + + -+ -+ Noronha -+ tz_names -+ 諾羅尼亞 ++ ++ &Release notes ++ + + -+ -+ North Dakota/Beulah -+ tz_names -+ 北達科他州/比拉 ++ ++ About %1 Setup ++ @title ++ + + -+ -+ North Dakota/Center -+ tz_names -+ 北達科他州/中心 ++ ++ About %1 Installer ++ @title ++ + + -+ -+ North Dakota/New Salem -+ tz_names -+ 北達科他州/新賽勒姆 ++ ++ %1 Support ++ @action ++ + ++ ++ ++ WelcomeQmlViewStep + -+ -+ Nouakchott -+ tz_names -+ 諾克少 ++ ++ Welcome ++ @title ++ + ++ ++ ++ WelcomeViewStep + -+ -+ Noumea -+ tz_names -+ 諾美亞 ++ ++ Welcome ++ @title ++ + ++ ++ ++ ZfsJob + -+ -+ Novokuznetsk -+ tz_names -+ 新庫茲涅茨克 ++ ++ Creating ZFS pools and datasets… ++ @status ++ + + -+ -+ Novosibirsk -+ tz_names -+ 新西伯利亞 ++ ++ Failed to create zpool on ++ + + -+ -+ Ojinaga -+ tz_names -+ 魁北克 ++ ++ Configuration Error ++ + + -+ -+ Omsk -+ tz_names -+ 鄂木斯克 ++ ++ No partitions are available for ZFS. ++ + + -+ -+ Oral -+ tz_names -+ 朵拉 ++ ++ Internal data missing ++ + + -+ -+ Oslo -+ tz_names -+ 奧斯陸 ++ ++ ++ Failed to create zpool ++ + + -+ -+ Ouagadougou -+ tz_names -+ 瓦加杜古 ++ ++ Failed to create dataset ++ + + -+ -+ Pago Pago -+ tz_names -+ 帕果帕果 ++ ++ The output was: ++ + ++ ++ ++ calamares-sidebar + -+ -+ Palau -+ tz_names -+ 帕勞 ++ ++ About ++ + + -+ -+ Palmer -+ tz_names -+ 帕爾默 ++ ++ Debug ++ + + -+ -+ Panama -+ tz_names -+ 巴拿馬 ++ ++ About ++ @button ++ + + -+ -+ Pangnirtung -+ tz_names -+ 巴芬島的旁涅唐 ++ ++ Show information about Calamares ++ @tooltip ++ + + -+ -+ Paramaribo -+ tz_names -+ 巴拉馬利波 ++ ++ Debug ++ @button ++ + + -+ -+ Paris -+ tz_names -+ 巴黎 ++ ++ Show debug information ++ @tooltip ++ + ++ ++ ++ finishedq + -+ -+ Perth -+ tz_names -+ 珀斯 ++ ++ Installation Completed ++ + + -+ -+ Phnom Penh -+ tz_names -+ 金邊 ++ ++ %1 has been installed on your computer.<br/> ++ You may now restart into your new system, or continue using the Live environment. ++ + + -+ -+ Phoenix -+ tz_names -+ 鳳凰城 ++ ++ Close Installer ++ + + -+ -+ Pitcairn -+ tz_names -+ 皮特凱恩 ++ ++ Restart System ++ + + -+ -+ Podgorica -+ tz_names -+ 波德戈裡察 ++ ++ <p>A full log of the install is available as installation.log in the home directory of the Live user.<br/> ++ This log is copied to /var/log/installation.log of the target system.</p> ++ + ++ ++ ++ finishedq-qt6 + -+ -+ Pohnpei -+ tz_names -+ 波納佩島 ++ ++ Installation Completed ++ @title ++ + + -+ -+ Pontianak -+ tz_names -+ 坤甸 ++ ++ %1 has been installed on your computer.<br/> ++ You may now restart into your new system, or continue using the Live environment. ++ @info, %1 is the product name ++ + + -+ -+ Port Moresby -+ tz_names -+ 莫爾斯貝港 ++ ++ Close Installer ++ @button ++ + + -+ -+ Port of Spain -+ tz_names -+ 西班牙港 ++ ++ Restart System ++ @button ++ + + -+ -+ Port-au-Prince -+ tz_names -+ 太子港 ++ ++ <p>A full log of the install is available as installation.log in the home directory of the Live user.<br/> ++ This log is copied to /var/log/installation.log of the target system.</p> ++ @info ++ + ++ ++ ++ finishedq@mobile + -+ -+ Porto Velho -+ tz_names -+ 維略港 ++ ++ Installation Completed ++ @title ++ + + -+ -+ Porto-Novo -+ tz_names -+ 波多洛 ++ ++ %1 has been installed on your computer.<br/> ++ You may now restart your device. ++ @info, %1 is the product name ++ + + -+ -+ Prague -+ tz_names -+ 布拉格 ++ ++ Close ++ @button ++ + + -+ -+ Puerto Rico -+ tz_names -+ 波多黎各 ++ ++ Restart ++ @button ++ + ++ ++ ++ keyboardq + -+ -+ Punta Arenas -+ tz_names -+ 蓬塔阿雷納斯 ++ ++ Select a layout to activate keyboard preview ++ @label ++ + + -+ -+ Pyongyang -+ tz_names -+ 平壤 ++ ++ <b>Keyboard model:&nbsp;&nbsp;</b> ++ @label ++ + + -+ -+ Qatar -+ tz_names -+ 卡塔爾 ++ ++ Layout ++ @label ++ + + -+ -+ Qostanay -+ tz_names -+ 庫斯塔 ++ ++ Variant ++ @label ++ + + -+ -+ Qyzylorda -+ tz_names -+ 克孜勒奧爾達 ++ ++ Type here to test your keyboard… ++ @label ++ + ++ ++ ++ keyboardq-qt6 + -+ -+ Rainy River -+ tz_names -+ 雷尼河 ++ ++ Select a layout to activate keyboard preview ++ @label ++ + + -+ -+ Rankin Inlet -+ tz_names -+ 蘭京海口 ++ ++ <b>Keyboard model:&nbsp;&nbsp;</b> ++ @label ++ + + -+ -+ Rarotonga -+ tz_names -+ 拉羅湯加 ++ ++ Layout ++ @label ++ + + -+ -+ Recife -+ tz_names -+ 累西腓 ++ ++ Variant ++ @label ++ + + -+ -+ Regina -+ tz_names -+ 里賈納 ++ ++ Type here to test your keyboard… ++ @label ++ + ++ ++ ++ localeq + -+ -+ Resolute -+ tz_names -+ 雷索盧特 ++ ++ ++ Change ++ @button ++ + + -+ -+ Reunion -+ tz_names -+ 留尼旺島 ++ ++ <h3>Languages</h3> </br> ++ The system locale setting affects the language and character set for some command line user interface elements. The current setting is <strong>%1</strong>. ++ @info ++ + + -+ -+ Reykjavik -+ tz_names -+ 雷克雅維克 ++ ++ <h3>Locales</h3> </br> ++ The system locale setting affects the numbers and dates format. The current setting is <strong>%1</strong>. ++ @info ++ + ++ ++ ++ localeq-qt6 + -+ -+ Riga -+ tz_names -+ 裏加 ++ ++ ++ Change ++ @button ++ + + -+ -+ Rio Branco -+ tz_names -+ 裏奧·布蘭科 ++ ++ <h3>Languages</h3> </br> ++ The system locale setting affects the language and character set for some command line user interface elements. The current setting is <strong>%1</strong>. ++ @info ++ + + -+ -+ Riyadh -+ tz_names -+ 利雅德 ++ ++ <h3>Locales</h3> </br> ++ The system locale setting affects the numbers and dates format. The current setting is <strong>%1</strong>. ++ @info ++ + ++ ++ ++ notesqml + -+ -+ Rome -+ tz_names -+ 羅馬 ++ ++ <h3>%1</h3> ++ <p>These are example release notes.</p> ++ + ++ ++ ++ packagechooserq + -+ -+ Rothera -+ tz_names -+ 羅瑟拉 ++ ++ LibreOffice is a powerful and free office suite, used by millions of people around the world. It includes several applications that make it the most versatile Free and Open Source office suite on the market.<br/> ++ Default option. ++ + + -+ -+ Saipan -+ tz_names -+ 塞班島 ++ ++ LibreOffice ++ + + -+ -+ Sakhalin -+ tz_names -+ 薩哈林 ++ ++ If you don't want to install an office suite, just select No Office Suite. You can always add one (or more) later on your installed system as the need arrives. ++ + + -+ -+ Samara -+ tz_names -+ 薩馬拉 ++ ++ No Office Suite ++ + + -+ -+ Samarkand -+ tz_names -+ 撒馬爾罕 ++ ++ Create a minimal Desktop install, remove all extra applications and decide later on what you would like to add to your system. Examples of what won't be on such an install, there will be no Office Suite, no media players, no image viewer or print support. It will be just a desktop, file browser, package manager, text editor and simple web-browser. ++ + + -+ -+ San Marino -+ tz_names -+ 聖馬利諾 ++ ++ Minimal Install ++ + + -+ -+ Santarem -+ tz_names -+ 聖塔倫 ++ ++ Please select an option for your install, or use the default: LibreOffice included. ++ + ++ ++ ++ packagechooserq-qt6 + -+ -+ Santiago -+ tz_names -+ 聖地牙哥 ++ ++ LibreOffice is a powerful and free office suite, used by millions of people around the world. It includes several applications that make it the most versatile Free and Open Source office suite on the market.<br/> ++ Default option. ++ + + -+ -+ Santo Domingo -+ tz_names -+ 聖多明哥 ++ ++ LibreOffice ++ + + -+ -+ Sao Paulo -+ tz_names -+ 聖保羅 ++ ++ If you don't want to install an office suite, just select No Office Suite. You can always add one (or more) later on your installed system as the need arrives. ++ + + -+ -+ Sao Tome -+ tz_names -+ 聖多美 ++ ++ No Office Suite ++ + + -+ -+ Sarajevo -+ tz_names -+ 塞拉耶佛 ++ ++ Create a minimal Desktop install, remove all extra applications and decide later on what you would like to add to your system. Examples of what won't be on such an install, there will be no Office Suite, no media players, no image viewer or print support. It will be just a desktop, file browser, package manager, text editor and simple web-browser. ++ + + -+ -+ Saratov -+ tz_names -+ 薩拉托夫 ++ ++ Minimal Install ++ + + -+ -+ Scoresbysund -+ tz_names -+ 斯科斯比基金 ++ ++ Please select an option for your install, or use the default: LibreOffice included. ++ + ++ ++ ++ release_notes + -+ -+ Seoul -+ tz_names -+ 首爾 ++ ++ ### %1 ++This an example QML file, showing options in Markdown with Flickable content. ++ ++QML with RichText can use HTML tags, with Markdown it uses the simple Markdown syntax, Flickable content is useful for touchscreens. ++ ++**This is bold text** ++ ++*This is italic text* ++ ++_This is underlined text_ ++ ++> blockquote ++ ++~~This is strikethrough~~ ++ ++Code example: ++``` ++ls -l /home ++``` ++ ++**Lists:** ++ * Intel CPU systems ++ * AMD CPU systems ++ ++The vertical scrollbar is adjustable, current width set to 10. ++ + + -+ -+ Shanghai -+ tz_names -+ 上海 ++ ++ Back ++ + ++ ++ ++ usersq + -+ -+ Simferopol -+ tz_names -+ 辛菲羅波爾 ++ ++ Pick your user name and credentials to login and perform admin tasks ++ + + -+ -+ Singapore -+ tz_names -+ 新加坡 ++ ++ What is your name? ++ + + -+ -+ Sitka -+ tz_names -+ 錫特卡 ++ ++ Your full name ++ + + -+ -+ Skopje -+ tz_names -+ 斯高彼亞 ++ ++ What name do you want to use to log in? ++ + + -+ -+ Sofia -+ tz_names -+ 索菲亞 ++ ++ Login name ++ + + -+ -+ South Georgia -+ tz_names -+ 南喬治亞州 ++ ++ If more than one person will use this computer, you can create multiple accounts after installation. ++ + + -+ -+ Srednekolymsk -+ tz_names -+ 雅庫特 ++ ++ Only lowercase letters, numbers, underscore and hyphen are allowed. ++ + + -+ -+ St Barthelemy -+ tz_names -+ 聖巴泰勒米 ++ ++ root is not allowed as username. ++ + + -+ -+ St Helena -+ tz_names -+ 聖赫倫那 ++ ++ What is the name of this computer? ++ + + -+ -+ St Johns -+ tz_names -+ 聖約翰 ++ ++ Computer name ++ + + -+ -+ St Kitts -+ tz_names -+ 聖基茨 ++ ++ This name will be used if you make the computer visible to others on a network. ++ + + -+ -+ St Lucia -+ tz_names -+ 聖盧西亞 ++ ++ Only letters, numbers, underscore and hyphen are allowed, minimal of two characters. ++ + + -+ -+ St Thomas -+ tz_names -+ 聖托馬斯 ++ ++ localhost is not allowed as hostname. ++ + + -+ -+ St Vincent -+ tz_names -+ 聖文森特 ++ ++ Choose a password to keep your account safe. ++ + + -+ -+ Stanley -+ tz_names -+ 斯坦利 ++ ++ Password ++ + + -+ -+ Stockholm -+ tz_names -+ 斯德哥爾摩 ++ ++ Repeat password ++ + + -+ -+ Swift Current -+ tz_names -+ 斯威夫特卡倫特 ++ ++ Enter the same password twice, so that it can be checked for typing errors. A good password will contain a mixture of letters, numbers and punctuation, should be at least eight characters long, and should be changed at regular intervals. ++ + + -+ -+ Sydney -+ tz_names -+ 雪梨 ++ ++ Reuse user password as root password ++ + + -+ -+ Syowa -+ tz_names -+ 聖約瑟 ++ ++ Use the same password for the administrator account. ++ + + -+ -+ Tahiti -+ tz_names -+ 大溪地 ++ ++ Choose a root password to keep your account safe. ++ + + -+ -+ Taipei(China) -+ tz_names -+ 臺北(中国) ++ ++ Root password ++ + + -+ -+ Tallinn -+ tz_names -+ 數位行 ++ ++ Repeat root password ++ + + -+ -+ Tarawa -+ tz_names -+ 塔拉瓦 ++ ++ Enter the same password twice, so that it can be checked for typing errors. ++ + + -+ -+ Tashkent -+ tz_names -+ 塔什干 ++ ++ Log in automatically without asking for the password ++ + + -+ -+ Tbilisi -+ tz_names -+ 第比利斯 ++ ++ Validate passwords quality ++ + + -+ -+ Tegucigalpa -+ tz_names -+ 德古西加巴 ++ ++ When this box is checked, password-strength checking is done and you will not be able to use a weak password. ++ + ++ ++ ++ usersq-qt6 + -+ -+ Tehran -+ tz_names -+ 德黑蘭 ++ ++ Pick your user name and credentials to login and perform admin tasks ++ + + -+ -+ Thimphu -+ tz_names -+ 辛布 ++ ++ What is your name? ++ + + -+ -+ Thule -+ tz_names -+ 圖勒 ++ ++ Your full name ++ + + -+ -+ Thunder Bay -+ tz_names -+ 雷灣 ++ ++ What name do you want to use to log in? ++ + + -+ -+ Tijuana -+ tz_names -+ 蒂華納 ++ ++ Login name ++ + + -+ -+ Tirane -+ tz_names -+ 地拉那 ++ ++ If more than one person will use this computer, you can create multiple accounts after installation. ++ + + -+ -+ Tokyo -+ tz_names -+ 東京 ++ ++ Only lowercase letters, numbers, underscore and hyphen are allowed. ++ + + -+ -+ Tomsk -+ tz_names -+ 托木斯克 ++ ++ root is not allowed as username. ++ + + -+ -+ Tongatapu -+ tz_names -+ 湯加塔布 ++ ++ What is the name of this computer? ++ + + -+ -+ Toronto -+ tz_names -+ 多倫多 ++ ++ Computer name ++ + + -+ -+ Tortola -+ tz_names -+ 托托拉島 ++ ++ This name will be used if you make the computer visible to others on a network. ++ + + -+ -+ Tripoli -+ tz_names -+ 的黎波里 ++ ++ Only letters, numbers, underscore and hyphen are allowed, minimal of two characters. ++ + + -+ -+ Troll -+ tz_names -+ 特羅爾海坦 ++ ++ localhost is not allowed as hostname. ++ + + -+ -+ Tunis -+ tz_names -+ 突尼斯 ++ ++ Choose a password to keep your account safe. ++ + + -+ -+ Ulaanbaatar -+ tz_names -+ 烏蘭巴托 ++ ++ Password ++ + + -+ -+ Ulyanovsk -+ tz_names -+ 烏裡揚諾夫斯克 ++ ++ Repeat password ++ + + -+ -+ Urumqi -+ tz_names -+ 烏魯木齊 ++ ++ Enter the same password twice, so that it can be checked for typing errors. A good password will contain a mixture of letters, numbers and punctuation, should be at least eight characters long, and should be changed at regular intervals. ++ + + -+ -+ Ust-Nera -+ tz_names -+ 烏斯季挪拉 ++ ++ Reuse user password as root password ++ + + -+ -+ Uzhgorod -+ tz_names -+ 烏日哥羅德 ++ ++ Use the same password for the administrator account. ++ + + -+ -+ Vaduz -+ tz_names -+ 瓦都茲 ++ ++ Choose a root password to keep your account safe. ++ + + -+ -+ Vancouver -+ tz_names -+ 溫哥華 ++ ++ Root password ++ + + -+ -+ Vatican -+ tz_names -+ 梵蒂岡 ++ ++ Repeat root password ++ + + -+ -+ Vienna -+ tz_names -+ 維也納 ++ ++ Enter the same password twice, so that it can be checked for typing errors. ++ + + -+ -+ Vientiane -+ tz_names -+ 萬象 ++ ++ Log in automatically without asking for the password ++ + + -+ -+ Vilnius -+ tz_names -+ 維爾紐斯 ++ ++ Validate passwords quality ++ + + -+ -+ Vladivostok -+ tz_names -+ 符拉迪沃斯托克 ++ ++ When this box is checked, password-strength checking is done and you will not be able to use a weak password. ++ + ++ ++ ++ welcomeq + -+ -+ Volgograd -+ tz_names -+ 伏爾加格勒 ++ ++ <h3>Welcome to the %1 <quote>%2</quote> installer</h3> ++ <p>This program will ask you some questions and set up %1 on your computer.</p> ++ + + -+ -+ Vostok -+ tz_names -+ 沃斯托克 ++ ++ Support ++ + + -+ -+ Wake -+ tz_names -+ 韋克 ++ ++ Known Issues ++ + + -+ -+ Wallis -+ tz_names -+ 沃利斯 ++ ++ Release Notes ++ + + -+ -+ Warsaw -+ tz_names -+ 華沙 ++ ++ Donate ++ + ++ ++ ++ welcomeq-qt6 + -+ -+ Whitehorse -+ tz_names -+ 懷特霍斯 ++ ++ <h3>Welcome to the %1 <quote>%2</quote> installer</h3> ++ <p>This program will ask you some questions and set up %1 on your computer.</p> ++ + + -+ -+ Windhoek -+ tz_names -+ 溫吐克 ++ ++ Support ++ + + -+ -+ Winnipeg -+ tz_names -+ 溫尼伯 ++ ++ Known Issues ++ + + -+ -+ Yakutat -+ tz_names -+ 雅庫特 ++ ++ Release Notes ++ + + -+ -+ Yakutsk -+ tz_names -+ 亞庫次克 ++ ++ Donate ++ + ++ ++ +diff --git a/lang/calamares_zh_CN.ts b/lang/calamares_zh_CN.ts +index f16037b..75ffe95 100644 +--- a/lang/calamares_zh_CN.ts ++++ b/lang/calamares_zh_CN.ts +@@ -1,4875 +1,5008 @@ + + +- +- ++ ++ + AboutData + +- +- <h1>%1</h1><br/><strong>%2<br/> for %3</strong><br/><br/> +- <h1>%1</h1><br/><strong>%2<br/> for %3</strong><br/><br/> ++ ++ <br/><h2>Release:%1</h2><br/> ++ <br/><h1>发行版本:%1</h1><br/> + + +- +- Thanks to <a href="https://calamares.io/team/">the Calamares team</a> and the <a href="https://app.transifex.com/calamares/calamares/">Calamares translators team</a>. +- 感谢 <a href="https://calamares.io/team/">Calamares 团队</a> 以及 <a href="https://app.transifex.com/calamares/calamares/">Calamares 翻译团队</a>。 ++ ++ <strong>Thanks to the openEuler team.</strong> ++ <strong>感谢 openEuler 团队。</strong> + + +- +- <a href="https://calamares.io/">Calamares</a> development is sponsored by <br/><a href="http://www.blue-systems.com/">Blue Systems</a> - Liberating Software. +- <a href="https://calamares.io/">Calamares</a> 的开发由 <br/> <a href="http://www.blue-systems.com/">Blue Systems</a> - Liberating Software 赞助。 ++ <a href="https://calamares.io/">Calamares</a> development is sponsored by <br/><a href="http://www.blue-systems.com/">Blue Systems</a> - Liberating Software. ++ <a href="https://calamares.io/">Calamares</a> 的开发由 <br/> <a href="http://www.blue-systems.com/">Blue Systems</a> - Liberating Software 赞助。 + + +- +- Copyright %1-%2 %3 &lt;%4&gt;<br/> +- Copyright year-year Name <email-address> +- Copyright %1-%2 %3 &lt;%4&gt;<br/> ++ ++ Copyright %1-%2 %3 &lt;%4&gt;<br/> ++ Copyright year-year Name <email-address> ++ Copyright %1-%2 %3 &lt;%4&gt;<br/> + +- +- ++ ++ ++ ActiveDirectoryJob + -+ -+ Yangon -+ tz_names -+ 仰光 ++ ++ Enroll system in Active Directory ++ @label ++ + + -+ -+ Yekaterinburg -+ tz_names -+ 葉卡捷琳堡 ++ ++ Enrolling system in Active Directory… ++ @status ++ + -+ -+ -+ Yellowknife -+ tz_names -+ 黃刀 ++ ++ + AutoMountManagementJob + +- +- Managing auto-mount settings… +- @status +- 管理自动挂载设置… ++ ++ Managing auto-mount settings… ++ @status ++ 管理自动挂载设置… + +- +- ++ ++ + BootInfoWidget + +- +- The <strong>boot environment</strong> of this system.<br><br>Older x86 systems only support <strong>BIOS</strong>.<br>Modern systems usually use <strong>EFI</strong>, but may also show up as BIOS if started in compatibility mode. +- 这个系统的<strong>引导环境</strong>。<br><br>较旧的 x86 系统只支持 <strong>BIOS</strong>。<br>现代的系统则通常使用 <strong>EFI</strong>,但若引导时使用了兼容模式,也可以变为 BIOS。 ++ ++ The <strong>boot environment</strong> of this system.<br><br>Older x86 systems only support <strong>BIOS</strong>.<br>Modern systems usually use <strong>EFI</strong>, but may also show up as BIOS if started in compatibility mode. ++ 这个系统的<strong>引导环境</strong>。<br><br>较旧的 x86 系统只支持 <strong>BIOS</strong>。<br>现代的系统则通常使用 <strong>EFI</strong>,但若引导时使用了兼容模式,也可以变为 BIOS。 + + +- +- This system was started with an <strong>EFI</strong> boot environment.<br><br>To configure startup from an EFI environment, this installer must deploy a boot loader application, like <strong>GRUB</strong> or <strong>systemd-boot</strong> on an <strong>EFI System Partition</strong>. This is automatic, unless you choose manual partitioning, in which case you must choose it or create it on your own. +- 此系统从 <strong>EFI</strong> 引导环境启动。<br><br>若要配置EFI环境的启动项,本安装器必须在<strong>EFI系统分区</strong>中安装一个引导程序, 例如 <strong>GRUB</strong>或 <strong>systemd-boot</strong> 。这个过程是自动的,但若你选择手动分区,那你将必须手动选择或者创建。 ++ ++ This system was started with an <strong>EFI</strong> boot environment.<br><br>To configure startup from an EFI environment, this installer must deploy a boot loader application, like <strong>GRUB</strong> or <strong>systemd-boot</strong> on an <strong>EFI System Partition</strong>. This is automatic, unless you choose manual partitioning, in which case you must choose it or create it on your own. ++ 此系统从 <strong>EFI</strong> 引导环境启动。<br><br>若要配置EFI环境的启动项,本安装器必须在<strong>EFI系统分区</strong>中安装一个引导程序, 例如 <strong>GRUB</strong>或 <strong>systemd-boot</strong> 。这个过程是自动的,但若你选择手动分区,那你将必须手动选择或者创建。 + + +- +- This system was started with a <strong>BIOS</strong> boot environment.<br><br>To configure startup from a BIOS environment, this installer must install a boot loader, like <strong>GRUB</strong>, either at the beginning of a partition or on the <strong>Master Boot Record</strong> near the beginning of the partition table (preferred). This is automatic, unless you choose manual partitioning, in which case you must set it up on your own. +- 这个系统从 <strong>BIOS</strong> 引导环境启动。<br><br> ++ ++ This system was started with a <strong>BIOS</strong> boot environment.<br><br>To configure startup from a BIOS environment, this installer must install a boot loader, like <strong>GRUB</strong>, either at the beginning of a partition or on the <strong>Master Boot Record</strong> near the beginning of the partition table (preferred). This is automatic, unless you choose manual partitioning, in which case you must set it up on your own. ++ 这个系统从 <strong>BIOS</strong> 引导环境启动。<br><br> + 要从 BIOS 环境引导,本安装程序必须安装引导器(如 <strong>GRUB</strong>),一般而言要么安装在分区的开头,要么就是在靠进分区表开头的 <strong>主引导记录</strong>(推荐)中。这个步骤是自动的,除非您选择手动分区——此时您必须自行配置。 + +- +- ++ ++ + BootLoaderModel + +- +- Master Boot Record of %1 +- @info +- 主引导记录 %1 ++ ++ Master Boot Record of %1 ++ @info ++ 主引导记录 %1 + + +- +- Boot Partition +- @info +- 引导分区 ++ ++ Boot Partition ++ @info ++ 引导分区 + + +- +- System Partition +- @info +- 系统分区 ++ ++ System Partition ++ @info ++ 系统分区 + + +- +- Do not install a boot loader +- @label +- 不要安装引导程序 ++ ++ Do not install a boot loader ++ @label ++ 不要安装引导程序 + + +- +- %1 (%2) +- %1 (%2) ++ ++ %1 (%2) ++ %1 (%2) + +- +- ++ ++ + Calamares::BlankViewStep + +- +- Blank Page +- 空白页 ++ ++ Blank Page ++ 空白页 + +- +- ++ ++ + Calamares::DebugWindow + +- +- GlobalStorage +- 全局存储 ++ ++ GlobalStorage ++ 全局存储 + + +- +- JobQueue +- 任务队列 ++ ++ JobQueue ++ 任务队列 + + +- +- Modules +- 模块 ++ ++ Modules ++ 模块 + + +- +- Type: +- 类型: ++ ++ Type: ++ 类型: + + +- +- +- none +- ++ ++ ++ none ++ + + +- +- Interface: +- 接口: ++ ++ Interface: ++ 接口: + + +- +- Crashes Calamares, so that Dr. Konqi can look at it. +- 使 Calamares 崩溃,以便 Dr. Konqi 查看。 ++ ++ Crashes Calamares, so that Dr. Konqi can look at it. ++ 使 Calamares 崩溃,以便 Dr. Konqi 查看。 + + +- +- Reloads the stylesheet from the branding directory. +- 从Branding目录重新加载样式表 ++ ++ Reloads the stylesheet from the branding directory. ++ 从Branding目录重新加载样式表 + + +- +- Reload Stylesheet +- 重载样式表 ++ ++ Reload Stylesheet ++ 重载样式表 + + +- +- Displays the tree of widget names in the log (for stylesheet debugging). +- 在日志中显示小部件名称树(用于样式表调试)。 ++ ++ Displays the tree of widget names in the log (for stylesheet debugging). ++ 在日志中显示小部件名称树(用于样式表调试)。 + + +- +- Widget Tree +- 树形控件 ++ ++ Widget Tree ++ 树形控件 + + +- +- Uploads the session log to the configured pastebin. +- 将会话日志上传至预设的pastebin网站 ++ ++ Uploads the session log to the configured pastebin. ++ 将会话日志上传至预设的pastebin网站 + + +- +- Send Session Log +- 发送会话日志 ++ ++ Send Session Log ++ 发送会话日志 + + +- +- Debug Information +- @title +- 调试信息 ++ ++ Debug Information ++ @title ++ 调试信息 + +- +- ++ ++ + Calamares::ExecutionViewStep + +- +- %p% +- Progress percentage indicator: %p is where the number 0..100 is placed +- %p% ++ ++ %p% ++ Progress percentage indicator: %p is where the number 0..100 is placed ++ %p% + + +- +- Set Up +- @label +- 配置 ++ ++ Set Up ++ @label ++ 配置 + + +- +- Install +- @label +- 安装 ++ ++ Install ++ @label ++ 安装 + +- +- ++ ++ ++ Toggle log ++ 日志 + -+ -+ -+ Yerevan -+ tz_names -+ 葉里溫 ++ ++ + Calamares::FailJob + +- +- Job failed (%1) +- 任务失败(%1) ++ ++ Job failed (%1) ++ 任务失败(%1) + + +- +- Programmed job failure was explicitly requested. +- 出现明确抛出的任务执行失败。 ++ ++ Programmed job failure was explicitly requested. ++ 出现明确抛出的任务执行失败。 + +- +- ++ ++ + Calamares::JobThread + +- +- Done +- 完成 ++ ++ Done ++ 完成 + +- +- ++ ++ + Calamares::NamedJob + +- +- Example job (%1) +- 示例任务 (%1) ++ ++ Example job (%1) ++ 示例任务 (%1) + +- +- ++ ++ + Calamares::ProcessJob + +- +- Running command %1 in target system… +- @status +- 正在目标系统重执行 %1 命令…… ++ ++ Running command %1 in target system… ++ @status ++ 正在目标系统重执行 %1 命令…… + + +- +- Running command %1… +- @status +- 正在执行 %1 命令…… ++ ++ Running command %1… ++ @status ++ 正在执行 %1 命令…… + +- +- ++ ++ + Calamares::Python::Job + +- +- Running %1 operation. +- 正在运行 %1 操作。 ++ ++ Running %1 operation. ++ 正在运行 %1 操作。 + + +- +- Bad working directory path +- 错误的工作目录路径 ++ ++ Bad working directory path ++ 错误的工作目录路径 + + +- +- Working directory %1 for python job %2 is not readable. +- 用于 python 任务 %2 的工作目录 %1 不可读。 ++ ++ Working directory %1 for python job %2 is not readable. ++ 用于 python 任务 %2 的工作目录 %1 不可读。 + + +- +- +- +- +- +- +- Bad main script file +- 错误的主脚本文件 ++ ++ ++ ++ ++ ++ ++ Bad main script file ++ 错误的主脚本文件 + + +- +- Main script file %1 for python job %2 is not readable. +- 用于 python 任务 %2 的主脚本文件 %1 不可读。 ++ ++ Main script file %1 for python job %2 is not readable. ++ 用于 python 任务 %2 的主脚本文件 %1 不可读。 + + +- +- Bad internal script +- 内部脚本错误 ++ ++ Bad internal script ++ 内部脚本错误 + + +- +- Internal script for python job %1 raised an exception. +- Python 任务 %1 的内部脚本发生意外。 ++ ++ Internal script for python job %1 raised an exception. ++ Python 任务 %1 的内部脚本发生意外。 + + +- +- Main script file %1 for python job %2 could not be loaded because it raised an exception. +- 无法加载 python 作业 %2 的主脚本文件 %1 ,因为它引发了异常。 ++ ++ Main script file %1 for python job %2 could not be loaded because it raised an exception. ++ 无法加载 python 作业 %2 的主脚本文件 %1 ,因为它引发了异常。 + + +- +- Main script file %1 for python job %2 raised an exception. +- 用于 python 任务 %2 的主脚本文件 %1 引发了异常。 ++ ++ Main script file %1 for python job %2 raised an exception. ++ 用于 python 任务 %2 的主脚本文件 %1 引发了异常。 + + +- +- +- Main script file %1 for python job %2 returned invalid results. +- 用于 python 任务 %2 的主脚本文件 %1 回传了无效结果。 ++ ++ ++ Main script file %1 for python job %2 returned invalid results. ++ 用于 python 任务 %2 的主脚本文件 %1 回传了无效结果。 + + +- +- Main script file %1 for python job %2 does not contain a run() function. +- 用于 python 任务 %2 的主脚本文件 %1 未包含 run() 函数。 ++ ++ Main script file %1 for python job %2 does not contain a run() function. ++ 用于 python 任务 %2 的主脚本文件 %1 未包含 run() 函数。 + +- +- ++ ++ + Calamares::PythonJob + +- +- Running %1 operation… +- @status +- 正在运行 %1 操作…… ++ ++ Running %1 operation… ++ @status ++ 正在运行 %1 操作…… + + +- +- Bad working directory path +- @error +- 错误的工作目录路径 ++ ++ Bad working directory path ++ @error ++ 错误的工作目录路径 + + +- +- Working directory %1 for python job %2 is not readable. +- @error +- 用于 python 任务 %2 的工作目录 %1 不可读。 ++ ++ Working directory %1 for python job %2 is not readable. ++ @error ++ 用于 python 任务 %2 的工作目录 %1 不可读。 + + +- +- Bad main script file +- @error +- 错误的主脚本文件 ++ ++ Bad main script file ++ @error ++ 错误的主脚本文件 + + +- +- Main script file %1 for python job %2 is not readable. +- @error +- 用于 python 任务 %2 的主脚本文件 %1 不可读。 ++ ++ Main script file %1 for python job %2 is not readable. ++ @error ++ 用于 python 任务 %2 的主脚本文件 %1 不可读。 + + +- +- Boost.Python error in job "%1" +- @error +- 任务“%1”出现 Boost.Python 错误 ++ ++ Boost.Python error in job "%1" ++ @error ++ 任务“%1”出现 Boost.Python 错误 + +- +- ++ ++ + Calamares::QmlViewStep + +- +- Loading… +- @status +- 正在加载... ++ ++ Loading… ++ @status ++ 正在加载... + + +- +- QML step <i>%1</i>. +- @label +- QML 步骤 <i>%1</i>. ++ ++ QML step <i>%1</i>. ++ @label ++ QML 步骤 <i>%1</i>. + + +- +- Loading failed. +- @info +- 加载失败。 ++ ++ Loading failed. ++ @info ++ 加载失败。 + +- +- ++ ++ + Calamares::RequirementsChecker + +- +- Requirements checking for module '%1' is complete. +- @info +- “%1”模块的需求检查完成。 ++ ++ Requirements checking for module '%1' is complete. ++ @info ++ “%1”模块的需求检查完成。 + + +- +- Waiting for %n module(s)… +- @status +- +- 等待 %n 个模块… +- ++ ++ Waiting for %n module(s)… ++ @status ++ ++ 等待 %n 个模块… ++ + + +- +- (%n second(s)) +- @status +- +- (%n 秒) +- ++ ++ (%n second(s)) ++ @status ++ ++ (%n 秒) ++ + + +- +- System-requirements checking is complete. +- @info +- 已经完成系统需求检查。 ++ ++ System-requirements checking is complete. ++ @info ++ 已经完成系统需求检查。 + +- +- ++ ++ + Calamares::ViewManager + +- +- The upload was unsuccessful. No web-paste was done. +- 上传失败,未完成网页粘贴。 ++ ++ The upload was unsuccessful. No web-paste was done. ++ 上传失败,未完成网页粘贴。 + + +- +- Install log posted to ++ ++ Install log posted to + + %1 + + Link copied to clipboard +- 发送至 ++ 发送至 + + %1 + + 的链接已保存至剪贴板 + + +- +- Install Log Paste URL +- 安装日志粘贴 URL ++ ++ Install Log Paste URL ++ 安装日志粘贴 URL + + +- +- &Yes +- &是 ++ ++ &Yes ++ &是 + + +- +- &No +- &否 ++ ++ &No ++ &否 + + +- +- &Close +- &关闭 ++ ++ &Close ++ &关闭 + + +- +- Setup Failed +- @title +- 初始化失败 ++ ++ Setup Failed ++ @title ++ 初始化失败 + + +- +- Installation Failed +- @title +- 安装失败 ++ ++ Installation Failed ++ @title ++ 安装失败 + + +- +- Error +- @title +- 错误 ++ ++ Error ++ @title ++ 错误 + + +- +- Calamares Initialization Failed +- @title +- Calamares初始化失败 ++ ++ Calamares Initialization Failed ++ @title ++ Calamares初始化失败 + + +- +- %1 can not be installed. Calamares was unable to load all of the configured modules. This is a problem with the way Calamares is being used by the distribution. +- @info +- %1无法安装。 Calamares无法加载所有已配置的模块。这个问题是发行版配置Calamares不当导致的。 ++ ++ %1 can not be installed. Calamares was unable to load all of the configured modules. This is a problem with the way Calamares is being used by the distribution. ++ @info ++ %1无法安装。 Calamares无法加载所有已配置的模块。这个问题是发行版配置Calamares不当导致的。 + + +- +- <br/>The following modules could not be loaded: +- @info +- <br/>无法加载以下模块: ++ ++ <br/>The following modules could not be loaded: ++ @info ++ <br/>无法加载以下模块: + + +- +- Continue with Setup? +- @title +- 要继续安装吗? ++ ++ Continue with Setup? ++ @title ++ 要继续安装吗? + + +- +- Continue with Installation? +- @title +- 继续安装? ++ ++ Continue with Installation? ++ @title ++ 继续安装? + + +- +- The %1 setup program is about to make changes to your disk in order to set up %2.<br/><strong>You will not be able to undo these changes.</strong> +- %1 is short product name, %2 is short product name with version +- 为了安装%2, %1 安装程序即将对磁盘进行更改。<br/><strong>这些更改无法撤销。</strong> ++ ++ The %1 setup program is about to make changes to your disk in order to set up %2.<br/><strong>You will not be able to undo these changes.</strong> ++ %1 is short product name, %2 is short product name with version ++ 为了安装%2, %1 安装程序即将对磁盘进行更改。<br/><strong>这些更改无法撤销。</strong> + + +- +- The %1 installer is about to make changes to your disk in order to install %2.<br/><strong>You will not be able to undo these changes.</strong> +- %1 is short product name, %2 is short product name with version +- %1 安装程序将在您的磁盘上做出更改以安装 %2。<br/><strong>您将无法还原这些更改。</strong> ++ ++ The %1 installer is about to make changes to your disk in order to install %2.<br/><strong>You will not be able to undo these changes.</strong> ++ %1 is short product name, %2 is short product name with version ++ %1 安装程序将在您的磁盘上做出更改以安装 %2。<br/><strong>您将无法还原这些更改。</strong> + + +- +- &Set Up Now +- @button +- 现在开始配置(&S) ++ ++ &Set Up Now ++ @button ++ 现在开始配置(&S) + + +- +- &Install Now +- @button +- 现在开始安装(&I) ++ ++ &Install Now ++ @button ++ 现在开始安装(&I) + + +- +- Go &Back +- @button +- 返回 (&B) ++ ++ Go &Back ++ @button ++ 返回 (&B) + + +- +- &Set Up +- @button +- 配置 (&S) ++ ++ &Set Up ++ @button ++ 配置 (&S) + + +- +- &Install +- @button +- 安装(&I) ++ ++ &Install ++ @button ++ 安装(&I) + + +- +- Setup is complete. Close the setup program. +- @tooltip +- 安装完成。关闭安装程序。 ++ ++ Setup is complete. Close the setup program. ++ @tooltip ++ 安装完成。关闭安装程序。 + + +- +- The installation is complete. Close the installer. +- @tooltip +- 安装已完成。请关闭安装程序。 ++ ++ The installation is complete. Close the installer. ++ @tooltip ++ 安装已完成。请关闭安装程序。 + + +- +- Cancel the setup process without changing the system. +- @tooltip +- 取消安装过程,保持系统不变。 ++ ++ Cancel the setup process without changing the system. ++ @tooltip ++ 取消安装过程,保持系统不变。 + + +- +- Cancel the installation process without changing the system. +- @tooltip +- 取消安装过程,不改变系统。 ++ ++ Cancel the installation process without changing the system. ++ @tooltip ++ 取消安装过程,不改变系统。 + + +- +- &Next +- @button +- 下一步(&N) ++ ++ &Next ++ @button ++ 下一步(&N) + + +- +- &Back +- @button +- 后退(&B) ++ ++ &Back ++ @button ++ 后退(&B) + + +- +- &Done +- @button +- &完成 ++ ++ &Done ++ @button ++ &完成 + + +- +- &Cancel +- @button +- 取消(&C) ++ ++ &Cancel ++ @button ++ 取消(&C) + + +- +- Cancel Setup? +- @title +- 取消配置? ++ ++ Cancel Setup? ++ @title ++ 取消配置? + + +- +- Cancel Installation? +- @title +- 取消安装? ++ ++ Cancel Installation? ++ @title ++ 取消安装? + + +- +- Do you really want to cancel the current setup process? ++ ++ Do you really want to cancel the current setup process? + The setup program will quit and all changes will be lost. +- 确定要取消当前安装吗? ++ 确定要取消当前安装吗? + 安装程序将会退出,所有修改都会丢失。 + + +- +- Do you really want to cancel the current install process? ++ ++ Do you really want to cancel the current installation process? ++The system will reboot or you can enter the debug mode for further investigation. ++ 您确定要退出当前的安装过程吗? ++系统将重启,或者您可以进入调试模式进行进一步的调查。 ++ ++ ++ ++ &Reboot ++ @button ++ 重启(&R) ++ ++ ++ ++ &Try Now ++ @button ++ 立即试用(&D) ++ ++ ++ Do you really want to cancel the current install process? + The installer will quit and all changes will be lost. +- 确定要取消当前的安装吗? ++ 确定要取消当前的安装吗? + 安装程序将退出,所有修改都会丢失。 + +- +- ++ ++ + CalamaresPython::Helper + +- +- Unknown exception type +- @error +- 未知异常类型 ++ ++ Unknown exception type ++ @error ++ 未知异常类型 + + +- +- Unparseable Python error +- @error +- 无法解析的 Python 错误 ++ ++ Unparseable Python error ++ @error ++ 无法解析的 Python 错误 + + +- +- Unparseable Python traceback +- @error +- 无法解析的 Python 回溯 ++ ++ Unparseable Python traceback ++ @error ++ 无法解析的 Python 回溯 + + +- +- Unfetchable Python error +- @error +- 无法获取的 Python 错误。 ++ ++ Unfetchable Python error ++ @error ++ 无法获取的 Python 错误。 + +- +- ++ ++ + CalamaresWindow + +- +- %1 Setup Program +- %1 安装程序 ++ ++ ++ %1 Setup Program ++ %1 安装程序 + + +- +- %1 Installer +- %1 安装程序 ++ ++ ++ %1 Installer ++ %1 安装程序 + +- +- ++ ++ + ChangeFilesystemLabelJob + +- +- Set filesystem label on %1 +- @title +- 在 %1 设置文件系统卷标。 ++ ++ Set filesystem label on %1 ++ @title ++ 在 %1 设置文件系统卷标。 + + +- +- Set filesystem label <strong>%1</strong> to partition <strong>%2</strong> +- @info +- 设置文件系统卷标 <strong>%1</strong> 至分区 <strong>%2</strong>。 ++ ++ Set filesystem label <strong>%1</strong> to partition <strong>%2</strong> ++ @info ++ 设置文件系统卷标 <strong>%1</strong> 至分区 <strong>%2</strong>。 + + +- +- Setting filesystem label <strong>%1</strong> to partition <strong>%2</strong>… +- @status +- 正在设置文件系统卷标 <strong>%1</strong> 至分区 <strong>%2</strong> 中…… ++ ++ Setting filesystem label <strong>%1</strong> to partition <strong>%2</strong>… ++ @status ++ 正在设置文件系统卷标 <strong>%1</strong> 至分区 <strong>%2</strong> 中…… + + +- +- +- The installer failed to update partition table on disk '%1'. +- @info +- 安装程序更新磁盘“%1”分区表失败。 ++ ++ ++ The installer failed to update partition table on disk '%1'. ++ @info ++ 安装程序更新磁盘“%1”分区表失败。 + +- +- ++ ++ + CheckerContainer + +- +- Gathering system information... +- 正在收集系统信息 ... ++ ++ Gathering system information... ++ 正在收集系统信息 ... + +- +- ++ ++ + ChoicePage + +- +- Select storage de&vice: +- @label +- 选择存储器(&V): ++ ++ Select storage de&vice: ++ @label ++ 选择存储器(&V): + + +- +- +- +- +- Current: +- @label +- 当前: ++ ++ ++ ++ ++ Current: ++ @label ++ 当前: + + +- +- After: +- @label +- 之后: ++ ++ After: ++ @label ++ 之后: + + +- +- Reuse %1 as home partition for %2 +- @label +- 重复使用 %1 作为 %2 的 home 分区 ++ ++ Reuse %1 as home partition for %2 ++ @label ++ 重复使用 %1 作为 %2 的 home 分区 + + +- +- <strong>Select a partition to shrink, then drag the bottom bar to resize</strong> +- <strong>选择要缩小的分区,然后拖动底栏改变大小</strong> ++ ++ <strong>Select a partition to shrink, then drag the bottom bar to resize</strong> ++ <strong>选择要缩小的分区,然后拖动底栏改变大小</strong> + + +- +- %1 will be shrunk to %2MiB and a new %3MiB partition will be created for %4. +- @info, %1 is partition name, %4 is product name +- %1 将会缩减到 %2MiB,然后为 %4 创建一个 %3MiB 分区。 ++ ++ %1 will be shrunk to %2MiB and a new %3MiB partition will be created for %4. ++ @info, %1 is partition name, %4 is product name ++ %1 将会缩减到 %2MiB,然后为 %4 创建一个 %3MiB 分区。 + + +- +- <strong>Select a partition to install on</strong> +- @label +- <strong>选择要安装到的分区</strong> ++ ++ <strong>Select a partition to install on</strong> ++ @label ++ <strong>选择要安装到的分区</strong> + + +- +- An EFI system partition cannot be found anywhere on this system. Please go back and use manual partitioning to set up %1. +- @info, %1 is product name +- 在此系统上找不到任何 EFI 系统分区。请后退到上一步并使用手动分区配置 %1。 ++ ++ An EFI system partition cannot be found anywhere on this system. Please go back and use manual partitioning to set up %1. ++ @info, %1 is product name ++ 在此系统上找不到任何 EFI 系统分区。请后退到上一步并使用手动分区配置 %1。 + + +- +- The EFI system partition at %1 will be used for starting %2. +- @info, %1 is partition path, %2 is product name +- %1 处的 EFI 系统分区将被用来启动 %2。 ++ ++ The EFI system partition at %1 will be used for starting %2. ++ @info, %1 is partition path, %2 is product name ++ %1 处的 EFI 系统分区将被用来启动 %2。 + + +- +- EFI system partition: +- @label +- EFI 系统分区: ++ ++ EFI system partition: ++ @label ++ EFI 系统分区: + + +- +- This storage device does not seem to have an operating system on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. +- 这个存储器上似乎还没有操作系统。您想要怎么做?<br/>在任何更改应用到存储器上前,您都可以重新查看并确认您的选择。 ++ ++ This storage device does not seem to have an operating system on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. ++ 这个存储器上似乎还没有操作系统。您想要怎么做?<br/>在任何更改应用到存储器上前,您都可以重新查看并确认您的选择。 + + +- +- +- +- +- <strong>Erase disk</strong><br/>This will <font color="red">delete</font> all data currently present on the selected storage device. +- <strong>抹除磁盘</strong><br/>这将会<font color="red">删除</font>目前选定的存储器上所有的数据。 ++ ++ ++ ++ ++ <strong>Automatic partitioning</strong><br/>This will <font color="red">delete</font> all data currently present on the selected storage device. ++ <strong>自动分区</strong><br/>这将会<font color="red">删除</font>目前选定的存储器上所有的数据。 + + +- +- +- +- +- <strong>Install alongside</strong><br/>The installer will shrink a partition to make room for %1. +- <strong>并存安装</strong><br/>安装程序将会缩小一个分区,为 %1 腾出空间。 ++ ++ ++ ++ ++ <strong>Install alongside</strong><br/>The installer will shrink a partition to make room for %1. ++ <strong>并存安装</strong><br/>安装程序将会缩小一个分区,为 %1 腾出空间。 + + +- +- +- +- +- <strong>Replace a partition</strong><br/>Replaces a partition with %1. +- <strong>取代一个分区</strong><br/>以 %1 <strong>替代</strong>一个分区。 ++ ++ ++ ++ ++ <strong>Replace a partition</strong><br/>Replaces a partition with %1. ++ <strong>取代一个分区</strong><br/>以 %1 <strong>替代</strong>一个分区。 + + +- +- This storage device has %1 on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. +- 这个存储器上已经有 %1 了。您想要怎么做?<br/>在任何更改应用到存储器上前,您都可以重新查看并确认您的选择。 ++ ++ This storage device has %1 on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. ++ 这个存储器上已经有 %1 了。您想要怎么做?<br/>在任何更改应用到存储器上前,您都可以重新查看并确认您的选择。 + + +- +- This storage device already has an operating system on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. +- 这个存储器上已经有一个操作系统了。您想要怎么做?<br/>在任何更改应用到存储器上前,您都可以重新查看并确认您的选择。 ++ ++ This storage device already has an operating system on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. ++ 这个存储器上已经有一个操作系统了。您想要怎么做?<br/>在任何更改应用到存储器上前,您都可以重新查看并确认您的选择。 + + +- +- This storage device has multiple operating systems on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. +- 这个存储器上已经有多个操作系统了。您想要怎么做?<br/>在任何更改应用到存储器上前,您都可以重新查看并确认您的选择。 ++ ++ This storage device has multiple operating systems on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. ++ 这个存储器上已经有多个操作系统了。您想要怎么做?<br/>在任何更改应用到存储器上前,您都可以重新查看并确认您的选择。 + + +- +- This storage device already has an operating system on it, but the partition table <strong>%1</strong> is different from the needed <strong>%2</strong>.<br/> +- 此存储设备已经有操作系统,但是分区表 <strong>%1</strong> 与所需的 <strong>%2</strong> 不同。<br/> ++ ++ This storage device already has an operating system on it, but the partition table <strong>%1</strong> is different from the needed <strong>%2</strong>.<br/> ++ 此存储设备已经有操作系统,但是分区表 <strong>%1</strong> 与所需的 <strong>%2</strong> 不同。<br/> + + +- +- This storage device has one of its partitions <strong>mounted</strong>. +- @info +- 此存储设备 <strong>已挂载</strong>其中一个分区。 ++ ++ This storage device has one of its partitions <strong>mounted</strong>. ++ @info ++ 此存储设备 <strong>已挂载</strong>其中一个分区。 + + +- +- This storage device is a part of an <strong>inactive RAID</strong> device. +- @info +- 该存储设备是 <strong>非活动RAID</strong> 设备的一部分。 ++ ++ This storage device is a part of an <strong>inactive RAID</strong> device. ++ @info ++ 该存储设备是 <strong>非活动RAID</strong> 设备的一部分。 + + +- +- No swap +- @label +- 无 Swap 交换分区 ++ ++ No swap ++ @label ++ 无 Swap 交换分区 + + +- +- Reuse swap +- @label +- 重新使用 Swap 交换分区 ++ ++ Reuse swap ++ @label ++ 重新使用 Swap 交换分区 + + +- +- Swap (no Hibernate) +- @label +- 交换分区(无休眠) ++ ++ Swap (no Hibernate) ++ @label ++ 交换分区(无休眠) + + +- +- Swap (with Hibernate) +- @label +- 交换分区(带休眠) ++ ++ Swap (with Hibernate) ++ @label ++ 交换分区(带休眠) + + +- +- Swap to file +- @label +- 交换到文件 ++ ++ Swap to file ++ @label ++ 交换到文件 + + +- +- <strong>Manual partitioning</strong><br/>You can create or resize partitions yourself. +- <strong>手动分区</strong><br/>您可以自行创建或重新调整分区大小。 ++ ++ <strong>Manual partitioning</strong><br/>You can create or resize partitions yourself. ++ <strong>手动分区</strong><br/>您可以自行创建或重新调整分区大小。 + + +- +- Bootloader location: +- @label +- 启动加载器(Bootloader)位置: ++ ++ Bootloader location: ++ @label ++ 启动加载器(Bootloader)位置: + +- +- ++ ++ + ClearMountsJob + +- +- Successfully unmounted %1. +- 成功卸载了 %1。 ++ ++ Successfully unmounted %1. ++ 成功卸载了 %1。 + + +- +- Successfully disabled swap %1. +- 成功禁用了交换空间 %1。 ++ ++ Successfully disabled swap %1. ++ 成功禁用了交换空间 %1。 + + +- +- Successfully cleared swap %1. +- 成功清理了交换空间 %1。 ++ ++ Successfully cleared swap %1. ++ 成功清理了交换空间 %1。 + + +- +- Successfully closed mapper device %1. +- 成功关闭了映射设备 %1。 ++ ++ Successfully closed mapper device %1. ++ 成功关闭了映射设备 %1。 + + +- +- Successfully disabled volume group %1. +- 成功禁用了卷组 %1。 ++ ++ Successfully disabled volume group %1. ++ 成功禁用了卷组 %1。 + + +- +- Clear mounts for partitioning operations on %1 +- @title +- 清理挂载了的分区以在 %1 进行分区操作 ++ ++ Clear mounts for partitioning operations on %1 ++ @title ++ 清理挂载了的分区以在 %1 进行分区操作 + + +- +- Clearing mounts for partitioning operations on %1… +- @status +- 正在清理挂载了的分区以在 %1 进行分区操作… ++ ++ Clearing mounts for partitioning operations on %1… ++ @status ++ 正在清理挂载了的分区以在 %1 进行分区操作… + + +- +- Cleared all mounts for %1 +- 已清除 %1 的所有挂载点 ++ ++ Cleared all mounts for %1 ++ 已清除 %1 的所有挂载点 + +- +- ++ ++ + ClearTempMountsJob + +- +- +- Clearing all temporary mounts… +- @status +- 正在清除所有临时挂载点… ++ ++ ++ Clearing all temporary mounts… ++ @status ++ 正在清除所有临时挂载点… + + +- +- Cleared all temporary mounts. +- 所有临时挂载点都已经清除。 ++ ++ Cleared all temporary mounts. ++ 所有临时挂载点都已经清除。 + +- +- ++ ++ + CommandList + +- +- Could not run command. +- 无法运行命令 ++ ++ Could not run command. ++ 无法运行命令 + + +- +- The commands use variables that are not defined. Missing variables are: %1. +- 这些命令使用了未定义的变量。缺少的变量是: %1。 ++ ++ The commands use variables that are not defined. Missing variables are: %1. ++ 这些命令使用了未定义的变量。缺少的变量是: %1。 + +- +- ++ ++ + Config + +- +- Setup Failed +- @title +- 初始化失败 ++ ++ Setup Failed ++ @title ++ 初始化失败 ++ ++ ++ ++ Installation Failed ++ @title ++ 安装失败 + + +- +- Installation Failed +- @title +- 安装失败 ++ ++ The setup of %1 did not complete successfully. ++ @info ++ %1的设置未成功完成 + + +- +- The setup of %1 did not complete successfully. +- @info +- %1的设置未成功完成 ++ ++ The installation of %1 did not complete successfully. ++ @info ++ %1的安装未成功完成 + + +- +- The installation of %1 did not complete successfully. +- @info +- %1的安装未成功完成 ++ ++ Setup Complete ++ @title ++ 安装完成 + + +- +- Setup Complete +- @title +- 安装完成 ++ ++ Installation Complete ++ @title ++ 安装完成 + + +- +- Installation Complete +- @title +- 安装完成 ++ ++ The setup of %1 is complete. ++ @info ++ %1 安装完成。 + + +- +- The setup of %1 is complete. +- @info +- %1 安装完成。 ++ ++ The installation of %1 is complete. ++ @info ++ %1 的安装操作已完成。 + + +- +- The installation of %1 is complete. +- @info +- %1 的安装操作已完成。 ++ ++ Keyboard model has been set to %1<br/>. ++ @label, %1 is keyboard model, as in Apple Magic Keyboard ++ 键盘型号已设置为 %1<br/>。 + + +- +- Keyboard model has been set to %1<br/>. +- @label, %1 is keyboard model, as in Apple Magic Keyboard +- 键盘型号已设置为 %1<br/>。 ++ ++ Keyboard layout has been set to %1/%2. ++ @label, %1 is layout, %2 is layout variant ++ 键盘布局已设置为 %1/%2。 + + +- +- Keyboard layout has been set to %1/%2. +- @label, %1 is layout, %2 is layout variant +- 键盘布局已设置为 %1/%2。 ++ ++ Set timezone to %1/%2 ++ @action ++ 设置时区为 %1/%2 + + +- +- Set timezone to %1/%2 +- @action +- 设置时区为 %1/%2 ++ ++ The system language will be set to %1. ++ @info ++ 系统语言将设置为 %1。 + + +- +- The system language will be set to %1. +- @info +- 系统语言将设置为 %1。 ++ ++ The numbers and dates locale will be set to %1. ++ @info ++ 数字和日期格式将设置为 %1。 + + +- +- The numbers and dates locale will be set to %1. +- @info +- 数字和日期地域将设置为 %1。 ++ ++ The timezone will be set to %1. ++ @info ++ 设置时区为 %1. + + +- +- Network Installation. (Disabled: Incorrect configuration) +- 网络安装。(因错误的配置而被禁用) ++ The timezone whill be set to %1. ++ @info ++ 设置时区为 %1。 + + +- +- Network Installation. (Disabled: Received invalid groups data) +- 网络安装。(因收到无效组数据而被禁用) ++ ++ Network Installation. (Disabled: Incorrect configuration) ++ 网络安装。(因错误的配置而被禁用) + + +- +- Network Installation. (Disabled: Internal error) +- 网络安装。(因内部错误而被禁用) ++ ++ Network Installation. (Disabled: Received invalid groups data) ++ 网络安装。(因收到无效组数据而被禁用) + + +- +- Network Installation. (Disabled: Unable to fetch package lists, check your network connection) +- 网络安装。(因无法获取软件包列表而被禁用,请检查网络连接) ++ ++ Network Installation. (Disabled: Internal error) ++ 网络安装。(因内部错误而被禁用) + + +- +- Network Installation. (Disabled: No package list) +- 网络安装。(因无软件包列表而被禁用) ++ ++ Network Installation. (Disabled: Unable to fetch package lists, check your network connection) ++ 网络安装。(因无法获取软件包列表而被禁用,请检查网络连接) + + +- +- Package selection +- 软件包选择 ++ ++ Network Installation. (Disabled: No package list) ++ 网络安装。(因无软件包列表而被禁用) + + +- +- Package Selection +- 软件包选择 ++ ++ Package selection ++ 软件包选择 + + +- +- Please pick a product from the list. The selected product will be installed. +- 请在列表中选一个产品。被选中的产品将会被安装。 ++ ++ Package Selection ++ 软件包选择 + + +- +- Packages +- 软件包 ++ ++ Please pick a product from the list. The selected product will be installed. ++ 请在列表中选一个产品。被选中的产品将会被安装。 + + +- +- Install option: <strong>%1</strong> +- 安装选项:<strong>%1</strong> ++ ++ Packages ++ 桌面 + + +- +- None +- ++ ++ Install option: <strong>%1</strong> ++ 安装选项:<strong>%1</strong> + + +- +- Summary +- @label +- 摘要 ++ ++ None ++ + + +- +- This is an overview of what will happen once you start the setup procedure. +- 预览——当你启动安装过程,以下行为将被执行 ++ ++ Summary ++ @label ++ 摘要 + + +- +- This is an overview of what will happen once you start the install procedure. +- 这是您开始安装后所会发生的事情的概览。 ++ ++ This is an overview of what will happen once you start the setup procedure. ++ 预览——当你启动安装过程,以下行为将被执行 + + +- +- Your username is too long. +- 用户名太长。 ++ ++ This is an overview of what will happen once you start the install procedure. ++ 这是您开始安装后所会发生的事情的概览。 + + +- +- Your username must start with a lowercase letter or underscore. +- 用户名必须以小写字母或下划线"_"开头 ++ ++ Your username is too long. ++ 用户名太长。 + + +- +- Only lowercase letters, numbers, underscore and hyphen are allowed. +- 只允许小写字母、数组、下划线"_" 和 连字符"-" ++ ++ Your username must start with a lowercase letter or underscore. ++ 用户名必须以小写字母或下划线"_"开头 + + +- +- '%1' is not allowed as username. +- '%1' 不允许作为用户名。 ++ ++ Only lowercase letters, numbers, underscore and hyphen are allowed. ++ 只允许小写字母、数组、下划线"_" 和 连字符"-" + + +- +- Your hostname is too short. +- 主机名太短。 ++ ++ '%1' is not allowed as username. ++ '%1' 不允许作为用户名。 + + +- +- Your hostname is too long. +- 主机名太长。 ++ ++ Your hostname is too short. ++ 主机名太短。 + + +- +- '%1' is not allowed as hostname. +- '%1' 不允许作为主机名。 ++ ++ Your hostname is too long. ++ 主机名太长。 + + +- +- Only letters, numbers, underscore and hyphen are allowed. +- 只允许字母、数组、下划线"_" 和 连字符"-" ++ ++ '%1' is not allowed as hostname. ++ '%1' 不允许作为主机名。 + + +- +- Your passwords do not match! +- 密码不匹配! ++ ++ Only letters, numbers, underscore and hyphen are allowed. ++ 只允许字母、数组、下划线"_" 和 连字符"-" + + +- +- OK! +- 确定 ++ ++ Your passwords do not match! ++ 密码不匹配! + + +- +- This computer does not satisfy the minimum requirements for setting up %1.<br/>Setup cannot continue. +- 此计算机不满足安装 %1 的最低需求。<br/> 初始化无法继续。 ++ ++ OK! ++ 确定 + + +- +- This computer does not satisfy the minimum requirements for installing %1.<br/>Installation cannot continue. +- 此计算机木不满足安装 %1 的最低需求。<br/> 安装无法继续。 ++ ++ This computer does not satisfy the minimum requirements for setting up %1.<br/>Setup cannot continue. ++ 此计算机不满足安装 %1 的最低需求。<br/> 初始化无法继续。 + + +- +- This computer does not satisfy some of the recommended requirements for setting up %1.<br/>Setup can continue, but some features might be disabled. +- 此计算机不满足安装 %1 的部分推荐配置。<br/>初始化可以继续,但是一些功能可能会被禁用。 ++ ++ This computer does not satisfy the minimum requirements for installing %1.<br/>Installation cannot continue. ++ 此计算机木不满足安装 %1 的最低需求。<br/> 安装无法继续。 + + +- +- This computer does not satisfy some of the recommended requirements for installing %1.<br/>Installation can continue, but some features might be disabled. +- 此计算机不满足安装 %1 的部分推荐配置。<br/>安装可以继续,但是一些功能可能会被禁用。 ++ ++ This computer does not satisfy some of the recommended requirements for setting up %1.<br/>Setup can continue, but some features might be disabled. ++ 此计算机不满足安装 %1 的部分推荐配置。<br/>初始化可以继续,但是一些功能可能会被禁用。 + + +- +- This program will ask you some questions and set up %2 on your computer. +- 本程序将会问您一些问题并在您的电脑上安装及设置 %2 。 ++ ++ This computer does not satisfy some of the recommended requirements for installing %1.<br/>Installation can continue, but some features might be disabled. ++ 此计算机不满足安装 %1 的部分推荐配置。<br/>安装可以继续,但是一些功能可能会被禁用。 + + +- +- <h1>Welcome to the Calamares setup program for %1</h1> +- <h1>欢迎使用 %1 的 Calamares 安装程序</h1> ++ This program will ask you some questions and set up %2 on your computer. ++ 本程序将会问您一些问题并在您的电脑上安装及设置 %2 。 + + +- +- <h1>Welcome to %1 setup</h1> +- <h1>欢迎使用 %1 设置</h1> ++ ++ <h1>Welcome to the Calamares setup program for %1</h1> ++ <h1>欢迎使用 %1 的 Calamares 安装程序</h1> + + +- +- <h1>Welcome to the Calamares installer for %1</h1> +- <h1>欢迎使用 %1 的 Calamares 安装程序</h1> ++ ++ <h1>Welcome to %1 setup</h1> ++ <h1>欢迎使用 %1 设置</h1> + + +- +- <h1>Welcome to the %1 installer</h1> +- <h1>欢迎使用 %1 安装程序</h1> ++ ++ <h1>Welcome to the Calamares installer for %1</h1> ++ <h1>欢迎使用 %1 的 Calamares 安装程序</h1> + +- +- ++ ++ ++ <h1>Welcome to the %1 installer</h1> ++ <h1>欢迎使用 %1 安装程序</h1> + -+ -+ -+ Zagreb -+ tz_names -+ 札格雷布 ++ ++ + ContextualProcessJob + +- +- Performing contextual processes' job… +- @status +- 正在执行相关流程工作... ++ ++ Performing contextual processes' job… ++ @status ++ 正在执行相关流程工作... + +- +- ++ ++ + CreatePartitionDialog + +- +- Create a Partition +- 创建分区 ++ ++ Create a Partition ++ 创建分区 + + +- +- Si&ze: +- 大小(&Z): ++ ++ Si&ze: ++ 大小(&Z): + + +- +- MiB +- MiB ++ ++ MiB ++ MiB + + +- +- Partition &Type: +- 分区类型(&T): ++ ++ Partition &Type: ++ 分区类型(&T): + + +- +- Primar&y +- 主分区(&Y) ++ ++ Primar&y ++ 主分区(&Y) + + +- +- E&xtended +- 扩展分区(&E) ++ ++ E&xtended ++ 扩展分区(&E) + + +- +- Fi&le System: +- 文件系统 (&L): ++ ++ Fi&le System: ++ 文件系统 (&L): + + +- +- LVM LV name +- LVM 逻辑卷名称 ++ ++ LVM LV name ++ LVM 逻辑卷名称 + + +- +- &Mount Point: +- 挂载点(&M): ++ ++ &Mount Point: ++ 挂载点(&M): + + +- +- Flags: +- 标记: ++ ++ Flags: ++ 标记: + + +- +- Label for the filesystem +- 此文件系统的卷标名 ++ ++ Label for the filesystem ++ 此文件系统的卷标名 + + +- +- FS Label: +- 文件系统卷标 ++ ++ FS Label: ++ 文件系统卷标 + + +- +- En&crypt +- @action +- 加密(&C) ++ ++ En&crypt ++ @action ++ 加密(&C) + + +- +- Logical +- @label +- 逻辑分区 ++ ++ Logical ++ @label ++ 逻辑分区 + + +- +- Primary +- @label +- 主分区 ++ ++ Primary ++ @label ++ 主分区 + + +- +- GPT +- @label +- GPT ++ ++ GPT ++ @label ++ GPT + + +- +- Mountpoint already in use. Please select another one. +- @info +- 挂载点已被占用。请选择另一个。 ++ ++ Mountpoint already in use. Please select another one. ++ @info ++ 挂载点已被占用。请选择另一个。 + + +- +- Mountpoint must start with a <tt>/</tt>. +- @info +- 挂载点必须以<tt>/</tt>开头。 ++ ++ Mountpoint must start with a <tt>/</tt>. ++ @info ++ 挂载点必须以<tt>/</tt>开头。 + +- +- ++ ++ + CreatePartitionJob + +- +- Create new %1MiB partition on %3 (%2) with entries %4 +- @title +- 在 %3 (%2) 上使用项目 %4 建立新的 %1MiB 分区 ++ ++ Create new %1MiB partition on %3 (%2) with entries %4 ++ @title ++ 在 %3 (%2) 上使用项目 %4 建立新的 %1MiB 分区 + + +- +- Create new %1MiB partition on %3 (%2) +- @title +- 在 %3 (%2) 上建立新的 %1MiB 分区 ++ ++ Create new %1MiB partition on %3 (%2) ++ @title ++ 在 %3 (%2) 上建立新的 %1MiB 分区 + + +- +- Create new %2MiB partition on %4 (%3) with file system %1 +- @title +- 在 %4 (%3) 上创建新的 %2MiB 分区,文件系统为 %1 ++ ++ Create new %2MiB partition on %4 (%3) with file system %1 ++ @title ++ 在 %4 (%3) 上创建新的 %2MiB 分区,文件系统为 %1 + + +- +- Create new <strong>%1MiB</strong> partition on <strong>%3</strong> (%2) with entries <em>%4</em> +- @info +- 在 <strong>%3</strong> (%2) 上使用 <em>%4</em> 建立新的 <strong>%1MiB</strong> 分区 ++ ++ Create new <strong>%1MiB</strong> partition on <strong>%3</strong> (%2) with entries <em>%4</em> ++ @info ++ 在 <strong>%3</strong> (%2) 上使用 <em>%4</em> 建立新的 <strong>%1MiB</strong> 分区 + + +- +- Create new <strong>%1MiB</strong> partition on <strong>%3</strong> (%2) +- @info +- 在<strong>%3</strong>(%2)上创建新的<strong>%1MiB</strong>分区 ++ ++ Create new <strong>%1MiB</strong> partition on <strong>%3</strong> (%2) ++ @info ++ 在<strong>%3</strong>(%2)上创建新的<strong>%1MiB</strong>分区 + + +- +- Create new <strong>%2MiB</strong> partition on <strong>%4</strong> (%3) with file system <strong>%1</strong> +- @info +- 在<strong>%4</strong>(%3)上使用文件系统<strong>%1</strong>创建一个<strong>%2MiB</strong>的%1分区 ++ ++ Create new <strong>%2MiB</strong> partition on <strong>%4</strong> (%3) with file system <strong>%1</strong> ++ @info ++ 在<strong>%4</strong>(%3)上使用文件系统<strong>%1</strong>创建一个<strong>%2MiB</strong>的%1分区 + + +- +- +- Creating new %1 partition on %2… +- @status +- 正在 %2 上创建新的 %1 分区… ++ ++ ++ Creating new %1 partition on %2… ++ @status ++ 正在 %2 上创建新的 %1 分区… + + +- +- The installer failed to create partition on disk '%1'. +- @info +- 安装程序在磁盘“%1”创建分区失败。 ++ ++ The installer failed to create partition on disk '%1'. ++ @info ++ 安装程序在磁盘“%1”创建分区失败。 + +- +- ++ ++ + CreatePartitionTableDialog + +- +- Create Partition Table +- 创建分区表 ++ ++ Create Partition Table ++ 创建分区表 + + +- +- Creating a new partition table will delete all existing data on the disk. +- 创建新分区表将删除磁盘上所有已有数据。 ++ ++ Creating a new partition table will delete all existing data on the disk. ++ 创建新分区表将删除磁盘上所有已有数据。 + + +- +- What kind of partition table do you want to create? +- 您想要创建哪种分区表? ++ ++ What kind of partition table do you want to create? ++ 您想要创建哪种分区表? + + +- +- Master Boot Record (MBR) +- 主引导记录 (MBR) ++ ++ Master Boot Record (MBR) ++ 主引导记录 (MBR) + + +- +- GUID Partition Table (GPT) +- GUID 分区表 (GPT) ++ ++ GUID Partition Table (GPT) ++ GUID 分区表 (GPT) + +- +- ++ ++ + CreatePartitionTableJob + +- +- +- Creating new %1 partition table on %2… +- @status +- 正在 %2 上创建新的 %1 分区表… ++ ++ ++ Creating new %1 partition table on %2… ++ @status ++ 正在 %2 上创建新的 %1 分区表… + + +- +- Creating new <strong>%1</strong> partition table on <strong>%2</strong> (%3)… +- @status +- 正在在 <strong>%2</strong> (%3) 上创建新的 <strong>%1</strong> 分区表… ++ ++ Creating new <strong>%1</strong> partition table on <strong>%2</strong> (%3)… ++ @status ++ 正在在 <strong>%2</strong> (%3) 上创建新的 <strong>%1</strong> 分区表… + + +- +- The installer failed to create a partition table on %1. +- 安装程序于 %1 创建分区表失败。 ++ ++ The installer failed to create a partition table on %1. ++ 安装程序于 %1 创建分区表失败。 + +- +- ++ ++ + CreateUserJob + +- +- Create user %1 +- 创建用户 %1 ++ ++ Create user %1 ++ 创建用户 %1 + + +- +- Create user <strong>%1</strong> +- 创建用户 <strong>%1</strong> ++ ++ Create user <strong>%1</strong> ++ 创建用户 <strong>%1</strong> + + +- +- +- Creating user %1… +- @status +- 创建用户 %1… ++ ++ ++ Creating user %1… ++ @status ++ 创建用户 %1… + + +- +- Preserving home directory… +- @status +- 保留家目录… ++ ++ Preserving home directory… ++ @status ++ 保留家目录… + + +- +- Configuring user %1 +- @status +- 配置用户 %1 ++ ++ Configuring user %1 ++ @status ++ 配置用户 %1 + + +- +- Setting file permissions… +- @status +- 设置文件权限… ++ ++ Setting file permissions… ++ @status ++ 设置文件权限… + +- +- ++ ++ + CreateVolumeGroupDialog + +- +- Create Volume Group +- @title +- 创建存储组 ++ ++ Create Volume Group ++ @title ++ 创建存储组 + +- +- ++ ++ + CreateVolumeGroupJob + +- +- +- Creating new volume group named %1… +- @status +- 新建名为 %1 的分卷组… ++ ++ ++ Creating new volume group named %1… ++ @status ++ 新建名为 %1 的分卷组… + + +- +- Creating new volume group named <strong>%1</strong>… +- @status +- 正在创建名为 <strong>%1</strong>的分卷组… ++ ++ Creating new volume group named <strong>%1</strong>… ++ @status ++ 正在创建名为 <strong>%1</strong>的分卷组… + + +- +- The installer failed to create a volume group named '%1'. +- 安装器未能创建名为'%1'的分卷组 ++ ++ The installer failed to create a volume group named '%1'. ++ 安装器未能创建名为'%1'的分卷组 + +- +- ++ ++ + DeactivateVolumeGroupJob + +- +- +- Deactivating volume group named %1… +- @status +- 正在停用分卷组 %1… ++ ++ ++ Deactivating volume group named %1… ++ @status ++ 正在停用分卷组 %1… + + +- +- Deactivating volume group named <strong>%1</strong>… +- @status +- 正在停用分卷组<strong>%1</strong>… ++ ++ Deactivating volume group named <strong>%1</strong>… ++ @status ++ 正在停用分卷组<strong>%1</strong>… + + +- +- The installer failed to deactivate a volume group named %1. +- 安装器未能创建名为'%1'的分卷组 ++ ++ The installer failed to deactivate a volume group named %1. ++ 安装器未能创建名为'%1'的分卷组 + +- +- ++ ++ + DeletePartitionJob + +- +- +- Deleting partition %1… +- @status +- 正在删除分区 %1… ++ ++ ++ Deleting partition %1… ++ @status ++ 正在删除分区 %1… + + +- +- Deleting partition <strong>%1</strong>… +- @status +- 删除分区 <strong>%1</strong>… ++ ++ Deleting partition <strong>%1</strong>… ++ @status ++ 删除分区 <strong>%1</strong>… + + +- +- The installer failed to delete partition %1. +- 安装程序删除分区 %1 失败。 ++ ++ The installer failed to delete partition %1. ++ 安装程序删除分区 %1 失败。 + +- +- ++ ++ + DeviceInfoWidget + +- +- <br><br>This partition table type is only advisable on older systems which start from a <strong>BIOS</strong> boot environment. GPT is recommended in most other cases.<br><br><strong>Warning:</strong> the MBR partition table is an obsolete MS-DOS era standard.<br>Only 4 <em>primary</em> partitions may be created, and of those 4, one can be an <em>extended</em> partition, which may in turn contain many <em>logical</em> partitions. +- <br><br>此分区表类型只建议用于使用 <strong>BIOS</strong> 引导环境的较旧系统,否则一般建议使用 GPT。<br> ++ ++ <br><br>This partition table type is only advisable on older systems which start from a <strong>BIOS</strong> boot environment. GPT is recommended in most other cases.<br><br><strong>Warning:</strong> the MBR partition table is an obsolete MS-DOS era standard.<br>Only 4 <em>primary</em> partitions may be created, and of those 4, one can be an <em>extended</em> partition, which may in turn contain many <em>logical</em> partitions. ++ <br><br>此分区表类型只建议用于使用 <strong>BIOS</strong> 引导环境的较旧系统,否则一般建议使用 GPT。<br> + <strong>警告:</strong>MSDOS 分区表是一个有着重大缺点、已被弃用的标准。<br>MSDOS 分区表上只能创建 4 个<u>主要</u>分区,其中一个可以是<u>拓展</u>分区,此分区可以再分为许多<u>逻辑</u>分区。 + + +- +- <br><br>This is the recommended partition table type for modern systems which start from an <strong>EFI</strong> boot environment. +- <br><br>此分区表类型推荐用于使用 <strong>EFI</strong> 引导环境的系统。 ++ ++ <br><br>This is the recommended partition table type for modern systems which start from an <strong>EFI</strong> boot environment. ++ <br><br>此分区表类型推荐用于使用 <strong>EFI</strong> 引导环境的系统。 + + +- +- This is a <strong>loop</strong> device.<br><br>It is a pseudo-device with no partition table that makes a file accessible as a block device. This kind of setup usually only contains a single filesystem. +- 选定的存储器是一个 <strong>回环</strong> 设备。<br><br>此伪设备不含一个真正的分区表,它只是能让一个文件可如块设备那样访问。这种配置一般只包含一个单独的文件系统。 ++ ++ This is a <strong>loop</strong> device.<br><br>It is a pseudo-device with no partition table that makes a file accessible as a block device. This kind of setup usually only contains a single filesystem. ++ 选定的存储器是一个 <strong>回环</strong> 设备。<br><br>此伪设备不含一个真正的分区表,它只是能让一个文件可如块设备那样访问。这种配置一般只包含一个单独的文件系统。 + + +- +- This installer <strong>cannot detect a partition table</strong> on the selected storage device.<br><br>The device either has no partition table, or the partition table is corrupted or of an unknown type.<br>This installer can create a new partition table for you, either automatically, or through the manual partitioning page. +- 本安装程序在选定的存储器上<strong>探测不到分区表</strong>。<br><br>此设备要不是没有分区表,就是其分区表已毁损又或者是一个未知类型的分区表。<br>本安装程序将会为您建立一个新的分区表,可以自动或通过手动分割页面完成。 ++ ++ This installer <strong>cannot detect a partition table</strong> on the selected storage device.<br><br>The device either has no partition table, or the partition table is corrupted or of an unknown type.<br>This installer can create a new partition table for you, either automatically, or through the manual partitioning page. ++ 本安装程序在选定的存储器上<strong>探测不到分区表</strong>。<br><br>此设备要不是没有分区表,就是其分区表已毁损又或者是一个未知类型的分区表。<br>本安装程序将会为您建立一个新的分区表,可以自动或通过手动分割页面完成。 + + +- +- This device has a <strong>%1</strong> partition table. +- 此设备上有一个 <strong>%1</strong> 分区表。 ++ ++ This device has a <strong>%1</strong> partition table. ++ 此设备上有一个 <strong>%1</strong> 分区表。 + + +- +- The type of <strong>partition table</strong> on the selected storage device.<br><br>The only way to change the partition table type is to erase and recreate the partition table from scratch, which destroys all data on the storage device.<br>This installer will keep the current partition table unless you explicitly choose otherwise.<br>If unsure, on modern systems GPT is preferred. +- 目前选定存储器的<strong>分区表</strong>类型。<br><br>变更分区表类型的唯一方法就是抹除再重新从头建立分区表,这会破坏在该存储器上所有的数据。<br>除非您特别选择,否则本安装程序将会保留目前的分区表。<br>若不确定,在现代的系统上,建议使用 GPT。 ++ ++ The type of <strong>partition table</strong> on the selected storage device.<br><br>The only way to change the partition table type is to erase and recreate the partition table from scratch, which destroys all data on the storage device.<br>This installer will keep the current partition table unless you explicitly choose otherwise.<br>If unsure, on modern systems GPT is preferred. ++ 目前选定存储器的<strong>分区表</strong>类型。<br><br>变更分区表类型的唯一方法就是抹除再重新从头建立分区表,这会破坏在该存储器上所有的数据。<br>除非您特别选择,否则本安装程序将会保留目前的分区表。<br>若不确定,在现代的系统上,建议使用 GPT。 + +- +- ++ ++ + DeviceModel + +- +- %1 - %2 (%3) +- device[name] - size[number] (device-node[name]) +- %1 - %2 (%3) ++ ++ %1 - %2 (%3) ++ device[name] - size[number] (device-node[name]) ++ %1 - %2 (%3) + + +- +- %1 - (%2) +- device[name] - (device-node[name]) +- %1 - (%2) ++ ++ %1 - (%2) ++ device[name] - (device-node[name]) ++ %1 - (%2) + +- +- ++ ++ + DracutLuksCfgJob + +- +- Writing LUKS configuration for Dracut to %1… +- @status +- 正在将 Dracut 的 LUKS 配置写入到 %1… ++ ++ Writing LUKS configuration for Dracut to %1… ++ @status ++ 正在将 Dracut 的 LUKS 配置写入到 %1… + + +- +- Skipping writing LUKS configuration for Dracut: "/" partition is not encrypted +- @info +- Dracut 的 "/" 分区未加密,正在跳过写入 LUKS 配置 ++ ++ Skipping writing LUKS configuration for Dracut: "/" partition is not encrypted ++ @info ++ Dracut 的 "/" 分区未加密,正在跳过写入 LUKS 配置 + + +- +- Failed to open %1 +- @error +- 无法打开 %1 ++ ++ Failed to open %1 ++ @error ++ 无法打开 %1 + +- +- ++ ++ + DummyCppJob + +- +- Performing dummy C++ job… +- @status +- 正在执行虚拟 C++ 任务… ++ ++ Performing dummy C++ job… ++ @status ++ 正在执行虚拟 C++ 任务… + +- +- ++ ++ + EditExistingPartitionDialog + +- +- Edit Existing Partition +- 编辑已有分区 ++ ++ Edit Existing Partition ++ 编辑已有分区 + + +- +- Con&tent: +- 内容:(&T) ++ ++ Con&tent: ++ 内容:(&T) + + +- +- &Keep +- 保留 (&K) ++ ++ &Keep ++ 保留 (&K) + + +- +- Format +- 格式化 ++ ++ Format ++ 格式化 + + +- +- Warning: Formatting the partition will erase all existing data. +- 警告:格式化分区将删除所有已有数据。 ++ ++ Warning: Formatting the partition will erase all existing data. ++ 警告:格式化分区将删除所有已有数据。 + + +- +- &Mount Point: +- 挂载点(&M): ++ ++ &Mount Point: ++ 挂载点(&M): + + +- +- Si&ze: +- 尺寸 (&Z): ++ ++ Si&ze: ++ 尺寸 (&Z): + + +- +- MiB +- MiB ++ ++ MiB ++ MiB + + +- +- Fi&le System: +- 文件系统 (&L): ++ ++ Fi&le System: ++ 文件系统 (&L): + + +- +- Flags: +- 标记: ++ ++ Flags: ++ 标记: + + +- +- Label for the filesystem +- 此文件系统的卷标名 ++ ++ Label for the filesystem ++ 此文件系统的卷标名 + + +- +- FS Label: +- 文件系统卷标 ++ ++ FS Label: ++ 文件系统卷标 + + +- +- Passphrase for existing partition +- 既有分区的密码 ++ ++ Passphrase for existing partition ++ 既有分区的密码 + + +- +- Partition %1 could not be decrypted with the given passphrase.<br/><br/>Edit the partition again and give the correct passphrase or delete and create a new encrypted partition. +- 分区 %1 无法使用给定的密码解密。<br/><br/>请再次编辑分区并输入正确密码或删除并创建新的加密分区。 ++ ++ Partition %1 could not be decrypted with the given passphrase.<br/><br/>Edit the partition again and give the correct passphrase or delete and create a new encrypted partition. ++ 分区 %1 无法使用给定的密码解密。<br/><br/>请再次编辑分区并输入正确密码或删除并创建新的加密分区。 + +- +- ++ ++ + EncryptWidget + +- +- En&crypt system +- 加密系统 ++ ++ En&crypt system ++ 加密系统 + + +- +- Your system does not seem to support encryption well enough to encrypt the entire system. You may enable encryption, but performance may suffer. +- 您的系统似乎不太支持加密,无法对整个系统进行加密。您可以启用加密,但性能可能会受到影响。 ++ ++ Your system does not seem to support encryption well enough to encrypt the entire system. You may enable encryption, but performance may suffer. ++ 您的系统似乎不太支持加密,无法对整个系统进行加密。您可以启用加密,但性能可能会受到影响。 + + +- +- Passphrase +- 密码 ++ ++ Passphrase ++ 密码 + + +- +- Confirm passphrase +- 确认密码 ++ ++ Confirm passphrase ++ 确认密码 + + +- +- +- Please enter the same passphrase in both boxes. +- @tooltip +- 请在两个输入框中输入同样的密码。 ++ ++ ++ Please enter the same passphrase in both boxes. ++ @tooltip ++ 请在两个输入框中输入同样的密码。 + + +- +- Password must be a minimum of %1 characters. +- @tooltip +- 密码必须至少包含 %1 个字符。 ++ ++ Password must be a minimum of %1 characters. ++ @tooltip ++ 密码必须至少包含 %1 个字符。 + +- +- ++ ++ + ErrorDialog + +- +- Details: +- 详情: ++ ++ Details: ++ 详情: + + +- +- Would you like to paste the install log to the web? +- 需要将安装日志粘贴到网页吗? ++ ++ Would you like to paste the install log to the web? ++ 需要将安装日志粘贴到网页吗? + +- +- ++ ++ + FillGlobalStorageJob + +- +- Set partition information +- @title +- 设置分区信息 ++ ++ Set partition information ++ @title ++ 设置分区信息 + + +- +- Install %1 on <strong>new</strong> %2 system partition with features <em>%3</em> +- @info +- 在有 <em>%3</em> 特性的<strong>新</strong> %2 系統分区上安裝 %1 ++ ++ Install %1 on <strong>new</strong> %2 system partition with features <em>%3</em> ++ @info ++ 在有 <em>%3</em> 特性的<strong>新</strong> %2 系統分区上安裝 %1 + + +- +- Install %1 on <strong>new</strong> %2 system partition +- @info +- 在 <strong>新的</strong>系统分区 %2 上安装 %1 ++ ++ Install %1 on <strong>new</strong> %2 system partition ++ @info ++ 在 <strong>新的</strong>系统分区 %2 上安装 %1 + + +- +- Set up <strong>new</strong> %2 partition with mount point <strong>%1</strong> and features <em>%3</em> +- @info +- ++ ++ Set up <strong>new</strong> %2 partition with mount point <strong>%1</strong> and features <em>%3</em> ++ @info ++ + + +- +- Set up <strong>new</strong> %2 partition with mount point <strong>%1</strong>%3 +- @info +- 设置 <strong>新的</strong> 含挂载点 <strong>%1</strong>%3 的 %2 分区 ++ ++ Set up <strong>new</strong> %2 partition with mount point <strong>%1</strong>%3 ++ @info ++ 设置 <strong>新的</strong> 含挂载点 <strong>%1</strong>%3 的 %2 分区 + + +- +- Install %2 on %3 system partition <strong>%1</strong> with features <em>%4</em> +- @info +- ++ ++ Install %2 on %3 system partition <strong>%1</strong> with features <em>%4</em> ++ @info ++ + + +- +- Install %2 on %3 system partition <strong>%1</strong> +- @info +- 在 %3 系统分区 <strong>%1</strong> 上安装 %2 ++ ++ Install %2 on %3 system partition <strong>%1</strong> ++ @info ++ 在 %3 系统分区 <strong>%1</strong> 上安装 %2 + + +- +- Set up %3 partition <strong>%1</strong> with mount point <strong>%2</strong> and features <em>%4</em> +- @info +- ++ ++ Set up %3 partition <strong>%1</strong> with mount point <strong>%2</strong> and features <em>%4</em> ++ @info ++ + + +- +- Set up %3 partition <strong>%1</strong> with mount point <strong>%2</strong>%4… +- @info +- ++ ++ Set up %3 partition <strong>%1</strong> with mount point <strong>%2</strong>%4… ++ @info ++ + + +- +- Install boot loader on <strong>%1</strong>… +- @info +- 在 <strong>%1</strong>上安装引导程序… ++ ++ Install boot loader on <strong>%1</strong>… ++ @info ++ 在 <strong>%1</strong>上安装引导程序… + + +- +- Setting up mount points… +- @status +- 正在设置挂载点… ++ ++ Setting up mount points… ++ @status ++ 正在设置挂载点… + +- +- ++ ++ + FinishedPage + +- +- &Restart now +- 现在重启(&R) ++ ++ &Restart now ++ 现在重启(&R) + + +- +- <h1>All done.</h1><br/>%1 has been set up on your computer.<br/>You may now start using your new system. +- @info +- <h1>安装成功!</h1><br/>%1 已安装在您的电脑上了。<br/>您现在可以重新启动到新系统。 ++ ++ <h1>All done.</h1><br/>%1 has been set up on your computer.<br/>You may now start using your new system. ++ @info ++ <h1>安装成功!</h1><br/>%1 已安装在您的电脑上了。<br/>您现在可以重新启动到新系统。 + + +- +- <html><head/><body><p>When this box is checked, your system will restart immediately when you click on <span style="font-style:italic;">Done</span> or close the setup program.</p></body></html> +- @tooltip +- <html><head/><body><p>当选中此项时,系统会在您关闭安装器或点击 <span style=" font-style:italic;">完成</span> 按钮时立即重启</p></body></html> ++ ++ <html><head/><body><p>When this box is checked, your system will restart immediately when you click on <span style="font-style:italic;">Done</span> or close the setup program.</p></body></html> ++ @tooltip ++ <html><head/><body><p>当选中此项时,系统会在您关闭安装器或点击 <span style=" font-style:italic;">完成</span> 按钮时立即重启</p></body></html> + + +- +- <h1>All done.</h1><br/>%1 has been installed on your computer.<br/>You may now restart into your new system, or continue using the %2 Live environment. +- @info +- <h1>安装成功!</h1><br/>%1 已安装在您的电脑上了。<br/>您现在可以重新启动到新系统,或是继续使用 %2 Live 环境。 ++ ++ <h1>All done.</h1><br/>%1 has been installed on your computer.<br/>You may now restart into your new system, or continue using the %2 Live environment. ++ @info ++ <h1>安装成功!</h1><br/>%1 已安装在您的电脑上了。<br/>您现在可以重新启动到新系统,或是继续使用 %2 Live 环境。 + + +- +- <html><head/><body><p>When this box is checked, your system will restart immediately when you click on <span style="font-style:italic;">Done</span> or close the installer.</p></body></html> +- @tooltip +- <html><head/><body><p>当选中此项时,系统会在您关闭安装器或点击 <span style=" font-style:italic;">完成</span> 按钮时立即重启</p></body></html> ++ ++ <html><head/><body><p>When this box is checked, your system will restart immediately when you click on <span style="font-style:italic;">Done</span> or close the installer.</p></body></html> ++ @tooltip ++ <html><head/><body><p>当选中此项时,系统会在您关闭安装器或点击 <span style=" font-style:italic;">完成</span> 按钮时立即重启</p></body></html> + + +- +- <h1>Setup Failed</h1><br/>%1 has not been set up on your computer.<br/>The error message was: %2. +- @info, %1 is product name with version +- <h1>安装失败</h1><br/>%1 未在你的电脑上安装。<br/>错误信息:%2。 ++ ++ <h1>Setup Failed</h1><br/>%1 has not been set up on your computer.<br/>The error message was: %2. ++ @info, %1 is product name with version ++ <h1>安装失败</h1><br/>%1 未在你的电脑上安装。<br/>错误信息:%2。 + + +- +- <h1>Installation Failed</h1><br/>%1 has not been installed on your computer.<br/>The error message was: %2. +- @info, %1 is product name with version +- <h1>安装失败</h1><br/>%1 未在你的电脑上安装。<br/>错误信息:%2。 ++ ++ <h1>Installation Failed</h1><br/>%1 has not been installed on your computer.<br/>The error message was: %2. ++ @info, %1 is product name with version ++ <h1>安装失败</h1><br/>%1 未在你的电脑上安装。<br/>错误信息:%2。 + +- +- ++ ++ + FinishedQmlViewStep + +- +- Finish +- @label +- 结束 ++ ++ Finish ++ @label ++ 结束 + +- +- ++ ++ + FinishedViewStep + +- +- Finish +- @label +- 结束 ++ ++ Finish ++ @label ++ 结束 + +- +- ++ ++ + FormatPartitionJob + +- +- Format partition %1 (file system: %2, size: %3 MiB) on %4 +- @title +- 格式化在 %4 的分区 %1 (文件系统:%2,大小:%3 MB) ++ ++ Format partition %1 (file system: %2, size: %3 MiB) on %4 ++ @title ++ 格式化在 %4 的分区 %1 (文件系统:%2,大小:%3 MB) + + +- +- Format <strong>%3MiB</strong> partition <strong>%1</strong> with file system <strong>%2</strong> +- @info +- 以文件系统 <strong>%2</strong> 格式化 <strong>%3MB</strong> 的分区 <strong>%1</strong> ++ ++ Format <strong>%3MiB</strong> partition <strong>%1</strong> with file system <strong>%2</strong> ++ @info ++ 以文件系统 <strong>%2</strong> 格式化 <strong>%3MB</strong> 的分区 <strong>%1</strong> + + +- +- %1 (%2) +- partition label %1 (device path %2) +- %1(%2) ++ ++ %1 (%2) ++ partition label %1 (device path %2) ++ %1(%2) + + +- +- Formatting partition %1 with file system %2… +- @status +- 正在使用 %2 文件系统格式化分区 %1… ++ ++ Formatting partition %1 with file system %2… ++ @status ++ 正在使用 %2 文件系统格式化分区 %1… + + +- +- The installer failed to format partition %1 on disk '%2'. +- 安装程序格式化磁盘“%2”上的分区 %1 失败。 ++ ++ The installer failed to format partition %1 on disk '%2'. ++ 安装程序格式化磁盘“%2”上的分区 %1 失败。 + +- +- ++ ++ + GeneralRequirements + +- +- Please ensure the system has at least %1 GiB available drive space. +- 请确保系统有至少 %1 GiB 可用磁盘空间。 ++ ++ Please ensure the system has at least %1 GiB available drive space. ++ 请确保系统有至少 %1 GiB 可用磁盘空间。 + + +- +- Available drive space is all of the hard disks and SSDs connected to the system. +- 可用驱动器空间是连接到系统的所有硬盘和 SSD。 ++ ++ Available drive space is all of the hard disks and SSDs connected to the system. ++ 可用驱动器空间是连接到系统的所有硬盘和 SSD。 + + +- +- There is not enough drive space. At least %1 GiB is required. +- 没有足够的磁盘空间。至少需要 %1 GB。 ++ ++ There is not enough drive space. At least %1 GiB is required. ++ 没有足够的磁盘空间。至少需要 %1 GB。 + + +- +- has at least %1 GiB working memory +- 至少 %1 GB 可用内存 ++ ++ has at least %1 GiB working memory ++ 至少 %1 GB 可用内存 + + +- +- The system does not have enough working memory. At least %1 GiB is required. +- 系统没有足够的内存。至少需要 %1 GB。 ++ ++ The system does not have enough working memory. At least %1 GiB is required. ++ 系统没有足够的内存。至少需要 %1 GB。 + + +- +- is plugged in to a power source +- 已连接到电源 ++ ++ is plugged in to a power source ++ 已连接到电源 + + +- +- The system is not plugged in to a power source. +- 系统未连接到电源。 ++ ++ The system is not plugged in to a power source. ++ 系统未连接到电源。 + + +- +- is connected to the Internet +- 已连接到互联网 ++ ++ is connected to the Internet ++ 已连接到互联网 + + +- +- The system is not connected to the Internet. +- 系统未连接到互联网。 ++ ++ The system is not connected to the Internet. ++ 系统未连接到互联网。 + + +- +- is running the installer as an administrator (root) +- 正以管理员(root)权限运行安装器 ++ ++ is running the installer as an administrator (root) ++ 正以管理员(root)权限运行安装器 + + +- +- The setup program is not running with administrator rights. +- 安装器未以管理员权限运行 ++ ++ The setup program is not running with administrator rights. ++ 安装器未以管理员权限运行 + + +- +- The installer is not running with administrator rights. +- 安装器未以管理员权限运行 ++ ++ The installer is not running with administrator rights. ++ 安装器未以管理员权限运行 + + +- +- has a screen large enough to show the whole installer +- 有一个足够大的屏幕来显示整个安装器 ++ ++ has a screen large enough to show the whole installer ++ 有一个足够大的屏幕来显示整个安装器 + + +- +- The screen is too small to display the setup program. +- 屏幕太小无法显示安装程序。 ++ ++ The screen is too small to display the setup program. ++ 屏幕太小无法显示安装程序。 + + +- +- The screen is too small to display the installer. +- 屏幕不能完整显示安装器。 ++ ++ The screen is too small to display the installer. ++ 屏幕不能完整显示安装器。 + + +- +- is always false +- ++ ++ is always false ++ + + +- +- The computer says no. +- ++ ++ The computer says no. ++ + + +- +- is always false (slowly) +- ++ ++ is always false (slowly) ++ + + +- +- The computer says no (slowly). +- ++ ++ The computer says no (slowly). ++ + + +- +- is always true +- ++ ++ is always true ++ + + +- +- The computer says yes. +- ++ ++ The computer says yes. ++ + + +- +- is always true (slowly) +- ++ ++ is always true (slowly) ++ + + +- +- The computer says yes (slowly). +- ++ ++ The computer says yes (slowly). ++ + + +- +- is checked three times. +- 已检测了 3 次。 ++ ++ is checked three times. ++ 已检测了 3 次。 + + +- +- The snark has not been checked three times. +- The (some mythological beast) has not been checked three times. +- snark 没有检查三次。 ++ ++ The snark has not been checked three times. ++ The (some mythological beast) has not been checked three times. ++ snark 没有检查三次。 + +- +- ++ ++ + HostInfoJob + +- +- Collecting information about your machine… +- @status +- 正在收集此计算机的信息… ++ ++ Collecting information about your machine… ++ @status ++ 正在收集此计算机的信息… + +- +- ++ ++ + IDJob + +- +- +- +- +- OEM Batch Identifier +- OEM批量标识 ++ ++ ++ ++ ++ OEM Batch Identifier ++ OEM批量标识 + + +- +- Could not create directories <code>%1</code>. +- 无法创建目录<code>%1</code>。 ++ ++ Could not create directories <code>%1</code>. ++ 无法创建目录<code>%1</code>。 + + +- +- Could not open file <code>%1</code>. +- 无法打开文件<code>%1</code>。 ++ ++ Could not open file <code>%1</code>. ++ 无法打开文件<code>%1</code>。 + + +- +- Could not write to file <code>%1</code>. +- 无法写入文件<code>%1</code>。 ++ ++ Could not write to file <code>%1</code>. ++ 无法写入文件<code>%1</code>。 + +- +- ++ ++ + InitcpioJob + +- +- Creating initramfs with mkinitcpio… +- @status +- 正在用 mkinitcpio 创建 initramfs… ++ ++ Creating initramfs with mkinitcpio… ++ @status ++ 正在用 mkinitcpio 创建 initramfs… + +- +- ++ ++ + InitramfsJob + +- +- Creating initramfs… +- @status +- 正在创建 initramfs… ++ ++ Creating initramfs… ++ @status ++ 正在创建 initramfs… + +- +- ++ ++ + InteractiveTerminalPage + +- +- Konsole not installed. +- @error +- 未安装 Konsole 。 ++ ++ Konsole not installed. ++ @error ++ 未安装 Konsole 。 + + +- +- Please install KDE Konsole and try again! +- @info +- 请安装 KDE Konsole 后重试! ++ ++ Please install KDE Konsole and try again! ++ @info ++ 请安装 KDE Konsole 后重试! + + +- +- Executing script: &nbsp;<code>%1</code> +- @info +- 正在运行脚本:&nbsp;<code>%1</code> ++ ++ Executing script: &nbsp;<code>%1</code> ++ @info ++ 正在运行脚本:&nbsp;<code>%1</code> + +- +- ++ ++ + InteractiveTerminalViewStep + +- +- Script +- @label +- 脚本 ++ ++ Script ++ @label ++ 脚本 + +- +- ++ ++ + KeyboardQmlViewStep + +- +- Keyboard +- @label +- 键盘 ++ ++ Keyboard ++ @label ++ 键盘 + +- +- ++ ++ + KeyboardViewStep + +- +- Keyboard +- @label +- 键盘 ++ ++ Keyboard ++ @label ++ 键盘 + +- +- ++ ++ + LCLocaleDialog + +- +- System Locale Setting +- @title +- 系统区域设置 ++ ++ System Locale Setting ++ @title ++ 系统区域设置 + + +- +- The system locale setting affects the language and character set for some command line user interface elements.<br/>The current setting is <strong>%1</strong>. +- @info +- 系统语言区域设置会影响部份命令行用户界面的语言及字符集。<br/>目前的设置为 <strong>%1</strong>。 ++ ++ The system locale setting affects the language and character set for some command line user interface elements.<br/>The current setting is <strong>%1</strong>. ++ @info ++ 系统语言区域设置会影响部份命令行用户界面的语言及字符集。<br/>目前的设置为 <strong>%1</strong>。 + + +- +- &Cancel +- @button +- 取消(&C) ++ ++ &Cancel ++ @button ++ 取消(&C) + + +- +- &OK +- @button +- &确定 ++ ++ &OK ++ @button ++ &确定 + +- +- ++ ++ + LOSHJob + +- +- Configuring encrypted swap. +- 配置加密交换分区。 ++ ++ Configuring encrypted swap. ++ 配置加密交换分区。 + + +- +- No target system available. +- 没有可用的目标系统。 ++ ++ No target system available. ++ 没有可用的目标系统。 + + +- +- No rootMountPoint is set. +- 没有设定 root 挂载点。 ++ ++ No rootMountPoint is set. ++ 没有设定 root 挂载点。 + + +- +- No configFilePath is set. +- 未设置配置文件路径。 ++ ++ No configFilePath is set. ++ 未设置配置文件路径。 + +- +- ++ ++ + LicensePage + +- +- <h1>License Agreement</h1> +- <h1>许可证</h1> ++ ++ <h1>License Agreement</h1> ++ <h1>许可证</h1> + + +- +- I accept the terms and conditions above. +- @info +- 我同意如上条款。 ++ ++ I accept the terms and conditions above. ++ @info ++ 我同意如上条款。 + + +- +- Please review the End User License Agreements (EULAs). +- @info +- 请查阅最终用户许可协议 (EULAs)。 ++ ++ Please review the End User License Agreements (EULAs). ++ @info ++ 请查阅最终用户许可协议 (EULAs)。 + + +- +- This setup procedure will install proprietary software that is subject to licensing terms. +- @info +- 此安装过程会安装受许可条款约束的专有软件。 ++ ++ This setup procedure will install proprietary software that is subject to licensing terms. ++ @info ++ 此安装过程会安装受许可条款约束的专有软件。 + + +- +- If you do not agree with the terms, the setup procedure cannot continue. +- @info +- 如果您不同意这些条款,安装过程将无法继续。 ++ ++ If you do not agree with the terms, the setup procedure cannot continue. ++ @info ++ 如果您不同意这些条款,安装过程将无法继续。 + + +- +- This setup procedure can install proprietary software that is subject to licensing terms in order to provide additional features and enhance the user experience. +- @info +- 此安装过程会安装受许可条款约束的专有软件,用于提供额外功能和提升用户体验。 ++ ++ This setup procedure can install proprietary software that is subject to licensing terms in order to provide additional features and enhance the user experience. ++ @info ++ 此安装过程会安装受许可条款约束的专有软件,用于提供额外功能和提升用户体验。 + + +- +- If you do not agree with the terms, proprietary software will not be installed, and open source alternatives will be used instead. +- @info +- 如果您不同意这些条款,专有软件不会被安装,相应的开源软件替代品将被安装。 ++ ++ If you do not agree with the terms, proprietary software will not be installed, and open source alternatives will be used instead. ++ @info ++ 如果您不同意这些条款,专有软件不会被安装,相应的开源软件替代品将被安装。 + +- +- ++ ++ + LicenseViewStep + +- +- License +- @label +- 许可证 ++ ++ License ++ @label ++ 许可证 + +- +- ++ ++ + LicenseWidget + +- +- URL: %1 +- @label +- URL: %1 ++ ++ URL: %1 ++ @label ++ URL: %1 + + +- +- <strong>%1 driver</strong><br/>by %2 +- @label, %1 is product name, %2 is product vendor +- %1 is an untranslatable product name, example: Creative Audigy driver +- <strong>%1 驱动程序</strong><br/>由 %2 提供 ++ ++ <strong>%1 driver</strong><br/>by %2 ++ @label, %1 is product name, %2 is product vendor ++ %1 is an untranslatable product name, example: Creative Audigy driver ++ <strong>%1 驱动程序</strong><br/>由 %2 提供 + + +- +- <strong>%1 graphics driver</strong><br/><font color="Grey">by %2</font> +- @label, %1 is product name, %2 is product vendor +- %1 is usually a vendor name, example: Nvidia graphics driver +- <strong>%1 显卡驱动程序</strong><br/><font color="Grey">由 %2 提供</font> ++ ++ <strong>%1 graphics driver</strong><br/><font color="Grey">by %2</font> ++ @label, %1 is product name, %2 is product vendor ++ %1 is usually a vendor name, example: Nvidia graphics driver ++ <strong>%1 显卡驱动程序</strong><br/><font color="Grey">由 %2 提供</font> + + +- +- <strong>%1 browser plugin</strong><br/><font color="Grey">by %2</font> +- @label, %1 is product name, %2 is product vendor +- <strong>%1 浏览器插件</strong><br/><font color="Grey">由 %2 提供</font> ++ ++ <strong>%1 browser plugin</strong><br/><font color="Grey">by %2</font> ++ @label, %1 is product name, %2 is product vendor ++ <strong>%1 浏览器插件</strong><br/><font color="Grey">由 %2 提供</font> + + +- +- <strong>%1 codec</strong><br/><font color="Grey">by %2</font> +- @label, %1 is product name, %2 is product vendor +- <strong>%1 编解码器</strong><br/><font color="Grey">由 %2 提供</font> ++ ++ <strong>%1 codec</strong><br/><font color="Grey">by %2</font> ++ @label, %1 is product name, %2 is product vendor ++ <strong>%1 编解码器</strong><br/><font color="Grey">由 %2 提供</font> + + +- +- <strong>%1 package</strong><br/><font color="Grey">by %2</font> +- @label, %1 is product name, %2 is product vendor +- <strong>%1 软件包</strong><br/><font color="Grey">由 %2 提供</font> ++ ++ <strong>%1 package</strong><br/><font color="Grey">by %2</font> ++ @label, %1 is product name, %2 is product vendor ++ <strong>%1 软件包</strong><br/><font color="Grey">由 %2 提供</font> + + +- +- <strong>%1</strong><br/><font color="Grey">by %2</font> +- @label, %1 is product name, %2 is product vendor +- <strong>%1</strong><br/><font color="Grey">由 %2 提供</font> ++ ++ <strong>%1</strong><br/><font color="Grey">by %2</font> ++ @label, %1 is product name, %2 is product vendor ++ <strong>%1</strong><br/><font color="Grey">由 %2 提供</font> + + +- +- File: %1 +- @label +- 文件:%1 ++ ++ File: %1 ++ @label ++ 文件:%1 + + +- +- Hide the license text +- @tooltip +- 隐藏许可证文本 ++ ++ Hide the license text ++ @tooltip ++ 隐藏许可证文本 + + +- +- Show the license text +- @tooltip +- 显示协议文本 ++ ++ Show the license text ++ @tooltip ++ 显示协议文本 + + +- +- Open the license agreement in browser +- @tooltip +- 在浏览器中打开许可协议 ++ ++ Open the license agreement in browser ++ @tooltip ++ 在浏览器中打开许可协议 + +- +- ++ ++ + LocalePage + +- +- Region: +- @label +- 地区: ++ ++ Region: ++ @label ++ 地区: + + +- +- Zone: +- @label +- 区域: ++ ++ Zone: ++ @label ++ 区域: + + +- +- +- &Change… +- @button +- 更改 (&C) ++ ++ ++ &Change… ++ @button ++ 更改 (&C) + +- +- ++ ++ + LocaleQmlViewStep + +- +- Location +- @label +- 位置 ++ ++ Location ++ @label ++ 位置 + +- +- ++ ++ + LocaleTests + +- +- Quit +- 退出 ++ ++ Quit ++ 退出 + +- +- ++ ++ + LocaleViewStep + +- +- Location +- @label +- 位置 ++ ++ Location ++ @label ++ 位置 + +- +- ++ ++ + LuksBootKeyFileJob + +- +- Configuring LUKS key file. +- 配置 LUKS key 文件。 ++ ++ Configuring LUKS key file. ++ 配置 LUKS key 文件。 + + +- +- +- No partitions are defined. +- 未定义分区。 ++ ++ ++ No partitions are defined. ++ 未定义分区。 + + +- +- +- Encrypted rootfs setup error +- 加密根文件系时配置错误 ++ ++ ++ Encrypted rootfs setup error ++ 加密根文件系时配置错误 + + +- +- Root partition %1 is LUKS but no passphrase has been set. +- 根分区%1为LUKS但没有设置密钥。 ++ ++ Root partition %1 is LUKS but no passphrase has been set. ++ 根分区%1为LUKS但没有设置密钥。 + + +- +- Could not create LUKS key file for root partition %1. +- 无法创建根分区%1的LUKS密钥文件。 ++ ++ Could not create LUKS key file for root partition %1. ++ 无法创建根分区%1的LUKS密钥文件。 + +- +- ++ ++ + MachineIdJob + +- +- Generate machine-id. +- 生成 machine-id。 ++ ++ Generate machine-id. ++ 生成 machine-id。 + + +- +- Configuration Error +- 配置错误 ++ ++ Configuration Error ++ 配置错误 + + +- +- No root mount point is set for MachineId. +- MachineId未配置根挂载点/ ++ ++ No root mount point is set for MachineId. ++ MachineId未配置根挂载点/ + + +- +- +- +- +- File not found +- 找不到文件 ++ ++ ++ ++ ++ File not found ++ 找不到文件 + + +- +- Path <pre>%1</pre> must be an absolute path. +- 路径 <pre>%1</pre> 必须是绝对路径。 ++ ++ Path <pre>%1</pre> must be an absolute path. ++ 路径 <pre>%1</pre> 必须是绝对路径。 + + +- +- Could not create new random file <pre>%1</pre>. +- 无法创建新的随机文件 <pre>%1</pre>. ++ ++ Could not create new random file <pre>%1</pre>. ++ 无法创建新的随机文件 <pre>%1</pre>. + +- +- ++ ++ + Map + +- +- Timezone: %1 +- @label +- 时区: %1 ++ ++ Timezone: %1 ++ @label ++ 时区: %1 + + +- +- Please select your preferred location on the map so the installer can suggest the locale ++ ++ Please select your preferred location on the map so the installer can suggest the locale + and timezone settings for you. You can fine-tune the suggested settings below. Search the map by dragging + to move and using the +/- buttons to zoom in/out or use mouse scrolling for zooming. +- @info +- 请在地图上选择您的首选位置,安装程序可以为您提供可参考的区域 ++ @info ++ 请在地图上选择您的首选位置,安装程序可以为您提供可参考的区域 + 设置和时区设置。 您可以在下面微调推荐的设置。 拖动以搜索地图,然后 + 用 +/- 按钮进行放大/缩小,或使用鼠标滚动进行缩放。 + +- +- ++ ++ + Map-qt6 + +- +- Timezone: %1 +- @label +- 时区: %1 ++ ++ Timezone: %1 ++ @label ++ 时区: %1 + + +- +- Please select your preferred location on the map so the installer can suggest the locale ++ ++ Please select your preferred location on the map so the installer can suggest the locale + and timezone settings for you. You can fine-tune the suggested settings below. Search the map by dragging + to move and using the +/- buttons to zoom in/out or use mouse scrolling for zooming. +- @label +- 请在地图上选择您的首选位置,安装程序可以为您提供可参考的区域 ++ @label ++ 请在地图上选择您的首选位置,安装程序可以为您提供可参考的区域 + 设置和时区设置。 您可以在下面微调推荐的设置。 拖动以搜索地图,然后 + 用 +/- 按钮进行放大/缩小,或使用鼠标滚动进行缩放。 + +- +- ++ ++ + NetInstallViewStep + +- +- Package selection +- 软件包选择 ++ ++ Package selection ++ 软件包选择 + + +- +- Office software +- 办公软件 ++ ++ Office software ++ 办公软件 + + +- +- Office package +- 办公软件包 ++ ++ Office package ++ 办公软件包 + + +- +- Browser software +- 浏览器软件 ++ ++ Browser software ++ 浏览器软件 + + +- +- Browser package +- 浏览器安装包 ++ ++ Browser package ++ 浏览器安装包 + + +- +- Web browser +- 网页浏览器 ++ ++ Web browser ++ 网页浏览器 + + +- +- Kernel +- label for netinstall module, Linux kernel +- 内核 ++ ++ Kernel ++ label for netinstall module, Linux kernel ++ 内核 + + +- +- Services +- label for netinstall module, system services +- 服务 ++ ++ Services ++ label for netinstall module, system services ++ 服务 + + +- +- Login +- label for netinstall module, choose login manager +- 登录 ++ ++ Login ++ label for netinstall module, choose login manager ++ 登录 + + +- +- Desktop +- label for netinstall module, choose desktop environment +- 桌面 ++ ++ Desktop ++ label for netinstall module, choose desktop environment ++ 桌面 + + +- +- Applications +- 应用程序 ++ ++ Applications ++ 应用程序 + + +- +- Communication +- label for netinstall module +- 通讯 ++ ++ Communication ++ label for netinstall module ++ 通讯 + + +- +- Development +- label for netinstall module +- 开发 ++ ++ Development ++ label for netinstall module ++ 开发 + + +- +- Office +- label for netinstall module +- 办公 ++ ++ Office ++ label for netinstall module ++ 办公 + + +- +- Multimedia +- label for netinstall module +- 多媒体 ++ ++ Multimedia ++ label for netinstall module ++ 多媒体 + + +- +- Internet +- label for netinstall module +- 互联网 ++ ++ Internet ++ label for netinstall module ++ 互联网 + + +- +- Theming +- label for netinstall module +- 主题化 ++ ++ Theming ++ label for netinstall module ++ 主题化 + + +- +- Gaming +- label for netinstall module +- 游戏 ++ ++ Gaming ++ label for netinstall module ++ 游戏 + + +- +- Utilities +- label for netinstall module +- 实用工具 ++ ++ Utilities ++ label for netinstall module ++ 实用工具 + +- +- ++ ++ + NotesQmlViewStep + +- +- Notes +- 备注 ++ ++ Notes ++ 备注 + +- +- ++ ++ + OEMPage + +- +- Ba&tch: +- 批量(&T): ++ ++ Ba&tch: ++ 批量(&T): + + +- +- <html><head/><body><p>Enter a batch-identifier here. This will be stored in the target system.</p></body></html> +- <html><head/><body><p>请输入批量标识。它会被保存到目标系统上。</p></body></html> ++ ++ <html><head/><body><p>Enter a batch-identifier here. This will be stored in the target system.</p></body></html> ++ <html><head/><body><p>请输入批量标识。它会被保存到目标系统上。</p></body></html> + + +- +- <html><head/><body><h1>OEM Configuration</h1><p>Calamares will use OEM settings while configuring the target system.</p></body></html> +- <html><head/><body><h1>OEM 配置信息</h1><p>Calamares会使用OEM配置信息来配置目标系统。</p></body></html> ++ ++ <html><head/><body><h1>OEM Configuration</h1><p>Calamares will use OEM settings while configuring the target system.</p></body></html> ++ <html><head/><body><h1>OEM 配置信息</h1><p>Calamares会使用OEM配置信息来配置目标系统。</p></body></html> + +- +- ++ ++ + OEMViewStep + +- +- OEM Configuration +- OEM 配置 ++ ++ OEM Configuration ++ OEM 配置 + + +- +- Set the OEM Batch Identifier to <code>%1</code>. +- 设置OEM批量标识为 <code>%1</code>. ++ ++ Set the OEM Batch Identifier to <code>%1</code>. ++ 设置OEM批量标识为 <code>%1</code>. + +- +- ++ ++ + Offline + +- +- Select your preferred region, or use the default settings +- @label +- 选择您的首选区域,或使用默认设置 ++ ++ Select your preferred region, or use the default settings ++ @label ++ 选择您的首选区域,或使用默认设置 + + +- +- +- +- Timezone: %1 +- @label +- 时区: %1 ++ ++ ++ ++ Timezone: %1 ++ @label ++ 时区: %1 + + +- +- Select your preferred zone within your region +- @label +- 在您的区域内选择您的首选时区 ++ ++ Select your preferred zone within your region ++ @label ++ 在您的区域内选择您的首选时区 + + +- +- Zones +- @button +- 区域 ++ ++ Zones ++ @button ++ 区域 + + +- +- You can fine-tune language and locale settings below +- @label +- 您可以在下面微调语言和区域设置 ++ ++ You can fine-tune language and locale settings below ++ @label ++ 您可以在下面微调语言和区域设置 + +- +- ++ ++ + Offline-qt6 + +- +- Select your preferred region, or use the default settings +- @label +- 选择您的首选区域,或使用默认设置 ++ ++ Select your preferred region, or use the default settings ++ @label ++ 选择您的首选区域,或使用默认设置 + + +- +- +- +- Timezone: %1 +- @label +- 时区: %1 ++ ++ ++ ++ Timezone: %1 ++ @label ++ 时区: %1 + + +- +- Select your preferred zone within your region +- @label +- 在您的区域内选择您的首选时区 ++ ++ Select your preferred zone within your region ++ @label ++ 在您的区域内选择您的首选时区 + + +- +- Zones +- @button +- 区域 ++ ++ Zones ++ @button ++ 区域 + + +- +- You can fine-tune language and locale settings below +- @label +- 您可以在下面微调语言和区域设置 ++ ++ You can fine-tune language and locale settings below ++ @label ++ 您可以在下面微调语言和区域设置 + +- +- ++ ++ + PWQ + +- +- Password is too short +- 密码太短 ++ ++ Password is too short ++ 密码太短 + + +- +- Password is too long +- 密码太长 ++ ++ Password is too long ++ 密码太长 + + +- +- Password is too weak +- 密码强度太弱 ++ ++ Password is too weak ++ 密码强度太弱 + + +- +- Memory allocation error when setting '%1' +- 设置“%1”时发生内存分配错误 ++ ++ Memory allocation error when setting '%1' ++ 设置“%1”时发生内存分配错误 + + +- +- Memory allocation error +- 内存分配错误 ++ ++ Memory allocation error ++ 内存分配错误 + + +- +- The password is the same as the old one +- 新密码和老密码一致 ++ ++ The password is the same as the old one ++ 新密码和老密码一致 + + +- +- The password is a palindrome +- 新密码为回文 ++ ++ The password is a palindrome ++ 新密码为回文 + + +- +- The password differs with case changes only +- 新密码和老密码只有大小写区别 ++ ++ The password differs with case changes only ++ 新密码和老密码只有大小写区别 + + +- +- The password is too similar to the old one +- 新密码和老密码过于相似 ++ ++ The password is too similar to the old one ++ 新密码和老密码过于相似 + + +- +- The password contains the user name in some form +- 新密码包含用户名 ++ ++ The password contains the user name in some form ++ 新密码包含用户名 + + +- +- The password contains words from the real name of the user in some form +- 新密码包含用户真实姓名 ++ ++ The password contains words from the real name of the user in some form ++ 新密码包含用户真实姓名 + + +- +- The password contains forbidden words in some form +- 新密码包含不允许使用的词组 ++ ++ The password contains forbidden words in some form ++ 新密码包含不允许使用的词组 + + +- +- The password contains fewer than %n digits +- +- 密码包含的数字少于 %n 个 +- ++ ++ The password contains fewer than %n digits ++ ++ 密码包含的数字少于 %n 个 ++ + + +- +- The password contains too few digits +- 新密码包含太少数字 ++ ++ The password contains too few digits ++ 新密码包含太少数字 + + +- +- The password contains fewer than %n uppercase letters +- +- 密码包含的大写字母少于 %n 个 +- ++ ++ The password contains fewer than %n uppercase letters ++ ++ 密码包含的大写字母少于 %n 个 ++ + + +- +- The password contains too few uppercase letters +- 新密码包含太少大写字母 ++ ++ The password contains too few uppercase letters ++ 新密码包含太少大写字母 + + +- +- The password contains fewer than %n lowercase letters +- +- 密码包含的小写字母少于 %n 个 +- ++ ++ The password contains fewer than %n lowercase letters ++ ++ 密码包含的小写字母少于 %n 个 ++ + + +- +- The password contains too few lowercase letters +- 新密码包含太少小写字母 ++ ++ The password contains too few lowercase letters ++ 新密码包含太少小写字母 + + +- +- The password contains fewer than %n non-alphanumeric characters +- +- 密码包含的非字母数字字符少于 %n 个 +- ++ ++ The password contains fewer than %n non-alphanumeric characters ++ ++ 密码包含的非字母数字字符少于 %n 个 ++ + + +- +- The password contains too few non-alphanumeric characters +- 新密码包含太少非字母/数字字符 ++ ++ The password contains too few non-alphanumeric characters ++ 新密码包含太少非字母/数字字符 + + +- +- The password is shorter than %n characters +- +- 密码少于 %n 个字符 +- ++ ++ The password is shorter than %n characters ++ ++ 密码少于 %n 个字符 ++ + + +- +- The password is too short +- 新密码过短 ++ ++ The password is too short ++ 新密码过短 + + +- +- The password is a rotated version of the previous one +- 此密码是上一个的字序调整版本 ++ ++ The password is a rotated version of the previous one ++ 此密码是上一个的字序调整版本 + + +- +- The password contains fewer than %n character classes +- +- 新密码包含字符类型少于 %n 个 +- ++ ++ The password contains fewer than %n character classes ++ ++ 新密码包含字符类型少于 %n 个 ++ + + +- +- The password does not contain enough character classes +- 新密码包含太少字符类型 ++ ++ The password does not contain enough character classes ++ 新密码包含太少字符类型 + + +- +- The password contains more than %n same characters consecutively +- +- 新密码包含超过 %n 个连续的相同字符 +- ++ ++ The password contains more than %n same characters consecutively ++ ++ 新密码包含超过 %n 个连续的相同字符 ++ + + +- +- The password contains too many same characters consecutively +- 新密码包含过多连续的相同字符 ++ ++ The password contains too many same characters consecutively ++ 新密码包含过多连续的相同字符 + + +- +- The password contains more than %n characters of the same class consecutively +- +- 新密码包含超过 %n 个连续的同类型字符 +- ++ ++ The password contains more than %n characters of the same class consecutively ++ ++ 新密码包含超过 %n 个连续的同类型字符 ++ + + +- +- The password contains too many characters of the same class consecutively +- 新密码包含过多连续的同类型字符 ++ ++ The password contains too many characters of the same class consecutively ++ 新密码包含过多连续的同类型字符 + + +- +- The password contains monotonic sequence longer than %n characters +- +- 新密码包含超过 %n 个字符长度的单调序列 +- ++ ++ The password contains monotonic sequence longer than %n characters ++ ++ 新密码包含超过 %n 个字符长度的单调序列 ++ + + +- +- The password contains too long of a monotonic character sequence +- 新密码包含过长的单调序列 ++ ++ The password contains too long of a monotonic character sequence ++ 新密码包含过长的单调序列 + + +- +- No password supplied +- 未输入密码 ++ ++ No password supplied ++ 未输入密码 + + +- +- Cannot obtain random numbers from the RNG device +- 无法从随机数生成器 (RNG) 设备获取随机数 ++ ++ Cannot obtain random numbers from the RNG device ++ 无法从随机数生成器 (RNG) 设备获取随机数 + + +- +- Password generation failed - required entropy too low for settings +- 无法生成密码 - 熵值过低 ++ ++ Password generation failed - required entropy too low for settings ++ 无法生成密码 - 熵值过低 + + +- +- The password fails the dictionary check - %1 +- 新密码无法通过字典检查 - %1 ++ ++ The password fails the dictionary check - %1 ++ 新密码无法通过字典检查 - %1 + + +- +- The password fails the dictionary check +- 新密码无法通过字典检查 ++ ++ The password fails the dictionary check ++ 新密码无法通过字典检查 + + +- +- Unknown setting - %1 +- 未知设置 - %1 ++ ++ Unknown setting - %1 ++ 未知设置 - %1 + + +- +- Unknown setting +- 未知设置 ++ ++ Unknown setting ++ 未知设置 + + +- +- Bad integer value of setting - %1 +- 设置的整数值非法 - %1 ++ ++ Bad integer value of setting - %1 ++ 设置的整数值非法 - %1 + + +- +- Bad integer value +- 设置的整数值非法 ++ ++ Bad integer value ++ 设置的整数值非法 + + +- +- Setting %1 is not of integer type +- 设定值 %1 不是整数类型 ++ ++ Setting %1 is not of integer type ++ 设定值 %1 不是整数类型 + + +- +- Setting is not of integer type +- 设定值不是整数类型 ++ ++ Setting is not of integer type ++ 设定值不是整数类型 + + +- +- Setting %1 is not of string type +- 设定值 %1 不是字符串类型 ++ ++ Setting %1 is not of string type ++ 设定值 %1 不是字符串类型 + + +- +- Setting is not of string type +- 设定值不是字符串类型 ++ ++ Setting is not of string type ++ 设定值不是字符串类型 + + +- +- Opening the configuration file failed +- 无法打开配置文件 ++ ++ Opening the configuration file failed ++ 无法打开配置文件 + + +- +- The configuration file is malformed +- 配置文件格式不正确 ++ ++ The configuration file is malformed ++ 配置文件格式不正确 + + +- +- Fatal failure +- 致命错误 ++ ++ Fatal failure ++ 致命错误 + + +- +- Unknown error +- 未知错误 ++ ++ Unknown error ++ 未知错误 + +- +- ++ ++ + PackageChooserPage + +- +- Product Name +- 产品名称 ++ ++ Product Name ++ 产品名称 + + +- +- TextLabel +- 文本标签 ++ ++ TextLabel ++ 文本标签 + + +- +- Long Product Description +- 长产品描述 ++ ++ Long Product Description ++ 长产品描述 + + +- +- Package Selection +- 软件包选择 ++ ++ Package Selection ++ 软件包选择 + + +- +- Please pick a product from the list. The selected product will be installed. +- 请在列表中选一个产品。被选中的产品将会被安装。 ++ ++ Please pick a product from the list. The selected product will be installed. ++ 请在列表中选一个产品。被选中的产品将会被安装。 + +- +- ++ ++ + PackageModel + +- +- Name +- 名称 ++ ++ Name ++ 名称 + + +- +- Description +- 描述 ++ ++ Description ++ 描述 + +- +- ++ ++ + Page_Keyboard + +- +- Keyboard model: +- 键盘型号: ++ ++ Keyboard model: ++ 键盘型号: + + +- +- Type here to test your keyboard +- 在此处输入以测试键盘 ++ ++ Type here to test your keyboard ++ 在此处输入以测试键盘 + + +- +- Switch Keyboard: +- shortcut for switching between keyboard layouts +- 切换键盘: ++ ++ Switch Keyboard: ++ shortcut for switching between keyboard layouts ++ 切换键盘: + +- +- ++ ++ + Page_UserSetup + +- +- What is your name? +- 您的姓名? ++ ++ your name ++ 姓名 ++ ++ ++ ++ ++ Your Full Name ++ 全名 + + +- +- Your Full Name +- 全名 ++ ++ user name ++ 用户名 + + +- +- What name do you want to use to log in? +- 您想要使用的登录用户名是? ++ ++ ++ login ++ 登录 + + +- +- login +- 登录 ++ ++ computer name ++ 计算机名称 + + +- +- What is the name of this computer? +- 计算机名称为? ++ ++ What is your name? ++ 您的姓名? + + +- +- <small>This name will be used if you make the computer visible to others on a network.</small> +- <small>将计算机设置为对其他网络上计算机可见时将使用此名称。</small> ++ ++ What name do you want to use to log in? ++ 您想要使用的登录用户名是? + + +- +- Computer Name +- 计算机名称 ++ ++ What is the name of this computer? ++ 计算机名称为? + + +- +- Choose a password to keep your account safe. +- 选择一个密码来保证您的账户安全。 ++ ++ ++ <small>This name will be used if you make the computer visible to others on a network.</small> ++ <small>将计算机设置为对其他网络上计算机可见时将使用此名称。</small> + + +- +- +- <small>Enter the same password twice, so that it can be checked for typing errors. A good password will contain a mixture of letters, numbers and punctuation, should be at least eight characters long, and should be changed at regular intervals.</small> +- <small>输入相同密码两次,以检查输入错误。好的密码包含字母,数字,标点的组合,应当至少为 8 个字符长,并且应按一定周期更换。</small> ++ ++ ++ Computer Name ++ 计算机名称 + + +- +- +- Password +- 密码 ++ ++ ++ Choose a password to keep your account safe. ++ 选择一个密码来保证您的账户安全。 + + +- +- +- Repeat Password +- 重复密码 ++ ++ ++ ++ ++ <small>Enter the same password twice, so that it can be checked for typing errors. A good password will contain a mixture of letters, numbers and punctuation, should be at least eight characters long, and should be changed at regular intervals.</small> ++ <small>输入相同密码两次,以检查输入错误。好的密码包含字母,数字,标点的组合,应当至少为 8 个字符长,并且应按一定周期更换。</small> + + +- +- When this box is checked, password-strength checking is done and you will not be able to use a weak password. +- 若选中此项,密码强度检测会开启,你将不被允许使用弱密码。 ++ ++ ++ ++ ++ Password ++ 密码 + + +- +- Require strong passwords. +- 要求使用强密码。 ++ ++ ++ ++ ++ Repeat Password ++ 重复密码 + + +- +- Log in automatically without asking for the password. +- 不询问密码自动登录。 ++ ++ ++ When this box is checked, password-strength checking is done and you will not be able to use a weak password. ++ 若选中此项,密码强度检测会开启,你将不被允许使用弱密码。 + + +- +- Use the same password for the administrator account. +- 为管理员帐号使用同样的密码。 ++ ++ ++ Require strong passwords. ++ 要求使用强密码。 + + +- +- Choose a password for the administrator account. +- 选择管理员账户的密码。 ++ ++ ++ Log in automatically without asking for the password. ++ 不询问密码自动登录。 + + +- +- +- <small>Enter the same password twice, so that it can be checked for typing errors.</small> +- <small>输入相同密码两次,以检查输入错误。</small> ++ ++ Use the same password for the administrator account. ++ 为管理员帐号使用同样的密码。 + +- +- ++ ++ ++ ++ Use Active Directory ++ ++ ++ ++ ++ ++ Domain: ++ ++ ++ ++ ++ ++ Domain Administrator: ++ ++ ++ ++ ++ ++ Password: ++ ++ ++ ++ ++ ++ IP Address (optional): ++ ++ ++ ++ ++ Use the same password for the root account. ++ 为管理员帐号使用同样的密码。 ++ ++ ++ ++ ++ Choose a password for the administrator account. ++ 选择管理员账户的密码。 ++ ++ ++ ++ ++ ++ ++ <small>Enter the same password twice, so that it can be checked for typing errors.</small> ++ <small>输入相同密码两次,以检查输入错误。</small> + ++ ++ + PartitionLabelsView + +- +- Root +- 根目录 ++ ++ Root ++ 根目录 + + +- +- Home +- @label +- 主目录 ++ ++ Home ++ @label ++ 主目录 + + +- +- Boot +- @label +- 引导 ++ ++ Boot ++ @label ++ 引导 + + +- +- EFI system +- @label +- EFI 系统 ++ ++ EFI system ++ @label ++ EFI 系统 + + +- +- Swap +- @label +- 交换 ++ ++ Swap ++ @label ++ 交换 + + +- +- New partition for %1 +- @label +- %1 的新分区 ++ ++ New partition for %1 ++ @label ++ %1 的新分区 + + +- +- New partition +- @label +- 新建分区 ++ ++ New partition ++ @label ++ 新建分区 + + +- +- %1 %2 +- size[number] filesystem[name] +- %1 %2 ++ ++ %1 %2 ++ size[number] filesystem[name] ++ %1 %2 + +- +- ++ ++ + PartitionModel + +- +- +- Free Space +- @title +- 空闲空间 ++ ++ ++ Free Space ++ @title ++ 空闲空间 + + +- +- +- New Partition +- @title +- 新建分区 ++ ++ ++ New Partition ++ @title ++ 新建分区 + + +- +- Name +- @title +- 名称 ++ ++ Name ++ @title ++ 名称 + + +- +- File System +- @title +- 文件系统 ++ ++ File System ++ @title ++ 文件系统 + + +- +- File System Label +- @title +- 文件系统卷标 ++ ++ File System Label ++ @title ++ 文件系统卷标 + + +- +- Mount Point +- @title +- 挂载点 ++ ++ Mount Point ++ @title ++ 挂载点 + + +- +- Size +- @title +- 大小 ++ ++ Size ++ @title ++ 大小 + +- +- ++ ++ + PartitionPage + +- +- Storage de&vice: +- 存储器(&V): ++ ++ Storage de&vice: ++ 存储器(&V): + + +- +- &Revert All Changes +- 撤销所有修改(&R) ++ ++ &Revert All Changes ++ 撤销所有修改(&R) + + +- +- New Partition &Table +- 新建分区表(&T) ++ ++ New Partition &Table ++ 新建分区表(&T) + + +- +- Cre&ate +- 创建 ++ ++ Cre&ate ++ 创建 + + +- +- &Edit +- 编辑(&E) ++ ++ &Edit ++ 编辑(&E) + + +- +- &Delete +- 删除(&D) ++ ++ &Delete ++ 删除(&D) + + +- +- New Volume Group +- 新分卷组 ++ ++ New Volume Group ++ 新分卷组 + + +- +- Resize Volume Group +- 调整分卷组大小 ++ ++ Resize Volume Group ++ 调整分卷组大小 + + +- +- Deactivate Volume Group +- 停用分卷组 ++ ++ Deactivate Volume Group ++ 停用分卷组 + + +- +- Remove Volume Group +- 移除分卷组 ++ ++ Remove Volume Group ++ 移除分卷组 + + +- +- I&nstall boot loader on: +- 安装引导程序至: ++ ++ I&nstall boot loader on: ++ 安装引导程序至: + + +- +- Are you sure you want to create a new partition table on %1? +- 您是否确定要在 %1 上创建新分区表? ++ ++ Are you sure you want to create a new partition table on %1? ++ 您是否确定要在 %1 上创建新分区表? + + +- +- Can not create new partition +- 无法创建新分区 ++ ++ Can not create new partition ++ 无法创建新分区 + + +- +- The partition table on %1 already has %2 primary partitions, and no more can be added. Please remove one primary partition and add an extended partition, instead. +- %1上的分区表已经有%2个主分区,并且不能再添加。请删除一个主分区并添加扩展分区。 ++ ++ The partition table on %1 already has %2 primary partitions, and no more can be added. Please remove one primary partition and add an extended partition, instead. ++ %1上的分区表已经有%2个主分区,并且不能再添加。请删除一个主分区并添加扩展分区。 + +- +- ++ ++ + PartitionViewStep + +- +- Gathering system information… +- @status +- 正在收集系统信息 ... ++ ++ Gathering system information… ++ @status ++ 正在收集系统信息 ... + + +- +- Partitions +- @label +- 分区 ++ ++ Partitions ++ @label ++ 分区 + + +- +- Install %1 <strong>alongside</strong> another operating system +- @label +- ++ ++ Install %1 <strong>alongside</strong> another operating system ++ @label ++ + + +- +- <strong>Erase</strong> disk and install %1 +- @label +- <strong>擦除</strong>磁盘并安装 %1 ++ ++ <strong>Erase</strong> disk and install %1 ++ @label ++ <strong>擦除</strong>磁盘并安装 %1 + + +- +- <strong>Replace</strong> a partition with %1 +- @label +- 以 %1 <strong>替代</strong>一个分区 ++ ++ <strong>Replace</strong> a partition with %1 ++ @label ++ 以 %1 <strong>替代</strong>一个分区 + + +- +- <strong>Manual</strong> partitioning +- @label +- <strong>手动</strong>分区 ++ ++ <strong>Manual</strong> partitioning ++ @label ++ <strong>手动</strong>分区 + + +- +- Install %1 <strong>alongside</strong> another operating system on disk <strong>%2</strong> (%3) +- @info +- ++ ++ Install %1 <strong>alongside</strong> another operating system on disk <strong>%2</strong> (%3) ++ @info ++ + + +- +- <strong>Erase</strong> disk <strong>%2</strong> (%3) and install %1 +- @info +- ++ ++ <strong>Erase</strong> disk <strong>%2</strong> (%3) and install %1 ++ @info ++ + + +- +- <strong>Replace</strong> a partition on disk <strong>%2</strong> (%3) with %1 +- @info +- ++ ++ <strong>Replace</strong> a partition on disk <strong>%2</strong> (%3) with %1 ++ @info ++ + + +- +- <strong>Manual</strong> partitioning on disk <strong>%1</strong> (%2) +- @info +- ++ ++ <strong>Manual</strong> partitioning on disk <strong>%1</strong> (%2) ++ @info ++ + + +- +- Disk <strong>%1</strong> (%2) +- @info +- 磁盘 <strong>%1</strong> (%2) ++ ++ Disk <strong>%1</strong> (%2) ++ @info ++ 磁盘 <strong>%1</strong> (%2) + + +- +- Unsafe partition actions are enabled. +- 已启用不安全的分区操作。 ++ ++ Unsafe partition actions are enabled. ++ 已启用不安全的分区操作。 + + +- +- Partitioning is configured to <b>always</b> fail. +- 分区操作被配置为<b>总是</b>失败。 ++ ++ Partitioning is configured to <b>always</b> fail. ++ 分区操作被配置为<b>总是</b>失败。 + + +- +- No partitions will be changed. +- 不会更改任何分区。 ++ ++ No partitions will be changed. ++ 不会更改任何分区。 + + +- +- Current: +- @label +- 当前: ++ ++ Current: ++ @label ++ 当前: + + +- +- After: +- @label +- 之后: ++ ++ After: ++ @label ++ 之后: + + +- +- An EFI system partition is necessary to start %1.<br/><br/>To configure an EFI system partition, go back and select or create a suitable filesystem. +- 启动 %1 必须需要 EFI 系統分区。<br/><br/>要設定 EFI 系统分区,返回并选择或者建立符合要求的分区。 ++ ++ An EFI system partition is necessary to start %1.<br/><br/>To configure an EFI system partition, go back and select or create a suitable filesystem. ++ 启动 %1 必须需要 EFI 系統分区。<br/><br/>要設定 EFI 系统分区,返回并选择或者建立符合要求的分区。 + + +- +- An EFI system partition is necessary to start %1.<br/><br/>The EFI system partition does not meet recommendations. It is recommended to go back and select or create a suitable filesystem. +- EFI系统分区是启动 %1 所必需的。<br/><br/>此 EFI 系统磁盘分区不符合建议。建议返回并选择或创建一个合适的文件系统。 ++ ++ An EFI system partition is necessary to start %1.<br/><br/>The EFI system partition does not meet recommendations. It is recommended to go back and select or create a suitable filesystem. ++ EFI系统分区是启动 %1 所必需的。<br/><br/>此 EFI 系统磁盘分区不符合建议。建议返回并选择或创建一个合适的文件系统。 + + +- +- The filesystem must be mounted on <strong>%1</strong>. +- 文件系统必须挂载于 <strong>%1</strong>。 ++ ++ The filesystem must be mounted on <strong>%1</strong>. ++ 文件系统必须挂载于 <strong>%1</strong>。 + + +- +- The filesystem must have type FAT32. +- 此文件系统必须为FAT32 ++ ++ The filesystem must have type FAT32. ++ 此文件系统必须为FAT32 + + +- +- The filesystem must have flag <strong>%1</strong> set. +- 文件系统必须设置 <strong>%1</strong> 标记。 ++ ++ The filesystem must have flag <strong>%1</strong> set. ++ 文件系统必须设置 <strong>%1</strong> 标记。 + + +- +- +- The filesystem must be at least %1 MiB in size. +- 文件系统必须要有%1 MiB 的大小。 ++ ++ ++ The filesystem must be at least %1 MiB in size. ++ 文件系统必须要有%1 MiB 的大小。 + + +- +- The minimum recommended size for the filesystem is %1 MiB. +- 推荐文件系统的最小尺寸为 %1 MiB。 ++ ++ The minimum recommended size for the filesystem is %1 MiB. ++ 推荐文件系统的最小尺寸为 %1 MiB。 + + +- +- You can continue without setting up an EFI system partition but your system may fail to start. +- 您可以在不设置EFI系统分区的情况下继续,但您的系統可能无法启动。 ++ ++ You can continue without setting up an EFI system partition but your system may fail to start. ++ 您可以在不设置EFI系统分区的情况下继续,但您的系統可能无法启动。 + + +- +- You can continue with this EFI system partition configuration but your system may fail to start. +- 您可以继续此 EFI 系统分区配置,但您的系统可能无法启动。 ++ ++ You can continue with this EFI system partition configuration but your system may fail to start. ++ 您可以继续此 EFI 系统分区配置,但您的系统可能无法启动。 + + +- +- No EFI system partition configured +- 未配置 EFI 系统分区 ++ ++ No EFI system partition configured ++ 未配置 EFI 系统分区 + + +- +- EFI system partition configured incorrectly +- EFI系统分区配置错误 ++ ++ EFI system partition configured incorrectly ++ EFI系统分区配置错误 + + +- +- EFI system partition recommendation +- EFI 系统分区推荐 ++ ++ EFI system partition recommendation ++ EFI 系统分区推荐 + + +- +- Option to use GPT on BIOS +- 在 BIOS 上使用 GPT ++ ++ Option to use GPT on BIOS ++ 在 BIOS 上使用 GPT + + +- +- A GPT partition table is the best option for all systems. This installer supports such a setup for BIOS systems too.<br/><br/>To configure a GPT partition table on BIOS, (if not done so already) go back and set the partition table to GPT, next create a 8 MB unformatted partition with the <strong>%2</strong> flag enabled.<br/><br/>An unformatted 8 MB partition is necessary to start %1 on a BIOS system with GPT. +- GPT 分区表对所有系统都是最佳选项。此安装程序同时支持 BIOS 系统。<br/><br/>要在 BIOS 上配置 GPT 分区表(如果还没有完成的话),请回到上一步并将分区表设置为 GPT,然后创建 8 MB 的未格式化分区,并启用 <strong>%2</strong> 标记。<br/><br/>要在 BIOS 系统上使用 GPT 分区表启动 %1,必须要有该 8 MB 的未格式化分区。 ++ ++ A GPT partition table is the best option for all systems. This installer supports such a setup for BIOS systems too.<br/><br/>To configure a GPT partition table on BIOS, (if not done so already) go back and set the partition table to GPT, next create a 8 MB unformatted partition with the <strong>%2</strong> flag enabled.<br/><br/>An unformatted 8 MB partition is necessary to start %1 on a BIOS system with GPT. ++ GPT 分区表对所有系统都是最佳选项。此安装程序同时支持 BIOS 系统。<br/><br/>要在 BIOS 上配置 GPT 分区表(如果还没有完成的话),请回到上一步并将分区表设置为 GPT,然后创建 8 MB 的未格式化分区,并启用 <strong>%2</strong> 标记。<br/><br/>要在 BIOS 系统上使用 GPT 分区表启动 %1,必须要有该 8 MB 的未格式化分区。 + + +- +- Boot partition not encrypted +- 引导分区未加密 ++ ++ Boot partition not encrypted ++ 引导分区未加密 + + +- +- A separate boot partition was set up together with an encrypted root partition, but the boot partition is not encrypted.<br/><br/>There are security concerns with this kind of setup, because important system files are kept on an unencrypted partition.<br/>You may continue if you wish, but filesystem unlocking will happen later during system startup.<br/>To encrypt the boot partition, go back and recreate it, selecting <strong>Encrypt</strong> in the partition creation window. +- 您尝试用单独的引导分区配合已加密的根分区使用,但引导分区未加密。<br/><br/>这种配置方式可能存在安全隐患,因为重要的系统文件存储在了未加密的分区上。<br/>您可以继续保持此配置,但是系统解密将在系统启动时而不是引导时进行。<br/>要加密引导分区,请返回上一步并重新创建此分区,并在分区创建窗口选中 <strong>加密</strong> 选项。 ++ ++ A separate boot partition was set up together with an encrypted root partition, but the boot partition is not encrypted.<br/><br/>There are security concerns with this kind of setup, because important system files are kept on an unencrypted partition.<br/>You may continue if you wish, but filesystem unlocking will happen later during system startup.<br/>To encrypt the boot partition, go back and recreate it, selecting <strong>Encrypt</strong> in the partition creation window. ++ 您尝试用单独的引导分区配合已加密的根分区使用,但引导分区未加密。<br/><br/>这种配置方式可能存在安全隐患,因为重要的系统文件存储在了未加密的分区上。<br/>您可以继续保持此配置,但是系统解密将在系统启动时而不是引导时进行。<br/>要加密引导分区,请返回上一步并重新创建此分区,并在分区创建窗口选中 <strong>加密</strong> 选项。 + + +- +- has at least one disk device available. +- 有至少一个可用的磁盘设备。 ++ ++ has at least one disk device available. ++ 有至少一个可用的磁盘设备。 + + +- +- There are no partitions to install on. +- 无可用于安装的分区。 ++ ++ There are no partitions to install on. ++ 无可用于安装的分区。 + +- +- ++ ++ + PlasmaLnfJob + +- +- Applying Plasma Look-and-Feel… +- @status +- 正在应用 Plasma 观感… ++ ++ Applying Plasma Look-and-Feel… ++ @status ++ 正在应用 Plasma 观感… + + +- +- +- Could not select KDE Plasma Look-and-Feel package +- 无法选中 KDE Plasma 外观主题包 ++ ++ ++ Could not select KDE Plasma Look-and-Feel package ++ 无法选中 KDE Plasma 外观主题包 + +- +- ++ ++ + PlasmaLnfPage + +- +- Please choose a look-and-feel for the KDE Plasma Desktop. You can also skip this step and configure the look-and-feel once the system is set up. Clicking on a look-and-feel selection will give you a live preview of that look-and-feel. +- 请选择一个 KDE Plasma 桌面外观。你也可以忽略此步骤并在系统安装完成后配置外观。点击外观后可以实时预览效果。 ++ ++ Please choose a look-and-feel for the KDE Plasma Desktop. You can also skip this step and configure the look-and-feel once the system is set up. Clicking on a look-and-feel selection will give you a live preview of that look-and-feel. ++ 请选择一个 KDE Plasma 桌面外观。你也可以忽略此步骤并在系统安装完成后配置外观。点击外观后可以实时预览效果。 + + +- +- Please choose a look-and-feel for the KDE Plasma Desktop. You can also skip this step and configure the look-and-feel once the system is installed. Clicking on a look-and-feel selection will give you a live preview of that look-and-feel. +- 请选择一个 KDE Plasma 桌面外观,可以忽略此步骤并在系统安装完成后配置外观。点击一个外观后可以实时预览效果。 ++ ++ Please choose a look-and-feel for the KDE Plasma Desktop. You can also skip this step and configure the look-and-feel once the system is installed. Clicking on a look-and-feel selection will give you a live preview of that look-and-feel. ++ 请选择一个 KDE Plasma 桌面外观,可以忽略此步骤并在系统安装完成后配置外观。点击一个外观后可以实时预览效果。 + +- +- ++ ++ + PlasmaLnfViewStep + +- +- Look-and-Feel +- @label +- 外观主题 ++ ++ Look-and-Feel ++ @label ++ 外观主题 + +- +- ++ ++ ++ PowerManagementInterface + -+ -+ Zaporozhye -+ tz_names -+ 紮波羅熱 ++ ++ Calamares ++ + + -+ -+ Zurich -+ tz_names -+ 蘇黎世 ++ ++ Installation in progress ++ @status ++ + + -+ ++ + PreserveFiles + +- +- Saving files for later… +- @status +- 保存文件以供日后使用… ++ ++ Saving files for later… ++ @status ++ 保存文件以供日后使用… + + +- +- No files configured to save for later. +- 没有已保存且供日后使用的配置文件。 ++ ++ No files configured to save for later. ++ 没有已保存且供日后使用的配置文件。 + + +- +- Not all of the configured files could be preserved. +- 并不是所有配置文件都可以被保留 ++ ++ Not all of the configured files could be preserved. ++ 并不是所有配置文件都可以被保留 + +- +- ++ ++ + ProcessResult + +- +- ++ ++ + There was no output from the command. +- ++ + 命令没有输出。 + + +- +- ++ ++ + Output: + +- ++ + 输出: + + + +- +- External command crashed. +- 外部命令已崩溃。 ++ ++ External command crashed. ++ 外部命令已崩溃。 + + +- +- Command <i>%1</i> crashed. +- 命令 <i>%1</i> 已崩溃。 ++ ++ Command <i>%1</i> crashed. ++ 命令 <i>%1</i> 已崩溃。 + + +- +- External command failed to start. +- 无法启动外部命令。 ++ ++ External command failed to start. ++ 无法启动外部命令。 + + +- +- Command <i>%1</i> failed to start. +- 无法启动命令 <i>%1</i>。 ++ ++ Command <i>%1</i> failed to start. ++ 无法启动命令 <i>%1</i>。 + + +- +- Internal error when starting command. +- 启动命令时出现内部错误。 ++ ++ Internal error when starting command. ++ 启动命令时出现内部错误。 + + +- +- Bad parameters for process job call. +- 呼叫进程任务出现错误参数 ++ ++ Bad parameters for process job call. ++ 呼叫进程任务出现错误参数 + + +- +- External command failed to finish. +- 外部命令未成功完成。 ++ ++ External command failed to finish. ++ 外部命令未成功完成。 + + +- +- Command <i>%1</i> failed to finish in %2 seconds. +- 命令 <i>%1</i> 未能在 %2 秒内完成。 ++ ++ Command <i>%1</i> failed to finish in %2 seconds. ++ 命令 <i>%1</i> 未能在 %2 秒内完成。 + + +- +- External command finished with errors. +- 外部命令已完成,但出现了错误。 ++ ++ External command finished with errors. ++ 外部命令已完成,但出现了错误。 + + +- +- Command <i>%1</i> finished with exit code %2. +- 命令 <i>%1</i> 以退出代码 %2 完成。 ++ ++ Command <i>%1</i> finished with exit code %2. ++ 命令 <i>%1</i> 以退出代码 %2 完成。 + +- +- ++ ++ + QObject + +- +- %1 (%2) +- %1(%2) ++ ++ %1 (%2) ++ %1(%2) + + +- +- unknown +- @partition info +- 未知 ++ ++ unknown ++ @partition info ++ 未知 + + +- +- extended +- @partition info +- 扩展分区 ++ ++ extended ++ @partition info ++ 扩展分区 + + +- +- unformatted +- @partition info +- 未格式化 ++ ++ unformatted ++ @partition info ++ 未格式化 + + +- +- swap +- @partition info +- 交换分区 ++ ++ swap ++ @partition info ++ 交换分区 + + +- +- +- Default +- 默认 ++ ++ ++ Default ++ 默认 + + +- +- Directory not found +- 找不到目录 ++ ++ Directory not found ++ 找不到目录 + + +- +- Could not create new random file <pre>%1</pre>. +- 无法创建新的随机文件 <pre>%1</pre>. ++ ++ Could not create new random file <pre>%1</pre>. ++ 无法创建新的随机文件 <pre>%1</pre>. + + +- +- No product +- 无产品 ++ ++ No product ++ 无产品 + + +- +- No description provided. +- 未提供描述信息 ++ ++ No description provided. ++ 未提供描述信息 + + +- +- (no mount point) +- (无挂载点) ++ ++ (no mount point) ++ (无挂载点) + + +- +- Unpartitioned space or unknown partition table +- @info +- 尚未分区的空间或分区表未知 ++ ++ Unpartitioned space or unknown partition table ++ @info ++ 尚未分区的空间或分区表未知 + +- +- ++ ++ + Recommended + +- +- <p>This computer does not satisfy some of the recommended requirements for setting up %1.<br/> ++ ++ <p>This computer does not satisfy some of the recommended requirements for setting up %1.<br/> + Setup can continue, but some features might be disabled.</p> +- <p>此计算机不满足安装 %1 的某些推荐配置。<br/> ++ <p>此计算机不满足安装 %1 的某些推荐配置。<br/> + 安装可以继续,但是一些特性可能被禁用。</p> + +- +- ++ ++ + RemoveUserJob + +- +- Removing live user from the target system… +- @status +- 正在从目标系统删除 live 用户… ++ ++ Removing live user from the target system… ++ @status ++ 正在从目标系统删除 live 用户… + +- +- ++ ++ + RemoveVolumeGroupJob + +- +- +- Removing Volume Group named %1… +- @status +- 正在移除分卷组 %1… ++ ++ ++ Removing Volume Group named %1… ++ @status ++ 正在移除分卷组 %1… + + +- +- Removing Volume Group named <strong>%1</strong>… +- @status +- 正在移除分卷组 <strong>%1</strong>… ++ ++ Removing Volume Group named <strong>%1</strong>… ++ @status ++ 正在移除分卷组 <strong>%1</strong>… + + +- +- The installer failed to remove a volume group named '%1'. +- 安装器无法移除分卷组 '%1'。 ++ ++ The installer failed to remove a volume group named '%1'. ++ 安装器无法移除分卷组 '%1'。 + +- +- ++ ++ + Requirements + +- +- <p>This computer does not satisfy the minimum requirements for installing %1.<br/> ++ ++ <p>This computer does not satisfy the minimum requirements for installing %1.<br/> + Installation cannot continue.</p> +- <p>此计算机不满足安装 %1 的最低配置。<br/> ++ <p>此计算机不满足安装 %1 的最低配置。<br/> + 安装无法继续。</p> + + +- +- <p>This computer does not satisfy some of the recommended requirements for setting up %1.<br/> ++ ++ <p>This computer does not satisfy some of the recommended requirements for setting up %1.<br/> + Setup can continue, but some features might be disabled.</p> +- <p>此计算机不满足安装 %1 的某些推荐配置。<br/> ++ <p>此计算机不满足安装 %1 的某些推荐配置。<br/> + 初始化可以继续,但是一些特性可能被禁用。</p> + +- +- ++ ++ + ResizeFSJob + +- +- Performing file system resize… +- @status +- 正在执行文件系统大小调整… ++ ++ Performing file system resize… ++ @status ++ 正在执行文件系统大小调整… + + +- +- Invalid configuration +- @error +- 无效配置 ++ ++ Invalid configuration ++ @error ++ 无效配置 + + +- +- The file-system resize job has an invalid configuration and will not run. +- @error +- 调整文件系统大小的任务 因为配置文件无效不会被执行。 ++ ++ The file-system resize job has an invalid configuration and will not run. ++ @error ++ 调整文件系统大小的任务 因为配置文件无效不会被执行。 + + +- +- KPMCore not available +- @error +- KPMCore 不可用 ++ ++ KPMCore not available ++ @error ++ KPMCore 不可用 + + +- +- Calamares cannot start KPMCore for the file system resize job. +- @error +- Calamares 无法启动 KPMCore 来完成调整文件系统大小的任务。 ++ ++ Calamares cannot start KPMCore for the file system resize job. ++ @error ++ Calamares 无法启动 KPMCore 来完成调整文件系统大小的任务。 + + +- +- Resize failed. +- @error +- 调整大小失败。 ++ ++ Resize failed. ++ @error ++ 调整大小失败。 + + +- +- The filesystem %1 could not be found in this system, and cannot be resized. +- @info +- 文件系统 %1 未能在此系统上找到,因此无法调整大小。 ++ ++ The filesystem %1 could not be found in this system, and cannot be resized. ++ @info ++ 文件系统 %1 未能在此系统上找到,因此无法调整大小。 + + +- +- The device %1 could not be found in this system, and cannot be resized. +- @info +- 设备 %1 未能在此系统上找到,因此无法调整大小。 ++ ++ The device %1 could not be found in this system, and cannot be resized. ++ @info ++ 设备 %1 未能在此系统上找到,因此无法调整大小。 + + +- +- +- +- +- Resize Failed +- @error +- 调整大小失败 ++ ++ ++ ++ ++ Resize Failed ++ @error ++ 调整大小失败 + + +- +- +- The filesystem %1 cannot be resized. +- @error +- 文件系统 %1 无法被调整大小。 ++ ++ ++ The filesystem %1 cannot be resized. ++ @error ++ 文件系统 %1 无法被调整大小。 + + +- +- +- The device %1 cannot be resized. +- @error +- 设备 %1 无法被调整大小。 ++ ++ ++ The device %1 cannot be resized. ++ @error ++ 设备 %1 无法被调整大小。 + + +- +- The file system %1 must be resized, but cannot. +- @info +- 文件系统 %1 必须调整大小,但无法做到。 ++ ++ The file system %1 must be resized, but cannot. ++ @info ++ 文件系统 %1 必须调整大小,但无法做到。 + + +- +- The device %1 must be resized, but cannot +- @info +- 设备 %1 必须调整大小,但无法做到。 ++ ++ The device %1 must be resized, but cannot ++ @info ++ 设备 %1 必须调整大小,但无法做到。 + +- +- ++ ++ + ResizePartitionJob + +- +- Resize partition %1 +- @title +- 调整分区 %1 大小 ++ ++ Resize partition %1 ++ @title ++ 调整分区 %1 大小 + + +- +- Resize <strong>%2MiB</strong> partition <strong>%1</strong> to <strong>%3MiB</strong> +- @info +- ++ ++ Resize <strong>%2MiB</strong> partition <strong>%1</strong> to <strong>%3MiB</strong> ++ @info ++ + + +- +- Resizing %2MiB partition %1 to %3MiB… +- @status +- ++ ++ Resizing %2MiB partition %1 to %3MiB… ++ @status ++ + + +- +- The installer failed to resize partition %1 on disk '%2'. +- 安装程序调整磁盘“%2”上的分区 %1 大小失败。 ++ ++ The installer failed to resize partition %1 on disk '%2'. ++ 安装程序调整磁盘“%2”上的分区 %1 大小失败。 + +- +- ++ ++ + ResizeVolumeGroupDialog + +- +- Resize Volume Group +- @title +- 调整分卷组大小 ++ ++ Resize Volume Group ++ @title ++ 调整分卷组大小 + +- +- ++ ++ + ResizeVolumeGroupJob + +- +- Resize volume group named %1 from %2 to %3 +- @title +- ++ ++ Resize volume group named %1 from %2 to %3 ++ @title ++ + + +- +- Resize volume group named <strong>%1</strong> from <strong>%2</strong> to <strong>%3</strong> +- @info +- ++ ++ Resize volume group named <strong>%1</strong> from <strong>%2</strong> to <strong>%3</strong> ++ @info ++ + + +- +- Resizing volume group named %1 from %2 to %3… +- @status +- ++ ++ Resizing volume group named %1 from %2 to %3… ++ @status ++ + + +- +- The installer failed to resize a volume group named '%1'. +- 安装器未能调整分卷组'%1'的大小 ++ ++ The installer failed to resize a volume group named '%1'. ++ 安装器未能调整分卷组'%1'的大小 + +- +- ++ ++ + ResultsListWidget + +- +- Checking requirements again in a few seconds ... +- 几秒钟后再次检查要求 ... ++ ++ Checking requirements again in a few seconds ... ++ 几秒钟后再次检查要求 ... + +- +- ++ ++ + ScanningDialog + +- +- Scanning storage devices… +- @status +- 正在扫描存储设备… ++ ++ Scanning storage devices… ++ @status ++ 正在扫描存储设备… + + +- +- Partitioning… +- @status +- 正在分区… ++ ++ Partitioning… ++ @status ++ 正在分区… + +- +- ++ ++ + SetHostNameJob + +- +- Set hostname %1 +- 设置主机名 %1 ++ ++ Set hostname %1 ++ 设置主机名 %1 + + +- +- Set hostname <strong>%1</strong>. +- 设置主机名 <strong>%1</strong>。 ++ ++ Set hostname <strong>%1</strong>. ++ 设置主机名 <strong>%1</strong>。 + + +- +- Setting hostname %1… +- @status +- 正在设置主机名 %1… ++ ++ Setting hostname %1… ++ @status ++ 正在设置主机名 %1… + + +- +- +- Internal Error +- 内部错误 ++ ++ ++ Internal Error ++ 内部错误 + + +- +- +- Cannot write hostname to target system +- 无法向目标系统写入主机名 ++ ++ ++ Cannot write hostname to target system ++ 无法向目标系统写入主机名 + +- +- ++ ++ + SetKeyboardLayoutJob + +- +- Setting keyboard model to %1, layout as %2-%3… +- @status, %1 model, %2 layout, %3 variant +- 正在将键盘型号设置为 %1,布局设置为 %2-%3… ++ ++ Setting keyboard model to %1, layout as %2-%3… ++ @status, %1 model, %2 layout, %3 variant ++ 正在将键盘型号设置为 %1,布局设置为 %2-%3… + + +- +- Failed to write keyboard configuration for the virtual console. +- @error +- 无法将键盘配置写入到虚拟控制台。 ++ ++ Failed to write keyboard configuration for the virtual console. ++ @error ++ 无法将键盘配置写入到虚拟控制台。 + + +- +- Failed to write to %1 +- @error, %1 is virtual console configuration path +- 写入到 %1 失败 ++ ++ Failed to write to %1 ++ @error, %1 is virtual console configuration path ++ 写入到 %1 失败 + + +- +- Failed to write keyboard configuration for X11. +- @error +- 无法为 X11 写入键盘配置。 ++ ++ Failed to write keyboard configuration for X11. ++ @error ++ 无法为 X11 写入键盘配置。 + + +- +- Failed to write to %1 +- @error, %1 is keyboard configuration path +- 写入到 %1 失败 ++ ++ Failed to write to %1 ++ @error, %1 is keyboard configuration path ++ 写入到 %1 失败 + + +- +- Failed to write keyboard configuration to existing /etc/default directory. +- @error +- 无法将键盘配置写入到现有的 /etc/default 目录。 ++ ++ Failed to write keyboard configuration to existing /etc/default directory. ++ @error ++ 无法将键盘配置写入到现有的 /etc/default 目录。 + + +- +- Failed to write to %1 +- @error, %1 is default keyboard path +- 写入到 %1 失败 ++ ++ Failed to write to %1 ++ @error, %1 is default keyboard path ++ 写入到 %1 失败 + +- +- ++ ++ + SetPartFlagsJob + +- +- Set flags on partition %1 +- @title +- 设置分区 %1 的标记 ++ ++ Set flags on partition %1 ++ @title ++ 设置分区 %1 的标记 + + +- +- Set flags on %1MiB %2 partition +- @title +- 设置 %1MiB %2 分区的标记 ++ ++ Set flags on %1MiB %2 partition ++ @title ++ 设置 %1MiB %2 分区的标记 + + +- +- Set flags on new partition +- @title +- 设置新分区标记 ++ ++ Set flags on new partition ++ @title ++ 设置新分区标记 + + +- +- Clear flags on partition <strong>%1</strong> +- @info +- ++ ++ Clear flags on partition <strong>%1</strong> ++ @info ++ + + +- +- Clear flags on %1MiB <strong>%2</strong> partition +- @info +- ++ ++ Clear flags on %1MiB <strong>%2</strong> partition ++ @info ++ + + +- +- Clear flags on new partition +- @info +- ++ ++ Clear flags on new partition ++ @info ++ + + +- +- Set flags on partition <strong>%1</strong> to <strong>%2</strong> +- @info +- ++ ++ Set flags on partition <strong>%1</strong> to <strong>%2</strong> ++ @info ++ + + +- +- Set flags on %1MiB <strong>%2</strong> partition to <strong>%3</strong> +- @info +- ++ ++ Set flags on %1MiB <strong>%2</strong> partition to <strong>%3</strong> ++ @info ++ + + +- +- Set flags on new partition to <strong>%1</strong> +- @info +- ++ ++ Set flags on new partition to <strong>%1</strong> ++ @info ++ + + +- +- Clearing flags on partition <strong>%1</strong>… +- @status +- ++ ++ Clearing flags on partition <strong>%1</strong>… ++ @status ++ + + +- +- Clearing flags on %1MiB <strong>%2</strong> partition… +- @status +- ++ ++ Clearing flags on %1MiB <strong>%2</strong> partition… ++ @status ++ + + +- +- Clearing flags on new partition… +- @status +- ++ ++ Clearing flags on new partition… ++ @status ++ + + +- +- Setting flags <strong>%2</strong> on partition <strong>%1</strong>… +- @status +- ++ ++ Setting flags <strong>%2</strong> on partition <strong>%1</strong>… ++ @status ++ + + +- +- Setting flags <strong>%3</strong> on %1MiB <strong>%2</strong> partition… +- @status +- ++ ++ Setting flags <strong>%3</strong> on %1MiB <strong>%2</strong> partition… ++ @status ++ + + +- +- Setting flags <strong>%1</strong> on new partition… +- @status +- ++ ++ Setting flags <strong>%1</strong> on new partition… ++ @status ++ + + +- +- The installer failed to set flags on partition %1. +- 安装程序未能成功设置分区 %1 的标记。 ++ ++ The installer failed to set flags on partition %1. ++ 安装程序未能成功设置分区 %1 的标记。 + +- +- ++ ++ + SetPasswordJob + +- +- Set password for user %1 +- 设置用户 %1 的密码 ++ ++ Set password for user %1 ++ 设置用户 %1 的密码 + + +- +- Setting password for user %1… +- @status +- 正在为用户 %1 设置密码… ++ ++ Setting password for user %1… ++ @status ++ 正在为用户 %1 设置密码… + + +- +- Bad destination system path. +- 非法的目标系统路径。 ++ ++ Bad destination system path. ++ 非法的目标系统路径。 + + +- +- rootMountPoint is %1 +- 根挂载点为 %1 ++ ++ rootMountPoint is %1 ++ 根挂载点为 %1 + + +- +- Cannot disable root account. +- 无法禁用 root 帐号。 ++ ++ Cannot disable root account. ++ 无法禁用 root 帐号。 + + +- +- +- usermod terminated with error code %1. +- usermod 以错误代码 %1 中止。 ++ ++ ++ usermod terminated with error code %1. ++ usermod 以错误代码 %1 中止。 + + +- +- Cannot set password for user %1. +- 无法设置用户 %1 的密码。 ++ ++ Cannot set password for user %1. ++ 无法设置用户 %1 的密码。 + +- +- ++ ++ + SetTimezoneJob + +- +- Setting timezone to %1/%2… +- @status +- 正在设置时区为 %1/%2… ++ ++ Setting timezone to %1/%2… ++ @status ++ 正在设置时区为 %1/%2… + + +- +- Cannot access selected timezone path. +- @error +- 无法访问指定的时区路径。 ++ ++ Cannot access selected timezone path. ++ @error ++ 无法访问指定的时区路径。 + + +- +- Bad path: %1 +- @error +- 非法路径:%1 ++ ++ Bad path: %1 ++ @error ++ 非法路径:%1 + + +- +- +- Cannot set timezone. +- @error +- 无法设置时区。 ++ ++ ++ Cannot set timezone. ++ @error ++ 无法设置时区。 + + +- +- Link creation failed, target: %1; link name: %2 +- @info +- 链接创建失败,目标:%1,链接名称:%2 ++ ++ Link creation failed, target: %1; link name: %2 ++ @info ++ 链接创建失败,目标:%1,链接名称:%2 + + +- +- Cannot open /etc/timezone for writing +- @info +- 无法打开要写入的 /etc/timezone ++ ++ Cannot open /etc/timezone for writing ++ @info ++ 无法打开要写入的 /etc/timezone + +- +- ++ ++ + SetupGroupsJob + +- +- Preparing groups… +- @status +- 正在准备群组… ++ ++ Preparing groups… ++ @status ++ 正在准备群组… + + +- +- +- Could not create groups in target system +- 无法在目标系统中创建群组 ++ ++ ++ Could not create groups in target system ++ 无法在目标系统中创建群组 + + +- +- These groups are missing in the target system: %1 +- 目标系统中缺少以下群组: %1 ++ ++ These groups are missing in the target system: %1 ++ 目标系统中缺少以下群组: %1 + +- +- ++ ++ + SetupSudoJob + +- +- Configuring <pre>sudo</pre> users… +- @status +- 配置 <pre>sudo</pre> 用户… ++ ++ Configuring <pre>sudo</pre> users… ++ @status ++ 配置 <pre>sudo</pre> 用户… + + +- +- Cannot chmod sudoers file. +- 无法修改 sudoers 文件权限。 ++ ++ Cannot chmod sudoers file. ++ 无法修改 sudoers 文件权限。 + + +- +- Cannot create sudoers file for writing. +- 无法创建要写入的 sudoers 文件。 ++ ++ Cannot create sudoers file for writing. ++ 无法创建要写入的 sudoers 文件。 + +- +- ++ ++ + ShellProcessJob + +- +- Running shell processes… +- @status +- 正在运行 shell 进程… ++ ++ Running shell processes… ++ @status ++ 正在运行 shell 进程… + +- +- ++ ++ + SlideCounter + +- +- +- %L1 / %L2 +- slide counter, %1 of %2 (numeric) +- %L1 / %L2 ++ ++ ++ %L1 / %L2 ++ slide counter, %1 of %2 (numeric) ++ %L1 / %L2 + +- +- ++ ++ + StandardButtons + +- +- &OK +- &确定 ++ ++ &OK ++ &确定 + + +- +- &Yes +- &是 ++ ++ &Yes ++ &是 + + +- +- &No +- &否 ++ ++ &No ++ &否 + + +- +- &Cancel +- 取消(&C) ++ ++ &Cancel ++ 取消(&C) + + +- +- &Close +- &关闭 ++ ++ &Close ++ &关闭 + +- +- ++ ++ + TrackingInstallJob + +- +- Installation feedback +- 安装反馈 ++ ++ Installation feedback ++ 安装反馈 + + +- +- Sending installation feedback… +- @status +- 正在发送安装反馈… ++ ++ Sending installation feedback… ++ @status ++ 正在发送安装反馈… + + +- +- Internal error in install-tracking. +- 在 install-tracking 步骤发生内部错误。 ++ ++ Internal error in install-tracking. ++ 在 install-tracking 步骤发生内部错误。 + + +- +- HTTP request timed out. +- HTTP 请求超时。 ++ ++ HTTP request timed out. ++ HTTP 请求超时。 + +- +- ++ ++ + TrackingKUserFeedbackJob + +- +- KDE user feedback +- KDE 用户反馈 ++ ++ KDE user feedback ++ KDE 用户反馈 + + +- +- Configuring KDE user feedback… +- @status +- 配置 KDE 用户反馈… ++ ++ Configuring KDE user feedback… ++ @status ++ 配置 KDE 用户反馈… + + +- +- +- Error in KDE user feedback configuration. +- KDE 用户反馈配置中存在错误。 ++ ++ ++ Error in KDE user feedback configuration. ++ KDE 用户反馈配置中存在错误。 + + +- +- Could not configure KDE user feedback correctly, script error %1. +- 无法正确 KDE 用户反馈,脚本错误代码 %1。 ++ ++ Could not configure KDE user feedback correctly, script error %1. ++ 无法正确 KDE 用户反馈,脚本错误代码 %1。 + + +- +- Could not configure KDE user feedback correctly, Calamares error %1. +- 无法正确 KDE 用户反馈,Calamares 错误代码 %1。 ++ ++ Could not configure KDE user feedback correctly, Calamares error %1. ++ 无法正确 KDE 用户反馈,Calamares 错误代码 %1。 + +- +- ++ ++ + TrackingMachineUpdateManagerJob + +- +- Machine feedback +- 机器反馈 ++ ++ Machine feedback ++ 机器反馈 + + +- +- Configuring machine feedback… +- @status +- 正在配置机器反馈… ++ ++ Configuring machine feedback… ++ @status ++ 正在配置机器反馈… + + +- +- +- Error in machine feedback configuration. +- 机器反馈配置中存在错误。 ++ ++ ++ Error in machine feedback configuration. ++ 机器反馈配置中存在错误。 + + +- +- Could not configure machine feedback correctly, script error %1. +- 无法正确配置机器反馈,脚本错误代码 %1。 ++ ++ Could not configure machine feedback correctly, script error %1. ++ 无法正确配置机器反馈,脚本错误代码 %1。 + + +- +- Could not configure machine feedback correctly, Calamares error %1. +- 无法正确配置机器反馈,Calamares 错误代码 %1。 ++ ++ Could not configure machine feedback correctly, Calamares error %1. ++ 无法正确配置机器反馈,Calamares 错误代码 %1。 + +- +- ++ ++ + TrackingPage + +- +- Placeholder +- 占位符 ++ ++ Placeholder ++ 占位符 + + +- +- <html><head/><body><p>Click here to send <span style=" font-weight:600;">no information at all</span> about your installation.</p></body></html> +- <html><head/><body><p>单击此处 <span style=" font-weight:600;">不发送任何</span> 有关安装的信息。</p></body></html> ++ ++ <html><head/><body><p>Click here to send <span style=" font-weight:600;">no information at all</span> about your installation.</p></body></html> ++ <html><head/><body><p>单击此处 <span style=" font-weight:600;">不发送任何</span> 有关安装的信息。</p></body></html> + + +- +- <html><head/><body><p><a href="placeholder"><span style=" text-decoration: underline; color:#2980b9;">Click here for more information about user feedback</span></a></p></body></html> +- <html><head/><body><p><a href="placeholder"><span style=" text-decoration: underline; color:#2980b9;">点击此处以获取关于用户反馈的详细信息</span></a></p></body></html> ++ ++ <html><head/><body><p><a href="placeholder"><span style=" text-decoration: underline; color:#2980b9;">Click here for more information about user feedback</span></a></p></body></html> ++ <html><head/><body><p><a href="placeholder"><span style=" text-decoration: underline; color:#2980b9;">点击此处以获取关于用户反馈的详细信息</span></a></p></body></html> + + +- +- Tracking helps %1 to see how often it is installed, what hardware it is installed on and which applications are used. To see what will be sent, please click the help icon next to each area. +- 跟踪帮助 %1 以查看它的安装频率、安装硬件以及使用的应用程序。请点按每项旁的帮助图标以查看即将被发送的信息。 ++ ++ Tracking helps %1 to see how often it is installed, what hardware it is installed on and which applications are used. To see what will be sent, please click the help icon next to each area. ++ 跟踪帮助 %1 以查看它的安装频率、安装硬件以及使用的应用程序。请点按每项旁的帮助图标以查看即将被发送的信息。 + + +- +- By selecting this you will send information about your installation and hardware. This information will only be sent <b>once</b> after the installation finishes. +- 选中此项时,安装器将发送关于安装过程和硬件的信息。该信息仅会在安装结束后发送<b>一次</b> 。 ++ ++ By selecting this you will send information about your installation and hardware. This information will only be sent <b>once</b> after the installation finishes. ++ 选中此项时,安装器将发送关于安装过程和硬件的信息。该信息仅会在安装结束后发送<b>一次</b> 。 + + +- +- By selecting this you will periodically send information about your <b>machine</b> installation, hardware and applications, to %1. +- 通过选择此选项,您将定期将有关您 <b>计算机</b>的安装,硬件和应用程序的信息发送到 %1。 ++ ++ By selecting this you will periodically send information about your <b>machine</b> installation, hardware and applications, to %1. ++ 通过选择此选项,您将定期将有关您 <b>计算机</b>的安装,硬件和应用程序的信息发送到 %1。 + + +- +- By selecting this you will regularly send information about your <b>user</b> installation, hardware, applications and application usage patterns, to %1. +- 通过选择此选项,您将定期将有关<b>用户</b> 安装,硬件,应用程序和应用程序使用方式的信息发送到 %1。 ++ ++ By selecting this you will regularly send information about your <b>user</b> installation, hardware, applications and application usage patterns, to %1. ++ 通过选择此选项,您将定期将有关<b>用户</b> 安装,硬件,应用程序和应用程序使用方式的信息发送到 %1。 + +- +- ++ ++ + TrackingViewStep + +- +- Feedback +- @title +- 反馈 ++ ++ Feedback ++ @title ++ 反馈 + +- +- ++ ++ + UmountJob + +- +- Unmounting file systems… +- @status +- 正在卸载文件系统… ++ ++ Unmounting file systems… ++ @status ++ 正在卸载文件系统… + + +- +- No target system available. +- 没有可用的目标系统。 ++ ++ No target system available. ++ 没有可用的目标系统。 + + +- +- No rootMountPoint is set. +- 没有设定 root挂载点。 ++ ++ No rootMountPoint is set. ++ 没有设定 root挂载点。 + +- +- ++ ++ + UsersPage + +- +- <small>If more than one person will use this computer, you can create multiple accounts after setup.</small> +- <small>如果有多人要使用此计算机,您可以在安装后创建多个账户。</small> ++ ++ <small>If more than one person will use this computer, you can create multiple accounts after setup.</small> ++ <small>如果有多人要使用此计算机,您可以在安装后创建多个账户。</small> + + +- +- <small>If more than one person will use this computer, you can create multiple accounts after installation.</small> +- <small>如果有多人要使用此计算机,您可以在安装后创建多个账户。</small> ++ ++ <small>If more than one person will use this computer, you can create multiple accounts after installation.</small> ++ <small>如果有多人要使用此计算机,您可以在安装后创建多个账户。</small> + +- +- ++ ++ + UsersQmlViewStep + +- +- Users +- 用户 ++ ++ Users ++ 用户 + +- +- ++ ++ + UsersViewStep + +- +- Users +- 用户 ++ ++ Users ++ 用户 + +- +- ++ ++ + VariantModel + +- +- Key +- Column header for key/value +- Key ++ ++ Key ++ Column header for key/value ++ Key + + +- +- Value +- Column header for key/value +- ++ ++ Value ++ Column header for key/value ++ + +- +- ++ ++ + VolumeGroupBaseDialog + +- +- Create Volume Group +- 创建存储组 ++ ++ Create Volume Group ++ 创建存储组 + + +- +- List of Physical Volumes +- 物理分卷列表: ++ ++ List of Physical Volumes ++ 物理分卷列表: + + +- +- Volume Group Name: +- 分卷组名称: ++ ++ Volume Group Name: ++ 分卷组名称: + + +- +- Volume Group Type: +- 分卷组类型: ++ ++ Volume Group Type: ++ 分卷组类型: + + +- +- Physical Extent Size: +- 物理区域PE大小: ++ ++ Physical Extent Size: ++ 物理区域PE大小: + + +- +- MiB +- MiB ++ ++ MiB ++ MiB + + +- +- Total Size: +- 大小: ++ ++ Total Size: ++ 大小: + + +- +- Used Size: +- 已用空间: ++ ++ Used Size: ++ 已用空间: + + +- +- Total Sectors: +- 总扇区数: ++ ++ Total Sectors: ++ 总扇区数: + + +- +- Quantity of LVs: +- 逻辑分卷数量: ++ ++ Quantity of LVs: ++ 逻辑分卷数量: + +- +- ++ ++ + WelcomePage + +- +- +- Select application and system language +- 选择应用程序和系统语言 ++ ++ ++ Select application and system language ++ 选择应用程序和系统语言 ++ ++ ++ ++ language ++ 语言 + + +- +- Open donations website +- 打开捐赠信息网页 ++ Open donations website ++ 打开捐赠信息网页 + + +- +- &Donate +- 捐赠(&D) ++ &Donate ++ 捐赠(&D) + + +- +- Open help and support website +- 打开帮助和支持页面 ++ Open help and support website ++ 打开帮助和支持页面 + + +- +- &Support +- 支持信息(&S) ++ &Support ++ 支持信息(&S) + + +- +- Open issues and bug-tracking website +- 打开问题追踪网站 ++ Open issues and bug-tracking website ++ 打开问题追踪网站 + + +- +- &Known issues +- 已知问题(&K) ++ &Known issues ++ 已知问题(&K) + + +- +- Open release notes website +- 打开发布日志网页 ++ Open release notes website ++ 打开发布日志网页 + + +- +- &Release notes +- 发行注记(&R) ++ &Release notes ++ 发行注记(&R) + + +- +- About %1 Setup +- @title +- 关于 %1 安装程序 ++ ++ About %1 Setup ++ @title ++ 关于 %1 安装程序 + + +- +- About %1 Installer +- @title +- 关于 %1 安装程序 ++ ++ About %1 Installer ++ @title ++ 关于 %1 安装程序 + + +- +- %1 Support +- @action +- %1 的支持信息 ++ %1 Support ++ @action ++ %1 的支持信息 + +- +- ++ ++ + WelcomeQmlViewStep + +- +- Welcome +- @title +- 欢迎 ++ ++ Welcome ++ @title ++ 欢迎 + +- +- ++ ++ + WelcomeViewStep + +- +- Welcome +- @title +- 欢迎 ++ ++ Welcome ++ @title ++ 欢迎 + +- +- ++ ++ + ZfsJob + +- +- Creating ZFS pools and datasets… +- @status +- 正在创建 ZFS 池和数据集… ++ ++ Creating ZFS pools and datasets… ++ @status ++ 正在创建 ZFS 池和数据集… + + +- +- Failed to create zpool on +- 创建 zpool 失败于 ++ ++ Failed to create zpool on ++ 创建 zpool 失败于 + + +- +- Configuration Error +- 配置错误 ++ ++ Configuration Error ++ 配置错误 + + +- +- No partitions are available for ZFS. +- 没有可用于 ZFS 的分区。 ++ ++ No partitions are available for ZFS. ++ 没有可用于 ZFS 的分区。 + + +- +- Internal data missing +- 内部数据丢失 ++ ++ Internal data missing ++ 内部数据丢失 + + +- +- +- Failed to create zpool +- 创建 zpool 失败 ++ ++ ++ Failed to create zpool ++ 创建 zpool 失败 + + +- +- Failed to create dataset +- 创建数据集失败 ++ ++ Failed to create dataset ++ 创建数据集失败 + + +- +- The output was: +- 输出为: ++ ++ The output was: ++ 输出为: + +- +- ++ ++ + calamares-sidebar + +- +- About +- 关于 ++ ++ About ++ 关于 + + +- +- Debug +- 调试 ++ ++ Debug ++ 调试 + + +- +- About +- @button +- 关于 ++ ++ About ++ @button ++ 关于 + + +- +- Show information about Calamares +- @tooltip +- 显示关于 Calamares 的信息 ++ ++ Show information about easysoftware ++ @tooltip ++ 显示关于 easysoftware 的信息 + + +- +- Debug +- @button +- 调试 ++ ++ Show information about Calamares ++ @tooltip ++ + + +- +- Show debug information +- @tooltip +- 显示调试信息 ++ ++ ++ Debug ++ @button ++ 调试 + +- +- ++ ++ ++ ++ Show debug information ++ @tooltip ++ 显示调试信息 ++ ++ ++ + finishedq + +- +- Installation Completed +- 安装完成 ++ ++ Installation Completed ++ 安装完成 + + +- +- %1 has been installed on your computer.<br/> ++ ++ %1 has been installed on your computer.<br/> + You may now restart into your new system, or continue using the Live environment. +- %1 已安装在您的电脑上了。<br/> ++ %1 已安装在您的电脑上了。<br/> + 您现在可以重新启动到新系统,或是继续使用 Live 环境。 + + +- +- Close Installer +- 关闭安装程序 ++ ++ Close Installer ++ 关闭安装程序 + + +- +- Restart System +- 重启系统 ++ ++ Restart System ++ 重启系统 + + +- +- <p>A full log of the install is available as installation.log in the home directory of the Live user.<br/> ++ ++ <p>A full log of the install is available as installation.log in the home directory of the Live user.<br/> + This log is copied to /var/log/installation.log of the target system.</p> +- 安装过程中的翻译已经复制到了临时用户的家目录下 ++ 安装过程中的翻译已经复制到了临时用户的家目录下 + 于此同时安装日志也已经复制到了目标系统,路径为:/var/log/installation.log + +- +- ++ ++ + finishedq-qt6 + +- +- Installation Completed +- @title +- 安装完成 ++ ++ Installation Completed ++ @title ++ 安装完成 + + +- +- %1 has been installed on your computer.<br/> ++ ++ %1 has been installed on your computer.<br/> + You may now restart into your new system, or continue using the Live environment. +- @info, %1 is the product name +- %1 已安装在您的电脑上了。<br/> ++ @info, %1 is the product name ++ %1 已安装在您的电脑上了。<br/> + 您现在可以重新启动到新系统,或是继续使用 Live 环境。 + + +- +- Close Installer +- @button +- 关闭安装程序 ++ ++ Close Installer ++ @button ++ 关闭安装程序 + + +- +- Restart System +- @button +- 重启系统 ++ ++ Restart System ++ @button ++ 重启系统 + + +- +- <p>A full log of the install is available as installation.log in the home directory of the Live user.<br/> ++ ++ <p>A full log of the install is available as installation.log in the home directory of the Live user.<br/> + This log is copied to /var/log/installation.log of the target system.</p> +- @info +- 安装过程中的翻译已经复制到了临时用户的家目录下 ++ @info ++ 安装过程中的翻译已经复制到了临时用户的家目录下 + 于此同时安装日志也已经复制到了目标系统,路径为:/var/log/installation.log + +- +- ++ ++ + finishedq@mobile + +- +- Installation Completed +- @title +- 安装完成 ++ ++ Installation Completed ++ @title ++ 安装完成 + + +- +- %1 has been installed on your computer.<br/> ++ ++ %1 has been installed on your computer.<br/> + You may now restart your device. +- @info, %1 is the product name +- %1 已安装在您的计算机上。<br/> ++ @info, %1 is the product name ++ %1 已安装在您的计算机上。<br/> + 现在可以重新启动设备了。 + + +- +- Close +- @button +- 关闭 ++ ++ Close ++ @button ++ 关闭 + + +- +- Restart +- @button +- 重启 ++ ++ Restart ++ @button ++ 重启 + +- +- ++ ++ + keyboardq + +- +- Select a layout to activate keyboard preview +- @label +- 选择布局以激活键盘预览 ++ ++ Select a layout to activate keyboard preview ++ @label ++ 选择布局以激活键盘预览 + + +- +- <b>Keyboard model:&nbsp;&nbsp;</b> +- @label +- <b>键盘型号:&nbsp;&nbsp;</b> ++ ++ <b>Keyboard model:&nbsp;&nbsp;</b> ++ @label ++ <b>键盘型号:&nbsp;&nbsp;</b> + + +- +- Layout +- @label +- 布局 ++ ++ Layout ++ @label ++ 布局 + + +- +- Variant +- @label +- 变体 ++ ++ Variant ++ @label ++ 变体 + + +- +- Type here to test your keyboard… +- @label +- 在此处输入以测试键盘… ++ ++ Type here to test your keyboard… ++ @label ++ 在此处输入以测试键盘… + +- +- ++ ++ + keyboardq-qt6 + +- +- Select a layout to activate keyboard preview +- @label +- 选择布局以激活键盘预览 ++ ++ Select a layout to activate keyboard preview ++ @label ++ 选择布局以激活键盘预览 + + +- +- <b>Keyboard model:&nbsp;&nbsp;</b> +- @label +- <b>键盘型号:&nbsp;&nbsp;</b> ++ ++ <b>Keyboard model:&nbsp;&nbsp;</b> ++ @label ++ <b>键盘型号:&nbsp;&nbsp;</b> + + +- +- Layout +- @label +- 布局 ++ ++ Layout ++ @label ++ 布局 + + +- +- Variant +- @label +- 变体 ++ ++ Variant ++ @label ++ 变体 + + +- +- Type here to test your keyboard… +- @label +- 在此处输入以测试键盘… ++ ++ Type here to test your keyboard… ++ @label ++ 在此处输入以测试键盘… + +- +- ++ ++ + localeq + +- +- +- Change +- @button +- 更改 ++ ++ ++ Change ++ @button ++ 更改 + + +- +- <h3>Languages</h3> </br> ++ ++ <h3>Languages</h3> </br> + The system locale setting affects the language and character set for some command line user interface elements. The current setting is <strong>%1</strong>. +- @info +- <h3>语言</h3></br> ++ @info ++ <h3>语言</h3></br> + 系统语言区域设置会影响部份命令行用户界面的语言及字符集。 当前设置是 <strong>%1</strong>。 + + +- +- <h3>Locales</h3> </br> ++ ++ <h3>Locales</h3> </br> + The system locale setting affects the numbers and dates format. The current setting is <strong>%1</strong>. +- @info +- <h3>区域</h3></br> ++ @info ++ <h3>区域</h3></br> + 系统区域设置会影响数字和日期格式。 当前设置是 <strong>%1</strong>。 + +- +- ++ ++ + localeq-qt6 + +- +- +- Change +- @button +- 更改 ++ ++ ++ Change ++ @button ++ 更改 + + +- +- <h3>Languages</h3> </br> ++ ++ <h3>Languages</h3> </br> + The system locale setting affects the language and character set for some command line user interface elements. The current setting is <strong>%1</strong>. +- @info +- <h3>语言</h3></br> ++ @info ++ <h3>语言</h3></br> + 系统语言区域设置会影响部份命令行用户界面的语言及字符集。 当前设置是 <strong>%1</strong>。 + + +- +- <h3>Locales</h3> </br> ++ ++ <h3>Locales</h3> </br> + The system locale setting affects the numbers and dates format. The current setting is <strong>%1</strong>. +- @info +- <h3>区域</h3></br> ++ @info ++ <h3>区域</h3></br> + 系统区域设置会影响数字和日期格式。 当前设置是 <strong>%1</strong>。 + +- +- ++ ++ + notesqml + +- +- <h3>%1</h3> ++ ++ <h3>%1</h3> + <p>These are example release notes.</p> +- <h3>%1</h3> ++ <h3>%1</h3> + <p>这些是发布日志样例</p> + +- +- ++ ++ + packagechooserq + +- +- LibreOffice is a powerful and free office suite, used by millions of people around the world. It includes several applications that make it the most versatile Free and Open Source office suite on the market.<br/> ++ ++ LibreOffice is a powerful and free office suite, used by millions of people around the world. It includes several applications that make it the most versatile Free and Open Source office suite on the market.<br/> + Default option. +- LibreOffice 是強大且自由的辦办公软件,世界上有百万级别的用户量。其中包括多种组件模块使其成为世界上最强大的开源并自由的办公软件。<br/> ++ LibreOffice 是強大且自由的辦办公软件,世界上有百万级别的用户量。其中包括多种组件模块使其成为世界上最强大的开源并自由的办公软件。<br/> + 预设选项。 + + +- +- LibreOffice +- LibreOffice ++ ++ LibreOffice ++ LibreOffice + + +- +- If you don't want to install an office suite, just select No Office Suite. You can always add one (or more) later on your installed system as the need arrives. +- 如果你不想安装办公软件,请选择不安装办公软件的选项即可。稍后您可以在安装好的系统上根据个人喜好自行选择安装办公软件与否。您可以随时在安装好的系统上添加一个(或多个)办公软件。 ++ ++ If you don't want to install an office suite, just select No Office Suite. You can always add one (or more) later on your installed system as the need arrives. ++ 如果你不想安装办公软件,请选择不安装办公软件的选项即可。稍后您可以在安装好的系统上根据个人喜好自行选择安装办公软件与否。您可以随时在安装好的系统上添加一个(或多个)办公软件。 + + +- +- No Office Suite +- 无办公软件 ++ ++ No Office Suite ++ 无办公软件 + + +- +- Create a minimal Desktop install, remove all extra applications and decide later on what you would like to add to your system. Examples of what won't be on such an install, there will be no Office Suite, no media players, no image viewer or print support. It will be just a desktop, file browser, package manager, text editor and simple web-browser. +- 建立最小化的桌面安装,移除所有的附加应用。在稍后自行选择需要安装至系统的应用。同时不会有任何的模板和例子可供选择。无办公软件,无媒体播放器,无图片查看器或者打印支持。仅仅有一个桌面,文件管理器,包管理器,文本编辑器和一个网页浏览器。 ++ ++ Create a minimal Desktop install, remove all extra applications and decide later on what you would like to add to your system. Examples of what won't be on such an install, there will be no Office Suite, no media players, no image viewer or print support. It will be just a desktop, file browser, package manager, text editor and simple web-browser. ++ 建立最小化的桌面安装,移除所有的附加应用。在稍后自行选择需要安装至系统的应用。同时不会有任何的模板和例子可供选择。无办公软件,无媒体播放器,无图片查看器或者打印支持。仅仅有一个桌面,文件管理器,包管理器,文本编辑器和一个网页浏览器。 + + +- +- Minimal Install +- 最小化安装 ++ ++ Minimal Install ++ 最小化安装 + + +- +- Please select an option for your install, or use the default: LibreOffice included. +- 请为你的安装指定一个选项,或者使用默认选项:安装LibreOffice ++ ++ Please select an option for your install, or use the default: LibreOffice included. ++ 请为你的安装指定一个选项,或者使用默认选项:安装LibreOffice + +- +- ++ ++ + packagechooserq-qt6 + +- +- LibreOffice is a powerful and free office suite, used by millions of people around the world. It includes several applications that make it the most versatile Free and Open Source office suite on the market.<br/> ++ ++ LibreOffice is a powerful and free office suite, used by millions of people around the world. It includes several applications that make it the most versatile Free and Open Source office suite on the market.<br/> + Default option. +- LibreOffice 是強大且自由的辦办公软件,世界上有百万级别的用户量。其中包括多种组件模块使其成为世界上最强大的开源并自由的办公软件。<br/> ++ LibreOffice 是強大且自由的辦办公软件,世界上有百万级别的用户量。其中包括多种组件模块使其成为世界上最强大的开源并自由的办公软件。<br/> + 预设选项。 + + +- +- LibreOffice +- LibreOffice ++ ++ LibreOffice ++ LibreOffice + + +- +- If you don't want to install an office suite, just select No Office Suite. You can always add one (or more) later on your installed system as the need arrives. +- 如果你不想安装办公软件,请选择不安装办公软件的选项即可。稍后您可以在安装好的系统上根据个人喜好自行选择安装办公软件与否。您可以随时在安装好的系统上添加一个(或多个)办公软件。 ++ ++ If you don't want to install an office suite, just select No Office Suite. You can always add one (or more) later on your installed system as the need arrives. ++ 如果你不想安装办公软件,请选择不安装办公软件的选项即可。稍后您可以在安装好的系统上根据个人喜好自行选择安装办公软件与否。您可以随时在安装好的系统上添加一个(或多个)办公软件。 + + +- +- No Office Suite +- 无办公软件 ++ ++ No Office Suite ++ 无办公软件 + + +- +- Create a minimal Desktop install, remove all extra applications and decide later on what you would like to add to your system. Examples of what won't be on such an install, there will be no Office Suite, no media players, no image viewer or print support. It will be just a desktop, file browser, package manager, text editor and simple web-browser. +- 建立最小化的桌面安装,移除所有的附加应用。在稍后自行选择需要安装至系统的应用。同时不会有任何的模板和例子可供选择。无办公软件,无媒体播放器,无图片查看器或者打印支持。仅仅有一个桌面,文件管理器,包管理器,文本编辑器和一个网页浏览器。 ++ ++ Create a minimal Desktop install, remove all extra applications and decide later on what you would like to add to your system. Examples of what won't be on such an install, there will be no Office Suite, no media players, no image viewer or print support. It will be just a desktop, file browser, package manager, text editor and simple web-browser. ++ 建立最小化的桌面安装,移除所有的附加应用。在稍后自行选择需要安装至系统的应用。同时不会有任何的模板和例子可供选择。无办公软件,无媒体播放器,无图片查看器或者打印支持。仅仅有一个桌面,文件管理器,包管理器,文本编辑器和一个网页浏览器。 + + +- +- Minimal Install +- 最小化安装 ++ ++ Minimal Install ++ 最小化安装 + + +- +- Please select an option for your install, or use the default: LibreOffice included. +- 请为你的安装指定一个选项,或者使用默认选项:安装LibreOffice ++ ++ Please select an option for your install, or use the default: LibreOffice included. ++ 请为你的安装指定一个选项,或者使用默认选项:安装LibreOffice + +- +- ++ ++ + release_notes + +- +- <h3>%1</h3> ++ <h3>%1</h3> + <p>This an example QML file, showing options in RichText with Flickable content.</p> + + <p>QML with RichText can use HTML tags, Flickable content is useful for touchscreens.</p> +@@ -4890,7 +5023,7 @@ Output: + </ul> + + <p>The vertical scrollbar is adjustable, current width set to 10.</p> +- <h3>%1</h3> ++ <h3>%1</h3> + <p>这是一个QML 示例文件,显示了具有 Flickable 内容的 RichText 选项。</p> + + <p>带有 RichText 的 QML 可以使用 HTML 标签, +@@ -4914,335 +5047,364 @@ Output: + <p>垂直滚动条是可调的,当前宽度设置为10。</p> + + +- +- Back +- 后退 ++ ++ ### %1 ++This an example QML file, showing options in Markdown with Flickable content. ++ ++QML with RichText can use HTML tags, with Markdown it uses the simple Markdown syntax, Flickable content is useful for touchscreens. ++ ++**This is bold text** ++ ++*This is italic text* ++ ++_This is underlined text_ ++ ++> blockquote ++ ++~~This is strikethrough~~ ++ ++Code example: ++``` ++ls -l /home ++``` ++ ++**Lists:** ++ * Intel CPU systems ++ * AMD CPU systems ++ ++The vertical scrollbar is adjustable, current width set to 10. ++ ++ ++ ++ ++ Back ++ 后退 + +- +- ++ ++ + usersq + +- +- Pick your user name and credentials to login and perform admin tasks +- 选择您的用户名和凭据登录并执行管理任务 ++ ++ Pick your user name and credentials to login and perform admin tasks ++ 选择您的用户名和凭据登录并执行管理任务 + + +- +- What is your name? +- 您的姓名? ++ ++ What is your name? ++ 您的姓名? + + +- +- Your full name +- 您的全名 ++ ++ Your full name ++ 您的全名 + + +- +- What name do you want to use to log in? +- 您想要使用的登录用户名是? ++ ++ What name do you want to use to log in? ++ 您想要使用的登录用户名是? + + +- +- Login name +- 登录名 ++ ++ Login name ++ 登录名 + + +- +- If more than one person will use this computer, you can create multiple accounts after installation. +- 如果有多人要使用此计算机,您可以在安装后创建多个账户。 ++ ++ If more than one person will use this computer, you can create multiple accounts after installation. ++ 如果有多人要使用此计算机,您可以在安装后创建多个账户。 + + +- +- Only lowercase letters, numbers, underscore and hyphen are allowed. +- 只允许小写字母、数组、下划线"_" 和 连字符"-" ++ ++ Only lowercase letters, numbers, underscore and hyphen are allowed. ++ 只允许小写字母、数组、下划线"_" 和 连字符"-" + + +- +- root is not allowed as username. +- 用户名不能为root ++ ++ root is not allowed as username. ++ 用户名不能为root + + +- +- What is the name of this computer? +- 计算机名称为? ++ ++ What is the name of this computer? ++ 计算机名称为? + + +- +- Computer name +- 计算机名称 ++ ++ Computer name ++ 计算机名称 + + +- +- This name will be used if you make the computer visible to others on a network. +- 将计算机设置为对其他网络上计算机可见时将使用此名称。 ++ ++ This name will be used if you make the computer visible to others on a network. ++ 将计算机设置为对其他网络上计算机可见时将使用此名称。 + + +- +- Only letters, numbers, underscore and hyphen are allowed, minimal of two characters. +- 只允许字母、数组、下划线"_" 和 连字符"-",最少两个字符。 ++ ++ Only letters, numbers, underscore and hyphen are allowed, minimal of two characters. ++ 只允许字母、数组、下划线"_" 和 连字符"-",最少两个字符。 + + +- +- localhost is not allowed as hostname. +- localhost不能为用户名 ++ ++ localhost is not allowed as hostname. ++ localhost不能为用户名 + + +- +- Choose a password to keep your account safe. +- 选择一个密码来保证您的账户安全。 ++ ++ Choose a password to keep your account safe. ++ 选择一个密码来保证您的账户安全。 + + +- +- Password +- 密码 ++ ++ Password ++ 密码 + + +- +- Repeat password +- 确认密码 ++ ++ Repeat password ++ 确认密码 + + +- +- Enter the same password twice, so that it can be checked for typing errors. A good password will contain a mixture of letters, numbers and punctuation, should be at least eight characters long, and should be changed at regular intervals. +- 输入相同密码两次,以检查输入错误。好的密码包含字母,数字,标点的组合,应当至少为 8 个字符长,并且应按一定周期更换。 ++ ++ Enter the same password twice, so that it can be checked for typing errors. A good password will contain a mixture of letters, numbers and punctuation, should be at least eight characters long, and should be changed at regular intervals. ++ 输入相同密码两次,以检查输入错误。好的密码包含字母,数字,标点的组合,应当至少为 8 个字符长,并且应按一定周期更换。 + + +- +- Reuse user password as root password +- 重用用户密码作为 root 密码 ++ ++ Reuse user password as root password ++ 重用用户密码作为 root 密码 + + +- +- Use the same password for the administrator account. +- 为管理员帐号使用同样的密码。 ++ ++ Use the same password for the administrator account. ++ 为管理员帐号使用同样的密码。 + + +- +- Choose a root password to keep your account safe. +- 选择一个 root 密码来保证您的账户安全。 ++ ++ Choose a root password to keep your account safe. ++ 选择一个 root 密码来保证您的账户安全。 + + +- +- Root password +- Root 密码 ++ ++ Root password ++ Root 密码 + + +- +- Repeat root password +- 确认 Root 密码 ++ ++ Repeat root password ++ 确认 Root 密码 + + +- +- Enter the same password twice, so that it can be checked for typing errors. +- 输入相同密码两次,以检查输入错误。 ++ ++ Enter the same password twice, so that it can be checked for typing errors. ++ 输入相同密码两次,以检查输入错误。 + + +- +- Log in automatically without asking for the password +- 不询问密码自动登录 ++ ++ Log in automatically without asking for the password ++ 不询问密码自动登录 + + +- +- Validate passwords quality +- 验证密码质量 ++ ++ Validate passwords quality ++ 验证密码质量 + + +- +- When this box is checked, password-strength checking is done and you will not be able to use a weak password. +- 若选中此项,密码强度检测会开启,你将不被允许使用弱密码。 ++ ++ When this box is checked, password-strength checking is done and you will not be able to use a weak password. ++ 若选中此项,密码强度检测会开启,你将不被允许使用弱密码。 + +- +- ++ ++ + usersq-qt6 + +- +- Pick your user name and credentials to login and perform admin tasks +- 选择您的用户名和凭据登录并执行管理任务 ++ ++ Pick your user name and credentials to login and perform admin tasks ++ 选择您的用户名和凭据登录并执行管理任务 + + +- +- What is your name? +- 您的姓名? ++ ++ What is your name? ++ 您的姓名? + + +- +- Your full name +- 您的全名 ++ ++ Your full name ++ 您的全名 + + +- +- What name do you want to use to log in? +- 您想要使用的登录用户名是? ++ ++ What name do you want to use to log in? ++ 您想要使用的登录用户名是? + + +- +- Login name +- 登录名 ++ ++ Login name ++ 登录名 + + +- +- If more than one person will use this computer, you can create multiple accounts after installation. +- 如果有多人要使用此计算机,您可以在安装后创建多个账户。 ++ ++ If more than one person will use this computer, you can create multiple accounts after installation. ++ 如果有多人要使用此计算机,您可以在安装后创建多个账户。 + + +- +- Only lowercase letters, numbers, underscore and hyphen are allowed. +- 只允许小写字母、数组、下划线"_" 和 连字符"-" ++ ++ Only lowercase letters, numbers, underscore and hyphen are allowed. ++ 只允许小写字母、数组、下划线"_" 和 连字符"-" + + +- +- root is not allowed as username. +- 用户名不能为root ++ ++ root is not allowed as username. ++ 用户名不能为root + + +- +- What is the name of this computer? +- 计算机名称为? ++ ++ What is the name of this computer? ++ 计算机名称为? + + +- +- Computer name +- 计算机名称 ++ ++ Computer name ++ 计算机名称 + + +- +- This name will be used if you make the computer visible to others on a network. +- 将计算机设置为对其他网络上计算机可见时将使用此名称。 ++ ++ This name will be used if you make the computer visible to others on a network. ++ 将计算机设置为对其他网络上计算机可见时将使用此名称。 + + +- +- Only letters, numbers, underscore and hyphen are allowed, minimal of two characters. +- 只允许字母、数组、下划线"_" 和 连字符"-",最少两个字符。 ++ ++ Only letters, numbers, underscore and hyphen are allowed, minimal of two characters. ++ 只允许字母、数组、下划线"_" 和 连字符"-",最少两个字符。 + + +- +- localhost is not allowed as hostname. +- localhost不能为用户名 ++ ++ localhost is not allowed as hostname. ++ localhost不能为用户名 + + +- +- Choose a password to keep your account safe. +- 选择一个密码来保证您的账户安全。 ++ ++ Choose a password to keep your account safe. ++ 选择一个密码来保证您的账户安全。 + + +- +- Password +- 密码 ++ ++ Password ++ 密码 + + +- +- Repeat password +- 确认密码 ++ ++ Repeat password ++ 确认密码 + + +- +- Enter the same password twice, so that it can be checked for typing errors. A good password will contain a mixture of letters, numbers and punctuation, should be at least eight characters long, and should be changed at regular intervals. +- 输入相同密码两次,以检查输入错误。好的密码包含字母,数字,标点的组合,应当至少为 8 个字符长,并且应按一定周期更换。 ++ ++ Enter the same password twice, so that it can be checked for typing errors. A good password will contain a mixture of letters, numbers and punctuation, should be at least eight characters long, and should be changed at regular intervals. ++ 输入相同密码两次,以检查输入错误。好的密码包含字母,数字,标点的组合,应当至少为 8 个字符长,并且应按一定周期更换。 + + +- +- Reuse user password as root password +- 重用用户密码作为 root 密码 ++ ++ Reuse user password as root password ++ 重用用户密码作为 root 密码 + + +- +- Use the same password for the administrator account. +- 为管理员帐号使用同样的密码。 ++ ++ Use the same password for the administrator account. ++ 为管理员帐号使用同样的密码。 + + +- +- Choose a root password to keep your account safe. +- 选择一个 root 密码来保证您的账户安全。 ++ ++ Choose a root password to keep your account safe. ++ 选择一个 root 密码来保证您的账户安全。 + + +- +- Root password +- Root 密码 ++ ++ Root password ++ Root 密码 + + +- +- Repeat root password +- 确认 Root 密码 ++ ++ Repeat root password ++ 确认 Root 密码 + + +- +- Enter the same password twice, so that it can be checked for typing errors. +- 输入相同密码两次,以检查输入错误。 ++ ++ Enter the same password twice, so that it can be checked for typing errors. ++ 输入相同密码两次,以检查输入错误。 + + +- +- Log in automatically without asking for the password +- 不询问密码自动登录 ++ ++ Log in automatically without asking for the password ++ 不询问密码自动登录 + + +- +- Validate passwords quality +- 验证密码质量 ++ ++ Validate passwords quality ++ 验证密码质量 + + +- +- When this box is checked, password-strength checking is done and you will not be able to use a weak password. +- 若选中此项,密码强度检测会开启,你将不被允许使用弱密码。 ++ ++ When this box is checked, password-strength checking is done and you will not be able to use a weak password. ++ 若选中此项,密码强度检测会开启,你将不被允许使用弱密码。 + +- +- ++ ++ + welcomeq + +- +- <h3>Welcome to the %1 <quote>%2</quote> installer</h3> ++ ++ <h3>Welcome to the %1 <quote>%2</quote> installer</h3> + <p>This program will ask you some questions and set up %1 on your computer.</p> +- <h3>欢迎来到 %1 <quote>%2</quote> 安装程序</h3> ++ <h3>欢迎来到 %1 <quote>%2</quote> 安装程序</h3> + <p>这个程序将询问您一些问题并在您的计算机上安装 %1。</p> + + +- +- Support +- 支持 ++ ++ Support ++ 支持 + + +- +- Known Issues +- 已知问题 ++ ++ Known Issues ++ 已知问题 + + +- +- Release Notes +- 发行说明 ++ ++ Release Notes ++ 发行说明 + + +- +- Donate +- 捐赠 ++ ++ Donate ++ 捐赠 + +- +- ++ ++ + welcomeq-qt6 + +- +- <h3>Welcome to the %1 <quote>%2</quote> installer</h3> ++ ++ <h3>Welcome to the %1 <quote>%2</quote> installer</h3> + <p>This program will ask you some questions and set up %1 on your computer.</p> +- <h3>欢迎来到 %1 <quote>%2</quote> 安装程序</h3> ++ <h3>欢迎来到 %1 <quote>%2</quote> 安装程序</h3> + <p>这个程序将询问您一些问题并在您的计算机上安装 %1。</p> + + +- +- Support +- 支持 ++ ++ Support ++ 支持 + + +- +- Known Issues +- 已知问题 ++ ++ Known Issues ++ 已知问题 + + +- +- Release Notes +- 发行说明 ++ ++ Release Notes ++ 发行说明 + + +- +- Donate +- 捐赠 ++ ++ Donate ++ 捐赠 + +- ++ + +diff --git a/lang/calamares_zh_HK.ts b/lang/calamares_zh_HK.ts +index 561087f..9f5dec5 100644 +--- a/lang/calamares_zh_HK.ts ++++ b/lang/calamares_zh_HK.ts +@@ -1,5195 +1,5267 @@ + + +- +- ++ ++ + AboutData + +- +- <h1>%1</h1><br/><strong>%2<br/> for %3</strong><br/><br/> +- ++ ++ <br/><h2>Release:%1</h2><br/> ++ <br/><h1>發行版本:%1</h1><br/> + + +- +- Thanks to <a href="https://calamares.io/team/">the Calamares team</a> and the <a href="https://app.transifex.com/calamares/calamares/">Calamares translators team</a>. +- ++ ++ <strong>Thanks to the openEuler team.</strong> ++ <strong>感謝 openEuler 團隊。</strong> + + +- +- <a href="https://calamares.io/">Calamares</a> development is sponsored by <br/><a href="http://www.blue-systems.com/">Blue Systems</a> - Liberating Software. +- ++ ++ Copyright %1-%2 %3 &lt;%4&gt;<br/> ++ Copyright year-year Name <email-address> ++ + ++ ++ ++ ActiveDirectoryJob + +- +- Copyright %1-%2 %3 &lt;%4&gt;<br/> +- Copyright year-year Name <email-address> +- ++ ++ Enroll system in Active Directory ++ @label ++ + +- +- ++ ++ ++ Enrolling system in Active Directory… ++ @status ++ ++ ++ ++ + AutoMountManagementJob + +- +- Managing auto-mount settings… +- @status +- ++ ++ Managing auto-mount settings… ++ @status ++ + +- +- ++ ++ + BootInfoWidget + +- +- The <strong>boot environment</strong> of this system.<br><br>Older x86 systems only support <strong>BIOS</strong>.<br>Modern systems usually use <strong>EFI</strong>, but may also show up as BIOS if started in compatibility mode. +- 這個系統的<strong>開機環境</strong>。<br><br>較舊的 x86 系統只支援 <strong>BIOS</strong>。<br>現時的系統則通常使用 <strong>EFI</strong>,但若使用相容模式 (CSM),也可能顯示為 BIOS。 ++ ++ The <strong>boot environment</strong> of this system.<br><br>Older x86 systems only support <strong>BIOS</strong>.<br>Modern systems usually use <strong>EFI</strong>, but may also show up as BIOS if started in compatibility mode. ++ 這個系統的<strong>開機環境</strong>。<br><br>較舊的 x86 系統只支援 <strong>BIOS</strong>。<br>現時的系統則通常使用 <strong>EFI</strong>,但若使用相容模式 (CSM),也可能顯示為 BIOS。 + + +- +- This system was started with an <strong>EFI</strong> boot environment.<br><br>To configure startup from an EFI environment, this installer must deploy a boot loader application, like <strong>GRUB</strong> or <strong>systemd-boot</strong> on an <strong>EFI System Partition</strong>. This is automatic, unless you choose manual partitioning, in which case you must choose it or create it on your own. +- 這個系統以 <strong>EFI</strong> 開機。<br><br>要從 EFI 環境開機,本安裝程式必須安裝開機載入器程式,像是 <strong>GRUB</strong> 或 <strong>systemd-boot</strong> 在 <strong>EFI 系統分割區</strong>。這是自動的,除非選擇手動分割;在這種情況,您必須自行選取或建立它。 ++ ++ This system was started with an <strong>EFI</strong> boot environment.<br><br>To configure startup from an EFI environment, this installer must deploy a boot loader application, like <strong>GRUB</strong> or <strong>systemd-boot</strong> on an <strong>EFI System Partition</strong>. This is automatic, unless you choose manual partitioning, in which case you must choose it or create it on your own. ++ 這個系統以 <strong>EFI</strong> 開機。<br><br>要從 EFI 環境開機,本安裝程式必須安裝開機載入器程式,像是 <strong>GRUB</strong> 或 <strong>systemd-boot</strong> 在 <strong>EFI 系統分割區</strong>。這是自動的,除非選擇手動分割;在這種情況,您必須自行選取或建立它。 + + +- +- This system was started with a <strong>BIOS</strong> boot environment.<br><br>To configure startup from a BIOS environment, this installer must install a boot loader, like <strong>GRUB</strong>, either at the beginning of a partition or on the <strong>Master Boot Record</strong> near the beginning of the partition table (preferred). This is automatic, unless you choose manual partitioning, in which case you must set it up on your own. +- ++ ++ This system was started with a <strong>BIOS</strong> boot environment.<br><br>To configure startup from a BIOS environment, this installer must install a boot loader, like <strong>GRUB</strong>, either at the beginning of a partition or on the <strong>Master Boot Record</strong> near the beginning of the partition table (preferred). This is automatic, unless you choose manual partitioning, in which case you must set it up on your own. ++ + +- +- ++ ++ + BootLoaderModel + +- +- Master Boot Record of %1 +- @info +- ++ ++ Master Boot Record of %1 ++ @info ++ + + +- +- Boot Partition +- @info +- ++ ++ Boot Partition ++ @info ++ + + +- +- System Partition +- @info +- ++ ++ System Partition ++ @info ++ + + +- +- Do not install a boot loader +- @label +- ++ ++ Do not install a boot loader ++ @label ++ + + +- +- %1 (%2) +- ++ ++ %1 (%2) ++ + +- +- ++ ++ + Calamares::BlankViewStep + +- +- Blank Page +- ++ ++ Blank Page ++ + +- +- ++ ++ + Calamares::DebugWindow + +- +- GlobalStorage +- ++ ++ GlobalStorage ++ + + +- +- JobQueue +- ++ ++ JobQueue ++ + + +- +- Modules +- ++ ++ Modules ++ + + +- +- Type: +- ++ ++ Type: ++ + + +- +- +- none +- ++ ++ ++ none ++ + + +- +- Interface: +- ++ ++ Interface: ++ + + +- +- Crashes Calamares, so that Dr. Konqi can look at it. +- ++ ++ Crashes Calamares, so that Dr. Konqi can look at it. ++ + + +- +- Reloads the stylesheet from the branding directory. +- ++ ++ Reloads the stylesheet from the branding directory. ++ + + +- +- Reload Stylesheet +- ++ ++ Reload Stylesheet ++ + + +- +- Displays the tree of widget names in the log (for stylesheet debugging). +- ++ ++ Displays the tree of widget names in the log (for stylesheet debugging). ++ + + +- +- Widget Tree +- ++ ++ Widget Tree ++ + + +- +- Uploads the session log to the configured pastebin. +- ++ ++ Uploads the session log to the configured pastebin. ++ + + +- +- Send Session Log +- ++ ++ Send Session Log ++ + + +- +- Debug Information +- @title +- ++ ++ Debug Information ++ @title ++ + +- +- ++ ++ + Calamares::ExecutionViewStep + +- +- %p% +- Progress percentage indicator: %p is where the number 0..100 is placed +- ++ ++ %p% ++ Progress percentage indicator: %p is where the number 0..100 is placed ++ + + +- +- Set Up +- @label +- ++ ++ Set Up ++ @label ++ + + +- +- Install +- @label +- ++ ++ Install ++ @label ++ + +- +- ++ ++ + Calamares::FailJob + +- +- Job failed (%1) +- ++ ++ Job failed (%1) ++ + + +- +- Programmed job failure was explicitly requested. +- ++ ++ Programmed job failure was explicitly requested. ++ + +- +- ++ ++ + Calamares::JobThread + +- +- Done +- ++ ++ Done ++ + +- +- ++ ++ + Calamares::NamedJob + +- +- Example job (%1) +- ++ ++ Example job (%1) ++ + +- +- ++ ++ + Calamares::ProcessJob + +- +- Running command %1 in target system… +- @status +- ++ ++ Running command %1 in target system… ++ @status ++ + + +- +- Running command %1… +- @status +- ++ ++ Running command %1… ++ @status ++ + +- +- ++ ++ + Calamares::Python::Job + +- +- Running %1 operation. +- ++ ++ Running %1 operation. ++ + + +- +- Bad working directory path +- ++ ++ Bad working directory path ++ + + +- +- Working directory %1 for python job %2 is not readable. +- ++ ++ Working directory %1 for python job %2 is not readable. ++ + + +- +- +- +- +- +- +- Bad main script file +- ++ ++ ++ ++ ++ ++ ++ Bad main script file ++ + + +- +- Main script file %1 for python job %2 is not readable. +- ++ ++ Main script file %1 for python job %2 is not readable. ++ + + +- +- Bad internal script +- ++ ++ Bad internal script ++ + + +- +- Internal script for python job %1 raised an exception. +- ++ ++ Internal script for python job %1 raised an exception. ++ + + +- +- Main script file %1 for python job %2 could not be loaded because it raised an exception. +- ++ ++ Main script file %1 for python job %2 could not be loaded because it raised an exception. ++ + + +- +- Main script file %1 for python job %2 raised an exception. +- ++ ++ Main script file %1 for python job %2 raised an exception. ++ + + +- +- +- Main script file %1 for python job %2 returned invalid results. +- ++ ++ ++ Main script file %1 for python job %2 returned invalid results. ++ + + +- +- Main script file %1 for python job %2 does not contain a run() function. +- ++ ++ Main script file %1 for python job %2 does not contain a run() function. ++ + +- +- ++ ++ + Calamares::PythonJob + +- +- Running %1 operation… +- @status +- ++ ++ Running %1 operation… ++ @status ++ + + +- +- Bad working directory path +- @error +- ++ ++ Bad working directory path ++ @error ++ + + +- +- Working directory %1 for python job %2 is not readable. +- @error +- ++ ++ Working directory %1 for python job %2 is not readable. ++ @error ++ + + +- +- Bad main script file +- @error +- ++ ++ Bad main script file ++ @error ++ + + +- +- Main script file %1 for python job %2 is not readable. +- @error +- ++ ++ Main script file %1 for python job %2 is not readable. ++ @error ++ + + +- +- Boost.Python error in job "%1" +- @error +- ++ ++ Boost.Python error in job "%1" ++ @error ++ + +- +- ++ ++ + Calamares::QmlViewStep + +- +- Loading… +- @status +- ++ ++ Loading… ++ @status ++ + + +- +- QML step <i>%1</i>. +- @label +- ++ ++ QML step <i>%1</i>. ++ @label ++ + + +- +- Loading failed. +- @info +- ++ ++ Loading failed. ++ @info ++ + +- +- ++ ++ + Calamares::RequirementsChecker + +- +- Requirements checking for module '%1' is complete. +- @info +- ++ ++ Requirements checking for module '%1' is complete. ++ @info ++ + + +- +- Waiting for %n module(s)… +- @status +- +- +- ++ ++ Waiting for %n module(s)… ++ @status ++ ++ ++ + + +- +- (%n second(s)) +- @status +- +- +- ++ ++ (%n second(s)) ++ @status ++ ++ ++ + + +- +- System-requirements checking is complete. +- @info +- ++ ++ System-requirements checking is complete. ++ @info ++ + +- +- ++ ++ + Calamares::ViewManager + +- +- The upload was unsuccessful. No web-paste was done. +- ++ ++ The upload was unsuccessful. No web-paste was done. ++ + + +- +- Install log posted to ++ ++ Install log posted to + + %1 + + Link copied to clipboard +- ++ + + +- +- Install Log Paste URL +- ++ ++ Install Log Paste URL ++ + + +- +- &Yes +- ++ ++ &Yes ++ + + +- +- &No +- ++ ++ &No ++ + + +- +- &Close +- ++ ++ &Close ++ + + +- +- Setup Failed +- @title +- ++ ++ Setup Failed ++ @title ++ + + +- +- Installation Failed +- @title +- ++ ++ Installation Failed ++ @title ++ + + +- +- Error +- @title +- ++ ++ Error ++ @title ++ + + +- +- Calamares Initialization Failed +- @title +- ++ ++ Calamares Initialization Failed ++ @title ++ + + +- +- %1 can not be installed. Calamares was unable to load all of the configured modules. This is a problem with the way Calamares is being used by the distribution. +- @info +- ++ ++ %1 can not be installed. Calamares was unable to load all of the configured modules. This is a problem with the way Calamares is being used by the distribution. ++ @info ++ + + +- +- <br/>The following modules could not be loaded: +- @info +- ++ ++ <br/>The following modules could not be loaded: ++ @info ++ + + +- +- Continue with Setup? +- @title +- ++ ++ Continue with Setup? ++ @title ++ + + +- +- Continue with Installation? +- @title +- ++ ++ Continue with Installation? ++ @title ++ + + +- +- The %1 setup program is about to make changes to your disk in order to set up %2.<br/><strong>You will not be able to undo these changes.</strong> +- %1 is short product name, %2 is short product name with version +- ++ ++ The %1 setup program is about to make changes to your disk in order to set up %2.<br/><strong>You will not be able to undo these changes.</strong> ++ %1 is short product name, %2 is short product name with version ++ + + +- +- The %1 installer is about to make changes to your disk in order to install %2.<br/><strong>You will not be able to undo these changes.</strong> +- %1 is short product name, %2 is short product name with version +- ++ ++ The %1 installer is about to make changes to your disk in order to install %2.<br/><strong>You will not be able to undo these changes.</strong> ++ %1 is short product name, %2 is short product name with version ++ + + +- +- &Set Up Now +- @button +- ++ ++ &Set Up Now ++ @button ++ + + +- +- &Install Now +- @button +- ++ ++ &Install Now ++ @button ++ + + +- +- Go &Back +- @button +- ++ ++ Go &Back ++ @button ++ + + +- +- &Set Up +- @button +- ++ ++ &Set Up ++ @button ++ + + +- +- &Install +- @button +- ++ ++ &Install ++ @button ++ + + +- +- Setup is complete. Close the setup program. +- @tooltip +- ++ ++ Setup is complete. Close the setup program. ++ @tooltip ++ + + +- +- The installation is complete. Close the installer. +- @tooltip +- ++ ++ The installation is complete. Close the installer. ++ @tooltip ++ + + +- +- Cancel the setup process without changing the system. +- @tooltip +- ++ ++ Cancel the setup process without changing the system. ++ @tooltip ++ + + +- +- Cancel the installation process without changing the system. +- @tooltip +- ++ ++ Cancel the installation process without changing the system. ++ @tooltip ++ + + +- +- &Next +- @button +- ++ ++ &Next ++ @button ++ + + +- +- &Back +- @button +- ++ ++ &Back ++ @button ++ + + +- +- &Done +- @button +- ++ ++ &Done ++ @button ++ + + +- +- &Cancel +- @button +- ++ ++ &Cancel ++ @button ++ + + +- +- Cancel Setup? +- @title +- ++ ++ Cancel Setup? ++ @title ++ + + +- +- Cancel Installation? +- @title +- ++ ++ Cancel Installation? ++ @title ++ + + +- +- Do you really want to cancel the current setup process? ++ ++ Do you really want to cancel the current setup process? + The setup program will quit and all changes will be lost. +- ++ ++ ++ ++ ++ Do you really want to cancel the current installation process? ++The system will reboot or you can enter the debug mode for further investigation. ++ 您確定要退出當前的安裝過程嗎? ++系統將重啟,或者您可以進入調試模式進行進一步的調查。 + + +- +- Do you really want to cancel the current install process? +-The installer will quit and all changes will be lost. +- ++ ++ &Reboot ++ @button ++ 重啟(&R) + +- +- ++ ++ ++ &Debug ++ @button ++ 調試(&D) ++ ++ ++ + CalamaresPython::Helper + +- +- Unknown exception type +- @error +- ++ ++ Unknown exception type ++ @error ++ + + +- +- Unparseable Python error +- @error +- ++ ++ Unparseable Python error ++ @error ++ + + +- +- Unparseable Python traceback +- @error +- ++ ++ Unparseable Python traceback ++ @error ++ + + +- +- Unfetchable Python error +- @error +- ++ ++ Unfetchable Python error ++ @error ++ + +- +- ++ ++ + CalamaresWindow + +- +- %1 Setup Program +- ++ ++ ++ %1 Setup Program ++ + + +- +- %1 Installer +- ++ ++ ++ %1 Installer ++ + +- +- ++ ++ + ChangeFilesystemLabelJob + +- +- Set filesystem label on %1 +- @title +- ++ ++ Set filesystem label on %1 ++ @title ++ + + +- +- Set filesystem label <strong>%1</strong> to partition <strong>%2</strong> +- @info +- ++ ++ Set filesystem label <strong>%1</strong> to partition <strong>%2</strong> ++ @info ++ + + +- +- Setting filesystem label <strong>%1</strong> to partition <strong>%2</strong>… +- @status +- ++ ++ Setting filesystem label <strong>%1</strong> to partition <strong>%2</strong>… ++ @status ++ + + +- +- +- The installer failed to update partition table on disk '%1'. +- @info +- ++ ++ ++ The installer failed to update partition table on disk '%1'. ++ @info ++ + +- +- ++ ++ + CheckerContainer + +- +- Gathering system information... +- ++ ++ Gathering system information... ++ + +- +- ++ ++ + ChoicePage + +- +- Select storage de&vice: +- @label +- ++ ++ Select storage de&vice: ++ @label ++ + + +- +- +- +- +- Current: +- @label +- ++ ++ ++ ++ ++ Current: ++ @label ++ + + +- +- After: +- @label +- ++ ++ After: ++ @label ++ + + +- +- Reuse %1 as home partition for %2 +- @label +- ++ ++ Reuse %1 as home partition for %2 ++ @label ++ + + +- +- <strong>Select a partition to shrink, then drag the bottom bar to resize</strong> +- ++ ++ <strong>Select a partition to shrink, then drag the bottom bar to resize</strong> ++ + + +- +- %1 will be shrunk to %2MiB and a new %3MiB partition will be created for %4. +- @info, %1 is partition name, %4 is product name +- ++ ++ %1 will be shrunk to %2MiB and a new %3MiB partition will be created for %4. ++ @info, %1 is partition name, %4 is product name ++ + + +- +- <strong>Select a partition to install on</strong> +- @label +- ++ ++ <strong>Select a partition to install on</strong> ++ @label ++ + + +- +- An EFI system partition cannot be found anywhere on this system. Please go back and use manual partitioning to set up %1. +- @info, %1 is product name +- ++ ++ An EFI system partition cannot be found anywhere on this system. Please go back and use manual partitioning to set up %1. ++ @info, %1 is product name ++ + + +- +- The EFI system partition at %1 will be used for starting %2. +- @info, %1 is partition path, %2 is product name +- ++ ++ The EFI system partition at %1 will be used for starting %2. ++ @info, %1 is partition path, %2 is product name ++ + + +- +- EFI system partition: +- @label +- ++ ++ EFI system partition: ++ @label ++ + + +- +- This storage device does not seem to have an operating system on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. +- ++ ++ This storage device does not seem to have an operating system on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. ++ + + +- +- +- +- +- <strong>Erase disk</strong><br/>This will <font color="red">delete</font> all data currently present on the selected storage device. +- ++ ++ ++ ++ ++ <strong>Automatic partitioning</strong><br/>This will <font color="red">delete</font> all data currently present on the selected storage device. ++ + + +- +- +- +- +- <strong>Install alongside</strong><br/>The installer will shrink a partition to make room for %1. +- ++ ++ ++ ++ ++ <strong>Install alongside</strong><br/>The installer will shrink a partition to make room for %1. ++ + + +- +- +- +- +- <strong>Replace a partition</strong><br/>Replaces a partition with %1. +- ++ ++ ++ ++ ++ <strong>Replace a partition</strong><br/>Replaces a partition with %1. ++ + + +- +- This storage device has %1 on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. +- ++ ++ This storage device has %1 on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. ++ + + +- +- This storage device already has an operating system on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. +- ++ ++ This storage device already has an operating system on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. ++ + + +- +- This storage device has multiple operating systems on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. +- ++ ++ This storage device has multiple operating systems on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. ++ + + +- +- This storage device already has an operating system on it, but the partition table <strong>%1</strong> is different from the needed <strong>%2</strong>.<br/> +- ++ ++ This storage device already has an operating system on it, but the partition table <strong>%1</strong> is different from the needed <strong>%2</strong>.<br/> ++ + + +- +- This storage device has one of its partitions <strong>mounted</strong>. +- @info +- ++ ++ This storage device has one of its partitions <strong>mounted</strong>. ++ @info ++ + + +- +- This storage device is a part of an <strong>inactive RAID</strong> device. +- @info +- ++ ++ This storage device is a part of an <strong>inactive RAID</strong> device. ++ @info ++ + + +- +- No swap +- @label +- ++ ++ No swap ++ @label ++ + + +- +- Reuse swap +- @label +- ++ ++ Reuse swap ++ @label ++ + + +- +- Swap (no Hibernate) +- @label +- ++ ++ Swap (no Hibernate) ++ @label ++ + + +- +- Swap (with Hibernate) +- @label +- ++ ++ Swap (with Hibernate) ++ @label ++ + + +- +- Swap to file +- @label +- ++ ++ Swap to file ++ @label ++ + + +- +- <strong>Manual partitioning</strong><br/>You can create or resize partitions yourself. +- ++ ++ <strong>Manual partitioning</strong><br/>You can create or resize partitions yourself. ++ + + +- +- Bootloader location: +- @label +- ++ ++ Bootloader location: ++ @label ++ + +- +- ++ ++ + ClearMountsJob + +- +- Successfully unmounted %1. +- ++ ++ Successfully unmounted %1. ++ + + +- +- Successfully disabled swap %1. +- ++ ++ Successfully disabled swap %1. ++ + + +- +- Successfully cleared swap %1. +- ++ ++ Successfully cleared swap %1. ++ + + +- +- Successfully closed mapper device %1. +- ++ ++ Successfully closed mapper device %1. ++ + + +- +- Successfully disabled volume group %1. +- ++ ++ Successfully disabled volume group %1. ++ + + +- +- Clear mounts for partitioning operations on %1 +- @title +- ++ ++ Clear mounts for partitioning operations on %1 ++ @title ++ + + +- +- Clearing mounts for partitioning operations on %1… +- @status +- ++ ++ Clearing mounts for partitioning operations on %1… ++ @status ++ + + +- +- Cleared all mounts for %1 +- ++ ++ Cleared all mounts for %1 ++ + +- +- ++ ++ + ClearTempMountsJob + +- +- +- Clearing all temporary mounts… +- @status +- ++ ++ ++ Clearing all temporary mounts… ++ @status ++ + + +- +- Cleared all temporary mounts. +- ++ ++ Cleared all temporary mounts. ++ + +- +- ++ ++ + CommandList + +- +- Could not run command. +- ++ ++ Could not run command. ++ + + +- +- The commands use variables that are not defined. Missing variables are: %1. +- ++ ++ The commands use variables that are not defined. Missing variables are: %1. ++ + +- +- ++ ++ + Config + +- +- Setup Failed +- @title +- ++ ++ Setup Failed ++ @title ++ + + +- +- Installation Failed +- @title +- ++ ++ Installation Failed ++ @title ++ + + +- +- The setup of %1 did not complete successfully. +- @info +- ++ ++ The setup of %1 did not complete successfully. ++ @info ++ + + +- +- The installation of %1 did not complete successfully. +- @info +- ++ ++ The installation of %1 did not complete successfully. ++ @info ++ + + +- +- Setup Complete +- @title +- ++ ++ Setup Complete ++ @title ++ + + +- +- Installation Complete +- @title +- ++ ++ Installation Complete ++ @title ++ + + +- +- The setup of %1 is complete. +- @info +- ++ ++ The setup of %1 is complete. ++ @info ++ + + +- +- The installation of %1 is complete. +- @info +- ++ ++ The installation of %1 is complete. ++ @info ++ + + +- +- Keyboard model has been set to %1<br/>. +- @label, %1 is keyboard model, as in Apple Magic Keyboard +- ++ ++ Keyboard model has been set to %1<br/>. ++ @label, %1 is keyboard model, as in Apple Magic Keyboard ++ + + +- +- Keyboard layout has been set to %1/%2. +- @label, %1 is layout, %2 is layout variant +- ++ ++ Keyboard layout has been set to %1/%2. ++ @label, %1 is layout, %2 is layout variant ++ + + +- +- Set timezone to %1/%2 +- @action +- ++ ++ Set timezone to %1/%2 ++ @action ++ + + +- +- The system language will be set to %1. +- @info +- ++ ++ The system language will be set to %1. ++ @info ++ + + +- +- The numbers and dates locale will be set to %1. +- @info +- ++ ++ The numbers and dates locale will be set to %1. ++ @info ++ + + +- +- Network Installation. (Disabled: Incorrect configuration) +- ++ ++ Network Installation. (Disabled: Incorrect configuration) ++ + + +- +- Network Installation. (Disabled: Received invalid groups data) +- ++ ++ Network Installation. (Disabled: Received invalid groups data) ++ + + +- +- Network Installation. (Disabled: Internal error) +- ++ ++ Network Installation. (Disabled: Internal error) ++ + + +- +- Network Installation. (Disabled: Unable to fetch package lists, check your network connection) +- ++ ++ Network Installation. (Disabled: Unable to fetch package lists, check your network connection) ++ + + +- +- Network Installation. (Disabled: No package list) +- ++ ++ Network Installation. (Disabled: No package list) ++ + + +- +- Package selection +- ++ ++ Package selection ++ + + +- +- Package Selection +- ++ ++ Package Selection ++ + + +- +- Please pick a product from the list. The selected product will be installed. +- ++ ++ Please pick a product from the list. The selected product will be installed. ++ + + +- +- Packages +- ++ ++ Packages ++ + + +- +- Install option: <strong>%1</strong> +- ++ ++ Install option: <strong>%1</strong> ++ + + +- +- None +- ++ ++ None ++ + + +- +- Summary +- @label +- ++ ++ Summary ++ @label ++ + + +- +- This is an overview of what will happen once you start the setup procedure. +- ++ ++ This is an overview of what will happen once you start the setup procedure. ++ + + +- +- This is an overview of what will happen once you start the install procedure. +- ++ ++ This is an overview of what will happen once you start the install procedure. ++ + + +- +- Your username is too long. +- ++ ++ Your username is too long. ++ + + +- +- Your username must start with a lowercase letter or underscore. +- ++ ++ Your username must start with a lowercase letter or underscore. ++ + + +- +- Only lowercase letters, numbers, underscore and hyphen are allowed. +- ++ ++ Only lowercase letters, numbers, underscore and hyphen are allowed. ++ + + +- +- '%1' is not allowed as username. +- ++ ++ '%1' is not allowed as username. ++ + + +- +- Your hostname is too short. +- ++ ++ Your hostname is too short. ++ + + +- +- Your hostname is too long. +- ++ ++ Your hostname is too long. ++ + + +- +- '%1' is not allowed as hostname. +- ++ ++ '%1' is not allowed as hostname. ++ + + +- +- Only letters, numbers, underscore and hyphen are allowed. +- ++ ++ Only letters, numbers, underscore and hyphen are allowed. ++ + + +- +- Your passwords do not match! +- ++ ++ Your passwords do not match! ++ + + +- +- OK! +- ++ ++ OK! ++ + + +- +- This computer does not satisfy the minimum requirements for setting up %1.<br/>Setup cannot continue. +- ++ ++ This computer does not satisfy the minimum requirements for setting up %1.<br/>Setup cannot continue. ++ + + +- +- This computer does not satisfy the minimum requirements for installing %1.<br/>Installation cannot continue. +- ++ ++ This computer does not satisfy the minimum requirements for installing %1.<br/>Installation cannot continue. ++ + + +- +- This computer does not satisfy some of the recommended requirements for setting up %1.<br/>Setup can continue, but some features might be disabled. +- ++ ++ This computer does not satisfy some of the recommended requirements for setting up %1.<br/>Setup can continue, but some features might be disabled. ++ + + +- +- This computer does not satisfy some of the recommended requirements for installing %1.<br/>Installation can continue, but some features might be disabled. +- ++ ++ This computer does not satisfy some of the recommended requirements for installing %1.<br/>Installation can continue, but some features might be disabled. ++ + + +- +- This program will ask you some questions and set up %2 on your computer. +- ++ ++ <h1>Welcome to the Calamares setup program for %1</h1> ++ + + +- +- <h1>Welcome to the Calamares setup program for %1</h1> +- ++ ++ <h1>Welcome to %1 setup</h1> ++ + + +- +- <h1>Welcome to %1 setup</h1> +- ++ ++ <h1>Welcome to the Calamares installer for %1</h1> ++ + + +- +- <h1>Welcome to the Calamares installer for %1</h1> +- ++ ++ <h1>Welcome to the %1 installer</h1> ++ + +- +- +- <h1>Welcome to the %1 installer</h1> +- +- +- +- ++ ++ + ContextualProcessJob + +- +- Performing contextual processes' job… +- @status +- ++ ++ Performing contextual processes' job… ++ @status ++ + +- +- ++ ++ + CreatePartitionDialog + +- +- Create a Partition +- ++ ++ Create a Partition ++ + + +- +- Si&ze: +- ++ ++ Si&ze: ++ + + +- +- MiB +- ++ ++ MiB ++ + + +- +- Partition &Type: +- ++ ++ Partition &Type: ++ + + +- +- Primar&y +- ++ ++ Primar&y ++ + + +- +- E&xtended +- ++ ++ E&xtended ++ + + +- +- Fi&le System: +- ++ ++ Fi&le System: ++ + + +- +- LVM LV name +- ++ ++ LVM LV name ++ + + +- +- &Mount Point: +- ++ ++ &Mount Point: ++ + + +- +- Flags: +- ++ ++ Flags: ++ + + +- +- Label for the filesystem +- ++ ++ Label for the filesystem ++ + + +- +- FS Label: +- ++ ++ FS Label: ++ + + +- +- En&crypt +- @action +- ++ ++ En&crypt ++ @action ++ + + +- +- Logical +- @label +- ++ ++ Logical ++ @label ++ + + +- +- Primary +- @label +- ++ ++ Primary ++ @label ++ + + +- +- GPT +- @label +- ++ ++ GPT ++ @label ++ + + +- +- Mountpoint already in use. Please select another one. +- @info +- ++ ++ Mountpoint already in use. Please select another one. ++ @info ++ + + +- +- Mountpoint must start with a <tt>/</tt>. +- @info +- ++ ++ Mountpoint must start with a <tt>/</tt>. ++ @info ++ + +- +- ++ ++ + CreatePartitionJob + +- +- Create new %1MiB partition on %3 (%2) with entries %4 +- @title +- ++ ++ Create new %1MiB partition on %3 (%2) with entries %4 ++ @title ++ + + +- +- Create new %1MiB partition on %3 (%2) +- @title +- ++ ++ Create new %1MiB partition on %3 (%2) ++ @title ++ + + +- +- Create new %2MiB partition on %4 (%3) with file system %1 +- @title +- ++ ++ Create new %2MiB partition on %4 (%3) with file system %1 ++ @title ++ + + +- +- Create new <strong>%1MiB</strong> partition on <strong>%3</strong> (%2) with entries <em>%4</em> +- @info +- ++ ++ Create new <strong>%1MiB</strong> partition on <strong>%3</strong> (%2) with entries <em>%4</em> ++ @info ++ + + +- +- Create new <strong>%1MiB</strong> partition on <strong>%3</strong> (%2) +- @info +- ++ ++ Create new <strong>%1MiB</strong> partition on <strong>%3</strong> (%2) ++ @info ++ + + +- +- Create new <strong>%2MiB</strong> partition on <strong>%4</strong> (%3) with file system <strong>%1</strong> +- @info +- ++ ++ Create new <strong>%2MiB</strong> partition on <strong>%4</strong> (%3) with file system <strong>%1</strong> ++ @info ++ + + +- +- +- Creating new %1 partition on %2… +- @status +- ++ ++ ++ Creating new %1 partition on %2… ++ @status ++ + + +- +- The installer failed to create partition on disk '%1'. +- @info +- ++ ++ The installer failed to create partition on disk '%1'. ++ @info ++ + +- +- ++ ++ + CreatePartitionTableDialog + +- +- Create Partition Table +- ++ ++ Create Partition Table ++ + + +- +- Creating a new partition table will delete all existing data on the disk. +- ++ ++ Creating a new partition table will delete all existing data on the disk. ++ + + +- +- What kind of partition table do you want to create? +- ++ ++ What kind of partition table do you want to create? ++ + + +- +- Master Boot Record (MBR) +- ++ ++ Master Boot Record (MBR) ++ + + +- +- GUID Partition Table (GPT) +- ++ ++ GUID Partition Table (GPT) ++ + +- +- ++ ++ + CreatePartitionTableJob + +- +- +- Creating new %1 partition table on %2… +- @status +- ++ ++ ++ Creating new %1 partition table on %2… ++ @status ++ + + +- +- Creating new <strong>%1</strong> partition table on <strong>%2</strong> (%3)… +- @status +- ++ ++ Creating new <strong>%1</strong> partition table on <strong>%2</strong> (%3)… ++ @status ++ + + +- +- The installer failed to create a partition table on %1. +- ++ ++ The installer failed to create a partition table on %1. ++ + +- +- ++ ++ + CreateUserJob + +- +- Create user %1 +- ++ ++ Create user %1 ++ + + +- +- Create user <strong>%1</strong> +- ++ ++ Create user <strong>%1</strong> ++ + + +- +- +- Creating user %1… +- @status +- ++ ++ ++ Creating user %1… ++ @status ++ + + +- +- Preserving home directory… +- @status +- ++ ++ Preserving home directory… ++ @status ++ + + +- +- Configuring user %1 +- @status +- ++ ++ Configuring user %1 ++ @status ++ + + +- +- Setting file permissions… +- @status +- ++ ++ Setting file permissions… ++ @status ++ + +- +- ++ ++ + CreateVolumeGroupDialog + +- +- Create Volume Group +- @title +- ++ ++ Create Volume Group ++ @title ++ + +- +- ++ ++ + CreateVolumeGroupJob + +- +- +- Creating new volume group named %1… +- @status +- ++ ++ ++ Creating new volume group named %1… ++ @status ++ + + +- +- Creating new volume group named <strong>%1</strong>… +- @status +- ++ ++ Creating new volume group named <strong>%1</strong>… ++ @status ++ + + +- +- The installer failed to create a volume group named '%1'. +- ++ ++ The installer failed to create a volume group named '%1'. ++ + +- +- ++ ++ + DeactivateVolumeGroupJob + +- +- +- Deactivating volume group named %1… +- @status +- ++ ++ ++ Deactivating volume group named %1… ++ @status ++ + + +- +- Deactivating volume group named <strong>%1</strong>… +- @status +- ++ ++ Deactivating volume group named <strong>%1</strong>… ++ @status ++ + + +- +- The installer failed to deactivate a volume group named %1. +- ++ ++ The installer failed to deactivate a volume group named %1. ++ + +- +- ++ ++ + DeletePartitionJob + +- +- +- Deleting partition %1… +- @status +- ++ ++ ++ Deleting partition %1… ++ @status ++ + + +- +- Deleting partition <strong>%1</strong>… +- @status +- ++ ++ Deleting partition <strong>%1</strong>… ++ @status ++ + + +- +- The installer failed to delete partition %1. +- ++ ++ The installer failed to delete partition %1. ++ + +- +- ++ ++ + DeviceInfoWidget + +- +- <br><br>This partition table type is only advisable on older systems which start from a <strong>BIOS</strong> boot environment. GPT is recommended in most other cases.<br><br><strong>Warning:</strong> the MBR partition table is an obsolete MS-DOS era standard.<br>Only 4 <em>primary</em> partitions may be created, and of those 4, one can be an <em>extended</em> partition, which may in turn contain many <em>logical</em> partitions. +- ++ ++ <br><br>This partition table type is only advisable on older systems which start from a <strong>BIOS</strong> boot environment. GPT is recommended in most other cases.<br><br><strong>Warning:</strong> the MBR partition table is an obsolete MS-DOS era standard.<br>Only 4 <em>primary</em> partitions may be created, and of those 4, one can be an <em>extended</em> partition, which may in turn contain many <em>logical</em> partitions. ++ + + +- +- <br><br>This is the recommended partition table type for modern systems which start from an <strong>EFI</strong> boot environment. +- ++ ++ <br><br>This is the recommended partition table type for modern systems which start from an <strong>EFI</strong> boot environment. ++ + + +- +- This is a <strong>loop</strong> device.<br><br>It is a pseudo-device with no partition table that makes a file accessible as a block device. This kind of setup usually only contains a single filesystem. +- ++ ++ This is a <strong>loop</strong> device.<br><br>It is a pseudo-device with no partition table that makes a file accessible as a block device. This kind of setup usually only contains a single filesystem. ++ + + +- +- This installer <strong>cannot detect a partition table</strong> on the selected storage device.<br><br>The device either has no partition table, or the partition table is corrupted or of an unknown type.<br>This installer can create a new partition table for you, either automatically, or through the manual partitioning page. +- ++ ++ This installer <strong>cannot detect a partition table</strong> on the selected storage device.<br><br>The device either has no partition table, or the partition table is corrupted or of an unknown type.<br>This installer can create a new partition table for you, either automatically, or through the manual partitioning page. ++ + + +- +- This device has a <strong>%1</strong> partition table. +- ++ ++ This device has a <strong>%1</strong> partition table. ++ + + +- +- The type of <strong>partition table</strong> on the selected storage device.<br><br>The only way to change the partition table type is to erase and recreate the partition table from scratch, which destroys all data on the storage device.<br>This installer will keep the current partition table unless you explicitly choose otherwise.<br>If unsure, on modern systems GPT is preferred. +- ++ ++ The type of <strong>partition table</strong> on the selected storage device.<br><br>The only way to change the partition table type is to erase and recreate the partition table from scratch, which destroys all data on the storage device.<br>This installer will keep the current partition table unless you explicitly choose otherwise.<br>If unsure, on modern systems GPT is preferred. ++ + +- +- ++ ++ + DeviceModel + +- +- %1 - %2 (%3) +- device[name] - size[number] (device-node[name]) +- ++ ++ %1 - %2 (%3) ++ device[name] - size[number] (device-node[name]) ++ + + +- +- %1 - (%2) +- device[name] - (device-node[name]) +- ++ ++ %1 - (%2) ++ device[name] - (device-node[name]) ++ + +- +- ++ ++ + DracutLuksCfgJob + +- +- Writing LUKS configuration for Dracut to %1… +- @status +- ++ ++ Writing LUKS configuration for Dracut to %1… ++ @status ++ + + +- +- Skipping writing LUKS configuration for Dracut: "/" partition is not encrypted +- @info +- ++ ++ Skipping writing LUKS configuration for Dracut: "/" partition is not encrypted ++ @info ++ + + +- +- Failed to open %1 +- @error +- ++ ++ Failed to open %1 ++ @error ++ + +- +- ++ ++ + DummyCppJob + +- +- Performing dummy C++ job… +- @status +- ++ ++ Performing dummy C++ job… ++ @status ++ + +- +- ++ ++ + EditExistingPartitionDialog + +- +- Edit Existing Partition +- ++ ++ Edit Existing Partition ++ + + +- +- Con&tent: +- ++ ++ Con&tent: ++ + + +- +- &Keep +- ++ ++ &Keep ++ + + +- +- Format +- ++ ++ Format ++ + + +- +- Warning: Formatting the partition will erase all existing data. +- ++ ++ Warning: Formatting the partition will erase all existing data. ++ + + +- +- &Mount Point: +- ++ ++ &Mount Point: ++ + + +- +- Si&ze: +- ++ ++ Si&ze: ++ + + +- +- MiB +- ++ ++ MiB ++ + + +- +- Fi&le System: +- ++ ++ Fi&le System: ++ + + +- +- Flags: +- ++ ++ Flags: ++ + + +- +- Label for the filesystem +- ++ ++ Label for the filesystem ++ + + +- +- FS Label: +- ++ ++ FS Label: ++ + + +- +- Passphrase for existing partition +- ++ ++ Passphrase for existing partition ++ + + +- +- Partition %1 could not be decrypted with the given passphrase.<br/><br/>Edit the partition again and give the correct passphrase or delete and create a new encrypted partition. +- ++ ++ Partition %1 could not be decrypted with the given passphrase.<br/><br/>Edit the partition again and give the correct passphrase or delete and create a new encrypted partition. ++ + +- +- ++ ++ + EncryptWidget + +- +- En&crypt system +- ++ ++ En&crypt system ++ + + +- +- Your system does not seem to support encryption well enough to encrypt the entire system. You may enable encryption, but performance may suffer. +- ++ ++ Your system does not seem to support encryption well enough to encrypt the entire system. You may enable encryption, but performance may suffer. ++ + + +- +- Passphrase +- ++ ++ Passphrase ++ + + +- +- Confirm passphrase +- ++ ++ Confirm passphrase ++ + + +- +- +- Please enter the same passphrase in both boxes. +- @tooltip +- ++ ++ ++ Please enter the same passphrase in both boxes. ++ @tooltip ++ + + +- +- Password must be a minimum of %1 characters. +- @tooltip +- ++ ++ Password must be a minimum of %1 characters. ++ @tooltip ++ + +- +- ++ ++ + ErrorDialog + +- +- Details: +- ++ ++ Details: ++ + + +- +- Would you like to paste the install log to the web? +- ++ ++ Would you like to paste the install log to the web? ++ + +- +- ++ ++ + FillGlobalStorageJob + +- +- Set partition information +- @title +- ++ ++ Set partition information ++ @title ++ + + +- +- Install %1 on <strong>new</strong> %2 system partition with features <em>%3</em> +- @info +- ++ ++ Install %1 on <strong>new</strong> %2 system partition with features <em>%3</em> ++ @info ++ + + +- +- Install %1 on <strong>new</strong> %2 system partition +- @info +- ++ ++ Install %1 on <strong>new</strong> %2 system partition ++ @info ++ + + +- +- Set up <strong>new</strong> %2 partition with mount point <strong>%1</strong> and features <em>%3</em> +- @info +- ++ ++ Set up <strong>new</strong> %2 partition with mount point <strong>%1</strong> and features <em>%3</em> ++ @info ++ + + +- +- Set up <strong>new</strong> %2 partition with mount point <strong>%1</strong>%3 +- @info +- ++ ++ Set up <strong>new</strong> %2 partition with mount point <strong>%1</strong>%3 ++ @info ++ + + +- +- Install %2 on %3 system partition <strong>%1</strong> with features <em>%4</em> +- @info +- ++ ++ Install %2 on %3 system partition <strong>%1</strong> with features <em>%4</em> ++ @info ++ + + +- +- Install %2 on %3 system partition <strong>%1</strong> +- @info +- ++ ++ Install %2 on %3 system partition <strong>%1</strong> ++ @info ++ + + +- +- Set up %3 partition <strong>%1</strong> with mount point <strong>%2</strong> and features <em>%4</em> +- @info +- ++ ++ Set up %3 partition <strong>%1</strong> with mount point <strong>%2</strong> and features <em>%4</em> ++ @info ++ + + +- +- Set up %3 partition <strong>%1</strong> with mount point <strong>%2</strong>%4… +- @info +- ++ ++ Set up %3 partition <strong>%1</strong> with mount point <strong>%2</strong>%4… ++ @info ++ + + +- +- Install boot loader on <strong>%1</strong>… +- @info +- ++ ++ Install boot loader on <strong>%1</strong>… ++ @info ++ + + +- +- Setting up mount points… +- @status +- ++ ++ Setting up mount points… ++ @status ++ + +- +- ++ ++ + FinishedPage + +- +- &Restart now +- ++ ++ &Restart now ++ + + +- +- <h1>All done.</h1><br/>%1 has been set up on your computer.<br/>You may now start using your new system. +- @info +- ++ ++ <h1>All done.</h1><br/>%1 has been set up on your computer.<br/>You may now start using your new system. ++ @info ++ + + +- +- <html><head/><body><p>When this box is checked, your system will restart immediately when you click on <span style="font-style:italic;">Done</span> or close the setup program.</p></body></html> +- @tooltip +- ++ ++ <html><head/><body><p>When this box is checked, your system will restart immediately when you click on <span style="font-style:italic;">Done</span> or close the setup program.</p></body></html> ++ @tooltip ++ + + +- +- <h1>All done.</h1><br/>%1 has been installed on your computer.<br/>You may now restart into your new system, or continue using the %2 Live environment. +- @info +- ++ ++ <h1>All done.</h1><br/>%1 has been installed on your computer.<br/>You may now restart into your new system, or continue using the %2 Live environment. ++ @info ++ + + +- +- <html><head/><body><p>When this box is checked, your system will restart immediately when you click on <span style="font-style:italic;">Done</span> or close the installer.</p></body></html> +- @tooltip +- ++ ++ <html><head/><body><p>When this box is checked, your system will restart immediately when you click on <span style="font-style:italic;">Done</span> or close the installer.</p></body></html> ++ @tooltip ++ + + +- +- <h1>Setup Failed</h1><br/>%1 has not been set up on your computer.<br/>The error message was: %2. +- @info, %1 is product name with version +- ++ ++ <h1>Setup Failed</h1><br/>%1 has not been set up on your computer.<br/>The error message was: %2. ++ @info, %1 is product name with version ++ + + +- +- <h1>Installation Failed</h1><br/>%1 has not been installed on your computer.<br/>The error message was: %2. +- @info, %1 is product name with version +- ++ ++ <h1>Installation Failed</h1><br/>%1 has not been installed on your computer.<br/>The error message was: %2. ++ @info, %1 is product name with version ++ + +- +- ++ ++ + FinishedQmlViewStep + +- +- Finish +- @label +- ++ ++ Finish ++ @label ++ + +- +- ++ ++ + FinishedViewStep + +- +- Finish +- @label +- ++ ++ Finish ++ @label ++ + +- +- ++ ++ + FormatPartitionJob + +- +- Format partition %1 (file system: %2, size: %3 MiB) on %4 +- @title +- ++ ++ Format partition %1 (file system: %2, size: %3 MiB) on %4 ++ @title ++ + + +- +- Format <strong>%3MiB</strong> partition <strong>%1</strong> with file system <strong>%2</strong> +- @info +- ++ ++ Format <strong>%3MiB</strong> partition <strong>%1</strong> with file system <strong>%2</strong> ++ @info ++ + + +- +- %1 (%2) +- partition label %1 (device path %2) +- ++ ++ %1 (%2) ++ partition label %1 (device path %2) ++ + + +- +- Formatting partition %1 with file system %2… +- @status +- ++ ++ Formatting partition %1 with file system %2… ++ @status ++ + + +- +- The installer failed to format partition %1 on disk '%2'. +- ++ ++ The installer failed to format partition %1 on disk '%2'. ++ + +- +- ++ ++ + GeneralRequirements + +- +- Please ensure the system has at least %1 GiB available drive space. +- ++ ++ Please ensure the system has at least %1 GiB available drive space. ++ + + +- +- Available drive space is all of the hard disks and SSDs connected to the system. +- ++ ++ Available drive space is all of the hard disks and SSDs connected to the system. ++ + + +- +- There is not enough drive space. At least %1 GiB is required. +- ++ ++ There is not enough drive space. At least %1 GiB is required. ++ + + +- +- has at least %1 GiB working memory +- ++ ++ has at least %1 GiB working memory ++ + + +- +- The system does not have enough working memory. At least %1 GiB is required. +- ++ ++ The system does not have enough working memory. At least %1 GiB is required. ++ + + +- +- is plugged in to a power source +- ++ ++ is plugged in to a power source ++ + + +- +- The system is not plugged in to a power source. +- ++ ++ The system is not plugged in to a power source. ++ + + +- +- is connected to the Internet +- ++ ++ is connected to the Internet ++ + + +- +- The system is not connected to the Internet. +- ++ ++ The system is not connected to the Internet. ++ + + +- +- is running the installer as an administrator (root) +- ++ ++ is running the installer as an administrator (root) ++ + + +- +- The setup program is not running with administrator rights. +- ++ ++ The setup program is not running with administrator rights. ++ + + +- +- The installer is not running with administrator rights. +- ++ ++ The installer is not running with administrator rights. ++ + + +- +- has a screen large enough to show the whole installer +- ++ ++ has a screen large enough to show the whole installer ++ + + +- +- The screen is too small to display the setup program. +- ++ ++ The screen is too small to display the setup program. ++ + + +- +- The screen is too small to display the installer. +- ++ ++ The screen is too small to display the installer. ++ + + +- +- is always false +- ++ ++ is always false ++ + + +- +- The computer says no. +- ++ ++ The computer says no. ++ + + +- +- is always false (slowly) +- ++ ++ is always false (slowly) ++ + + +- +- The computer says no (slowly). +- ++ ++ The computer says no (slowly). ++ + + +- +- is always true +- ++ ++ is always true ++ + + +- +- The computer says yes. +- ++ ++ The computer says yes. ++ + + +- +- is always true (slowly) +- ++ ++ is always true (slowly) ++ + + +- +- The computer says yes (slowly). +- ++ ++ The computer says yes (slowly). ++ + + +- +- is checked three times. +- ++ ++ is checked three times. ++ + + +- +- The snark has not been checked three times. +- The (some mythological beast) has not been checked three times. +- ++ ++ The snark has not been checked three times. ++ The (some mythological beast) has not been checked three times. ++ + +- +- ++ ++ + HostInfoJob + +- +- Collecting information about your machine… +- @status +- ++ ++ Collecting information about your machine… ++ @status ++ + +- +- ++ ++ + IDJob + +- +- +- +- +- OEM Batch Identifier +- ++ ++ ++ ++ ++ OEM Batch Identifier ++ + + +- +- Could not create directories <code>%1</code>. +- ++ ++ Could not create directories <code>%1</code>. ++ + + +- +- Could not open file <code>%1</code>. +- ++ ++ Could not open file <code>%1</code>. ++ + + +- +- Could not write to file <code>%1</code>. +- ++ ++ Could not write to file <code>%1</code>. ++ + +- +- ++ ++ + InitcpioJob + +- +- Creating initramfs with mkinitcpio… +- @status +- ++ ++ Creating initramfs with mkinitcpio… ++ @status ++ + +- +- ++ ++ + InitramfsJob + +- +- Creating initramfs… +- @status +- ++ ++ Creating initramfs… ++ @status ++ + +- +- ++ ++ + InteractiveTerminalPage + +- +- Konsole not installed. +- @error +- ++ ++ Konsole not installed. ++ @error ++ + + +- +- Please install KDE Konsole and try again! +- @info +- ++ ++ Please install KDE Konsole and try again! ++ @info ++ + + +- +- Executing script: &nbsp;<code>%1</code> +- @info +- ++ ++ Executing script: &nbsp;<code>%1</code> ++ @info ++ + +- +- ++ ++ + InteractiveTerminalViewStep + +- +- Script +- @label +- ++ ++ Script ++ @label ++ + +- +- ++ ++ + KeyboardQmlViewStep + +- +- Keyboard +- @label +- ++ ++ Keyboard ++ @label ++ + +- +- ++ ++ + KeyboardViewStep + +- +- Keyboard +- @label +- ++ ++ Keyboard ++ @label ++ + +- +- ++ ++ + LCLocaleDialog + +- +- System Locale Setting +- @title +- ++ ++ System Locale Setting ++ @title ++ + + +- +- The system locale setting affects the language and character set for some command line user interface elements.<br/>The current setting is <strong>%1</strong>. +- @info +- ++ ++ The system locale setting affects the language and character set for some command line user interface elements.<br/>The current setting is <strong>%1</strong>. ++ @info ++ + + +- +- &Cancel +- @button +- ++ ++ &Cancel ++ @button ++ + + +- +- &OK +- @button +- ++ ++ &OK ++ @button ++ + +- +- ++ ++ + LOSHJob + +- +- Configuring encrypted swap. +- ++ ++ Configuring encrypted swap. ++ + + +- +- No target system available. +- ++ ++ No target system available. ++ + + +- +- No rootMountPoint is set. +- ++ ++ No rootMountPoint is set. ++ + + +- +- No configFilePath is set. +- ++ ++ No configFilePath is set. ++ + +- +- ++ ++ + LicensePage + +- +- <h1>License Agreement</h1> +- ++ ++ <h1>License Agreement</h1> ++ + + +- +- I accept the terms and conditions above. +- @info +- ++ ++ I accept the terms and conditions above. ++ @info ++ + + +- +- Please review the End User License Agreements (EULAs). +- @info +- ++ ++ Please review the End User License Agreements (EULAs). ++ @info ++ + + +- +- This setup procedure will install proprietary software that is subject to licensing terms. +- @info +- ++ ++ This setup procedure will install proprietary software that is subject to licensing terms. ++ @info ++ + + +- +- If you do not agree with the terms, the setup procedure cannot continue. +- @info +- ++ ++ If you do not agree with the terms, the setup procedure cannot continue. ++ @info ++ + + +- +- This setup procedure can install proprietary software that is subject to licensing terms in order to provide additional features and enhance the user experience. +- @info +- ++ ++ This setup procedure can install proprietary software that is subject to licensing terms in order to provide additional features and enhance the user experience. ++ @info ++ + + +- +- If you do not agree with the terms, proprietary software will not be installed, and open source alternatives will be used instead. +- @info +- ++ ++ If you do not agree with the terms, proprietary software will not be installed, and open source alternatives will be used instead. ++ @info ++ + +- +- ++ ++ + LicenseViewStep + +- +- License +- @label +- ++ ++ License ++ @label ++ + +- +- ++ ++ + LicenseWidget + +- +- URL: %1 +- @label +- ++ ++ URL: %1 ++ @label ++ + + +- +- <strong>%1 driver</strong><br/>by %2 +- @label, %1 is product name, %2 is product vendor +- %1 is an untranslatable product name, example: Creative Audigy driver +- ++ ++ <strong>%1 driver</strong><br/>by %2 ++ @label, %1 is product name, %2 is product vendor ++ %1 is an untranslatable product name, example: Creative Audigy driver ++ + + +- +- <strong>%1 graphics driver</strong><br/><font color="Grey">by %2</font> +- @label, %1 is product name, %2 is product vendor +- %1 is usually a vendor name, example: Nvidia graphics driver +- ++ ++ <strong>%1 graphics driver</strong><br/><font color="Grey">by %2</font> ++ @label, %1 is product name, %2 is product vendor ++ %1 is usually a vendor name, example: Nvidia graphics driver ++ + + +- +- <strong>%1 browser plugin</strong><br/><font color="Grey">by %2</font> +- @label, %1 is product name, %2 is product vendor +- ++ ++ <strong>%1 browser plugin</strong><br/><font color="Grey">by %2</font> ++ @label, %1 is product name, %2 is product vendor ++ + + +- +- <strong>%1 codec</strong><br/><font color="Grey">by %2</font> +- @label, %1 is product name, %2 is product vendor +- ++ ++ <strong>%1 codec</strong><br/><font color="Grey">by %2</font> ++ @label, %1 is product name, %2 is product vendor ++ + + +- +- <strong>%1 package</strong><br/><font color="Grey">by %2</font> +- @label, %1 is product name, %2 is product vendor +- ++ ++ <strong>%1 package</strong><br/><font color="Grey">by %2</font> ++ @label, %1 is product name, %2 is product vendor ++ + + +- +- <strong>%1</strong><br/><font color="Grey">by %2</font> +- @label, %1 is product name, %2 is product vendor +- ++ ++ <strong>%1</strong><br/><font color="Grey">by %2</font> ++ @label, %1 is product name, %2 is product vendor ++ + + +- +- File: %1 +- @label +- ++ ++ File: %1 ++ @label ++ + + +- +- Hide the license text +- @tooltip +- ++ ++ Hide the license text ++ @tooltip ++ + + +- +- Show the license text +- @tooltip +- ++ ++ Show the license text ++ @tooltip ++ + + +- +- Open the license agreement in browser +- @tooltip +- ++ ++ Open the license agreement in browser ++ @tooltip ++ + +- +- ++ ++ + LocalePage + +- +- Region: +- @label +- ++ ++ Region: ++ @label ++ + + +- +- Zone: +- @label +- ++ ++ Zone: ++ @label ++ + + +- +- +- &Change… +- @button +- ++ ++ ++ &Change… ++ @button ++ + +- +- ++ ++ + LocaleQmlViewStep + +- +- Location +- @label +- ++ ++ Location ++ @label ++ + +- +- ++ ++ + LocaleTests + +- +- Quit +- ++ ++ Quit ++ + +- +- ++ ++ + LocaleViewStep + +- +- Location +- @label +- ++ ++ Location ++ @label ++ + +- +- ++ ++ + LuksBootKeyFileJob + +- +- Configuring LUKS key file. +- ++ ++ Configuring LUKS key file. ++ + + +- +- +- No partitions are defined. +- ++ ++ ++ No partitions are defined. ++ + + +- +- +- Encrypted rootfs setup error +- ++ ++ ++ Encrypted rootfs setup error ++ + + +- +- Root partition %1 is LUKS but no passphrase has been set. +- ++ ++ Root partition %1 is LUKS but no passphrase has been set. ++ + + +- +- Could not create LUKS key file for root partition %1. +- ++ ++ Could not create LUKS key file for root partition %1. ++ + +- +- ++ ++ + MachineIdJob + +- +- Generate machine-id. +- ++ ++ Generate machine-id. ++ + + +- +- Configuration Error +- ++ ++ Configuration Error ++ + + +- +- No root mount point is set for MachineId. +- ++ ++ No root mount point is set for MachineId. ++ + + +- +- +- +- +- File not found +- ++ ++ ++ ++ ++ File not found ++ + + +- +- Path <pre>%1</pre> must be an absolute path. +- ++ ++ Path <pre>%1</pre> must be an absolute path. ++ + + +- +- Could not create new random file <pre>%1</pre>. +- ++ ++ Could not create new random file <pre>%1</pre>. ++ + +- +- ++ ++ + Map + +- +- Timezone: %1 +- @label +- ++ ++ Timezone: %1 ++ @label ++ + + +- +- Please select your preferred location on the map so the installer can suggest the locale ++ ++ Please select your preferred location on the map so the installer can suggest the locale + and timezone settings for you. You can fine-tune the suggested settings below. Search the map by dragging + to move and using the +/- buttons to zoom in/out or use mouse scrolling for zooming. +- @info +- ++ @info ++ + +- +- ++ ++ + Map-qt6 + +- +- Timezone: %1 +- @label +- ++ ++ Timezone: %1 ++ @label ++ + + +- +- Please select your preferred location on the map so the installer can suggest the locale ++ ++ Please select your preferred location on the map so the installer can suggest the locale + and timezone settings for you. You can fine-tune the suggested settings below. Search the map by dragging + to move and using the +/- buttons to zoom in/out or use mouse scrolling for zooming. +- @label +- ++ @label ++ + +- +- ++ ++ + NetInstallViewStep + +- +- Package selection +- ++ ++ Package selection ++ + + +- +- Office software +- ++ ++ Office software ++ + + +- +- Office package +- ++ ++ Office package ++ + + +- +- Browser software +- ++ ++ Browser software ++ + + +- +- Browser package +- ++ ++ Browser package ++ + + +- +- Web browser +- ++ ++ Web browser ++ + + +- +- Kernel +- label for netinstall module, Linux kernel +- ++ ++ Kernel ++ label for netinstall module, Linux kernel ++ + + +- +- Services +- label for netinstall module, system services +- ++ ++ Services ++ label for netinstall module, system services ++ + + +- +- Login +- label for netinstall module, choose login manager +- ++ ++ Login ++ label for netinstall module, choose login manager ++ + + +- +- Desktop +- label for netinstall module, choose desktop environment +- ++ ++ Desktop ++ label for netinstall module, choose desktop environment ++ + + +- +- Applications +- ++ ++ Applications ++ + + +- +- Communication +- label for netinstall module +- ++ ++ Communication ++ label for netinstall module ++ + + +- +- Development +- label for netinstall module +- ++ ++ Development ++ label for netinstall module ++ + + +- +- Office +- label for netinstall module +- ++ ++ Office ++ label for netinstall module ++ + + +- +- Multimedia +- label for netinstall module +- ++ ++ Multimedia ++ label for netinstall module ++ + + +- +- Internet +- label for netinstall module +- ++ ++ Internet ++ label for netinstall module ++ + + +- +- Theming +- label for netinstall module +- ++ ++ Theming ++ label for netinstall module ++ + + +- +- Gaming +- label for netinstall module +- ++ ++ Gaming ++ label for netinstall module ++ + + +- +- Utilities +- label for netinstall module +- ++ ++ Utilities ++ label for netinstall module ++ + +- +- ++ ++ + NotesQmlViewStep + +- +- Notes +- ++ ++ Notes ++ + +- +- ++ ++ + OEMPage + +- +- Ba&tch: +- ++ ++ Ba&tch: ++ + + +- +- <html><head/><body><p>Enter a batch-identifier here. This will be stored in the target system.</p></body></html> +- ++ ++ <html><head/><body><p>Enter a batch-identifier here. This will be stored in the target system.</p></body></html> ++ + + +- +- <html><head/><body><h1>OEM Configuration</h1><p>Calamares will use OEM settings while configuring the target system.</p></body></html> +- ++ ++ <html><head/><body><h1>OEM Configuration</h1><p>Calamares will use OEM settings while configuring the target system.</p></body></html> ++ + +- +- ++ ++ + OEMViewStep + +- +- OEM Configuration +- ++ ++ OEM Configuration ++ + + +- +- Set the OEM Batch Identifier to <code>%1</code>. +- ++ ++ Set the OEM Batch Identifier to <code>%1</code>. ++ + +- +- ++ ++ + Offline + +- +- Select your preferred region, or use the default settings +- @label +- ++ ++ Select your preferred region, or use the default settings ++ @label ++ + + +- +- +- +- Timezone: %1 +- @label +- ++ ++ ++ ++ Timezone: %1 ++ @label ++ + + +- +- Select your preferred zone within your region +- @label +- ++ ++ Select your preferred zone within your region ++ @label ++ + + +- +- Zones +- @button +- ++ ++ Zones ++ @button ++ + + +- +- You can fine-tune language and locale settings below +- @label +- ++ ++ You can fine-tune language and locale settings below ++ @label ++ + +- +- ++ ++ + Offline-qt6 + +- +- Select your preferred region, or use the default settings +- @label +- ++ ++ Select your preferred region, or use the default settings ++ @label ++ + + +- +- +- +- Timezone: %1 +- @label +- ++ ++ ++ ++ Timezone: %1 ++ @label ++ + + +- +- Select your preferred zone within your region +- @label +- ++ ++ Select your preferred zone within your region ++ @label ++ + + +- +- Zones +- @button +- ++ ++ Zones ++ @button ++ + + +- +- You can fine-tune language and locale settings below +- @label +- ++ ++ You can fine-tune language and locale settings below ++ @label ++ + +- +- ++ ++ + PWQ + +- +- Password is too short +- ++ ++ Password is too short ++ + + +- +- Password is too long +- ++ ++ Password is too long ++ + + +- +- Password is too weak +- ++ ++ Password is too weak ++ + + +- +- Memory allocation error when setting '%1' +- ++ ++ Memory allocation error when setting '%1' ++ + + +- +- Memory allocation error +- ++ ++ Memory allocation error ++ + + +- +- The password is the same as the old one +- ++ ++ The password is the same as the old one ++ + + +- +- The password is a palindrome +- ++ ++ The password is a palindrome ++ + + +- +- The password differs with case changes only +- ++ ++ The password differs with case changes only ++ + + +- +- The password is too similar to the old one +- ++ ++ The password is too similar to the old one ++ + + +- +- The password contains the user name in some form +- ++ ++ The password contains the user name in some form ++ + + +- +- The password contains words from the real name of the user in some form +- ++ ++ The password contains words from the real name of the user in some form ++ + + +- +- The password contains forbidden words in some form +- ++ ++ The password contains forbidden words in some form ++ + + +- +- The password contains fewer than %n digits +- +- +- ++ ++ The password contains fewer than %n digits ++ ++ ++ + + +- +- The password contains too few digits +- ++ ++ The password contains too few digits ++ + + +- +- The password contains fewer than %n uppercase letters +- +- +- ++ ++ The password contains fewer than %n uppercase letters ++ ++ ++ + + +- +- The password contains too few uppercase letters +- ++ ++ The password contains too few uppercase letters ++ + + +- +- The password contains fewer than %n lowercase letters +- +- +- ++ ++ The password contains fewer than %n lowercase letters ++ ++ ++ + + +- +- The password contains too few lowercase letters +- ++ ++ The password contains too few lowercase letters ++ + + +- +- The password contains fewer than %n non-alphanumeric characters +- +- +- ++ ++ The password contains fewer than %n non-alphanumeric characters ++ ++ ++ + + +- +- The password contains too few non-alphanumeric characters +- ++ ++ The password contains too few non-alphanumeric characters ++ + + +- +- The password is shorter than %n characters +- +- +- ++ ++ The password is shorter than %n characters ++ ++ ++ + + +- +- The password is too short +- ++ ++ The password is too short ++ + + +- +- The password is a rotated version of the previous one +- ++ ++ The password is a rotated version of the previous one ++ + + +- +- The password contains fewer than %n character classes +- +- +- ++ ++ The password contains fewer than %n character classes ++ ++ ++ + + +- +- The password does not contain enough character classes +- ++ ++ The password does not contain enough character classes ++ + + +- +- The password contains more than %n same characters consecutively +- +- +- ++ ++ The password contains more than %n same characters consecutively ++ ++ ++ + + +- +- The password contains too many same characters consecutively +- ++ ++ The password contains too many same characters consecutively ++ + + +- +- The password contains more than %n characters of the same class consecutively +- +- +- ++ ++ The password contains more than %n characters of the same class consecutively ++ ++ ++ + + +- +- The password contains too many characters of the same class consecutively +- ++ ++ The password contains too many characters of the same class consecutively ++ + + +- +- The password contains monotonic sequence longer than %n characters +- +- +- ++ ++ The password contains monotonic sequence longer than %n characters ++ ++ ++ + + +- +- The password contains too long of a monotonic character sequence +- ++ ++ The password contains too long of a monotonic character sequence ++ + + +- +- No password supplied +- ++ ++ No password supplied ++ + + +- +- Cannot obtain random numbers from the RNG device +- ++ ++ Cannot obtain random numbers from the RNG device ++ + + +- +- Password generation failed - required entropy too low for settings +- ++ ++ Password generation failed - required entropy too low for settings ++ + + +- +- The password fails the dictionary check - %1 +- ++ ++ The password fails the dictionary check - %1 ++ + + +- +- The password fails the dictionary check +- ++ ++ The password fails the dictionary check ++ + + +- +- Unknown setting - %1 +- ++ ++ Unknown setting - %1 ++ + + +- +- Unknown setting +- ++ ++ Unknown setting ++ + + +- +- Bad integer value of setting - %1 +- ++ ++ Bad integer value of setting - %1 ++ + + +- +- Bad integer value +- ++ ++ Bad integer value ++ + + +- +- Setting %1 is not of integer type +- ++ ++ Setting %1 is not of integer type ++ + + +- +- Setting is not of integer type +- ++ ++ Setting is not of integer type ++ + + +- +- Setting %1 is not of string type +- ++ ++ Setting %1 is not of string type ++ + + +- +- Setting is not of string type +- ++ ++ Setting is not of string type ++ + + +- +- Opening the configuration file failed +- ++ ++ Opening the configuration file failed ++ + + +- +- The configuration file is malformed +- ++ ++ The configuration file is malformed ++ + + +- +- Fatal failure +- ++ ++ Fatal failure ++ + + +- +- Unknown error +- ++ ++ Unknown error ++ + +- +- ++ ++ + PackageChooserPage + +- +- Product Name +- ++ ++ Product Name ++ + + +- +- TextLabel +- ++ ++ TextLabel ++ + + +- +- Long Product Description +- ++ ++ Long Product Description ++ + + +- +- Package Selection +- ++ ++ Package Selection ++ + + +- +- Please pick a product from the list. The selected product will be installed. +- ++ ++ Please pick a product from the list. The selected product will be installed. ++ + +- +- ++ ++ + PackageModel + +- +- Name +- ++ ++ Name ++ + + +- +- Description +- ++ ++ Description ++ + +- +- ++ ++ + Page_Keyboard + +- +- Keyboard model: +- ++ ++ Keyboard model: ++ + + +- +- Type here to test your keyboard +- ++ ++ Type here to test your keyboard ++ + + +- +- Switch Keyboard: +- shortcut for switching between keyboard layouts +- ++ ++ Switch Keyboard: ++ shortcut for switching between keyboard layouts ++ + +- +- ++ ++ + Page_UserSetup + +- +- What is your name? +- ++ ++ What is your name? ++ ++ ++ ++ ++ ++ Your Full Name ++ ++ ++ ++ ++ What name do you want to use to log in? ++ ++ ++ ++ ++ ++ login ++ ++ ++ ++ ++ What is the name of this computer? ++ ++ ++ ++ ++ ++ <small>This name will be used if you make the computer visible to others on a network.</small> ++ ++ ++ ++ ++ ++ Computer Name ++ ++ ++ ++ ++ ++ Choose a password to keep your account safe. ++ ++ ++ ++ ++ ++ ++ ++ <small>Enter the same password twice, so that it can be checked for typing errors. A good password will contain a mixture of letters, numbers and punctuation, should be at least eight characters long, and should be changed at regular intervals.</small> ++ ++ ++ ++ ++ ++ ++ ++ Password ++ + + +- +- Your Full Name +- ++ ++ ++ ++ ++ Repeat Password ++ + + +- +- What name do you want to use to log in? +- ++ ++ ++ When this box is checked, password-strength checking is done and you will not be able to use a weak password. ++ + + +- +- login +- ++ ++ ++ Require strong passwords. ++ + + +- +- What is the name of this computer? +- ++ ++ ++ Log in automatically without asking for the password. ++ + + +- +- <small>This name will be used if you make the computer visible to others on a network.</small> +- ++ ++ Use the same password for the administrator account. ++ + + +- +- Computer Name +- ++ ++ ++ Choose a password for the administrator account. ++ + + +- +- Choose a password to keep your account safe. +- ++ ++ ++ ++ ++ <small>Enter the same password twice, so that it can be checked for typing errors.</small> ++ + + +- +- +- <small>Enter the same password twice, so that it can be checked for typing errors. A good password will contain a mixture of letters, numbers and punctuation, should be at least eight characters long, and should be changed at regular intervals.</small> +- ++ ++ ++ Use Active Directory ++ + + +- +- +- Password +- ++ ++ ++ Domain: ++ + + +- +- +- Repeat Password +- ++ ++ ++ Domain Administrator: ++ + + +- +- When this box is checked, password-strength checking is done and you will not be able to use a weak password. +- ++ ++ ++ Password: ++ + + +- +- Require strong passwords. +- ++ ++ ++ IP Address (optional): ++ + + +- +- Log in automatically without asking for the password. +- ++ ++ your name ++ 姓名 + + +- +- Use the same password for the administrator account. +- ++ ++ user name ++ 用户名 + + +- +- Choose a password for the administrator account. +- ++ ++ computer name ++ 計算機名稱 + + +- +- +- <small>Enter the same password twice, so that it can be checked for typing errors.</small> +- ++ ++ Use the same password for the root account. ++ + +- +- ++ ++ + PartitionLabelsView + +- +- Root +- ++ ++ Root ++ + + +- +- Home +- @label +- ++ ++ Home ++ @label ++ + + +- +- Boot +- @label +- ++ ++ Boot ++ @label ++ + + +- +- EFI system +- @label +- ++ ++ EFI system ++ @label ++ + + +- +- Swap +- @label +- ++ ++ Swap ++ @label ++ + + +- +- New partition for %1 +- @label +- ++ ++ New partition for %1 ++ @label ++ + + +- +- New partition +- @label +- ++ ++ New partition ++ @label ++ + + +- +- %1 %2 +- size[number] filesystem[name] +- ++ ++ %1 %2 ++ size[number] filesystem[name] ++ + +- +- ++ ++ + PartitionModel + +- +- +- Free Space +- @title +- ++ ++ ++ Free Space ++ @title ++ + + +- +- +- New Partition +- @title +- ++ ++ ++ New Partition ++ @title ++ + + +- +- Name +- @title +- ++ ++ Name ++ @title ++ + + +- +- File System +- @title +- ++ ++ File System ++ @title ++ + + +- +- File System Label +- @title +- ++ ++ File System Label ++ @title ++ + + +- +- Mount Point +- @title +- ++ ++ Mount Point ++ @title ++ + + +- +- Size +- @title +- ++ ++ Size ++ @title ++ + +- +- ++ ++ + PartitionPage + +- +- Storage de&vice: +- ++ ++ Storage de&vice: ++ + + +- +- &Revert All Changes +- ++ ++ &Revert All Changes ++ + + +- +- New Partition &Table +- ++ ++ New Partition &Table ++ + + +- +- Cre&ate +- ++ ++ Cre&ate ++ + + +- +- &Edit +- ++ ++ &Edit ++ + + +- +- &Delete +- ++ ++ &Delete ++ + + +- +- New Volume Group +- ++ ++ New Volume Group ++ + + +- +- Resize Volume Group +- ++ ++ Resize Volume Group ++ + + +- +- Deactivate Volume Group +- ++ ++ Deactivate Volume Group ++ + + +- +- Remove Volume Group +- ++ ++ Remove Volume Group ++ + + +- +- I&nstall boot loader on: +- ++ ++ I&nstall boot loader on: ++ + + +- +- Are you sure you want to create a new partition table on %1? +- ++ ++ Are you sure you want to create a new partition table on %1? ++ + + +- +- Can not create new partition +- ++ ++ Can not create new partition ++ + + +- +- The partition table on %1 already has %2 primary partitions, and no more can be added. Please remove one primary partition and add an extended partition, instead. +- ++ ++ The partition table on %1 already has %2 primary partitions, and no more can be added. Please remove one primary partition and add an extended partition, instead. ++ + +- +- ++ ++ + PartitionViewStep + +- +- Gathering system information… +- @status +- ++ ++ Gathering system information… ++ @status ++ + + +- +- Partitions +- @label +- ++ ++ Partitions ++ @label ++ + + +- +- Install %1 <strong>alongside</strong> another operating system +- @label +- ++ ++ Install %1 <strong>alongside</strong> another operating system ++ @label ++ + + +- +- <strong>Erase</strong> disk and install %1 +- @label +- ++ ++ <strong>Erase</strong> disk and install %1 ++ @label ++ + + +- +- <strong>Replace</strong> a partition with %1 +- @label +- ++ ++ <strong>Replace</strong> a partition with %1 ++ @label ++ + + +- +- <strong>Manual</strong> partitioning +- @label +- ++ ++ <strong>Manual</strong> partitioning ++ @label ++ + + +- +- Install %1 <strong>alongside</strong> another operating system on disk <strong>%2</strong> (%3) +- @info +- ++ ++ Install %1 <strong>alongside</strong> another operating system on disk <strong>%2</strong> (%3) ++ @info ++ + + +- +- <strong>Erase</strong> disk <strong>%2</strong> (%3) and install %1 +- @info +- ++ ++ <strong>Erase</strong> disk <strong>%2</strong> (%3) and install %1 ++ @info ++ + + +- +- <strong>Replace</strong> a partition on disk <strong>%2</strong> (%3) with %1 +- @info +- ++ ++ <strong>Replace</strong> a partition on disk <strong>%2</strong> (%3) with %1 ++ @info ++ + + +- +- <strong>Manual</strong> partitioning on disk <strong>%1</strong> (%2) +- @info +- ++ ++ <strong>Manual</strong> partitioning on disk <strong>%1</strong> (%2) ++ @info ++ + + +- +- Disk <strong>%1</strong> (%2) +- @info +- ++ ++ Disk <strong>%1</strong> (%2) ++ @info ++ + + +- +- Unsafe partition actions are enabled. +- ++ ++ Unsafe partition actions are enabled. ++ + + +- +- Partitioning is configured to <b>always</b> fail. +- ++ ++ Partitioning is configured to <b>always</b> fail. ++ + + +- +- No partitions will be changed. +- ++ ++ No partitions will be changed. ++ + + +- +- Current: +- @label +- ++ ++ Current: ++ @label ++ + + +- +- After: +- @label +- ++ ++ After: ++ @label ++ + + +- +- An EFI system partition is necessary to start %1.<br/><br/>To configure an EFI system partition, go back and select or create a suitable filesystem. +- ++ ++ An EFI system partition is necessary to start %1.<br/><br/>To configure an EFI system partition, go back and select or create a suitable filesystem. ++ + + +- +- An EFI system partition is necessary to start %1.<br/><br/>The EFI system partition does not meet recommendations. It is recommended to go back and select or create a suitable filesystem. +- ++ ++ An EFI system partition is necessary to start %1.<br/><br/>The EFI system partition does not meet recommendations. It is recommended to go back and select or create a suitable filesystem. ++ + + +- +- The filesystem must be mounted on <strong>%1</strong>. +- ++ ++ The filesystem must be mounted on <strong>%1</strong>. ++ + + +- +- The filesystem must have type FAT32. +- ++ ++ The filesystem must have type FAT32. ++ + + +- +- The filesystem must have flag <strong>%1</strong> set. +- ++ ++ The filesystem must have flag <strong>%1</strong> set. ++ + + +- +- +- The filesystem must be at least %1 MiB in size. +- ++ ++ ++ The filesystem must be at least %1 MiB in size. ++ + + +- +- The minimum recommended size for the filesystem is %1 MiB. +- ++ ++ The minimum recommended size for the filesystem is %1 MiB. ++ + + +- +- You can continue without setting up an EFI system partition but your system may fail to start. +- ++ ++ You can continue without setting up an EFI system partition but your system may fail to start. ++ + + +- +- You can continue with this EFI system partition configuration but your system may fail to start. +- ++ ++ You can continue with this EFI system partition configuration but your system may fail to start. ++ + + +- +- No EFI system partition configured +- ++ ++ No EFI system partition configured ++ + + +- +- EFI system partition configured incorrectly +- ++ ++ EFI system partition configured incorrectly ++ + + +- +- EFI system partition recommendation +- ++ ++ EFI system partition recommendation ++ + + +- +- Option to use GPT on BIOS +- ++ ++ Option to use GPT on BIOS ++ + + +- +- A GPT partition table is the best option for all systems. This installer supports such a setup for BIOS systems too.<br/><br/>To configure a GPT partition table on BIOS, (if not done so already) go back and set the partition table to GPT, next create a 8 MB unformatted partition with the <strong>%2</strong> flag enabled.<br/><br/>An unformatted 8 MB partition is necessary to start %1 on a BIOS system with GPT. +- ++ ++ A GPT partition table is the best option for all systems. This installer supports such a setup for BIOS systems too.<br/><br/>To configure a GPT partition table on BIOS, (if not done so already) go back and set the partition table to GPT, next create a 8 MB unformatted partition with the <strong>%2</strong> flag enabled.<br/><br/>An unformatted 8 MB partition is necessary to start %1 on a BIOS system with GPT. ++ + + +- +- Boot partition not encrypted +- ++ ++ Boot partition not encrypted ++ + + +- +- A separate boot partition was set up together with an encrypted root partition, but the boot partition is not encrypted.<br/><br/>There are security concerns with this kind of setup, because important system files are kept on an unencrypted partition.<br/>You may continue if you wish, but filesystem unlocking will happen later during system startup.<br/>To encrypt the boot partition, go back and recreate it, selecting <strong>Encrypt</strong> in the partition creation window. +- ++ ++ A separate boot partition was set up together with an encrypted root partition, but the boot partition is not encrypted.<br/><br/>There are security concerns with this kind of setup, because important system files are kept on an unencrypted partition.<br/>You may continue if you wish, but filesystem unlocking will happen later during system startup.<br/>To encrypt the boot partition, go back and recreate it, selecting <strong>Encrypt</strong> in the partition creation window. ++ + + +- +- has at least one disk device available. +- ++ ++ has at least one disk device available. ++ + + +- +- There are no partitions to install on. +- ++ ++ There are no partitions to install on. ++ + +- +- ++ ++ + PlasmaLnfJob + +- +- Applying Plasma Look-and-Feel… +- @status +- ++ ++ Applying Plasma Look-and-Feel… ++ @status ++ + + +- +- +- Could not select KDE Plasma Look-and-Feel package +- ++ ++ ++ Could not select KDE Plasma Look-and-Feel package ++ + +- +- ++ ++ + PlasmaLnfPage + +- +- Please choose a look-and-feel for the KDE Plasma Desktop. You can also skip this step and configure the look-and-feel once the system is set up. Clicking on a look-and-feel selection will give you a live preview of that look-and-feel. +- ++ ++ Please choose a look-and-feel for the KDE Plasma Desktop. You can also skip this step and configure the look-and-feel once the system is set up. Clicking on a look-and-feel selection will give you a live preview of that look-and-feel. ++ + + +- +- Please choose a look-and-feel for the KDE Plasma Desktop. You can also skip this step and configure the look-and-feel once the system is installed. Clicking on a look-and-feel selection will give you a live preview of that look-and-feel. +- ++ ++ Please choose a look-and-feel for the KDE Plasma Desktop. You can also skip this step and configure the look-and-feel once the system is installed. Clicking on a look-and-feel selection will give you a live preview of that look-and-feel. ++ + +- +- ++ ++ + PlasmaLnfViewStep + +- +- Look-and-Feel +- @label +- ++ ++ Look-and-Feel ++ @label ++ + +- +- ++ ++ ++ PowerManagementInterface ++ ++ ++ Calamares ++ ++ ++ ++ ++ Installation in progress ++ @status ++ ++ ++ ++ + PreserveFiles + +- +- Saving files for later… +- @status +- ++ ++ Saving files for later… ++ @status ++ + + +- +- No files configured to save for later. +- ++ ++ No files configured to save for later. ++ + + +- +- Not all of the configured files could be preserved. +- ++ ++ Not all of the configured files could be preserved. ++ + +- +- ++ ++ + ProcessResult + +- +- ++ ++ + There was no output from the command. +- ++ + + +- +- ++ ++ + Output: + +- ++ + + +- +- External command crashed. +- ++ ++ External command crashed. ++ + + +- +- Command <i>%1</i> crashed. +- ++ ++ Command <i>%1</i> crashed. ++ + + +- +- External command failed to start. +- ++ ++ External command failed to start. ++ + + +- +- Command <i>%1</i> failed to start. +- ++ ++ Command <i>%1</i> failed to start. ++ + + +- +- Internal error when starting command. +- ++ ++ Internal error when starting command. ++ + + +- +- Bad parameters for process job call. +- ++ ++ Bad parameters for process job call. ++ + + +- +- External command failed to finish. +- ++ ++ External command failed to finish. ++ + + +- +- Command <i>%1</i> failed to finish in %2 seconds. +- ++ ++ Command <i>%1</i> failed to finish in %2 seconds. ++ + + +- +- External command finished with errors. +- ++ ++ External command finished with errors. ++ + + +- +- Command <i>%1</i> finished with exit code %2. +- ++ ++ Command <i>%1</i> finished with exit code %2. ++ + +- +- ++ ++ + QObject + +- +- %1 (%2) +- ++ ++ %1 (%2) ++ + + +- +- unknown +- @partition info +- ++ ++ unknown ++ @partition info ++ + + +- +- extended +- @partition info +- ++ ++ extended ++ @partition info ++ + + +- +- unformatted +- @partition info +- ++ ++ unformatted ++ @partition info ++ + + +- +- swap +- @partition info +- ++ ++ swap ++ @partition info ++ + + +- +- +- Default +- ++ ++ ++ Default ++ + + +- +- Directory not found +- ++ ++ Directory not found ++ + + +- +- Could not create new random file <pre>%1</pre>. +- ++ ++ Could not create new random file <pre>%1</pre>. ++ + + +- +- No product +- ++ ++ No product ++ + + +- +- No description provided. +- ++ ++ No description provided. ++ + + +- +- (no mount point) +- ++ ++ (no mount point) ++ + + +- +- Unpartitioned space or unknown partition table +- @info +- ++ ++ Unpartitioned space or unknown partition table ++ @info ++ + +- +- ++ ++ + Recommended + +- +- <p>This computer does not satisfy some of the recommended requirements for setting up %1.<br/> ++ ++ <p>This computer does not satisfy some of the recommended requirements for setting up %1.<br/> + Setup can continue, but some features might be disabled.</p> +- ++ + +- +- ++ ++ + RemoveUserJob + +- +- Removing live user from the target system… +- @status +- ++ ++ Removing live user from the target system… ++ @status ++ + +- +- ++ ++ + RemoveVolumeGroupJob + +- +- +- Removing Volume Group named %1… +- @status +- ++ ++ ++ Removing Volume Group named %1… ++ @status ++ + + +- +- Removing Volume Group named <strong>%1</strong>… +- @status +- ++ ++ Removing Volume Group named <strong>%1</strong>… ++ @status ++ + + +- +- The installer failed to remove a volume group named '%1'. +- ++ ++ The installer failed to remove a volume group named '%1'. ++ + +- +- ++ ++ + Requirements + +- +- <p>This computer does not satisfy the minimum requirements for installing %1.<br/> ++ ++ <p>This computer does not satisfy the minimum requirements for installing %1.<br/> + Installation cannot continue.</p> +- ++ + + +- +- <p>This computer does not satisfy some of the recommended requirements for setting up %1.<br/> ++ ++ <p>This computer does not satisfy some of the recommended requirements for setting up %1.<br/> + Setup can continue, but some features might be disabled.</p> +- ++ + +- +- ++ ++ + ResizeFSJob + +- +- Performing file system resize… +- @status +- ++ ++ Performing file system resize… ++ @status ++ + + +- +- Invalid configuration +- @error +- ++ ++ Invalid configuration ++ @error ++ + + +- +- The file-system resize job has an invalid configuration and will not run. +- @error +- ++ ++ The file-system resize job has an invalid configuration and will not run. ++ @error ++ + + +- +- KPMCore not available +- @error +- ++ ++ KPMCore not available ++ @error ++ + + +- +- Calamares cannot start KPMCore for the file system resize job. +- @error +- ++ ++ Calamares cannot start KPMCore for the file system resize job. ++ @error ++ + + +- +- Resize failed. +- @error +- ++ ++ Resize failed. ++ @error ++ + + +- +- The filesystem %1 could not be found in this system, and cannot be resized. +- @info +- ++ ++ The filesystem %1 could not be found in this system, and cannot be resized. ++ @info ++ + + +- +- The device %1 could not be found in this system, and cannot be resized. +- @info +- ++ ++ The device %1 could not be found in this system, and cannot be resized. ++ @info ++ + + +- +- +- +- +- Resize Failed +- @error +- ++ ++ ++ ++ ++ Resize Failed ++ @error ++ + + +- +- +- The filesystem %1 cannot be resized. +- @error +- ++ ++ ++ The filesystem %1 cannot be resized. ++ @error ++ + + +- +- +- The device %1 cannot be resized. +- @error +- ++ ++ ++ The device %1 cannot be resized. ++ @error ++ + + +- +- The file system %1 must be resized, but cannot. +- @info +- ++ ++ The file system %1 must be resized, but cannot. ++ @info ++ + + +- +- The device %1 must be resized, but cannot +- @info +- ++ ++ The device %1 must be resized, but cannot ++ @info ++ + +- +- ++ ++ + ResizePartitionJob + +- +- Resize partition %1 +- @title +- ++ ++ Resize partition %1 ++ @title ++ + + +- +- Resize <strong>%2MiB</strong> partition <strong>%1</strong> to <strong>%3MiB</strong> +- @info +- ++ ++ Resize <strong>%2MiB</strong> partition <strong>%1</strong> to <strong>%3MiB</strong> ++ @info ++ + + +- +- Resizing %2MiB partition %1 to %3MiB… +- @status +- ++ ++ Resizing %2MiB partition %1 to %3MiB… ++ @status ++ + + +- +- The installer failed to resize partition %1 on disk '%2'. +- ++ ++ The installer failed to resize partition %1 on disk '%2'. ++ + +- +- ++ ++ + ResizeVolumeGroupDialog + +- +- Resize Volume Group +- @title +- ++ ++ Resize Volume Group ++ @title ++ + +- +- ++ ++ + ResizeVolumeGroupJob + +- +- Resize volume group named %1 from %2 to %3 +- @title +- ++ ++ Resize volume group named %1 from %2 to %3 ++ @title ++ + + +- +- Resize volume group named <strong>%1</strong> from <strong>%2</strong> to <strong>%3</strong> +- @info +- ++ ++ Resize volume group named <strong>%1</strong> from <strong>%2</strong> to <strong>%3</strong> ++ @info ++ + + +- +- Resizing volume group named %1 from %2 to %3… +- @status +- ++ ++ Resizing volume group named %1 from %2 to %3… ++ @status ++ + + +- +- The installer failed to resize a volume group named '%1'. +- ++ ++ The installer failed to resize a volume group named '%1'. ++ + +- +- ++ ++ + ResultsListWidget + +- +- Checking requirements again in a few seconds ... +- ++ ++ Checking requirements again in a few seconds ... ++ + +- +- ++ ++ + ScanningDialog + +- +- Scanning storage devices… +- @status +- ++ ++ Scanning storage devices… ++ @status ++ + + +- +- Partitioning… +- @status +- ++ ++ Partitioning… ++ @status ++ + +- +- ++ ++ + SetHostNameJob + +- +- Set hostname %1 +- ++ ++ Set hostname %1 ++ + + +- +- Set hostname <strong>%1</strong>. +- ++ ++ Set hostname <strong>%1</strong>. ++ + + +- +- Setting hostname %1… +- @status +- ++ ++ Setting hostname %1… ++ @status ++ + + +- +- +- Internal Error +- ++ ++ ++ Internal Error ++ + + +- +- +- Cannot write hostname to target system +- ++ ++ ++ Cannot write hostname to target system ++ + +- +- ++ ++ + SetKeyboardLayoutJob + +- +- Setting keyboard model to %1, layout as %2-%3… +- @status, %1 model, %2 layout, %3 variant +- ++ ++ Setting keyboard model to %1, layout as %2-%3… ++ @status, %1 model, %2 layout, %3 variant ++ + + +- +- Failed to write keyboard configuration for the virtual console. +- @error +- ++ ++ Failed to write keyboard configuration for the virtual console. ++ @error ++ + + +- +- Failed to write to %1 +- @error, %1 is virtual console configuration path +- ++ ++ Failed to write to %1 ++ @error, %1 is virtual console configuration path ++ + + +- +- Failed to write keyboard configuration for X11. +- @error +- ++ ++ Failed to write keyboard configuration for X11. ++ @error ++ + + +- +- Failed to write to %1 +- @error, %1 is keyboard configuration path +- ++ ++ Failed to write to %1 ++ @error, %1 is keyboard configuration path ++ + + +- +- Failed to write keyboard configuration to existing /etc/default directory. +- @error +- ++ ++ Failed to write keyboard configuration to existing /etc/default directory. ++ @error ++ + + +- +- Failed to write to %1 +- @error, %1 is default keyboard path +- ++ ++ Failed to write to %1 ++ @error, %1 is default keyboard path ++ + +- +- ++ ++ + SetPartFlagsJob + +- +- Set flags on partition %1 +- @title +- ++ ++ Set flags on partition %1 ++ @title ++ + + +- +- Set flags on %1MiB %2 partition +- @title +- ++ ++ Set flags on %1MiB %2 partition ++ @title ++ + + +- +- Set flags on new partition +- @title +- ++ ++ Set flags on new partition ++ @title ++ + + +- +- Clear flags on partition <strong>%1</strong> +- @info +- ++ ++ Clear flags on partition <strong>%1</strong> ++ @info ++ + + +- +- Clear flags on %1MiB <strong>%2</strong> partition +- @info +- ++ ++ Clear flags on %1MiB <strong>%2</strong> partition ++ @info ++ + + +- +- Clear flags on new partition +- @info +- ++ ++ Clear flags on new partition ++ @info ++ + + +- +- Set flags on partition <strong>%1</strong> to <strong>%2</strong> +- @info +- ++ ++ Set flags on partition <strong>%1</strong> to <strong>%2</strong> ++ @info ++ + + +- +- Set flags on %1MiB <strong>%2</strong> partition to <strong>%3</strong> +- @info +- ++ ++ Set flags on %1MiB <strong>%2</strong> partition to <strong>%3</strong> ++ @info ++ + + +- +- Set flags on new partition to <strong>%1</strong> +- @info +- ++ ++ Set flags on new partition to <strong>%1</strong> ++ @info ++ + + +- +- Clearing flags on partition <strong>%1</strong>… +- @status +- ++ ++ Clearing flags on partition <strong>%1</strong>… ++ @status ++ + + +- +- Clearing flags on %1MiB <strong>%2</strong> partition… +- @status +- ++ ++ Clearing flags on %1MiB <strong>%2</strong> partition… ++ @status ++ + + +- +- Clearing flags on new partition… +- @status +- ++ ++ Clearing flags on new partition… ++ @status ++ + + +- +- Setting flags <strong>%2</strong> on partition <strong>%1</strong>… +- @status +- ++ ++ Setting flags <strong>%2</strong> on partition <strong>%1</strong>… ++ @status ++ + + +- +- Setting flags <strong>%3</strong> on %1MiB <strong>%2</strong> partition… +- @status +- ++ ++ Setting flags <strong>%3</strong> on %1MiB <strong>%2</strong> partition… ++ @status ++ + + +- +- Setting flags <strong>%1</strong> on new partition… +- @status +- ++ ++ Setting flags <strong>%1</strong> on new partition… ++ @status ++ + + +- +- The installer failed to set flags on partition %1. +- ++ ++ The installer failed to set flags on partition %1. ++ + +- +- ++ ++ + SetPasswordJob + +- +- Set password for user %1 +- ++ ++ Set password for user %1 ++ + + +- +- Setting password for user %1… +- @status +- ++ ++ Setting password for user %1… ++ @status ++ + + +- +- Bad destination system path. +- ++ ++ Bad destination system path. ++ + + +- +- rootMountPoint is %1 +- ++ ++ rootMountPoint is %1 ++ + + +- +- Cannot disable root account. +- ++ ++ Cannot disable root account. ++ + + +- +- +- usermod terminated with error code %1. +- ++ ++ ++ usermod terminated with error code %1. ++ + + +- +- Cannot set password for user %1. +- ++ ++ Cannot set password for user %1. ++ + +- +- ++ ++ + SetTimezoneJob + +- +- Setting timezone to %1/%2… +- @status +- ++ ++ Setting timezone to %1/%2… ++ @status ++ + + +- +- Cannot access selected timezone path. +- @error +- ++ ++ Cannot access selected timezone path. ++ @error ++ + + +- +- Bad path: %1 +- @error +- ++ ++ Bad path: %1 ++ @error ++ + + +- +- +- Cannot set timezone. +- @error +- ++ ++ ++ Cannot set timezone. ++ @error ++ + + +- +- Link creation failed, target: %1; link name: %2 +- @info +- ++ ++ Link creation failed, target: %1; link name: %2 ++ @info ++ + + +- +- Cannot open /etc/timezone for writing +- @info +- ++ ++ Cannot open /etc/timezone for writing ++ @info ++ + +- +- ++ ++ + SetupGroupsJob + +- +- Preparing groups… +- @status +- ++ ++ Preparing groups… ++ @status ++ + + +- +- +- Could not create groups in target system +- ++ ++ ++ Could not create groups in target system ++ + + +- +- These groups are missing in the target system: %1 +- ++ ++ These groups are missing in the target system: %1 ++ + +- +- ++ ++ + SetupSudoJob + +- +- Configuring <pre>sudo</pre> users… +- @status +- ++ ++ Configuring <pre>sudo</pre> users… ++ @status ++ + + +- +- Cannot chmod sudoers file. +- ++ ++ Cannot chmod sudoers file. ++ + + +- +- Cannot create sudoers file for writing. +- ++ ++ Cannot create sudoers file for writing. ++ + +- +- ++ ++ + ShellProcessJob + +- +- Running shell processes… +- @status +- ++ ++ Running shell processes… ++ @status ++ + +- +- ++ ++ + SlideCounter + +- +- +- %L1 / %L2 +- slide counter, %1 of %2 (numeric) +- ++ ++ ++ %L1 / %L2 ++ slide counter, %1 of %2 (numeric) ++ + +- +- ++ ++ + StandardButtons + +- +- &OK +- ++ ++ &OK ++ + + +- +- &Yes +- ++ ++ &Yes ++ + + +- +- &No +- ++ ++ &No ++ + + +- +- &Cancel +- ++ ++ &Cancel ++ + + +- +- &Close +- ++ ++ &Close ++ + +- +- ++ ++ + TrackingInstallJob + +- +- Installation feedback +- ++ ++ Installation feedback ++ + + +- +- Sending installation feedback… +- @status +- ++ ++ Sending installation feedback… ++ @status ++ + + +- +- Internal error in install-tracking. +- ++ ++ Internal error in install-tracking. ++ + + +- +- HTTP request timed out. +- ++ ++ HTTP request timed out. ++ + +- +- ++ ++ + TrackingKUserFeedbackJob + +- +- KDE user feedback +- ++ ++ KDE user feedback ++ + + +- +- Configuring KDE user feedback… +- @status +- ++ ++ Configuring KDE user feedback… ++ @status ++ + + +- +- +- Error in KDE user feedback configuration. +- ++ ++ ++ Error in KDE user feedback configuration. ++ + + +- +- Could not configure KDE user feedback correctly, script error %1. +- ++ ++ Could not configure KDE user feedback correctly, script error %1. ++ + + +- +- Could not configure KDE user feedback correctly, Calamares error %1. +- ++ ++ Could not configure KDE user feedback correctly, Calamares error %1. ++ + +- +- ++ ++ + TrackingMachineUpdateManagerJob + +- +- Machine feedback +- ++ ++ Machine feedback ++ + + +- +- Configuring machine feedback… +- @status +- ++ ++ Configuring machine feedback… ++ @status ++ + + +- +- +- Error in machine feedback configuration. +- ++ ++ ++ Error in machine feedback configuration. ++ + + +- +- Could not configure machine feedback correctly, script error %1. +- ++ ++ Could not configure machine feedback correctly, script error %1. ++ + + +- +- Could not configure machine feedback correctly, Calamares error %1. +- ++ ++ Could not configure machine feedback correctly, Calamares error %1. ++ + +- +- ++ ++ + TrackingPage + +- +- Placeholder +- ++ ++ Placeholder ++ + + +- +- <html><head/><body><p>Click here to send <span style=" font-weight:600;">no information at all</span> about your installation.</p></body></html> +- ++ ++ <html><head/><body><p>Click here to send <span style=" font-weight:600;">no information at all</span> about your installation.</p></body></html> ++ + + +- +- <html><head/><body><p><a href="placeholder"><span style=" text-decoration: underline; color:#2980b9;">Click here for more information about user feedback</span></a></p></body></html> +- ++ ++ <html><head/><body><p><a href="placeholder"><span style=" text-decoration: underline; color:#2980b9;">Click here for more information about user feedback</span></a></p></body></html> ++ + + +- +- Tracking helps %1 to see how often it is installed, what hardware it is installed on and which applications are used. To see what will be sent, please click the help icon next to each area. +- ++ ++ Tracking helps %1 to see how often it is installed, what hardware it is installed on and which applications are used. To see what will be sent, please click the help icon next to each area. ++ + + +- +- By selecting this you will send information about your installation and hardware. This information will only be sent <b>once</b> after the installation finishes. +- ++ ++ By selecting this you will send information about your installation and hardware. This information will only be sent <b>once</b> after the installation finishes. ++ + + +- +- By selecting this you will periodically send information about your <b>machine</b> installation, hardware and applications, to %1. +- ++ ++ By selecting this you will periodically send information about your <b>machine</b> installation, hardware and applications, to %1. ++ + + +- +- By selecting this you will regularly send information about your <b>user</b> installation, hardware, applications and application usage patterns, to %1. +- ++ ++ By selecting this you will regularly send information about your <b>user</b> installation, hardware, applications and application usage patterns, to %1. ++ + +- +- ++ ++ + TrackingViewStep + +- +- Feedback +- @title +- ++ ++ Feedback ++ @title ++ + +- +- ++ ++ + UmountJob + +- +- Unmounting file systems… +- @status +- ++ ++ Unmounting file systems… ++ @status ++ + + +- +- No target system available. +- ++ ++ No target system available. ++ + + +- +- No rootMountPoint is set. +- ++ ++ No rootMountPoint is set. ++ + +- +- ++ ++ + UsersPage + +- +- <small>If more than one person will use this computer, you can create multiple accounts after setup.</small> +- ++ ++ <small>If more than one person will use this computer, you can create multiple accounts after setup.</small> ++ + + +- +- <small>If more than one person will use this computer, you can create multiple accounts after installation.</small> +- ++ ++ <small>If more than one person will use this computer, you can create multiple accounts after installation.</small> ++ + +- +- ++ ++ + UsersQmlViewStep + +- +- Users +- ++ ++ Users ++ + +- +- ++ ++ + UsersViewStep + +- +- Users +- ++ ++ Users ++ + +- +- ++ ++ + VariantModel + +- +- Key +- Column header for key/value +- ++ ++ Key ++ Column header for key/value ++ + + +- +- Value +- Column header for key/value +- ++ ++ Value ++ Column header for key/value ++ + +- +- ++ ++ + VolumeGroupBaseDialog + +- +- Create Volume Group +- ++ ++ Create Volume Group ++ + + +- +- List of Physical Volumes +- ++ ++ List of Physical Volumes ++ + + +- +- Volume Group Name: +- ++ ++ Volume Group Name: ++ + + +- +- Volume Group Type: +- ++ ++ Volume Group Type: ++ + + +- +- Physical Extent Size: +- ++ ++ Physical Extent Size: ++ + + +- +- MiB +- ++ ++ MiB ++ + + +- +- Total Size: +- ++ ++ Total Size: ++ + + +- +- Used Size: +- ++ ++ Used Size: ++ + + +- +- Total Sectors: +- ++ ++ Total Sectors: ++ + + +- +- Quantity of LVs: +- ++ ++ Quantity of LVs: ++ + +- +- ++ ++ + WelcomePage + +- +- +- Select application and system language +- +- +- +- +- Open donations website +- +- +- +- +- &Donate +- +- +- +- +- Open help and support website +- +- +- +- +- &Support +- +- +- +- +- Open issues and bug-tracking website +- +- +- +- +- &Known issues +- +- +- +- +- Open release notes website +- +- +- +- +- &Release notes +- ++ ++ ++ Select application and system language ++ + + +- +- About %1 Setup +- @title +- ++ ++ language ++ + + +- +- About %1 Installer +- @title +- ++ ++ About %1 Setup ++ @title ++ + + +- +- %1 Support +- @action +- ++ ++ About %1 Installer ++ @title ++ + +- +- ++ ++ + WelcomeQmlViewStep + +- +- Welcome +- @title +- ++ ++ Welcome ++ @title ++ + +- +- ++ ++ + WelcomeViewStep + +- +- Welcome +- @title +- ++ ++ Welcome ++ @title ++ + +- +- ++ ++ + ZfsJob + +- +- Creating ZFS pools and datasets… +- @status +- ++ ++ Creating ZFS pools and datasets… ++ @status ++ + + +- +- Failed to create zpool on +- ++ ++ Failed to create zpool on ++ + + +- +- Configuration Error +- ++ ++ Configuration Error ++ + + +- +- No partitions are available for ZFS. +- ++ ++ No partitions are available for ZFS. ++ + + +- +- Internal data missing +- ++ ++ Internal data missing ++ + + +- +- +- Failed to create zpool +- ++ ++ ++ Failed to create zpool ++ + + +- +- Failed to create dataset +- ++ ++ Failed to create dataset ++ + + +- +- The output was: +- ++ ++ The output was: ++ + +- +- ++ ++ + calamares-sidebar + +- +- About +- ++ ++ About ++ + + +- +- Debug +- ++ ++ Debug ++ + + +- +- About +- @button +- ++ ++ About ++ @button ++ + + +- +- Show information about Calamares +- @tooltip +- ++ ++ Show information about Calamares ++ @tooltip ++ + + +- +- Debug +- @button +- ++ ++ ++ Debug ++ @button ++ + + +- +- Show debug information +- @tooltip +- ++ ++ ++ Show debug information ++ @tooltip ++ + +- +- ++ ++ ++ Show information about easysoftware ++ @tooltip ++ ++ ++ ++ + finishedq + +- +- Installation Completed +- ++ ++ Installation Completed ++ + + +- +- %1 has been installed on your computer.<br/> ++ ++ %1 has been installed on your computer.<br/> + You may now restart into your new system, or continue using the Live environment. +- ++ + + +- +- Close Installer +- ++ ++ Close Installer ++ + + +- +- Restart System +- ++ ++ Restart System ++ + + +- +- <p>A full log of the install is available as installation.log in the home directory of the Live user.<br/> ++ ++ <p>A full log of the install is available as installation.log in the home directory of the Live user.<br/> + This log is copied to /var/log/installation.log of the target system.</p> +- ++ + +- +- ++ ++ + finishedq-qt6 + +- +- Installation Completed +- @title +- ++ ++ Installation Completed ++ @title ++ + + +- +- %1 has been installed on your computer.<br/> ++ ++ %1 has been installed on your computer.<br/> + You may now restart into your new system, or continue using the Live environment. +- @info, %1 is the product name +- ++ @info, %1 is the product name ++ + + +- +- Close Installer +- @button +- ++ ++ Close Installer ++ @button ++ + + +- +- Restart System +- @button +- ++ ++ Restart System ++ @button ++ + + +- +- <p>A full log of the install is available as installation.log in the home directory of the Live user.<br/> ++ ++ <p>A full log of the install is available as installation.log in the home directory of the Live user.<br/> + This log is copied to /var/log/installation.log of the target system.</p> +- @info +- ++ @info ++ + +- +- ++ ++ + finishedq@mobile + +- +- Installation Completed +- @title +- ++ ++ Installation Completed ++ @title ++ + + +- +- %1 has been installed on your computer.<br/> ++ ++ %1 has been installed on your computer.<br/> + You may now restart your device. +- @info, %1 is the product name +- ++ @info, %1 is the product name ++ + + +- +- Close +- @button +- ++ ++ Close ++ @button ++ + + +- +- Restart +- @button +- ++ ++ Restart ++ @button ++ + +- +- ++ ++ + keyboardq + +- +- Select a layout to activate keyboard preview +- @label +- ++ ++ Select a layout to activate keyboard preview ++ @label ++ + + +- +- <b>Keyboard model:&nbsp;&nbsp;</b> +- @label +- ++ ++ <b>Keyboard model:&nbsp;&nbsp;</b> ++ @label ++ + + +- +- Layout +- @label +- ++ ++ Layout ++ @label ++ + + +- +- Variant +- @label +- ++ ++ Variant ++ @label ++ + + +- +- Type here to test your keyboard… +- @label +- ++ ++ Type here to test your keyboard… ++ @label ++ + +- +- ++ ++ + keyboardq-qt6 + +- +- Select a layout to activate keyboard preview +- @label +- ++ ++ Select a layout to activate keyboard preview ++ @label ++ + + +- +- <b>Keyboard model:&nbsp;&nbsp;</b> +- @label +- ++ ++ <b>Keyboard model:&nbsp;&nbsp;</b> ++ @label ++ + + +- +- Layout +- @label +- ++ ++ Layout ++ @label ++ + + +- +- Variant +- @label +- ++ ++ Variant ++ @label ++ + + +- +- Type here to test your keyboard… +- @label +- ++ ++ Type here to test your keyboard… ++ @label ++ + +- +- ++ ++ + localeq + +- +- +- Change +- @button +- ++ ++ ++ Change ++ @button ++ + + +- +- <h3>Languages</h3> </br> ++ ++ <h3>Languages</h3> </br> + The system locale setting affects the language and character set for some command line user interface elements. The current setting is <strong>%1</strong>. +- @info +- ++ @info ++ + + +- +- <h3>Locales</h3> </br> ++ ++ <h3>Locales</h3> </br> + The system locale setting affects the numbers and dates format. The current setting is <strong>%1</strong>. +- @info +- ++ @info ++ + +- +- ++ ++ + localeq-qt6 + +- +- +- Change +- @button +- ++ ++ ++ Change ++ @button ++ + + +- +- <h3>Languages</h3> </br> ++ ++ <h3>Languages</h3> </br> + The system locale setting affects the language and character set for some command line user interface elements. The current setting is <strong>%1</strong>. +- @info +- ++ @info ++ + + +- +- <h3>Locales</h3> </br> ++ ++ <h3>Locales</h3> </br> + The system locale setting affects the numbers and dates format. The current setting is <strong>%1</strong>. +- @info +- ++ @info ++ + +- +- ++ ++ + notesqml + +- +- <h3>%1</h3> ++ ++ <h3>%1</h3> + <p>These are example release notes.</p> +- ++ + +- +- ++ ++ + packagechooserq + +- +- LibreOffice is a powerful and free office suite, used by millions of people around the world. It includes several applications that make it the most versatile Free and Open Source office suite on the market.<br/> ++ ++ LibreOffice is a powerful and free office suite, used by millions of people around the world. It includes several applications that make it the most versatile Free and Open Source office suite on the market.<br/> + Default option. +- ++ + + +- +- LibreOffice +- ++ ++ LibreOffice ++ + + +- +- If you don't want to install an office suite, just select No Office Suite. You can always add one (or more) later on your installed system as the need arrives. +- ++ ++ If you don't want to install an office suite, just select No Office Suite. You can always add one (or more) later on your installed system as the need arrives. ++ + + +- +- No Office Suite +- ++ ++ No Office Suite ++ + + +- +- Create a minimal Desktop install, remove all extra applications and decide later on what you would like to add to your system. Examples of what won't be on such an install, there will be no Office Suite, no media players, no image viewer or print support. It will be just a desktop, file browser, package manager, text editor and simple web-browser. +- ++ ++ Create a minimal Desktop install, remove all extra applications and decide later on what you would like to add to your system. Examples of what won't be on such an install, there will be no Office Suite, no media players, no image viewer or print support. It will be just a desktop, file browser, package manager, text editor and simple web-browser. ++ + + +- +- Minimal Install +- ++ ++ Minimal Install ++ + + +- +- Please select an option for your install, or use the default: LibreOffice included. +- ++ ++ Please select an option for your install, or use the default: LibreOffice included. ++ + +- +- ++ ++ + packagechooserq-qt6 + +- +- LibreOffice is a powerful and free office suite, used by millions of people around the world. It includes several applications that make it the most versatile Free and Open Source office suite on the market.<br/> ++ ++ LibreOffice is a powerful and free office suite, used by millions of people around the world. It includes several applications that make it the most versatile Free and Open Source office suite on the market.<br/> + Default option. +- ++ + + +- +- LibreOffice +- ++ ++ LibreOffice ++ + + +- +- If you don't want to install an office suite, just select No Office Suite. You can always add one (or more) later on your installed system as the need arrives. +- ++ ++ If you don't want to install an office suite, just select No Office Suite. You can always add one (or more) later on your installed system as the need arrives. ++ + + +- +- No Office Suite +- ++ ++ No Office Suite ++ + + +- +- Create a minimal Desktop install, remove all extra applications and decide later on what you would like to add to your system. Examples of what won't be on such an install, there will be no Office Suite, no media players, no image viewer or print support. It will be just a desktop, file browser, package manager, text editor and simple web-browser. +- ++ ++ Create a minimal Desktop install, remove all extra applications and decide later on what you would like to add to your system. Examples of what won't be on such an install, there will be no Office Suite, no media players, no image viewer or print support. It will be just a desktop, file browser, package manager, text editor and simple web-browser. ++ + + +- +- Minimal Install +- ++ ++ Minimal Install ++ + + +- +- Please select an option for your install, or use the default: LibreOffice included. +- ++ ++ Please select an option for your install, or use the default: LibreOffice included. ++ + +- +- ++ ++ + release_notes + +- +- <h3>%1</h3> +- <p>This an example QML file, showing options in RichText with Flickable content.</p> ++ ++ ### %1 ++This an example QML file, showing options in Markdown with Flickable content. ++ ++QML with RichText can use HTML tags, with Markdown it uses the simple Markdown syntax, Flickable content is useful for touchscreens. ++ ++**This is bold text** ++ ++*This is italic text* ++ ++_This is underlined text_ + +- <p>QML with RichText can use HTML tags, Flickable content is useful for touchscreens.</p> ++> blockquote + +- <p><b>This is bold text</b></p> +- <p><i>This is italic text</i></p> +- <p><u>This is underlined text</u></p> +- <p><center>This text will be center-aligned.</center></p> +- <p><s>This is strikethrough</s></p> ++~~This is strikethrough~~ + +- <p>Code example: +- <code>ls -l /home</code></p> ++Code example: ++``` ++ls -l /home ++``` + +- <p><b>Lists:</b></p> +- <ul> +- <li>Intel CPU systems</li> +- <li>AMD CPU systems</li> +- </ul> ++**Lists:** ++ * Intel CPU systems ++ * AMD CPU systems + +- <p>The vertical scrollbar is adjustable, current width set to 10.</p> +- ++The vertical scrollbar is adjustable, current width set to 10. ++ + + +- +- Back +- ++ ++ Back ++ + +- +- ++ ++ + usersq + +- +- Pick your user name and credentials to login and perform admin tasks +- ++ ++ Pick your user name and credentials to login and perform admin tasks ++ + + +- +- What is your name? +- ++ ++ What is your name? ++ + + +- +- Your full name +- ++ ++ Your full name ++ + + +- +- What name do you want to use to log in? +- ++ ++ What name do you want to use to log in? ++ + + +- +- Login name +- ++ ++ Login name ++ + + +- +- If more than one person will use this computer, you can create multiple accounts after installation. +- ++ ++ If more than one person will use this computer, you can create multiple accounts after installation. ++ + + +- +- Only lowercase letters, numbers, underscore and hyphen are allowed. +- ++ ++ Only lowercase letters, numbers, underscore and hyphen are allowed. ++ + + +- +- root is not allowed as username. +- ++ ++ root is not allowed as username. ++ + + +- +- What is the name of this computer? +- ++ ++ What is the name of this computer? ++ + + +- +- Computer name +- ++ ++ Computer name ++ + + +- +- This name will be used if you make the computer visible to others on a network. +- ++ ++ This name will be used if you make the computer visible to others on a network. ++ + + +- +- Only letters, numbers, underscore and hyphen are allowed, minimal of two characters. +- ++ ++ Only letters, numbers, underscore and hyphen are allowed, minimal of two characters. ++ + + +- +- localhost is not allowed as hostname. +- ++ ++ localhost is not allowed as hostname. ++ + + +- +- Choose a password to keep your account safe. +- ++ ++ Choose a password to keep your account safe. ++ + + +- +- Password +- ++ ++ Password ++ + + +- +- Repeat password +- ++ ++ Repeat password ++ + + +- +- Enter the same password twice, so that it can be checked for typing errors. A good password will contain a mixture of letters, numbers and punctuation, should be at least eight characters long, and should be changed at regular intervals. +- ++ ++ Enter the same password twice, so that it can be checked for typing errors. A good password will contain a mixture of letters, numbers and punctuation, should be at least eight characters long, and should be changed at regular intervals. ++ + + +- +- Reuse user password as root password +- ++ ++ Reuse user password as root password ++ + + +- +- Use the same password for the administrator account. +- ++ ++ Use the same password for the administrator account. ++ + + +- +- Choose a root password to keep your account safe. +- ++ ++ Choose a root password to keep your account safe. ++ + + +- +- Root password +- ++ ++ Root password ++ + + +- +- Repeat root password +- ++ ++ Repeat root password ++ + + +- +- Enter the same password twice, so that it can be checked for typing errors. +- ++ ++ Enter the same password twice, so that it can be checked for typing errors. ++ + + +- +- Log in automatically without asking for the password +- ++ ++ Log in automatically without asking for the password ++ + + +- +- Validate passwords quality +- ++ ++ Validate passwords quality ++ + + +- +- When this box is checked, password-strength checking is done and you will not be able to use a weak password. +- ++ ++ When this box is checked, password-strength checking is done and you will not be able to use a weak password. ++ + +- +- ++ ++ + usersq-qt6 + +- +- Pick your user name and credentials to login and perform admin tasks +- ++ ++ Pick your user name and credentials to login and perform admin tasks ++ + + +- +- What is your name? +- ++ ++ What is your name? ++ + + +- +- Your full name +- ++ ++ Your full name ++ + + +- +- What name do you want to use to log in? +- ++ ++ What name do you want to use to log in? ++ + + +- +- Login name +- ++ ++ Login name ++ + + +- +- If more than one person will use this computer, you can create multiple accounts after installation. +- ++ ++ If more than one person will use this computer, you can create multiple accounts after installation. ++ + + +- +- Only lowercase letters, numbers, underscore and hyphen are allowed. +- ++ ++ Only lowercase letters, numbers, underscore and hyphen are allowed. ++ + + +- +- root is not allowed as username. +- ++ ++ root is not allowed as username. ++ + + +- +- What is the name of this computer? +- ++ ++ What is the name of this computer? ++ + + +- +- Computer name +- ++ ++ Computer name ++ + + +- +- This name will be used if you make the computer visible to others on a network. +- ++ ++ This name will be used if you make the computer visible to others on a network. ++ + + +- +- Only letters, numbers, underscore and hyphen are allowed, minimal of two characters. +- ++ ++ Only letters, numbers, underscore and hyphen are allowed, minimal of two characters. ++ + + +- +- localhost is not allowed as hostname. +- ++ ++ localhost is not allowed as hostname. ++ + + +- +- Choose a password to keep your account safe. +- ++ ++ Choose a password to keep your account safe. ++ + + +- +- Password +- ++ ++ Password ++ + + +- +- Repeat password +- ++ ++ Repeat password ++ + + +- +- Enter the same password twice, so that it can be checked for typing errors. A good password will contain a mixture of letters, numbers and punctuation, should be at least eight characters long, and should be changed at regular intervals. +- ++ ++ Enter the same password twice, so that it can be checked for typing errors. A good password will contain a mixture of letters, numbers and punctuation, should be at least eight characters long, and should be changed at regular intervals. ++ + + +- +- Reuse user password as root password +- ++ ++ Reuse user password as root password ++ + + +- +- Use the same password for the administrator account. +- ++ ++ Use the same password for the administrator account. ++ + + +- +- Choose a root password to keep your account safe. +- ++ ++ Choose a root password to keep your account safe. ++ + + +- +- Root password +- ++ ++ Root password ++ + + +- +- Repeat root password +- ++ ++ Repeat root password ++ + + +- +- Enter the same password twice, so that it can be checked for typing errors. +- ++ ++ Enter the same password twice, so that it can be checked for typing errors. ++ + + +- +- Log in automatically without asking for the password +- ++ ++ Log in automatically without asking for the password ++ + + +- +- Validate passwords quality +- ++ ++ Validate passwords quality ++ + + +- +- When this box is checked, password-strength checking is done and you will not be able to use a weak password. +- ++ ++ When this box is checked, password-strength checking is done and you will not be able to use a weak password. ++ + +- +- ++ ++ + welcomeq + +- +- <h3>Welcome to the %1 <quote>%2</quote> installer</h3> ++ ++ <h3>Welcome to the %1 <quote>%2</quote> installer</h3> + <p>This program will ask you some questions and set up %1 on your computer.</p> +- ++ + + +- +- Support +- ++ ++ Support ++ + + +- +- Known Issues +- ++ ++ Known Issues ++ + + +- +- Release Notes +- ++ ++ Release Notes ++ + + +- +- Donate +- ++ ++ Donate ++ + +- +- ++ ++ + welcomeq-qt6 + +- +- <h3>Welcome to the %1 <quote>%2</quote> installer</h3> ++ ++ <h3>Welcome to the %1 <quote>%2</quote> installer</h3> + <p>This program will ask you some questions and set up %1 on your computer.</p> +- ++ + + +- +- Support +- ++ ++ Support ++ + + +- +- Known Issues +- ++ ++ Known Issues ++ + + +- +- Release Notes +- ++ ++ Release Notes ++ + + +- +- Donate +- ++ ++ Donate ++ + +- ++ + +diff --git a/lang/calamares_zh_TW.ts b/lang/calamares_zh_TW.ts +index d695119..8689629 100644 +--- a/lang/calamares_zh_TW.ts ++++ b/lang/calamares_zh_TW.ts +@@ -1,4873 +1,5001 @@ + + +- +- ++ ++ + AboutData + +- +- <h1>%1</h1><br/><strong>%2<br/> for %3</strong><br/><br/> +- <h1>%1</h1><br/><strong>%2<br/> for %3</strong><br/><br/> ++ ++ <br/><h2>Release:%1</h2><br/> ++ <br/><h1>發行版本:%1</h1><br/> + + +- +- Thanks to <a href="https://calamares.io/team/">the Calamares team</a> and the <a href="https://app.transifex.com/calamares/calamares/">Calamares translators team</a>. +- 感謝 <a href="https://calamares.io/team/">Calamares 團隊</a>與 <a href="https://app.transifex.com/calamares/calamares/">Calamares 翻譯者團隊</a>。 ++ ++ <strong>Thanks to the openEuler team.</strong> ++ <strong>感謝 openEuler 團隊。</strong> + + +- +- <a href="https://calamares.io/">Calamares</a> development is sponsored by <br/><a href="http://www.blue-systems.com/">Blue Systems</a> - Liberating Software. +- <a href="https://calamares.io/">Calamares</a> 由 <a href="http://www.blue-systems.com/">Blue Systems</a> - Liberating Software 贊助開發。 ++ <a href="https://calamares.io/">Calamares</a> development is sponsored by <br/><a href="http://www.blue-systems.com/">Blue Systems</a> - Liberating Software. ++ <a href="https://calamares.io/">Calamares</a> 由 <a href="http://www.blue-systems.com/">Blue Systems</a> - Liberating Software 贊助開發。 + + +- +- Copyright %1-%2 %3 &lt;%4&gt;<br/> +- Copyright year-year Name <email-address> +- Copyright %1-%2 %3 &lt;%4&gt;<br/> ++ ++ Copyright %1-%2 %3 &lt;%4&gt;<br/> ++ Copyright year-year Name <email-address> ++ Copyright %1-%2 %3 &lt;%4&gt;<br/> + +- +- ++ ++ ++ ActiveDirectoryJob ++ ++ ++ Enroll system in Active Directory ++ @label ++ ++ ++ ++ ++ Enrolling system in Active Directory… ++ @status ++ ++ ++ ++ + AutoMountManagementJob + +- +- Managing auto-mount settings… +- @status +- 管理自動掛載設定…… ++ ++ Managing auto-mount settings… ++ @status ++ 管理自動掛載設定…… + +- +- ++ ++ + BootInfoWidget + +- +- The <strong>boot environment</strong> of this system.<br><br>Older x86 systems only support <strong>BIOS</strong>.<br>Modern systems usually use <strong>EFI</strong>, but may also show up as BIOS if started in compatibility mode. +- 這個系統的<strong>開機環境</strong>。<br><br>較舊的 x86 系統只支援 <strong>BIOS</strong>。<br>現時的系統則通常使用 <strong>EFI</strong>,但若使用相容模式 (CSM),也可能顯示為 BIOS。 ++ ++ The <strong>boot environment</strong> of this system.<br><br>Older x86 systems only support <strong>BIOS</strong>.<br>Modern systems usually use <strong>EFI</strong>, but may also show up as BIOS if started in compatibility mode. ++ 這個系統的<strong>開機環境</strong>。<br><br>較舊的 x86 系統只支援 <strong>BIOS</strong>。<br>現時的系統則通常使用 <strong>EFI</strong>,但若使用相容模式 (CSM),也可能顯示為 BIOS。 + + +- +- This system was started with an <strong>EFI</strong> boot environment.<br><br>To configure startup from an EFI environment, this installer must deploy a boot loader application, like <strong>GRUB</strong> or <strong>systemd-boot</strong> on an <strong>EFI System Partition</strong>. This is automatic, unless you choose manual partitioning, in which case you must choose it or create it on your own. +- 這個系統以 <strong>EFI</strong> 開機。<br><br>要從 EFI 環境開機,本安裝程式必須安裝開機載入器程式,像是 <strong>GRUB</strong> 或 <strong>systemd-boot</strong> 在 <strong>EFI 系統分割區</strong>。這是自動的,除非選擇手動分割;在這種情況,您必須自行選取或建立它。 ++ ++ This system was started with an <strong>EFI</strong> boot environment.<br><br>To configure startup from an EFI environment, this installer must deploy a boot loader application, like <strong>GRUB</strong> or <strong>systemd-boot</strong> on an <strong>EFI System Partition</strong>. This is automatic, unless you choose manual partitioning, in which case you must choose it or create it on your own. ++ 這個系統以 <strong>EFI</strong> 開機。<br><br>要從 EFI 環境開機,本安裝程式必須安裝開機載入器程式,像是 <strong>GRUB</strong> 或 <strong>systemd-boot</strong> 在 <strong>EFI 系統分割區</strong>。這是自動的,除非選擇手動分割;在這種情況,您必須自行選取或建立它。 + + +- +- This system was started with a <strong>BIOS</strong> boot environment.<br><br>To configure startup from a BIOS environment, this installer must install a boot loader, like <strong>GRUB</strong>, either at the beginning of a partition or on the <strong>Master Boot Record</strong> near the beginning of the partition table (preferred). This is automatic, unless you choose manual partitioning, in which case you must set it up on your own. +- 這個系統以 <strong>BIOS</strong> 開機。<br><br>要從 BIOS 環境開機,本安裝程式必須安裝開機載入器程式,像是 <strong>GRUB</strong>。而且通常安裝在分割區的開首,又或最好安裝在靠近分割表開首的 <strong>主要開機記錄 (MBR)</strong>。這是自動的,除非選擇手動分割;在這種情況,您必須自行設定它。 ++ ++ This system was started with a <strong>BIOS</strong> boot environment.<br><br>To configure startup from a BIOS environment, this installer must install a boot loader, like <strong>GRUB</strong>, either at the beginning of a partition or on the <strong>Master Boot Record</strong> near the beginning of the partition table (preferred). This is automatic, unless you choose manual partitioning, in which case you must set it up on your own. ++ 這個系統以 <strong>BIOS</strong> 開機。<br><br>要從 BIOS 環境開機,本安裝程式必須安裝開機載入器程式,像是 <strong>GRUB</strong>。而且通常安裝在分割區的開首,又或最好安裝在靠近分割表開首的 <strong>主要開機記錄 (MBR)</strong>。這是自動的,除非選擇手動分割;在這種情況,您必須自行設定它。 + +- +- ++ ++ + BootLoaderModel + +- +- Master Boot Record of %1 +- @info +- %1 的主要開機紀錄 (MBR) ++ ++ Master Boot Record of %1 ++ @info ++ %1 的主要開機紀錄 (MBR) + + +- +- Boot Partition +- @info +- 開機分割區 ++ ++ Boot Partition ++ @info ++ 開機分割區 + + +- +- System Partition +- @info +- 系統分割區 ++ ++ System Partition ++ @info ++ 系統分割區 + + +- +- Do not install a boot loader +- @label +- 無法安裝開機載入器 ++ ++ Do not install a boot loader ++ @label ++ 無法安裝開機載入器 + + +- +- %1 (%2) +- %1 (%2) ++ ++ %1 (%2) ++ %1 (%2) + +- +- ++ ++ + Calamares::BlankViewStep + +- +- Blank Page +- 空白頁 ++ ++ Blank Page ++ 空白頁 + +- +- ++ ++ + Calamares::DebugWindow + +- +- GlobalStorage +- 全域儲存 ++ ++ GlobalStorage ++ 全域儲存 + + +- +- JobQueue +- 工作佇列 ++ ++ JobQueue ++ 工作佇列 + + +- +- Modules +- 模組 ++ ++ Modules ++ 模組 + + +- +- Type: +- 類型: ++ ++ Type: ++ 類型: + + +- +- +- none +- ++ ++ ++ none ++ + + +- +- Interface: +- 介面: ++ ++ Interface: ++ 介面: + + +- +- Crashes Calamares, so that Dr. Konqi can look at it. +- 讓 Calamares 當機,這樣 Dr. Konqi 就能檢視。 ++ ++ Crashes Calamares, so that Dr. Konqi can look at it. ++ 讓 Calamares 當機,這樣 Dr. Konqi 就能檢視。 + + +- +- Reloads the stylesheet from the branding directory. +- 重新自品牌目錄載入樣式表。 ++ ++ Reloads the stylesheet from the branding directory. ++ 重新自品牌目錄載入樣式表。 + + +- +- Reload Stylesheet +- 重新載入樣式表 ++ ++ Reload Stylesheet ++ 重新載入樣式表 + + +- +- Displays the tree of widget names in the log (for stylesheet debugging). +- 在紀錄檔中顯示小工具名稱樹(供樣式表除錯使用)。 ++ ++ Displays the tree of widget names in the log (for stylesheet debugging). ++ 在紀錄檔中顯示小工具名稱樹(供樣式表除錯使用)。 + + +- +- Widget Tree +- 小工具樹 ++ ++ Widget Tree ++ 小工具樹 + + +- +- Uploads the session log to the configured pastebin. +- 將工作階段紀錄檔上傳到設定好的 pastebin。 ++ ++ Uploads the session log to the configured pastebin. ++ 將工作階段紀錄檔上傳到設定好的 pastebin。 + + +- +- Send Session Log +- 傳送工作階段紀錄檔 ++ ++ Send Session Log ++ 傳送工作階段紀錄檔 + + +- +- Debug Information +- @title +- 除錯資訊 ++ ++ Debug Information ++ @title ++ 除錯資訊 + +- +- ++ ++ + Calamares::ExecutionViewStep + +- +- %p% +- Progress percentage indicator: %p is where the number 0..100 is placed +- %p% ++ ++ %p% ++ Progress percentage indicator: %p is where the number 0..100 is placed ++ %p% + + +- +- Set Up +- @label +- 安裝 ++ ++ Set Up ++ @label ++ 安裝 + + +- +- Install +- @label +- 安裝 ++ ++ Install ++ @label ++ 安裝 + +- +- ++ ++ + Calamares::FailJob + +- +- Job failed (%1) +- 排程失敗 (%1) ++ ++ Job failed (%1) ++ 排程失敗 (%1) + + +- +- Programmed job failure was explicitly requested. +- 明確要求程式化排程失敗。 ++ ++ Programmed job failure was explicitly requested. ++ 明確要求程式化排程失敗。 + +- +- ++ ++ + Calamares::JobThread + +- +- Done +- 完成 ++ ++ Done ++ 完成 + +- +- ++ ++ + Calamares::NamedJob + +- +- Example job (%1) +- 範例排程 (%1) ++ ++ Example job (%1) ++ 範例排程 (%1) + +- +- ++ ++ + Calamares::ProcessJob + +- +- Running command %1 in target system… +- @status +- 正於目標系統中執行 %1 命令…… ++ ++ Running command %1 in target system… ++ @status ++ 正於目標系統中執行 %1 命令…… + + +- +- Running command %1… +- @status +- 正在執行 %1 命令 ++ ++ Running command %1… ++ @status ++ 正在執行 %1 命令 + +- +- ++ ++ + Calamares::Python::Job + +- +- Running %1 operation. +- 正在執行 %1 操作。 ++ ++ Running %1 operation. ++ 正在執行 %1 操作。 + + +- +- Bad working directory path +- 不良的工作目錄路徑 ++ ++ Bad working directory path ++ 不良的工作目錄路徑 + + +- +- Working directory %1 for python job %2 is not readable. +- Python 行程 %2 作用中的目錄 %1 不具讀取權限。 ++ ++ Working directory %1 for python job %2 is not readable. ++ Python 行程 %2 作用中的目錄 %1 不具讀取權限。 + + +- +- +- +- +- +- +- Bad main script file +- 錯誤的主要腳本檔 ++ ++ ++ ++ ++ ++ ++ Bad main script file ++ 錯誤的主要腳本檔 + + +- +- Main script file %1 for python job %2 is not readable. +- Python 行程 %2 的主要腳本檔 %1 無法讀取。 ++ ++ Main script file %1 for python job %2 is not readable. ++ Python 行程 %2 的主要腳本檔 %1 無法讀取。 + + +- +- Bad internal script +- 內部命令稿錯誤 ++ ++ Bad internal script ++ 內部命令稿錯誤 + + +- +- Internal script for python job %1 raised an exception. +- python 作業 %1 的內部命令稿引發了例外。 ++ ++ Internal script for python job %1 raised an exception. ++ python 作業 %1 的內部命令稿引發了例外。 + + +- +- Main script file %1 for python job %2 could not be loaded because it raised an exception. +- 無法載入 python 作業 %2 的主要命令稿檔案 %1,因為其引發了例外。 ++ ++ Main script file %1 for python job %2 could not be loaded because it raised an exception. ++ 無法載入 python 作業 %2 的主要命令稿檔案 %1,因為其引發了例外。 + + +- +- Main script file %1 for python job %2 raised an exception. +- python 作業 %2 的主要命令稿 %1 引發了例外。 ++ ++ Main script file %1 for python job %2 raised an exception. ++ python 作業 %2 的主要命令稿 %1 引發了例外。 + + +- +- +- Main script file %1 for python job %2 returned invalid results. +- python 作業 %2 的主要命令稿 %1 回傳了無效結果。 ++ ++ ++ Main script file %1 for python job %2 returned invalid results. ++ python 作業 %2 的主要命令稿 %1 回傳了無效結果。 + + +- +- Main script file %1 for python job %2 does not contain a run() function. +- python 作業 %2 的主要命令稿 %1 不包含 run() 函式。 ++ ++ Main script file %1 for python job %2 does not contain a run() function. ++ python 作業 %2 的主要命令稿 %1 不包含 run() 函式。 + +- +- ++ ++ + Calamares::PythonJob + +- +- Running %1 operation… +- @status +- 正在執行 %1 操作…… ++ ++ Running %1 operation… ++ @status ++ 正在執行 %1 操作…… + + +- +- Bad working directory path +- @error +- 不良的工作目錄路徑 ++ ++ Bad working directory path ++ @error ++ 不良的工作目錄路徑 + + +- +- Working directory %1 for python job %2 is not readable. +- @error +- Python 行程 %2 作用中的目錄 %1 不具讀取權限。 ++ ++ Working directory %1 for python job %2 is not readable. ++ @error ++ Python 行程 %2 作用中的目錄 %1 不具讀取權限。 + + +- +- Bad main script file +- @error +- 錯誤的主要腳本檔 ++ ++ Bad main script file ++ @error ++ 錯誤的主要腳本檔 + + +- +- Main script file %1 for python job %2 is not readable. +- @error +- Python 行程 %2 的主要腳本檔 %1 無法讀取。 ++ ++ Main script file %1 for python job %2 is not readable. ++ @error ++ Python 行程 %2 的主要腳本檔 %1 無法讀取。 + + +- +- Boost.Python error in job "%1" +- @error +- 作業「%1」中的 Boost.Python 錯誤 ++ ++ Boost.Python error in job "%1" ++ @error ++ 作業「%1」中的 Boost.Python 錯誤 + +- +- ++ ++ + Calamares::QmlViewStep + +- +- Loading… +- @status +- 正在載入…… ++ ++ Loading… ++ @status ++ 正在載入…… + + +- +- QML step <i>%1</i>. +- @label +- QML 第 <i>%1</i> 步 ++ ++ QML step <i>%1</i>. ++ @label ++ QML 第 <i>%1</i> 步 + + +- +- Loading failed. +- @info +- 載入失敗。 ++ ++ Loading failed. ++ @info ++ 載入失敗。 + +- +- ++ ++ + Calamares::RequirementsChecker + +- +- Requirements checking for module '%1' is complete. +- @info +- 模組「%1」需求檢查完成。 ++ ++ Requirements checking for module '%1' is complete. ++ @info ++ 模組「%1」需求檢查完成。 + + +- +- Waiting for %n module(s)… +- @status +- +- 正在等待 %n 個模組…… +- ++ ++ Waiting for %n module(s)… ++ @status ++ ++ 正在等待 %n 個模組…… ++ + + +- +- (%n second(s)) +- @status +- +- (%n 秒) +- ++ ++ (%n second(s)) ++ @status ++ ++ (%n 秒) ++ + + +- +- System-requirements checking is complete. +- @info +- 系統需求檢查完成。 ++ ++ System-requirements checking is complete. ++ @info ++ 系統需求檢查完成。 + +- +- ++ ++ + Calamares::ViewManager + +- +- The upload was unsuccessful. No web-paste was done. +- 上傳不成功。並未完成網路張貼。 ++ ++ The upload was unsuccessful. No web-paste was done. ++ 上傳不成功。並未完成網路張貼。 + + +- +- Install log posted to ++ ++ Install log posted to + + %1 + + Link copied to clipboard +- 安裝紀錄檔已張貼到: ++ 安裝紀錄檔已張貼到: + + %1 + + 連結已複製到剪貼簿 + + +- +- Install Log Paste URL +- 安裝紀錄檔張貼 URL ++ ++ Install Log Paste URL ++ 安裝紀錄檔張貼 URL + + +- +- &Yes +- 是(&Y) ++ ++ &Yes ++ 是(&Y) + + +- +- &No +- 否(&N) ++ ++ &No ++ 否(&N) + + +- +- &Close +- 關閉(&C) ++ ++ &Close ++ 關閉(&C) + + +- +- Setup Failed +- @title +- 設定失敗 ++ ++ Setup Failed ++ @title ++ 設定失敗 + + +- +- Installation Failed +- @title +- 安裝失敗 ++ ++ Installation Failed ++ @title ++ 安裝失敗 + + +- +- Error +- @title +- 錯誤 ++ ++ Error ++ @title ++ 錯誤 + + +- +- Calamares Initialization Failed +- @title +- Calamares 初始化失敗 ++ ++ Calamares Initialization Failed ++ @title ++ Calamares 初始化失敗 + + +- +- %1 can not be installed. Calamares was unable to load all of the configured modules. This is a problem with the way Calamares is being used by the distribution. +- @info +- %1 無法安裝。Calamares 無法載入所有已設定的模組。散佈版使用 Calamares 的方式有問題。 ++ ++ %1 can not be installed. Calamares was unable to load all of the configured modules. This is a problem with the way Calamares is being used by the distribution. ++ @info ++ %1 無法安裝。Calamares 無法載入所有已設定的模組。散佈版使用 Calamares 的方式有問題。 + + +- +- <br/>The following modules could not be loaded: +- @info +- <br/>以下的模組無法載入: ++ ++ <br/>The following modules could not be loaded: ++ @info ++ <br/>以下的模組無法載入: + + +- +- Continue with Setup? +- @title +- 繼續安裝? ++ ++ Continue with Setup? ++ @title ++ 繼續安裝? + + +- +- Continue with Installation? +- @title +- 繼續安裝? ++ ++ Continue with Installation? ++ @title ++ 繼續安裝? + + +- +- The %1 setup program is about to make changes to your disk in order to set up %2.<br/><strong>You will not be able to undo these changes.</strong> +- %1 is short product name, %2 is short product name with version +- %1 設定程式將在您的磁碟上做出變更以設定 %2。<br/><strong>您將無法復原這些變更。</strong> ++ ++ The %1 setup program is about to make changes to your disk in order to set up %2.<br/><strong>You will not be able to undo these changes.</strong> ++ %1 is short product name, %2 is short product name with version ++ %1 設定程式將在您的磁碟上做出變更以設定 %2。<br/><strong>您將無法復原這些變更。</strong> + + +- +- The %1 installer is about to make changes to your disk in order to install %2.<br/><strong>You will not be able to undo these changes.</strong> +- %1 is short product name, %2 is short product name with version +- %1 安裝程式將在您的磁碟上做出變更以安裝 %2。<br/><strong>您將無法復原這些變更。</strong> ++ ++ The %1 installer is about to make changes to your disk in order to install %2.<br/><strong>You will not be able to undo these changes.</strong> ++ %1 is short product name, %2 is short product name with version ++ %1 安裝程式將在您的磁碟上做出變更以安裝 %2。<br/><strong>您將無法復原這些變更。</strong> + + +- +- &Set Up Now +- @button +- 立刻進行安裝(&S) ++ ++ &Set Up Now ++ @button ++ 立刻進行安裝(&S) + + +- +- &Install Now +- @button +- 現在安裝(&I) ++ ++ &Install Now ++ @button ++ 現在安裝(&I) + + +- +- Go &Back +- @button +- 上一步(&B) ++ ++ Go &Back ++ @button ++ 上一步(&B) + + +- +- &Set Up +- @button +- 安裝(&S) ++ ++ &Set Up ++ @button ++ 安裝(&S) + + +- +- &Install +- @button +- 安裝(&I) ++ ++ &Install ++ @button ++ 安裝(&I) + + +- +- Setup is complete. Close the setup program. +- @tooltip +- 設定完成。關閉設定程式。 ++ ++ Setup is complete. Close the setup program. ++ @tooltip ++ 設定完成。關閉設定程式。 + + +- +- The installation is complete. Close the installer. +- @tooltip +- 安裝完成。關閉安裝程式。 ++ ++ The installation is complete. Close the installer. ++ @tooltip ++ 安裝完成。關閉安裝程式。 + + +- +- Cancel the setup process without changing the system. +- @tooltip +- 取消安裝流程而不變更系統。 ++ ++ Cancel the setup process without changing the system. ++ @tooltip ++ 取消安裝流程而不變更系統。 + + +- +- Cancel the installation process without changing the system. +- @tooltip +- 取消安裝流程而不變更系統。 ++ ++ Cancel the installation process without changing the system. ++ @tooltip ++ 取消安裝流程而不變更系統。 + + +- +- &Next +- @button +- 下一步 (&N) ++ ++ &Next ++ @button ++ 下一步 (&N) + + +- +- &Back +- @button +- 返回 (&B) ++ ++ &Back ++ @button ++ 返回 (&B) + + +- +- &Done +- @button +- 完成(&D) ++ ++ &Done ++ @button ++ 完成(&D) + + +- +- &Cancel +- @button +- 取消(&C) ++ ++ &Cancel ++ @button ++ 取消(&C) + + +- +- Cancel Setup? +- @title +- 取消安裝? ++ ++ Cancel Setup? ++ @title ++ 取消安裝? + + +- +- Cancel Installation? +- @title +- 取消安裝? ++ ++ Cancel Installation? ++ @title ++ 取消安裝? + + +- +- Do you really want to cancel the current setup process? ++ ++ Do you really want to cancel the current setup process? + The setup program will quit and all changes will be lost. +- 真的想要取消目前的設定程序嗎? ++ 真的想要取消目前的設定程序嗎? + 設定程式將會結束,所有變更都將會遺失。 + + +- +- Do you really want to cancel the current install process? ++ ++ Do you really want to cancel the current installation process? ++The system will reboot or you can enter the debug mode for further investigation. ++ 您確定要退出當前的安裝過程嗎? ++系統將重啟,或者您可以進入調試模式進行進一步的調查。 ++ ++ ++ ++ &Reboot ++ @button ++ 重啟(&R) ++ ++ ++ ++ &Debug ++ @button ++ 調試(&D) ++ ++ ++ Do you really want to cancel the current install process? + The installer will quit and all changes will be lost. +- 您真的想要取消目前的安裝程序嗎? ++ 您真的想要取消目前的安裝程序嗎? + 安裝程式將會退出且所有變動將會遺失。 + +- +- ++ ++ + CalamaresPython::Helper + +- +- Unknown exception type +- @error +- 未知的例外型別 ++ ++ Unknown exception type ++ @error ++ 未知的例外型別 + + +- +- Unparseable Python error +- @error +- 無法解析的 Python 錯誤 ++ ++ Unparseable Python error ++ @error ++ 無法解析的 Python 錯誤 + + +- +- Unparseable Python traceback +- @error +- 無法解析的 Python 回溯紀錄 ++ ++ Unparseable Python traceback ++ @error ++ 無法解析的 Python 回溯紀錄 + + +- +- Unfetchable Python error +- @error +- 無法擷取的 Python 錯誤 ++ ++ Unfetchable Python error ++ @error ++ 無法擷取的 Python 錯誤 + +- +- ++ ++ + CalamaresWindow + +- +- %1 Setup Program +- %1 設定程式 ++ ++ ++ %1 Setup Program ++ %1 設定程式 + + +- +- %1 Installer +- %1 安裝程式 ++ ++ ++ %1 Installer ++ %1 安裝程式 + +- +- ++ ++ + ChangeFilesystemLabelJob + +- +- Set filesystem label on %1 +- @title +- 在 %1 上設定檔案系統標籤 ++ ++ Set filesystem label on %1 ++ @title ++ 在 %1 上設定檔案系統標籤 + + +- +- Set filesystem label <strong>%1</strong> to partition <strong>%2</strong> +- @info +- 設定檔案系統標籤 <strong>%1</strong> 給分割區 <strong>%2</strong> ++ ++ Set filesystem label <strong>%1</strong> to partition <strong>%2</strong> ++ @info ++ 設定檔案系統標籤 <strong>%1</strong> 給分割區 <strong>%2</strong> + + +- +- Setting filesystem label <strong>%1</strong> to partition <strong>%2</strong>… +- @status +- 設定檔案系統標籤 <strong>%1</strong> 給分割區 <strong>%2</strong>…… ++ ++ Setting filesystem label <strong>%1</strong> to partition <strong>%2</strong>… ++ @status ++ 設定檔案系統標籤 <strong>%1</strong> 給分割區 <strong>%2</strong>…… + + +- +- +- The installer failed to update partition table on disk '%1'. +- @info +- 安裝程式在磁碟 '%1' 上更新分割區表格失敗。 ++ ++ ++ The installer failed to update partition table on disk '%1'. ++ @info ++ 安裝程式在磁碟 '%1' 上更新分割區表格失敗。 + +- +- ++ ++ + CheckerContainer + +- +- Gathering system information... +- 收集系統資訊中... ++ ++ Gathering system information... ++ 收集系統資訊中... + +- +- ++ ++ + ChoicePage + +- +- Select storage de&vice: +- @label +- 選取儲存裝置(&V): ++ ++ Select storage de&vice: ++ @label ++ 選取儲存裝置(&V): + + +- +- +- +- +- Current: +- @label +- 目前: ++ ++ ++ ++ ++ Current: ++ @label ++ 目前: + + +- +- After: +- @label +- 之後: ++ ++ After: ++ @label ++ 之後: + + +- +- Reuse %1 as home partition for %2 +- @label +- 重新使用 %1 作為 %2 的家目錄分割區 ++ ++ Reuse %1 as home partition for %2 ++ @label ++ 重新使用 %1 作為 %2 的家目錄分割區 + + +- +- <strong>Select a partition to shrink, then drag the bottom bar to resize</strong> +- <strong>選取要縮減的分割區,然後拖曳底部條狀物來調整大小</strong> ++ ++ <strong>Select a partition to shrink, then drag the bottom bar to resize</strong> ++ <strong>選取要縮減的分割區,然後拖曳底部條狀物來調整大小</strong> + + +- +- %1 will be shrunk to %2MiB and a new %3MiB partition will be created for %4. +- @info, %1 is partition name, %4 is product name +- %1 會縮減到 %2MiB,並且會為 %4 建立新的 %3MiB 分割區。 ++ ++ %1 will be shrunk to %2MiB and a new %3MiB partition will be created for %4. ++ @info, %1 is partition name, %4 is product name ++ %1 會縮減到 %2MiB,並且會為 %4 建立新的 %3MiB 分割區。 + + +- +- <strong>Select a partition to install on</strong> +- @label +- <strong>選取分割區以安裝在其上</strong> ++ ++ <strong>Select a partition to install on</strong> ++ @label ++ <strong>選取分割區以安裝在其上</strong> + + +- +- An EFI system partition cannot be found anywhere on this system. Please go back and use manual partitioning to set up %1. +- @info, %1 is product name +- 在這個系統找不到 EFI 系統分割區。請回到上一步並使用手動分割以設定 %1。 ++ ++ An EFI system partition cannot be found anywhere on this system. Please go back and use manual partitioning to set up %1. ++ @info, %1 is product name ++ 在這個系統找不到 EFI 系統分割區。請回到上一步並使用手動分割以設定 %1。 + + +- +- The EFI system partition at %1 will be used for starting %2. +- @info, %1 is partition path, %2 is product name +- 在 %1 的 EFI 系統分割區將會在開始 %2 時使用。 ++ ++ The EFI system partition at %1 will be used for starting %2. ++ @info, %1 is partition path, %2 is product name ++ 在 %1 的 EFI 系統分割區將會在開始 %2 時使用。 + + +- +- EFI system partition: +- @label +- EFI 系統分割區: ++ ++ EFI system partition: ++ @label ++ EFI 系統分割區: + + +- +- This storage device does not seem to have an operating system on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. +- 這個儲存裝置上似乎還沒有作業系統。您想要怎麼做?<br/>在任何變更套用到儲存裝置上前,您都可以重新檢視並確認您的選擇。 ++ ++ This storage device does not seem to have an operating system on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. ++ 這個儲存裝置上似乎還沒有作業系統。您想要怎麼做?<br/>在任何變更套用到儲存裝置上前,您都可以重新檢視並確認您的選擇。 + + +- +- +- +- +- <strong>Erase disk</strong><br/>This will <font color="red">delete</font> all data currently present on the selected storage device. +- <strong>抹除磁碟</strong><br/>這將會<font color="red">刪除</font>目前選取的儲存裝置所有的資料。 ++ ++ ++ ++ ++ <strong>Automatic partitioning</strong><br/>This will <font color="red">delete</font> all data currently present on the selected storage device. ++ <strong>自動分區</strong><br/>這將會<font color="red">刪除</font>目前選取的儲存裝置所有的資料。 + + +- +- +- +- +- <strong>Install alongside</strong><br/>The installer will shrink a partition to make room for %1. +- <strong>並存安裝</strong><br/>安裝程式會縮小一個分割區,以讓出空間給 %1。 ++ ++ ++ ++ ++ <strong>Install alongside</strong><br/>The installer will shrink a partition to make room for %1. ++ <strong>並存安裝</strong><br/>安裝程式會縮小一個分割區,以讓出空間給 %1。 + + +- +- +- +- +- <strong>Replace a partition</strong><br/>Replaces a partition with %1. +- <strong>取代一個分割區</strong><br/>用 %1 取代一個分割區。 ++ ++ ++ ++ ++ <strong>Replace a partition</strong><br/>Replaces a partition with %1. ++ <strong>取代一個分割區</strong><br/>用 %1 取代一個分割區。 + + +- +- This storage device has %1 on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. +- 這個儲存裝置上已經有 %1 了。您想要怎麼做?<br/>在任何變更套用到儲存裝置上前,您都可以重新檢視並確認您的選擇。 ++ ++ This storage device has %1 on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. ++ 這個儲存裝置上已經有 %1 了。您想要怎麼做?<br/>在任何變更套用到儲存裝置上前,您都可以重新檢視並確認您的選擇。 + + +- +- This storage device already has an operating system on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. +- 這個儲存裝置上已經有一個作業系統了。您想要怎麼做?<br/>在任何變更套用到儲存裝置上前,您都可以重新檢視並確認您的選擇。 ++ ++ This storage device already has an operating system on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. ++ 這個儲存裝置上已經有一個作業系統了。您想要怎麼做?<br/>在任何變更套用到儲存裝置上前,您都可以重新檢視並確認您的選擇。 + + +- +- This storage device has multiple operating systems on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. +- 這個儲存裝置上已經有多個作業系統了。您想要怎麼做?<br/>在任何變更套用到儲存裝置上前,您都可以重新檢視並確認您的選擇。 ++ ++ This storage device has multiple operating systems on it. What would you like to do?<br/>You will be able to review and confirm your choices before any change is made to the storage device. ++ 這個儲存裝置上已經有多個作業系統了。您想要怎麼做?<br/>在任何變更套用到儲存裝置上前,您都可以重新檢視並確認您的選擇。 + + +- +- This storage device already has an operating system on it, but the partition table <strong>%1</strong> is different from the needed <strong>%2</strong>.<br/> +- 此儲存裝置上已有作業系統,但分割表 <strong>%1</strong> 與需要的 <strong>%2</strong> 不同。<br/> ++ ++ This storage device already has an operating system on it, but the partition table <strong>%1</strong> is different from the needed <strong>%2</strong>.<br/> ++ 此儲存裝置上已有作業系統,但分割表 <strong>%1</strong> 與需要的 <strong>%2</strong> 不同。<br/> + + +- +- This storage device has one of its partitions <strong>mounted</strong>. +- @info +- 此裝置<strong>已掛載</strong>其中一個分割區。 ++ ++ This storage device has one of its partitions <strong>mounted</strong>. ++ @info ++ 此裝置<strong>已掛載</strong>其中一個分割區。 + + +- +- This storage device is a part of an <strong>inactive RAID</strong> device. +- @info +- 此儲存裝置是<strong>非作用中 RAID</strong> 裝置的一部份。 ++ ++ This storage device is a part of an <strong>inactive RAID</strong> device. ++ @info ++ 此儲存裝置是<strong>非作用中 RAID</strong> 裝置的一部份。 + + +- +- No swap +- @label +- 無 swap 分割區 ++ ++ No swap ++ @label ++ 無 swap 分割區 + + +- +- Reuse swap +- @label +- 重新使用 swap ++ ++ Reuse swap ++ @label ++ 重新使用 swap + + +- +- Swap (no Hibernate) +- @label +- Swap(沒有冬眠) ++ ++ Swap (no Hibernate) ++ @label ++ Swap(沒有冬眠) + + +- +- Swap (with Hibernate) +- @label +- Swap(有冬眠) ++ ++ Swap (with Hibernate) ++ @label ++ Swap(有冬眠) + + +- +- Swap to file +- @label +- Swap 到檔案 ++ ++ Swap to file ++ @label ++ Swap 到檔案 + + +- +- <strong>Manual partitioning</strong><br/>You can create or resize partitions yourself. +- <strong>手動分割</strong><br/>可以自行建立或重新調整分割區大小。 ++ ++ <strong>Manual partitioning</strong><br/>You can create or resize partitions yourself. ++ <strong>手動分割</strong><br/>可以自行建立或重新調整分割區大小。 + + +- +- Bootloader location: +- @label +- 開機載入程式位置: ++ ++ Bootloader location: ++ @label ++ 開機載入程式位置: + +- +- ++ ++ + ClearMountsJob + +- +- Successfully unmounted %1. +- 成功解除掛載 %1。 ++ ++ Successfully unmounted %1. ++ 成功解除掛載 %1。 + + +- +- Successfully disabled swap %1. +- 成功停用 swap %1。 ++ ++ Successfully disabled swap %1. ++ 成功停用 swap %1。 + + +- +- Successfully cleared swap %1. +- 成功清除 swap %1。 ++ ++ Successfully cleared swap %1. ++ 成功清除 swap %1。 + + +- +- Successfully closed mapper device %1. +- 成功關閉對映裝置 %1。 ++ ++ Successfully closed mapper device %1. ++ 成功關閉對映裝置 %1。 + + +- +- Successfully disabled volume group %1. +- 成功停用捲軸群組 %1。 ++ ++ Successfully disabled volume group %1. ++ 成功停用捲軸群組 %1。 + + +- +- Clear mounts for partitioning operations on %1 +- @title +- 為了準備分割區操作而完全卸載 %1 ++ ++ Clear mounts for partitioning operations on %1 ++ @title ++ 為了準備分割區操作而完全卸載 %1 + + +- +- Clearing mounts for partitioning operations on %1… +- @status +- 正在為了準備分割區操作而完全清除掛載 %1…… ++ ++ Clearing mounts for partitioning operations on %1… ++ @status ++ 正在為了準備分割區操作而完全清除掛載 %1…… + + +- +- Cleared all mounts for %1 +- 已清除所有與 %1 相關的掛載 ++ ++ Cleared all mounts for %1 ++ 已清除所有與 %1 相關的掛載 + +- +- ++ ++ + ClearTempMountsJob + +- +- +- Clearing all temporary mounts… +- @status +- 正在清除所有臨時掛載…… ++ ++ ++ Clearing all temporary mounts… ++ @status ++ 正在清除所有臨時掛載…… + + +- +- Cleared all temporary mounts. +- 已清除所有暫時掛載。 ++ ++ Cleared all temporary mounts. ++ 已清除所有暫時掛載。 + +- +- ++ ++ + CommandList + +- +- Could not run command. +- 無法執行指令。 ++ ++ Could not run command. ++ 無法執行指令。 + + +- +- The commands use variables that are not defined. Missing variables are: %1. +- 這些指令使用了未定義的變數。缺少的變數為:%1。 ++ ++ The commands use variables that are not defined. Missing variables are: %1. ++ 這些指令使用了未定義的變數。缺少的變數為:%1。 + +- +- ++ ++ + Config + +- +- Setup Failed +- @title +- 設定失敗 ++ ++ Setup Failed ++ @title ++ 設定失敗 ++ ++ ++ ++ Installation Failed ++ @title ++ 安裝失敗 ++ ++ ++ ++ The setup of %1 did not complete successfully. ++ @info ++ %1 的設定並未成功完成。 + + +- +- Installation Failed +- @title +- 安裝失敗 ++ ++ The installation of %1 did not complete successfully. ++ @info ++ %1 的安裝並未成功完成。 + + +- +- The setup of %1 did not complete successfully. +- @info +- %1 的設定並未成功完成。 ++ ++ Setup Complete ++ @title ++ 設定完成 + + +- +- The installation of %1 did not complete successfully. +- @info +- %1 的安裝並未成功完成。 ++ ++ Installation Complete ++ @title ++ 安裝完成 + + +- +- Setup Complete +- @title +- 設定完成 ++ ++ The setup of %1 is complete. ++ @info ++ %1 的設定完成。 + + +- +- Installation Complete +- @title +- 安裝完成 ++ ++ The installation of %1 is complete. ++ @info ++ %1 的安裝已完成。 + + +- +- The setup of %1 is complete. +- @info +- %1 的設定完成。 ++ ++ Keyboard model has been set to %1<br/>. ++ @label, %1 is keyboard model, as in Apple Magic Keyboard ++ 鍵盤型號已設定為 %1<br/>。 + + +- +- The installation of %1 is complete. +- @info +- %1 的安裝已完成。 ++ ++ Keyboard layout has been set to %1/%2. ++ @label, %1 is layout, %2 is layout variant ++ 鍵盤佈局已設定為 %1/%2。 + + +- +- Keyboard model has been set to %1<br/>. +- @label, %1 is keyboard model, as in Apple Magic Keyboard +- 鍵盤型號已設定為 %1<br/>。 ++ ++ Set timezone to %1/%2 ++ @action ++ 設定時區為 %1/%2 + + +- +- Keyboard layout has been set to %1/%2. +- @label, %1 is layout, %2 is layout variant +- 鍵盤佈局已設定為 %1/%2。 ++ ++ The system language will be set to %1. ++ @info ++ 系統語言會設定為 %1。 + + +- +- Set timezone to %1/%2 +- @action +- 設定時區為 %1/%2 ++ ++ The numbers and dates locale will be set to %1. ++ @info ++ 數字與日期格式會設定為 %1。 + + +- +- The system language will be set to %1. +- @info +- 系統語言會設定為%1。 ++ ++ The timezone will be set to %1. ++ @info ++ 設定時區為 %1。 + + +- +- The numbers and dates locale will be set to %1. +- @info +- 數字與日期語系會設定為%1。 ++ The timezone whill be set to %1. ++ @info ++ 設定時區為 %1。 + + +- +- Network Installation. (Disabled: Incorrect configuration) +- 網路安裝。(已停用:設定不正確) ++ ++ Network Installation. (Disabled: Incorrect configuration) ++ 網路安裝。(已停用:設定不正確) + + +- +- Network Installation. (Disabled: Received invalid groups data) +- 網路安裝。(已停用:收到無效的群組資料) ++ ++ Network Installation. (Disabled: Received invalid groups data) ++ 網路安裝。(已停用:收到無效的群組資料) + + +- +- Network Installation. (Disabled: Internal error) +- 網路安裝。(已停用:內部錯誤) ++ ++ Network Installation. (Disabled: Internal error) ++ 網路安裝。(已停用:內部錯誤) + + +- +- Network Installation. (Disabled: Unable to fetch package lists, check your network connection) +- 網路安裝。(已停用:無法擷取軟體包清單,請檢查您的網路連線) ++ ++ Network Installation. (Disabled: Unable to fetch package lists, check your network connection) ++ 網路安裝。(已停用:無法擷取軟體包清單,請檢查您的網路連線) + + +- +- Network Installation. (Disabled: No package list) +- 網路安裝。(已停用:無軟體包清單) ++ ++ Network Installation. (Disabled: No package list) ++ 網路安裝。(已停用:無軟體包清單) + + +- +- Package selection +- 軟體包選擇 ++ ++ Package selection ++ 軟體包選擇 + + +- +- Package Selection +- 軟體包選擇 ++ ++ Package Selection ++ 軟體包選擇 + + +- +- Please pick a product from the list. The selected product will be installed. +- 請從清單中挑選產品。將會安裝選定的產品。 ++ ++ Please pick a product from the list. The selected product will be installed. ++ 請從清單中挑選產品。將會安裝選定的產品。 + + +- +- Packages +- 軟體包 ++ ++ Packages ++ 軟體包 + + +- +- Install option: <strong>%1</strong> +- 安裝選項:<strong>%1</strong> ++ ++ Install option: <strong>%1</strong> ++ 安裝選項:<strong>%1</strong> + + +- +- None +- ++ ++ None ++ + + +- +- Summary +- @label +- 總覽 ++ ++ Summary ++ @label ++ 總覽 + + +- +- This is an overview of what will happen once you start the setup procedure. +- 這是開始安裝後所會發生的事的概覽。 ++ ++ This is an overview of what will happen once you start the setup procedure. ++ 這是開始安裝後所會發生的事的概覽。 + + +- +- This is an overview of what will happen once you start the install procedure. +- 這是您開始安裝後所會發生的事的概覽。 ++ ++ This is an overview of what will happen once you start the install procedure. ++ 這是您開始安裝後所會發生的事的概覽。 + + +- +- Your username is too long. +- 您的使用者名稱太長了。 ++ ++ Your username is too long. ++ 您的使用者名稱太長了。 + + +- +- Your username must start with a lowercase letter or underscore. +- 您的使用者名稱必須以小寫字母或底線開頭。 ++ ++ Your username must start with a lowercase letter or underscore. ++ 您的使用者名稱必須以小寫字母或底線開頭。 + + +- +- Only lowercase letters, numbers, underscore and hyphen are allowed. +- 僅允許小寫字母、數字、底線與連接號。 ++ ++ Only lowercase letters, numbers, underscore and hyphen are allowed. ++ 僅允許小寫字母、數字、底線與連接號。 + + +- +- '%1' is not allowed as username. +- 「%1」無法作為使用者名稱。 ++ ++ '%1' is not allowed as username. ++ 「%1」無法作為使用者名稱。 + + +- +- Your hostname is too short. +- 您的主機名稱太短了。 ++ ++ Your hostname is too short. ++ 您的主機名稱太短了。 + + +- +- Your hostname is too long. +- 您的主機名稱太長了。 ++ ++ Your hostname is too long. ++ 您的主機名稱太長了。 + + +- +- '%1' is not allowed as hostname. +- 「%1」無法作為主機名稱。 ++ ++ '%1' is not allowed as hostname. ++ 「%1」無法作為主機名稱。 + + +- +- Only letters, numbers, underscore and hyphen are allowed. +- 僅允許字母、數字、底線與連接號。 ++ ++ Only letters, numbers, underscore and hyphen are allowed. ++ 僅允許字母、數字、底線與連接號。 + + +- +- Your passwords do not match! +- 密碼不符! ++ ++ Your passwords do not match! ++ 密碼不符! + + +- +- OK! +- 確定! ++ ++ OK! ++ 確定! + + +- +- This computer does not satisfy the minimum requirements for setting up %1.<br/>Setup cannot continue. +- 此電腦未滿足安裝 %1 的最低配備。<br/>安裝無法繼續。 ++ ++ This computer does not satisfy the minimum requirements for setting up %1.<br/>Setup cannot continue. ++ 此電腦未滿足安裝 %1 的最低配備。<br/>安裝無法繼續。 + + +- +- This computer does not satisfy the minimum requirements for installing %1.<br/>Installation cannot continue. +- 此電腦未滿足安裝 %1 的最低配備。<br/>安裝無法繼續。 ++ ++ This computer does not satisfy the minimum requirements for installing %1.<br/>Installation cannot continue. ++ 此電腦未滿足安裝 %1 的最低配備。<br/>安裝無法繼續。 + + +- +- This computer does not satisfy some of the recommended requirements for setting up %1.<br/>Setup can continue, but some features might be disabled. +- 此電腦未滿足一些安裝 %1 的推薦需求。<br/>設定可以繼續,但部份功能可能會被停用。 ++ ++ This computer does not satisfy some of the recommended requirements for setting up %1.<br/>Setup can continue, but some features might be disabled. ++ 此電腦未滿足一些安裝 %1 的推薦需求。<br/>設定可以繼續,但部份功能可能會被停用。 + + +- +- This computer does not satisfy some of the recommended requirements for installing %1.<br/>Installation can continue, but some features might be disabled. +- 此電腦未滿足一些安裝 %1 的推薦需求。<br/>安裝可以繼續,但部份功能可能會被停用。 ++ ++ This computer does not satisfy some of the recommended requirements for installing %1.<br/>Installation can continue, but some features might be disabled. ++ 此電腦未滿足一些安裝 %1 的推薦需求。<br/>安裝可以繼續,但部份功能可能會被停用。 + + +- +- This program will ask you some questions and set up %2 on your computer. +- 本程式會問您一些問題,然後在您的電腦安裝及設定 %2。 ++ This program will ask you some questions and set up %2 on your computer. ++ 本程式會問您一些問題,然後在您的電腦安裝及設定 %2。 + + +- +- <h1>Welcome to the Calamares setup program for %1</h1> +- <h1>歡迎使用 %1 的 Calamares 安裝程式</h1> ++ ++ <h1>Welcome to the Calamares setup program for %1</h1> ++ <h1>歡迎使用 %1 的 Calamares 安裝程式</h1> + + +- +- <h1>Welcome to %1 setup</h1> +- <h1>歡迎使用 %1 安裝程式</h1> ++ ++ <h1>Welcome to %1 setup</h1> ++ <h1>歡迎使用 %1 安裝程式</h1> + + +- +- <h1>Welcome to the Calamares installer for %1</h1> +- <h1>歡迎使用 %1 的 Calamares 安裝程式</h1> ++ ++ <h1>Welcome to the Calamares installer for %1</h1> ++ <h1>歡迎使用 %1 的 Calamares 安裝程式</h1> + + +- +- <h1>Welcome to the %1 installer</h1> +- <h1>歡迎使用 %1 安裝程式</h1> ++ ++ <h1>Welcome to the %1 installer</h1> ++ <h1>歡迎使用 %1 安裝程式</h1> + +- +- ++ ++ + ContextualProcessJob + +- +- Performing contextual processes' job… +- @status +- 正在執行情境流程任務…… ++ ++ Performing contextual processes' job… ++ @status ++ 正在執行情境流程任務…… + +- +- ++ ++ + CreatePartitionDialog + +- +- Create a Partition +- 建立一個分割區 ++ ++ Create a Partition ++ 建立一個分割區 + + +- +- Si&ze: +- 容量大小 (&z) : ++ ++ Si&ze: ++ 容量大小 (&z) : + + +- +- MiB +- MiB ++ ++ MiB ++ MiB + + +- +- Partition &Type: +- 分割區與類型 (&T): ++ ++ Partition &Type: ++ 分割區與類型 (&T): + + +- +- Primar&y +- 基本(&Y) ++ ++ Primar&y ++ 基本(&Y) + + +- +- E&xtended +- 延伸分割區 (&x) ++ ++ E&xtended ++ 延伸分割區 (&x) + + +- +- Fi&le System: +- 檔案系統 (&I): ++ ++ Fi&le System: ++ 檔案系統 (&I): + + +- +- LVM LV name +- LVM LV 名稱 ++ ++ LVM LV name ++ LVM LV 名稱 + + +- +- &Mount Point: +- 掛載點 (&M): ++ ++ &Mount Point: ++ 掛載點 (&M): + + +- +- Flags: +- 旗標: ++ ++ Flags: ++ 旗標: + + +- +- Label for the filesystem +- 檔案系統標籤 ++ ++ Label for the filesystem ++ 檔案系統標籤 + + +- +- FS Label: +- 檔案系統標籤: ++ ++ FS Label: ++ 檔案系統標籤: + + +- +- En&crypt +- @action +- 加密(&C) ++ ++ En&crypt ++ @action ++ 加密(&C) + + +- +- Logical +- @label +- 邏輯分割區 ++ ++ Logical ++ @label ++ 邏輯分割區 + + +- +- Primary +- @label +- 主要分割區 ++ ++ Primary ++ @label ++ 主要分割區 + + +- +- GPT +- @label +- GPT ++ ++ GPT ++ @label ++ GPT + + +- +- Mountpoint already in use. Please select another one. +- @info +- 掛載點使用中。請選擇其他的。 ++ ++ Mountpoint already in use. Please select another one. ++ @info ++ 掛載點使用中。請選擇其他的。 + + +- +- Mountpoint must start with a <tt>/</tt>. +- @info +- 掛載點必須以 <tt>/</tt> 開頭。 ++ ++ Mountpoint must start with a <tt>/</tt>. ++ @info ++ 掛載點必須以 <tt>/</tt> 開頭。 + +- +- ++ ++ + CreatePartitionJob + +- +- Create new %1MiB partition on %3 (%2) with entries %4 +- @title +- 在 %3 (%2) 上使用項目 %4 建立新的 %1MiB 分割區 ++ ++ Create new %1MiB partition on %3 (%2) with entries %4 ++ @title ++ 在 %3 (%2) 上使用項目 %4 建立新的 %1MiB 分割區 + + +- +- Create new %1MiB partition on %3 (%2) +- @title +- 在 %3 (%2) 上建立新的 %1MiB 分割區 ++ ++ Create new %1MiB partition on %3 (%2) ++ @title ++ 在 %3 (%2) 上建立新的 %1MiB 分割區 + + +- +- Create new %2MiB partition on %4 (%3) with file system %1 +- @title +- 使用檔案系統 %1 在 %4 (%3) 建立新的 %2MiB 分割區 ++ ++ Create new %2MiB partition on %4 (%3) with file system %1 ++ @title ++ 使用檔案系統 %1 在 %4 (%3) 建立新的 %2MiB 分割區 + + +- +- Create new <strong>%1MiB</strong> partition on <strong>%3</strong> (%2) with entries <em>%4</em> +- @info +- 在 <strong>%3</strong> (%2) 上使用項目 <em>%4</em> 建立新的 <strong>%1MiB</strong> 分割區 ++ ++ Create new <strong>%1MiB</strong> partition on <strong>%3</strong> (%2) with entries <em>%4</em> ++ @info ++ 在 <strong>%3</strong> (%2) 上使用項目 <em>%4</em> 建立新的 <strong>%1MiB</strong> 分割區 + + +- +- Create new <strong>%1MiB</strong> partition on <strong>%3</strong> (%2) +- @info +- 在 <strong>%3</strong> (%2) 上建立新的 <strong>%1MiB</strong> 分割區 ++ ++ Create new <strong>%1MiB</strong> partition on <strong>%3</strong> (%2) ++ @info ++ 在 <strong>%3</strong> (%2) 上建立新的 <strong>%1MiB</strong> 分割區 + + +- +- Create new <strong>%2MiB</strong> partition on <strong>%4</strong> (%3) with file system <strong>%1</strong> +- @info +- 使用檔案系統 <strong>%1</strong> 在 <strong>%4</strong> (%3) 建立新的 <strong>%2MiB</strong> 分割區 ++ ++ Create new <strong>%2MiB</strong> partition on <strong>%4</strong> (%3) with file system <strong>%1</strong> ++ @info ++ 使用檔案系統 <strong>%1</strong> 在 <strong>%4</strong> (%3) 建立新的 <strong>%2MiB</strong> 分割區 + + +- +- +- Creating new %1 partition on %2… +- @status +- 正在於 %2 建立新的 %1 分割區…… ++ ++ ++ Creating new %1 partition on %2… ++ @status ++ 正在於 %2 建立新的 %1 分割區…… + + +- +- The installer failed to create partition on disk '%1'. +- @info +- 安裝程式在磁碟 '%1' 上建立分割區失敗。 ++ ++ The installer failed to create partition on disk '%1'. ++ @info ++ 安裝程式在磁碟 '%1' 上建立分割區失敗。 + +- +- ++ ++ + CreatePartitionTableDialog + +- +- Create Partition Table +- 建立分割區表格 ++ ++ Create Partition Table ++ 建立分割區表格 + + +- +- Creating a new partition table will delete all existing data on the disk. +- 新增一個分割區表格將會刪除硬碟上所有已存在的資料 ++ ++ Creating a new partition table will delete all existing data on the disk. ++ 新增一個分割區表格將會刪除硬碟上所有已存在的資料 + + +- +- What kind of partition table do you want to create? +- 您想要建立哪一種分割區表格? ++ ++ What kind of partition table do you want to create? ++ 您想要建立哪一種分割區表格? + + +- +- Master Boot Record (MBR) +- 主要開機紀錄 (MBR) ++ ++ Master Boot Record (MBR) ++ 主要開機紀錄 (MBR) + + +- +- GUID Partition Table (GPT) +- GUID 分割區表格 (GPT) ++ ++ GUID Partition Table (GPT) ++ GUID 分割區表格 (GPT) + +- +- ++ ++ + CreatePartitionTableJob + +- +- +- Creating new %1 partition table on %2… +- @status +- 正在於 %2 建立新的 %1 分割表…… ++ ++ ++ Creating new %1 partition table on %2… ++ @status ++ 正在於 %2 建立新的 %1 分割表…… + + +- +- Creating new <strong>%1</strong> partition table on <strong>%2</strong> (%3)… +- @status +- 正在 <strong>%2</strong> (%3) 上建立新的 <strong>%1</strong> 分割表…… ++ ++ Creating new <strong>%1</strong> partition table on <strong>%2</strong> (%3)… ++ @status ++ 正在 <strong>%2</strong> (%3) 上建立新的 <strong>%1</strong> 分割表…… + + +- +- The installer failed to create a partition table on %1. +- 安裝程式在 %1 上建立分割區表格失敗。 ++ ++ The installer failed to create a partition table on %1. ++ 安裝程式在 %1 上建立分割區表格失敗。 + +- +- ++ ++ + CreateUserJob + +- +- Create user %1 +- 建立使用者 %1 ++ ++ Create user %1 ++ 建立使用者 %1 + + +- +- Create user <strong>%1</strong> +- 建立使用者 <strong>%1</strong> ++ ++ Create user <strong>%1</strong> ++ 建立使用者 <strong>%1</strong> + + +- +- +- Creating user %1… +- @status +- 正在建立使用者 %1…… ++ ++ ++ Creating user %1… ++ @status ++ 正在建立使用者 %1…… + + +- +- Preserving home directory… +- @status +- 保留家目錄…… ++ ++ Preserving home directory… ++ @status ++ 保留家目錄…… + + +- +- Configuring user %1 +- @status +- 正在設定使用者 %1 ++ ++ Configuring user %1 ++ @status ++ 正在設定使用者 %1 + + +- +- Setting file permissions… +- @status +- 正在設定檔案權限…… ++ ++ Setting file permissions… ++ @status ++ 正在設定檔案權限…… + +- +- ++ ++ + CreateVolumeGroupDialog + +- +- Create Volume Group +- @title +- 建立卷冊群組 ++ ++ Create Volume Group ++ @title ++ 建立卷冊群組 + +- +- ++ ++ + CreateVolumeGroupJob + +- +- +- Creating new volume group named %1… +- @status +- 正在建立名為 %1 的新卷冊群組…… ++ ++ ++ Creating new volume group named %1… ++ @status ++ 正在建立名為 %1 的新卷冊群組…… + + +- +- Creating new volume group named <strong>%1</strong>… +- @status +- 正在建立名為 <strong>%1</strong> 的新卷冊群組…… ++ ++ Creating new volume group named <strong>%1</strong>… ++ @status ++ 正在建立名為 <strong>%1</strong> 的新卷冊群組…… + + +- +- The installer failed to create a volume group named '%1'. +- 安裝程式建立名為「%1」的新卷冊群組失敗。 ++ ++ The installer failed to create a volume group named '%1'. ++ 安裝程式建立名為「%1」的新卷冊群組失敗。 + +- +- ++ ++ + DeactivateVolumeGroupJob + +- +- +- Deactivating volume group named %1… +- @status +- 正在停用名為 %1 的新卷冊群組…… ++ ++ ++ Deactivating volume group named %1… ++ @status ++ 正在停用名為 %1 的新卷冊群組…… + + +- +- Deactivating volume group named <strong>%1</strong>… +- @status +- 正在停用名為 <strong>%1</strong> 的新卷冊群組…… ++ ++ Deactivating volume group named <strong>%1</strong>… ++ @status ++ 正在停用名為 <strong>%1</strong> 的新卷冊群組…… + + +- +- The installer failed to deactivate a volume group named %1. +- 安裝程式停用名為「%1」的新卷冊群組失敗。 ++ ++ The installer failed to deactivate a volume group named %1. ++ 安裝程式停用名為「%1」的新卷冊群組失敗。 + +- +- ++ ++ + DeletePartitionJob + +- +- +- Deleting partition %1… +- @status +- 正在刪除分割區 %1…… ++ ++ ++ Deleting partition %1… ++ @status ++ 正在刪除分割區 %1…… + + +- +- Deleting partition <strong>%1</strong>… +- @status +- 正在刪除分割區 <strong>%1</strong>…… ++ ++ Deleting partition <strong>%1</strong>… ++ @status ++ 正在刪除分割區 <strong>%1</strong>…… + + +- +- The installer failed to delete partition %1. +- 安裝程式刪除分割區 %1 失敗。 ++ ++ The installer failed to delete partition %1. ++ 安裝程式刪除分割區 %1 失敗。 + +- +- ++ ++ + DeviceInfoWidget + +- +- <br><br>This partition table type is only advisable on older systems which start from a <strong>BIOS</strong> boot environment. GPT is recommended in most other cases.<br><br><strong>Warning:</strong> the MBR partition table is an obsolete MS-DOS era standard.<br>Only 4 <em>primary</em> partitions may be created, and of those 4, one can be an <em>extended</em> partition, which may in turn contain many <em>logical</em> partitions. +- <br><br>建議這個分割表類型只在以 <strong>BIOS</strong> 開機的舊系統使用。其他大多數情況建議使用 GPT。<br><strong>警告:</strong>MBR 分割表是已過時、源自 MS-DOS 時代的標準。<br>最多只能建立 4 個<em>主要</em>分割區;其中一個可以是<em>延伸</em>分割區,其可以包含許多<em>邏輯</em>分割區。 ++ ++ <br><br>This partition table type is only advisable on older systems which start from a <strong>BIOS</strong> boot environment. GPT is recommended in most other cases.<br><br><strong>Warning:</strong> the MBR partition table is an obsolete MS-DOS era standard.<br>Only 4 <em>primary</em> partitions may be created, and of those 4, one can be an <em>extended</em> partition, which may in turn contain many <em>logical</em> partitions. ++ <br><br>建議這個分割表類型只在以 <strong>BIOS</strong> 開機的舊系統使用。其他大多數情況建議使用 GPT。<br><strong>警告:</strong>MBR 分割表是已過時、源自 MS-DOS 時代的標準。<br>最多只能建立 4 個<em>主要</em>分割區;其中一個可以是<em>延伸</em>分割區,其可以包含許多<em>邏輯</em>分割區。 + + +- +- <br><br>This is the recommended partition table type for modern systems which start from an <strong>EFI</strong> boot environment. +- <br><br>這是對 <strong>EFI</strong> 開機環境而言的現代系統建議分割表類型。 ++ ++ <br><br>This is the recommended partition table type for modern systems which start from an <strong>EFI</strong> boot environment. ++ <br><br>這是對 <strong>EFI</strong> 開機環境而言的現代系統建議分割表類型。 + + +- +- This is a <strong>loop</strong> device.<br><br>It is a pseudo-device with no partition table that makes a file accessible as a block device. This kind of setup usually only contains a single filesystem. +- 這是一個 <strong>迴圈</strong> 裝置。<br><br>它是一個沒有分割表,但讓檔案可以被像塊裝置一樣存取的偽裝置。此種設定通常只包含一個單一的檔案系統。 ++ ++ This is a <strong>loop</strong> device.<br><br>It is a pseudo-device with no partition table that makes a file accessible as a block device. This kind of setup usually only contains a single filesystem. ++ 這是一個 <strong>迴圈</strong> 裝置。<br><br>它是一個沒有分割表,但讓檔案可以被像塊裝置一樣存取的偽裝置。此種設定通常只包含一個單一的檔案系統。 + + +- +- This installer <strong>cannot detect a partition table</strong> on the selected storage device.<br><br>The device either has no partition table, or the partition table is corrupted or of an unknown type.<br>This installer can create a new partition table for you, either automatically, or through the manual partitioning page. +- 本安裝程式在選定的儲存裝置上<strong>偵測不到分割表</strong>。<br><br>此裝置要不是沒有分割表,就是其分割表已毀損又或者是一個未知類型的分割表。<br>本安裝程式將會為您建立一個新的分割表,不論是自動或是透過手動分割頁面。 ++ ++ This installer <strong>cannot detect a partition table</strong> on the selected storage device.<br><br>The device either has no partition table, or the partition table is corrupted or of an unknown type.<br>This installer can create a new partition table for you, either automatically, or through the manual partitioning page. ++ 本安裝程式在選定的儲存裝置上<strong>偵測不到分割表</strong>。<br><br>此裝置要不是沒有分割表,就是其分割表已毀損又或者是一個未知類型的分割表。<br>本安裝程式將會為您建立一個新的分割表,不論是自動或是透過手動分割頁面。 + + +- +- This device has a <strong>%1</strong> partition table. +- 此裝置已有 <strong>%1</strong> 分割表。 ++ ++ This device has a <strong>%1</strong> partition table. ++ 此裝置已有 <strong>%1</strong> 分割表。 + + +- +- The type of <strong>partition table</strong> on the selected storage device.<br><br>The only way to change the partition table type is to erase and recreate the partition table from scratch, which destroys all data on the storage device.<br>This installer will keep the current partition table unless you explicitly choose otherwise.<br>If unsure, on modern systems GPT is preferred. +- 選定的儲存裝置的<strong>分割表</strong>類型。<br><br>變更分割表的唯一方法,就是抹除再重新從頭建立分割表,這會破壞在該儲存裝置所有的資料。<br>除非特別選擇,否則本安裝程式會保留目前的分割表。<br>若不確定,現時的系統建議使用 GPT。 ++ ++ The type of <strong>partition table</strong> on the selected storage device.<br><br>The only way to change the partition table type is to erase and recreate the partition table from scratch, which destroys all data on the storage device.<br>This installer will keep the current partition table unless you explicitly choose otherwise.<br>If unsure, on modern systems GPT is preferred. ++ 選定的儲存裝置的<strong>分割表</strong>類型。<br><br>變更分割表的唯一方法,就是抹除再重新從頭建立分割表,這會破壞在該儲存裝置所有的資料。<br>除非特別選擇,否則本安裝程式會保留目前的分割表。<br>若不確定,現時的系統建議使用 GPT。 + +- +- ++ ++ + DeviceModel + +- +- %1 - %2 (%3) +- device[name] - size[number] (device-node[name]) +- %1 - %2 (%3) ++ ++ %1 - %2 (%3) ++ device[name] - size[number] (device-node[name]) ++ %1 - %2 (%3) + + +- +- %1 - (%2) +- device[name] - (device-node[name]) +- %1 - (%2) ++ ++ %1 - (%2) ++ device[name] - (device-node[name]) ++ %1 - (%2) + +- +- ++ ++ + DracutLuksCfgJob + +- +- Writing LUKS configuration for Dracut to %1… +- @status +- 正為 Dracut 寫入 LUKS 設定到 %1…… ++ ++ Writing LUKS configuration for Dracut to %1… ++ @status ++ 正為 Dracut 寫入 LUKS 設定到 %1…… + + +- +- Skipping writing LUKS configuration for Dracut: "/" partition is not encrypted +- @info +- 正在跳過為 Dracut 寫入 LUKS 設定:"/" 分割區未加密 ++ ++ Skipping writing LUKS configuration for Dracut: "/" partition is not encrypted ++ @info ++ 正在跳過為 Dracut 寫入 LUKS 設定:"/" 分割區未加密 + + +- +- Failed to open %1 +- @error +- 開啟 %1 失敗 ++ ++ Failed to open %1 ++ @error ++ 開啟 %1 失敗 + +- +- ++ ++ + DummyCppJob + +- +- Performing dummy C++ job… +- @status +- 正在執行虛擬 C++ 任務…… ++ ++ Performing dummy C++ job… ++ @status ++ 正在執行虛擬 C++ 任務…… + +- +- ++ ++ + EditExistingPartitionDialog + +- +- Edit Existing Partition +- 編輯已經存在的分割區 ++ ++ Edit Existing Partition ++ 編輯已經存在的分割區 + + +- +- Con&tent: +- 內容:(&T) ++ ++ Con&tent: ++ 內容:(&T) + + +- +- &Keep +- 保留(&K) ++ ++ &Keep ++ 保留(&K) + + +- +- Format +- 格式化 ++ ++ Format ++ 格式化 + + +- +- Warning: Formatting the partition will erase all existing data. +- 警告:格式化該分割區換抹除所有已存在的資料。 ++ ++ Warning: Formatting the partition will erase all existing data. ++ 警告:格式化該分割區換抹除所有已存在的資料。 + + +- +- &Mount Point: +- 掛載點 (&M): ++ ++ &Mount Point: ++ 掛載點 (&M): + + +- +- Si&ze: +- 容量大小 (&Z) : ++ ++ Si&ze: ++ 容量大小 (&Z) : + + +- +- MiB +- MiB ++ ++ MiB ++ MiB + + +- +- Fi&le System: +- 檔案系統 (&I): ++ ++ Fi&le System: ++ 檔案系統 (&I): + + +- +- Flags: +- 旗標: ++ ++ Flags: ++ 旗標: + + +- +- Label for the filesystem +- 檔案系統標籤 ++ ++ Label for the filesystem ++ 檔案系統標籤 + + +- +- FS Label: +- 檔案系統標籤: ++ ++ FS Label: ++ 檔案系統標籤: + + +- +- Passphrase for existing partition +- 既有分割區的密碼 ++ ++ Passphrase for existing partition ++ 既有分割區的密碼 + + +- +- Partition %1 could not be decrypted with the given passphrase.<br/><br/>Edit the partition again and give the correct passphrase or delete and create a new encrypted partition. +- 分割區 %1 無法使用給予的密碼解密。<br/><br/>再次編輯分割區並給予正確的密碼或刪除並建立新的加密分割區。 ++ ++ Partition %1 could not be decrypted with the given passphrase.<br/><br/>Edit the partition again and give the correct passphrase or delete and create a new encrypted partition. ++ 分割區 %1 無法使用給予的密碼解密。<br/><br/>再次編輯分割區並給予正確的密碼或刪除並建立新的加密分割區。 + +- +- ++ ++ + EncryptWidget + +- +- En&crypt system +- 加密系統(&C) ++ ++ En&crypt system ++ 加密系統(&C) + + +- +- Your system does not seem to support encryption well enough to encrypt the entire system. You may enable encryption, but performance may suffer. +- 您的系統對加密的支援似乎不夠好,無法加密整個系統。您可以啟用加密,但效能可能會受到影響。 ++ ++ Your system does not seem to support encryption well enough to encrypt the entire system. You may enable encryption, but performance may suffer. ++ 您的系統對加密的支援似乎不夠好,無法加密整個系統。您可以啟用加密,但效能可能會受到影響。 + + +- +- Passphrase +- 通關密語 ++ ++ Passphrase ++ 通關密語 + + +- +- Confirm passphrase +- 確認通關密語 ++ ++ Confirm passphrase ++ 確認通關密語 + + +- +- +- Please enter the same passphrase in both boxes. +- @tooltip +- 請在兩個框框中輸入相同的通關密語。 ++ ++ ++ Please enter the same passphrase in both boxes. ++ @tooltip ++ 請在兩個框框中輸入相同的通關密語。 + + +- +- Password must be a minimum of %1 characters. +- @tooltip +- 密碼最少必須 %1 個字元。 ++ ++ Password must be a minimum of %1 characters. ++ @tooltip ++ 密碼最少必須 %1 個字元。 + +- +- ++ ++ + ErrorDialog + +- +- Details: +- 詳細資訊: ++ ++ Details: ++ 詳細資訊: + + +- +- Would you like to paste the install log to the web? +- 想要將安裝紀錄檔貼到網路上嗎? ++ ++ Would you like to paste the install log to the web? ++ 想要將安裝紀錄檔貼到網路上嗎? + +- +- ++ ++ + FillGlobalStorageJob + +- +- Set partition information +- @title +- 設定分割區資訊 ++ ++ Set partition information ++ @title ++ 設定分割區資訊 + + +- +- Install %1 on <strong>new</strong> %2 system partition with features <em>%3</em> +- @info +- 在有 <em>%3</em> 功能的<strong>新</strong> %2 系統分割區上安裝 %1 ++ ++ Install %1 on <strong>new</strong> %2 system partition with features <em>%3</em> ++ @info ++ 在有 <em>%3</em> 功能的<strong>新</strong> %2 系統分割區上安裝 %1 + + +- +- Install %1 on <strong>new</strong> %2 system partition +- @info +- 在 <strong>新的</strong>系統分割區 %2 上安裝 %1 ++ ++ Install %1 on <strong>new</strong> %2 system partition ++ @info ++ 在 <strong>新的</strong>系統分割區 %2 上安裝 %1 + + +- +- Set up <strong>new</strong> %2 partition with mount point <strong>%1</strong> and features <em>%3</em> +- @info +- 設定有掛載點 <strong>%1</strong> 與 <em>%3</em> 的<strong>新</strong> %2 分割區 ++ ++ Set up <strong>new</strong> %2 partition with mount point <strong>%1</strong> and features <em>%3</em> ++ @info ++ 設定有掛載點 <strong>%1</strong> 與 <em>%3</em> 的<strong>新</strong> %2 分割區 + + +- +- Set up <strong>new</strong> %2 partition with mount point <strong>%1</strong>%3 +- @info +- 設定有掛載點 <strong>%1</strong> %3 的<strong>新</strong> %2 分割區 ++ ++ Set up <strong>new</strong> %2 partition with mount point <strong>%1</strong>%3 ++ @info ++ 設定有掛載點 <strong>%1</strong> %3 的<strong>新</strong> %2 分割區 + + +- +- Install %2 on %3 system partition <strong>%1</strong> with features <em>%4</em> +- @info +- 在有功能 <em>%4</em> 的 %3 系統分割區 <strong>%1</strong> 上安裝 %2 ++ ++ Install %2 on %3 system partition <strong>%1</strong> with features <em>%4</em> ++ @info ++ 在有功能 <em>%4</em> 的 %3 系統分割區 <strong>%1</strong> 上安裝 %2 + + +- +- Install %2 on %3 system partition <strong>%1</strong> +- @info +- 在 %3 系統分割區 <strong>%1</strong> 上安裝 %2 ++ ++ Install %2 on %3 system partition <strong>%1</strong> ++ @info ++ 在 %3 系統分割區 <strong>%1</strong> 上安裝 %2 + + +- +- Set up %3 partition <strong>%1</strong> with mount point <strong>%2</strong> and features <em>%4</em> +- @info +- 為分割區 %3 <strong>%1</strong> 設定掛載點 <strong>%2</strong> 與功能 <em>%4</em> ++ ++ Set up %3 partition <strong>%1</strong> with mount point <strong>%2</strong> and features <em>%4</em> ++ @info ++ 為分割區 %3 <strong>%1</strong> 設定掛載點 <strong>%2</strong> 與功能 <em>%4</em> + + +- +- Set up %3 partition <strong>%1</strong> with mount point <strong>%2</strong>%4… +- @info +- 為分割區 %3 <strong>%1</strong> 設定掛載點 <strong>%2</strong> %4…… ++ ++ Set up %3 partition <strong>%1</strong> with mount point <strong>%2</strong>%4… ++ @info ++ 為分割區 %3 <strong>%1</strong> 設定掛載點 <strong>%2</strong> %4…… + + +- +- Install boot loader on <strong>%1</strong>… +- @info +- 在 <strong>%1</strong> 安裝開機載入程式…… ++ ++ Install boot loader on <strong>%1</strong>… ++ @info ++ 在 <strong>%1</strong> 安裝開機載入程式…… + + +- +- Setting up mount points… +- @status +- 設定掛載點…… ++ ++ Setting up mount points… ++ @status ++ 設定掛載點…… + +- +- ++ ++ + FinishedPage + +- +- &Restart now +- 現在重新啟動 (&R) ++ ++ &Restart now ++ 現在重新啟動 (&R) + + +- +- <h1>All done.</h1><br/>%1 has been set up on your computer.<br/>You may now start using your new system. +- @info +- <h1>都完成了。</h1><br/>%1 已經在您的電腦上設定好了。<br/>您現在可能會想要開始使用您的新系統。 ++ ++ <h1>All done.</h1><br/>%1 has been set up on your computer.<br/>You may now start using your new system. ++ @info ++ <h1>都完成了。</h1><br/>%1 已經在您的電腦上設定好了。<br/>您現在可能會想要開始使用您的新系統。 + + +- +- <html><head/><body><p>When this box is checked, your system will restart immediately when you click on <span style="font-style:italic;">Done</span> or close the setup program.</p></body></html> +- @tooltip +- <html><head/><body><p>當這個勾選框被選取時,您的系統將會在按下<span style="font-style:italic;">完成</span>或關閉設定程式時立刻重新啟動。</p></body></html> ++ ++ <html><head/><body><p>When this box is checked, your system will restart immediately when you click on <span style="font-style:italic;">Done</span> or close the setup program.</p></body></html> ++ @tooltip ++ <html><head/><body><p>當這個勾選框被選取時,您的系統將會在按下<span style="font-style:italic;">完成</span>或關閉設定程式時立刻重新啟動。</p></body></html> + + +- +- <h1>All done.</h1><br/>%1 has been installed on your computer.<br/>You may now restart into your new system, or continue using the %2 Live environment. +- @info +- <h1>都完成了。</h1><br/>%1 已經安裝在您的電腦上了。<br/>您現在可能會想要重新啟動到您的新系統中,或是繼續使用 %2 Live 環境。 ++ ++ <h1>All done.</h1><br/>%1 has been installed on your computer.<br/>You may now restart into your new system, or continue using the %2 Live environment. ++ @info ++ <h1>都完成了。</h1><br/>%1 已經安裝在您的電腦上了。<br/>您現在可能會想要重新啟動到您的新系統中,或是繼續使用 %2 Live 環境。 + + +- +- <html><head/><body><p>When this box is checked, your system will restart immediately when you click on <span style="font-style:italic;">Done</span> or close the installer.</p></body></html> +- @tooltip +- <html><head/><body><p>當這個勾選框被選取時,您的系統將會在按下<span style="font-style:italic;">完成</span>或關閉安裝程式時立刻重新啟動。</p></body></html> ++ ++ <html><head/><body><p>When this box is checked, your system will restart immediately when you click on <span style="font-style:italic;">Done</span> or close the installer.</p></body></html> ++ @tooltip ++ <html><head/><body><p>當這個勾選框被選取時,您的系統將會在按下<span style="font-style:italic;">完成</span>或關閉安裝程式時立刻重新啟動。</p></body></html> + + +- +- <h1>Setup Failed</h1><br/>%1 has not been set up on your computer.<br/>The error message was: %2. +- @info, %1 is product name with version +- <h1>設定失敗</h1><br/>%1 並未在您的電腦設定好。<br/>錯誤訊息為:%2。 ++ ++ <h1>Setup Failed</h1><br/>%1 has not been set up on your computer.<br/>The error message was: %2. ++ @info, %1 is product name with version ++ <h1>設定失敗</h1><br/>%1 並未在您的電腦設定好。<br/>錯誤訊息為:%2。 + + +- +- <h1>Installation Failed</h1><br/>%1 has not been installed on your computer.<br/>The error message was: %2. +- @info, %1 is product name with version +- <h1>安裝失敗</h1><br/>%1 並未安裝到您的電腦上。<br/>錯誤訊息為:%2。 ++ ++ <h1>Installation Failed</h1><br/>%1 has not been installed on your computer.<br/>The error message was: %2. ++ @info, %1 is product name with version ++ <h1>安裝失敗</h1><br/>%1 並未安裝到您的電腦上。<br/>錯誤訊息為:%2。 + +- +- ++ ++ + FinishedQmlViewStep + +- +- Finish +- @label +- 完成 ++ ++ Finish ++ @label ++ 完成 + +- +- ++ ++ + FinishedViewStep + +- +- Finish +- @label +- 完成 ++ ++ Finish ++ @label ++ 完成 + +- +- ++ ++ + FormatPartitionJob + +- +- Format partition %1 (file system: %2, size: %3 MiB) on %4 +- @title +- 格式化分割區 %1(檔案系統:%2,大小:%3 MiB)在 %4 ++ ++ Format partition %1 (file system: %2, size: %3 MiB) on %4 ++ @title ++ 格式化分割區 %1(檔案系統:%2,大小:%3 MiB)在 %4 + + +- +- Format <strong>%3MiB</strong> partition <strong>%1</strong> with file system <strong>%2</strong> +- @info +- 格式化 <strong>%3MiB</strong> 分割區 <strong>%1</strong>,使用檔案系統 <strong>%2</strong> ++ ++ Format <strong>%3MiB</strong> partition <strong>%1</strong> with file system <strong>%2</strong> ++ @info ++ 格式化 <strong>%3MiB</strong> 分割區 <strong>%1</strong>,使用檔案系統 <strong>%2</strong> + + +- +- %1 (%2) +- partition label %1 (device path %2) +- %1 (%2) ++ ++ %1 (%2) ++ partition label %1 (device path %2) ++ %1 (%2) + + +- +- Formatting partition %1 with file system %2… +- @status +- 正在以 %2 檔案系統格式化分割區 %1…… ++ ++ Formatting partition %1 with file system %2… ++ @status ++ 正在以 %2 檔案系統格式化分割區 %1…… + + +- +- The installer failed to format partition %1 on disk '%2'. +- 安裝程式格式化在磁碟 '%2' 上的分割區 %1 失敗。 ++ ++ The installer failed to format partition %1 on disk '%2'. ++ 安裝程式格式化在磁碟 '%2' 上的分割區 %1 失敗。 + +- +- ++ ++ + GeneralRequirements + +- +- Please ensure the system has at least %1 GiB available drive space. +- 請確保系統有至少 %1 GiB 的可用磁碟空間。 ++ ++ Please ensure the system has at least %1 GiB available drive space. ++ 請確保系統有至少 %1 GiB 的可用磁碟空間。 + + +- +- Available drive space is all of the hard disks and SSDs connected to the system. +- 可用磁碟空間是連結到系統的所有硬碟與 SSD。 ++ ++ Available drive space is all of the hard disks and SSDs connected to the system. ++ 可用磁碟空間是連結到系統的所有硬碟與 SSD。 + + +- +- There is not enough drive space. At least %1 GiB is required. +- 沒有足夠的磁碟空間。至少需要 %1 GiB。 ++ ++ There is not enough drive space. At least %1 GiB is required. ++ 沒有足夠的磁碟空間。至少需要 %1 GiB。 + + +- +- has at least %1 GiB working memory +- 有至少 %1 GiB 的可用記憶體 ++ ++ has at least %1 GiB working memory ++ 有至少 %1 GiB 的可用記憶體 + + +- +- The system does not have enough working memory. At least %1 GiB is required. +- 系統沒有足夠的記憶體。至少需要 %1 GiB。 ++ ++ The system does not have enough working memory. At least %1 GiB is required. ++ 系統沒有足夠的記憶體。至少需要 %1 GiB。 + + +- +- is plugged in to a power source +- 已插入外接電源 ++ ++ is plugged in to a power source ++ 已插入外接電源 + + +- +- The system is not plugged in to a power source. +- 系統未插入外接電源。 ++ ++ The system is not plugged in to a power source. ++ 系統未插入外接電源。 + + +- +- is connected to the Internet +- 已連上網際網路 ++ ++ is connected to the Internet ++ 已連上網際網路 + + +- +- The system is not connected to the Internet. +- 系統未連上網際網路 ++ ++ The system is not connected to the Internet. ++ 系統未連上網際網路 + + +- +- is running the installer as an administrator (root) +- 以管理員 (root) 權限執行安裝程式 ++ ++ is running the installer as an administrator (root) ++ 以管理員 (root) 權限執行安裝程式 + + +- +- The setup program is not running with administrator rights. +- 設定程式並未以管理員權限執行。 ++ ++ The setup program is not running with administrator rights. ++ 設定程式並未以管理員權限執行。 + + +- +- The installer is not running with administrator rights. +- 安裝程式並未以管理員權限執行。 ++ ++ The installer is not running with administrator rights. ++ 安裝程式並未以管理員權限執行。 + + +- +- has a screen large enough to show the whole installer +- 螢幕夠大,可以顯示整個安裝程式 ++ ++ has a screen large enough to show the whole installer ++ 螢幕夠大,可以顯示整個安裝程式 + + +- +- The screen is too small to display the setup program. +- 螢幕太小了,沒辦法顯示設定程式。 ++ ++ The screen is too small to display the setup program. ++ 螢幕太小了,沒辦法顯示設定程式。 + + +- +- The screen is too small to display the installer. +- 螢幕太小了,沒辦法顯示安裝程式。 ++ ++ The screen is too small to display the installer. ++ 螢幕太小了,沒辦法顯示安裝程式。 + + +- +- is always false +- 一律為 false ++ ++ is always false ++ 一律為 false + + +- +- The computer says no. +- 電腦說否。 ++ ++ The computer says no. ++ 電腦說否。 + + +- +- is always false (slowly) +- 一律為 false(慢) ++ ++ is always false (slowly) ++ 一律為 false(慢) + + +- +- The computer says no (slowly). +- 電腦說否(慢)。 ++ ++ The computer says no (slowly). ++ 電腦說否(慢)。 + + +- +- is always true +- 一律為 true ++ ++ is always true ++ 一律為 true + + +- +- The computer says yes. +- 電腦說是。 ++ ++ The computer says yes. ++ 電腦說是。 + + +- +- is always true (slowly) +- 一律為 true(慢) ++ ++ is always true (slowly) ++ 一律為 true(慢) + + +- +- The computer says yes (slowly). +- 電腦說是(慢)。 ++ ++ The computer says yes (slowly). ++ 電腦說是(慢)。 + + +- +- is checked three times. +- 被檢查了三次。 ++ ++ is checked three times. ++ 被檢查了三次。 + + +- +- The snark has not been checked three times. +- The (some mythological beast) has not been checked three times. +- snark 並未檢查三次。 ++ ++ The snark has not been checked three times. ++ The (some mythological beast) has not been checked three times. ++ snark 並未檢查三次。 + +- +- ++ ++ + HostInfoJob + +- +- Collecting information about your machine… +- @status +- 正在蒐集關於您機器的資訊…… ++ ++ Collecting information about your machine… ++ @status ++ 正在蒐集關於您機器的資訊…… + +- +- ++ ++ + IDJob + +- +- +- +- +- OEM Batch Identifier +- OEM 批次識別記號 ++ ++ ++ ++ ++ OEM Batch Identifier ++ OEM 批次識別記號 + + +- +- Could not create directories <code>%1</code>. +- 無法建立目錄 <code>%1</code>。 ++ ++ Could not create directories <code>%1</code>. ++ 無法建立目錄 <code>%1</code>。 + + +- +- Could not open file <code>%1</code>. +- 無法開啟檔案 <code>%1</code>。 ++ ++ Could not open file <code>%1</code>. ++ 無法開啟檔案 <code>%1</code>。 + + +- +- Could not write to file <code>%1</code>. +- 無法寫入至檔案 <code>%1</code>。 ++ ++ Could not write to file <code>%1</code>. ++ 無法寫入至檔案 <code>%1</code>。 + +- +- ++ ++ + InitcpioJob + +- +- Creating initramfs with mkinitcpio… +- @status +- 正在使用 mkinitcpio 建立 initramfs…… ++ ++ Creating initramfs with mkinitcpio… ++ @status ++ 正在使用 mkinitcpio 建立 initramfs…… + +- +- ++ ++ + InitramfsJob + +- +- Creating initramfs… +- @status +- 正在建立 initramfs…… ++ ++ Creating initramfs… ++ @status ++ 正在建立 initramfs…… + +- +- ++ ++ + InteractiveTerminalPage + +- +- Konsole not installed. +- @error +- 未安裝 Konsole。 ++ ++ Konsole not installed. ++ @error ++ 未安裝 Konsole。 + + +- +- Please install KDE Konsole and try again! +- @info +- 請安裝 KDE Konsole 並再試一次! ++ ++ Please install KDE Konsole and try again! ++ @info ++ 請安裝 KDE Konsole 並再試一次! + + +- +- Executing script: &nbsp;<code>%1</code> +- @info +- 正在執行指令稿:&nbsp;<code>%1</code> ++ ++ Executing script: &nbsp;<code>%1</code> ++ @info ++ 正在執行指令稿:&nbsp;<code>%1</code> + +- +- ++ ++ + InteractiveTerminalViewStep + +- +- Script +- @label +- 指令稿 ++ ++ Script ++ @label ++ 指令稿 + +- +- ++ ++ + KeyboardQmlViewStep + +- +- Keyboard +- @label +- 鍵盤 ++ ++ Keyboard ++ @label ++ 鍵盤 + +- +- ++ ++ + KeyboardViewStep + +- +- Keyboard +- @label +- 鍵盤 ++ ++ Keyboard ++ @label ++ 鍵盤 + +- +- ++ ++ + LCLocaleDialog + +- +- System Locale Setting +- @title +- 系統語系設定 ++ ++ System Locale Setting ++ @title ++ 系統語系設定 + + +- +- The system locale setting affects the language and character set for some command line user interface elements.<br/>The current setting is <strong>%1</strong>. +- @info +- 系統語系設定會影響部份命令列使用者介面的語言及字元集。<br/>目前的設定為 <strong>%1</strong>。 ++ ++ The system locale setting affects the language and character set for some command line user interface elements.<br/>The current setting is <strong>%1</strong>. ++ @info ++ 系統語系設定會影響部份命令列使用者介面的語言及字元集。<br/>目前的設定為 <strong>%1</strong>。 + + +- +- &Cancel +- @button +- 取消(&C) ++ ++ &Cancel ++ @button ++ 取消(&C) + + +- +- &OK +- @button +- 確定(&O) ++ ++ &OK ++ @button ++ 確定(&O) + +- +- ++ ++ + LOSHJob + +- +- Configuring encrypted swap. +- 正在設定已加密的 swap。 ++ ++ Configuring encrypted swap. ++ 正在設定已加密的 swap。 + + +- +- No target system available. +- 沒有可用的目標系統。 ++ ++ No target system available. ++ 沒有可用的目標系統。 + + +- +- No rootMountPoint is set. +- 未設定 rootMountPoint。 ++ ++ No rootMountPoint is set. ++ 未設定 rootMountPoint。 + + +- +- No configFilePath is set. +- 未設定 configFilePath。 ++ ++ No configFilePath is set. ++ 未設定 configFilePath。 + +- +- ++ ++ + LicensePage + +- +- <h1>License Agreement</h1> +- <h1>授權條款</h1> ++ ++ <h1>License Agreement</h1> ++ <h1>授權條款</h1> + + +- +- I accept the terms and conditions above. +- @info +- 我接受上述的條款與條件。 ++ ++ I accept the terms and conditions above. ++ @info ++ 我接受上述的條款與條件。 + + +- +- Please review the End User License Agreements (EULAs). +- @info +- 請審閱終端使用者授權條款 (EULAs)。 ++ ++ Please review the End User License Agreements (EULAs). ++ @info ++ 請審閱終端使用者授權條款 (EULAs)。 + + +- +- This setup procedure will install proprietary software that is subject to licensing terms. +- @info +- 此設定過程將會安裝需要同意其授權條款的專有軟體。 ++ ++ This setup procedure will install proprietary software that is subject to licensing terms. ++ @info ++ 此設定過程將會安裝需要同意其授權條款的專有軟體。 + + +- +- If you do not agree with the terms, the setup procedure cannot continue. +- @info +- 如果您不同意此條款,安裝程序就無法繼續。 ++ ++ If you do not agree with the terms, the setup procedure cannot continue. ++ @info ++ 如果您不同意此條款,安裝程序就無法繼續。 + + +- +- This setup procedure can install proprietary software that is subject to licensing terms in order to provide additional features and enhance the user experience. +- @info +- 此設定過程會安裝需要同意授權條款的專有軟體以提供附加功能並強化使用者體驗。 ++ ++ This setup procedure can install proprietary software that is subject to licensing terms in order to provide additional features and enhance the user experience. ++ @info ++ 此設定過程會安裝需要同意授權條款的專有軟體以提供附加功能並強化使用者體驗。 + + +- +- If you do not agree with the terms, proprietary software will not be installed, and open source alternatives will be used instead. +- @info +- 如果您不同意條款,就不會安裝專有軟體,而將會使用開放原始碼的替代方案。 ++ ++ If you do not agree with the terms, proprietary software will not be installed, and open source alternatives will be used instead. ++ @info ++ 如果您不同意條款,就不會安裝專有軟體,而將會使用開放原始碼的替代方案。 + +- +- ++ ++ + LicenseViewStep + +- +- License +- @label +- 授權條款 ++ ++ License ++ @label ++ 授權條款 + +- +- ++ ++ + LicenseWidget + +- +- URL: %1 +- @label +- URL:%1 ++ ++ URL: %1 ++ @label ++ URL:%1 + + +- +- <strong>%1 driver</strong><br/>by %2 +- @label, %1 is product name, %2 is product vendor +- %1 is an untranslatable product name, example: Creative Audigy driver +- <strong>%1 驅動程式</strong><br/>由 %2 所提供 ++ ++ <strong>%1 driver</strong><br/>by %2 ++ @label, %1 is product name, %2 is product vendor ++ %1 is an untranslatable product name, example: Creative Audigy driver ++ <strong>%1 驅動程式</strong><br/>由 %2 所提供 + + +- +- <strong>%1 graphics driver</strong><br/><font color="Grey">by %2</font> +- @label, %1 is product name, %2 is product vendor +- %1 is usually a vendor name, example: Nvidia graphics driver +- <strong>%1 顯示卡驅動程式</strong><br/><font color="Grey">由 %2 所提供</font> ++ ++ <strong>%1 graphics driver</strong><br/><font color="Grey">by %2</font> ++ @label, %1 is product name, %2 is product vendor ++ %1 is usually a vendor name, example: Nvidia graphics driver ++ <strong>%1 顯示卡驅動程式</strong><br/><font color="Grey">由 %2 所提供</font> + + +- +- <strong>%1 browser plugin</strong><br/><font color="Grey">by %2</font> +- @label, %1 is product name, %2 is product vendor +- <strong>%1 瀏覽器外掛程式</strong><br/><font color="Grey">由 %2 所提供</font> ++ ++ <strong>%1 browser plugin</strong><br/><font color="Grey">by %2</font> ++ @label, %1 is product name, %2 is product vendor ++ <strong>%1 瀏覽器外掛程式</strong><br/><font color="Grey">由 %2 所提供</font> + + +- +- <strong>%1 codec</strong><br/><font color="Grey">by %2</font> +- @label, %1 is product name, %2 is product vendor +- <strong>%1 編解碼器</strong><br/><font color="Grey">由 %2 所提供</font> ++ ++ <strong>%1 codec</strong><br/><font color="Grey">by %2</font> ++ @label, %1 is product name, %2 is product vendor ++ <strong>%1 編解碼器</strong><br/><font color="Grey">由 %2 所提供</font> + + +- +- <strong>%1 package</strong><br/><font color="Grey">by %2</font> +- @label, %1 is product name, %2 is product vendor +- <strong>%1 軟體包</strong><br/><font color="Grey">由 %2 所提供</font> ++ ++ <strong>%1 package</strong><br/><font color="Grey">by %2</font> ++ @label, %1 is product name, %2 is product vendor ++ <strong>%1 軟體包</strong><br/><font color="Grey">由 %2 所提供</font> + + +- +- <strong>%1</strong><br/><font color="Grey">by %2</font> +- @label, %1 is product name, %2 is product vendor +- <strong>%1</strong><br/><font color="Grey">由 %2 所提供</font> ++ ++ <strong>%1</strong><br/><font color="Grey">by %2</font> ++ @label, %1 is product name, %2 is product vendor ++ <strong>%1</strong><br/><font color="Grey">由 %2 所提供</font> + + +- +- File: %1 +- @label +- 檔案:%1 ++ ++ File: %1 ++ @label ++ 檔案:%1 + + +- +- Hide the license text +- @tooltip +- 隱藏授權條款文字 ++ ++ Hide the license text ++ @tooltip ++ 隱藏授權條款文字 + + +- +- Show the license text +- @tooltip +- 顯示授權條款文字 ++ ++ Show the license text ++ @tooltip ++ 顯示授權條款文字 + + +- +- Open the license agreement in browser +- @tooltip +- 在瀏覽器中開啟授權條款文字 ++ ++ Open the license agreement in browser ++ @tooltip ++ 在瀏覽器中開啟授權條款文字 + +- +- ++ ++ + LocalePage + +- +- Region: +- @label +- 地區 ++ ++ Region: ++ @label ++ 地區 + + +- +- Zone: +- @label +- 時區 ++ ++ Zone: ++ @label ++ 時區 + + +- +- +- &Change… +- @button +- 變更……(&C) ++ ++ ++ &Change… ++ @button ++ 變更……(&C) + +- +- ++ ++ + LocaleQmlViewStep + +- +- Location +- @label +- 位置 ++ ++ Location ++ @label ++ 位置 + +- +- ++ ++ + LocaleTests + +- +- Quit +- 結束 ++ ++ Quit ++ 結束 + +- +- ++ ++ + LocaleViewStep + +- +- Location +- @label +- 位置 ++ ++ Location ++ @label ++ 位置 + +- +- ++ ++ + LuksBootKeyFileJob + +- +- Configuring LUKS key file. +- 正在設定 LUKS 金鑰檔案。 ++ ++ Configuring LUKS key file. ++ 正在設定 LUKS 金鑰檔案。 + + +- +- +- No partitions are defined. +- 沒有已定義的分割區。 ++ ++ ++ No partitions are defined. ++ 沒有已定義的分割區。 + + +- +- +- Encrypted rootfs setup error +- 已加密的 rootfs 設定錯誤 ++ ++ ++ Encrypted rootfs setup error ++ 已加密的 rootfs 設定錯誤 + + +- +- Root partition %1 is LUKS but no passphrase has been set. +- 根分割區 %1 為 LUKS 但沒有設定密碼。 ++ ++ Root partition %1 is LUKS but no passphrase has been set. ++ 根分割區 %1 為 LUKS 但沒有設定密碼。 + + +- +- Could not create LUKS key file for root partition %1. +- 無法為根分割區 %1 建立 LUKS 金鑰檔。 ++ ++ Could not create LUKS key file for root partition %1. ++ 無法為根分割區 %1 建立 LUKS 金鑰檔。 + +- +- ++ ++ + MachineIdJob + +- +- Generate machine-id. +- 生成 machine-id。 ++ ++ Generate machine-id. ++ 生成 machine-id。 + + +- +- Configuration Error +- 設定錯誤 ++ ++ Configuration Error ++ 設定錯誤 + + +- +- No root mount point is set for MachineId. +- 未為 MachineId 設定根掛載點。 ++ ++ No root mount point is set for MachineId. ++ 未為 MachineId 設定根掛載點。 + + +- +- +- +- +- File not found +- 找不到檔案 ++ ++ ++ ++ ++ File not found ++ 找不到檔案 + + +- +- Path <pre>%1</pre> must be an absolute path. +- 路徑 <pre>%1</pre> 必須為絕對路徑。 ++ ++ Path <pre>%1</pre> must be an absolute path. ++ 路徑 <pre>%1</pre> 必須為絕對路徑。 + + +- +- Could not create new random file <pre>%1</pre>. +- 無法建立新的隨機檔案 <pre>%1</pre>。 ++ ++ Could not create new random file <pre>%1</pre>. ++ 無法建立新的隨機檔案 <pre>%1</pre>。 + +- +- ++ ++ + Map + +- +- Timezone: %1 +- @label +- 時區:%1 ++ ++ Timezone: %1 ++ @label ++ 時區:%1 + + +- +- Please select your preferred location on the map so the installer can suggest the locale ++ ++ Please select your preferred location on the map so the installer can suggest the locale + and timezone settings for you. You can fine-tune the suggested settings below. Search the map by dragging + to move and using the +/- buttons to zoom in/out or use mouse scrolling for zooming. +- @info +- 請在地圖上選取您的偏好位置,這樣安裝程式就可以為您建議 ++ @info ++ 請在地圖上選取您的偏好位置,這樣安裝程式就可以為您建議 + 語系與時區。您可以在下面微調建議的設定。透過拖曳來移動地圖, + 並使用 +/- 按鈕來縮放,或是使用滑鼠滾輪來縮放。 + +- +- ++ ++ + Map-qt6 + +- +- Timezone: %1 +- @label +- 時區:%1 ++ ++ Timezone: %1 ++ @label ++ 時區:%1 + + +- +- Please select your preferred location on the map so the installer can suggest the locale ++ ++ Please select your preferred location on the map so the installer can suggest the locale + and timezone settings for you. You can fine-tune the suggested settings below. Search the map by dragging + to move and using the +/- buttons to zoom in/out or use mouse scrolling for zooming. +- @label +- 請在地圖上選取您的偏好位置,這樣安裝程式就可以為您建議 ++ @label ++ 請在地圖上選取您的偏好位置,這樣安裝程式就可以為您建議 + 語系與時區。您可以在下面微調建議的設定。透過拖曳來移動地圖, + 並使用 +/- 按鈕來縮放,或是使用滑鼠滾輪來縮放。 + +- +- ++ ++ + NetInstallViewStep + +- +- Package selection +- 軟體包選擇 ++ ++ Package selection ++ 軟體包選擇 + + +- +- Office software +- 辦公軟體 ++ ++ Office software ++ 辦公軟體 + + +- +- Office package +- 辦公套件 ++ ++ Office package ++ 辦公套件 + + +- +- Browser software +- 瀏覽器軟體 ++ ++ Browser software ++ 瀏覽器軟體 + + +- +- Browser package +- 瀏覽器套件 ++ ++ Browser package ++ 瀏覽器套件 + + +- +- Web browser +- 網頁瀏覽器 ++ ++ Web browser ++ 網頁瀏覽器 + + +- +- Kernel +- label for netinstall module, Linux kernel +- 內核 ++ ++ Kernel ++ label for netinstall module, Linux kernel ++ 內核 + + +- +- Services +- label for netinstall module, system services +- 服務 ++ ++ Services ++ label for netinstall module, system services ++ 服務 + + +- +- Login +- label for netinstall module, choose login manager +- 登入 ++ ++ Login ++ label for netinstall module, choose login manager ++ 登入 + + +- +- Desktop +- label for netinstall module, choose desktop environment +- 桌面 ++ ++ Desktop ++ label for netinstall module, choose desktop environment ++ 桌面 + + +- +- Applications +- 應用程式 ++ ++ Applications ++ 應用程式 + + +- +- Communication +- label for netinstall module +- 通訊 ++ ++ Communication ++ label for netinstall module ++ 通訊 + + +- +- Development +- label for netinstall module +- 開發 ++ ++ Development ++ label for netinstall module ++ 開發 + + +- +- Office +- label for netinstall module +- 辦公 ++ ++ Office ++ label for netinstall module ++ 辦公 + + +- +- Multimedia +- label for netinstall module +- 多媒體 ++ ++ Multimedia ++ label for netinstall module ++ 多媒體 + + +- +- Internet +- label for netinstall module +- 網際網路 ++ ++ Internet ++ label for netinstall module ++ 網際網路 + + +- +- Theming +- label for netinstall module +- 主題 ++ ++ Theming ++ label for netinstall module ++ 主題 + + +- +- Gaming +- label for netinstall module +- 遊戲 ++ ++ Gaming ++ label for netinstall module ++ 遊戲 + + +- +- Utilities +- label for netinstall module +- 實用工具 ++ ++ Utilities ++ label for netinstall module ++ 實用工具 + +- +- ++ ++ + NotesQmlViewStep + +- +- Notes +- 記事 ++ ++ Notes ++ 記事 + +- +- ++ ++ + OEMPage + +- +- Ba&tch: +- 批次:(&T) ++ ++ Ba&tch: ++ 批次:(&T) + + +- +- <html><head/><body><p>Enter a batch-identifier here. This will be stored in the target system.</p></body></html> +- <html><head/><body><p>在此輸入批次識別記號。這將會儲存在目標系統中。</p></body></html> ++ ++ <html><head/><body><p>Enter a batch-identifier here. This will be stored in the target system.</p></body></html> ++ <html><head/><body><p>在此輸入批次識別記號。這將會儲存在目標系統中。</p></body></html> + + +- +- <html><head/><body><h1>OEM Configuration</h1><p>Calamares will use OEM settings while configuring the target system.</p></body></html> +- <html><head/><body><h1>OEM 設定</h1><p>在設定目標系統時,Calamares 將會使用 OEM 設定。</p></body></html> ++ ++ <html><head/><body><h1>OEM Configuration</h1><p>Calamares will use OEM settings while configuring the target system.</p></body></html> ++ <html><head/><body><h1>OEM 設定</h1><p>在設定目標系統時,Calamares 將會使用 OEM 設定。</p></body></html> + +- +- ++ ++ + OEMViewStep + +- +- OEM Configuration +- OEM 設定 ++ ++ OEM Configuration ++ OEM 設定 + + +- +- Set the OEM Batch Identifier to <code>%1</code>. +- 設定 OEM 批次識別符號為 <code>%1</code>。 ++ ++ Set the OEM Batch Identifier to <code>%1</code>. ++ 設定 OEM 批次識別符號為 <code>%1</code>。 + +- +- ++ ++ + Offline + +- +- Select your preferred region, or use the default settings +- @label +- 選取您偏好的區域,或是使用預設設定 ++ ++ Select your preferred region, or use the default settings ++ @label ++ 選取您偏好的區域,或是使用預設設定 + + +- +- +- +- Timezone: %1 +- @label +- 時區:%1 ++ ++ ++ ++ Timezone: %1 ++ @label ++ 時區:%1 + + +- +- Select your preferred zone within your region +- @label +- 在您的區域中選取您偏好的時區 ++ ++ Select your preferred zone within your region ++ @label ++ 在您的區域中選取您偏好的時區 + + +- +- Zones +- @button +- 時區 ++ ++ Zones ++ @button ++ 時區 + + +- +- You can fine-tune language and locale settings below +- @label +- 您可以在下方微調語言與語系設定 ++ ++ You can fine-tune language and locale settings below ++ @label ++ 您可以在下方微調語言與語系設定 + +- +- ++ ++ + Offline-qt6 + +- +- Select your preferred region, or use the default settings +- @label +- 選取您偏好的區域,或是使用預設設定 ++ ++ Select your preferred region, or use the default settings ++ @label ++ 選取您偏好的區域,或是使用預設設定 + + +- +- +- +- Timezone: %1 +- @label +- 時區:%1 ++ ++ ++ ++ Timezone: %1 ++ @label ++ 時區:%1 + + +- +- Select your preferred zone within your region +- @label +- 在您的區域中選取您偏好的時區 ++ ++ Select your preferred zone within your region ++ @label ++ 在您的區域中選取您偏好的時區 + + +- +- Zones +- @button +- 時區 ++ ++ Zones ++ @button ++ 時區 + + +- +- You can fine-tune language and locale settings below +- @label +- 您可以在下方微調語言與語系設定 ++ ++ You can fine-tune language and locale settings below ++ @label ++ 您可以在下方微調語言與語系設定 + +- +- ++ ++ + PWQ + +- +- Password is too short +- 密碼太短 ++ ++ Password is too short ++ 密碼太短 + + +- +- Password is too long +- 密碼太長 ++ ++ Password is too long ++ 密碼太長 + + +- +- Password is too weak +- 密碼太弱 ++ ++ Password is too weak ++ 密碼太弱 + + +- +- Memory allocation error when setting '%1' +- 當設定「%1」時記憶體分配錯誤 ++ ++ Memory allocation error when setting '%1' ++ 當設定「%1」時記憶體分配錯誤 + + +- +- Memory allocation error +- 記憶體分配錯誤 ++ ++ Memory allocation error ++ 記憶體分配錯誤 + + +- +- The password is the same as the old one +- 密碼與舊的相同 ++ ++ The password is the same as the old one ++ 密碼與舊的相同 + + +- +- The password is a palindrome +- 此密碼為迴文 ++ ++ The password is a palindrome ++ 此密碼為迴文 + + +- +- The password differs with case changes only +- 密碼僅大小寫不同 ++ ++ The password differs with case changes only ++ 密碼僅大小寫不同 + + +- +- The password is too similar to the old one +- 密碼與舊的太過相似 ++ ++ The password is too similar to the old one ++ 密碼與舊的太過相似 + + +- +- The password contains the user name in some form +- 密碼包含某種形式的使用者名稱 ++ ++ The password contains the user name in some form ++ 密碼包含某種形式的使用者名稱 + + +- +- The password contains words from the real name of the user in some form +- 密碼包含了某種形式的使用者真實姓名 ++ ++ The password contains words from the real name of the user in some form ++ 密碼包含了某種形式的使用者真實姓名 + + +- +- The password contains forbidden words in some form +- 密碼包含了某種形式的無效文字 ++ ++ The password contains forbidden words in some form ++ 密碼包含了某種形式的無效文字 + + +- +- The password contains fewer than %n digits +- +- 密碼中僅有少於 %n 位數字 +- ++ ++ The password contains fewer than %n digits ++ ++ 密碼中僅有少於 %n 位數字 ++ + + +- +- The password contains too few digits +- 密碼包含的數字太少了 ++ ++ The password contains too few digits ++ 密碼包含的數字太少了 + + +- +- The password contains fewer than %n uppercase letters +- +- 密碼中僅有少於 %n 個大寫字母 +- ++ ++ The password contains fewer than %n uppercase letters ++ ++ 密碼中僅有少於 %n 個大寫字母 ++ + + +- +- The password contains too few uppercase letters +- 密碼包含的大寫字母太少了 ++ ++ The password contains too few uppercase letters ++ 密碼包含的大寫字母太少了 + + +- +- The password contains fewer than %n lowercase letters +- +- 密碼中僅有少於 %n 個小寫字母 +- ++ ++ The password contains fewer than %n lowercase letters ++ ++ 密碼中僅有少於 %n 個小寫字母 ++ + + +- +- The password contains too few lowercase letters +- 密碼包含的小寫字母太少了 ++ ++ The password contains too few lowercase letters ++ 密碼包含的小寫字母太少了 + + +- +- The password contains fewer than %n non-alphanumeric characters +- +- 密碼中僅有少於 %n 個非字母字元 +- ++ ++ The password contains fewer than %n non-alphanumeric characters ++ ++ 密碼中僅有少於 %n 個非字母字元 ++ + + +- +- The password contains too few non-alphanumeric characters +- 密碼包含的非字母與數字的字元太少了 ++ ++ The password contains too few non-alphanumeric characters ++ 密碼包含的非字母與數字的字元太少了 + + +- +- The password is shorter than %n characters +- +- 密碼短於 %n 個字元 +- ++ ++ The password is shorter than %n characters ++ ++ 密碼短於 %n 個字元 ++ + + +- +- The password is too short +- 密碼太短 ++ ++ The password is too short ++ 密碼太短 + + +- +- The password is a rotated version of the previous one +- 密碼是上一個密碼的輪換版本 ++ ++ The password is a rotated version of the previous one ++ 密碼是上一個密碼的輪換版本 + + +- +- The password contains fewer than %n character classes +- +- 密碼中僅有少於 %n 種字元類型 +- ++ ++ The password contains fewer than %n character classes ++ ++ 密碼中僅有少於 %n 種字元類型 ++ + + +- +- The password does not contain enough character classes +- 密碼未包含足夠的字元類型 ++ ++ The password does not contain enough character classes ++ 密碼未包含足夠的字元類型 + + +- +- The password contains more than %n same characters consecutively +- +- 密碼中包含了 %n 個連續的相同字元 +- ++ ++ The password contains more than %n same characters consecutively ++ ++ 密碼中包含了 %n 個連續的相同字元 ++ + + +- +- The password contains too many same characters consecutively +- 密碼包含連續太多個相同的字元 ++ ++ The password contains too many same characters consecutively ++ 密碼包含連續太多個相同的字元 + + +- +- The password contains more than %n characters of the same class consecutively +- +- 密碼中包含了 %n 個連續的相同類型字元 +- ++ ++ The password contains more than %n characters of the same class consecutively ++ ++ 密碼中包含了 %n 個連續的相同類型字元 ++ + + +- +- The password contains too many characters of the same class consecutively +- 密碼包含了連續太多相同類型的字元 ++ ++ The password contains too many characters of the same class consecutively ++ 密碼包含了連續太多相同類型的字元 + + +- +- The password contains monotonic sequence longer than %n characters +- +- 密碼包含了長度超過 %n 個字元的單調序列 +- ++ ++ The password contains monotonic sequence longer than %n characters ++ ++ 密碼包含了長度超過 %n 個字元的單調序列 ++ + + +- +- The password contains too long of a monotonic character sequence +- 密碼包含了長度過長的單調字元序列 ++ ++ The password contains too long of a monotonic character sequence ++ 密碼包含了長度過長的單調字元序列 + + +- +- No password supplied +- 未提供密碼 ++ ++ No password supplied ++ 未提供密碼 + + +- +- Cannot obtain random numbers from the RNG device +- 無法從 RNG 裝置中取得隨機數 ++ ++ Cannot obtain random numbers from the RNG device ++ 無法從 RNG 裝置中取得隨機數 + + +- +- Password generation failed - required entropy too low for settings +- 密碼生成失敗,設定的必要熵太低 ++ ++ Password generation failed - required entropy too low for settings ++ 密碼生成失敗,設定的必要熵太低 + + +- +- The password fails the dictionary check - %1 +- 密碼在字典檢查時失敗 - %1 ++ ++ The password fails the dictionary check - %1 ++ 密碼在字典檢查時失敗 - %1 + + +- +- The password fails the dictionary check +- 密碼在字典檢查時失敗 ++ ++ The password fails the dictionary check ++ 密碼在字典檢查時失敗 + + +- +- Unknown setting - %1 +- 未知的設定 - %1 ++ ++ Unknown setting - %1 ++ 未知的設定 - %1 + + +- +- Unknown setting +- 未知的設定 ++ ++ Unknown setting ++ 未知的設定 + + +- +- Bad integer value of setting - %1 +- 整數值設定不正確 - %1 ++ ++ Bad integer value of setting - %1 ++ 整數值設定不正確 - %1 + + +- +- Bad integer value +- 整數值不正確 ++ ++ Bad integer value ++ 整數值不正確 + + +- +- Setting %1 is not of integer type +- 設定 %1 不是整數類型 ++ ++ Setting %1 is not of integer type ++ 設定 %1 不是整數類型 + + +- +- Setting is not of integer type +- 設定不是整數類型 ++ ++ Setting is not of integer type ++ 設定不是整數類型 + + +- +- Setting %1 is not of string type +- 設定 %1 不是字串類型 ++ ++ Setting %1 is not of string type ++ 設定 %1 不是字串類型 + + +- +- Setting is not of string type +- 設定不是字串類型 ++ ++ Setting is not of string type ++ 設定不是字串類型 + + +- +- Opening the configuration file failed +- 開啟設定檔失敗 ++ ++ Opening the configuration file failed ++ 開啟設定檔失敗 + + +- +- The configuration file is malformed +- 設定檔格式不正確 ++ ++ The configuration file is malformed ++ 設定檔格式不正確 + + +- +- Fatal failure +- 無法挽回的失敗 ++ ++ Fatal failure ++ 無法挽回的失敗 + + +- +- Unknown error +- 未知的錯誤 ++ ++ Unknown error ++ 未知的錯誤 + +- +- ++ ++ + PackageChooserPage + +- +- Product Name +- 產品名稱 ++ ++ Product Name ++ 產品名稱 + + +- +- TextLabel +- 文字標籤 ++ ++ TextLabel ++ 文字標籤 + + +- +- Long Product Description +- 較長的產品描述 ++ ++ Long Product Description ++ 較長的產品描述 + + +- +- Package Selection +- 軟體包選擇 ++ ++ Package Selection ++ 軟體包選擇 + + +- +- Please pick a product from the list. The selected product will be installed. +- 請從清單中挑選產品。將會安裝選定的產品。 ++ ++ Please pick a product from the list. The selected product will be installed. ++ 請從清單中挑選產品。將會安裝選定的產品。 + +- +- ++ ++ + PackageModel + +- +- Name +- 名稱 ++ ++ Name ++ 名稱 + + +- +- Description +- 描述 ++ ++ Description ++ 描述 + +- +- ++ ++ + Page_Keyboard + +- +- Keyboard model: +- 鍵盤型號: ++ ++ Keyboard model: ++ 鍵盤型號: + + +- +- Type here to test your keyboard +- 在此輸入以測試您的鍵盤 ++ ++ Type here to test your keyboard ++ 在此輸入以測試您的鍵盤 + + +- +- Switch Keyboard: +- shortcut for switching between keyboard layouts +- 切換鍵盤: ++ ++ Switch Keyboard: ++ shortcut for switching between keyboard layouts ++ 切換鍵盤: + +- +- ++ ++ + Page_UserSetup + +- +- What is your name? +- 該如何稱呼您? ++ ++ What is your name? ++ 該如何稱呼您? ++ ++ ++ ++ ++ Your Full Name ++ 您的全名 ++ ++ ++ ++ What name do you want to use to log in? ++ 您想使用何種登入名稱? ++ ++ ++ ++ ++ login ++ 登入 ++ ++ ++ ++ What is the name of this computer? ++ 這部電腦的名字是? ++ ++ ++ ++ ++ <small>This name will be used if you make the computer visible to others on a network.</small> ++ <small>若您將此電腦設定為讓網路上的其他電腦可見時將會使用此名稱。</small> ++ ++ ++ ++ ++ Computer Name ++ 電腦名稱 + + +- +- Your Full Name +- 您的全名 ++ ++ ++ Choose a password to keep your account safe. ++ 輸入密碼以確保帳號的安全性。 + + +- +- What name do you want to use to log in? +- 您想使用何種登入名稱? ++ ++ ++ ++ ++ <small>Enter the same password twice, so that it can be checked for typing errors. A good password will contain a mixture of letters, numbers and punctuation, should be at least eight characters long, and should be changed at regular intervals.</small> ++ <small>輸入同一個密碼兩次,以檢查輸入錯誤。一個好的密碼包含了字母、數字及標點符號的組合、至少八個字母長,且按一固定週期更換。</small> + + +- +- login +- 登入 ++ ++ ++ ++ ++ Password ++ 密碼 + + +- +- What is the name of this computer? +- 這部電腦的名字是? ++ ++ ++ ++ ++ Repeat Password ++ 確認密碼 + + +- +- <small>This name will be used if you make the computer visible to others on a network.</small> +- <small>若您將此電腦設定為讓網路上的其他電腦可見時將會使用此名稱。</small> ++ ++ ++ When this box is checked, password-strength checking is done and you will not be able to use a weak password. ++ 當此勾選框被勾選,密碼強度檢查即完成,您也無法再使用弱密碼。 + + +- +- Computer Name +- 電腦名稱 ++ ++ ++ Require strong passwords. ++ 需要強密碼。 + + +- +- Choose a password to keep your account safe. +- 輸入密碼以確保帳號的安全性。 ++ ++ ++ Log in automatically without asking for the password. ++ 不詢問密碼自動登入。 + + +- +- +- <small>Enter the same password twice, so that it can be checked for typing errors. A good password will contain a mixture of letters, numbers and punctuation, should be at least eight characters long, and should be changed at regular intervals.</small> +- <small>輸入同一個密碼兩次,以檢查輸入錯誤。一個好的密碼包含了字母、數字及標點符號的組合、至少八個字母長,且按一固定週期更換。</small> ++ ++ Use the same password for the administrator account. ++ 為管理員帳號使用同樣的密碼。 + + +- +- +- Password +- 密碼 ++ ++ ++ Use Active Directory ++ + + +- +- +- Repeat Password +- 確認密碼 ++ ++ ++ Domain: ++ + + +- +- When this box is checked, password-strength checking is done and you will not be able to use a weak password. +- 當此勾選框被勾選,密碼強度檢查即完成,您也無法再使用弱密碼。 ++ ++ ++ Domain Administrator: ++ + + +- +- Require strong passwords. +- 需要強密碼。 ++ ++ ++ Password: ++ + + +- +- Log in automatically without asking for the password. +- 不詢問密碼自動登入。 ++ ++ ++ IP Address (optional): ++ + + +- +- Use the same password for the administrator account. +- 為管理員帳號使用同樣的密碼。 ++ ++ your name ++ 姓名 + + +- +- Choose a password for the administrator account. +- 替系統管理員帳號設定一組密碼 ++ ++ user name ++ 使用者名稱 + + +- +- +- <small>Enter the same password twice, so that it can be checked for typing errors.</small> +- <small>輸入同樣的密碼兩次,這樣可以檢查輸入錯誤。</small> ++ ++ computer name ++ 計算機名稱 + +- +- ++ ++ ++ Use the same password for the root account. ++ 為管理員帳號使用同樣的密碼。 ++ ++ ++ ++ ++ Choose a password for the administrator account. ++ 替系統管理員帳號設定一組密碼 ++ ++ ++ ++ ++ ++ ++ <small>Enter the same password twice, so that it can be checked for typing errors.</small> ++ <small>輸入同樣的密碼兩次,這樣可以檢查輸入錯誤。</small> ++ ++ ++ + PartitionLabelsView + +- +- Root +- 根目錄 ++ ++ Root ++ 根目錄 + + +- +- Home +- @label +- 家目錄 ++ ++ Home ++ @label ++ 家目錄 + + +- +- Boot +- @label +- Boot ++ ++ Boot ++ @label ++ Boot + + +- +- EFI system +- @label +- EFI 系統 ++ ++ EFI system ++ @label ++ EFI 系統 + + +- +- Swap +- @label +- Swap ++ ++ Swap ++ @label ++ Swap + + +- +- New partition for %1 +- @label +- %1 的新分割區 ++ ++ New partition for %1 ++ @label ++ %1 的新分割區 + + +- +- New partition +- @label +- 新分割區 ++ ++ New partition ++ @label ++ 新分割區 + + +- +- %1 %2 +- size[number] filesystem[name] +- %1 %2 ++ ++ %1 %2 ++ size[number] filesystem[name] ++ %1 %2 + +- +- ++ ++ + PartitionModel + +- +- +- Free Space +- @title +- 剩餘空間 ++ ++ ++ Free Space ++ @title ++ 剩餘空間 + + +- +- +- New Partition +- @title +- 新分割區 ++ ++ ++ New Partition ++ @title ++ 新分割區 + + +- +- Name +- @title +- 名稱 ++ ++ Name ++ @title ++ 名稱 + + +- +- File System +- @title +- 檔案系統 ++ ++ File System ++ @title ++ 檔案系統 + + +- +- File System Label +- @title +- 檔案系統標籤 ++ ++ File System Label ++ @title ++ 檔案系統標籤 + + +- +- Mount Point +- @title +- 掛載點 ++ ++ Mount Point ++ @title ++ 掛載點 + + +- +- Size +- @title +- 大小 ++ ++ Size ++ @title ++ 大小 + +- +- ++ ++ + PartitionPage + +- +- Storage de&vice: +- 儲存裝置(&V): ++ ++ Storage de&vice: ++ 儲存裝置(&V): + + +- +- &Revert All Changes +- 將所有變更恢復原狀 (&R) ++ ++ &Revert All Changes ++ 將所有變更恢復原狀 (&R) + + +- +- New Partition &Table +- 新的分割表格 (&T) ++ ++ New Partition &Table ++ 新的分割表格 (&T) + + +- +- Cre&ate +- 建立(&A) ++ ++ Cre&ate ++ 建立(&A) + + +- +- &Edit +- 編輯 (&E) ++ ++ &Edit ++ 編輯 (&E) + + +- +- &Delete +- 刪除 (&D) ++ ++ &Delete ++ 刪除 (&D) + + +- +- New Volume Group +- 新卷冊群組 ++ ++ New Volume Group ++ 新卷冊群組 + + +- +- Resize Volume Group +- 調整卷冊群組大小 ++ ++ Resize Volume Group ++ 調整卷冊群組大小 + + +- +- Deactivate Volume Group +- 停用卷冊群組 ++ ++ Deactivate Volume Group ++ 停用卷冊群組 + + +- +- Remove Volume Group +- 移除卷冊群組 ++ ++ Remove Volume Group ++ 移除卷冊群組 + + +- +- I&nstall boot loader on: +- 安裝開機管理程式於: ++ ++ I&nstall boot loader on: ++ 安裝開機管理程式於: + + +- +- Are you sure you want to create a new partition table on %1? +- 您是否確定要在 %1 上建立一個新的分割區表格? ++ ++ Are you sure you want to create a new partition table on %1? ++ 您是否確定要在 %1 上建立一個新的分割區表格? + + +- +- Can not create new partition +- 無法建立新分割區 ++ ++ Can not create new partition ++ 無法建立新分割區 + + +- +- The partition table on %1 already has %2 primary partitions, and no more can be added. Please remove one primary partition and add an extended partition, instead. +- 在 %1 上的分割表已有 %2 個主要分割區,無法再新增。請移除一個主要分割區並新增一個延伸分割區。 ++ ++ The partition table on %1 already has %2 primary partitions, and no more can be added. Please remove one primary partition and add an extended partition, instead. ++ 在 %1 上的分割表已有 %2 個主要分割區,無法再新增。請移除一個主要分割區並新增一個延伸分割區。 + +- +- ++ ++ + PartitionViewStep + +- +- Gathering system information… +- @status +- 正在蒐集系統資訊…… ++ ++ Gathering system information… ++ @status ++ 正在蒐集系統資訊…… + + +- +- Partitions +- @label +- 分割區 ++ ++ Partitions ++ @label ++ 分割區 + + +- +- Install %1 <strong>alongside</strong> another operating system +- @label +- 將 %1 安裝在其他作業系統<strong>旁邊</strong> ++ ++ Install %1 <strong>alongside</strong> another operating system ++ @label ++ 將 %1 安裝在其他作業系統<strong>旁邊</strong> + + +- +- <strong>Erase</strong> disk and install %1 +- @label +- <strong>抹除</strong>磁碟並安裝 %1 ++ ++ <strong>Erase</strong> disk and install %1 ++ @label ++ <strong>抹除</strong>磁碟並安裝 %1 + + +- +- <strong>Replace</strong> a partition with %1 +- @label +- 以 %1 <strong>取代</strong>一個分割區 ++ ++ <strong>Replace</strong> a partition with %1 ++ @label ++ 以 %1 <strong>取代</strong>一個分割區 + + +- +- <strong>Manual</strong> partitioning +- @label +- <strong>手動</strong>分割 ++ ++ <strong>Manual</strong> partitioning ++ @label ++ <strong>手動</strong>分割 + + +- +- Install %1 <strong>alongside</strong> another operating system on disk <strong>%2</strong> (%3) +- @info +- 將 %1 安裝在磁碟 <strong>%2</strong> (%3) 上的另一個作業系統<strong>旁邊</strong> ++ ++ Install %1 <strong>alongside</strong> another operating system on disk <strong>%2</strong> (%3) ++ @info ++ 將 %1 安裝在磁碟 <strong>%2</strong> (%3) 上的另一個作業系統<strong>旁邊</strong> + + +- +- <strong>Erase</strong> disk <strong>%2</strong> (%3) and install %1 +- @info +- <strong>抹除</strong> 磁碟 <strong>%2</strong> (%3) 並且安裝 %1 ++ ++ <strong>Erase</strong> disk <strong>%2</strong> (%3) and install %1 ++ @info ++ <strong>抹除</strong> 磁碟 <strong>%2</strong> (%3) 並且安裝 %1 + + +- +- <strong>Replace</strong> a partition on disk <strong>%2</strong> (%3) with %1 +- @info +- 以 %1 <strong>取代</strong> 一個在磁碟 <strong>%2</strong> (%3) 上的分割區 ++ ++ <strong>Replace</strong> a partition on disk <strong>%2</strong> (%3) with %1 ++ @info ++ 以 %1 <strong>取代</strong> 一個在磁碟 <strong>%2</strong> (%3) 上的分割區 + + +- +- <strong>Manual</strong> partitioning on disk <strong>%1</strong> (%2) +- @info +- 在磁碟 <strong>%1</strong> (%2) 上<strong>手動</strong>分割 ++ ++ <strong>Manual</strong> partitioning on disk <strong>%1</strong> (%2) ++ @info ++ 在磁碟 <strong>%1</strong> (%2) 上<strong>手動</strong>分割 + + +- +- Disk <strong>%1</strong> (%2) +- @info +- 磁碟 <strong>%1</strong> (%2) ++ ++ Disk <strong>%1</strong> (%2) ++ @info ++ 磁碟 <strong>%1</strong> (%2) + + +- +- Unsafe partition actions are enabled. +- 啟用了不安全的分割動作。 ++ ++ Unsafe partition actions are enabled. ++ 啟用了不安全的分割動作。 + + +- +- Partitioning is configured to <b>always</b> fail. +- 分割被設定為<b>一律</b>失敗。 ++ ++ Partitioning is configured to <b>always</b> fail. ++ 分割被設定為<b>一律</b>失敗。 + + +- +- No partitions will be changed. +- 不會更動任何分割區。 ++ ++ No partitions will be changed. ++ 不會更動任何分割區。 + + +- +- Current: +- @label +- 目前: ++ ++ Current: ++ @label ++ 目前: + + +- +- After: +- @label +- 之後: ++ ++ After: ++ @label ++ 之後: + + +- +- An EFI system partition is necessary to start %1.<br/><br/>To configure an EFI system partition, go back and select or create a suitable filesystem. +- 要啟動 %1 必須要有 EFI 系統分割區。<br/><br/>要設定 EFI 系統分割區,返回並選取或建立適合的檔案系統。 ++ ++ An EFI system partition is necessary to start %1.<br/><br/>To configure an EFI system partition, go back and select or create a suitable filesystem. ++ 要啟動 %1 必須要有 EFI 系統分割區。<br/><br/>要設定 EFI 系統分割區,返回並選取或建立適合的檔案系統。 + + +- +- An EFI system partition is necessary to start %1.<br/><br/>The EFI system partition does not meet recommendations. It is recommended to go back and select or create a suitable filesystem. +- 要啟動 %1 必須要有 EFI 系統分割區。<br/><br/>EFI 系統分割區不符合建議。建議回到上一步並選擇或建立適合的檔案系統。 ++ ++ An EFI system partition is necessary to start %1.<br/><br/>The EFI system partition does not meet recommendations. It is recommended to go back and select or create a suitable filesystem. ++ 要啟動 %1 必須要有 EFI 系統分割區。<br/><br/>EFI 系統分割區不符合建議。建議回到上一步並選擇或建立適合的檔案系統。 + + +- +- The filesystem must be mounted on <strong>%1</strong>. +- 檔案系統必須掛載於 <strong>%1</strong>。 ++ ++ The filesystem must be mounted on <strong>%1</strong>. ++ 檔案系統必須掛載於 <strong>%1</strong>。 + + +- +- The filesystem must have type FAT32. +- 檔案系統必須有類型 FAT32。 ++ ++ The filesystem must have type FAT32. ++ 檔案系統必須有類型 FAT32。 + + +- +- The filesystem must have flag <strong>%1</strong> set. +- 檔案系統必須有旗標 <strong>%1</strong> 設定。 ++ ++ The filesystem must have flag <strong>%1</strong> set. ++ 檔案系統必須有旗標 <strong>%1</strong> 設定。 + + +- +- +- The filesystem must be at least %1 MiB in size. +- 檔案系統必須至少有 %1 MiB 的大小。 ++ ++ ++ The filesystem must be at least %1 MiB in size. ++ 檔案系統必須至少有 %1 MiB 的大小。 + + +- +- The minimum recommended size for the filesystem is %1 MiB. +- 建議的檔案系統最小大小為 %1 MiB。 ++ ++ The minimum recommended size for the filesystem is %1 MiB. ++ 建議的檔案系統最小大小為 %1 MiB。 + + +- +- You can continue without setting up an EFI system partition but your system may fail to start. +- 您可以在不設定 EFI 系統分割區的情況下繼續,但您的系統可能無法啟動。 ++ ++ You can continue without setting up an EFI system partition but your system may fail to start. ++ 您可以在不設定 EFI 系統分割區的情況下繼續,但您的系統可能無法啟動。 + + +- +- You can continue with this EFI system partition configuration but your system may fail to start. +- 您可以繼續此 EFI 系統分割區組態,但您的系統可能無法啟動。 ++ ++ You can continue with this EFI system partition configuration but your system may fail to start. ++ 您可以繼續此 EFI 系統分割區組態,但您的系統可能無法啟動。 + + +- +- No EFI system partition configured +- 未設定 EFI 系統分割區 ++ ++ No EFI system partition configured ++ 未設定 EFI 系統分割區 + + +- +- EFI system partition configured incorrectly +- EFI 系統分割區設定不正確 ++ ++ EFI system partition configured incorrectly ++ EFI 系統分割區設定不正確 + + +- +- EFI system partition recommendation +- EFI 系統分割區建議 ++ ++ EFI system partition recommendation ++ EFI 系統分割區建議 + + +- +- Option to use GPT on BIOS +- 在 BIOS 上使用 GPT 的選項 ++ ++ Option to use GPT on BIOS ++ 在 BIOS 上使用 GPT 的選項 + + +- +- A GPT partition table is the best option for all systems. This installer supports such a setup for BIOS systems too.<br/><br/>To configure a GPT partition table on BIOS, (if not done so already) go back and set the partition table to GPT, next create a 8 MB unformatted partition with the <strong>%2</strong> flag enabled.<br/><br/>An unformatted 8 MB partition is necessary to start %1 on a BIOS system with GPT. +- GPT 分割表對所有系統都是最佳選項。此安裝程式同時也支援 BIOS 系統。<br/><br/>要在 BIOS 上設定 GPT 分割表,(如果還沒有完成的話)請回上一步並將分割表設定為 GPT,然後建立 8 MB 的未格式化分割區,並啟用 <strong>%2</strong> 旗標。<br/><br/>要在 BIOS 系統上使用 GPT 分割區啟動 %1 則必須使用未格式化的 8MB 分割區。 ++ ++ A GPT partition table is the best option for all systems. This installer supports such a setup for BIOS systems too.<br/><br/>To configure a GPT partition table on BIOS, (if not done so already) go back and set the partition table to GPT, next create a 8 MB unformatted partition with the <strong>%2</strong> flag enabled.<br/><br/>An unformatted 8 MB partition is necessary to start %1 on a BIOS system with GPT. ++ GPT 分割表對所有系統都是最佳選項。此安裝程式同時也支援 BIOS 系統。<br/><br/>要在 BIOS 上設定 GPT 分割表,(如果還沒有完成的話)請回上一步並將分割表設定為 GPT,然後建立 8 MB 的未格式化分割區,並啟用 <strong>%2</strong> 旗標。<br/><br/>要在 BIOS 系統上使用 GPT 分割區啟動 %1 則必須使用未格式化的 8MB 分割區。 + + +- +- Boot partition not encrypted +- 開機分割區未加密 ++ ++ Boot partition not encrypted ++ 開機分割區未加密 + + +- +- A separate boot partition was set up together with an encrypted root partition, but the boot partition is not encrypted.<br/><br/>There are security concerns with this kind of setup, because important system files are kept on an unencrypted partition.<br/>You may continue if you wish, but filesystem unlocking will happen later during system startup.<br/>To encrypt the boot partition, go back and recreate it, selecting <strong>Encrypt</strong> in the partition creation window. +- 設定了單獨的開機分割區以及加密的根分割區,但是開機分割區並不會被加密。<br/><br/>這種設定可能會造成安全問題,因為重要的系統檔案是放在未加密的分割區中。<br/>您也可以繼續,但是檔案系統的解鎖會在系統啟動後才發生。<br/>要加密開機分割區,回到上一頁並重新建立它,並在分割區建立視窗選取<strong>加密</strong>。 ++ ++ A separate boot partition was set up together with an encrypted root partition, but the boot partition is not encrypted.<br/><br/>There are security concerns with this kind of setup, because important system files are kept on an unencrypted partition.<br/>You may continue if you wish, but filesystem unlocking will happen later during system startup.<br/>To encrypt the boot partition, go back and recreate it, selecting <strong>Encrypt</strong> in the partition creation window. ++ 設定了單獨的開機分割區以及加密的根分割區,但是開機分割區並不會被加密。<br/><br/>這種設定可能會造成安全問題,因為重要的系統檔案是放在未加密的分割區中。<br/>您也可以繼續,但是檔案系統的解鎖會在系統啟動後才發生。<br/>要加密開機分割區,回到上一頁並重新建立它,並在分割區建立視窗選取<strong>加密</strong>。 + + +- +- has at least one disk device available. +- 有至少一個可用的磁碟裝置。 ++ ++ has at least one disk device available. ++ 有至少一個可用的磁碟裝置。 + + +- +- There are no partitions to install on. +- 沒有可用於安裝的分割區。 ++ ++ There are no partitions to install on. ++ 沒有可用於安裝的分割區。 + +- +- ++ ++ + PlasmaLnfJob + +- +- Applying Plasma Look-and-Feel… +- @status +- 正在套用 Plasma 外觀與感覺…… ++ ++ Applying Plasma Look-and-Feel… ++ @status ++ 正在套用 Plasma 外觀與感覺…… + + +- +- +- Could not select KDE Plasma Look-and-Feel package +- 無法選取 KDE Plasma 外觀與感覺軟體包 ++ ++ ++ Could not select KDE Plasma Look-and-Feel package ++ 無法選取 KDE Plasma 外觀與感覺軟體包 + +- +- ++ ++ + PlasmaLnfPage + +- +- Please choose a look-and-feel for the KDE Plasma Desktop. You can also skip this step and configure the look-and-feel once the system is set up. Clicking on a look-and-feel selection will give you a live preview of that look-and-feel. +- 請為 KDE Plasma 桌面選擇外觀與感覺。您也可以跳過此步驟並在系統設定好之後再設定。在外觀與感覺小節點按將會給您特定外觀與感覺的即時預覽。 ++ ++ Please choose a look-and-feel for the KDE Plasma Desktop. You can also skip this step and configure the look-and-feel once the system is set up. Clicking on a look-and-feel selection will give you a live preview of that look-and-feel. ++ 請為 KDE Plasma 桌面選擇外觀與感覺。您也可以跳過此步驟並在系統設定好之後再設定。在外觀與感覺小節點按將會給您特定外觀與感覺的即時預覽。 + + +- +- Please choose a look-and-feel for the KDE Plasma Desktop. You can also skip this step and configure the look-and-feel once the system is installed. Clicking on a look-and-feel selection will give you a live preview of that look-and-feel. +- 請為 KDE Plasma 桌面選擇外觀與感覺。您也可以跳過此步驟並在系統安裝好之後再設定。在外觀與感覺小節點按將會給您特定外觀與感覺的即時預覽。 ++ ++ Please choose a look-and-feel for the KDE Plasma Desktop. You can also skip this step and configure the look-and-feel once the system is installed. Clicking on a look-and-feel selection will give you a live preview of that look-and-feel. ++ 請為 KDE Plasma 桌面選擇外觀與感覺。您也可以跳過此步驟並在系統安裝好之後再設定。在外觀與感覺小節點按將會給您特定外觀與感覺的即時預覽。 + +- +- ++ ++ + PlasmaLnfViewStep + +- +- Look-and-Feel +- @label +- 外觀與感覺 ++ ++ Look-and-Feel ++ @label ++ 外觀與感覺 + +- +- ++ ++ ++ PowerManagementInterface ++ ++ ++ Calamares ++ ++ ++ ++ ++ Installation in progress ++ @status ++ ++ ++ ++ + PreserveFiles + +- +- Saving files for later… +- @status +- 儲存檔案以供日後使用…… ++ ++ Saving files for later… ++ @status ++ 儲存檔案以供日後使用…… + + +- +- No files configured to save for later. +- 沒有檔案被設定為稍後儲存。 ++ ++ No files configured to save for later. ++ 沒有檔案被設定為稍後儲存。 + + +- +- Not all of the configured files could be preserved. +- 並非所有已設定的檔案都可以被保留。 ++ ++ Not all of the configured files could be preserved. ++ 並非所有已設定的檔案都可以被保留。 + +- +- ++ ++ + ProcessResult + +- +- ++ ++ + There was no output from the command. +- ++ + 指令沒有輸出。 + + +- +- ++ ++ + Output: + +- ++ + 輸出: + + + +- +- External command crashed. +- 外部指令當機。 ++ ++ External command crashed. ++ 外部指令當機。 + + +- +- Command <i>%1</i> crashed. +- 指令 <i>%1</i> 已當機。 ++ ++ Command <i>%1</i> crashed. ++ 指令 <i>%1</i> 已當機。 + + +- +- External command failed to start. +- 外部指令啟動失敗。 ++ ++ External command failed to start. ++ 外部指令啟動失敗。 + + +- +- Command <i>%1</i> failed to start. +- 指令 <i>%1</i> 啟動失敗。 ++ ++ Command <i>%1</i> failed to start. ++ 指令 <i>%1</i> 啟動失敗。 + + +- +- Internal error when starting command. +- 當啟動指令時發生內部錯誤。 ++ ++ Internal error when starting command. ++ 當啟動指令時發生內部錯誤。 + + +- +- Bad parameters for process job call. +- 呼叫程序的參數無效。 ++ ++ Bad parameters for process job call. ++ 呼叫程序的參數無效。 + + +- +- External command failed to finish. +- 外部指令結束失敗。 ++ ++ External command failed to finish. ++ 外部指令結束失敗。 + + +- +- Command <i>%1</i> failed to finish in %2 seconds. +- 指令 <i>%1</i> 在結束 %2 秒內失敗。 ++ ++ Command <i>%1</i> failed to finish in %2 seconds. ++ 指令 <i>%1</i> 在結束 %2 秒內失敗。 + + +- +- External command finished with errors. +- 外部指令結束時發生錯誤。 ++ ++ External command finished with errors. ++ 外部指令結束時發生錯誤。 + + +- +- Command <i>%1</i> finished with exit code %2. +- 指令 <i>%1</i> 結束時有錯誤碼 %2。 ++ ++ Command <i>%1</i> finished with exit code %2. ++ 指令 <i>%1</i> 結束時有錯誤碼 %2。 + +- +- ++ ++ + QObject + +- +- %1 (%2) +- %1 (%2) ++ ++ %1 (%2) ++ %1 (%2) + + +- +- unknown +- @partition info +- 未知 ++ ++ unknown ++ @partition info ++ 未知 + + +- +- extended +- @partition info +- 延伸分割區 ++ ++ extended ++ @partition info ++ 延伸分割區 + + +- +- unformatted +- @partition info +- 未格式化 ++ ++ unformatted ++ @partition info ++ 未格式化 + + +- +- swap +- @partition info +- swap ++ ++ swap ++ @partition info ++ swap + + +- +- +- Default +- 預設值 ++ ++ ++ Default ++ 預設值 + + +- +- Directory not found +- 找不到目錄 ++ ++ Directory not found ++ 找不到目錄 + + +- +- Could not create new random file <pre>%1</pre>. +- 無法建立新的隨機檔案 <pre>%1</pre>。 ++ ++ Could not create new random file <pre>%1</pre>. ++ 無法建立新的隨機檔案 <pre>%1</pre>。 + + +- +- No product +- 沒有產品 ++ ++ No product ++ 沒有產品 + + +- +- No description provided. +- 未提供描述。 ++ ++ No description provided. ++ 未提供描述。 + + +- +- (no mount point) +- (沒有掛載點) ++ ++ (no mount point) ++ (沒有掛載點) + + +- +- Unpartitioned space or unknown partition table +- @info +- 尚未分割的空間或是不明的分割表 ++ ++ Unpartitioned space or unknown partition table ++ @info ++ 尚未分割的空間或是不明的分割表 + +- +- ++ ++ + Recommended + +- +- <p>This computer does not satisfy some of the recommended requirements for setting up %1.<br/> ++ ++ <p>This computer does not satisfy some of the recommended requirements for setting up %1.<br/> + Setup can continue, but some features might be disabled.</p> +- <p>此電腦未滿足部份安裝 %1 的建議系統需求。<br/> ++ <p>此電腦未滿足部份安裝 %1 的建議系統需求。<br/> + 可以繼續安裝,但某些功能可能會被停用。</p> + +- +- ++ ++ + RemoveUserJob + +- +- Removing live user from the target system… +- @status +- 正在從目標系統移除 live 使用者…… ++ ++ Removing live user from the target system… ++ @status ++ 正在從目標系統移除 live 使用者…… + +- +- ++ ++ + RemoveVolumeGroupJob + +- +- +- Removing Volume Group named %1… +- @status +- 正在移除名為 %1 的卷冊群組…… ++ ++ ++ Removing Volume Group named %1… ++ @status ++ 正在移除名為 %1 的卷冊群組…… + + +- +- Removing Volume Group named <strong>%1</strong>… +- @status +- 正在移除名為 <strong>%1</strong> 的卷冊群組…… ++ ++ Removing Volume Group named <strong>%1</strong>… ++ @status ++ 正在移除名為 <strong>%1</strong> 的卷冊群組…… + + +- +- The installer failed to remove a volume group named '%1'. +- 安裝程式移除名為「%1」的新卷冊群組失敗。 ++ ++ The installer failed to remove a volume group named '%1'. ++ 安裝程式移除名為「%1」的新卷冊群組失敗。 + +- +- ++ ++ + Requirements + +- +- <p>This computer does not satisfy the minimum requirements for installing %1.<br/> ++ ++ <p>This computer does not satisfy the minimum requirements for installing %1.<br/> + Installation cannot continue.</p> +- <p>此電腦未滿足安裝 %1 的最低系統需求。<br/> ++ <p>此電腦未滿足安裝 %1 的最低系統需求。<br/> + 無法繼˙續安裝。</p> + + +- +- <p>This computer does not satisfy some of the recommended requirements for setting up %1.<br/> ++ ++ <p>This computer does not satisfy some of the recommended requirements for setting up %1.<br/> + Setup can continue, but some features might be disabled.</p> +- <p>此電腦未滿足部份安裝 %1 的建議系統需求。<br/> ++ <p>此電腦未滿足部份安裝 %1 的建議系統需求。<br/> + 可以繼續安裝,但某些功能可能會被停用。</p> + +- +- ++ ++ + ResizeFSJob + +- +- Performing file system resize… +- @status +- 正在調整檔案系統大小…… ++ ++ Performing file system resize… ++ @status ++ 正在調整檔案系統大小…… + + +- +- Invalid configuration +- @error +- 無效的設定 ++ ++ Invalid configuration ++ @error ++ 無效的設定 + + +- +- The file-system resize job has an invalid configuration and will not run. +- @error +- 檔案系統調整大小工作有無效的設定且將不會執行。 ++ ++ The file-system resize job has an invalid configuration and will not run. ++ @error ++ 檔案系統調整大小工作有無效的設定且將不會執行。 + + +- +- KPMCore not available +- @error +- KPMCore 未提供 ++ ++ KPMCore not available ++ @error ++ KPMCore 未提供 + + +- +- Calamares cannot start KPMCore for the file system resize job. +- @error +- Calamares 無法啟動 KPMCore 來進行調整檔案系統大小的工作。 ++ ++ Calamares cannot start KPMCore for the file system resize job. ++ @error ++ Calamares 無法啟動 KPMCore 來進行調整檔案系統大小的工作。 + + +- +- Resize failed. +- @error +- 調整大小失敗。 ++ ++ Resize failed. ++ @error ++ 調整大小失敗。 + + +- +- The filesystem %1 could not be found in this system, and cannot be resized. +- @info +- 檔案系統 %1 在此系統中找不到,且無法調整大小。 ++ ++ The filesystem %1 could not be found in this system, and cannot be resized. ++ @info ++ 檔案系統 %1 在此系統中找不到,且無法調整大小。 + + +- +- The device %1 could not be found in this system, and cannot be resized. +- @info +- 裝置 %1 在此系統中找不到,且無法調整大小。 ++ ++ The device %1 could not be found in this system, and cannot be resized. ++ @info ++ 裝置 %1 在此系統中找不到,且無法調整大小。 + + +- +- +- +- +- Resize Failed +- @error +- 調整大小失敗 ++ ++ ++ ++ ++ Resize Failed ++ @error ++ 調整大小失敗 + + +- +- +- The filesystem %1 cannot be resized. +- @error +- 檔案系統 %1 無法調整大小。 ++ ++ ++ The filesystem %1 cannot be resized. ++ @error ++ 檔案系統 %1 無法調整大小。 + + +- +- +- The device %1 cannot be resized. +- @error +- 裝置 %1 無法調整大小。 ++ ++ ++ The device %1 cannot be resized. ++ @error ++ 裝置 %1 無法調整大小。 + + +- +- The file system %1 must be resized, but cannot. +- @info +- 檔案系統 %1 必須調整大小,但是無法調整。 ++ ++ The file system %1 must be resized, but cannot. ++ @info ++ 檔案系統 %1 必須調整大小,但是無法調整。 + + +- +- The device %1 must be resized, but cannot +- @info +- 裝置 %1 必須調整大小,但是無法調整。 ++ ++ The device %1 must be resized, but cannot ++ @info ++ 裝置 %1 必須調整大小,但是無法調整。 + +- +- ++ ++ + ResizePartitionJob + +- +- Resize partition %1 +- @title +- 調整分割區 %1 大小 ++ ++ Resize partition %1 ++ @title ++ 調整分割區 %1 大小 + + +- +- Resize <strong>%2MiB</strong> partition <strong>%1</strong> to <strong>%3MiB</strong> +- @info +- 調整 <strong>%2MiB</strong> 分割區 <strong>%1</strong> 大小為 <strong>%3MiB</strong> ++ ++ Resize <strong>%2MiB</strong> partition <strong>%1</strong> to <strong>%3MiB</strong> ++ @info ++ 調整 <strong>%2MiB</strong> 分割區 <strong>%1</strong> 大小為 <strong>%3MiB</strong> + + +- +- Resizing %2MiB partition %1 to %3MiB… +- @status +- 正在調整 %2MiB 分割區 %1 大小為 %3MiB…… ++ ++ Resizing %2MiB partition %1 to %3MiB… ++ @status ++ 正在調整 %2MiB 分割區 %1 大小為 %3MiB…… + + +- +- The installer failed to resize partition %1 on disk '%2'. +- 安裝程式調整在磁碟 '%2' 上的分割區 %1 的大小失敗。 ++ ++ The installer failed to resize partition %1 on disk '%2'. ++ 安裝程式調整在磁碟 '%2' 上的分割區 %1 的大小失敗。 + +- +- ++ ++ + ResizeVolumeGroupDialog + +- +- Resize Volume Group +- @title +- 調整卷冊群組大小 ++ ++ Resize Volume Group ++ @title ++ 調整卷冊群組大小 + +- +- ++ ++ + ResizeVolumeGroupJob + +- +- Resize volume group named %1 from %2 to %3 +- @title +- 調整名為 %1 的卷冊群組從 %2 到 %3 ++ ++ Resize volume group named %1 from %2 to %3 ++ @title ++ 調整名為 %1 的卷冊群組從 %2 到 %3 + + +- +- Resize volume group named <strong>%1</strong> from <strong>%2</strong> to <strong>%3</strong> +- @info +- 調整名為 <strong>%1</strong> 的卷冊群組從 <strong>%2</strong> 到 <strong>%3</strong> ++ ++ Resize volume group named <strong>%1</strong> from <strong>%2</strong> to <strong>%3</strong> ++ @info ++ 調整名為 <strong>%1</strong> 的卷冊群組從 <strong>%2</strong> 到 <strong>%3</strong> + + +- +- Resizing volume group named %1 from %2 to %3… +- @status +- 正在調整名為 %1 的卷冊群組從 %2 到 %3…… ++ ++ Resizing volume group named %1 from %2 to %3… ++ @status ++ 正在調整名為 %1 的卷冊群組從 %2 到 %3…… + + +- +- The installer failed to resize a volume group named '%1'. +- 安裝程式對名為「%1」的新卷冊群組調整大小失敗。 ++ ++ The installer failed to resize a volume group named '%1'. ++ 安裝程式對名為「%1」的新卷冊群組調整大小失敗。 + +- +- ++ ++ + ResultsListWidget + +- +- Checking requirements again in a few seconds ... +- 幾秒鐘後再次檢查要求…… ++ ++ Checking requirements again in a few seconds ... ++ 幾秒鐘後再次檢查要求…… + +- +- ++ ++ + ScanningDialog + +- +- Scanning storage devices… +- @status +- 正在掃描儲存裝置…… ++ ++ Scanning storage devices… ++ @status ++ 正在掃描儲存裝置…… + + +- +- Partitioning… +- @status +- 正在進行分割…… ++ ++ Partitioning… ++ @status ++ 正在進行分割…… + +- +- ++ ++ + SetHostNameJob + +- +- Set hostname %1 +- 設定主機名 %1 ++ ++ Set hostname %1 ++ 設定主機名 %1 + + +- +- Set hostname <strong>%1</strong>. +- 設定主機名稱 <strong>%1</strong>。 ++ ++ Set hostname <strong>%1</strong>. ++ 設定主機名稱 <strong>%1</strong>。 + + +- +- Setting hostname %1… +- @status +- 正在設定主機名稱 %1…… ++ ++ Setting hostname %1… ++ @status ++ 正在設定主機名稱 %1…… + + +- +- +- Internal Error +- 內部錯誤 ++ ++ ++ Internal Error ++ 內部錯誤 + + +- +- +- Cannot write hostname to target system +- 無法寫入主機名稱到目標系統 ++ ++ ++ Cannot write hostname to target system ++ 無法寫入主機名稱到目標系統 + +- +- ++ ++ + SetKeyboardLayoutJob + +- +- Setting keyboard model to %1, layout as %2-%3… +- @status, %1 model, %2 layout, %3 variant +- 正在將鍵盤型號設定為 %1,鍵盤佈局為 %2-%3…… ++ ++ Setting keyboard model to %1, layout as %2-%3… ++ @status, %1 model, %2 layout, %3 variant ++ 正在將鍵盤型號設定為 %1,鍵盤佈局為 %2-%3…… + + +- +- Failed to write keyboard configuration for the virtual console. +- @error +- 為虛擬終端機寫入鍵盤設定失敗。 ++ ++ Failed to write keyboard configuration for the virtual console. ++ @error ++ 為虛擬終端機寫入鍵盤設定失敗。 + + +- +- Failed to write to %1 +- @error, %1 is virtual console configuration path +- 寫入到 %1 失敗 ++ ++ Failed to write to %1 ++ @error, %1 is virtual console configuration path ++ 寫入到 %1 失敗 + + +- +- Failed to write keyboard configuration for X11. +- @error +- 為 X11 寫入鍵盤設定失敗。 ++ ++ Failed to write keyboard configuration for X11. ++ @error ++ 為 X11 寫入鍵盤設定失敗。 + + +- +- Failed to write to %1 +- @error, %1 is keyboard configuration path +- 寫入到 %1 失敗 ++ ++ Failed to write to %1 ++ @error, %1 is keyboard configuration path ++ 寫入到 %1 失敗 + + +- +- Failed to write keyboard configuration to existing /etc/default directory. +- @error +- 寫入鍵盤設定到已存在的 /etc/default 目錄失敗。 ++ ++ Failed to write keyboard configuration to existing /etc/default directory. ++ @error ++ 寫入鍵盤設定到已存在的 /etc/default 目錄失敗。 + + +- +- Failed to write to %1 +- @error, %1 is default keyboard path +- 寫入到 %1 失敗 ++ ++ Failed to write to %1 ++ @error, %1 is default keyboard path ++ 寫入到 %1 失敗 + +- +- ++ ++ + SetPartFlagsJob + +- +- Set flags on partition %1 +- @title +- 設定分割區 %1 的旗標 ++ ++ Set flags on partition %1 ++ @title ++ 設定分割區 %1 的旗標 + + +- +- Set flags on %1MiB %2 partition +- @title +- 設定 %1MiB %2 分割區的旗標 ++ ++ Set flags on %1MiB %2 partition ++ @title ++ 設定 %1MiB %2 分割區的旗標 + + +- +- Set flags on new partition +- @title +- 設定新分割區的旗標 ++ ++ Set flags on new partition ++ @title ++ 設定新分割區的旗標 + + +- +- Clear flags on partition <strong>%1</strong> +- @info +- 清除分割區 <strong>%1</strong> 的旗標 ++ ++ Clear flags on partition <strong>%1</strong> ++ @info ++ 清除分割區 <strong>%1</strong> 的旗標 + + +- +- Clear flags on %1MiB <strong>%2</strong> partition +- @info +- 清除 %1MiB <strong>%2</strong> 分割區的旗標 ++ ++ Clear flags on %1MiB <strong>%2</strong> partition ++ @info ++ 清除 %1MiB <strong>%2</strong> 分割區的旗標 + + +- +- Clear flags on new partition +- @info +- 清除新分割區的旗標 ++ ++ Clear flags on new partition ++ @info ++ 清除新分割區的旗標 + + +- +- Set flags on partition <strong>%1</strong> to <strong>%2</strong> +- @info +- 設定分割區 <strong>%1</strong> 的旗標為 <strong>%2</strong> ++ ++ Set flags on partition <strong>%1</strong> to <strong>%2</strong> ++ @info ++ 設定分割區 <strong>%1</strong> 的旗標為 <strong>%2</strong> + + +- +- Set flags on %1MiB <strong>%2</strong> partition to <strong>%3</strong> +- @info +- 將 %1MiB <strong>%2</strong> 分割區標記為 <strong>%3</strong> ++ ++ Set flags on %1MiB <strong>%2</strong> partition to <strong>%3</strong> ++ @info ++ 將 %1MiB <strong>%2</strong> 分割區標記為 <strong>%3</strong> + + +- +- Set flags on new partition to <strong>%1</strong> +- @info +- 設定新分割區的旗標為 <strong>%1</strong> ++ ++ Set flags on new partition to <strong>%1</strong> ++ @info ++ 設定新分割區的旗標為 <strong>%1</strong> + + +- +- Clearing flags on partition <strong>%1</strong>… +- @status +- 正在清除分割區 <strong>%1</strong> 的旗標…… ++ ++ Clearing flags on partition <strong>%1</strong>… ++ @status ++ 正在清除分割區 <strong>%1</strong> 的旗標…… + + +- +- Clearing flags on %1MiB <strong>%2</strong> partition… +- @status +- 正在清除 %1MiB <strong>%2</strong> 分割區的旗標…… ++ ++ Clearing flags on %1MiB <strong>%2</strong> partition… ++ @status ++ 正在清除 %1MiB <strong>%2</strong> 分割區的旗標…… + + +- +- Clearing flags on new partition… +- @status +- 清除新分割區的旗標…… ++ ++ Clearing flags on new partition… ++ @status ++ 清除新分割區的旗標…… + + +- +- Setting flags <strong>%2</strong> on partition <strong>%1</strong>… +- @status +- 正在設定 <strong>%1</strong> 分割區的 <strong>%2</strong> 旗標…… ++ ++ Setting flags <strong>%2</strong> on partition <strong>%1</strong>… ++ @status ++ 正在設定 <strong>%1</strong> 分割區的 <strong>%2</strong> 旗標…… + + +- +- Setting flags <strong>%3</strong> on %1MiB <strong>%2</strong> partition… +- @status +- 正在設定 %1MiB <strong>%2</strong> 分割區的 <strong>%3</strong> 旗標…… ++ ++ Setting flags <strong>%3</strong> on %1MiB <strong>%2</strong> partition… ++ @status ++ 正在設定 %1MiB <strong>%2</strong> 分割區的 <strong>%3</strong> 旗標…… + + +- +- Setting flags <strong>%1</strong> on new partition… +- @status +- 正在設定新分割區的 <strong>%1</strong> 旗標…… ++ ++ Setting flags <strong>%1</strong> on new partition… ++ @status ++ 正在設定新分割區的 <strong>%1</strong> 旗標…… + + +- +- The installer failed to set flags on partition %1. +- 安裝程式未能在分割區 %1 設定旗標。 ++ ++ The installer failed to set flags on partition %1. ++ 安裝程式未能在分割區 %1 設定旗標。 + +- +- ++ ++ + SetPasswordJob + +- +- Set password for user %1 +- 為使用者 %1 設定密碼 ++ ++ Set password for user %1 ++ 為使用者 %1 設定密碼 + + +- +- Setting password for user %1… +- @status +- 正在為使用者 %1 設定密碼…… ++ ++ Setting password for user %1… ++ @status ++ 正在為使用者 %1 設定密碼…… + + +- +- Bad destination system path. +- 非法的目標系統路徑。 ++ ++ Bad destination system path. ++ 非法的目標系統路徑。 + + +- +- rootMountPoint is %1 +- 根掛載點為 %1 ++ ++ rootMountPoint is %1 ++ 根掛載點為 %1 + + +- +- Cannot disable root account. +- 無法停用 root 帳號。 ++ ++ Cannot disable root account. ++ 無法停用 root 帳號。 + + +- +- +- usermod terminated with error code %1. +- usermod 以錯誤代碼 %1 終止。 ++ ++ ++ usermod terminated with error code %1. ++ usermod 以錯誤代碼 %1 終止。 + + +- +- Cannot set password for user %1. +- 無法為使用者 %1 設定密碼。 ++ ++ Cannot set password for user %1. ++ 無法為使用者 %1 設定密碼。 + +- +- ++ ++ + SetTimezoneJob + +- +- Setting timezone to %1/%2… +- @status +- 正在設定時區為 %1/%2…… ++ ++ Setting timezone to %1/%2… ++ @status ++ 正在設定時區為 %1/%2…… + + +- +- Cannot access selected timezone path. +- @error +- 無法存取指定的時區路徑。 ++ ++ Cannot access selected timezone path. ++ @error ++ 無法存取指定的時區路徑。 + + +- +- Bad path: %1 +- @error +- 非法路徑:%1 ++ ++ Bad path: %1 ++ @error ++ 非法路徑:%1 + + +- +- +- Cannot set timezone. +- @error +- 無法設定時區。 ++ ++ ++ Cannot set timezone. ++ @error ++ 無法設定時區。 + + +- +- Link creation failed, target: %1; link name: %2 +- @info +- 連結建立失敗,目標:%1;連結名稱:%2 ++ ++ Link creation failed, target: %1; link name: %2 ++ @info ++ 連結建立失敗,目標:%1;連結名稱:%2 + + +- +- Cannot open /etc/timezone for writing +- @info +- 無法開啟要寫入的 /etc/timezone ++ ++ Cannot open /etc/timezone for writing ++ @info ++ 無法開啟要寫入的 /etc/timezone + +- +- ++ ++ + SetupGroupsJob + +- +- Preparing groups… +- @status +- 正在準備群組…… ++ ++ Preparing groups… ++ @status ++ 正在準備群組…… + + +- +- +- Could not create groups in target system +- 無法在目標系統中建立群組 ++ ++ ++ Could not create groups in target system ++ 無法在目標系統中建立群組 + + +- +- These groups are missing in the target system: %1 +- 這些群組在目標系統中不存在:%1 ++ ++ These groups are missing in the target system: %1 ++ 這些群組在目標系統中不存在:%1 + +- +- ++ ++ + SetupSudoJob + +- +- Configuring <pre>sudo</pre> users… +- @status +- 正在設定 <pre>sudo</pre> 使用者…… ++ ++ Configuring <pre>sudo</pre> users… ++ @status ++ 正在設定 <pre>sudo</pre> 使用者…… + + +- +- Cannot chmod sudoers file. +- 無法修改 sudoers 檔案權限。 ++ ++ Cannot chmod sudoers file. ++ 無法修改 sudoers 檔案權限。 + + +- +- Cannot create sudoers file for writing. +- 無法建立要寫入的 sudoers 檔案。 ++ ++ Cannot create sudoers file for writing. ++ 無法建立要寫入的 sudoers 檔案。 + +- +- ++ ++ + ShellProcessJob + +- +- Running shell processes… +- @status +- 正在執行 shell 子處理程序…… ++ ++ Running shell processes… ++ @status ++ 正在執行 shell 子處理程序…… + +- +- ++ ++ + SlideCounter + +- +- +- %L1 / %L2 +- slide counter, %1 of %2 (numeric) +- %L1 / %L2 ++ ++ ++ %L1 / %L2 ++ slide counter, %1 of %2 (numeric) ++ %L1 / %L2 + +- +- ++ ++ + StandardButtons + +- +- &OK +- 確定(&O) ++ ++ &OK ++ 確定(&O) + + +- +- &Yes +- 是(&Y) ++ ++ &Yes ++ 是(&Y) + + +- +- &No +- 否(&N) ++ ++ &No ++ 否(&N) + + +- +- &Cancel +- 取消(&C) ++ ++ &Cancel ++ 取消(&C) + + +- +- &Close +- 關閉(&C) ++ ++ &Close ++ 關閉(&C) + +- +- ++ ++ + TrackingInstallJob + +- +- Installation feedback +- 安裝回饋 ++ ++ Installation feedback ++ 安裝回饋 + + +- +- Sending installation feedback… +- @status +- 正在傳送安裝回饋…… ++ ++ Sending installation feedback… ++ @status ++ 正在傳送安裝回饋…… + + +- +- Internal error in install-tracking. +- 在安裝追蹤裡的內部錯誤。 ++ ++ Internal error in install-tracking. ++ 在安裝追蹤裡的內部錯誤。 + + +- +- HTTP request timed out. +- HTTP 請求逾時。 ++ ++ HTTP request timed out. ++ HTTP 請求逾時。 + +- +- ++ ++ + TrackingKUserFeedbackJob + +- +- KDE user feedback +- KDE 使用者回饋 ++ ++ KDE user feedback ++ KDE 使用者回饋 + + +- +- Configuring KDE user feedback… +- @status +- 正在設定 KDE 使用者回饋…… ++ ++ Configuring KDE user feedback… ++ @status ++ 正在設定 KDE 使用者回饋…… + + +- +- +- Error in KDE user feedback configuration. +- KDE 使用者回饋設定錯誤。 ++ ++ ++ Error in KDE user feedback configuration. ++ KDE 使用者回饋設定錯誤。 + + +- +- Could not configure KDE user feedback correctly, script error %1. +- 無法正確設定 KDE 使用者回饋,指令稿錯誤 %1。 ++ ++ Could not configure KDE user feedback correctly, script error %1. ++ 無法正確設定 KDE 使用者回饋,指令稿錯誤 %1。 + + +- +- Could not configure KDE user feedback correctly, Calamares error %1. +- 無法正確設定 KDE 使用者回饋,Calamares 錯誤 %1。 ++ ++ Could not configure KDE user feedback correctly, Calamares error %1. ++ 無法正確設定 KDE 使用者回饋,Calamares 錯誤 %1。 + +- +- ++ ++ + TrackingMachineUpdateManagerJob + +- +- Machine feedback +- 機器回饋 ++ ++ Machine feedback ++ 機器回饋 + + +- +- Configuring machine feedback… +- @status +- 正在設定機器回饋…… ++ ++ Configuring machine feedback… ++ @status ++ 正在設定機器回饋…… + + +- +- +- Error in machine feedback configuration. +- 在機器回饋設定中的錯誤。 ++ ++ ++ Error in machine feedback configuration. ++ 在機器回饋設定中的錯誤。 + + +- +- Could not configure machine feedback correctly, script error %1. +- 無法正確設定機器回饋,指令稿錯誤 %1。 ++ ++ Could not configure machine feedback correctly, script error %1. ++ 無法正確設定機器回饋,指令稿錯誤 %1。 + + +- +- Could not configure machine feedback correctly, Calamares error %1. +- 無法正確設定機器回饋,Calamares 錯誤 %1。 ++ ++ Could not configure machine feedback correctly, Calamares error %1. ++ 無法正確設定機器回饋,Calamares 錯誤 %1。 + +- +- ++ ++ + TrackingPage + +- +- Placeholder +- 佔位符 ++ ++ Placeholder ++ 佔位符 + + +- +- <html><head/><body><p>Click here to send <span style=" font-weight:600;">no information at all</span> about your installation.</p></body></html> +- <html><head/><body><p>點擊此處<span style=" font-weight:600;">不會傳送任何</span>關於您安裝的資訊。</p></body></html> ++ ++ <html><head/><body><p>Click here to send <span style=" font-weight:600;">no information at all</span> about your installation.</p></body></html> ++ <html><head/><body><p>點擊此處<span style=" font-weight:600;">不會傳送任何</span>關於您安裝的資訊。</p></body></html> + + +- +- <html><head/><body><p><a href="placeholder"><span style=" text-decoration: underline; color:#2980b9;">Click here for more information about user feedback</span></a></p></body></html> +- <html><head/><body><p><a href="placeholder"><span style=" text-decoration: underline; color:#2980b9;">點選這裡來取得更多關於使用者回饋的資訊</span></a></p></body></html> ++ ++ <html><head/><body><p><a href="placeholder"><span style=" text-decoration: underline; color:#2980b9;">Click here for more information about user feedback</span></a></p></body></html> ++ <html><head/><body><p><a href="placeholder"><span style=" text-decoration: underline; color:#2980b9;">點選這裡來取得更多關於使用者回饋的資訊</span></a></p></body></html> + + +- +- Tracking helps %1 to see how often it is installed, what hardware it is installed on and which applications are used. To see what will be sent, please click the help icon next to each area. +- 追蹤可以協助 %1 檢視其安裝頻率、安裝在什麼硬體上以及使用了哪些應用程式。要檢視會傳送哪些資訊,請點擊每個區域旁的說明按鈕。 ++ ++ Tracking helps %1 to see how often it is installed, what hardware it is installed on and which applications are used. To see what will be sent, please click the help icon next to each area. ++ 追蹤可以協助 %1 檢視其安裝頻率、安裝在什麼硬體上以及使用了哪些應用程式。要檢視會傳送哪些資訊,請點擊每個區域旁的說明按鈕。 + + +- +- By selecting this you will send information about your installation and hardware. This information will only be sent <b>once</b> after the installation finishes. +- 選取這個後,您將會傳送關於您的安裝與硬體的資訊。這個資訊將只會傳送</b>一次</b>,且在安裝完成後。 ++ ++ By selecting this you will send information about your installation and hardware. This information will only be sent <b>once</b> after the installation finishes. ++ 選取這個後,您將會傳送關於您的安裝與硬體的資訊。這個資訊將只會傳送</b>一次</b>,且在安裝完成後。 + + +- +- By selecting this you will periodically send information about your <b>machine</b> installation, hardware and applications, to %1. +- 選取這個後,您將會週期性地傳送關於您的<b>機器</b>安裝、硬體與應用程式的資訊給 %1。 ++ ++ By selecting this you will periodically send information about your <b>machine</b> installation, hardware and applications, to %1. ++ 選取這個後,您將會週期性地傳送關於您的<b>機器</b>安裝、硬體與應用程式的資訊給 %1。 + + +- +- By selecting this you will regularly send information about your <b>user</b> installation, hardware, applications and application usage patterns, to %1. +- 選取這個後,您將會經常傳送關於您的<b>使用者</b>安裝、硬體、應用程式與使用模式的資訊給 %1。 ++ ++ By selecting this you will regularly send information about your <b>user</b> installation, hardware, applications and application usage patterns, to %1. ++ 選取這個後,您將會經常傳送關於您的<b>使用者</b>安裝、硬體、應用程式與使用模式的資訊給 %1。 + +- +- ++ ++ + TrackingViewStep + +- +- Feedback +- @title +- 回饋 ++ ++ Feedback ++ @title ++ 回饋 + +- +- ++ ++ + UmountJob + +- +- Unmounting file systems… +- @status +- 正在解除掛載檔案系統…… ++ ++ Unmounting file systems… ++ @status ++ 正在解除掛載檔案系統…… + + +- +- No target system available. +- 沒有可用的目標系統。 ++ ++ No target system available. ++ 沒有可用的目標系統。 + + +- +- No rootMountPoint is set. +- 未設定根掛載點。 ++ ++ No rootMountPoint is set. ++ 未設定根掛載點。 + +- +- ++ ++ + UsersPage + +- +- <small>If more than one person will use this computer, you can create multiple accounts after setup.</small> +- <small>如果將會有多於一人使用這臺電腦,您可以在安裝後設定多個帳號。</small> ++ ++ <small>If more than one person will use this computer, you can create multiple accounts after setup.</small> ++ <small>如果將會有多於一人使用這臺電腦,您可以在安裝後設定多個帳號。</small> + + +- +- <small>If more than one person will use this computer, you can create multiple accounts after installation.</small> +- <small>如果將會有多於一人使用這臺電腦,您可以在安裝後設定多個帳號。</small> ++ ++ <small>If more than one person will use this computer, you can create multiple accounts after installation.</small> ++ <small>如果將會有多於一人使用這臺電腦,您可以在安裝後設定多個帳號。</small> + +- +- ++ ++ + UsersQmlViewStep + +- +- Users +- 使用者 ++ ++ Users ++ 使用者 + +- +- ++ ++ + UsersViewStep + +- +- Users +- 使用者 ++ ++ Users ++ 使用者 + +- +- ++ ++ + VariantModel + +- +- Key +- Column header for key/value +- 金鑰 ++ ++ Key ++ Column header for key/value ++ 金鑰 + + +- +- Value +- Column header for key/value +- ++ ++ Value ++ Column header for key/value ++ + +- +- ++ ++ + VolumeGroupBaseDialog + +- +- Create Volume Group +- 建立卷冊群組 ++ ++ Create Volume Group ++ 建立卷冊群組 + + +- +- List of Physical Volumes +- 物理卷冊清單 ++ ++ List of Physical Volumes ++ 物理卷冊清單 + + +- +- Volume Group Name: +- 卷冊群組名稱: ++ ++ Volume Group Name: ++ 卷冊群組名稱: + + +- +- Volume Group Type: +- 卷冊群組類型: ++ ++ Volume Group Type: ++ 卷冊群組類型: + + +- +- Physical Extent Size: +- 物理延展大小: ++ ++ Physical Extent Size: ++ 物理延展大小: + + +- +- MiB +- MiB ++ ++ MiB ++ MiB + + +- +- Total Size: +- 大小總計: ++ ++ Total Size: ++ 大小總計: + + +- +- Used Size: +- 已使用大小: ++ ++ Used Size: ++ 已使用大小: + + +- +- Total Sectors: +- 總磁區數: ++ ++ Total Sectors: ++ 總磁區數: + + +- +- Quantity of LVs: +- 邏輯卷冊數量: ++ ++ Quantity of LVs: ++ 邏輯卷冊數量: + +- +- ++ ++ + WelcomePage + +- +- +- Select application and system language +- 選取應用程式與系統語言 ++ ++ ++ Select application and system language ++ 選取應用程式與系統語言 + + +- +- Open donations website +- 開啟捐款網頁 ++ ++ language ++ + + +- +- &Donate +- 捐款(&D) ++ Open donations website ++ 開啟捐款網頁 + + +- +- Open help and support website +- 開啟說明與支援網頁 ++ &Donate ++ 捐款(&D) + + +- +- &Support +- 支援(&S) ++ Open help and support website ++ 開啟說明與支援網頁 + + +- +- Open issues and bug-tracking website +- 開啟問題與錯誤追蹤網頁 ++ &Support ++ 支援(&S) + + +- +- &Known issues +- 已知問題(&K) ++ Open issues and bug-tracking website ++ 開啟問題與錯誤追蹤網頁 + + +- +- Open release notes website +- 開啟發行記事網站 ++ &Known issues ++ 已知問題(&K) + + +- +- &Release notes +- 發行註記(&R) ++ Open release notes website ++ 開啟發行記事網站 + + +- +- About %1 Setup +- @title +- 關於 %1 安裝程式 ++ &Release notes ++ 發行註記(&R) + + +- +- About %1 Installer +- @title +- 關於 %1 安裝程式 ++ ++ About %1 Setup ++ @title ++ 關於 %1 安裝程式 + + +- +- %1 Support +- @action +- %1 支援 ++ ++ About %1 Installer ++ @title ++ 關於 %1 安裝程式 + +- +- ++ ++ %1 Support ++ @action ++ %1 支援 ++ ++ ++ + WelcomeQmlViewStep + +- +- Welcome +- @title +- 歡迎 ++ ++ Welcome ++ @title ++ 歡迎 + +- +- ++ ++ + WelcomeViewStep + +- +- Welcome +- @title +- 歡迎 ++ ++ Welcome ++ @title ++ 歡迎 + +- +- ++ ++ + ZfsJob + +- +- Creating ZFS pools and datasets… +- @status +- 正在建立 ZFS 池與資料集…… ++ ++ Creating ZFS pools and datasets… ++ @status ++ 正在建立 ZFS 池與資料集…… + + +- +- Failed to create zpool on +- 建立 zpool 失敗於 ++ ++ Failed to create zpool on ++ 建立 zpool 失敗於 + + +- +- Configuration Error +- 設定錯誤 ++ ++ Configuration Error ++ 設定錯誤 + + +- +- No partitions are available for ZFS. +- ZFS 沒有可用的分割區。 ++ ++ No partitions are available for ZFS. ++ ZFS 沒有可用的分割區。 + + +- +- Internal data missing +- 內部資料遺失 ++ ++ Internal data missing ++ 內部資料遺失 + + +- +- +- Failed to create zpool +- 建立 zpool 失敗 ++ ++ ++ Failed to create zpool ++ 建立 zpool 失敗 + + +- +- Failed to create dataset +- 建立資料集失敗 ++ ++ Failed to create dataset ++ 建立資料集失敗 + + +- +- The output was: +- 輸出為: ++ ++ The output was: ++ 輸出為: + +- +- ++ ++ + calamares-sidebar + +- +- About +- 關於 ++ ++ About ++ 關於 + + +- +- Debug +- Debug ++ ++ Debug ++ Debug + + +- +- About +- @button +- 關於 ++ ++ About ++ @button ++ 關於 + + +- +- Show information about Calamares +- @tooltip +- 顯示關於 Calamares 的資訊 ++ ++ Show information about Calamares ++ @tooltip ++ 顯示關於 Calamares 的資訊 + + +- +- Debug +- @button +- Debug ++ ++ ++ Debug ++ @button ++ Debug + + +- +- Show debug information +- @tooltip +- 顯示除錯資訊 ++ ++ ++ Show debug information ++ @tooltip ++ 顯示除錯資訊 + +- +- ++ ++ ++ Show information about easysoftware ++ @tooltip ++ ++ ++ ++ + finishedq + +- +- Installation Completed +- 安裝完成 ++ ++ Installation Completed ++ 安裝完成 + + +- +- %1 has been installed on your computer.<br/> ++ ++ %1 has been installed on your computer.<br/> + You may now restart into your new system, or continue using the Live environment. +- %1 已安裝到您的電腦上。<br/> ++ %1 已安裝到您的電腦上。<br/> + 現在,您可以重新啟動到您的新系統,或繼續使用 Live 環境。 + + +- +- Close Installer +- 關閉安裝程式 ++ ++ Close Installer ++ 關閉安裝程式 + + +- +- Restart System +- 重新啟動系統 ++ ++ Restart System ++ 重新啟動系統 + + +- +- <p>A full log of the install is available as installation.log in the home directory of the Live user.<br/> ++ ++ <p>A full log of the install is available as installation.log in the home directory of the Live user.<br/> + This log is copied to /var/log/installation.log of the target system.</p> +- <p>完整安裝紀錄檔可在 Live 使用者的家目錄中以 installation.log 的名稱取得。<br/> ++ <p>完整安裝紀錄檔可在 Live 使用者的家目錄中以 installation.log 的名稱取得。<br/> + 此紀錄檔已複製到目標系統的 /var/log/installation.log。</p> + +- +- ++ ++ + finishedq-qt6 + +- +- Installation Completed +- @title +- 安裝完成 ++ ++ Installation Completed ++ @title ++ 安裝完成 + + +- +- %1 has been installed on your computer.<br/> ++ ++ %1 has been installed on your computer.<br/> + You may now restart into your new system, or continue using the Live environment. +- @info, %1 is the product name +- %1 已安裝到您的電腦上。<br/> ++ @info, %1 is the product name ++ %1 已安裝到您的電腦上。<br/> + 現在,您可以重新啟動到您的新系統,或繼續使用 Live 環境。 + + +- +- Close Installer +- @button +- 關閉安裝程式 ++ ++ Close Installer ++ @button ++ 關閉安裝程式 + + +- +- Restart System +- @button +- 重新啟動系統 ++ ++ Restart System ++ @button ++ 重新啟動系統 + + +- +- <p>A full log of the install is available as installation.log in the home directory of the Live user.<br/> ++ ++ <p>A full log of the install is available as installation.log in the home directory of the Live user.<br/> + This log is copied to /var/log/installation.log of the target system.</p> +- @info +- <p>完整安裝紀錄檔可在 Live 使用者的家目錄中以 installation.log 的名稱取得。<br/> ++ @info ++ <p>完整安裝紀錄檔可在 Live 使用者的家目錄中以 installation.log 的名稱取得。<br/> + 此紀錄檔已複製到目標系統的 /var/log/installation.log。</p> + +- +- ++ ++ + finishedq@mobile + +- +- Installation Completed +- @title +- 安裝完成 ++ ++ Installation Completed ++ @title ++ 安裝完成 + + +- +- %1 has been installed on your computer.<br/> ++ ++ %1 has been installed on your computer.<br/> + You may now restart your device. +- @info, %1 is the product name +- %1 已安裝到您的電腦上。<br/> ++ @info, %1 is the product name ++ %1 已安裝到您的電腦上。<br/> + 您現在可以重新啟動您的裝置了。 + + +- +- Close +- @button +- 關閉 ++ ++ Close ++ @button ++ 關閉 + + +- +- Restart +- @button +- 重新啟動 ++ ++ Restart ++ @button ++ 重新啟動 + +- +- ++ ++ + keyboardq + +- +- Select a layout to activate keyboard preview +- @label +- 選取佈局以啟動鍵盤預覽 ++ ++ Select a layout to activate keyboard preview ++ @label ++ 選取佈局以啟動鍵盤預覽 + + +- +- <b>Keyboard model:&nbsp;&nbsp;</b> +- @label +- <b>鍵盤型號:&nbsp;&nbsp;</b> ++ ++ <b>Keyboard model:&nbsp;&nbsp;</b> ++ @label ++ <b>鍵盤型號:&nbsp;&nbsp;</b> + + +- +- Layout +- @label +- 配置 ++ ++ Layout ++ @label ++ 配置 + + +- +- Variant +- @label +- 變體 ++ ++ Variant ++ @label ++ 變體 + + +- +- Type here to test your keyboard… +- @label +- 在此輸入以測試您的鍵盤…… ++ ++ Type here to test your keyboard… ++ @label ++ 在此輸入以測試您的鍵盤…… + +- +- ++ ++ + keyboardq-qt6 + +- +- Select a layout to activate keyboard preview +- @label +- 選取佈局以啟動鍵盤預覽 ++ ++ Select a layout to activate keyboard preview ++ @label ++ 選取佈局以啟動鍵盤預覽 + + +- +- <b>Keyboard model:&nbsp;&nbsp;</b> +- @label +- <b>鍵盤型號:&nbsp;&nbsp;</b> ++ ++ <b>Keyboard model:&nbsp;&nbsp;</b> ++ @label ++ <b>鍵盤型號:&nbsp;&nbsp;</b> + + +- +- Layout +- @label +- 配置 ++ ++ Layout ++ @label ++ 配置 + + +- +- Variant +- @label +- 變體 ++ ++ Variant ++ @label ++ 變體 + + +- +- Type here to test your keyboard… +- @label +- 在此輸入以測試您的鍵盤…… ++ ++ Type here to test your keyboard… ++ @label ++ 在此輸入以測試您的鍵盤…… + +- +- ++ ++ + localeq + +- +- +- Change +- @button +- 變更 ++ ++ ++ Change ++ @button ++ 變更 + + +- +- <h3>Languages</h3> </br> ++ ++ <h3>Languages</h3> </br> + The system locale setting affects the language and character set for some command line user interface elements. The current setting is <strong>%1</strong>. +- @info +- <h3>語言</h3> </br> ++ @info ++ <h3>語言</h3> </br> + 系統語系設定會影響某些命令列使用者介面元素的語言與字元集。目前的設定為 <strong>%1</strong>。 + + +- +- <h3>Locales</h3> </br> ++ ++ <h3>Locales</h3> </br> + The system locale setting affects the numbers and dates format. The current setting is <strong>%1</strong>. +- @info +- <h3>語系</h3> </br> ++ @info ++ <h3>語系</h3> </br> + 系統語系設定會影響數字與日期格式。目前的設定為 <strong>%1</strong>。 + +- +- ++ ++ + localeq-qt6 + +- +- +- Change +- @button +- 變更 ++ ++ ++ Change ++ @button ++ 變更 + + +- +- <h3>Languages</h3> </br> ++ ++ <h3>Languages</h3> </br> + The system locale setting affects the language and character set for some command line user interface elements. The current setting is <strong>%1</strong>. +- @info +- <h3>語言</h3> </br> ++ @info ++ <h3>語言</h3> </br> + 系統語系設定會影響某些命令列使用者介面元素的語言與字元集。目前的設定為 <strong>%1</strong>。 + + +- +- <h3>Locales</h3> </br> ++ ++ <h3>Locales</h3> </br> + The system locale setting affects the numbers and dates format. The current setting is <strong>%1</strong>. +- @info +- <h3>語系</h3> </br> ++ @info ++ <h3>語系</h3> </br> + 系統語系設定會影響數字與日期格式。目前的設定為 <strong>%1</strong>。 + +- +- ++ ++ + notesqml + +- +- <h3>%1</h3> ++ ++ <h3>%1</h3> + <p>These are example release notes.</p> +- <h3>%1</h3> ++ <h3>%1</h3> + <p>此為發行記事範本。</p> + +- +- ++ ++ + packagechooserq + +- +- LibreOffice is a powerful and free office suite, used by millions of people around the world. It includes several applications that make it the most versatile Free and Open Source office suite on the market.<br/> ++ ++ LibreOffice is a powerful and free office suite, used by millions of people around the world. It includes several applications that make it the most versatile Free and Open Source office suite on the market.<br/> + Default option. +- LibreOffice 是強大且自由的辦公室套裝軟體,被世界上數以百萬計的人們使用。其包含了多個應用程式,使其成為市場上功能最強大的自由與開放原始碼辦公室套裝軟體。<br/> ++ LibreOffice 是強大且自由的辦公室套裝軟體,被世界上數以百萬計的人們使用。其包含了多個應用程式,使其成為市場上功能最強大的自由與開放原始碼辦公室套裝軟體。<br/> + 預設選項。 + + +- +- LibreOffice +- LibreOffice ++ ++ LibreOffice ++ LibreOffice + + +- +- If you don't want to install an office suite, just select No Office Suite. You can always add one (or more) later on your installed system as the need arrives. +- 如果您不想安裝辦公室套裝軟體,只要選取「不要辦公室套裝軟體」就好。您隨時都可以在已安裝的系統上新增一個或多個您需要的軟體。 ++ ++ If you don't want to install an office suite, just select No Office Suite. You can always add one (or more) later on your installed system as the need arrives. ++ 如果您不想安裝辦公室套裝軟體,只要選取「不要辦公室套裝軟體」就好。您隨時都可以在已安裝的系統上新增一個或多個您需要的軟體。 + + +- +- No Office Suite +- 不要辦公室套裝軟體 ++ ++ No Office Suite ++ 不要辦公室套裝軟體 + + +- +- Create a minimal Desktop install, remove all extra applications and decide later on what you would like to add to your system. Examples of what won't be on such an install, there will be no Office Suite, no media players, no image viewer or print support. It will be just a desktop, file browser, package manager, text editor and simple web-browser. +- 建立最小化的桌面安裝,移除所有額外的應用程式並稍後再決定您想要新增哪些東西到您的系統中。如此的安裝不會有什麼例子,其不會有辦公室套裝軟體、沒有多媒體播放程式、沒有圖片檢視程式或列印支援。其就只有桌面、檔案瀏覽器、軟體包管理程式、文字編輯器與簡易的網路瀏覽器。 ++ ++ Create a minimal Desktop install, remove all extra applications and decide later on what you would like to add to your system. Examples of what won't be on such an install, there will be no Office Suite, no media players, no image viewer or print support. It will be just a desktop, file browser, package manager, text editor and simple web-browser. ++ 建立最小化的桌面安裝,移除所有額外的應用程式並稍後再決定您想要新增哪些東西到您的系統中。如此的安裝不會有什麼例子,其不會有辦公室套裝軟體、沒有多媒體播放程式、沒有圖片檢視程式或列印支援。其就只有桌面、檔案瀏覽器、軟體包管理程式、文字編輯器與簡易的網路瀏覽器。 + + +- +- Minimal Install +- 最小安裝 ++ ++ Minimal Install ++ 最小安裝 + + +- +- Please select an option for your install, or use the default: LibreOffice included. +- 請選取您安裝的選項,或使用預設:包含 LibreOffice。 ++ ++ Please select an option for your install, or use the default: LibreOffice included. ++ 請選取您安裝的選項,或使用預設:包含 LibreOffice。 + +- +- ++ ++ + packagechooserq-qt6 + +- +- LibreOffice is a powerful and free office suite, used by millions of people around the world. It includes several applications that make it the most versatile Free and Open Source office suite on the market.<br/> ++ ++ LibreOffice is a powerful and free office suite, used by millions of people around the world. It includes several applications that make it the most versatile Free and Open Source office suite on the market.<br/> + Default option. +- LibreOffice 是強大且自由的辦公室套裝軟體,被世界上數以百萬計的人們使用。其包含了多個應用程式,使其成為市場上功能最強大的自由與開放原始碼辦公室套裝軟體。<br/> ++ LibreOffice 是強大且自由的辦公室套裝軟體,被世界上數以百萬計的人們使用。其包含了多個應用程式,使其成為市場上功能最強大的自由與開放原始碼辦公室套裝軟體。<br/> + 預設選項。 + + +- +- LibreOffice +- LibreOffice ++ ++ LibreOffice ++ LibreOffice + + +- +- If you don't want to install an office suite, just select No Office Suite. You can always add one (or more) later on your installed system as the need arrives. +- 如果您不想安裝辦公室套裝軟體,只要選取「不要辦公室套裝軟體」就好。您隨時都可以在已安裝的系統上新增一個或多個您需要的軟體。 ++ ++ If you don't want to install an office suite, just select No Office Suite. You can always add one (or more) later on your installed system as the need arrives. ++ 如果您不想安裝辦公室套裝軟體,只要選取「不要辦公室套裝軟體」就好。您隨時都可以在已安裝的系統上新增一個或多個您需要的軟體。 + + +- +- No Office Suite +- 不要辦公室套裝軟體 ++ ++ No Office Suite ++ 不要辦公室套裝軟體 + + +- +- Create a minimal Desktop install, remove all extra applications and decide later on what you would like to add to your system. Examples of what won't be on such an install, there will be no Office Suite, no media players, no image viewer or print support. It will be just a desktop, file browser, package manager, text editor and simple web-browser. +- 建立最小化的桌面安裝,移除所有額外的應用程式並稍後再決定您想要新增哪些東西到您的系統中。如此的安裝不會有什麼例子,其不會有辦公室套裝軟體、沒有多媒體播放程式、沒有圖片檢視程式或列印支援。其就只有桌面、檔案瀏覽器、軟體包管理程式、文字編輯器與簡易的網路瀏覽器。 ++ ++ Create a minimal Desktop install, remove all extra applications and decide later on what you would like to add to your system. Examples of what won't be on such an install, there will be no Office Suite, no media players, no image viewer or print support. It will be just a desktop, file browser, package manager, text editor and simple web-browser. ++ 建立最小化的桌面安裝,移除所有額外的應用程式並稍後再決定您想要新增哪些東西到您的系統中。如此的安裝不會有什麼例子,其不會有辦公室套裝軟體、沒有多媒體播放程式、沒有圖片檢視程式或列印支援。其就只有桌面、檔案瀏覽器、軟體包管理程式、文字編輯器與簡易的網路瀏覽器。 + + +- +- Minimal Install +- 最小安裝 ++ ++ Minimal Install ++ 最小安裝 + + +- +- Please select an option for your install, or use the default: LibreOffice included. +- 請選取您安裝的選項,或使用預設:包含 LibreOffice。 ++ ++ Please select an option for your install, or use the default: LibreOffice included. ++ 請選取您安裝的選項,或使用預設:包含 LibreOffice。 + +- +- ++ ++ + release_notes + +- +- <h3>%1</h3> ++ <h3>%1</h3> + <p>This an example QML file, showing options in RichText with Flickable content.</p> + + <p>QML with RichText can use HTML tags, Flickable content is useful for touchscreens.</p> +@@ -4888,7 +5016,7 @@ Output: + </ul> + + <p>The vertical scrollbar is adjustable, current width set to 10.</p> +- <h3>%1</h3> ++ <h3>%1</h3> + <p>這是範例 QML 檔案,展示了 RichText 的各種選項,並有可縮放的內容。</p> + + <p>有 RichText 的 QML 可以使用 HTML 標籤,可縮放的內容則對觸控螢幕非常有用。</p> +@@ -4911,335 +5039,364 @@ Output: + <p>垂直捲動軸是可調整的,目前的寬度設定為 10。</p> + + +- +- Back +- 返回 ++ ++ ### %1 ++This an example QML file, showing options in Markdown with Flickable content. ++ ++QML with RichText can use HTML tags, with Markdown it uses the simple Markdown syntax, Flickable content is useful for touchscreens. ++ ++**This is bold text** ++ ++*This is italic text* ++ ++_This is underlined text_ ++ ++> blockquote ++ ++~~This is strikethrough~~ ++ ++Code example: ++``` ++ls -l /home ++``` ++ ++**Lists:** ++ * Intel CPU systems ++ * AMD CPU systems ++ ++The vertical scrollbar is adjustable, current width set to 10. ++ ++ ++ ++ ++ Back ++ 返回 + +- +- ++ ++ + usersq + +- +- Pick your user name and credentials to login and perform admin tasks +- 挑選您的使用者名稱與憑證以登入並執行管理工作 ++ ++ Pick your user name and credentials to login and perform admin tasks ++ 挑選您的使用者名稱與憑證以登入並執行管理工作 + + +- +- What is your name? +- 該如何稱呼您? ++ ++ What is your name? ++ 該如何稱呼您? + + +- +- Your full name +- 您的全名 ++ ++ Your full name ++ 您的全名 + + +- +- What name do you want to use to log in? +- 您想使用何種登入名稱? ++ ++ What name do you want to use to log in? ++ 您想使用何種登入名稱? + + +- +- Login name +- 登入名稱 ++ ++ Login name ++ 登入名稱 + + +- +- If more than one person will use this computer, you can create multiple accounts after installation. +- 若有多於一個人使用此電腦,您可以在安裝後建立多個帳號。 ++ ++ If more than one person will use this computer, you can create multiple accounts after installation. ++ 若有多於一個人使用此電腦,您可以在安裝後建立多個帳號。 + + +- +- Only lowercase letters, numbers, underscore and hyphen are allowed. +- 僅允許小寫字母、數字、底線與連接號。 ++ ++ Only lowercase letters, numbers, underscore and hyphen are allowed. ++ 僅允許小寫字母、數字、底線與連接號。 + + +- +- root is not allowed as username. +- 不允許使用 root 作為使用者名稱。 ++ ++ root is not allowed as username. ++ 不允許使用 root 作為使用者名稱。 + + +- +- What is the name of this computer? +- 這部電腦的名字是? ++ ++ What is the name of this computer? ++ 這部電腦的名字是? + + +- +- Computer name +- 電腦名稱 ++ ++ Computer name ++ 電腦名稱 + + +- +- This name will be used if you make the computer visible to others on a network. +- 若您將此電腦設定為讓網路上的其他電腦可見時將會使用此名稱。 ++ ++ This name will be used if you make the computer visible to others on a network. ++ 若您將此電腦設定為讓網路上的其他電腦可見時將會使用此名稱。 + + +- +- Only letters, numbers, underscore and hyphen are allowed, minimal of two characters. +- 僅允許字母、數字、底線與連接號,最少兩個字元。 ++ ++ Only letters, numbers, underscore and hyphen are allowed, minimal of two characters. ++ 僅允許字母、數字、底線與連接號,最少兩個字元。 + + +- +- localhost is not allowed as hostname. +- 不允許使用 localhost 作為主機名稱。 ++ ++ localhost is not allowed as hostname. ++ 不允許使用 localhost 作為主機名稱。 + + +- +- Choose a password to keep your account safe. +- 輸入密碼以確保帳號的安全性。 ++ ++ Choose a password to keep your account safe. ++ 輸入密碼以確保帳號的安全性。 + + +- +- Password +- 密碼 ++ ++ Password ++ 密碼 + + +- +- Repeat password +- 確認密碼 ++ ++ Repeat password ++ 確認密碼 + + +- +- Enter the same password twice, so that it can be checked for typing errors. A good password will contain a mixture of letters, numbers and punctuation, should be at least eight characters long, and should be changed at regular intervals. +- 輸入同一個密碼兩次,以檢查輸入錯誤。一個好的密碼包含了字母、數字及標點符號的組合、至少八個字母長,且按一固定週期更換。 ++ ++ Enter the same password twice, so that it can be checked for typing errors. A good password will contain a mixture of letters, numbers and punctuation, should be at least eight characters long, and should be changed at regular intervals. ++ 輸入同一個密碼兩次,以檢查輸入錯誤。一個好的密碼包含了字母、數字及標點符號的組合、至少八個字母長,且按一固定週期更換。 + + +- +- Reuse user password as root password +- 重用使用者密碼為 root 密碼 ++ ++ Reuse user password as root password ++ 重用使用者密碼為 root 密碼 + + +- +- Use the same password for the administrator account. +- 為管理員帳號使用同樣的密碼。 ++ ++ Use the same password for the administrator account. ++ 為管理員帳號使用同樣的密碼。 + + +- +- Choose a root password to keep your account safe. +- 選擇 root 密碼來維護您的帳號安全。 ++ ++ Choose a root password to keep your account safe. ++ 選擇 root 密碼來維護您的帳號安全。 + + +- +- Root password +- Root 密碼 ++ ++ Root password ++ Root 密碼 + + +- +- Repeat root password +- 確認 Root 密碼 ++ ++ Repeat root password ++ 確認 Root 密碼 + + +- +- Enter the same password twice, so that it can be checked for typing errors. +- 輸入同樣的密碼兩次,這樣可以檢查輸入錯誤。 ++ ++ Enter the same password twice, so that it can be checked for typing errors. ++ 輸入同樣的密碼兩次,這樣可以檢查輸入錯誤。 + + +- +- Log in automatically without asking for the password +- 自動登入,無需輸入密碼 ++ ++ Log in automatically without asking for the password ++ 自動登入,無需輸入密碼 + + +- +- Validate passwords quality +- 驗證密碼品質 ++ ++ Validate passwords quality ++ 驗證密碼品質 + + +- +- When this box is checked, password-strength checking is done and you will not be able to use a weak password. +- 當此勾選框被勾選,密碼強度檢查即完成,您也無法再使用弱密碼。 ++ ++ When this box is checked, password-strength checking is done and you will not be able to use a weak password. ++ 當此勾選框被勾選,密碼強度檢查即完成,您也無法再使用弱密碼。 + +- +- ++ ++ + usersq-qt6 + +- +- Pick your user name and credentials to login and perform admin tasks +- 挑選您的使用者名稱與憑證以登入並執行管理工作 ++ ++ Pick your user name and credentials to login and perform admin tasks ++ 挑選您的使用者名稱與憑證以登入並執行管理工作 + + +- +- What is your name? +- 該如何稱呼您? ++ ++ What is your name? ++ 該如何稱呼您? + + +- +- Your full name +- 您的全名 ++ ++ Your full name ++ 您的全名 + + +- +- What name do you want to use to log in? +- 您想使用何種登入名稱? ++ ++ What name do you want to use to log in? ++ 您想使用何種登入名稱? + + +- +- Login name +- 登入名稱 ++ ++ Login name ++ 登入名稱 + + +- +- If more than one person will use this computer, you can create multiple accounts after installation. +- 若有多於一個人使用此電腦,您可以在安裝後建立多個帳號。 ++ ++ If more than one person will use this computer, you can create multiple accounts after installation. ++ 若有多於一個人使用此電腦,您可以在安裝後建立多個帳號。 + + +- +- Only lowercase letters, numbers, underscore and hyphen are allowed. +- 僅允許小寫字母、數字、底線與連接號。 ++ ++ Only lowercase letters, numbers, underscore and hyphen are allowed. ++ 僅允許小寫字母、數字、底線與連接號。 + + +- +- root is not allowed as username. +- 不允許使用 root 作為使用者名稱。 ++ ++ root is not allowed as username. ++ 不允許使用 root 作為使用者名稱。 + + +- +- What is the name of this computer? +- 這部電腦的名字是? ++ ++ What is the name of this computer? ++ 這部電腦的名字是? + + +- +- Computer name +- 電腦名稱 ++ ++ Computer name ++ 電腦名稱 + + +- +- This name will be used if you make the computer visible to others on a network. +- 若您將此電腦設定為讓網路上的其他電腦可見時將會使用此名稱。 ++ ++ This name will be used if you make the computer visible to others on a network. ++ 若您將此電腦設定為讓網路上的其他電腦可見時將會使用此名稱。 + + +- +- Only letters, numbers, underscore and hyphen are allowed, minimal of two characters. +- 僅允許字母、數字、底線與連接號,最少兩個字元。 ++ ++ Only letters, numbers, underscore and hyphen are allowed, minimal of two characters. ++ 僅允許字母、數字、底線與連接號,最少兩個字元。 + + +- +- localhost is not allowed as hostname. +- 不允許使用 localhost 作為主機名稱。 ++ ++ localhost is not allowed as hostname. ++ 不允許使用 localhost 作為主機名稱。 + + +- +- Choose a password to keep your account safe. +- 輸入密碼以確保帳號的安全性。 ++ ++ Choose a password to keep your account safe. ++ 輸入密碼以確保帳號的安全性。 + + +- +- Password +- 密碼 ++ ++ Password ++ 密碼 + + +- +- Repeat password +- 確認密碼 ++ ++ Repeat password ++ 確認密碼 + + +- +- Enter the same password twice, so that it can be checked for typing errors. A good password will contain a mixture of letters, numbers and punctuation, should be at least eight characters long, and should be changed at regular intervals. +- 輸入同一個密碼兩次,以檢查輸入錯誤。一個好的密碼包含了字母、數字及標點符號的組合、至少八個字母長,且按一固定週期更換。 ++ ++ Enter the same password twice, so that it can be checked for typing errors. A good password will contain a mixture of letters, numbers and punctuation, should be at least eight characters long, and should be changed at regular intervals. ++ 輸入同一個密碼兩次,以檢查輸入錯誤。一個好的密碼包含了字母、數字及標點符號的組合、至少八個字母長,且按一固定週期更換。 + + +- +- Reuse user password as root password +- 重用使用者密碼為 root 密碼 ++ ++ Reuse user password as root password ++ 重用使用者密碼為 root 密碼 + + +- +- Use the same password for the administrator account. +- 為管理員帳號使用同樣的密碼。 ++ ++ Use the same password for the administrator account. ++ 為管理員帳號使用同樣的密碼。 + + +- +- Choose a root password to keep your account safe. +- 選擇 root 密碼來維護您的帳號安全。 ++ ++ Choose a root password to keep your account safe. ++ 選擇 root 密碼來維護您的帳號安全。 + + +- +- Root password +- Root 密碼 ++ ++ Root password ++ Root 密碼 + + +- +- Repeat root password +- 確認 Root 密碼 ++ ++ Repeat root password ++ 確認 Root 密碼 + + +- +- Enter the same password twice, so that it can be checked for typing errors. +- 輸入同樣的密碼兩次,這樣可以檢查輸入錯誤。 ++ ++ Enter the same password twice, so that it can be checked for typing errors. ++ 輸入同樣的密碼兩次,這樣可以檢查輸入錯誤。 + + +- +- Log in automatically without asking for the password +- 自動登入,無需輸入密碼 ++ ++ Log in automatically without asking for the password ++ 自動登入,無需輸入密碼 + + +- +- Validate passwords quality +- 驗證密碼品質 ++ ++ Validate passwords quality ++ 驗證密碼品質 + + +- +- When this box is checked, password-strength checking is done and you will not be able to use a weak password. +- 當此勾選框被勾選,密碼強度檢查即完成,您也無法再使用弱密碼。 ++ ++ When this box is checked, password-strength checking is done and you will not be able to use a weak password. ++ 當此勾選框被勾選,密碼強度檢查即完成,您也無法再使用弱密碼。 + +- +- ++ ++ + welcomeq + +- +- <h3>Welcome to the %1 <quote>%2</quote> installer</h3> ++ ++ <h3>Welcome to the %1 <quote>%2</quote> installer</h3> + <p>This program will ask you some questions and set up %1 on your computer.</p> +- <h3>歡迎使用 %1 <quote>%2</quote> 安裝程式</h3> ++ <h3>歡迎使用 %1 <quote>%2</quote> 安裝程式</h3> + <p>本程式將會問您一些問題並在您的電腦上安裝及設定 %1。</p> + + +- +- Support +- 支援 ++ ++ Support ++ 支援 + + +- +- Known Issues +- 已知問題 ++ ++ Known Issues ++ 已知問題 + + +- +- Release Notes +- 發行註記 ++ ++ Release Notes ++ 發行註記 + + +- +- Donate +- 捐助 ++ ++ Donate ++ 捐助 + +- +- ++ ++ + welcomeq-qt6 + +- +- <h3>Welcome to the %1 <quote>%2</quote> installer</h3> ++ ++ <h3>Welcome to the %1 <quote>%2</quote> installer</h3> + <p>This program will ask you some questions and set up %1 on your computer.</p> +- <h3>歡迎使用 %1 <quote>%2</quote> 安裝程式</h3> ++ <h3>歡迎使用 %1 <quote>%2</quote> 安裝程式</h3> + <p>本程式將會問您一些問題並在您的電腦上安裝及設定 %1。</p> + + +- +- Support +- 支援 ++ ++ Support ++ 支援 + + +- +- Known Issues +- 已知問題 ++ ++ Known Issues ++ 已知問題 + + +- +- Release Notes +- 發行註記 ++ ++ Release Notes ++ 發行註記 + + +- +- Donate +- 捐助 ++ ++ Donate ++ 捐助 + +- ++ + +diff --git a/lang/python/en_US/LC_MESSAGES/python.po b/lang/python/en_US/LC_MESSAGES/python.po +new file mode 100644 +index 0000000..e323c0c +--- /dev/null ++++ b/lang/python/en_US/LC_MESSAGES/python.po +@@ -0,0 +1,399 @@ ++# SOME DESCRIPTIVE TITLE. ++# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER ++# This file is distributed under the same license as the PACKAGE package. ++# FIRST AUTHOR , YEAR. ++# ++# Translators: ++# Jason Collins , 2018 ++# Karthik Balan , 2021 ++# ++#, fuzzy ++msgid "" ++msgstr "" ++"Project-Id-Version: PACKAGE VERSION\n" ++"Report-Msgid-Bugs-To: \n" ++"POT-Creation-Date: 2024-02-12 21:37+0100\n" ++"PO-Revision-Date: 2017-08-09 10:34+0000\n" ++"Last-Translator: Karthik Balan , 2021\n" ++"Language-Team: English (United Kingdom) (https://app.transifex.com/calamares/teams/20061/en_GB/)\n" ++"MIME-Version: 1.0\n" ++"Content-Type: text/plain; charset=UTF-8\n" ++"Content-Transfer-Encoding: 8bit\n" ++"Language: en_GB\n" ++"Plural-Forms: nplurals=2; plural=(n != 1);\n" ++ ++#: src/modules/bootloader/main.py:46 ++msgid "Install bootloader." ++msgstr "" ++ ++#: src/modules/bootloader/main.py:666 ++msgid "Failed to install grub, no partitions defined in global storage" ++msgstr "" ++ ++#: src/modules/bootloader/main.py:926 ++msgid "Bootloader installation error" ++msgstr "Bootloader installation error" ++ ++#: src/modules/bootloader/main.py:927 ++msgid "" ++"The bootloader could not be installed. The installation command " ++"
    {!s}
    returned error code {!s}." ++msgstr "" ++ ++#: src/modules/displaymanager/main.py:509 ++msgid "Cannot write LXDM configuration file" ++msgstr "" ++ ++#: src/modules/displaymanager/main.py:510 ++msgid "LXDM config file {!s} does not exist" ++msgstr "" ++ ++#: src/modules/displaymanager/main.py:598 ++msgid "Cannot write LightDM configuration file" ++msgstr "" ++ ++#: src/modules/displaymanager/main.py:599 ++msgid "LightDM config file {!s} does not exist" ++msgstr "" ++ ++#: src/modules/displaymanager/main.py:684 ++msgid "Cannot configure LightDM" ++msgstr "" ++ ++#: src/modules/displaymanager/main.py:685 ++msgid "No LightDM greeter installed." ++msgstr "" ++ ++#: src/modules/displaymanager/main.py:716 ++msgid "Cannot write SLIM configuration file" ++msgstr "" ++ ++#: src/modules/displaymanager/main.py:717 ++msgid "SLIM config file {!s} does not exist" ++msgstr "" ++ ++#: src/modules/displaymanager/main.py:938 ++msgid "No display managers selected for the displaymanager module." ++msgstr "" ++ ++#: src/modules/displaymanager/main.py:939 ++msgid "" ++"The displaymanagers list is empty or undefined in both globalstorage and " ++"displaymanager.conf." ++msgstr "" ++ ++#: src/modules/displaymanager/main.py:1026 ++msgid "Display manager configuration was incomplete" ++msgstr "" ++ ++#: src/modules/dracut/main.py:29 ++msgid "Creating initramfs with dracut." ++msgstr "" ++ ++#: src/modules/dracut/main.py:63 ++msgid "Failed to run dracut" ++msgstr "" ++ ++#: src/modules/dracut/main.py:64 ++#, python-brace-format ++msgid "Dracut failed to run on the target with return code: {return_code}" ++msgstr "" ++ ++#: src/modules/dummypython/main.py:35 ++msgid "Dummy python job." ++msgstr "Dummy python job." ++ ++#: src/modules/dummypython/main.py:37 src/modules/dummypython/main.py:104 ++#: src/modules/dummypython/main.py:105 ++msgid "Dummy python step {}" ++msgstr "Dummy python step {}" ++ ++#: src/modules/fstab/main.py:29 ++msgid "Writing fstab." ++msgstr "" ++ ++#: src/modules/fstab/main.py:378 src/modules/fstab/main.py:384 ++#: src/modules/fstab/main.py:412 src/modules/initcpiocfg/main.py:256 ++#: src/modules/initcpiocfg/main.py:260 src/modules/initramfscfg/main.py:85 ++#: src/modules/initramfscfg/main.py:89 src/modules/localecfg/main.py:140 ++#: src/modules/mount/main.py:334 src/modules/networkcfg/main.py:106 ++#: src/modules/openrcdmcryptcfg/main.py:72 ++#: src/modules/openrcdmcryptcfg/main.py:76 src/modules/rawfs/main.py:164 ++msgid "Configuration Error" ++msgstr "Configuration Error " ++ ++#: src/modules/fstab/main.py:379 src/modules/initramfscfg/main.py:86 ++#: src/modules/mount/main.py:335 src/modules/openrcdmcryptcfg/main.py:73 ++#: src/modules/rawfs/main.py:165 ++msgid "No partitions are defined for
    {!s}
    to use." ++msgstr "" ++ ++#: src/modules/fstab/main.py:385 src/modules/initramfscfg/main.py:90 ++#: src/modules/localecfg/main.py:141 src/modules/networkcfg/main.py:107 ++#: src/modules/openrcdmcryptcfg/main.py:77 ++msgid "No root mount point is given for
    {!s}
    to use." ++msgstr "" ++ ++#: src/modules/fstab/main.py:413 ++msgid "No
    {!s}
    configuration is given for
    {!s}
    to use." ++msgstr "" ++ ++#: src/modules/grubcfg/main.py:30 ++msgid "Configure GRUB." ++msgstr "" ++ ++#: src/modules/hwclock/main.py:26 ++msgid "Setting hardware clock." ++msgstr "" ++ ++#: src/modules/initcpiocfg/main.py:27 ++msgid "Configuring mkinitcpio." ++msgstr "" ++ ++#: src/modules/initcpiocfg/main.py:257 ++msgid "No partitions are defined for
    initcpiocfg
    ." ++msgstr "" ++ ++#: src/modules/initcpiocfg/main.py:261 ++msgid "No root mount point for
    initcpiocfg
    ." ++msgstr "" ++ ++#: src/modules/initramfscfg/main.py:32 ++msgid "Configuring initramfs." ++msgstr "" ++ ++#: src/modules/localecfg/main.py:31 ++msgid "Configuring locales." ++msgstr "" ++ ++#: src/modules/mkinitfs/main.py:27 ++msgid "Creating initramfs with mkinitfs." ++msgstr "" ++ ++#: src/modules/mkinitfs/main.py:49 ++msgid "Failed to run mkinitfs on the target" ++msgstr "" ++ ++#: src/modules/mkinitfs/main.py:50 ++msgid "The exit code was {}" ++msgstr "" ++ ++#: src/modules/mount/main.py:43 ++msgid "Mounting partitions." ++msgstr "" ++ ++#: src/modules/mount/main.py:164 src/modules/mount/main.py:200 ++msgid "Internal error mounting zfs datasets" ++msgstr "" ++ ++#: src/modules/mount/main.py:176 ++msgid "Failed to import zpool" ++msgstr "" ++ ++#: src/modules/mount/main.py:192 ++msgid "Failed to unlock zpool" ++msgstr "" ++ ++#: src/modules/mount/main.py:209 src/modules/mount/main.py:214 ++msgid "Failed to set zfs mountpoint" ++msgstr "" ++ ++#: src/modules/mount/main.py:370 ++msgid "zfs mounting error" ++msgstr "" ++ ++#: src/modules/networkcfg/main.py:30 ++msgid "Saving network configuration." ++msgstr "Saving network configuration " ++ ++#: src/modules/openrcdmcryptcfg/main.py:26 ++msgid "Configuring OpenRC dmcrypt service." ++msgstr "" ++ ++#: src/modules/packages/main.py:54 src/modules/packages/main.py:65 ++#: src/modules/packages/main.py:75 ++msgid "Install packages." ++msgstr "Install packages." ++ ++#: src/modules/packages/main.py:63 ++#, python-format ++msgid "Processing packages (%(count)d / %(total)d)" ++msgstr "Processing packages (%(count)d / %(total)d)" ++ ++#: src/modules/packages/main.py:68 ++#, python-format ++msgid "Installing one package." ++msgid_plural "Installing %(num)d packages." ++msgstr[0] "Installing one package." ++msgstr[1] "Installing %(num)d packages." ++ ++#: src/modules/packages/main.py:71 ++#, python-format ++msgid "Removing one package." ++msgid_plural "Removing %(num)d packages." ++msgstr[0] "Removing one package." ++msgstr[1] "Removing %(num)d packages." ++ ++#: src/modules/packages/main.py:740 src/modules/packages/main.py:752 ++#: src/modules/packages/main.py:780 ++msgid "Package Manager error" ++msgstr "Package Manager error" ++ ++#: src/modules/packages/main.py:741 ++msgid "" ++"The package manager could not prepare updates. The command
    {!s}
    " ++"returned error code {!s}." ++msgstr "" ++ ++#: src/modules/packages/main.py:753 ++msgid "" ++"The package manager could not update the system. The command
    {!s}
    " ++" returned error code {!s}." ++msgstr "" ++ ++#: src/modules/packages/main.py:781 ++msgid "" ++"The package manager could not make changes to the installed system. The " ++"command
    {!s}
    returned error code {!s}." ++msgstr "" ++ ++#: src/modules/plymouthcfg/main.py:27 ++msgid "Configure Plymouth theme" ++msgstr "" ++ ++#: src/modules/rawfs/main.py:26 ++msgid "Installing data." ++msgstr "" ++ ++#: src/modules/services-openrc/main.py:29 ++msgid "Configure OpenRC services" ++msgstr "Configure OpenRC services" ++ ++#: src/modules/services-openrc/main.py:57 ++msgid "Cannot add service {name!s} to run-level {level!s}." ++msgstr "" ++ ++#: src/modules/services-openrc/main.py:59 ++msgid "Cannot remove service {name!s} from run-level {level!s}." ++msgstr "" ++ ++#: src/modules/services-openrc/main.py:61 ++msgid "" ++"Unknown service-action {arg!s} for service {name!s} in run-" ++"level {level!s}." ++msgstr "" ++ ++#: src/modules/services-openrc/main.py:93 ++msgid "Cannot modify service" ++msgstr "" ++ ++#: src/modules/services-openrc/main.py:94 ++msgid "" ++"rc-update {arg!s} call in chroot returned error code {num!s}." ++msgstr "" ++ ++#: src/modules/services-openrc/main.py:101 ++msgid "Target runlevel does not exist" ++msgstr "Target runlevel does not exist" ++ ++#: src/modules/services-openrc/main.py:102 ++msgid "" ++"The path for runlevel {level!s} is {path!s}, which does not " ++"exist." ++msgstr "" ++ ++#: src/modules/services-openrc/main.py:110 ++msgid "Target service does not exist" ++msgstr "" ++ ++#: src/modules/services-openrc/main.py:111 ++msgid "" ++"The path for service {name!s} is {path!s}, which does not " ++"exist." ++msgstr "" ++ ++#: src/modules/services-systemd/main.py:26 ++msgid "Configure systemd units" ++msgstr "" ++ ++#: src/modules/services-systemd/main.py:64 ++msgid "Cannot modify unit" ++msgstr "" ++ ++#: src/modules/services-systemd/main.py:65 ++msgid "" ++"systemctl {_action!s} call in chroot returned error code " ++"{_exit_code!s}." ++msgstr "" ++ ++#: src/modules/services-systemd/main.py:66 ++msgid "Cannot {_action!s} systemd unit {_name!s}." ++msgstr "" ++ ++#: src/modules/unpackfs/main.py:34 ++msgid "Filling up filesystems." ++msgstr "" ++ ++#: src/modules/unpackfs/main.py:254 ++msgid "rsync failed with error code {}." ++msgstr "" ++ ++#: src/modules/unpackfs/main.py:299 ++msgid "Unpacking image {}/{}, file {}/{}" ++msgstr "" ++ ++#: src/modules/unpackfs/main.py:314 ++msgid "Starting to unpack {}" ++msgstr "" ++ ++#: src/modules/unpackfs/main.py:323 src/modules/unpackfs/main.py:467 ++msgid "Failed to unpack image \"{}\"" ++msgstr "" ++ ++#: src/modules/unpackfs/main.py:430 ++msgid "No mount point for root partition" ++msgstr "" ++ ++#: src/modules/unpackfs/main.py:431 ++msgid "globalstorage does not contain a \"rootMountPoint\" key." ++msgstr "" ++ ++#: src/modules/unpackfs/main.py:434 ++msgid "Bad mount point for root partition" ++msgstr "" ++ ++#: src/modules/unpackfs/main.py:435 ++msgid "rootMountPoint is \"{}\", which does not exist." ++msgstr "" ++ ++#: src/modules/unpackfs/main.py:439 src/modules/unpackfs/main.py:455 ++#: src/modules/unpackfs/main.py:459 src/modules/unpackfs/main.py:465 ++#: src/modules/unpackfs/main.py:480 ++msgid "Bad unpackfs configuration" ++msgstr "" ++ ++#: src/modules/unpackfs/main.py:440 ++msgid "There is no configuration information." ++msgstr "" ++ ++#: src/modules/unpackfs/main.py:456 ++msgid "The filesystem for \"{}\" ({}) is not supported by your current kernel" ++msgstr "" ++ ++#: src/modules/unpackfs/main.py:460 ++msgid "The source filesystem \"{}\" does not exist" ++msgstr "" ++ ++#: src/modules/unpackfs/main.py:466 ++msgid "" ++"Failed to find unsquashfs, make sure you have the squashfs-tools package " ++"installed." ++msgstr "" ++ ++#: src/modules/unpackfs/main.py:481 ++msgid "The destination \"{}\" in the target system is not a directory" ++msgstr "" ++ ++#: src/modules/zfshostid/main.py:27 ++msgid "Copying zfs generated hostid." ++msgstr "" -- -2.46.0 +2.43.0 diff --git a/0003-calamares.patch b/0003-calamares.patch index 7937c9e..e2ce5fd 100644 --- a/0003-calamares.patch +++ b/0003-calamares.patch @@ -1,563 +1,1441 @@ -From 8ce162b3e77a1d3c2afbfb6082fe7877cbdc592f Mon Sep 17 00:00:00 2001 -From: lizixin <2271170409@qq.com> -Date: Fri, 27 Dec 2024 15:08:58 +0800 -Subject: [PATCH 2/6] calamares +From c56fc65fc13db133e4e7190d638cad608e3b7579 Mon Sep 17 00:00:00 2001 +From: cui-gaoleng <562344211@qq.com> +Date: Fri, 8 Nov 2024 01:04:06 +0800 +Subject: [PATCH 1/4] =?UTF-8?q?calamares=E6=96=87=E4=BB=B6=E5=A4=B9?= +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit --- - src/calamares/CalamaresApplication.cpp | 4 +- - src/calamares/DebugWindow.cpp | 530 ++++++++++++------------- - 2 files changed, 267 insertions(+), 267 deletions(-) + src/calamares/CalamaresApplication.cpp | 605 ++++++++++--------- + src/calamares/CalamaresApplication.h | 128 ++-- + src/calamares/CalamaresWindow.cpp | 88 +-- + src/calamares/CalamaresWindow.h | 100 +-- + src/calamares/DebugWindow.cpp | 14 +- + src/calamares/DebugWindow.ui | 314 +++++----- + src/calamares/calamares-3.3.7.code-workspace | 11 + + 7 files changed, 646 insertions(+), 614 deletions(-) + create mode 100644 src/calamares/calamares-3.3.7.code-workspace diff --git a/src/calamares/CalamaresApplication.cpp b/src/calamares/CalamaresApplication.cpp -index a07edad..6b62fd6 100644 +index 09d3bfc..a07edad 100644 --- a/src/calamares/CalamaresApplication.cpp +++ b/src/calamares/CalamaresApplication.cpp -@@ -51,8 +51,8 @@ CalamaresApplication::CalamaresApplication( int& argc, char* argv[] ) - // directory -- where Calamares stores logs, for instance -- - // //, so we end up with ~/.cache/Calamares/calamares/ - // which is excessively squidly. -- // -- // setOrganizationName( QStringLiteral( CALAMARES_ORGANIZATION_NAME ) ); -+ -+ - setOrganizationDomain( QStringLiteral( CALAMARES_ORGANIZATION_DOMAIN ) ); - setApplicationName( QStringLiteral( CALAMARES_APPLICATION_NAME ) ); - setApplicationVersion( QStringLiteral( CALAMARES_VERSION ) ); -diff --git a/src/calamares/DebugWindow.cpp b/src/calamares/DebugWindow.cpp -index b28661e..69584b8 100644 ---- a/src/calamares/DebugWindow.cpp -+++ b/src/calamares/DebugWindow.cpp -@@ -1,265 +1,265 @@ +@@ -1,302 +1,303 @@ -/* === This file is part of Calamares - === - * -- * SPDX-FileCopyrightText: 2015-2016 Teo Mrnjavac -- * SPDX-FileCopyrightText: 2019 Adriaan de Groot +- * SPDX-FileCopyrightText: 2014-2015 Teo Mrnjavac +- * SPDX-FileCopyrightText: 2018 Adriaan de Groot - * SPDX-License-Identifier: GPL-3.0-or-later - * - * Calamares is Free Software: see the License-Identifier above. - * - */ +-#include "CalamaresApplication.h" - --#include "DebugWindow.h" --#include "ui_DebugWindow.h" +-#include "CalamaresConfig.h" +-#include "CalamaresVersionX.h" +-#include "CalamaresWindow.h" +-#include "progresstree/ProgressTreeView.h" - -#include "Branding.h" --#include "CalamaresAbout.h" --#include "CalamaresVersion.h" --#include "GlobalStorage.h" --#include "Job.h" -#include "JobQueue.h" -#include "Settings.h" --#include "VariantModel.h" --#include "modulesystem/Module.h" +-#include "ViewManager.h" +-#include "locale/TranslationsModel.h" -#include "modulesystem/ModuleManager.h" +-#include "utils/Dirs.h" -#include "utils/Gui.h" -#include "utils/Logger.h" --#include "utils/Paste.h" +-#include "utils/System.h" +-#ifdef WITH_QML +-#include "utils/Qml.h" +-#endif -#include "utils/Retranslator.h" --#include "widgets/TranslationFix.h" +-#include "viewpages/ViewStep.h" - --#include --#include --#include --#include --#include +-#include +-#include +-#include +-#include - --#include --#include +-/// @brief Convenience for "are the settings in debug mode" +-static bool +-isDebug() +-{ +- return Calamares::Settings::instance() && Calamares::Settings::instance()->debugMode(); +-} - --/** -- * @brief crash makes Calamares crash immediately. -- */ --static void --crash() +-CalamaresApplication::CalamaresApplication( int& argc, char* argv[] ) +- : QApplication( argc, argv ) +- , m_mainwindow( nullptr ) +- , m_moduleManager( nullptr ) -{ -- kill( getpid(), SIGTRAP ); +- // Setting the organization name makes the default cache +- // directory -- where Calamares stores logs, for instance -- +- // //, so we end up with ~/.cache/Calamares/calamares/ +- // which is excessively squidly. +- // +- // setOrganizationName( QStringLiteral( CALAMARES_ORGANIZATION_NAME ) ); +- setOrganizationDomain( QStringLiteral( CALAMARES_ORGANIZATION_DOMAIN ) ); +- setApplicationName( QStringLiteral( CALAMARES_APPLICATION_NAME ) ); +- setApplicationVersion( QStringLiteral( CALAMARES_VERSION ) ); +- +- QFont f = font(); +- Calamares::setDefaultFontSize( f.pointSize() ); -} - --/// @brief Print out the widget tree (names) in indented form. --static void --dumpWidgetTree( QDebug& deb, const QWidget* widget, int depth ) +-void +-CalamaresApplication::init() -{ -- if ( !widget ) -- { -- return; -- } +- Logger::setupLogfile(); +- cDebug() << "Calamares version:" << CALAMARES_VERSION; +- cDebug() << Logger::SubEntry << "Using Qt version:" << qVersion(); +- cDebug() << Logger::SubEntry << "Build type:" << CMAKE_BUILD_TYPE; +-#ifdef WITH_PYBIND11 +- cDebug() << Logger::SubEntry << "Using PyBind11"; +-#endif +-#ifdef WITH_BOOST_PYTHON +- cDebug() << Logger::SubEntry << "Using Boost Python"; +-#endif +- cDebug() << Logger::SubEntry << "Using settings:" << Calamares::Settings::instance()->path(); +- cDebug() << Logger::SubEntry << "Using log file:" << Logger::logFile(); +- cDebug() << Logger::SubEntry << "Languages:" << Calamares::Locale::availableLanguages(); - -- deb << Logger::Continuation; -- for ( int i = 0; i < depth; ++i ) +- if ( !Calamares::Settings::instance() ) - { -- deb << ' '; +- cError() << "Must create Calamares::Settings before the application."; +- ::exit( 1 ); - } -- deb << widget->metaObject()->className() << widget->objectName(); +- initQmlPath(); +- initBranding(); - -- for ( const auto* w : widget->findChildren< QWidget* >( QString(), Qt::FindDirectChildrenOnly ) ) -- { -- dumpWidgetTree( deb, w, depth + 1 ); -- } +- Calamares::installTranslator(); +- +- setQuitOnLastWindowClosed( false ); +- setWindowIcon( QIcon( Calamares::Branding::instance()->imagePath( Calamares::Branding::ProductIcon ) ) ); +- +- cDebug() << Logger::SubEntry << "STARTUP: initSettings, initQmlPath, initBranding done"; +- +- initModuleManager(); //also shows main window +- +- cDebug() << Logger::SubEntry << "STARTUP: initModuleManager: module init started"; -} - --namespace Calamares +-CalamaresApplication::~CalamaresApplication() -{ +- Logger::CDebug( Logger::LOGVERBOSE ) << "Shutting down Calamares..."; +- Logger::CDebug( Logger::LOGVERBOSE ) << Logger::SubEntry << "Finished shutdown."; +-} - --DebugWindow::DebugWindow() -- : QWidget( nullptr ) -- , m_ui( new Ui::DebugWindow ) -- , m_globals( JobQueue::instance()->globalStorage()->data() ) -- , m_globals_model( std::make_unique< VariantModel >( &m_globals ) ) -- , m_module_model( std::make_unique< VariantModel >( &m_module ) ) +-CalamaresApplication* +-CalamaresApplication::instance() -{ -- GlobalStorage* gs = JobQueue::instance()->globalStorage(); -- -- m_ui->setupUi( this ); -- -- m_ui->globalStorageView->setModel( m_globals_model.get() ); -- m_ui->globalStorageView->expandAll(); -- -- // Do above when the GS changes, too -- connect( gs, -- &GlobalStorage::changed, -- this, -- [ = ] -- { -- m_globals = JobQueue::instance()->globalStorage()->data(); -- m_globals_model->reload(); -- m_ui->globalStorageView->expandAll(); -- } ); -- -- // JobQueue page -- m_ui->jobQueueText->setReadOnly( true ); -- connect( JobQueue::instance(), -- &JobQueue::queueChanged, -- this, -- [ this ]( const QStringList& jobs ) { m_ui->jobQueueText->setText( jobs.join( '\n' ) ); } ); -- -- // Modules page -- QStringList modulesKeys; -- for ( const auto& m : ModuleManager::instance()->loadedInstanceKeys() ) -- { -- modulesKeys << m.toString(); -- } -- -- QStringListModel* modulesModel = new QStringListModel( modulesKeys ); -- m_ui->modulesListView->setModel( modulesModel ); -- m_ui->modulesListView->setSelectionMode( QAbstractItemView::SingleSelection ); -- -- m_ui->moduleConfigView->setModel( m_module_model.get() ); -- -- connect( m_ui->modulesListView->selectionModel(), -- &QItemSelectionModel::selectionChanged, -- this, -- [ this ] -- { -- QString moduleName = m_ui->modulesListView->currentIndex().data().toString(); -- Module* module -- = ModuleManager::instance()->moduleInstance( ModuleSystem::InstanceKey::fromString( moduleName ) ); -- if ( module ) -- { -- m_module = module->configurationMap(); -- m_module_model->reload(); -- m_ui->moduleConfigView->expandAll(); -- m_ui->moduleTypeLabel->setText( module->typeString() ); -- m_ui->moduleInterfaceLabel->setText( module->interfaceString() ); -- } -- } ); -- -- // Tools page -- connect( m_ui->crashButton, &QPushButton::clicked, this, [] { ::crash(); } ); -- connect( m_ui->reloadStylesheetButton, -- &QPushButton::clicked, -- []() -- { -- for ( auto* w : qApp->topLevelWidgets() ) -- { -- // Needs to match what's set in CalamaresWindow -- if ( w->objectName() == QStringLiteral( "mainApp" ) ) -- { -- w->setStyleSheet( Calamares::Branding::instance()->stylesheet() ); -- } -- } -- } ); -- connect( m_ui->widgetTreeButton, -- &QPushButton::clicked, -- []() -- { -- for ( auto* w : qApp->topLevelWidgets() ) -- { -- Logger::CDebug deb; -- dumpWidgetTree( deb, w, 0 ); -- } -- } ); -- -- // Send Log button only if it would be useful -- m_ui->sendLogButton->setVisible( Calamares::Paste::isEnabled() ); -- connect( m_ui->sendLogButton, &QPushButton::clicked, [ this ]() { Calamares::Paste::doLogUploadUI( this ); } ); -- -- CALAMARES_RETRANSLATE( m_ui->retranslateUi( this ); setWindowTitle( tr( "Debug Information", "@title" ) ); ); +- return qobject_cast< CalamaresApplication* >( QApplication::instance() ); -} - --void --DebugWindow::closeEvent( QCloseEvent* e ) +-CalamaresWindow* +-CalamaresApplication::mainWindow() -{ -- Q_UNUSED( e ) -- emit closed(); +- return m_mainwindow; -} - --DebugWindowManager::DebugWindowManager( QObject* parent ) -- : QObject( parent ) +-static QStringList +-brandingFileCandidates( bool assumeBuilddir, const QString& brandingFilename ) -{ +- QStringList brandingPaths; +- if ( Calamares::isAppDataDirOverridden() ) +- { +- brandingPaths << Calamares::appDataDir().absoluteFilePath( brandingFilename ); +- } +- else +- { +- if ( assumeBuilddir ) +- { +- brandingPaths << ( QDir::currentPath() + QStringLiteral( "/src/" ) + brandingFilename ); +- } +- if ( Calamares::haveExtraDirs() ) +- { +- for ( auto s : Calamares::extraDataDirs() ) +- { +- brandingPaths << ( s + brandingFilename ); +- } +- } +- brandingPaths << QDir( CMAKE_INSTALL_FULL_SYSCONFDIR "/calamares/" ).absoluteFilePath( brandingFilename ); +- brandingPaths << Calamares::appDataDir().absoluteFilePath( brandingFilename ); +- } +- +- return brandingPaths; -} - --bool --DebugWindowManager::enabled() const +-void +-CalamaresApplication::initQmlPath() -{ -- const auto* s = Settings::instance(); -- return ( Logger::logLevel() >= Logger::LOGVERBOSE ) || ( s ? s->debugMode() : false ); +-#ifdef WITH_QML +- if ( !Calamares::initQmlModulesDir() ) +- { +- ::exit( EXIT_FAILURE ); +- } +-#endif -} - -void --DebugWindowManager::show( bool visible ) +-CalamaresApplication::initBranding() -{ -- if ( !enabled() ) +- QString brandingComponentName = Calamares::Settings::instance()->brandingComponentName(); +- if ( brandingComponentName.simplified().isEmpty() ) - { -- visible = false; +- cError() << "FATAL: branding component not set in settings.conf"; +- ::exit( EXIT_FAILURE ); - } -- if ( m_visible == visible ) +- +- QString brandingDescriptorSubpath = QString( "branding/%1/branding.desc" ).arg( brandingComponentName ); +- QStringList brandingFileCandidatesByPriority = brandingFileCandidates( isDebug(), brandingDescriptorSubpath ); +- +- QFileInfo brandingFile; +- bool found = false; +- +- foreach ( const QString& path, brandingFileCandidatesByPriority ) - { -- return; +- QFileInfo pathFi( path ); +- if ( pathFi.exists() && pathFi.isReadable() ) +- { +- brandingFile = pathFi; +- found = true; +- break; +- } - } - -- if ( visible ) +- if ( !found || !brandingFile.exists() || !brandingFile.isReadable() ) - { -- m_debugWindow = new Calamares::DebugWindow(); -- m_debugWindow->show(); -- connect( m_debugWindow.data(), -- &Calamares::DebugWindow::closed, -- this, -- [ = ]() -- { -- m_debugWindow->deleteLater(); -- m_visible = false; -- emit visibleChanged( false ); -- } ); -- m_visible = true; -- emit visibleChanged( true ); +- cError() << "Cowardly refusing to continue startup without branding." +- << Logger::DebugList( brandingFileCandidatesByPriority ); +- if ( Calamares::isAppDataDirOverridden() ) +- { +- cError() << "FATAL: explicitly configured application data directory is missing" << brandingComponentName; +- } +- else +- { +- cError() << "FATAL: none of the expected branding descriptor file paths exist."; +- } +- ::exit( EXIT_FAILURE ); - } -- else +- +- new Calamares::Branding( brandingFile.absoluteFilePath(), this, devicePixelRatio() ); +-} +- +-void +-CalamaresApplication::initModuleManager() +-{ +- m_moduleManager = new Calamares::ModuleManager( Calamares::Settings::instance()->modulesSearchPaths(), this ); +- connect( m_moduleManager, &Calamares::ModuleManager::initDone, this, &CalamaresApplication::initView ); +- m_moduleManager->init(); +-} +- +-/** @brief centers the widget @p w on (a) screen +- * +- * This tries to duplicate the (deprecated) qApp->desktop()->availableGeometry() +- * placement by iterating over screens and putting Calamares in the first +- * one where it fits; this is *generally* the primary screen. +- * +- * With debugging, it would look something like this (2 screens attached, +- * primary at +1080+240 because I have a very strange X setup). Before +- * being mapped, the Calamares window is at +0+0 but does have a size. +- * The first screen's geometry includes the offset from the origin in +- * screen coordinates. +- * +- * Proposed window size: 1024 520 +- * Window QRect(0,0 1024x520) +- * Screen QRect(1080,240 2560x1440) +- * Moving QPoint(1848,700) +- * Screen QRect(0,0 1080x1920) +- * +- */ +-static void +-centerWindowOnScreen( QWidget* w ) +-{ +- QList< QScreen* > screens = qApp->screens(); +- QPoint windowCenter = w->rect().center(); +- QSize windowSize = w->rect().size(); +- +- for ( const auto* screen : screens ) - { -- if ( m_debugWindow ) +- QSize screenSize = screen->availableGeometry().size(); +- if ( ( screenSize.width() >= windowSize.width() ) && ( screenSize.height() >= windowSize.height() ) ) - { -- m_debugWindow->deleteLater(); +- w->move( screen->availableGeometry().center() - windowCenter ); +- break; - } -- m_visible = false; -- emit visibleChanged( false ); - } -} - -void --DebugWindowManager::toggle() +-CalamaresApplication::initView() -{ -- show( !m_visible ); +- cDebug() << "STARTUP: initModuleManager: all modules init done"; +- initJobQueue(); +- cDebug() << "STARTUP: initJobQueue done"; +- +- m_mainwindow = new CalamaresWindow(); //also creates ViewManager +- +- connect( m_moduleManager, &Calamares::ModuleManager::modulesLoaded, this, &CalamaresApplication::initViewSteps ); +- connect( m_moduleManager, &Calamares::ModuleManager::modulesFailed, this, &CalamaresApplication::initFailed ); +- +- QTimer::singleShot( 0, m_moduleManager, &Calamares::ModuleManager::loadModules ); +- +- if ( Calamares::Branding::instance() && Calamares::Branding::instance()->windowPlacementCentered() ) +- { +- centerWindowOnScreen( m_mainwindow ); +- } +- cDebug() << "STARTUP: CalamaresWindow created; loadModules started"; -} - -void --DebugWindowManager::about() +-CalamaresApplication::initViewSteps() -{ -- QString title = Calamares::Settings::instance()->isSetupMode() -- ? QCoreApplication::translate( "WelcomePage", "About %1 Setup", "@title" ) -- : QCoreApplication::translate( "WelcomePage", "About %1 Installer", "@title" ); -- QMessageBox mb( QMessageBox::Information, -- title.arg( CALAMARES_APPLICATION_NAME ), -- Calamares::aboutString().arg( Calamares::Branding::instance()->versionedName() ), -- QMessageBox::Ok, -- nullptr ); -- Calamares::fixButtonLabels( &mb ); -- mb.setStyleSheet( -- "QMessageBox {" -- "border: 1px solid hsl(240,2%,79%);" -- "border-radius: 5px;" -- "background-color: #FFFFFF;" // 设置对话框背景颜色 -- "}" -- ); -- mb.setWindowFlags(Qt::FramelessWindowHint | Qt::Dialog); -- mb.setIconPixmap( -- Calamares::defaultPixmap( Calamares::BigLogo,//Biglogo.svg -- Calamares::Original, -- QSize( 321/1.9, 297/2 ) ) ); -- QGridLayout* layout = reinterpret_cast< QGridLayout* >( mb.layout() ); -- if ( layout ) +- cDebug() << "STARTUP: loadModules for all modules done"; +- m_moduleManager->checkRequirements(); +- if ( Calamares::Branding::instance()->windowMaximize() ) +- { +- m_mainwindow->setWindowFlag( Qt::FramelessWindowHint ); +- m_mainwindow->showMaximized(); +- } +- else - { -- layout->setColumnMinimumWidth( 2, Calamares::defaultFontHeight() * 24 ); +- m_mainwindow->show(); - } -- mb.exec(); +- +- cDebug() << "STARTUP: Window now visible and ProgressTreeView populated"; +- cDebug() << Logger::SubEntry << Calamares::ViewManager::instance()->viewSteps().count() << "view steps loaded."; +- Calamares::ViewManager::instance()->onInitComplete(); -} - --} // namespace Calamares +-void +-CalamaresApplication::initFailed( const QStringList& l ) +-{ +- cError() << "STARTUP: failed modules are" << l; +- m_mainwindow->show(); +-} +- +-void +-CalamaresApplication::initJobQueue() +-{ +- Calamares::JobQueue* jobQueue = new Calamares::JobQueue( this ); +- new Calamares::System( Calamares::Settings::instance()->doChroot(), this ); +- Calamares::Branding::instance()->setGlobals( jobQueue->globalStorage() ); +-} +/* === This file is part of Calamares - === + * -+ * SPDX-FileCopyrightText: 2015-2016 Teo Mrnjavac -+ * SPDX-FileCopyrightText: 2019 Adriaan de Groot ++ * SPDX-FileCopyrightText: 2014-2015 Teo Mrnjavac ++ * SPDX-FileCopyrightText: 2018 Adriaan de Groot + * SPDX-License-Identifier: GPL-3.0-or-later + * + * Calamares is Free Software: see the License-Identifier above. + * + */ ++#include "CalamaresApplication.h" + -+#include "DebugWindow.h" -+#include "ui_DebugWindow.h" ++#include "CalamaresConfig.h" ++#include "CalamaresVersionX.h" ++#include "CalamaresWindow.h" ++#include "progresstree/ProgressTreeView.h" + +#include "Branding.h" -+#include "CalamaresAbout.h" -+#include "CalamaresVersion.h" -+#include "GlobalStorage.h" -+#include "Job.h" +#include "JobQueue.h" +#include "Settings.h" -+#include "VariantModel.h" -+#include "modulesystem/Module.h" ++#include "ViewManager.h" ++#include "locale/TranslationsModel.h" +#include "modulesystem/ModuleManager.h" ++#include "utils/Dirs.h" +#include "utils/Gui.h" +#include "utils/Logger.h" -+#include "utils/Paste.h" ++#include "utils/System.h" ++#ifdef WITH_QML ++#include "utils/Qml.h" ++#endif +#include "utils/Retranslator.h" -+#include "widgets/TranslationFix.h" ++#include "viewpages/ViewStep.h" + -+#include -+#include -+#include -+#include -+#include ++#include ++#include ++#include ++#include + -+#include -+#include ++/// @brief Convenience for "are the settings in debug mode" ++static bool ++isDebug() ++{ ++ return Calamares::Settings::instance() && Calamares::Settings::instance()->debugMode(); ++} + -+/** -+ * @brief crash makes Calamares crash immediately. -+ */ -+static void -+crash() ++CalamaresApplication::CalamaresApplication( int& argc, char* argv[] ) ++ : QApplication( argc, argv ) ++ , m_mainwindow( nullptr ) ++ , m_moduleManager( nullptr ) +{ -+ kill( getpid(), SIGTRAP ); ++ // Setting the organization name makes the default cache ++ // directory -- where Calamares stores logs, for instance -- ++ // //, so we end up with ~/.cache/Calamares/calamares/ ++ // which is excessively squidly. ++ // ++ // setOrganizationName( QStringLiteral( CALAMARES_ORGANIZATION_NAME ) ); ++ setOrganizationDomain( QStringLiteral( CALAMARES_ORGANIZATION_DOMAIN ) ); ++ setApplicationName( QStringLiteral( CALAMARES_APPLICATION_NAME ) ); ++ setApplicationVersion( QStringLiteral( CALAMARES_VERSION ) ); ++ ++ QFont f = font(); ++ Calamares::setDefaultFontSize( f.pointSize() ); +} + -+/// @brief Print out the widget tree (names) in indented form. -+static void -+dumpWidgetTree( QDebug& deb, const QWidget* widget, int depth ) ++void ++CalamaresApplication::init() +{ -+ if ( !widget ) -+ { -+ return; -+ } ++ Logger::setupLogfile(); ++ cDebug() << "Calamares version:" << CALAMARES_VERSION; ++ cDebug() << Logger::SubEntry << "Using Qt version:" << qVersion(); ++ cDebug() << Logger::SubEntry << "Build type:" << CMAKE_BUILD_TYPE; ++#ifdef WITH_PYBIND11 ++ cDebug() << Logger::SubEntry << "Using PyBind11"; ++#endif ++#ifdef WITH_BOOST_PYTHON ++ cDebug() << Logger::SubEntry << "Using Boost Python"; ++#endif ++ cDebug() << Logger::SubEntry << "Using settings:" << Calamares::Settings::instance()->path(); ++ cDebug() << Logger::SubEntry << "Using log file:" << Logger::logFile(); ++ cDebug() << Logger::SubEntry << "Languages:" << Calamares::Locale::availableLanguages(); + -+ deb << Logger::Continuation; -+ for ( int i = 0; i < depth; ++i ) ++ if ( !Calamares::Settings::instance() ) + { -+ deb << ' '; ++ cError() << "Must create Calamares::Settings before the application."; ++ ::exit( 1 ); + } -+ deb << widget->metaObject()->className() << widget->objectName(); ++ initQmlPath(); ++ initBranding(); + -+ for ( const auto* w : widget->findChildren< QWidget* >( QString(), Qt::FindDirectChildrenOnly ) ) -+ { -+ dumpWidgetTree( deb, w, depth + 1 ); -+ } ++ Calamares::installTranslator(); ++ ++ setQuitOnLastWindowClosed( false ); ++ setWindowIcon( QIcon( Calamares::Branding::instance()->imagePath( Calamares::Branding::ProductIcon ) ) ); ++ ++ cDebug() << Logger::SubEntry << "STARTUP: initSettings, initQmlPath, initBranding done"; ++ ++ initModuleManager(); //also shows main window ++ ++ cDebug() << Logger::SubEntry << "STARTUP: initModuleManager: module init started"; +} + -+namespace Calamares ++CalamaresApplication::~CalamaresApplication() +{ ++ Logger::CDebug( Logger::LOGVERBOSE ) << "Shutting down Calamares..."; ++ Logger::CDebug( Logger::LOGVERBOSE ) << Logger::SubEntry << "Finished shutdown."; ++} + -+DebugWindow::DebugWindow() -+ : QWidget( nullptr ) -+ , m_ui( new Ui::DebugWindow ) -+ , m_globals( JobQueue::instance()->globalStorage()->data() ) -+ , m_globals_model( std::make_unique< VariantModel >( &m_globals ) ) -+ , m_module_model( std::make_unique< VariantModel >( &m_module ) ) ++CalamaresApplication* ++CalamaresApplication::instance() +{ -+ GlobalStorage* gs = JobQueue::instance()->globalStorage(); -+ -+ m_ui->setupUi( this ); -+ -+ m_ui->globalStorageView->setModel( m_globals_model.get() ); -+ m_ui->globalStorageView->expandAll(); -+ -+ // Do above when the GS changes, too -+ connect( gs, -+ &GlobalStorage::changed, -+ this, -+ [ = ] -+ { -+ m_globals = JobQueue::instance()->globalStorage()->data(); -+ m_globals_model->reload(); -+ m_ui->globalStorageView->expandAll(); -+ } ); -+ -+ // JobQueue page -+ m_ui->jobQueueText->setReadOnly( true ); -+ connect( JobQueue::instance(), -+ &JobQueue::queueChanged, -+ this, -+ [ this ]( const QStringList& jobs ) { m_ui->jobQueueText->setText( jobs.join( '\n' ) ); } ); -+ -+ // Modules page -+ QStringList modulesKeys; -+ for ( const auto& m : ModuleManager::instance()->loadedInstanceKeys() ) -+ { -+ modulesKeys << m.toString(); -+ } -+ -+ QStringListModel* modulesModel = new QStringListModel( modulesKeys ); -+ m_ui->modulesListView->setModel( modulesModel ); -+ m_ui->modulesListView->setSelectionMode( QAbstractItemView::SingleSelection ); -+ -+ m_ui->moduleConfigView->setModel( m_module_model.get() ); -+ -+ connect( m_ui->modulesListView->selectionModel(), -+ &QItemSelectionModel::selectionChanged, -+ this, -+ [ this ] -+ { -+ QString moduleName = m_ui->modulesListView->currentIndex().data().toString(); -+ Module* module -+ = ModuleManager::instance()->moduleInstance( ModuleSystem::InstanceKey::fromString( moduleName ) ); -+ if ( module ) -+ { -+ m_module = module->configurationMap(); -+ m_module_model->reload(); -+ m_ui->moduleConfigView->expandAll(); -+ m_ui->moduleTypeLabel->setText( module->typeString() ); -+ m_ui->moduleInterfaceLabel->setText( module->interfaceString() ); -+ } -+ } ); -+ -+ // Tools page -+ connect( m_ui->crashButton, &QPushButton::clicked, this, [] { ::crash(); } ); -+ connect( m_ui->reloadStylesheetButton, -+ &QPushButton::clicked, -+ []() -+ { -+ for ( auto* w : qApp->topLevelWidgets() ) -+ { -+ // Needs to match what's set in CalamaresWindow -+ if ( w->objectName() == QStringLiteral( "mainApp" ) ) -+ { -+ w->setStyleSheet( Calamares::Branding::instance()->stylesheet() ); -+ } -+ } -+ } ); -+ connect( m_ui->widgetTreeButton, -+ &QPushButton::clicked, -+ []() -+ { -+ for ( auto* w : qApp->topLevelWidgets() ) -+ { -+ Logger::CDebug deb; -+ dumpWidgetTree( deb, w, 0 ); -+ } -+ } ); -+ -+ // Send Log button only if it would be useful -+ m_ui->sendLogButton->setVisible( Calamares::Paste::isEnabled() ); -+ connect( m_ui->sendLogButton, &QPushButton::clicked, [ this ]() { Calamares::Paste::doLogUploadUI( this ); } ); -+ -+ CALAMARES_RETRANSLATE( m_ui->retranslateUi( this ); setWindowTitle( tr( "Debug Information", "@title" ) ); ); ++ return qobject_cast< CalamaresApplication* >( QApplication::instance() ); +} + -+void -+DebugWindow::closeEvent( QCloseEvent* e ) ++CalamaresWindow* ++CalamaresApplication::mainWindow() +{ -+ Q_UNUSED( e ) -+ emit closed(); ++ return m_mainwindow; +} + -+DebugWindowManager::DebugWindowManager( QObject* parent ) -+ : QObject( parent ) ++static QStringList ++brandingFileCandidates( bool assumeBuilddir, const QString& brandingFilename ) +{ ++ QStringList brandingPaths; ++ if ( Calamares::isAppDataDirOverridden() ) ++ { ++ brandingPaths << Calamares::appDataDir().absoluteFilePath( brandingFilename ); ++ } ++ else ++ { ++ if ( assumeBuilddir ) ++ { ++ brandingPaths << ( QDir::currentPath() + QStringLiteral( "/src/" ) + brandingFilename ); ++ } ++ if ( Calamares::haveExtraDirs() ) ++ { ++ for ( auto s : Calamares::extraDataDirs() ) ++ { ++ brandingPaths << ( s + brandingFilename ); ++ } ++ } ++ brandingPaths << QDir( CMAKE_INSTALL_FULL_SYSCONFDIR "/calamares/" ).absoluteFilePath( brandingFilename ); ++ brandingPaths << Calamares::appDataDir().absoluteFilePath( brandingFilename ); ++ } ++ ++ return brandingPaths; +} + -+bool -+DebugWindowManager::enabled() const ++void ++CalamaresApplication::initQmlPath() +{ -+ const auto* s = Settings::instance(); -+ return ( Logger::logLevel() >= Logger::LOGVERBOSE ) || ( s ? s->debugMode() : false ); ++#ifdef WITH_QML ++ if ( !Calamares::initQmlModulesDir() ) ++ { ++ ::exit( EXIT_FAILURE ); ++ } ++#endif +} + +void -+DebugWindowManager::show( bool visible ) ++CalamaresApplication::initBranding() +{ -+ if ( !enabled() ) ++ QString brandingComponentName = Calamares::Settings::instance()->brandingComponentName(); ++ if ( brandingComponentName.simplified().isEmpty() ) + { -+ visible = false; ++ cError() << "FATAL: branding component not set in settings.conf"; ++ ::exit( EXIT_FAILURE ); + } -+ if ( m_visible == visible ) ++ ++ QString brandingDescriptorSubpath = QString( "branding/%1/branding.desc" ).arg( brandingComponentName ); ++ QStringList brandingFileCandidatesByPriority = brandingFileCandidates( isDebug(), brandingDescriptorSubpath ); ++ cDebug() << "brandingFileCandidatesByPriority" << brandingFileCandidatesByPriority; ++ ++ QFileInfo brandingFile; ++ bool found = false; ++ ++ foreach ( const QString& path, brandingFileCandidatesByPriority ) + { -+ return; ++ QFileInfo pathFi( path ); ++ if ( pathFi.exists() && pathFi.isReadable() ) ++ { ++ brandingFile = pathFi; ++ found = true; ++ break; ++ } + } + -+ if ( visible ) ++ if ( !found || !brandingFile.exists() || !brandingFile.isReadable() ) + { -+ m_debugWindow = new Calamares::DebugWindow(); -+ m_debugWindow->show(); -+ connect( m_debugWindow.data(), -+ &Calamares::DebugWindow::closed, -+ this, -+ [ = ]() -+ { -+ m_debugWindow->deleteLater(); -+ m_visible = false; -+ emit visibleChanged( false ); -+ } ); -+ m_visible = true; -+ emit visibleChanged( true ); ++ cError() << "Cowardly refusing to continue startup without branding." ++ << Logger::DebugList( brandingFileCandidatesByPriority ); ++ if ( Calamares::isAppDataDirOverridden() ) ++ { ++ cError() << "FATAL: explicitly configured application data directory is missing" << brandingComponentName; ++ } ++ else ++ { ++ cError() << "FATAL: none of the expected branding descriptor file paths exist."; ++ } ++ ::exit( EXIT_FAILURE ); + } -+ else ++ ++ new Calamares::Branding( brandingFile.absoluteFilePath(), this, devicePixelRatio() ); ++} ++ ++void ++CalamaresApplication::initModuleManager() ++{ ++ m_moduleManager = new Calamares::ModuleManager( Calamares::Settings::instance()->modulesSearchPaths(), this ); ++ connect( m_moduleManager, &Calamares::ModuleManager::initDone, this, &CalamaresApplication::initView ); ++ m_moduleManager->init(); ++} ++ ++/** @brief centers the widget @p w on (a) screen ++ * ++ * This tries to duplicate the (deprecated) qApp->desktop()->availableGeometry() ++ * placement by iterating over screens and putting Calamares in the first ++ * one where it fits; this is *generally* the primary screen. ++ * ++ * With debugging, it would look something like this (2 screens attached, ++ * primary at +1080+240 because I have a very strange X setup). Before ++ * being mapped, the Calamares window is at +0+0 but does have a size. ++ * The first screen's geometry includes the offset from the origin in ++ * screen coordinates. ++ * ++ * Proposed window size: 1024 520 ++ * Window QRect(0,0 1024x520) ++ * Screen QRect(1080,240 2560x1440) ++ * Moving QPoint(1848,700) ++ * Screen QRect(0,0 1080x1920) ++ * ++ */ ++static void ++centerWindowOnScreen( QWidget* w ) ++{ ++ QList< QScreen* > screens = qApp->screens(); ++ QPoint windowCenter = w->rect().center(); ++ QSize windowSize = w->rect().size(); ++ ++ for ( const auto* screen : screens ) + { -+ if ( m_debugWindow ) ++ QSize screenSize = screen->availableGeometry().size(); ++ if ( ( screenSize.width() >= windowSize.width() ) && ( screenSize.height() >= windowSize.height() ) ) + { -+ m_debugWindow->deleteLater(); ++ w->move( screen->availableGeometry().center() - windowCenter ); ++ break; + } -+ m_visible = false; -+ emit visibleChanged( false ); + } +} + +void -+DebugWindowManager::toggle() ++CalamaresApplication::initView() +{ -+ show( !m_visible ); ++ cDebug() << "STARTUP: initModuleManager: all modules init done"; ++ initJobQueue(); ++ cDebug() << "STARTUP: initJobQueue done"; ++ ++ m_mainwindow = new CalamaresWindow(); //also creates ViewManager ++ ++ connect( m_moduleManager, &Calamares::ModuleManager::modulesLoaded, this, &CalamaresApplication::initViewSteps ); ++ connect( m_moduleManager, &Calamares::ModuleManager::modulesFailed, this, &CalamaresApplication::initFailed ); ++ ++ QTimer::singleShot( 0, m_moduleManager, &Calamares::ModuleManager::loadModules ); ++ ++ if ( Calamares::Branding::instance() && Calamares::Branding::instance()->windowPlacementCentered() ) ++ { ++ centerWindowOnScreen( m_mainwindow ); ++ } ++ cDebug() << "STARTUP: CalamaresWindow created; loadModules started"; +} + +void -+DebugWindowManager::about() ++CalamaresApplication::initViewSteps() +{ -+ QString title = Calamares::Settings::instance()->isSetupMode() -+ ? QCoreApplication::translate( "WelcomePage", "About %1 Setup", "@title" ) -+ : QCoreApplication::translate( "WelcomePage", "About %1 Installer", "@title" ); -+ QMessageBox mb( QMessageBox::Information, -+ title.arg( CALAMARES_APPLICATION_NAME ), -+ Calamares::aboutString().arg( Calamares::Branding::instance()->versionedName() ), -+ QMessageBox::Ok, -+ nullptr ); -+ Calamares::fixButtonLabels( &mb ); -+ mb.setStyleSheet( -+ "QMessageBox {" -+ "border: 1px solid hsl(240,2%,79%);" -+ "border-radius: 5px;" -+ "background-color: #FFFFFF;" // 设置对话框背景颜色 -+ "}" -+ ); -+ mb.setWindowFlags(Qt::FramelessWindowHint | Qt::Dialog); -+ mb.setIconPixmap( -+ Calamares::defaultPixmap( Calamares::BigLogo,//Biglogo.svg -+ Calamares::Original, -+ QSize( 321/1.9, 297/2 ) ) ); -+ QGridLayout* layout = reinterpret_cast< QGridLayout* >( mb.layout() ); -+ if ( layout ) ++ cDebug() << "STARTUP: loadModules for all modules done"; ++ m_moduleManager->checkRequirements(); ++ if ( Calamares::Branding::instance()->windowMaximize() ) ++ { ++ m_mainwindow->setWindowFlag( Qt::FramelessWindowHint ); ++ m_mainwindow->showMaximized(); ++ } ++ else + { -+ layout->setColumnMinimumWidth( 2, Calamares::defaultFontHeight() * 24 ); ++ m_mainwindow->show(); + } -+ mb.exec(); ++ ++ cDebug() << "STARTUP: Window now visible and ProgressTreeView populated"; ++ cDebug() << Logger::SubEntry << Calamares::ViewManager::instance()->viewSteps().count() << "view steps loaded."; ++ Calamares::ViewManager::instance()->onInitComplete(); ++} ++ ++void ++CalamaresApplication::initFailed( const QStringList& l ) ++{ ++ cError() << "STARTUP: failed modules are" << l; ++ m_mainwindow->show(); ++} ++ ++void ++CalamaresApplication::initJobQueue() ++{ ++ Calamares::JobQueue* jobQueue = new Calamares::JobQueue( this ); ++ new Calamares::System( Calamares::Settings::instance()->doChroot(), this ); ++ Calamares::Branding::instance()->setGlobals( jobQueue->globalStorage() ); +} +diff --git a/src/calamares/CalamaresApplication.h b/src/calamares/CalamaresApplication.h +index 77cf3a0..0a99d26 100644 +--- a/src/calamares/CalamaresApplication.h ++++ b/src/calamares/CalamaresApplication.h +@@ -1,64 +1,64 @@ +-/* === This file is part of Calamares - === +- * +- * SPDX-FileCopyrightText: 2014-2015 Teo Mrnjavac +- * SPDX-FileCopyrightText: 2018-2019 Adriaan de Groot +- * SPDX-License-Identifier: GPL-3.0-or-later +- * +- * Calamares is Free Software: see the License-Identifier above. +- * +- */ +- +-#ifndef CALAMARESAPPLICATION_H +-#define CALAMARESAPPLICATION_H +- +-#include +- +-class CalamaresWindow; +- +-namespace Calamares +-{ +-class ModuleManager; +-} // namespace Calamares +- +- +-/** +- * @brief The CalamaresApplication class extends QApplication to handle +- * Calamares startup and lifetime of main components. +- */ +-class CalamaresApplication : public QApplication +-{ +- Q_OBJECT +-public: +- CalamaresApplication( int& argc, char* argv[] ); +- ~CalamaresApplication() override; +- +- /** +- * @brief init handles the first part of Calamares application startup. +- * After the main window shows up, the latter part of the startup sequence +- * (including modules loading) happens asynchronously. +- */ +- void init(); +- static CalamaresApplication* instance(); +- +- /** +- * @brief mainWindow returns the Calamares application main window. +- */ +- CalamaresWindow* mainWindow(); +- +-private slots: +- void initView(); +- void initViewSteps(); +- void initFailed( const QStringList& l ); +- +-private: +- // Initialization steps happen in this order +- void initQmlPath(); +- void initBranding(); +- void initModuleManager(); +- void initJobQueue(); +- +- CalamaresWindow* m_mainwindow; +- Calamares::ModuleManager* m_moduleManager; +-}; +- +-#endif // CALAMARESAPPLICATION_H ++/* === This file is part of Calamares - === ++ * ++ * SPDX-FileCopyrightText: 2014-2015 Teo Mrnjavac ++ * SPDX-FileCopyrightText: 2018-2019 Adriaan de Groot ++ * SPDX-License-Identifier: GPL-3.0-or-later ++ * ++ * Calamares is Free Software: see the License-Identifier above. ++ * ++ */ ++ ++#ifndef CALAMARESAPPLICATION_H ++#define CALAMARESAPPLICATION_H ++ ++#include ++ ++class CalamaresWindow; ++ ++namespace Calamares ++{ ++class ModuleManager; ++} // namespace Calamares ++ ++ ++/** ++ * @brief The CalamaresApplication class extends QApplication to handle ++ * Calamares startup and lifetime of main components. ++ */ ++class CalamaresApplication : public QApplication ++{ ++ Q_OBJECT ++public: ++ CalamaresApplication( int& argc, char* argv[] ); ++ ~CalamaresApplication() override; ++ ++ /** ++ * @brief init handles the first part of Calamares application startup. ++ * After the main window shows up, the latter part of the startup sequence ++ * (including modules loading) happens asynchronously. ++ */ ++ void init(); ++ static CalamaresApplication* instance(); ++ ++ /** ++ * @brief mainWindow returns the Calamares application main window. ++ */ ++ CalamaresWindow* mainWindow(); + ++private slots: ++ void initView(); ++ void initViewSteps(); ++ void initFailed( const QStringList& l ); ++ ++private: ++ // Initialization steps happen in this order ++ void initQmlPath(); ++ void initBranding(); ++ void initModuleManager(); ++ void initJobQueue(); ++ ++ CalamaresWindow* m_mainwindow; ++ Calamares::ModuleManager* m_moduleManager; ++}; ++ ++#endif // CALAMARESAPPLICATION_H +diff --git a/src/calamares/CalamaresWindow.cpp b/src/calamares/CalamaresWindow.cpp +index e1892e7..4721cb9 100644 +--- a/src/calamares/CalamaresWindow.cpp ++++ b/src/calamares/CalamaresWindow.cpp +@@ -104,20 +104,23 @@ getWidgetSidebar( Calamares::DebugWindowManager* debug, + Calamares::ViewManager* viewManager, + QWidget* parent, + Qt::Orientation, +- int desiredWidth ) ++ int desiredWidth ++ ) + { + const Calamares::Branding* const branding = Calamares::Branding::instance(); +- ++ + QWidget* sideBox = new QWidget( parent ); + sideBox->setObjectName( "sidebarApp" ); + +- QBoxLayout* sideLayout = new QVBoxLayout; ++ QBoxLayout* sideLayout = new QHBoxLayout; ++ sideLayout->addSpacing(10); + sideBox->setLayout( sideLayout ); + // Set this attribute into qss file + sideBox->setFixedWidth( desiredWidth ); ++ sideBox->setFixedHeight( parent->height()*0.13 ); + sideBox->setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Expanding ); + +- QHBoxLayout* logoLayout = new QHBoxLayout; ++ QBoxLayout* logoLayout = new QVBoxLayout; + sideLayout->addLayout( logoLayout ); + logoLayout->addStretch(); + QLabel* logoLabel = new QLabel( sideBox ); +@@ -132,19 +135,19 @@ getWidgetSidebar( Calamares::DebugWindowManager* debug, + logoLabel->setPalette( plt ); + } + logoLabel->setAlignment( Qt::AlignCenter ); +- logoLabel->setFixedSize( 80, 80 ); ++ logoLabel->setFixedSize( 388*0.3, 96*0.3 ); + logoLabel->setPixmap( branding->image( Calamares::Branding::ProductLogo, logoLabel->size() ) ); +- logoLayout->addWidget( logoLabel ); ++ logoLayout->addWidget( logoLabel ,2); + logoLayout->addStretch(); +- ++ sideLayout->addSpacing(10); + ProgressTreeView* tv = new ProgressTreeView( sideBox ); + tv->setModel( viewManager ); + tv->setFocusPolicy( Qt::NoFocus ); +- sideLayout->addWidget( tv ); +- +- QHBoxLayout* extraButtons = new QHBoxLayout; +- sideLayout->addLayout( extraButtons ); ++ sideLayout->addWidget( tv ,20); + ++ QBoxLayout* extraButtons = new QVBoxLayout; ++ sideLayout->addLayout( extraButtons ,1); ++ sideLayout->addSpacing(15); + const int defaultFontHeight = Calamares::defaultFontHeight(); + + if ( /* About-Calamares Button enabled */ true ) +@@ -154,13 +157,17 @@ getWidgetSidebar( Calamares::DebugWindowManager* debug, + aboutDialog->setIcon( Calamares::defaultPixmap( + Calamares::Information, Calamares::Original, 2 * QSize( defaultFontHeight, defaultFontHeight ) ) ); + CALAMARES_RETRANSLATE_FOR( +- aboutDialog, aboutDialog->setText( QCoreApplication::translate( "calamares-sidebar", "About", "@button" ) ); ++ aboutDialog, aboutDialog->setText( QCoreApplication::translate( "calamares-sidebar", "", "@button" ) ); + aboutDialog->setToolTip( +- QCoreApplication::translate( "calamares-sidebar", "Show information about Calamares", "@tooltip" ) ); ); ++ QCoreApplication::translate( "calamares-sidebar", "Show information about easysoftware", "@tooltip" ) ); ); + extraButtons->addWidget( aboutDialog ); + aboutDialog->setFlat( true ); + aboutDialog->setCheckable( true ); +- QObject::connect( aboutDialog, &QPushButton::clicked, debug, &Calamares::DebugWindowManager::about ); ++ QObject::connect( aboutDialog, &QPushButton::clicked, [aboutDialog,debug](){ ++ aboutDialog->setDown(false); ++ aboutDialog->setChecked(false); ++ debug->about(); ++ } ); + } + if ( debug && debug->enabled() ) + { +@@ -182,6 +189,7 @@ getWidgetSidebar( Calamares::DebugWindowManager* debug, + } + + Calamares::unmarginLayout( sideLayout ); ++ + return sideBox; + } + +@@ -246,7 +254,8 @@ getWidgetNavigation( Calamares::DebugWindowManager*, + bottomLayout->addWidget( quit ); + } + +- bottomLayout->setContentsMargins( 0, 0, 6, 6 ); ++ ++ bottomLayout->setContentsMargins( 0, 0,40,40 ); + navigation->setLayout( bottomLayout ); + return navigation; + } +@@ -271,7 +280,7 @@ setDimension( QQuickWidget* w, Qt::Orientation o, int desiredWidth ) + // Bound between (16, 64) with a default of 48. + qreal minimumHeight = qBound( qreal( 16 ), w->rootObject() ? w->rootObject()->height() : 48, qreal( 64 ) ); + w->setMinimumHeight( int( minimumHeight ) ); +- w->setFixedHeight( int( minimumHeight ) ); ++ w->setFixedHeight( int( minimumHeight )); + } + w->setResizeMode( QQuickWidget::SizeRootObjectToView ); + } +@@ -417,7 +426,7 @@ CalamaresWindow::CalamaresWindow( QWidget* parent ) + + // Needs to match what's checked in DebugWindow + this->setObjectName( "mainApp" ); +- ++ this->setWindowFlags(Qt::FramelessWindowHint); + QSize availableSize = desktopSize( this ); + QSize minimumSize( qBound( windowMinimumWidth, availableSize.width(), windowPreferredWidth ), + qBound( windowMinimumHeight, availableSize.height(), windowPreferredHeight ) ); +@@ -429,26 +438,26 @@ CalamaresWindow::CalamaresWindow( QWidget* parent ) + + int w = qBound( minimumSize.width(), windowDimensionToPixels( brandingSizes.first ), availableSize.width() ); + int h = qBound( minimumSize.height(), windowDimensionToPixels( brandingSizes.second ), availableSize.height() ); +- +- cDebug() << Logger::SubEntry << "Proposed window size:" << w << h; +- resize( w, h ); +- +- QWidget* baseWidget = this; +- if ( !( branding->imagePath( ImageEntry::ProductWallpaper ).isEmpty() ) ) +- { +- QWidget* label = new QWidget( this ); +- QVBoxLayout* l = new QVBoxLayout; +- Calamares::unmarginLayout( l ); +- l->addWidget( label ); +- setLayout( l ); +- label->setObjectName( "backgroundWidget" ); +- label->setStyleSheet( +- QStringLiteral( "#backgroundWidget { background-image: url(%1); background-repeat: repeat-xy; }" ) ++ ++ cDebug() << Logger::SubEntry << "Proposed window size:" << w << h; ++ //resize( availableSize.width(), availableSize.height() );//通用桌面大小作为窗口大小 ++ resize( w, h );//通用桌面大小作为窗口大小 ++ QWidget* baseWidget = this; ++ if ( !( branding->imagePath( ImageEntry::ProductWallpaper ).isEmpty() ) ) ++ { ++ QWidget* label = new QWidget( this ); ++ QVBoxLayout* l = new QVBoxLayout; ++ Calamares::unmarginLayout( l ); ++ l->addWidget( label ); ++ setLayout( l ); ++ label->setObjectName( "backgroundWidget" ); ++ label->setFixedSize(availableSize.width(),h); ++ label->setStyleSheet( ++ QStringLiteral( "#backgroundWidget { background-image: url(%1); background-repeat: No repeat; }" ) + .arg( branding->imagePath( ImageEntry::ProductWallpaper ) ) ); +- ++ + baseWidget = label; + } +- + m_viewManager = Calamares::ViewManager::instance( baseWidget ); + if ( branding->windowExpands() ) + { +@@ -463,7 +472,7 @@ CalamaresWindow::CalamaresWindow( QWidget* parent ) + // is too annoying. Instead, leave it up to ignoring-the-quit- + // event, which is also the ViewManager's responsibility. + +- QBoxLayout* mainLayout = new QHBoxLayout; ++ QBoxLayout* mainLayout = new QVBoxLayout; + QBoxLayout* contentsLayout = new QVBoxLayout; + contentsLayout->setSpacing( 0 ); + +@@ -474,7 +483,7 @@ CalamaresWindow::CalamaresWindow( QWidget* parent ) + baseWidget, + ::getWidgetSidebar, + ::getQmlSidebar, +- qBound( 100, Calamares::defaultFontHeight() * 12, w < windowPreferredWidth ? 100 : 190 ) ); ++ qBound( w, Calamares::defaultFontHeight() * 12, w < windowPreferredWidth ? 200 : 290 )); + QWidget* navigation = flavoredWidget( branding->navigationFlavor(), + ::orientation( branding->navigationSide() ), + m_debugManager, +@@ -482,9 +491,9 @@ CalamaresWindow::CalamaresWindow( QWidget* parent ) + ::getWidgetNavigation, + ::getQmlNavigation, + 64 ); +- + // Build up the contentsLayout (a VBox) top-to-bottom + // .. note that the bottom is mirrored wrt. the top ++ sideBox->resize(availableSize.width(),300); + insertIf( contentsLayout, PanelSide::Top, sideBox, branding->sidebarSide() ); + insertIf( contentsLayout, PanelSide::Top, navigation, branding->navigationSide() ); + contentsLayout->addWidget( m_viewManager->centralWidget() ); +@@ -497,7 +506,7 @@ CalamaresWindow::CalamaresWindow( QWidget* parent ) + mainLayout->addLayout( contentsLayout ); + insertIf( mainLayout, PanelSide::Right, navigation, branding->navigationSide() ); + insertIf( mainLayout, PanelSide::Right, sideBox, branding->sidebarSide() ); +- ++ connect(m_viewManager, &Calamares::ViewManager::currentStepChanged, [ = ]( int currentStep ) { sideBox->setVisible(currentStep > 0); } ); + // layout->count() returns number of things in it; above we have put + // at **least** the central widget, which comes from the view manager, + // both vertically and horizontally -- so if there's a panel along +@@ -510,6 +519,9 @@ CalamaresWindow::CalamaresWindow( QWidget* parent ) + Calamares::unmarginLayout( contentsLayout ); + baseWidget->setLayout( mainLayout ); + setStyleSheet( Calamares::Branding::instance()->stylesheet() ); ++ cDebug()<<"<---------------------------WindowWindowSize-------------------------------------->"<size(); ++ cDebug()<< "<--------------------sideBox->size()-------------------->"<< sideBox->size(); ++ this->setFixedSize(this->size()); + } + + void +diff --git a/src/calamares/CalamaresWindow.h b/src/calamares/CalamaresWindow.h +index f5dd7fe..e2a0fea 100644 +--- a/src/calamares/CalamaresWindow.h ++++ b/src/calamares/CalamaresWindow.h +@@ -1,50 +1,50 @@ +-/* === This file is part of Calamares - === +- * +- * SPDX-FileCopyrightText: 2014-2015 Teo Mrnjavac +- * SPDX-FileCopyrightText: 2017-2018 Adriaan de Groot +- * SPDX-License-Identifier: GPL-3.0-or-later +- * +- * Calamares is Free Software: see the License-Identifier above. +- * +- */ +- +-#ifndef CALAMARESWINDOW_H +-#define CALAMARESWINDOW_H +- +-#include +- +-#include +- +-namespace Calamares +-{ +-class DebugWindowManager; +-class ViewManager; +-} // namespace Calamares +- +-/** +- * @brief The CalamaresWindow class represents the main window of the Calamares UI. +- */ +-class CalamaresWindow : public QWidget +-{ +- Q_OBJECT +-public: +- CalamaresWindow( QWidget* parent = nullptr ); +- ~CalamaresWindow() override {} +- +-public Q_SLOTS: +- /** +- * This asks the main window to grow to accomodate @p size pixels, to accomodate +- * larger-than-expected window contents. The enlargement may be silently +- * ignored. +- */ +- void ensureSize( QSize size ); +- +-protected: +- virtual void closeEvent( QCloseEvent* e ) override; +- +-private: +- Calamares::DebugWindowManager* m_debugManager = nullptr; +- Calamares::ViewManager* m_viewManager = nullptr; +-}; +- +-#endif // CALAMARESWINDOW_H ++/* === This file is part of Calamares - === ++ * ++ * SPDX-FileCopyrightText: 2014-2015 Teo Mrnjavac ++ * SPDX-FileCopyrightText: 2017-2018 Adriaan de Groot ++ * SPDX-License-Identifier: GPL-3.0-or-later ++ * ++ * Calamares is Free Software: see the License-Identifier above. ++ * ++ */ ++ ++#ifndef CALAMARESWINDOW_H ++#define CALAMARESWINDOW_H ++ ++#include ++ ++#include ++ ++namespace Calamares ++{ ++class DebugWindowManager; ++class ViewManager; +} // namespace Calamares ++ ++/** ++ * @brief The CalamaresWindow class represents the main window of the Calamares UI. ++ */ ++class CalamaresWindow : public QWidget ++{ ++ Q_OBJECT ++public: ++ CalamaresWindow( QWidget* parent = nullptr ); ++ ~CalamaresWindow() override {} ++ ++public Q_SLOTS: ++ /** ++ * This asks the main window to grow to accomodate @p size pixels, to accomodate ++ * larger-than-expected window contents. The enlargement may be silently ++ * ignored. ++ */ ++ void ensureSize( QSize size ); ++ ++protected: ++ virtual void closeEvent( QCloseEvent* e ) override; ++ ++private: ++ Calamares::DebugWindowManager* m_debugManager = nullptr; ++ Calamares::ViewManager* m_viewManager = nullptr; ++}; ++ ++#endif // CALAMARESWINDOW_H +diff --git a/src/calamares/DebugWindow.cpp b/src/calamares/DebugWindow.cpp +index 51b3fca..b28661e 100644 +--- a/src/calamares/DebugWindow.cpp ++++ b/src/calamares/DebugWindow.cpp +@@ -242,10 +242,18 @@ DebugWindowManager::about() + QMessageBox::Ok, + nullptr ); + Calamares::fixButtonLabels( &mb ); ++ mb.setStyleSheet( ++ "QMessageBox {" ++ "border: 1px solid hsl(240,2%,79%);" ++ "border-radius: 5px;" ++ "background-color: #FFFFFF;" // 设置对话框背景颜色 ++ "}" ++ ); ++ mb.setWindowFlags(Qt::FramelessWindowHint | Qt::Dialog); + mb.setIconPixmap( +- Calamares::defaultPixmap( Calamares::Squid, +- Calamares::Original, +- QSize( Calamares::defaultFontHeight() * 6, Calamares::defaultFontHeight() * 6 ) ) ); ++ Calamares::defaultPixmap( Calamares::BigLogo,//Biglogo.svg ++ Calamares::Original, ++ QSize( 321/1.9, 297/2 ) ) ); + QGridLayout* layout = reinterpret_cast< QGridLayout* >( mb.layout() ); + if ( layout ) + { +diff --git a/src/calamares/DebugWindow.ui b/src/calamares/DebugWindow.ui +index 16cc4a4..649915e 100644 +--- a/src/calamares/DebugWindow.ui ++++ b/src/calamares/DebugWindow.ui +@@ -1,157 +1,157 @@ +- +- +- +-SPDX-FileCopyrightText: 2015 Teo Mrnjavac <teo@kde.org> +-SPDX-License-Identifier: GPL-3.0-or-later +- +- Calamares::DebugWindow +- +- +- +- 0 +- 0 +- 962 +- 651 +- +- +- +- Form +- +- +- +- +- +- 0 +- +- +- +- GlobalStorage +- +- +- +- +- +- +- +- +- +- JobQueue +- +- +- +- +- +- +- +- +- +- Modules +- +- +- +- +- +- +- +- +- +- +- +- +- Type: +- +- +- +- +- +- +- none +- +- +- +- +- +- +- Interface: +- +- +- +- +- +- +- none +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- +- Crashes Calamares, so that Dr. Konqi can look at it. +- +- +- Crash now +- +- +- +- +- +- +- +- +- +- Reloads the stylesheet from the branding directory. +- +- +- Reload Stylesheet +- +- +- +- +- +- +- +- +- +- Displays the tree of widget names in the log (for stylesheet debugging). +- +- +- Widget Tree +- +- +- +- +- +- +- +- +- +- Uploads the session log to the configured pastebin. +- +- +- Send Session Log +- +- +- +- +- +- +- +- +- +- +- +- +- ++ ++ ++ ++SPDX-FileCopyrightText: 2015 Teo Mrnjavac <teo@kde.org> ++SPDX-License-Identifier: GPL-3.0-or-later ++ ++ Calamares::DebugWindow ++ ++ ++ ++ 0 ++ 0 ++ 962 ++ 651 ++ ++ ++ ++ Form ++ ++ ++ ++ ++ ++ 0 ++ ++ ++ ++ GlobalStorage ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ JobQueue ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Modules ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Type: ++ ++ ++ ++ ++ ++ ++ none ++ ++ ++ ++ ++ ++ ++ Interface: ++ ++ ++ ++ ++ ++ ++ none ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Crashes Calamares, so that Dr. Konqi can look at it. ++ ++ ++ Crash now ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Reloads the stylesheet from the branding directory. ++ ++ ++ Reload Stylesheet ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Displays the tree of widget names in the log (for stylesheet debugging). ++ ++ ++ Widget Tree ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ Uploads the session log to the configured pastebin. ++ ++ ++ Send Session Log ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ ++ +diff --git a/src/calamares/calamares-3.3.7.code-workspace b/src/calamares/calamares-3.3.7.code-workspace +new file mode 100644 +index 0000000..100afc6 +--- /dev/null ++++ b/src/calamares/calamares-3.3.7.code-workspace +@@ -0,0 +1,11 @@ ++{ ++ "folders": [ ++ { ++ "path": "../../../calamares-3.3.7" ++ }, ++ { ++ "path": "../.." ++ } ++ ], ++ "settings": {} ++} +\ No newline at end of file -- -2.46.0 +2.43.0 diff --git a/0004-libcalamares.patch b/0004-libcalamares.patch index c7a3ebf..8ba2080 100644 --- a/0004-libcalamares.patch +++ b/0004-libcalamares.patch @@ -1,17 +1,60 @@ -From 8770a0058ff40d33426301ce39cc1021b1bc3294 Mon Sep 17 00:00:00 2001 -From: lizixin <2271170409@qq.com> -Date: Fri, 27 Dec 2024 15:11:46 +0800 -Subject: [PATCH 3/6] libcalamares +From 0d9fb9f2b3efbd5d4ba0c4d9640bdfdb2896c999 Mon Sep 17 00:00:00 2001 +From: cui-gaoleng <562344211@qq.com> +Date: Fri, 8 Nov 2024 01:14:31 +0800 +Subject: [PATCH 2/4] =?UTF-8?q?libcalamares=E6=96=87=E4=BB=B6=E5=A4=B9?= +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit --- - src/libcalamares/CalamaresAbout.cpp | 1 + - 1 file changed, 1 insertion(+) + src/libcalamares/CalamaresAbout.cpp | 15 ++++++----- + src/libcalamares/locale/TimeZone.cpp | 33 ++++++++++++++++++++++++- + src/libcalamares/locale/Translation.cpp | 14 ++++++++--- + 3 files changed, 49 insertions(+), 13 deletions(-) diff --git a/src/libcalamares/CalamaresAbout.cpp b/src/libcalamares/CalamaresAbout.cpp -index 595efc7..65a1b9d 100644 +index 4ff4435..65a1b9d 100644 --- a/src/libcalamares/CalamaresAbout.cpp +++ b/src/libcalamares/CalamaresAbout.cpp -@@ -65,6 +65,7 @@ Calamares::aboutString() +@@ -14,13 +14,11 @@ + #include + + static const char s_header[] +- = QT_TRANSLATE_NOOP( "AboutData", "

    %1


    %2
    for %3


    " ); ++ = QT_TRANSLATE_NOOP( "AboutData", "

    Release:%1


    " ); + + static const char s_footer[] + = QT_TRANSLATE_NOOP( "AboutData", +- "Thanks to
    the Calamares team " +- "and the Calamares " +- "translators team." ); ++ "Thanks to the openEuler team."); + + struct Maintainer + { +@@ -40,9 +38,9 @@ struct Maintainer + }; + + static constexpr const Maintainer maintainers[] = { +- { 2014, 2017, "Teo Mrnjavac", "teo@kde.org" }, +- { 2017, 2022, "Adriaan de Groot", "groot@kde.org" }, +- { 2022, 2024, "Adriaan de Groot (community)", "groot@kde.org" }, ++ // { 2014, 2017, "Teo Mrnjavac", "teo@kde.org" }, ++ // { 2017, 2022, "Adriaan de Groot", "groot@kde.org" }, ++ // { 2022, 2024, "Adriaan de Groot (community)", "groot@kde.org" }, + }; + + static QString +@@ -59,7 +57,7 @@ aboutMaintainers() + static QString + substituteVersions( const QString& s ) + { +- return s.arg( CALAMARES_APPLICATION_NAME ).arg( CALAMARES_VERSION ); ++ return s.arg( "openEuler-24.09" ).arg(""); + } + + const QString +@@ -67,6 +65,7 @@ Calamares::aboutString() { return substituteVersions( QCoreApplication::translate( "AboutData", s_header ) ) + aboutMaintainers() + QCoreApplication::translate( "AboutData", s_footer ); @@ -19,6 +62,104 @@ index 595efc7..65a1b9d 100644 } const QString +diff --git a/src/libcalamares/locale/TimeZone.cpp b/src/libcalamares/locale/TimeZone.cpp +index 0115618..8ad2525 100644 +--- a/src/libcalamares/locale/TimeZone.cpp ++++ b/src/libcalamares/locale/TimeZone.cpp +@@ -20,6 +20,17 @@ + + static const char TZ_DATA_FILE[] = "/usr/share/zoneinfo/zone.tab"; + ++static const QVector ASIA_ZONE_FILER = { ++ "Beijing", ++ "Shanghai", ++ "Urumqi", ++ "Hong_Kong", ++ "Taipei", ++ "Singapore", ++ "Vientiane", ++ "Tokyo" ++}; ++ + namespace Calamares + { + namespace Locale +@@ -96,6 +107,15 @@ RegionData::translated() const + return QObject::tr( m_human, "tz_regions" ); + } + ++bool containsQString(const QVector& vec, const QString& str) { ++ for (const QString& item : vec) { ++ if (item == str) { ++ return true; ++ } ++ } ++ return false; ++} ++ + static void + loadTZData( RegionVector& regions, ZoneVector& zones, QTextStream& in ) + { +@@ -137,6 +157,12 @@ loadTZData( RegionVector& regions, ZoneVector& zones, QTextStream& in ) + { + continue; + } ++ // NOTE: Taking into account ease of use, filtering zone in Asia. ++ if (region == "Asia") { ++ if (!containsQString(ASIA_ZONE_FILER, zone)) { ++ continue; ++ } ++ } + + QString position = list.at( 1 ); + int cooSplitPos = position.indexOf( QRegularExpression( "[-+]" ), 1 ); +@@ -166,7 +192,12 @@ loadTZData( RegionVector& regions, ZoneVector& zones, QTextStream& in ) + { + regions.append( new RegionData( region ) ); + } +- zones.append( new TimeZoneData( region, zone, countryCode, latitude, longitude ) ); ++ QString adjustedZone = zone; ++ if(zone == "Hong_Kong" || zone == "Taipei" || zone == "Macau") ++ { ++ adjustedZone += "(China)"; ++ } ++ zones.append( new TimeZoneData( region, adjustedZone, countryCode, latitude, longitude ) ); + } + } + +diff --git a/src/libcalamares/locale/Translation.cpp b/src/libcalamares/locale/Translation.cpp +index 49e4c05..e5b3402 100644 +--- a/src/libcalamares/locale/Translation.cpp ++++ b/src/libcalamares/locale/Translation.cpp +@@ -167,8 +167,8 @@ Translation::Translation( const Id& localeId, LabelFormat format, QObject* paren + [ &localeId ]( const TranslationSpecialCase& s ) { return localeId.name == s.id; } ); + const char* name = ( it != std::cend( special_cases ) ) ? it->name : nullptr; + +- QString longFormat = QObject::tr( "%1 (%2)" ); +- ++ // QString longFormat = QObject::tr( "%1 (%2)" ); ++ QString longFormat = QObject::tr( "%1" ); + QString languageName = name ? QString::fromUtf8( name ) : m_locale.nativeLanguageName(); + QString englishName = m_locale.languageToString( m_locale.language() ); + +@@ -181,9 +181,15 @@ Translation::Translation( const Id& localeId, LabelFormat format, QObject* paren + || ( !name && localeId.name.contains( '_' ) + && QLocale::countriesForLanguage( m_locale.language() ).count() > 1 ); + QString countryName = needsCountryName ? m_locale.nativeCountryName() : QString(); ++ if (countryName == "台灣") { ++ countryName = "中國台灣"; ++ } ++ ++ // m_label = needsCountryName ? longFormat.arg( languageName, countryName ) : languageName; + m_label = needsCountryName ? longFormat.arg( languageName, countryName ) : languageName; +- m_englishLabel = needsCountryName ? longFormat.arg( englishName, QLocale::countryToString( m_locale.country() ) ) +- : englishName; ++ // m_englishLabel = needsCountryName ? longFormat.arg( englishName, QLocale::countryToString( m_locale.country() ) ) ++ // : englishName; ++ m_englishLabel = englishName; + } + + QLocale -- -2.46.0 +2.43.0 diff --git a/0005-libcalamaresui.patch b/0005-libcalamaresui.patch index 1a17580..bb77da3 100644 --- a/0005-libcalamaresui.patch +++ b/0005-libcalamaresui.patch @@ -1,11267 +1,246 @@ -From 06a42bff3305887a14a8bda46d1c9ab686b02960 Mon Sep 17 00:00:00 2001 -From: lizixin <2271170409@qq.com> -Date: Fri, 27 Dec 2024 15:18:45 +0800 -Subject: [PATCH 4/6] module-file +From 7a3011e5efe45680acac9ad3f2493a5bed5ce85f Mon Sep 17 00:00:00 2001 +From: cui-gaoleng <562344211@qq.com> +Date: Fri, 8 Nov 2024 01:23:08 +0800 +Subject: [PATCH 3/4] =?UTF-8?q?libcalamaresui=E6=96=87=E4=BB=B6=E5=A4=B9?= +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit --- - src/branding/default/languages.png | Bin 86002 -> 489832 bytes - src/branding/default/squid.png | Bin 8313 -> 962 bytes - 2 files changed, 0 insertions(+), 0 deletions(-) - -diff --git a/src/branding/default/languages.png b/src/branding/default/languages.png -index 53316526bc8039e4e05d2860ae5767ccbde9eb4f..3d4b0e2d63f81754cd65b9797dd0fb4119587b54 100644 -GIT binary patch -literal 489832 -zcmV*lKuW)fP)FS;tE@t}f=lRs%ZW>xdn6kr)(3BZkXbA6z*D}M4 -z2vc@M08QzUMTRmF0W@VJgV#_l%A#CUfSaO&hMQw7Zix$0KHf6inqYHVqJv(`C)nJY -zWN}-vZK#lJQz1D>g`^-AlN~Ch*i;_nP8T+tgp;7#b{bXt-1q(|D=GuuRfunV``!$Iy7GgQm$co2JVhnynDUG+!lXw$h7414y{%@v|i)TX04#*TBjJj-*%lt`wfx~8x@^4Dmtd=Z9xZpZ2eU_ZWKJV!QrWm -zg7)bSoiY_qWh**mD>`IK+NC?RP16Y4Wk}j<()B9nm@ep);m|S5rc<^<$4xdJvJ`F8 -z9a^PXv`)8alObrUpC?PwHdD|h!ztcwmub@>ThM8a37x>aJAOULg&2LXXwg=xg=4`YQzuR!JJJa%hw)XuMh)nx+ag%~nfVtWmUFr)afa -z(Q2)t^?FI$bsC3u>jfP*C_1G{!!v1;XVVqWrAb~$_jxfx@luxL)hxwp*^)OmE8gC$ -zcxSWZ-5kODTNMA?Ci!5SeajQLtH{u_r$-#AP**nDx^Va7Lt*(U^ZzLm`X -zPO|WO!QvkTOMj58_)(Dhlg*l6Y}WtkkoKD({WqKJlQx@AI^_Iev-On2j?yC;I;rgwhKPqrs%p=(KSc%VYbbO*%lvU1bII_$a@=Y-rZpH_BxBV*4n(e -zI>>9O4ll2;cxi>ri_2}EU2gOAQj3m@ifF$uK)VG&+RP8qYM#ZDb1a(A4$yp#P19Kx -zjb;UD_+^0lGlSHd5v0y^pIXz3s5K?P6H@~`KE>y;NkKFZPqKJuVvvU>SUfN;Xt-}| -z5myOv&)6V$j|qg(`xbYP33Auy0C$cmqGpOFV7Mna$lXZ+?n*4;&ZHnU69e2HqIzNx -z)#C#`2?44l1gM@EET(EgfGY7tREfPx<(NXVuh(K?15}O+UPGnW0Gf(1MTSZ-7MhCD -z!N26Tm>`;4qXUNU{`IRqUp}hHa9d;%w?-5aUT=*Ea9d=s7`-3HKd#Rg{mFTY@*{(W -znH*YIWN#P~w$Obk$Oa)1U?0yLg_g{IT4@Z`)Ot!G)Zn-!q_EQd~W1W(N?;^oCb-kI|w -zQx66?a9;84nIPYvy~sCbZH}H-94)Z^K`_%W0dOQx@5$EHeKHlJQ57v_CA?pA548q|MrsL010}WYx(a -zD^3Pjda{VczXw?GTY!ZpE#{vLF#D9v?B6UF{#;1TX`8Rk2l=+3i2MSF^xrJze07B} -z`!AAsu#mXJK|}lzi-i0jaR-ZtJ$RYOeMLm<4>EFZkP&+xh(Qik9zT1NI-WH(uwje#XYb<(hv+2IgGJL$<;y($}bz31laxJ>=3i#v&`FK}= -zk8%TixTA=FZ!6-%9YI5v+#o&n*!14(&}Xkh-`#><`q~`zSXMpb8f^^LZ(m6ZGhuIFDH#_F{S?A3bUA9_u+v)h^ -zT710Mq4REGzOMdx1x)_IV&U(KiN^)qw-xYVUXY&o4t>;yIJwC#X&w;c8NY2l0jP(L$*kUaczuqbvDej#{mrp3#%Y+jtFXg}o&Z_KE*w -zikNi8`*Sbzj|GMFSg-hGQ;;D!iuV>uI*bp{B*CKDC`Hp0MZ;uCtwf85;w6v874hm9 -zfJ6>I})7Uj*nr-(tv0!H`r%zg3F&<_cPmDxzVE -zO`}PQCSw#$lN5~-6tzcQ=JhWwGb}?fey`$R>lD>v&Qmqkp+>x-W}M>gSjD}u7S$6h -zsw65Z#0aXzEAEb0+#6-{Xv7s-r8qo2MbT!ezM$|EJWja1weqbL*SP&Q6bE=u{t -zIFyTaC?74T5TmFRBdHSSujM0cO2^vh_vY0i1b0VD?vGZ~j8fb-(&nZSLCTB_a$~GT -znFK+(Bt^L-y$Z_4>uZCQi7BLPY>`h~fO3g8HziBTrbzR+G6^;}L>Eyy;v%IZE*Q#0 -zUZiZ)CCch`7c8=1+&zo(1JbX?c)8|TkewH$ypQWtkGtC*we0s|8w{k-R -zXvz!=P&;OPnww(mVs4Ig -zxFy~;luvNb+?wD}Awf_vQBonnredOFsFWnAoa}^EmJx?e8G@&?6i;Wlbj(z= -zPuJIk&;pd<(mul8no&Qx -z%5-V6UQ&OJq+Y5^-BmudR=PZ~N>Y23qE4!7)>>Lnw76)wS*fV^7t~+n5~ks57fqwp -z($HkBOXD?)rmH2*)+k!6b!o9y@uU`*4KA(Lx#r)YJOPO|r$;J{g%{PQ-)F4&y7toX6W?iTHHC-qUM+&caCwWIodYdG0Nihlpr;d -zgWR5Eac82%T}d`IlPvB?3{t~jQ!UY=YC@1IaY3raTg6mMu+db}e+c7)REi5wIo_sH -zob?}6j1A&rQ8C6Yrb4vE|ApJ4f|R6ubddkXEzvgRqit@9vJ5vz2GNv{@VRAVpm;lc -zEWF+tX%QxTOt1QyTSi*f5Psg9A_Dvs{&o7=zoxvADJ@I^Dn^iF@#$o#z -zo2_RoBOjZ!%$&B3$fTdL+4zUWx<7)fJsDv29|2bW9$?uY0hXK$viOf6i~b0(_~aE9 -zoD4Ge7mL*29d@2^I9lNF%>{=e7bH7Q3lDTfM4I_!{?FG2N& -zhfU8NHa)gm1}zKSc39V;j|J(L8=yy?MfW_5Zh016cUfp*`CwZiAMO-!n(3(_Y~UuX02 -z)&O0!#N-INY>{-%vH5Vb#YbChy6F$Ca&5Zra_F(!rQ3doZu^Spm3x7d!!|3=xGX>G -zl6>5z`}RV*?6&E7*rjK_qW2+5?*kTn4+whfQhbnO@#cmryuC5N2b*kq?^b+z#AVpm -zHp7ou3_W7=$pM=Id0JwE=KJfvSAU;21NPYr+-oy%w_w0dmu~9?Z_m5T2g@w_WlKKU -zD)?lJWat)`PqG9bt++zx#X-6)Q}j-C>Aqa>_o;=vJhqUYD_sU|P<*;Rz<>=dT~b}1 -z`y$BGlZtp{hQrIV70=Iid1j8wi!*EnEOVKf<1%?ukWpJ~hNMZ}nSF)#<|zhcxD4Cs -z(m&nh{Ur`<#}v{uS<*DcrAdmSUSbio6I~vUS2RtKygT2ePnyfXi~zk;CGXC1=`>l; -zcB-zuSXi1~dE=@oz~8@6 -zB_w_Z2r9=)?umD~FUsZ41eYrDlFErLmEv70$GY4e@0#-uL!SgrH1}78k+IQIeaZUCPC1w8-dVg7Q(43Q>xRQIg70iV6|_G5@?n -z#Yl&{qZAM8uOUKFafD6TD4QE&Y)Z!o$|NXCB`QiK3Cbi2%EUXAinS;e6QFcV5v5}T -zluocHlW0>WMNuZ%HIKg`PH)8%JKCbmS$2-o9Z(0XGgiUrgx{7tqJU -z=l(YQJU0w2;Kt9j$eg3pr)Mes=~>Erc8=1YpW$!ih6f3wMWyWUpf4_3Sj={ivLh@X -zBP=#$^crDPF4Cb~gl(ini;E^KE#dX1D2H2O1UHAcC00^CUKnmokZ62)5mZXl65~)g -zNm4mk%Zs3LilFK!UtaWDZM5ze&E>dXfEmqW9qUFVnWDimMZ@K; -zq0tHt!!nmfAsR3DXuRA-i%jF?iY6;uny%2|qNT+R;S0=@t35O=Qzfm}xU^oYXuHm( -z?Ru9s>s?x}_doe>vq92!gQDFAMTay+$8^`wKFuRcyNxdGH@bA#=$Ug*Ww<<*sdzqH -zCnWiE=@Knnx%Q@<4Jl@;l@xBok#fRIW^G=tK -zb}72;cImOlrPp4UetTU8>~k5o-(~PVm(TXO4Bf97c0e)mpi5-FYs4k?uq6JdBKa%D -zsN;&UCp;#6>oWO-V%oQo8Q)4~eJ7avy=4CPl7&Ai7XPSN@}pw;&x%z)OIH6PS@)Y_ -z<8O+LlP*~&J+e=EY&q?*{WR=64ZF^G>^=*7&bjO>P#nA<$-gN0>aya*6~T`I#c!6! -z@3zO!7W^FW__;{(bCECt^TQR%4*{3sg&yBoaJUHOpD1Ev?iKp%5cJ&P(S56=dyeGe -z&5DmUNh2s-Sh8a9|B)3GAd@h^v5f-;a+Ej@2-wafYu(>Vbsz}`yX_=o*g(#Z}(Y^pyim|C2<50z5 -zQ!UP+dc4i;@eX$+*whRO={?Cd_odi8kYe$`D2seY`jJ72^MuGS=60m(_o52 -zlc_c>rWMg@#${T4d4(ruIJBJu?Pg1!UnF>Gei831zC^;#0`e|-9JvtWs|$i-7d#GM -z@HnKU=7Pgl1y?y%;BchC;c$V?p#qx&1vYyN1bOFdcAazBdDdpzS(~kA9X6kJ$Uftc -zb=D#Mj7{2U$FTmC#hOz#t4>+0Jms+Bl+B8hL6-a;WZ@}?1t%R={A!bRO0d5`aQuqT -zfdY?pKLwa}_yS||3mJVxFzT=(<*+2_h(qFGhxmMl*h4l^2W&rRW#J0&0Pbd1D&w9BU39zk!NP8@O>u-~EY9*5p}qL^O09D3#IbVd}v -zX7`peQp3Gl)EAcNCk_$K%)3py`%X+J(dvr#rpM=6?&k~Bz>G){uYVigTi0=zLt -zGC0FyP&y1sg?}z^X*;=yj?*MB&B4e@mwA$5Yanu+$M7{Sef8t!Lc3%^vm}ouV_cey -zl{6pc(Kz0tQHJHV#HCt1 -z+?@aq#|WMr3r|mjm!?CT2`&#N1kLZ;^3iZ>4BQ;8xGC19Tr8B0@hBJVnPcUnT`Ii()a8HcK!|`x$489me`EpbyPEk5hONmRVWJT#DMVUlN -znRsagr*xb{X`Rd@*p$}ClRZi&W7bk}K}tmza%0pLN=06#RHR<7P&%rRQlVp|M_irr`lJ<-&{zQg*l& -z8DD0!(3Bft8MMfh8);K^q)uBLBQRy7EW(tFwkgR?F*<$m1x8DZrhKgA)_B2f3DQtO -z$7MQsNph%=>{BsCps6%UP{Brh#ixoDnD^=WD3#iP|~EiTY@okzR%9_`obRZEO7E?QnR?bCb# -z>6GCakqOI7$+bf|Je3L0WNSR0+oX7AlcH0WM~4iLc9}YH@#v80(J2!;WkUxo9@&a# -zHoLsI1zy|=&*pgMSnEuImX}spuBmyoHOY&ly%vvEYy_>dbal+7$p)8tYdmVNhFYmm$KX*XRRgtGX_4`$ -zvkF7qRiM$bqb25g>ZL;c)jkbE^3r5A#p2RzjTRSZu@0VG4=vY+#ATzF7ihN;+Hb_j -zVW%{BD#PRHbf4!k;l(U?IU8Qhgx4}X-pKO!`z8!;=fFET@Q*F<&#fLGZ1d>69lGp* -zk8<5>oMUw -znDQM=`_5y=cOJ98cbWHtV&M-Si+)fn`N?J3&#sY|)L&fI{^qh?CoX?L<|)WN<+Ay- -z%a$`9+s}IBp7qE(>#_H|$NmD?U*K}+lH%|s$+yzMgmcj#J#r2BT)$V=C3L6>a!AWQMjOvQWY -zF7KwfyuDHK_YH#A*EzhlR`AMd$qT81XIBcISs{69nWV!KNxQ|8wu>aK7YJG|5Jp^@ -z&$DT+#bu75;cP*JS(17)C3R;?>Q7hH`$AIZ3t`X#^TaeQFb=gngxebLk6 -zS25b5QVFWW`u{#!WNK)UF%n~&RPF9$n|qUj+?O2W{*<7Rn1{#MJUZ6miSZV-jL6v3 -zo9xhda**azw8#jWe<^4-ThMB*pu?OXPt9|9dcNe53yzVDeFYAC3Iw~(JLH}hY(Fp9dQOmY&SBFzLDo4*=2=PR -z8A1AK!N${)wWkEDPYF^_36}rivh0*(@fn*1XDk++v|0MAP39@V0rTO8#rIb%4qjHQ -z`PF9T*M*EfVlh@r%uzwgFd(q)~-4BzAM`EG|#4T2$g -z4ny)J1M>s}a;48MMgLujez}r9A(;q^g_Z(CuAtjaopjjr*e&R}N78ezq{m)Gk3EWy -zcR75Nt1G;c&bba<@@ziJv+21{&_Ca0z(GO(eUiR=)U^V$OVE3lH1x`q^vLy0nxbF7 -z-)=22zR2{^ua~D&7Rg831)aCpbltAd64P~?ple8AdhM3<-L2?zK+q>&(&wGN7(6oU`C=5Np7z3@q%NB=GG!3x0}bFR>1 -zgUiqzFd|nna)-y~J7HiJ^jt3Ky;3k>gQRzw$NNh>o*r|VH>WE4u7*!HdVI1$FkmD6 -zW3fy7i55>yRlGLa<<0pPZ!WZXXO2g&H}*Ob001BWNklf -zZ&OAKPBN4o1!c9+#95SzDx!2$5v3vv4Q5+c%%TI79eJ73BQ8cz& -z%7`LL4ZlLEp%*DV^a7=a7We`aPG4>sVWII8m=dW=IDHAP;p9c9FU45g6lEK3j&?A_ -zSm=2dGxHJ>7b7om>OTagVv?j%vM^Lka?DzJl%UFJ`5#mrBdDgUW8)On#w)5#kj30F -zNm6sN;?5~PcYmR{XS(Fx8H)SAR6ICG@$fvw<62&pDe5ef)Lkw@DC&mf<%uO8k1uw4 -zbb;%qEjodj50B~;X1;&yQC&eRDKCo^b#$T=N?-J<Fut_- -ziAy+j39lxBS?SSYB_Vn7crw+)$cq-3)gGA_}4a%54O8}xWl8%cE!iJ&?C=JU9`CL -z+Xwykc?{X_i;Iz$gIZiXA`U@hKExbW#2-;49Tg;h8CE=DyDwxGW|Q38Q;3h -z`T^z{aq(DmP3q#Z`d43E(tg*eiz4$6$tGPDJL9tbjK|KiF1s{m6noDp_MeyJ7f4eL -zId)0%brGDf;3wPV4_k5C68siW{2YMqiUhw3kDsmt`Kid^+knd2I<%*7` -zCMIdWSkii-Ln|#V^Cd0kxip_6X);&PXtqOxS%UgsN<+OFiaIl-Nm^=8ai~2_QERH? -z@hO7GCObT;)0W9L4^FmtaFW9V6NTaa2@dy-7u-9}F~V}Ukrlz+qXl=4*3~c{Eh(C? -zwCJ@)l1=qQi|WZX)sqD^Qlz1Jl4ELMRpWIXOmFKqzdqIDeOb|RQYlXQf)Z;}sRYI1 -z5;|5f#-SuSEeNBfL~rXfMW-xRQx(B&(c-@f$$yiT|8*`bFaMFAgazZewS1)DulUmx -zrbJ3pGFd5^xcs+mEjQ&yI@}f^xNW4*ts@+69q9{>{_Q-a(-D!_wdEFK;cbWjJ(EaO|>Us$|D6NRAgs -zzPTXy=Ay;d7i^9c1UXV*lV70x4<*jQzO$aGm*o}&*mALuoC`s6&Pz6*6Kp!`kafl( -z2Qop^xUK8MzqX0bl)TRC{NO5 -zm!R`5#fQ0q&Up@9brtN8qJO@i{{e@7dmVc1_Mb!7e0@Pu^vYHAF(Tvo>CX;bGt<)J -z(SM(7V-Ed~Nctaf>9$YsL5|?9^$wkLpvMlI -zzIy@;Jtm0w#%07eE}tIJiHoA&ZpFZTE`twvMqu=|`2cON%i!HGaJ$Fb^RMvMmk!-i -zJtB80B6bKq-6i>Sr)Mf+J(dLNy-G4D1A4EA_vYHXIPMDXd4rrUCtPcvayj^dMS -z=)4NrPH<>2+M(_!MZHmqX1e~B;?XEk@?=UO-Bv52hc2-fQ9R -zn1GRs@<|?565x(FxF-SbN`Pt!P$2;-#lc;%9*@MjJRYlPKN()04ljS<(Q-W86(_hY -zMsZUdl#TO@bd-tJ@_~_zvWYI`;uN>VcvOheasuUJ;MO>}DbD4_ctsiAhKg0(83VOq -z;l2oEK9ss4!QsXPMcG7;vdK_tv`6XDin1ws-=%bdPGTH0hf^xfp;UsPRFb5$KA!?* -zl00sV72Fsdq*RnnWCE0mDWX(NAveSZxG}nj8zT$3G2#k0jJ!zck(VenqJYwRPDWSH -zLegW_5tk`7{E|syZX8;0wL+%lMaxV{fzfHp^%PgfiseO%%%2O)EwMI+aPo4Uyyz50 -zCoumPfzkD`lJepU%vE`*K2f0sMxzDBmlroAFoFkWxgmj(Jh50(XPKhzaxF2A5tw>Q -zUFt4%d1A50V~doL7oD;^GEe$-vH6}6n8z0os*g#Ym@lcdAe6vpDOx1|Ltq*#(-I?# -zD`Q$>O4iB30^`@mq^XQGTIR1|foZzZquDB7Ucw1XIE4wzOITpq>Z;O4&!jCnebEBr -z6RM7d1g1lJSX|stg-ox~2+UKNx-RAm%yXMvp5ElqDNE5IBSf~YhPiaoX~`x@r%i%q -zHw#|a>hkgqcwwu@Gg~~`W&5)zPiA`Pgyqk~C45W^O#4m#@V%~*>9nS0rk}L<0^_2S -z7hhof0sYombT+w0URq_rle%WM0UE5sq%U<=!xO14wM<ZmoI+snE3-Hd71lz%Yq+07XRe3^e2zyKY677 -zqFDQz$NJwq(tdYI56R2sQ!Y7Y6g!N(z^-#1yU%&-JMVJvg6qr6CCQO1im!`oGv9JL -zAURv)@<$Q;QUpH+;YVBXTam-hg@O}7$h!m6 -zu}zYHXG;E=A$c!d@$N>!+Z&Xbad~a6a81nNi7BF($0s{HGRfhgNe&NA -zw0U5n&HZ{nzgS?Tk(Y4dqQ%7|Ev6!-lNQH_OITjCwA`L7sga};70XafSH^Vm5~5n7 -zFD*u3;w9DMH`Fm#-&`AU`BQ=U|4&@PV)Oq}VE$8r -zu2#(ay4lrgSXf&0HR0_)TmMR6wAAQpZ_-JPmYI=SWUi($ej;NRr&U)4Mo>A%rdq5+ -zwOGqgJ8b&GripTQAsbE3nye-e&VTo9uHA -znP(l+&f07^M%M+sZ5?julF`J)#(NFu>RoLDm#NW)ZBs2ua8F<7~Pe6?8x0 -z(fhch|51klM+JS3xO}|F<()K}_cA5=HM->n`Q(UV#0eO2LNffA;`4luL3@?qlLH=~ -z9B>)3Uzrcl2JO*xHGSh4Nslze8`CY`ni1fWESIP}m(O?U8!xyF&4J#l96nxB$bdAD -zej!nL|4WA#Cs=&6TrwmB25X7f0KHOm`XPCGoW)Bs;FVeM`Xb5O3oZUV&*HPy9^q$l;`ukiA; -zAcI%K@D1?U2KZ<>JU7**&3M79I)$0#@UJ;R2CahV^$?{~rVQw|3fhk?q=lBEanNX- -zOVf#p7NZqyMp;INrW}Ov2jQ8SHZ@}cl#Nloz{Gppqe<|nmgrF--Zk7F?{ROu$NjO2 -zddZUKztB}S|NF0#BB>q~G%S$*fROi9N~J;3jp8rf6X@Km!D%652ei%w=Ftul0VOb_Av0;44*EG*Zr`kWRQjlP?huAJ#An68g$fzdQibIsgK -zi*)~d>ue8=5uJ38rt4iAuJJdFgBQI+`8i&xcFU{6^raIQb4C?#UF`c}a*_SkEpH?D$Nq5nevFEdN^5PcD%d4B< -z)lmBKRt~(qC0rZR>5Iqv+x_%K&%At`>(PC;N3T6xm6roB=l~2k2%l?d$;S|puag&- -z*uxNa1QL(AjQZMT+;PRk6Ot+4DW-kzCoeO9@RTTti>{3wFM>T6VcMZ9e7dcOzB?2>c0l)Sik@47bl+5H5|_@|f)BF< -z|I82}agqLvi>`^S6TGrU@=~hc`Be_ju5fr}xnC9QxJ1!@iC-1-6Bj>qX)#aHY>uSq -zY(bMRB@Ji#sY|_?!pMuRiTU#_4v$Z@eRSe7$>z~X!tiiNUbMjI#3h`%luTZ9UCg8| -zDK<5eE$&FZS`iDUE`H*olb5SCF;fXkw5gipP&G+VHBtB#v3Q#*aeBr@_{964-s@xf -zjj$FMEihq0xqc0cP55|NV8YUJO&#n%5}4}+M*c?c2vX0Fc4Toss-kJa0MCNKKfe-jveUjO~n^|i3XnEIQp!0C!v38B#y -zJpD5di%g|x3yr>eS=E>z)nbDfk%_msJzn2s&f;!8?4KMoY0Q1e77vDIWF8)4@%T7h -zFAGvo5=T|*U -z?{M^zApepw|A&phoR@rc(dOtSi~LJPyTi(p7Mpc?ds*<+r2yYt -z39`39vi28;$zKabf8{XhE6J#1l9a=Oq5B4Zl*RYh_`H(TRd4T=~+eOz&LB$cz>ma~H8ZVeaziON>rGq!AXK#Au1p -z0@GRF6)Z1EzeAEihZTbkN&4s{MbFXX>6sO2grrZN3f0K`N|}}yEirm#rjH(o->*y+ -ztnWTS?>)-DRwpjo9lt`h!=7kRhUQ;k{P#ty -zyx@>t1k2CDxNlwhAF%jXSIJI5pRaBDe=X_vl}GO*9$j}U-p(lE{Va!%wz;N0H{__x -z@Z*Y+#}y;K^7!PSWZ)i~L3@Rf7cDV^_jwG`AE@oK7_!e{$S&xzO7Ys%0PoL}e74mi -zBF`dnmmq29s;Kbd$^Qt%`x^@cK-b -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 -zT!D=STN--yc!Jg(|j!L7 -zrfW+BF*e{YkP*aWDlvkWhsmuIb3dNf<*nikAv -zWzcdND2LRz6doDo@W9|BG?^LFc_DOJ6w+x)M4M6!z`QxtqtzT}Gbf;FQOMIH;GRAX -z&x}s-?reB>rcdLU0gaWF8Rb)dPz84l4!LW%l$eM|#s$W9)@e5MnJ<8Wg82@87em*1 -z@Y+Wqe;ecS*5r`Zb1}J?24ms&K1ZmN=TNg(3^1~Oc$ImI?VBUR{@ULLh_L#{4xsn^@5UQR^4+<+(F -z_sCxX!v&Z#9Dd#XJ5KJRCSEvQ>W8v0riCovmx^2T@c3m9{p^5Wb(NjWgn=^AljmylDtM4Z+YPLs7P3y#f-I7XS3 -z?0_0QJkISJabb5jv#Zn@->NJM^Y^sMih&majE*d2%EZJFBkP%fN3W&lj?J;>7d-=8 -z!*ZKbJxyn^_DoKWTrkQh~8KnS8Q4` -ziptyOz8=fSy!;rzWP(egz?`JbmrCWuuL3ZY@DeL93h_&UsRWolo&}e_K4%pKoYgL>~;O3&Sp~<-jT&ly1 -zpheZoI`($JrDMX%V_U~Ut{7+SV*(f{Emu!S!%G4ydfYx2Rf5g;0Vb@3mo&hngZp)- -zWLn1TZ~85~Sb(vrN@#-nY7`Tg=$Iz4Ss`i~OW;LU0gT>cCm*K_%xy)U0T@*&tBvfg -zxjG?t&-J-?p2vd=0v=xqk1d7!7s4I$to^Ij?10(|;1^koms-beEb>goML8E$C0me* -zxUn##o_1W~mNMDF1SwX1u?kF8>sT6K>J%#TB5(<~e6mi6Y+uT`=*T{n2{1`Tvf$;C -ziJ>{Ni&ce}s_Ki`dWpd$v5j3jH8KDrh^ak2;`-^>trw%d1k{^R6%O@%y?s{59fg5W -zU!=U;Ge-cUeHQ_YHeQr>iA-Q$03&#LW?{s03nQLi9P;AgkXM!jyuMVw^$TgZA~L7( -zO5ga7TdWFbt-$`;i1up(V;fUozuSh8o|^;mwuA;=RFkZhF_U%qJY>Y@A)|MOjQ%`i -ztZ5mGm|#>F!HduIuY8kr(XNZKE~XxNmm0=GV-;DpH>}LMtlJl`;Xr8YVp|V~mGJV9 -ziqO;~f9=BG4?4y|rpJ~ahP;)BXj*!Nx0VQ8pyB+8w~GT_FAjOBIN-Ut5zovCd9ujo -z@j{QsX4;I)!&3tuni_EblmLbE>#GiVqRqJ2aK6h;A9&Oo=W@eX3ogpGn0(9oz6s|G -zTx`b0Gx?TF2m7W9`7eXK%22)n`4?z(vNGGE8e|*DPpn}I=GzlDiW!@j!>@BwRl@l; -zkgxh_RWW6@{^je=He_e&CS?;Eq_%#9Dw0E`I -ztIWl;TkfHwe2m^yw}>re3i!)PmZ`)fFw=0UYd|Iem_&uKRxq1qNgzhq7Yi^RFD`U= -zd9i1PEt{?LX|86l6?W&vzNS=`(YE>ie}58 -z`EqEnETZ*Fm)0vnUYg`_?|{QRIpQ!)W`%TJ3Z0iqk-=EVUi|n7Ed((0RJR<_WClDj -z%;&y-hj{fRILmJ^L+X( -zaOk@Py3B=_$9X(E>Ih8>q3t}(pV44+K)w7U)XERIrWfgx54Cec?&{~6{7nmO#7ql$ -z;(e&o;}G`_4te^ch^NMdJT|O?SH^gBoDMm2AbT!!D1;~9bE%heh?)f+b^H3<)>lvj -zH|Kl2F%7Z>F`EToA;0Rh*ZhL&)SMV%6yR6BQDs+IKH5i=)$9xbPS=2ox|DN!KX`OF -zJT^>LwZLpm9p6K{Eg*iSrh7zHQSO_6}lvE4jdsVsoWj`&3${372TqsB;)N$g}je2&TT`AL?nWP$nE8hLPBE~bWA -z!T)2rq~bhGxgE&tmNKnn24do1f1Q8SpYLGNJuHDfgn<1UZlVXUM#=_->XTsmN4aDETE); -zL<-Cg1B|Ix&QM?kFv`HxpQ9X1$lb*ecdH_~IN*Vjh({JhJW&QuEDd;YQD~aVG)O6M -zsaXiu6+)dNsAqC7f)jX>XWMj%nh+MEE8Y^E(yHUQEhUe@-DKMMaDK(b4G-e -zmn)}6Ts{SJ)I4SYW^x9=WbC`hE|#gj=yr90k!8&0UX-b^s*B*I<}|1oD=)RCh3FV~ -zF_y82x-)E5wemzZQV?}|njonvl!Nn*q8mKIZc(N3pQr<=IQYv`S4~>Wy -z7e~CZRJj-1IQF)-URG#dzy>A-FRfN9upiQ1nHQtHgmm8!k+mr#Z)-rG&m#KmfI**Q -z;bmvUh#i5gN!}Uq!50x9eF+mx-bEG30WR^IWx=Wm*%%=ah4^nJhrvRsyINj36G9aV>%J|~(6ErrkHqiW(9Vyq1+ -zv+>L4gbvn5miY!h^L83gj;@NNpa0(}FzMGxt3sJyNBVYJ{jfj(zMp|f)RW|zd~W6a -zIN$PP3e0isUD8LDr{CY6Nq)xG=xDzt`~8jUp!NNaZFQ=K*4~b-V)jgP+3E7m3uZEN -zGI0&_d07s>>8a*2H&$d)T+qwskG*~V+{fjzzA3KkSHac&Q(QC9rRKmCbq1AFcW4E5 -zhoz`D+=(lgE2uxJg8RlE;pLCNqhN)@(tRLk*|N{YHkQd|=9>!Ujr+A7ne}Vm6kHu$~;<2HCP^0 -zTFMfL5y&)I=2u$EWGhP`rePBBU#fcJ^bx=$5F>yQxagNo8W?_kX$4Kzq|7K}vsHl! -zw>MrUb;kmVwT0<+T9pyVSYWa{GJ=@Ks{-^(D~(19grvl%KKYf!E-%Ho7-eH#(VmQc -zKCFl4>phySPtkOfOY?0J?|v52cvA&EwpTE27Ze?U;v+C-PejkZ%W_uEJ6n7MF7Ix^ -z-rnNz&c?`8ML#}MTQt7O=Ct1InLvNLEs+WIH(l=2VwFeR^&zcSg|t`}&|+E2fMUzC -zh}O#^T9wI4=5trSLpm2l-9bUQWshI5|6pn5>X9bK#`ih?DYs^PC{&%${&|myo|?`P|ws -z;%_4bdvJAb$T?j!7$0z44%EoPSjvv?5gC{{u1CbNI$1XKFOWH@8=NH2=?TZGZA@90 -z?7$3bp066`9s(UHETI9TU-XPsm3%n1mpy_RqsC-g08+D=axo?!qxxk5kB;nTiBcoQ -zMWdKqEBI-*3VzmI5aaOkE-8N2QJI)@1}0Hsl4i0h08_&#Fjjd<{)1ZmD)l8%U~FZw -zZ}wf1jTf~T7(1D=FLCZA*?bYeB(|}%b1}k;)YzF4^JdZO>ct7Aw129&3 -z5vUk|G21U*di$lH&v^p_emgkgcL~6ZP!K=l&*LI45xB%{W0!m&fRS}9M9RxWV7G5H*_#jN5Sbe#sQhiA)Es2HfsyG{ySj(&eBY44_>prOl -zFq6W{+GGXz71~c*#cXx5+Q$;*MOUdRcNEzpc)3mam%@mfXNTN88*Z8Pu}Yj?cWvMGzrJ1};$>lMtO9dN_!i0fn9Sgje>J|-KPpd|qqvkN15nI>?FxI(RC -zQ$V?w%O}HSQediVy`*Gs$1}LZcJUk`fK{G%Z*o@0Wud-E4 -zJ1z?6OK~w9E@M1ujZVfVRfp_x)o@iI3tW6IHEm+DiFy2akjF&>d@dXyXz}fCi^;ac -z;L=Bmi(14ye$(6Kyk0tj7cYhthja2A&WQ&n&(6_qi^H$7Q>f}V^CT*ZYyf8%b;ad$ -zsVzNRPV27YV3d`3lf`bcNNI67rJKviU0qJPcmgHl9#IltM76}OGn)$f7ohTb7 -zs4u9f3Kjx@%+IfWyZY-@e?GaNK!SaJ`{yKJqN_eG^ZwCpD+6<)*@E#*mGX)0Jrmfs -z7P3rmNp3qRXIlN#=-^O8L(nGklm7eK?}r!f+9dlnc5_GIc}gd{DPwnKQk>C6)-n}2 -zxSZ9^;hgR+=k$=h%;UT)m*4jE_+75gAM!%}nD3d^GBb#2!u}3d_H($pzr!_yJ!%ed -zs5P{L8w4^V9Bv+-;W}hyc+_Fu{Ad>+Z}VBYAM@XUE&Dt^+pXH=z~p8&?Dg5S -z$7kK16sz~8DBI^4C1y#y8&kT+j|2Wbv-h~n{7yB?YASP>y4z#I?ud!9m3>pe$KRy* -z=o{NkraI;&2O>5d@>qW`V$Rnd!;_tu4FUN&>s<2Ix@52Q$r8+%V86ALby_8Ok)6z? -z?Q%hkZ%)f)3ii7+6}*(`Sbz~|*j$Xw#v}mqmU1XDz`VKC)*>5-Df4(mma?Tjuax<` -ztfAp06}-FJq2-2%7Hc#Fspc-1M$0q^=^Hhr;c~00G*bJRK*rd~?2x6hFpZ1~;~R+4 -zIOe-69U89=X|&3Q>tEGg&4LuKF7S9|q0LD)UKi1FvrmhSDVlHaXt4#FeCG4+c8?~T -zE6CXiQ}@EcBO$ZO14iu&XtyK9J6l}d-4f7rYe@600ZljiG}#pL=4xm#FU8X{%gz2) -z^9>PgKl5q7-KYI#XrZ4;D_lBmmI@OgD_QfUM@*G<>!r}94BF@yaK!-+k2uWz0}t}r -z#E?#lBDyXM>9!1-%?^3vlM0&6j%YtGphIaun|biJ(QrpEho{GcG@Jp=W~FFR6wqh} -zJo=u?T?HQZ4vV;JSjc@N1D^gM#G<$y9V#xj-*C+9}yoSGe=b6R%983tlJuE+^^d@#K5KHN13F3Hv) -zvCpwmV0v0GQ4U6SG6BtTS+bVd?284Mh?BZoh&et7ewrKc)0}`4dItPD3lr);+ccc1 -zc}z-+Ku0P}#Ie0};8?+oAVz?a9r5!Xs%KUp_y8YsQuR2-TmqdX{YLm}4`4^vG5AZl|pwDjyhx~3x -z$oa!UE*N2REehygteWHx11>h17Yi@Sy<9X#mBp26ED7%Gs{I$WjafK}xb_nPjD?s4V02C3MYk=$B=CZ%O*Z+LNfEUsrAI3TFBV|Z -zSr@4-wmw-_GC_>pbWv+q{W-Q0SxSs)64U-mVZ==WnAx_COmDK2oJImL`nR}qr}X#;8JS_Cd4oGMYb~4G1rz1%xD;KAaE2j_)6G(X^x5}(IQ0-h?3c)B#CL1|FA^@rLKL|RVpxPs*=|TUNE^A?YtS7_>y7k>vjY8cZXSrbDpZfzQhW -z{(0Ep+f<5OVZ^o&MsIUyTY8A*i#*<0&L>4tY*8KpF7V -zOrOUEF4H_7oDy)~WS@IXIN#;Yk8Q@~uSeZ+ag9x^<|yBcPhLITh}qqf*gi@?R6s<{?BIGI?*ObFlD -z!(zd6S=94K!5SSV^Ay-(IT&hpim8+bObWReybDF{?k8dB6JWWj>dA -zJNdZG$1)*Bk7wRL+U?^j+r;eNOVT!GJ~p)yKI*~WIJ4#=W#+Je -z*Zi_$)n1R4dmNVSi39$79FvQgyT@bhUZ0{pwxw*=Ziks_DBI;3OWA~PJ;o>JUnxHR -z=MmFhw&H-xh9f>}4n^h{EyFgH({H^`pH0wry+@yQDI4lH0OQbowHvpSd30Fi&|#$@ -z##+f*FSnzYEtk2bp-fh&CS@*y7u5vos-uC)MrJTFZTFG_lBgxJl)bjpHGzJG`c>BOo>dp -z&m!9Y_ka95ZVhR@I-=$BfDRixI&2P1nM|uPkCux(+ANM}y(FTw>|`rK8qSJ%d{_k! -z^{?QasTg?axdJ*ZfOjUPOj}qRD~22o1)$G%bo~SrpN{5T5@a -z;PyV{+^K=bp>XF=kNZcuJT@-k-Dw^@7l!m*;4ye%#L&`+Axoj3iUmG(jat&K7&^@h -z=`=5*(R8?bpkp>+Y8AkB{d{Wn_qeVf)Xa~#sZYQQW3>%qgZ&N0O0`LG&!C8BK8kq$ -zQwru{|$DvMds9O+megBB73!rvymuJWL^ji@yd@D36 -zgbVU2IH7yMDLHUjavR>4 -z3X>gjLeG#Bv*EaG3o!y3*~$#K2wvhN73OEz7BXsNM@EG?w2O3%p{K`0AtmcG{B_6MP1W2xSt6xcJrmW0^`}h -zzENG$)yYZrMY}K6w_i+n-$0Dre6iz|@%GC=pWh4$_}!3*-wg@4U_{6tM~3`)Y=m+y -z8mKfUR$ipOSb#~ZEtvq5h8H!D$vXC*1I)FbPzf*wUOo;@{v{1K)?$`qV61)2)+X1A -z;Y9!=>zIz;LrD6qd!Qa#2x_UckqV@5H&KqKwFtkPIzU>aXC;ib!Z=(ZuE$3~w#Q6|qpti(1C^K-pecz86-T -z-?&CL>vF(j`yr1Vhh2L;6z~rpwtBE=KXfVnoc7B+-dYH6Ez}65XTte{7j3y{$Hk0L -z&hdGsFu>Zyd^4c-kSdWUd)yxf^y?eN#j!gsAE;H#(rdt6Z9$9pXS#v<0oTEx^ImTnNULHs0)Z-ysx{VJoA -zwneOJ{jn@z$uTWrY6vsROKcH~b1ez9oZK~42{5{CP7E&zv}9f@2PI|i(jt6@EldED -zWLv5?eI;++Gq344$=|nl{oe$b%&$W#Q05zX-Tr?IV15WHe(dq10ZbC$SMJ4}j3EDy -zy_TL!{;tW#CHE6BvT*l(h{^nSH#wQku4yncRm@!-v=ww_cZXkfcT9VkGBUsIS;6@^ -zj%h5rAWwssjv2(fu(xAIF)!`sa7BM@$&_>Tz$4TgTtV$2De4U_=cW-ysQdmtZXQ)Z -z{V@@bj`e9UawkJKdnTu{evjRKTDL#NmIEm^?Fr1j%&NVrSQo_Dfd69UV)lA=^zu8~ -zP&Rv)YXHXPVjL#!R=8gf|}8!rqe20vuyG(%Ule^Xz+4{&BX{}l9K?8QA=be6I8_D -zl6e)(yq*Cu0vL0arg%%0!s|m?ZHQ>SKA`z(RS&20EE>Ahc}J%Tz{D9D1^UZ8Ga6}a -zWXi?(G+h&!BdB?GQHoa<_`JFhUNMbi9xb*o`^GNytSGobyP$fz}~i{Rx6A-5KkQ#0SC -zwg96bqIQ2~G(6;`i7qdWcX@U+JUb$w`DDnS -z2L%ftyA)IyaD9F`_4)+V>labGUqGD#kDGf}&}2ryuno|6CEPzw?UNM-P|nJg1=%rb -zi~*RQA!lT(@X7+r=?e9C_xV%z3T_`5^1?WHajYHcRC}Qmml`<{C+0*3UIZ}8y9iWH -z$bu7lq~S#nqd>ntM^-Wg^N-8&48)wB4d>;+8QOI079tzj&ooxq3x3fDj_U(8VvzZT -z9#eg?KqxCTSs3MEOsGEz{>R~e*~xy=%>smcYw7{bPU`5E}L6_d`SeFiZerGc6Z?fB~3`Kf(aa#R8dei2@Uu=CK4;ssl{A -zHu--JFqeN2aOL>GC@h%(BWN+lg!|J9%rz5jeR8ti6iwwBjR~m8u -zf`|u7eI8#N&|sMqn27sJeQqoExV|W)W(+R|U<&OBVX>Mf0`m+L~ -zwA7g;h_Rb4$#A9Fewpc;?2F03#870blq0U59&qKirBF}QrEuztkqJsxZJdZvkJ%|QieF?p8lheN(R?C{US6?~ZrSbG>oZAsC7 -zsYBzXA#ZD3Z9%|0r9N+!1iV(F5z1I~nd9?pQ9y&)0Z+{icw(l{Bh!;QWRLqMdEE1f -ziv<_Y)FI#Up<@OpZyM`UZ;UovTx!4Xp(s*aDYuw=rDZVOmWRG_=FRbtFYWjCv|WCp(z6-HM*o(U?tUHQg1LsiKH -zhvfO>n&dW;`?_Yn;m&;gKe=7~>(c$qujBsyH7^cN#AlVEhy*8{uNv`P^wHo&A}dZhPl)mUcoKzr?~a~a&8-);?6NX4~#uXr}_I$ -zK4tR(kFEPXHtmNE`$9JC^H>+>Vpi^T4alf&S$i?__XuQs=Ir(<+^t+pifOx3Oy2F- -zaQ`l!@fyC|<(r!2Prf=#$v&4AhXd9f@>p{)Wd7G4BQ_kQV7*WNMocqV-a3z*HIAuQ -z&RUaXVqChecImR(r_(Cm+R3EGtn_KU!l%^=--P=GFwK_xRX`?fCzBduYmIfaVSH`7 -z_`F_LRf&1E%;B|V6*OMs(`FO2->h90&!{lUvZzfm0T>1J8!vOM@}tL1ZL)&@QfETm -zT^<^UX%gpQnym6@CR^Itkat%_ys*=COx -z+mwk3O*W>>wsJn*4-3l!R=7Shj|2?(%AwhIpLcgc)9nr|x0cgli%YYu7>Id&B{V3k -z;Ee?yZS?bJTV$+bEmsA`a@TsDhXAI_Cg`v#q~)R%EfzYoToTc83A9-p(y|m@{4n6* -zeh$x%3h1%~Ixh+=#LNwNd$KYro~aq`wlFjh^W12tpYQSTh=@kBp?Q%{vm#|sLhkBc -z&Yk@O?&uHoheXtW&*Oy;BU;an=uzy^Z(+oHOJL~IkfAFg2Cjs6C!~0BtVh%7&~{Ep -zyJDX<^P$0q4mb2EH$#-Q`@(g7q?o7*8Ez@4;DwI@nopM!1C2gWi&?;5^C}EDy!L6t -za}(joaq#p=pElE>_xy+<3ot{MH}=^_%{-)LX?iKOCV2>UpFnC2o_eD@| -zm^Q!4IVIQQmpLJ4<-%#XaJsRM`JC1>;pn@I^^Do9QZEqPWu$8{{P`dF6~HI6z`nZQcs)it4g1^1KoF`Ip{!Sb0Eo7=s_DyjAya8dXzyzE>JZTiO>Pw=){8{SD -z2U1?FG9z`SYU7v!{5nb7ShD*Pn&HaCLT0REIpjW -zsO9*~V85(pX@I%z6Wcykds2h|COOpsM%yo{NY=Xh&C_+;-oJHbx(3;*FSda!8KE@S -zLd>9LCcFr0q#E2g2NT$r`f`6s$OEMz4=hyfCE)3@hz84)d(nucZ|ah-D~zZ)+itPc -znyrl%9iMtdJ~tO9*%zN%=3xdZtxYW8`kBhSBp;t1u2lP2EdwxqTG5#e3hYaHk#+2f -zsR5Tw@r{MdKuo;-a%F5Es}3;BF%UXxLmyfGwuvvMzWL%7DrL -z2u#!1%&&ZAe-kiwSIGQb0Sl$Nd>2r*Cq#LdHTy!=@AKJoAYjWuwEzWdFNbY96|klp -z#(d_HwPYXd7FEz#R}u%F?KO8ZWPn-q#L)2 -z`DSqP0$IiS+TE5!aj8^Wdi(skm(Q>By`zH5uX0?Hb7r -zamfsDsSYYt@B5~QUyWivcwz-6ff!>gikrst*pESlfd*~0bV$QP^^ZRqz*PU3>i09> -zj8}i|$L?o-9hm@=yx!3i7(JJ~=Fy-?k0sCRnt4CDoxJ{ka?J!7tB!b;70UlkfvEyY -ziCXhR*9;XW^Y4*q0oT8g{kz)|1OvLAQk>j5WjBFTzueU|85!kc&h74+^J`^fdQ_Mi -z=HFze_-#&#KjgYxkZ-qSE=oo*`)W(3oXZ9tK=!hl1EJ0!s5```-tcm68d<^3?}ywr -z+U4Fc2YGtjZn_sAWXUerxYuXn0f+Vb9X9Sw84K#_eLgGqIh1{uGMh0ARI|KC;r@U* -z-+9cIl}r$`D-AIdcWLy}H`U4?{j0(}SGvz-?O~UVhha7zzALvfDyzr -zUhZ4CQSGu|X{l^%K^2HmpkDyfVqHj!^-}30USA?LMq`1M2pQXgZ}O?`+(1C$76{bF@9e}r=20qcSN+>;nVUnhgRD{nr#!% -zK;zBu+LDkL=alo#5|7SXq048`c74PcvWmxOdLQ@yfJ;~5c6XQt@9Af)HgkgUZ%t!BYf!{AOq#6;f& -z`dcZ#G7BCb;c$09m-_u}4&=@u0gsK;b_{eb4#+797`z1DD+?J?<}!38be;`Qjnr7C -zkJOhob0gZ$4|!)c+&S3gx;$CDpiTkEQg;0SxS_z~(f0#m32QwqqSchZ*tTxZE$5N` -z@Ztn`VG=wu0iJw6;FU2hou>JWS`?96BCrX#I@jg$JmqX6qrlYd1AonRd3z%CEQP_V -z;4O`F_p9K7JuL{GlnFFF6}ZQ4zT||QkR5P#&xi|pzBBC@&UXLh4M>?u$LLkJ$jfz$J`N0x#G%&r(t5hDJ$|>SC0a -z!q6x(Qe~3+0+^d*Et_q}E&r-F-E%Ni$wql833ypW{66TBF35xmR{s5?8NUXe~{@-MQCRRT`eiAn|=Cz<}>hfpCLPa -zhJ6__BFVjIpz_O*kG~8|=4J9feWnRq{^e8nwa=Vyedh1>S@c~H!%Ki|84Fo{0M;Ia -ztp^=GKUl#RM|?IMiTLk{1$wV3r_GWSO_oNe^Z%X2&~Tx^#pCr-msjVzygb+E#km20 -zOTcB8#}hL>9-ZMC)#bsdKKD)bxJ%&jsmmP`TyC3S!9@Z6n?CTVJ62mR0d?LFV#UQm -z%T>b^&iA=|Xuzd|JuayX=nGt2E=(H53M{z%p^sHtGT}vPivgEjKIi87oRjNucCKTN -zGA%k*X_4Au!6i{zlIr8MMJ!QWs%2aL18}LdhIMwTKucz3CG&QYT}j?V3j$8=6#QVO -zrRtkt`^GmD9Q1tV8+nD!jg9Qz>K&ambCvn -z0Hg1Jbqkq5r3$RXFjD2Q9|D)^kGHS-@1nnd0x_9jmsrD3>{x-uF{Q|yqGJX!Z9e8# -zT|Lg~=5bbc*X+qydzs5QS+<7xx7iNA&vDF_j4Wms<-7c)R|S{%Im{J(Q(V?B;PL?> -zR}BidZm?^tWw#DJ!cD^*ZXE-6ydQGUn1Fjnd`qLrUs6^9EB3>heX#xzrT}Ek{(u#G -zQ+6-Lj9$8w?2Wf#zH=%1&Slnj4l{Qd^uKK{nDO3XjYnet7FB?o=h9dy}n -z&^7hS6TV0pi0QlDHF=m`>l_0zQetE$%UbQwLxY#AJ-VzG#JF^bgZ&A_NQn`^v|8!Y -zV!2E6We&z3rMlqdo>`t3WXSR*RYpgxVp3v~n&mXaDA4cn=JFIR*L$?xBQ?Yg}nrjZ)U%yx|3kI@E<8pzBJ*h=4gUh}m9tv0E3ETYj$ -zl?u4Lw%DcN3TqwfxFe*~PLFnN&(`r*li>*FQrLb&+4jT?J>??=GUc@ptVx9v- -z|K-v3bBDG&BU63AT|lD!yX`MR(FVICUd@Y*NPtQfN+^VZ~uM~ArF)i*Rj_S*;f)F15g{3pniH7( -zP1jO*cvQ&cIUd*cinu`vPo7KNo{mwF-kbt`mO#H{nASD@LgAM^;jC<*GX*fQ5_3v! -zNODZTKOfG>g+Fw6xT$YQ!-??9IJl*Mz%RSI)R5|u6L4a-tY?vdm=gssIcZCoQDxLx -z)-y5|GkuP1Vge3rxt!87bQH1m{QeiS7M!6WNF{Z&R%jaitqnW_vCjy!7F8`(9()^eLlPEHRm=n4yiMB&AiyEP?$EqqYm&WzUKL#+`cu_#Vx&kA3G2#6m02rgbOtJuz -z2`>r2WWtN7Nv;H#kXvU8UJ~_1LzJP-zDR9}A;wtBVr!Yn!xUP8F;+6|#1ujOxp2=s -zc%W1#|Y~KX-jrtPr$OwpJOS@)f#8t*R7GbPns!jek0Fzk9eh6MJ -z{WLIxmsJ7AhWD?X6d-spfqg;C^eDECVFoKJ!~3&B6Wq5uI(7u~&O*?U@^Y8zr=`Bk -zORFz}mq$wjo-B=MPzukMhUS>uid1sOTdeYp@{+)dhAM651+q6q -zacEzSV+!qu4E-Wt_!mASciNH4WanjKJWy$DV{zMmJ3MkzzcnK-nW8p9}AIt;#~02wWEVG*tVI{MQTM<u>>&Gs)e5fs#1YA7ojB=?x(npHRwZmPLak*+( -zz!mR>CgXC+5TA<&XAV$0{Hec&CvDC}s*B)7;d~R&&&ar#P<~#(xp@KS95vhGq^)6D -z4rl0Ohnc(pM1i(~zgC4(W|1oe$p38)=%n*M9D*~7V3X*H`T=E+K$@Rw+ -znB?_;=z4s+#Kz^O+sE2kV3CE)oc{s9=-(z$Y$`u5`TY2rJYVA|5M%!S)wX6%ND2lz -zrZ6BA4`pf?^Yl(GXLj*9vx}}SXLPBs!jUb3vZVg?T=I$q%`> -zx5vc=3- -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 -zcBHoaaMJ( -z`;_PG$Qm;kn5|sM^fU9GttmedtfGc6X>Lh~)+fwy@;X_*`un*<_HssXv;#xZ4I}6@ -z4%**8u-WmUGo=h_JvAB3oa(T>xuoY_c(%X3CzY9mKjl7TE9O3)}2iJe#b7rnqesM`Wb- -zX~#7K9uPht)VWnOQE0ALd)+G -zLNF7j|NY&vaTmHYG=PL*p{Ozu8qRxC7&_lJc@VclW&gD9UBZs&R) -z09RA2rm@jY?<|Wr>Z}x<71~Xo-}X>9GV(ShP0J`u)(Ie~2ak2OZUlY^b~&?f14=Vc -zyH5U?KpO$d+tMN)0>2{gaa&t2!*MMzb<}V`f`8UnTa#!_Ft{G*+$A?dwk*LK3Dw3rF{o(u -zf(t3sa|8G;=m)!3Ix(I3?ZJwdw4))Mq_MjkIR>vU9E*1DYZZ5^#NqWz<{En%zRJb5Vvn!oXLd_KlfJc!MTv>o5; -zhq%gJPJECBNu^A%Qdp`b6u#|-50u6>tH~-RXcvLPeR)vAx}mNWkf}T;OZ#Vj;4DU- -z`gNnaDS5cMRXr+k2**v|}?mc|S*lD=_1|pZUK)$~sf({#R)HNHp-H29Cxc|0FoCxDm4K)j~5Yo9>*u=>2`Rna`x8JKN(@Gy{ -z-HLdtIKJ(sogo5sWyP-DoTwS5sDsVrxF>>KKdIOccheHfJU2>+(L|QKQxZ9;i&6T{YG+Q}$jBKtYvtqH>#wN;rDWpe@V9HEIi&*hD1SvtI{EVei{8#Rc?$hpR -zyx?|CI#sQUUtMxfoqs3R5@A=34gg^ObY6ug&PCbLTu8S>hPGPGM<4YYW+dDvXiBwt -z#gT2@HnX43LO?MhGt&tj^VY=+a?+XO&wcwZ2mrc(53YAL`OIpG(rypTcFaF!xT<1P -zBBe%ewK&@n{vl@{mIhyH(wMF6wW6fcX$@jMfu9~p{L=3)8H0oz&t)uu{6m=!>2)AC -zjsdOoESMI^P>yveF#_=XBJLd4H1ZYpmX9|v9&Z1guDjjY5=JB654UUItWiQARiN98 -zA7ms})0PmbPPpBpw>D;}`d2Y!X(^O+U&VQ=XS|!J$pcA6#~+fw;B_0SNHeCkxygr) -z6NiGui_-i*Q4e!0y8pI09Bj2?GkokAANicT*hSsi%iPezUu`+1mcsK=GduizbfOpy -z>_IQDMH!rmYxc%}-NoUZa{OD~V7r%zb0Bm|FU&Wug8igXeI|i=XC_6)`(Ygm=4JW` -z4?nZ+2Np)BDE}o=?8Y^&|Cmv!ag+|+uc3DOWk+9jtR1NMn}$ma7KM_jyk800x+yLv -z#1SoHEIE;}^rv8am#of4bo0n{J!UjMW=Q$TRQ4PZ?Y9~xQTFy*2riRtP4o5YnAQzf -zG68GSf&ke5G!r|Vazj#9XnhsDE@HmWs+7bQzz36ne@9wM5Cc`+S3@DhJ6lW*~ -z9q+E*o{v0t`9@@e@$BYs8pp2*Q8Ejn`uvNYxUF_6Dh*dsV^=|AxBTu+RGw$dv`sZ@ -z8`>R37(s$(L+{zf5014o2Z!|KYAyG%$p<$+3D8U-(romxJIQApU(??J7?M+ImDp=D -zVPHj?=0al*&bRo)*e+~*-jf&CB9*MXhd{(^yR2oD!xe4}?o{xp`s6*M>Job4L1hKK -zw2Jy@PJ7txlA~MsPxQpr4r_M=QaLme7HR{_xk@1hFwaZU5S{M7+Ke)DOY7?a-CIT+ -zqn3+b;P1e`SqkByjTu;yDLtxcd*@1D;-MS`R -z74QJZix}VT5>9ya+*$j<(LCCcRMS=9QDE=t^>-3M*8CpaDn-ro7uRfp*`mdL6(SkA -zHzB4sp}8tTrMW^cHG#&{pkV+wG5Ehy_2!uW`U1h&z}^IFGuga1lH1_AbSs$j~+PeZr21+3{$up@AEgaOIvC}`=bOR0mD2skXhNTV7>ts2#t+jLN -zUjaCv!8Rc3(f~b=cB-N_8!@v=)5>=2=VWz^shOV -zc`P7+zf{vq*2#s9%4oZ;Ax?X_|4q9o-Glq$ -zZekxxtARw6)XKEf$0u>L;~}79vr}+Li)sDG!rsqbKBIk7O7%~cr*bn?P8-EOJOl6m -zc!2SZG3+PPFaNq&ZX!ZN+AeQmKwT|90=IFYgQ9nxoC5=>I~p=qSJjYM?sOYOv=t@6?B4?;-&?!Wbx$A(S&M(zQD11`|( -zLL~}O?e84Sd+jH42CO&r_DSdqW}yTtB+P{(*7YEL -zmf*qPxII@qFvul{eiaYHP0Z;=G5LbDT$<-badmgv%FiricRBMY5*iAHIT2Mlv%D5h -zZVZ>(>rj>NR9mnvh0oh@8|wbd -zly_MJRht4e<1C$A4NASV>A-1&@Ot)33iXj`cFq?C&`nqc**aPpcj4~;TrOQci5qKU -z@ne2I#j~r!5>sAveLryTP-&Z43-hSDCwC$4*>7M0Jrf_c$xW(e2+n&qjuL`@Ja?nA -zCt|9$7vmWj#v7J_*}89kRzr#KCB^nIua?pDky71Jq!@GE5Qy5vUy)o-4T3nDDUbA$ -zM~U8sEtwNKTG!`K1U(XbLtEMK2~i5)8oU96<4o52b073A;qI~za!UsP`v1i#;ADZK -zEhTk1eXHhn&-o!3&f^!Y9xqn}^jxMtEuxZw1O96l5Eam=C&CwS+QWJXDB6AE>cxMZ -z*9-V(tCn?Z^9z6LPwzQd5f3gU+<@ORy8lcy?fpn)gPN;d$>ul)riFm8jkkm_o(B1c -zmf{TJo^*a?H*;UIJxhl|XMxcffng1S!&r4|Y8$0iQ#97?qbD6DxB&myeXhMhAd38h -znqDX3Sr3kzy_0veW#SMxE+y>wF2;-=q;6hR2e!}HX`O$gz>LOxnm7f`jfmz_z2pyO -zM1O-qWdW#G)Lu@$o;RJONEW3XAl%9r!8DVFm*=wI^EP*IQJGYbQMTL|5%R895TF8? -zBPM_NZ3_G)DKsDVj^0}8TNzW?S|c~0MYL8zRruQ9R02o&xY|X&@XkL;?aia5VYX}G -z+&Yv4DO8|AS_7Z^!bsXhzN_ORvWQF)&`X*DTN}NLeF==aT^OK(P7x^YpC-7IgeW!?dmDF+vI(y$k&)42h63wd>{Ex`~2TKRa6npyo>MYo<&d*KHR*#7Z6M -zi2)CsLfio9?Tp|*{4gzaW0BxfNKXZ1T4)9p`%W`?op%JRTPOv_z*USND9$JQU^Fsra;mvTij4F89*O&EDWJ -zQ&G0ONc2}l1KXl9ZTfyktp>tFJu;#@2xHMx%SK( -zl5RuYmt%@I&K1^`85fAE5^oM)oej|TV(?>}WHO3Ue3NRAsRuwy$$Lt;}FzN&Dcoz5g9QwRg^iJ{pR#XT9rys=M0p>jwn$R--6aw5<|cZU8UoKcs;e~TNmM}Ic3iZ$#Nd(m%Mm?)xhk;*KpS-Q%sAaarq~z9Ov_N^d=`_tP;6IbN`xewI`UNcSX%4nw&mG9GGW#W+k9&c$;H?zm{z -z$ki{7{HP*RGN=YC1FdV<-+8}Nm&+=^>&u*>H>ZGZdhn|)q>+I%lL>)w(mOa -zh%SBDfE%mr&{!eAB1O)5AwP{4c8Izg+Ljh21}}g=Azn!=AvxYuh9e70uPT~*yHH}p -z?ZuPV+ZRf!F4U&f>BRfZOqe}2El1Q`$Y)N -z71#M+L#CUKxJGWq4rPFt^A!v)@#hD?)!B{v=(++JmQUfvh=MP -z{}G)L5t?!C1L}OoUyrFlZb#4H{dJy=^JjI+twHj3^gjA6art&L`j^Z9T747|qakF% -zHV*XERI?o8sV>9NdFkMAY%B>OqjcY0@=F=1w8DS=Y-bCo7KgVu@`=-YmH1u~n#h@8k&aAoX+mU8&sJ#on3ee!nQN8zm&%aujLl+FjvN)vR;6 -zPUV7?34Ai0ff1C86M4JBHn*tGhDh5anRjS4`nf8ivfQS~_KL#4Cxdfn@bxYE86}X)JB2i6;c;F!u=hjCSC(!LMJR35)YCRe&t; -zRW#*8XdK598>4=qh{& -z6quyR{On4N)u%r|i%5&y!8NNv(xMDN*l9G(hYQgp?JFSNryEo1fvP*#J%6VQpdgyH -z-MdSx{6#2&hf=3|IjK;56mGM&XTzBwV! -zYo<}b%K!*X;!0FqO!^;Xe9)`b=iw?%vNRNCT7IL*Y%#T&wel0oMr3-vs9LZK -z9M!{!V9BHHh9U9n{%d2eQ0)weZ|uZky>va*a7v~K?!`6Pwt4)EH~N|rgrZQe%q(wr -zLT9Np)7!C43@d#!s~}UPn$_*LQZZG4YCOSLP*U%GBc_8W2ij>%XX3#%EE&RfTY2ik -zG`@r3Z;u)5_hi#Vh$|q=Z9&>|^|pzC3NgD5iagh(u0Q!<0fDogez)FIPy0ckG1qU` -zM6$H|K9f+YdM>n2id8?=OUJjJ-LsBts4=SJ=gi)YoYXj~Pp}WJuNZDe%rGrisbKQt -zVp&h`jM*_3{9NJd6;7$6VMTsFaJ~MA7Mx-~YbBdC{N|8vh98oYNqqkFnRr#o0 -zLg`~dV-z$Gvosv~_X%Si4tf%x9k{lHPRPJmVnV1O@mwk_q60 -z2G2I1+GpB-N>|QVSRaKtYnG@K(0(x6U8&*C@Q7jtxxFWj&AqvTmw6$2I|5$+d-jl~ -z>VaLBR&nqgGi=qrr%xrEd+<;kxbCiK^|54WiM|HQmms&H;Zo<`MqDBgmHi|)SW~}w -zfDhs)v-UQ9e5BQ4<;5U7zMi*;nX^8k>LM<^7@fcCay0$PI19cL+0-w?U!Unko094~ -zBB9rNI>h<19u*(Sp_ATMG1YdLHEd_^fRR~OQ=m-JhhMxOm -z3}y;!32|cZepV&)DGI{krg#@SJK@0HI2=q-ioKFVvPX`=8@U|D;Y?Qqclyz<`Pvb? -zWVJmmc5hj}-tYdtosYx-_?38%v&bGf$>>7Quruu%WAT@RvH>7p+afOLMSKnC({w|k -zjS4O@&KKcGFnJ8%=Phr>@my|1yoikAx4_ouQT9}8)*DP3>=mHTv(2g|91s|4&VRa` -zDk{;xTq-^LBQT;i8gw1);taHMv;>GwS+gQDtkvb*1QD_z6hoE8`UvtEEf^TsLs^~f -z7qRv;OiSznld&mKlr?}--DHdkpo-%FVR2K2eY@|qwiY%^T1+Q_iZaVEUJqM{CZ3ww -zr?1MxhKJJ}s68;i^#_|9#X<;?9Ts$+DG5)G_U`}`fnhY=esC0}*I(o`!VU!RT<9gC -z&P6@%7ph;@!)`-*PKJNTKFOi&rZQs$^2=wUbzz_$d@!t1wbK%>b*mmU_93MTVI&rD -z(8r6zM`X0p3g=+nbbAMFysPshB?25h+kg-3Mc1L|fw1krb6 -zu$COV7O?*pHxg|Hc7)vS;!=>)5VB7MJ0D1`eJZ?4T|_~~|MR|>Rn>8`X2fY6xpAP0#Q -zga3+0JJZgdHsfd#(fZhdx=|N=!0iioRjUOxhSGOXLZ-CsB9x+S4|ftO0Fhz{vM)O)rjPMe-=&(w5+)fb>?N -zv{5zkD3|>l+uMYR}7nm;b5EaP;H*Gi2{J~9_P`n-3hrTdC=&=(TUS -zh=+DlC^RZGRfM9b7oJx;j-29P)#25QI@0~zDl#j#A(ups!>jspw(;8w#7r3Zi=BCq -z$+0jDa&?o0_a!{g_@QOXPw|-+IP8P9Y|?6-=pR?Wx-6b1VoRzdaJ%G84ZCc6EkY1a -zILVHnm`(==r+~bYCx|UUIQ+C6YKZ;PV -zHHP^fbB_2OHZ`2a#|j?32+RrjiA5|ab9^^*CAV1#Mg8-oQ`zo&3^hx8ogi#=In(+z$-jDID5PCODnqBc& -zyKspV`tw2Y2s>88+m7+7&oTU{TD$$(eES6YRPfue?j1h;ga -zLq3xnT1jhy^RoZl(cIM&Akm!U4AcxPmma%BDu!`0d&qA5wzR-ByTDi*BrYVRShn9q -zlXtYtZVtz`SjvAO?f*WU{H-jA;- -zaGc61wijmIs&S)t!tiQujd8-CQUb&`M#GOW&6m>$BOXoY -z>AobSvMG_{`0iTdDP)YC(9;Sx*DYh)Iy1a-U4Gd+D)Zrl-u3IPrGQ&!NiU#Rx}-Z` -zkuiv&+Q%zw=6(3XC4cWUWMi@p<<4}ePw5^=23crl{Xw1`xM$YF{qr^}o)~qD!&mq| -zUG5V66&NqQr*$IDt_)kC_1Stqm*JrnBsa}9*!MQW(vYRZu34dwYcU{r-4ekJ@izeX -z`^O4f4w{N!3JBUqtR{&H8!H1qKGcK#xIL|vn&z0OUI13ig`pX}BBFVjNHE&_$c1>Q -zV#wk=fI*YWKp}( -zr*m8~uD(yA*j%{Kfx28FJume&X`3Da4u^-a!|$kSHRq}RW*92$aYOFwz3Nl|e=~E4 -zxGO55kv~1vau$WjWIc5bb{K&Wv54Ni(hzrz%QSiWL{*QAFQMOVRRb;t{-^(SuG+la -za(5>UqO3)3VP?9;tE-5ng4HYy?cWV!j^?r@xRdf3=m)TJPK)g#dYj^md1t>yI?yLp -zzU6jJ=)TugB}QG)40CCjP -zf_LTmUSpY9j7DvdAP);Xw3zuC;Qn=Jml9AfRg%-o019s(~67X~*5^C>~^)wR@ -zmTv>ibK^#P9MxXF=R+;SO*c4g*gAYxA!j(A3x?Fwz)ufN)2xQn6DR(NUPNtCoA(7i -zV8)^0rUbwA%2wx`tcl;lfVNwvxjIAgu$7;R>8liW&WT?!Q~6!<{(YGdVZ|HSsuY-# -zxY4R{Vn|%2P&e(7y16s3nxP0z^%8cN7P(Q6cfZAHM9plDo=KfafbwjtVE1%tqI-%cgiWhAj|HMh4vh0bb -zyL8-FDA}}AN>L7LeTFFwj)Zx|Il1$3ToV&hp4kB@AosOTpvwTiyw3}7i@*V9H^=UU -zNB&~!#ZshuZd(b?3Zo});ZMvJ0nzQS2)w!|V{x91gSudwgWDivEV -zW9)Dp4=PGCnL9q&{YA#10U=M9u<>!0qFj2dt&(RTNyQSjncc=+QzQi&g;Y=#o=uF^9Bi*sF@!W=GJo6%%HugId4rwQ&J4kl6#zq -zYbfG?Lz3-YI%F}ipz~S36)uvp@xmQByw*^2)j3c)DDD%Pe%F0#6n96cYvVtRpG#YK -z&k=hrZvM+$&xnY#p!w%@aRwodj1Vo}!l#P3JqKk*lmU;(o;>;28Qs~_Z-|80AKb3f -zJ2KTJ`Xcjiyr+h0g^(L58&8p6`t0;JE%>$*H3<#kS$R343HxP5f#G=69%TjQnBo97 -z8_%*v(9Bo`&xOH-l8$dhGG%b2fe-C1FHX?xd{Uaa8K&6^$-tM`RqZukF}iDVG+D5u -zjeg>7Zv3k)@NJVuMTM8;7`U9TcDP?nREa80>`x&%DNA?kJ^kTb`}TZM*y7`2g0x># -zSC|hydTxjqGJwU=T1~RilRsF<5c|K1LM(seZHZkYn_K6?5Go+2Dz?8jV5_8Vq=Glc -zj?H85W8Uwj_>Ayerl}wBc4(oo_U#puRf+F5>{u#3z3};*wYdIo1W6?I -z$ZEDgK~J?DFx4_31b%0b{|=^b3K$nijKG`jcw3~B|FM76MI#CYpi!s&=btM%;TO9w -zXwkTQz>F7esSQ@MYM8-Yc7!!0p+xpia>;rFYpbNf|4sRX7qrn1&N(&&2cj3;^cM7d -zYh~dP2v2EA{f^73U&K?9l6k;h&S4XD3R$ -zG}4lHc7@w36SCFLC;G;N(O-lj=N^-uj_z#auZWWkXT1)hOb`?p&7^wLFLl}K{wa$S -z=eLIjWt_`bw*L2-@Cnc6l2J!*J8C1Tg+iC0SnLEK%H(cKu0J$3jAtkGZt@G1us1ig -zrj>(#Ou7Wo&;KX+v+YokdH8rahmcUG7CFy-dUe5n0rv -z;pu|!&7n$Au!@NcH=!mRjh;nxaLf1uZ~hYo+Ug!#qE^O3Ef&$ -zf|4Cn(3AF*K0E?OGXst{9hkpn9CT$Ox6Xirj-iU@!%aA28>4IlL`Y# -zy(h6zg5D}PGeDudR7m=gHWT=2XJ<0`?62}Dgi{+6c&1gOZTjklca-K(;PdCWjZUHG -z_~##rjA+vZicdlxCu=@U=TnL$W4f#&;0Sk%K-Y^y~_dG^%>@M-9qz`mNULy -zYh&k(ZMSY&J4$@GZx(@uZ(3L#Di49inj7-MyRKsR6#MSM6RK?zxVqj_p(5Ds-N$E5 -zn)-Ij)jR|9O3vwgq%JZFrvB5Dw`Dzn0O-*YE{dv91}hMKAulw|dybch-rVsnE~2FH -zh$?&&wcDT2$TpH{bZ(_gmTL_R>LN^mgTK>?zi-OPW>h49Ez)t?#u+G0tFhUxln?n= -z1+PqaRc(*(@Q(fUPQ%x@`7*u{(wG*M72#**lWu*SA2%A#v1nxQt7M8}E)~mBqG~|8 -zYQbN`(#1Vfe -zLHV41A^E(vk7?sxmKV4Ty*tLl8xmm%G8O%3LVjszD -zyk2^%XyMU#6p;^Tg{WY@u@U{N2%yB_9@NDFU5x(-ZuAm`#@9|WzAypv^nQ)G&)Tj{ -ze9+5dL$(I3ofxn=%6{7FjPX0&uX(0}#-Gl=18c4PCoPRmA>C&K&CnS1q;D!>ThLigVH1JqFw0K7C}G}xZ@iBhppSlUXTHH$f$zNm~5lXpeQFm;fuTJ-7<2jz-<8C;)#RXt3 -zvH0#c8V;!7z&-iXb93C-GATQYIq5;m#+29#vo~y-guH!f*4jD5LYV&T>_x?msp)i7 -zu{v^6bYAvir+ozA66edm?bFPUDx-+cm=-;1yOTCumgb(j>32TKcAr`hY -zPfQ`7jO@U7b+rTM=2zyif$QE^|CA>^x)3V1_UUcMg!@;a1#&I}hBN_BaH_SnB5yBM -z7IvhRzBpqwqV!{M$>#`GCkMqoPq{mxzn$tR!e>%RD~%t2hh`# -zZOz)bU@+HnGNbX^OM-_&l#m%OuoxjNOI)K{As^3r2DTcFvG))2PR0J&vaj$LM2h2} -zlJL4eI5RMPD)jlH2Q8DT-g7V*3kw3jA}jgIChyajfm2P6IL!V1x)7yb?%SJHauEYU -zClAeJYpjjv`#8KFzeBqSrdC8qYm{$orDz-2n9-(nD$@75F}4Jy$G=a$`%iAE^Nusa -z%3&-X41R{XHOOGR1n}~CA~U6uSEN5=nh)Pv|EiYx)AHCOhRynr%aX|#nX4$CZpYt% -z2YUzR8))4tX%En7_esJ9+5`W@WW!d;LA08J^0|kD>;J -z>V5Si?-l{Tp+E^07wex*84-6E3_8IPC_e!-ep>cjNvdS@0UBlL&zW!J!D*PSC{mxf -zP0tCduQ>*Zsx?)=-(bM>`m&tB8!S|2370^%V5BY@vuB-3iLDz?wnhJ2C)N5Hmf=o( -zBZF{&+y1wgIJ`mW7G9>9CM$4PY9nO%Tb_vH)FnLdhiKH?&qWH|Y=0R6o&6b#LPXkV -zsw_r2OqUg7#2DZG+PfJ4ER&q;^@^^<+h6_=x^A@S729FL7Ii|V%Eb`Qjrdu{kDn*n -zlh~RDGi>IE9WumI*qsfEMp3_md9F^D($v!=56Pi!dUQQT26+1d%G(B1c>^qj1%Q*N -z79-E-ME@A*h -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 -zYn3e?Sw4r{&SS3{+X#^=B5v} -zCRx-Mb==Z#Mdzpey6IS1p=AGixQe2*bez$7LwzC&pI%=hu+-eI3D#PC-uEd%&)&(L -z8FZ^%c`({ZVHPTYYOGpmPng3>xm~zxU-*L^JA^NOu=l$lCR=K_IiRR;@Aj(#?LXwo -zy~TO8{!qv0zpJWypubE#3}K}(ogs%-JD}g3xJ{9w(26^qDIf-_AbzgA#%ENQpGuEh -zPag`MFGxba|Dt0hhe^9aE9`+MNTI*p=~Y2{k^vZl;eS;6zgEYkazo5|YTe`&ZX}j# -zlt3%a!>}BWYu7Z68<6f9f4WG**B<$VK4?@Yk=pjiI!@?iac -z^G_S1$7vND178IUUgE;^NKiZ{N|&0wf)rQ(ZX}-VJ8R|MF<>J; -zSoDv+nh2q7)uTH(X-=H>6nCpQ+HS%}epEXAgaV@UJ(;ol$#FXWmZ+0;%D0d*FX}C1 -zHecNIWG2`Rp|=@6 -zz5kdectQH-;7o5OMOaHDDyM7t{G0o%;3J(hcsC1a;!F#@=?RcpSHTi5D16a?kH -zq?)6Zoy{!_s?Fp#b5d!Ks0iSd=hIE({gSxUfmma3UxT -zLynzlr&}QqC=3jpz6K#`ziO;C0b9vTYph|5&B!94BxVBW`!fbi2jA`(fJ*5%1?`*w -zSpbWJQ3O7!{zLc=mQB5Rfd{%i-b`M2d9LYY4wlytI|&c~>OU%8kIEFTQBUVFhXg0_ -z?N9^VQ;+fPfTgmT#@X5 -zZUrq=69m7xvH;Me291<96|k)$>3mgbjj+wdz^_{C6YQSaDzV&PK_F#wwG>h08Y3+ZFAA%BL@ZZ>mvBac}xBmZy!yg#< -z$ZTi;di(i&m~ZO%TrbYksR!kBeRCo8i%WmSz;ZjZ0Y{53SjTi-m8ZkFD$hVw5xCb3 -z0;5At0_&-3?POtNZ=zXh!g3Nt&7 -z*C#?41S6(jcj}&QvpA?vW39u=k-jMW!|*p)tB7()Nzs=33lHP$d=3xdc)sX(d>2{n -zpR3gu4*iRV)PV`V7HvGqWg9V;!5+QvU#W*yGm>l>H*(__1O@xY+ij8{8f5#8Slc;%?cC1s -z=&jVY#V=jO0?wn^a!Yg42za<{Fk|9<8oO)956~Pitc?52GSg*O{=^-Pd-f=%UwQK- -zKENGC8XN=M$hXWMC%02SJ)ngp1=lQQ*?v^ccoBM2sNhON&?>5bJY}nu<)7I6Zo)1j -zf5=)Zp^$Ah3pax1zgWJAy&ykFbwCU&UCkKCoYePKDH@7SG>DGvp!ocP-jV89khaFc -zWFx{CdOF*mc|HvtW36Pt8%>D#ScKBE5fAN8{v~MYx}Z9TX18?Y&f6ul;X)zy5ba2%F?*q=uY;GTePb -zwM0;2Ob*{55n`c_Ed{!7K`6QwquhST)HF`4o;h?LffWlIYBC;VA_NVK1bzQ?O9v~d -zk0;}Byx|htx5-EKCy}DvAkQ=V%hLqJ_+nkzNJ7O>ll6&eB(oOWpKUF(UH9I>enUl1 -z`+!F+3 -zR9hlf9_$g)kS^>$dA!-c!!|V>PS_sXD{cGT!Qy)>HON(q$QDiRFtFsJ|yaho)kefE9< -z%yRVtn1icQ*$CFrzPc!BeB~n%Q=fhXT(4;yJ$dL=zvqTUD>5Hw51b3SDj8~jq8uig?STxyLo*FH?^N9Mfq)T=~$(P0!RZ`Nm=_NYg@sa`^iUk7CWyr>rO-jYuH39 -zAYn0ulaYR=pC*I{UkW=;T@srG&3c-kGOet%s^0-QS{N -zUC&>AB+q#yZA4jJ#a=FbaLm@i$L{;Cn<|ZPkB4N&*rcaES^Y#q*F}ij=uE9p&o`Y# -zL=KDrSvZEodSx2Et-7Mz5hs^E6nv>pV43+9^U0pYXv8@nx=O5M{kABralTpc3R;tr -zy|kAqtLw7U@WXqSe&fCO2o}BJd{FeMsnfFwR%*iRTZ@gYQQ-H2neD>epx8ubt++3|6>$*DSK9Kik@9+K#Op%NHFdb-k4t8UE -zDpjT|7?#!CVN=&36qYK=#vLZYtHAWM=RB=6;+_CcN -z+5R)k?q3lDq`BjVe&WmDutd`un}hx@O&jH0liH8wqkIQk36ZiMy(T89QxU}qzZmZ1^3wv48rh=`TX -ze=2(L^e$9<|5;I1O)|XpFeiwp01eni83xUH3_j&nZ< -zK~foz1t=!cZQrqRAH@$_HA*@tS=l^CO1TdF`&Lej@aedic}CH+`NE~=g&^hrbm4X~ -zMH?}jv&t3*JHRzO-dW&KAl!fi*JMQFw=G|*6!9X$0V+|n{|n)JD#%P@+FYfPl2auR -zYnS-UtAs#6+rx0mv4Ld5{BaGBa!WYnXuSSYdN~AH!sb`cKtW_K*{~!jlrg!6JYv&7 -zioSYL$6@J;q-wwYWGeHP3ro@!#JYH1*Szddj$j+ILWyj3Fvtj1 -z%gL2Svu^wVJzLi1Agj_!{{(zwfLmpxz4vWHnTRY5(~ww29VOT_``r#P$}9Jz-Ksr} -z?O7`yn~rXe5bq(3A#yM1Gk}AQfEm5JPRk6J(AXh1BriV!0K+ggT#Pdc{n@r+LP7r! -zR_>4)N=Jq9-@N!t`dS(`5C-{7YWT>S31x%_f;(;@B_|K#Y7&SnM|SN>v3t8RMtcAj -zSGgDUfw#J$>44KD-G=2(Ho8&+5XOEwGvvfH;~((+%>D2DX;0xx?Gzm|(&oQE;T81> -zTupF1>&h(~(XONG1fW -zt3TMQ&vQeDz_TP>Vs&n`Dqp!_?LBb#G0qGRKK^#cd2w?0n^H3NOPLZ-r}obw9GcrU*?cp!sNG&= -z7%EsqUzmcgGjoN*WoZY$+9&<;8WOO`$Oc|CzpLM*jULU)I|CF&y(7fFYu@tb=$lZf -z;lpN5RDRj#3{5}9rU!_4yw=$YaMs5r0-OoZ!`@g(fb=zWE2H~yMGMKtFwkiP<{}8q1a+^>+htT#F?Nd_i;V*uk -z=__C8BbGEpZ=F2XC*e1JW!%!=TVvI}TMcradd`C=geBGd2jZa0ClmybAVpKFyTrqP -z6j#2z66eG1U}Q{i+sE$dK-+pVrrLfH8h5RW#IkpB3*rSj(kntkZ70DjZMyA9r*1iG%8NDm+mBuFfz{?3Cu| -zb!n$AjT1Uv@WFX#=PQE-ef13Z+{G1b9^1pkUp^rRvk@-0T+FROy2c_ehW73Pc?&9k -z;I#f*%*GfW4otHF{x`B4%2#R3c1g0x$bDYPy$TSy$$4&+ls7x%=V~X{s=M-De1}Eu -zMD<=3=-`oW!Q|G~m2dNAyxC<(9_O4kB6SmGVQn{ov}<3TPx5ZTV_S^4}AX)O_8+G>Pq#OVvvA4GmwnTY|S| -zn@+sJ1Hl&FS})X=E?g9W>O%(fF?YNQ{ -z>!C(WS0)=abKyjYcTAu&#HU-ZO+2BdP=)orV;3gnXE~?+>bFE4LJr6dQ#}2t8v2J4 -zSh__iz=dMFmRe!P2`Ys79Hh@*yp4bt1&6$t$I)jEYrguGBncX=0RZ9vw0m82NslI$aIqs8%l7jme1F>S}#leXf&NU@UyvnW8^{6Q-9GowoR;scORbxwKiP>$sa+yWpp*^OhISB_ -zH=-YG(2-XmM<-1>N%N`xUP7dEq!pWtA+jPPJi<5`iG&0JQUMMxy4@n^%n^81+MlP3 -zel7JGhvazu3SJ0u(p=;1{loTftTg6cG&i7tAZm(v_P*L~nOJFxZ}&tD=X#!ifo0;y -zhOL7F?{HZPsj!oUJwq#qG9=x`vB01T+dV0Q;|3q-v%`2|Yg%)pP?rfq|M0KI-(z>M -z5{EL9bb1$EKsAfdG!$s^Q3F|3)7U^j2L{ViE$d?Z_@#w8BLtchpYr9qbdIYW9 -z|DqRAxkonr?-M_iyw_c=zVIbEG{>gN{xMYg5rZ8g19_C=GHS^4rJHN#r2*0_ka0&X -zgEEL$Wo?j{^enI^Xxp;_sEK?vjRzIlO@(agcBq#B1z=3TaRC4Ssqh&#BqiA;`z=FcWK7Mc*YETKKu`Ffl -z4Zj*T{(SQZ{=f@3D`xOIV@&#jP7$RkPyK$o+nK?RJMS1^I&sL6S*+eNp^zWrxUrFN -z+r|@Gp@lanB}3;G^KbpX_!$oiWZrPbd9+Ah>WM)K*id9N~wr{zW^wxF9FCQ$T;T)O}kN -z=%;p|jp8QSF|-h!rR|I(%to-Pc?>YYLo=+J07Qc|6n9oLW_hEyMxbF7U7Ijmx3Hht -z7j!cdd}=c-cfQPCg_6tW)o>?9Td!diHT!E~)c~@pG4<)ipX!?Uw%Wy`6Ye2rQ<0sR -z#cxBWS|Wm{0*C9Sb2R-nuG{Y%wz$=T8@Pr_ghB2J_a1Tdt@9!-Ze*xfMTd-_ev$ns -zkMC)x3US8X3ypg*PAZb=Kg?ratd4+ct#HVruVA8x~1gqDcR+3%epv!za}=>^&4Cf -zEt@->_CJ#QBEko;w)W|Y-s -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 -zTH;BN3#irLnpZ5yExbRmG -z8%Mtc8a>>(C`iBfePF8mdQ}Hl0rB+ZRm8qhosNESzj-^PA8f;LE-EAzT2jUjh-#0V -z1ZdCWpf{lXZ-!rr8;g5|om?)d{c>&Pw3^~@``$t?DPKU3Vbi4d!$1Hz`s8U)SR)kl;Otg`j;3a}X1 -z`p8yk$L^%=mgpM$N*NDBM+n;|^U5aS>cyx>*2!M}wAgV}{~K0B3%~aZ%rvFpqq1tj -z$Whem5rv}Gm^VJ|9onzIqbYxG)mQqgD9_TuLz4g-wIRuvI0oISK4e1i2bCXr}2H_g;umIR!W0%5@_ibqG%)LhlK!fe7NypD@ -z$|NnFO#7*(F8VxcY7!kAbAp{{@|t$+wKMnu6yDqw87v9siEQ#F1CTS5Nc=jRIh>w%VBcna16vI@ysnlQT<59zQy|W*Q`AM_% -z#(d21-6~`K{F`0|3O_*0+i2tTucyG_=MNy!^Cox+a9m@_pgKPKFN)BPm64I-Y-1#e -zO_83ZF%Hgo%D%A?DGin+jlMGXMSmoGy(lpyxt?Xr_OPe|BnX7m-dZfLe!l)h8-7-` -zmH#y7TQlc!ei;=lb6Cs>*I{8P;IWJy%D53Es-1*(?ZnYwYl=f{v3kQa%BarFRE@ue -ziibGP2>%$t;ylk-$G1J}8+c|ZxcqyX*k$433I~=XqIbh7EVbL-KY8&kont^esL4+A -zvq7Ix0Mit!R&_O%gqpuJOJl3Xw-@p)q^R!j!?c6-?j`saB8 -zTFsnDWuO;h90TjxDmVCyVK*D|iMy}y=b1FSZrx46Jshr9#r)aMNu=pFfKft -zKnNHOID76mUWG`@Y+%{%^UfH2^$mZ@$ZtIbS1IQuF*atYt`*R+dW9)XE9bO@sG(EW -zK*v&=my@6scP3aA -zgc1GC(wFz`_BIr+$#Z-kwb#W=qBQL{1%T}T2C;6rn{2eUZkhXn?fV3k}~WV?WjIDxaWCQRg6F{bUa0y(up(Lo-KOzI6$S=N0<%3ori> -zJo*Lk^Ud%uMhIoSia7lI?M9&O6sNf|X1j%&U_Xiu$zeM~zSTjdU_{-x53i5;b|&|> -z;v_3Yuu4m$Ri306U2DNK9<1D*7e~Ct7~vxR4=xy3zjD8TSR#+lJ{h+!S!v^P`0jlh8=x7 -zv**e3#x^#Eecu9{`D8f}aYJazGPa0*=4bl?l?&-}kUFXOGWCa6QG{pMEdsw)2A@Iu -zi~sR=Scg`(@h|ht^(yAgK2jrcT-wetyD?wsTib56i>0m<8&Y8+KkiNv)=uX&rNvCT -zF~~2>zlvSaPaQ~bwxKpFMuL0c@2B9JIi*|$L1a?1TFqmp#Yw9 -zYx>b3URKC}<1Qr)wkPkLyQ}iYFJ)Y$x2qQv=gD4cA0#~*3%pCHkrlsg?K`#{B(MNrC -z=>X^Tl#xuky#4_H>hGJEVe_JAK;IiiRbS_C^%AVf=IaVeU4~$TT?)<;{U -z=qKij%PWQ5{PSu&%Y**^F62>0A2K}v7k-g(FaEWDi2zLPS?`j9UbvcoEm0$NS5Pos!cGpeyPeu%S&U10T3ok02dQyA~&Fg2U7U_)yo`mpV?bMSTWmn$>w3-%4*W{3W~W^=$w>otl%v_O;> -z!0fB_D~=xk&uz$$u)&wQ=In&ROWU-k`|U}xOK9TOlX2M})v;$(sMqA?I|iJAeqTn= -z&5xim1tU1Z*zi_E8@3yO%?`L{JnDbOzF$%bU$QH);6Ey-g%NX*SbG2IYnPcKM5NHV -zHiuxs7mTsEb?olTu=E&HlQ$JlOErHvw%^82E#Qtg(t8;1Y8!iYBUc*jY`|~!-_9fQ -zUJk}I#QA5zEtQPZo3Ty@N}`&d>zLaLYM_)Y_;(TUsqo+o4t-O;c3yWtw7v8#45hoPQn3Fpv{MxZbcs!O7B=Tu%j-qbNo_CxAu)J+ -zS?93&h_i39SJn^Z3O=vYtSf-5lZQFQ!njy^U=CjoQWHNiNzPouv;0^0K5%dL>uE=z -z#YyX@z4iL`jvKd4GqRGRrUI>I2FpqpVHgoJ>educG2W7aBrh(oybM2N21csfTEC+X -z&GG(pR%{ul9DSQYY5L~1OL>%$DNA*!oV~ws_bPJCcz|jv*N_SPozq&~16{BNu=d^| -z!k^nnyz6l(jm@xl0$#C91B5I2$D(_d=%dezy4?Eq%Pblfu53A{ -ztRj^pLb|&Si^miGDw>h|NsOZ|9FGPlO2|OKn{3(%Hp?_&UDJuHsYy~i_j>C+b$6{G -z@}RXtwCJKUQO8b-adyjk|JQ%s^UPzeA5}LK08!AjTQz*U2zF1tOI5&aI=)WRH8}zL -zCdR($u9-lJ@|LBNX3TJLa;_kR5E)wj6!j7x -zX-?0=$a3oL3%p`=rb1lYFZ9vE+MoL(BIG2-PSBC1uJs3jA)M6qHCAKIuy0xH5E4s? -zPQ)YoeZ$m>s$&z^%R+Uz)pN;h%L?}1w(MQbd1Fc{D$Q5hsPArG9>9L==RU%Ua -zL*ck0#)w7t!1Rq0s9(U3d#0n$3Sn7dO`3J+;2>`0t8_d|JaO8yYUn~S4eH-iU%S8y -zEH57eh{x}G8`j-t5G*e(i$-Ke;mV6rYzzZ07@0zbgi4Q%Kl{!wz-^#7Bn8u9%$P?G -zV8uc}9g{yziJ4z&0vd!kHe#qnS^U{4{-8#F1K%_~pKU#^p(g^iQ)pJ?@;FG-Df -zrU+Q4uwm1gxn)opPV+8_=`p@HEX%4F5N=-g65~}Bn$Ujo!}GbhWTxjjd&vZ&wWfUf66`}(rL(# -zEr>74oI%d3*N+=WoM^5WhT1fO$ss%OnP}VTW}l)BOoljHh;g42ZmhzaXBf1zR-*;* -zdq9)R<_6>z{HP&Vr{A}6(lrn4Xjshcxu?KOFN$7j&G!A<^qm*h&BE*+5mT0 -z=UZgdC(o|>r$@)UKsw*fmA9(uk-taA^_Ad*5#8zDEuwg{_twJ~{ZzD|osK1!{Y-gK -z1C0v|8b(@=QAAXWivQWh`!1yq%-JKh<~SiBo}+p&?M%WEmd&NT!G9vcy5{XVWFYY) -zPoL?r5+QT{l7VK<`syKBfvol05-=bW-q(fBoNMCuP6O{*1Qz!|ePa=K -zop@UrEO=R;Mm&C-dCy?(=22-vBpqg~mqo4d+R -zW$NtmmFjs5z6)>F}DFB$9+J{Nz@%MW)-z^B6@ulqs-c>+_bBr4~e -zo^y&}v0yZjYot5>8a2b=Fu*k1XR9}F{2}|A9p7H1=~-zqdz@uDgep}(*}`C8%35iq -zIMITkrbNvBy^>>Q+y)z?x)1vlE#nmP1$8rj49EMV)WIJ$rQOJ8DeJZqb2~~#buz|i -z8;O$IJWj2Ul1iE0oZDnEd>KA5sjuvZMwx;=lvy!xxE*Ib=>Yy)>|fJPBW$p-m%k)u -zR9k-VVo`ChP*A;TYah6NmD1ErWPeA774eQZm)47IxQb{ws@Y@$mJ8A!UL*P+il<7- -z`c*xovvy9DVJo33PFTHg(#y=P^^47z_Wz^ltb?L_-|x>ZA&p44h@`N)bc4VfPzeR3 -zyBj2=V?haJDT!S|5RsCSrF-dEO1dPZ8|mive10?E8UAA!7{0x;)GmugFYQH> -zXgXOfj+ACM)Yyp}8aclI>0xI%k35m07dm`1kid}|ruuCoC;F_B!^nlg5v`0v)xbew -zSUKp3bl=i;*fg}+s^|E=F$B+QY$67R(0@^`lm~07Redog9BD><-ajx;m%f;s9z-vY -z>ac{y3^J<3Ii_>NKlzJW2L`^jPE}6zCC<@E#Niwqu}+Qew{Q_8m7v#ksx1^+@WkcaVSZI@{r@Kc^O?F_J -z$e=F2WCXbfNxT%L+$s=~#2mg%1a4s=8P9Q&8ig%3$uo(^po^o9@Bho_65K<=y9F|a -zg_?vo*JB+SV?L6{;KM+-lL|FX@yFJlwMGQ4VXcVT`KfXQGQVA#1Ro|?N^3YJcNUf7 -zXrFO)`_Rui0J8+n>=$xl(u`neVz)@vF~<{36~s^dJ-75HO>h_?q0uU1;*)%P#3yjhSTvi5~i;j1GUc^nJG+BTmB_cjp9?4{X9pKUA!9ZUm;$$2c -z+_VB_O%Fo5Uy=5{QLI-+A3r -z>+{|Vjg&8lZ_|xAz;}(cVf@+_-i$U3Epy!Ki3*2NCVrlTGQje#tTrcy@gx2-Z4(=s -zq^s}z>Zxnta`}uFCb(&DQR*vcS;s&5>%_1hV&vRV5se4wC5$xdpB3bAIpFnNQ`yC) -zg^TwC=$LvCmVakE8JeJ>vDg99G@-M=6O^Oih^}uc-nHh1jP1EOagRvYHVpmKL(d)p -zCO+>*NK>XGof?L-UInl<0^0XWG4s1doRx8;6tOyxqs*pS9Z@2NnLo^7E2pk26uNZ5 -z(J>A#B0vogsDBCjEvjW{!kSNxdD`9`0X=T|3$B2D$YO$1N`@*qjvU9qpcwEVdEY!Y|GI%uGLFjhw<;bi%g-eVoha# -z=r&%~K(0q+%+c~qjT2JW)7Rt{C;J)htUI+(pgKt*@NoH7HZ?KOs=HS%|L{(sqpBlv -zMl)ED-?I@Kpumma{jGmB{D=`g<29R*9S(8s_j6U=RC$)|%W_K@niA|%w#$PmaHa~{GdXV{TcJ)Fo)f*m -zVWTfKCcW#?X&30TQ=GGL&7&B7S9l)}3=knt$-R!OM%w-ppy~c|j}QEDgBHkSV8LxD -zTQID;_4VG|ETdN50n!){S)X)u4Ql@WwZ@*Bf=L&eHv5wQ>*>3ns^4228UcMYd>99D -z#Q&+?^U!8f@s{}PV7QPUOv{q(^>5JD2|6Z+n2YvUzBRH&R^#Ls@_#FQtA~zmw_4e= -z=?dQ!G49u66Av_nq -zB`GkccJr{{TWKNV5~())MDlC9HV=PAS~kb`ZxT;hI}^;UOqbj8R~VNOebP=de&fIP -z$53lM0x>a`3zUAgSG*AS5EMyzikBJH-slgBf|n_{r~r*2a#-0_J?+Tm%Ix9yIpEg@ -zyk|ZcC7A>(S4BOj)#6AgoYd3UTg;g~zxQ_=iTJDmJ)Pc#-jMQhNo?_iZC^imNv5LTH<@hLiGLvQe1LFPjW*7mbfiniSNgE -z(R$L>>1$DLCfe8hU{rp_Xj2B;WB69Jl64#de1>7fT7UPBWwTE9doT;|?+j?c03w#h -zPqpoy!VMSHyi8Cw#2M=*d)HmXi|{WXoO*aR-D!CRuhfNGux|RaK|e$+<4^^8B$q_=Lf-&L)WEqN&c<9qb|7*P;^tu -zni2j^ZWtXZKL0@F-oo5(;(sG)pHBvKVA|nrY-$lZNUp%qQFFZRq+ -zrwWvt1SjfDQD-q$4g4{i%>-AjA3^?L`W1dN_o46y1gZbV5BZQ8j;}7*-PF_V5Nn8AldrHE=#1K?Rq~cPA7!XIyeb!OAlll&X9{oo;~LvI?$(jlC9=Yo94bF66*xC$4OHhH-bi#{bxL#` -z8DGQoxfC<}Q%h_qZ;@RmW}rbjOt7|ripq_D$rAoTI*{yY)k#8C8ki-{-R8BjyudCv -zMfS_&`*N>~!+0x!#Yx5ErN5w`dS`n3jSt!nJey*7Yde-2Z9)8oB -zJ&Y*?VyXr>Zw1J%j9a{w&-uI=eTuzbsaHQ46X;s2worLK_RIMBhy7)S4fH+;c|urM -zr3!b`w>Nc?FSCDJc|OYh-BNE?6Zg+PlZUcAg}{Oo?bLJ+K%6~ZZ*ZCax2-0CpRY%- -zz8KlHc>yRf370FvutOHn*q0g%_Ls}5sZ2c`6x|H+>P4|gqmd*3!zW#wlJZxC-s2)% -z`0G779<=DW{5Am{@75BVPf{Ea05&0m@gp$=!@_BGdG$N6q#eWdM*DgMD*CRNftqGd$l$S69Db=f0^kP1>(-GfVQTa)CzLtyXJN@&4qWaaN&w5*SPa#z)V7*7UtakO8b -zJJxxI46qz~PgvM~2?d0#+F{TG*s;~V*~8-{Z9kj5#gO_?qMIQ0{hcqn>e}GPji@82 -zJn{-X@a|lZS31%dpN#l$`0R5GTzSK8rpHb-yCQ*eJI2LUZizx%Q^UtJh(P6W?k@IR -zH#ZZ=q=tR^%u#IQioc$kb|qON4W=tnM8`>9PcsW0{#AXJ*D~Ka(r{Msfc8I`9I|HAV^z>Hf3JmUw#MCOOLB^Y~xLquRp1XE(P|4Kuo -zfW>0yiRN*v9LW6O>#EsJOU$Alk*US~=Q2m6e~}}Dn!f&1X{jUL8G{T?YGZ4* -zt$FyX_g$b9)>hsVyxu+9Z}Y9^XSD35b6lB-S~2E-0V{$ -z{qH(|R3^(lW4G5WqzW$2-5guSgqI>09No6*Y^do$>YW@Mcrb2e%x($cv>Bz=8_Gm| -zR$InCMZMIBA(fgRBHosF^=pa4?ac9M{_`-cQeRGXowz)M@9GwL9ypbMsnsu@+H8i6 -z81_c8k}~isufOSy?x5_TU_kpuoy@0xS5uf(Q17{kCcjLq{8CM2S%6*vMr -z{KdHu&3^vkzsY5kPve-#V*1}w0ZMlp7aMo?xHm0%UY3ZOmVkZIt!CkO1yf}S`?Ha} -zqx%y-Qpefc_w;c`OMwO9t0$A(--!=F}?RpVdGEg{x!esIfJ-&(OfgRO4Ur6lY`R6 -z2iPxq&o~uQ35QLuH$Rhd?Cn(ZJ2V|?x{i(lI%0MNpe5BZwfui;S2)Zv>5?kxxR|RD -z3!vu7k0%1K)qOPSA4i6YF(FUxA>yk$G&Q6HtCL3?_bX+=~Gi47-q -zhOk3C5;60r?)iQ6Agl-{(p5x8nrkp7NfCX_pL?8B>$0*^T*p0k=m3$CkyvkIXQ!a3 -zkl8+h3BHaE(;NG-w6vYU)=PGI`p$2k!_U#BUpAW$X`YSej)->@RqFqe#dHOU8j4wd -zExfeuLD|ZT3k|`GW|aVQl+TNl#W1%eK_sE$!My -z#t`rXvi?f~9bUJYg|o-e;W4) -zDF6tcx9hn09TKQ`eayB**ZCC3D>!a#r#>~5X&0!Zh$k|ezr+4YC$FPSO4b0gKCWFkrI{i>*ca$IQIWzc{OyD=;o-A+)3ZTdrq0 -zE(2sQ;SLPjF9ZFoUg!KeWU&5f9+@(nRvZ;opI?h*zit2x?$tT;4CnY)AYx4%Yki0A -z2JR&0q9*m7hsP0Mx)qRJ7SLZJp{zX7FL=%`LTJ1qr!c?2bDBDC8#!s~CH -zuT-CkZlvXDg8F@`x2<_Vuh6Fh`F4cu?RZ{PVRO6UJdfWh1V>8pkfDHvSKi=mHD{GkiDSux(QWb$-RaGjaCTZQ96^M}kON(~vxq{BoG!jhunk=c!bcrn;xVi*^`7 -z=pW$L$!4#bcG%)kYTb&W|2J|Gecc^#bJOuqH2#mI(2{)zt{WTeA+So7A0n%J{{|B~ -z0}?+umxeCBwP*#Dk@QY|x?CZO1< -zKSmlvS5?}dnT)OXd-pQYpeOSd8~fr47Hr!44)ZT=DG#j|g888Q<->21imOuGjpK6i -z3HzlypXru;FMV8XA@57KQs%gR&|MUcPPuOHr2uZr{E-A*Ezep}V)n0_kG4uLIi=%Y -zemXP;lJiwAk+^G8f)B9#53ovS`ah;OG&j#IZZ^Q=$&t)F)w|H@UEbKsIuQ%~mo(C9 -z&v^Ny_gpN&d9JojQY5?&B}fcjm42X7=sR19{F=@9IWyo89q4l@|^ -z+78^>c=$##S~6=IYgN!mXrsqgSt3C^CLeZ|M98!2baiZcp3i~lE?<7lVYBxR)@Zqm9Fy3 -zFscUU3TgpjD$cs+l#1S3_|25}3y-hiH)&i#pn>?S{CZL8ReQ-TQq0>49CiN}%S6qB -zfE(WNsj&`g#djGl5Xyfogw75)&XicEzT}Mj$H|@)pNBGkRQWHN6KZRqPc#;*VRt-~S(g1;VJ|CF1|!tO^eTw7nU -zAsGB5tPYnGK-u(i(`=(ofuFf9E9UM-msaPPlx9~Scta4I_1MP_fI1YwQH+g4oz3Av -zDEEYzEW>HO`WVMb_w{HSzAc}BRZ}5ADNxh-BDM%bFN2}>=Tvb*ydrGai)An*rqVQ! -z;}a*9vD(a;$FeF-HEWy5G@VQr*NE|wCie;UL5iG^Z?c3%>O}*A#%0j-Au1o+t`W~ -z>ww1bfP_*pejTa$PQ>BS(;c5TtW3=RE)o)^@*@$wAGV||jv(}j4cbOK78OJPoOB&en~ -zKsJHpXqCs$Ba<(Mqn2`|#EyzgAYY{_!+xs;?@A!b47*I$+``D_c~BT_-wmvN*F3s| -zZ`Ig{oWP6#?RP^tpT*?$K8}Dx7>9#Xr6ZBSc&2M6k_2rHIiT}WV(Wm~axf9MvN9jX -zFxPp&bF@;yw@!@5dP2O9k*8;Ex3f4Le!qMAg2}GirmouG-!6R)>0dJN)r~fP_2!$&B{KGK -z+{w>RYv2!2Q(bWpK1|!{Cgv)8==iknTmbm#pTO%wi`EvpW<$01&}ir#FdSA=J_Qfp -zBFbNFLCtH1Xw|C3NnHzhX-#f8oEx9*1J -z1eUOs&(k%YRlJO{%4hkM8SHZBVc^X?CC3FfGz)U5tKG+ZQIx=!z -z?CDbKJUqh-?8Zoc)UgXc0FsI0RQRrWenIC9dRtG4>ssswU*!3i&A+g%#prUHPjtCA -z^BnvYhO%17)bUgu7=UqDXZs%#P{Fu^3b4qo$@r&qD#AS -za1)xopawZ31<-*-GS4S}tq2;&7x40zSsA~iVN!eIyLh%DsEn>n$+8Q4$r;flDE+y4 -zulUznr)YNpsuvOyKV&@Ry^g#ZvrXk&BgJ3y40FU}c=Wi=*f{0rk_ErX!<{WDdheZm -zojKR?&%9vc_wU6|-|Xz`^?iO^Q4`v{LJapZ#~6h2+uaIcBRSZ2FAnS -zJ=-z>L-7@_xt@Sm(pXU5RuNQ&_})2rjLd5i%xr7>W71)6{dhN?cwYXg#pg_AdC&@N_Zbh8aqD`;9$}m)vKCyFF?p*gY2QVMQqE~C^ -zXwLpN2fB5?-tfPunXbsbu5SDxZdNrxCF%dTt!mzOL#XP$@!RdPFRF;0yiwn8i_XMl -zcjD3!vzxXwNqlwi9S*_gm2#ZcR=8`zxVBe85q_;ae{p%a13A!{#8gSwFFP@>N&ir& -zRQ*ZJ_g8o^243Me5D>#}YUEVrj+m~-9(nwyw|;U7_?RFQd_7IA0zX{C0IUw+jvl}o -zpz=QN#<;9$WF^1%{T~Z3)@!TgOIoV?Fv&hMLOtHyl>T2F$r01+e!?TFqqZ^;rMTrK -z+n@;BUM;1AW~V1W6vl&wy@>rrYrtq~LC!<<;rhIICV$L(I*sePkn@^KX|Y2vn7n6y -zc+o39XAY9tu{8Ley}V4csZMD9RP?Z22s@U<=O`$@+VKHq7HZB!7CcE$u%=21twJQH -z6ceiKeZ0#M*rQoDrydKbh~&-LlW~xo8UfCefiYGAWsxP-#Iwc^s5^)ejV)rhA%b -zdx8hO_(>`2T^^K@a~6Jyc?T*N*lGARdhEvO*KGfiLL2r?M|o7Qk=^B--)+-~9eI-s -zCF`KZKg>7k*YRi4FvdI=DVp@xH6q!}qX8=F8_Fa03@65U?O;DECkzW4{*7G|`2J^V -zq<&Ak+6q6kSld6`!y4IoOL%Af{Ihchk&COCKa%f)_0(~T1Pnu7jK;pSdy51@-_o2@;rK0C_~=B_tr~|QiB_%9x(0cZ -zIkpz5=WW4kOXXy+hEjFJu5CEfJY!eshVHBa@_?i8a&)2@Fh2-)rO4t#S#20!rfeDF -zLc-|_x^0r_6x4IGLWViD47^JL51}!%dix8_g8Q_1NhI(oS2*Cw{SsQwMRZ7Ubodvf -z^8b+t9Q6V5$Sfk*A~R@_+44^!SO*uDdLYeYNQNPN@spj)np2HBZFV`B0>)~F2k8Tj -zUGi!Br8aU8lC;cCg3%99Kn_MFLw~CuO*gJO7p`!}hkjXf%-|Q>0nd0B;PzwBPKA*X -zIZ%iDyD;4N-~(RYwJp)ef+?dc14q9g1{pLdtI?x>sP1P|^mi>F->iop`Gqut6Tw~^ -zG89lzS|R+|TarNis3uI^P0X$}5oW&9;IyxWv0f!u5Ylw8XKfbt`z{94t?-!-0h~ho -z>N#wo -zVB4P)y`^fk9z;wM-(lt2O3l3;V{4tp-a7wF78e$%$w2;9QwIe?>8Cm|%pA^tZ@@`H -z=yl5o$*qQ|zq>E{&F+gJz1V`asr3qcP;wh0y8QhO&PGOh*#?I*;lYA&TT<}O0+me` -zbvRN&cGhP1K~r|yU&^-L;0^ifKTE$>nT8?S&Olg+kzyEtX-a -zmdx{8xi1MGUk>7T&R>+{@%$i@@-8daGyD4~?*QdL36FV8M*^8zHC2y6JM68D3mq4RunuYBmdn@z_i9L%rQ8O*k8SL`7u;%S?{-|nfb)^`QACZDe>;6Go -zOpBn%nP_nCv_>P~->1JH#pcaiZ)`Qxgnz()_x-VAK*&dg_Dp#Rm`ZVgw+-RQaoqRC -ziQR$MN79<#T$dTD%Y;(P?|W?+i2VFG&f#?-4{QxbI>yqOy<|8nZw98rKL0_E?I2dz -z$v(Lv(1eTi5S8LK*C|HRcJ^dim+--7YE=0X(8r8J_EhgH+d8YH~ok1Exyv&i-NOuQs%SgWD6?ZtN}In`1pyX51aDl(>(pS(2p -z9K%r`tJNQJ(D0UyY`h8UQTY0tYk1>%OZ%Pffb4@>pTfsQN}ObiP$4GKzOUuqok#Ni -zHX!Ho!k>Z={*m7}Hj8G;iku~jZ$k_SABL*~k?FtoDDxD~qwzD{LYXYS*h0rP&Z4zj -zGpMs#gK47`VLxw4+4~d`AXKNBX3_#B)!)`4_m3I!2o$NhDg1J>muFE8XCPktuS%G| -zOFBMk${93J$BLdW;Sy>je_eRrOFa5_ -zxx-8%U4F&itlgD~g$P3~f0!Mm1^gD}8>l)i1EC!0EUeytlkXlOb>XO)K`Dvvwg0I1)*;{$aQkd*!$wtw7(PS!bz9Fn#tRxU -z)}1f}$!N`(U?E)5zwJ+N&ym)F9m0a+IijR=R -zQXjoe*~I{q$UvJG#w~Brj=$Gt0FY)gzs4XO!&eB2o#TI!@rfHbi!V0=V2Xq5v(k9m)<7ip_A~dWFGVE)prF(tz6d6RVGUxTBNI!tLp&OX0jm? -zZ7XSghub2~+<|sdL4ld>z~UNCSwdfIU`4OwXYi{m*kv-UoA4BMXCwS(@#;{Qn -z|J8Z_>^EfjkC>4m9dfRFx-qyUnXb5HdXTQiZ?A>eVn6-cAhMi*-kI%~AAt9g*iw&# -z{!}A-F%G!-5KK^DoUTPnsVmaolAIv7{e{LQAG|2!RwpB+$d!!>Gd_r+hZ|b%S>4x* -z%!j-zgkqQM(Fh_Fy-One?u`xX9()a|XLOAkY`_D)VMefEIk0rOpp$!DIwd};7bd9S -zS%f2vYc_WOc$dU478zZyViM!R?8{zJ>tJ4W{PmF -zZ?Zw=IJv{O)o=%Hl?eZ!nBjYuFK8=Jx1B{5U@77(tcmCCyr0g;j0>wd3i>1QFmF3z -zx`n3jxtx!4MZ>g=0e1cyqZydhaLqP(R+Ndv;gSt>*crXV?1uR)%bihaoTA1DWZPK#% -z;nQJAfCY|9M~V~M*qPb^>EcI0UH2l<^~4#F^>F(|WmvPz@T&RvbFn>j%x>kUvkDSc -zHHbfd>uv>K&q_=X2+`g(1s-5G^m`?HOmX{(SVDg*Nrz_RBL&+Yq~Me`-j`-+arNH@ -zl-bObX=6>-Bc!!`?b4PN9WPtiyY}hwr-qM)>(Q{iv`X-0#S-Vl@&g@HR>AEUY^b_A -z&On{SA|urX6VR__LIx#gZ}oi|ALIUo`<99;5GebIJ<0hueHmjVq&f -zzbh+1sUr|QT&O5cuAU$X?Ry3Gw;E25pM0c~rY&mgh3R~I99r2D=g29{7pvv5OI&|@ -z3eJ)OnlzJUL*o|6m%DhBLMbdBr4ihUv?Rj&OZs{)HugQ-b`77$SKIFL9!Y59sKzkI -z(e?Dgs=Ks>6{9QqBgg5-$o00pOgJg@S*X5=Dt>4{d+$#k -zni-UKzv~+wC1vlanxXFI82mY7&c;h;u5y0*m2Z}v!0>2^vRG}k)L`jBzL)-vcgXnt -zlk%aafkPI3!(j3=I;UI$a=NyhFYphxx;Dw1J7?-{-C#s@q+_KDj^RA -zSZXQ`&ECXECb3Hz)+qpei$7GXtAFxK@LH_qtHyR5H5>19?T>M3@YZ3T4Z59Aj2d(6`Z{4gFFAC}M1AaRO=Q=5g8Ut@o;U4)(0oLWU-B&zIkfA#{78#q#s>dX_!$Eq4cDKdnnZ@^K5qu^e)|_SJ%z_|RFG@+!GCG#I}Gm? -zFHsbl65jIbqoSr_<%JAI%s(H7redf0qlji8y!QOPo7Kw&G6dM|Q~kw*DB^5=h87j2GqH!!9Tfv>ehNy>t2WIlTP%YaU68yUG(?IU<%S|t#Z}*=hcC{7Iw+rw@ZzmCk_fKl -zJj<4^;urE+^_~R;nCUNes~$gFI`{hNXZOm2aVSJsV98gw=_437G;?P}1E-Sws`NuG -zU7$>ok!|>WXx4*0z9Q4lmd7C?YPaALPm)_)@Zm_SB7dKHsQ2O1bm0*^)d9CX41xi98r8K~#=qvi4F -zXL|Ru$aFyCgcC*3lpo8VaA^i?6IkZQI1Hg@6*$$`p)$LqigRluekc) -zQQTX;LifcuuO0~yLPsqO=*vctB9_+NLF$B13iW?}u!*ky7K1hAZS0~BKs5AYg087R -zq&Gc5ZE64oRSbJi4Lmm|C6cYPD*5L6`eBJ0>K{_1bh&pf$85!RzJF_B>JTFR0; -z32cqi4IE3;Xu|rsWza{(fGR^LnixThIFjgJ>%HTmd39)oW0z}>R=98M6URCJQQ~Fn -zLR0M;PTogYt0fz;Qi`+>pKBjWD!T*flVg^ -zaWmF|2CHNjkwIH79Wxnz$&ic<6AVah9B)ZxN6^V60oH664KoWLNEtqT{4FPI6xAi2 -zt+}RN`{gU-O<{+5?ErmKV`gdw%fifR&J8vryXUfXLQ@nYQ#&qtR#8AFB_lVyg8Vc{ -zR|J*MV%_-t7Rjdm(xrvxTBvQ|yu0UOzm9&9nPp{%t;cUDdV7P+#;9(p -z{+N!hN_en1qTQ*XCX?cZ|LQBUHT48%y32G;Nt>QJ#dW+1`eRQBS*|2_>m>GUTQSzZ -z)qWlmjgP9+lK%nUEa>ZRN9m!Ru95i2L$C7lYf}=K-WC!2dVqOSiStD3YYHY}@x@G^ -z;_r^b60r;AtEofwY3ZE!xN+-mJ?f^H-#BKTjPmrv3SdPg>BoBW^dP}XWmyX!a^DKAQbUm%+|6w`j`DHFer}e#HUulfP -zc+JNv*OjXYyHFm}MU|swE>#<1S0jY0uV8Xf= -ziGgtmyP8BQ9cSem21ce)arW!~a9YJM)7$pL`%@+pX0f^kp3j24FB|acsNY_h91s_S -z+sAs2`EIrsRUhUCGZjg1^vet-U)gYaN)n$HFvOT(TEgMY_;P_HKc{u+1#ylK4i56Q -zqL^FGLTEIklgGYUOZI(rf_$WJ&acH642V34Dvx-VTflDzY-y|a?82!*8idcLLW%9Z -zueX;nHka2rx3ae6^KBj;mz|S_YU~xrL3u&40keyZ{qVQBS(ND~h|wzjWV_&>b$PF8 -ze0voqq3yT0xiS(G{o;>sj{n4S$OwsrQ=_sqJ{>Inty{4Xjl~1 -zgdFgwNTU8q%*8O*{QOkX8)sAo8RbF@e+EyD^FsT*40IpbzgEU97Y-*zV^c>Zj-k(* -z4g^=w!-yCUono2GpvuDi}--eoe>>9GzFfZD!yQrmc`W%UiXzzegAZ-77#ER6`}Z7 -zuR9rhAw!v910!;h7@0Bke7-gItNa@gQY`sH3_{A?xV!tO+ojCOE2_>5(*AG{$uLLL -z3~xybld|eWjfC4>>J!<&zioXHae+azyQF^hQNz;4%hjA(3+5X_$0aT{9@-S0X-%)M -z`Q*If9t3#~tc|U(l2p3b{_8bm{ZQM$RVD90a##x -z($s_#5JZkE7T|r$yl^+Zb~*zpA3VG4AVta##*Mn?4z`sHhY!bfoG3wx0(T47ZoCcN -zjf=nUFV&a2v2&skpzA?-QKx32%~$4Pp4&Y~BuG3UYyI7>;00nN5nAkLep~KueE?$(M?M7jd2Mq= -zKdoZ`=(8kHAs#>)^{%)30v{U$pO_J@9K|dH;qJFg)b+a1dw;E6#9#7~+6p_Ht2-!RQe8{DKHO_iyE8)dyfN?xO -zT^Sa|TY9i2u=t;3S-fpaH1Zl}yb{c_bbFW!|WRb^feW>KluYCNUTe -z$EoteoM9s8xO;XuW#`jm6kF+AS)m{r%*Vq=db~Tsi4g-g_1V(-ol9684jj^l7>9dh -zV<|q35r@r#8b3SglROr=(CPi-Bl2O9Cf=s|b=EmR`f~K(`R1Cw)HU0a94c6yx-}_Z -za)XUZV`ck#!jQ-UyK=$Q3AZ$lu~I!E9!M4j2@kbpR>~b~1fzSjb6YM-1|O`MJ#r{Crnj^^BWgKTfDfb8Px5k4C -z?z8@k@!A+cX_@_KnJ-IUefLd>a=g3(Vdz)HGD)FJ2m0vW7_X~Dsy<#}JD~?W3=iSs -za=g!S;uo7t8@cLfF`ETrImEfyT;jj8%RSV1xw&v$_e}bnLWBft!{cYUEr?v5u9%zI -za&o%wPTq6N(Sl=^x^NJWRot1R-+Wwk0}9vl6vobDF5)efOHu`%v5{{S+ZjC6?)wKe -zY-JXD^;06N5F%&zl%|cnvX`@x=W*o=Lt3PgvfOn{5UqXSjjb8^;+Ah}Hwz?TzUX5l -zOPQz624A{2Po77?BSvqY9J59%HwWWa&1ZSzbahp{-z+o0jMY5fe+P1kxEZP|DQLzh -zGPdad*WnxEc;Utno4%8#<{4wMT|K~EWXnLdD6qV~j=Xp|Of}GZDDj5>lxNAH;)om6 -zL)CWm>&oz~;-Lk^{Ip)1^6dvzQOw)RiFZ$45P`VxQoj>U1>y|? -zn$M}hR=dQ$`7mMnZ`i9Z4Jw6;)&1j&+$0VQ6sl6r-?;Hm4?TgXX2DHf)T4JK7L4c7 -z^zizBA70_YYD0P8pF9`ggcRhT4^P=C?_B*pLUGjxa0Zx2O2J9G`w6;`=zkJrVnXpCmDUufFCVeoGiH#b*7NCTg5H -z%25(RS@2u0P;Fy>RI>7FFINVusNKSFR^A?9POw$= -zeQy9a&nCf6l;xGUGLFs$Kz`->^W&iwWk$u -zEo^v`B3w$6Q`9`%97m#(N_6euIF-;Z>0UwG@A;wh*y{%YXGG3q`2EdP7|fCg-gR}S`7e8`RoE`OEY+CRO#ow)2u+q6nV(PGuGQgD6;CPh;v|tw)BIWmVRY2#ja>ZE -zJ-B4s_>p+baM*U_R2Wh1Iz9`M65}eZNY4N -z%(1@I?QSg-9$0WaFF7$=y`L=L{K^7+i%uf4N@pxi?Wxt-n(s~AQjl*x -zUG||dco%~USiVJ|Ez6R6)jSO+%}62G*3|p{xSkq#k;^E;{he~1zIq3_|EQP1EZD)aS!J;6B-VW-=pIu3Zdbt4cxlx$e)iE9v$w+ -z!54S6;fumFeXY~c`1E@%4kRj)>3EnM&zS1OqFD6=j`wS-*=nE)g%INce*7Q#IM1^= -z3KL%Cve4t7caS2qtOx4y2q2~X+GAn_@+Ns&>K8d62Bt|0rR(^z(S$r#Y2na2KG)wL -zK_QK|Ry6d+dfyrxKyxb@%Y6ce$qe99EsLu9Tmtk)ZPAQC9f5_};u=7y3}4GEh^?fI -z2x=T!f%4S?H2hiv8@Bm#Li2k@bmTZHgXJdW$*=m1YkDqpAiRb?L{g`SVMHZscBZf4 -zyEf~8oJd>!ARy~8tNhAl8YuJO2bPKYyG-zxW3PFz!RWGp%%X6tR`yMuQa%V(Ts6D- -zZ$AK8JK05vxpCCZl;@8>Zr6^oM@q<4_pW@pESm|w?ArZr2e1>14xJY`RE@3$@;b4^ -z91ErSCsTg88 -zhWf^-{nb|sYq0lu_03@6E$J~t^fd`3IKt^gA-=%Gpw*S%U&TVgY>fcjkrLlzyJp$+ -zGfzjCZ-t);n)%c}7E06R<%`sbc!wV0s2t%a#n_u$B24||9vp+uR`nS1*IOo|9H(nOGU4&=m5&y> -zA_(@1Uu+ww+-h<@_2ti1h$<#<`T`vF%5{iNrIlaqzje$}$sX%!ft==fsM^~99Y0{^ -zEb`(cYcR>P+|W*{a2&5rP%$NO7#GdXH-&h4O=0I}Z-r{lo7xBeKz^5CIn&=ax5t_u -zJB$m&ud?Ec>>4R1mFbFXYdem!(UA6jF(^0w81ToM(EE!NGU?<_*KIQ(CG>aCz($Y5 -zsN|h*O4cgg;W&>(ipaK^?NS$5{i9v*llf8Z{?cHM`5ANeJ9-MzxT8}`trp2A{k|%? -z4EXE6llemAB!{3n95SN0;o@|uUTVPGtnd15ml%+ibj;l*XMmSimV0QNIsP}DiJa6k -z8ZOP+le#_(LV^`0hc)Wq%JxX}oK$`&{Lcl08mlo1eI9Au%|D@HcO;h9kD0C&=(UJU -zIIZbxV~a|x9JJ}SCZSI3vcYZ&45nPRP;YS>0S?1@`|8j4~KHjo!8l7om~2( -z>9tWG=_(*B-WRW_0@ClS_T=ObIo9i~IkWY47>3lCuSe*dJ}7{6JsW<>Z8=MsE!fB$ -z>2gMomR-u-WBpKbMLNp}dzaL6SPDua#~?%y5iUkXi2ALO_oY1~+5cVsQI9%Pvz7nA -zx?|h=`MBWqUy*ER3c;NSc5T>;PXl!y!*3A$NRKtD{=wgY=>t^%YJ}r25h^YgQioeZ -zPUzsft;QkYk;+4A(itM?5aMvBh*WtF*{?afNf}((7lqA(aDb6KjVH+G`fz*`YAs -zb^NAE18Wp2(9#U^VJvrEOm?Y-cM_ckZz|P`G%mmh=zwvVDKrQ#wnWs6+79dpZrr4T -zLJ=K6Z?r>&6%Af!RY(p-3O}Wi~vnSbyqas*Z0~V -z@L;~2IO_{V?^-Jo@%6&eXb$0Sk;AuRxceGitA5FUC_4+u_Oka`n1l}j$}zB{`JvS| -z7`S(y{ho?KNq5)12)h(&Dzv`B{;z_#KgL<{y1EiDIdeSI@ElCYGwQvggkN^=;+XE; -zV39a>kO^A!0TW5uV1)tvpVLeyK;}6WLq!E_rXnxO@#%4eh?vrVjFMcOP**q+4Jx|~ -z9cvR{t_!@*dRhtZxG;rJB$>5uI(*cRr;D$b)|wA*$ZgGoLYgO57=m5mtK+IAz~!uP -z`x@@;Btzuv6}pqiv62`Q;t^ -zexDI;=uT7c&>~ChOi-GTkHqle+|9XoIbQmQ6R#!!@ -zw~cQjq!sBFkgfsJrSJtL1nGv+DF{f{KoF5qi4BR-jda)O8X+a6fWQ!>2a>}3{Qh{4 -zV}I{>wqy6M`?{|4{G72MD&&>JD>U+W^c0?BeyTtVT|*8L8M*AT3Ha?fhY-T_>+ra< -zDLmkJ9_UJ6MPFdczgahSVwo%vr1p5pmbBx3R!7phf3G|I4$>xi+=yath@M&e7cwO^MyJvsNW}i%3t5uIiGg9l`SW}P(x8C?x -zSIiz-J*x*g%AF&K6H9V^_0x@b$|M)tu7xd^UxxoeDu>MhUPF=IaFjGdjNUYfCEmSz -zC(Opy(KgAGMXuYHU*3!s=*5P9UZ$JQwFg`(oBl;lJZ&^*{uZq~zBawK`_dqk|LhOP -z=Vc=6E;8uc+H@TnuH8pV@VGnES!eC@jn1#1&89jp9V&XTLlK6+D!lF`3B*LItP(Vst8qlEb&@Qy?2iWjw7Og-iH -zOc?LG4VPoG*Pg(bZr>7V&AOOJhn=`qaKsh^62$<$e41*zJm%8F_b3Fbmd_4CyoIJX`x;HlVhK(D$eYXWjC!5ITgADQq7d -zb0t%Q6KX$SYPW2P{)*B?2`1+Z$tz-B(+6?Deleg%wnOnm3?_qs12=I+2vf^CWymE< -zAl_*wG$afqhJ}(o0eYM(K#KVtlt6xbPwm(QtN;D5+V;7`r!vi;-(|ch!dL!Nb%t-# -z-8gXc!Lm<}IG7fv1X1gY!UdC8#f~1@Ns}Mrr>+at#I3GaObjy61GS4N=G9cZgqa7} -z9eB8U7#{RhlS+HlRItTU+zX0ok+`W#-`GiE^z;nt%>5v31r8!&B*L{Bh-yNWXYA1z -zGdnC8C)>(F-W{A=xP+i{#}(g7xz{SfK7Z+>{-sndyVU|lhFh#P4hT=`#7{eEJhcI1 -z2#xsKJO0Lvg^=#2kN!asc8GOGCC|4P>s;alO$BJM@5fI6=@noFKU!&rK-KfU%OaF8 -zJ}&K#HFsI%qGY)6tWj(m$9#I>aw<@e2qtoMGI~`f8F%7=I5+7VvcP-il{gikh1SBY -z(LwGl4r5iC9jClobxZKkr&c@ScH#+3dr&*7(;uL5lfHTZOKUS?q4a051XEWjaIA0G -z7ZEa-bA~sT_|-yDUOLG>*V?G-hy0iyW&UqfkMgUK76j0T@w8 -zOEBREXsHs*h&j4YyeOg_3O`m -zXg?!cks5FMOx)HRhKy(nuqdJk6FuK>r(iJ6vn3qeuShVC;gZ5(n4z$|6BWYNo+6Cit#}Ksio9&)8VHi -z34?+v1cOf#$~0&Tf%y)d!r7P0m45hEBl~Rx84S3C_`Oby+2d)XrgyXgbkC%YHkDT# -zT-acegfBIxcIugD)AX0?hdxu -zC?s2D6TcRbkUmUVf;+UT*j3w%E;9g-Z<^qgFtFBC -zX~kxqI{62L-nPtaq-C>K@Ba-1T;r&7!VW+5MrR**KgslL>tBKY9gyN8_Ecby&FP9v -z=0JQGI6oLAGGfxj{uyBQNp7m6^hf+p$500;E2&6psQ-YyYR>;Ww&+2K9L$wzSe}Bq -zm08$ZL*!frxY|!|gyQ?;)4~i36J2Ax0Ff-F7jp(8s1%*4>#nf>_Xi`6TA`6~$v=4iLGw0~y*HFf{IMYNdAQAVjw_m0;l;s!Yac<#cWnRN3bzao -z8ZkMPvlpiC=6_GH5;!&|5($3CR$=U(sw%1yNy!-YI&Cnl+Q;68kMD10BexZS5QT<9 -zZ%Vmcz2I4}ddvD-BAXes=aF<{0ztrw*Ql0fOQP#iq`Mi`qRr5mh#gbW|>(bX@kTxe+yFxi7M#Iev{#CN& -zar3acGfn!98(j1ePDfE=97i_%B+z738?14-`GsouNl<&j;hPay`-yyvcM^>n=E3#| -z$FT4_Uq{i2wAL&U9A!UmMLuoq6eQhbM=!U+XI#U!EJQ7=tURbQcT~KUfe)(h>mk5k -zDIDWl1m>w892PVw$b70N@lC%I@^?#JTA$w8#uNRMer3@od4wRWs&Tf0nXyr*AUu|N -zw;54xTKTo!lZ%6f0k%w3RNi2-^fm6qEc&)$SUPY-6wmN -zfLmWl`GP2%zI5!Q20&k=;h-sf1E=dtsF2An6G!xA}=Yjtk->K%4~F -zL;{mVn;fEJgzWRkPicFB8A7?zmJgjH;_Uf1i_jhd$BP^^#lr_Zq1KzV)6th<>0BNT -z6(m+oY3+qWcr(wNipbKjmzdVyqGJog)IZNNf_tR+wReMJ&FJKdvtw(`zSe#sr$s;B -zbHFS7z#Q-!wRQ9@Lz+`KFrmHB>o-gBHi7m8F}*JXVODJ-jLoT^!4|{~of5lDuz%!q -z!thKRZAz|@LqdOXACdt17nXbx`uaJEHjJ7+B}`Pv0sK!q3{S*On<`DcF}NIP54Lo@WuJHVWK#W%6wf#l^=Rf9hQXiZqxW -z9A}oLsb&9eq*PqU=ii|B8b5PwTqv2FhGS7ZcjG?4YaWf>JXv^6s5p6I<|7Eh=JC!@ -z$YPX8a5IJ_WCiCv?)CgZ_Bt3Kw1g*AQI0gbn<&uVm|7y}Ur(usqR2$_HZZwV5*iF4 -z4OR1eE7~qUvNrf~3BDTT -z<^1E-hEJVOsBWcMSW#s6U!*SCt*dSzq_|Qa^n4J;&o~NGI4mWA-hF|b4}Wzclvt-Q -zk}C1A=Dg%$BCCpIiMx!F%8_IEmud=D>LS|2z7m2f-9 -zJ1GV!3apT*wkK+Js;K&jTpm{QC|}u{b{`mksGO|aQt2k2Y7vQGWk#an7b5_*pAn4p -z`M+xruA0yiST@?d$&1-r#;vvEDj~Q-)Y7AF&>(!6V|8H|pO?L3p#;s<0jNsn=x~c!9v`J7knbG8 -z+JpnplO}Z5?N1}Cf3ex%>b(=-D$yJ7yql8AcI4_O4LuvNng&#~2NB?eO8ZVRNN|PX -zC35IUkUoTPFbg=IgW?vTx{n%>qWkvFX%WX6zCGJB@rv;xL4%4-{35Vd;pn!|RS?E_ -z%jSbo-kx`jDM^BsTEXRU*+mcNnYWUn9Wj9DfO}8~&+f?|uWIf}Hb?^FpkTvncsY0L*Il0% -zgN4RF|9kK-d@mSeK+fZr%YEZFnj0;{ppfZbU8wP0^UK+(%ilg_NJdNONq~ -z_9Q9|s>tF`*Xv!zKUziYx;n%oBuX1p`QKUJR~aMj<&-cCB%%C+(c6x8>D-MI%`bkV -z8z?#Kr`b;UAj_C*KC@b^zP+!em`q~D<3@pkXUh*6iD65$GnH1NQcXhnu9+NwOi%Dp -zt17!jqpj*AP7CB3SHp)L*FF27$5NAAm-`T3@-KALYuTZ`XRD)m-tioa9VzP5?UyUl -z@^6cl>PGHM=WHy?>$R-&&0E?2Tn9CwdUi{4f9~AR2}uZ!t~CG;ZC6m3hKfW6W3hCb6q_x~quw%ERNF3HL+h5weL*=RYCDG~F5yqjBfqRdD5zWZMBaPnJ{s&| -zj{VmPw!p!@1zq5J<-4Sg#1iFbKd$iU=+g~3*n0lv2(fsfW&Wf2MT$8B*l8Mm%96%| -zS_!zUG=Ap(QBDNLrUS+F>KRQyIQ@DTSd^8XdVT!?OieAw;Y~E#i-ee!)TwIClg -zf@&_18u-@WYPCu1d()>h8A9QiF$YfH#6+N%k$VWL*9d{C3PX@{Bqwx1f&wp@GKNlW -zq?xpSF~_;iiopU1D*2|k6ULbLyIp3*z)*w95JJ1+Yy(=tVr$SGTSO|~M{oLvOT&ep -z!)pGr6E(g$W?xZn79~L95+bmu)Oeg?nC`$%CWE+r8r3Aew#=WD;0gOLhGan3Npu>ugxuC-FJGMgj#qqJ7uHrH7y5A>Dmca? -zL8mWq8>G4|ei_xbP_Njh^Gr&H%D<&yX>U3>UaNh7>Vyip5 -zKM=10NjTxciCa-&Q6Ucp4`(#PvexAk)b@JOn3`9toB6mmnszeFN*~L+n+?K3k)?bnNuVp$W# -zU)iL}#LlW=>yI8|o+GvdddJEr6pVX*CBSK%A!=-q-GaCvyK-vAz@TCRB;7U|H}ebF -zjoPCL>D!sq4kJC?*Wxl*@5ChrQHsQ5p>M40_U)|@t#51&pn+lNAtpRRub5Anur>3* -zpqM^V0mx4?ihTm$34hX}F@A|ORe$VUt{LQyWj=vG{ms+q9^X)SJe7?mi*;?dC_JhrGG18DmpB94I$T-PPngX+YGKaWLw>mL9n -zzC1=>q5s7(5=h*E{-3EvQtR2W+c=K{@gt6iY -z&1kT-MKiPcs9}X5&7kRs1JCueM&9vdkK6U1w196Y*POwxPQD`ZO<0p{|6K^CT9O}c -zgU;s -z95G>Xb2=td*Xd#;(=zo;)Z1CGE|*1dAXZg8vE_iQQK5gDk0%RLmWip#AX1qGk%{&_x0E^WT%163NmwM6*^ -z9i`ZoJoofV-!xV&Zh6$|Cwyjs_`K4VRcLJDI#r%ESfx3>>fG5BGyCUdZ+F9|lZSa4 -z?vBaAxXlYY!b2akH`DfWaU@;RW4?fOap=Jz11FpfB~NwUO13kbzw&nJ -z94Hw#cHxn*%^n-Nwq2w#4IUJ28ZwJYE&!7z^>F+krgPM$bs&BTQS*!!wTm4qwSxNa -zBrLEV9aAI|hlJ|iH-l$XC8ihX+vOh0qUfB|18u*m$Ineg2y}FtuO7)YnC{WT^{|EG -zK7sa53AZ*El`;f>949gQ*T}wxP9u!$gPKQH^G)bdsEXu8huB=+Tok=81wp0!mgpb+ -zH)i*Ab$u^>kfD?&P7`C2S)OnIzZPJR3ydK{nK)mbnv-${pnv~>I*{^KoK)~pS|hi< -z`GAQO0TWN%%61qSBTL^3E|5%I!sndtV-m2;u{b!vYPtX)Ux*@bdj?&qSw*J|IOLDT -zFZ%M~hvNyphaN2Kw-F*;{zX?5j -zsEkqIlUUXy<>Ox(b2SZ4`97ym;gm$?e~DPoXF0wD6}eO?`n;MMh)dW%UCeI -zaL#6R17sSf{702Bf)*Td016vm6?9nuLhqHiw+48j!~m}qPjtq4ZcG#dAQs)w?lGF+86yVRujM0nrj4! -zg6egy0hUEYo9WrW5dOvYK3%GPyQsJa=F0Cc*BSSIYUPWW<%LBi1s%s&}xh -zQ6>`g%r{5R2LFArVo(VSSrsYNYabVMo~zD8K$}dc7N&Qg3Yy_kQ7R+(ogG)3Os<%h -z&Onb4dhgAUy^nMT&OG2+bjmrWL<_cU;uh1;3q!`+mxQqS?Q0MIqebIQO2Ui#nK5oC -z`_XPgY3>dY_(-BD{PIt!_&@*DX}iv`Wt)qR*7yRjfaWdbH(r{TO=_!;%&;DC!Ls4~A -zmoSd?7K@Qt=o|f<5Oro()6^a}3;ecCZ0+NEWUMG9DYDsq=v-q?GXNy1oru10t@Cnx9ycAK -zw!bhNNe_Pi6gzFSh^9V3aP3|3EPUI+i5TK%iQJd25WvY;(IO)!?YSZszv<;YbBMP8~ -z>sKefdhNba47XU7>$@ME<9y_l98(fX>ttN>>pwnsUBkNd|FXt;Hui=;)N;y=PWX!c -z%}TDn3r&4Xm(Scqy**5WD3DQ9_YIrIZ4}b=j|jf^?RYd1*DKBQf!TNH!!L*Q|Au)h -zIO-q2Qb&%u#A=#UaJF!}H_x&Hv&UcR;QlOiQurC}GG=A|fP-B2zv{(0;>_t& -zGWXn+Iplm9p`8cI>73hpQP52N=gg4*sb!M7j8>MFM)B|}F0RxmyCejA1JwSzxGm*p -z&3-vB$^DK*o2z=f+QCa^P`?z=?AqZ!8PcjE@hzMcl@v25vHZ2Dfcy_oZ*VkzYMoc( -zhVz|X2(H?`u+93BCai9+7|W@+tZ9{Q>75bw&G|1ua>llTzDV!mA3+Gd?G0^RUh&Z~ -zGKB-NCkhi&Phyh|iv%S$TijncI4iufIbsM|bTrSIOpr&+%A>v^!U$26zj>clgCd^p -z29<-Ib{SCATkJ+h`EE|Hx(oI0!I%jhb{|IGYNLL}vIOrngJz`2>nU;T-&%qwhKcAu -zmf312CqHQmQqGisKGFhFIUi}n?#O`SKj2|$d!v1Qh+2xd3|?fYj4#6OqDhh2StAI* -zHWmAGNFlg*h#|Ds{zMg-&%!dNXLFp9Mrt6^``hDp2=&rolVqK-1s)aFtD8plRdnPs -zUb=PU);4o`R`lXdWMs0gcqkq;UN=xshM{Kj2_f^~zCV5Kk9GSp`u6n=E3m!48`+Hg -zZVx))PkE%a+l1wQk4Ge8TTUL(4OxuAru={ZZ5>-i4F-9AQjgsNTbVrDo;$kY5tS7# -zv(q5-z`XM-fw{gL;|$%TFyw5e6BEhC3_)?5>52KzA%-3%l1Hg&9Nf)ZYMHM?+rUp$o2+W -zy`t=O<^gbDXC0gYURyq9wc*yywmsp!6x{lA@j-+OTe~890Ub^RjY>cAz#(T5A{N74 -zisI0@5nH&8uAD;|v|GV!7|Y -zKO`w^gJh;%Z5HJTL-vd{m3UD0j^7OB(B!In1Q)2(S8h@r4ViB6Pj0qiK)?*e>Q_g0 -zagqe(+d0t2aw6itn3DoRr&5ZY3P-_}Fum7G(FnGPPcBf4Dr2$zUSR&s-VqJOy_a+_ -zUgiKT2O8r+mHx@EmAHHS$yigh$&3_E3DZ~@k_^6?nSr6SjshxL~yT=0<^5boOuTyzoHrd6q+@2gi%to4cd~1L>zsCkm2ufqT3sRGH`sbuAbn1j`G|zzN-0mKKMNg3~#^WoI!Jl>(k;XOqtu@;pCUYz&O%o_~dDaGmT~(7tw3+!{ -zhKVxs9ZT!ychV-?7lBI}ZoZ=aZX0>m^#|WbECsanOI;@8MjcYimZU~oPg*XWu01lk -zcIJ)atSXhP>|*(g0OV8>t!(9ROuIQ-f!VhH40NuvV5xu9Wwtm$2|i-n0tT$F^WZSelG~^K^M1xCFi5G)B0t$fE`isgd1dOy)ExmE29|BpRM(F1cz9?9a4)Djx1O -zmqR0}@4t~9e24?OaQGVD6{KU(ein44^7j0yiu%nwjj -zCFT-V*McO`8hPiU?Y$zYMWh3{dLuiCuC;7kDOYA}ze|7&LRQs;+_AD&ji8ybC_*=5 -zaSJJ8_>TUw8BdxOYKZos=E1H#7#ofUH6ny{0kkxAHRF>4@3foHC=mBViuhLo}bNa%nGy`F(`Y>Ey`OC;}cYjN=bb#A`${R)6p1o -zgZ&rg1U(zbyPTsJ;)~I~k$e&#NAt0@_v<0SPR}WQ=uxk1y-rjSJNk7#c*Rz=N~M3Q -zH6j%hg_>j=mI#HU-hztHwuP;}t06;Z({qyR1xXcU2vH8b^8fCJMNLC7jw2d~0UkVB -zR6m(@c*mGChLsesBGk5r4jy`Ebl5n8x`=;F%Iu0M3Bh_jFK}Xkp~eYHLT`4uiGyDq -z1-U;Q3;Aij3SwyBG^01L_@Qe_=lnS$t49)QxMIwk9Jp0Q`}>c&nRHj7ZwC2Db&Uvc3_D0GRBZpamc -ziNAA=1S;({ZwTU@m{CUPfiw7f0?EaCDO_L>-%@(s96g~0>|FH?3;{T&no2s!9uGjx -z_z2KoUoTQiq?i?9+xfsY?Qh!t|CGy4!3- -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 -zi;*Lkj_eJ30;kPyp#N=8HaG*1Km(n7z -zwXbkRrXn=HyfbJ}yd63cZ;PfI4-Kcrvej1nHSmQLZ@aBMbi(2j!Ia;BO7s{7mkH|? -zbOHL;Muqp_1m`b+1~27)OX2?c%iM@5k_%t8=#XORV(-0izbP-u(;V!{DRXSs7{uD* -zKs=D^6m?HzA_?kNFj=Rf53?-j#rz;;SjHj+CSsVE#7fgx}4)k%$|C6sTcztW1yAWnYa6DT-dU_u7V$s~>Vvg>X2 -zrH{*%m9DriD2m?E79U!sxLs^s^HKHBNiDcJA?Dstk4jl&v1;!oa -zZ{v&Pk=XA$P#_WlD2It)Uy-Hiq{6fS1C}DX -z0wqLU658p2=}AQuzl*%~NCMjGyGG{lE;3I`yX66GTJEoC({^N+v70tC%r!<|RHw~_!kjjy+H=e|w}f9I_iE-%}AR={zyX0TG+E7fF`|GE{X>TFw7 -z#WyBAif}jTD%&4r+Q*q^eRmD(YUvT>AFnMg1@kY=MBkvFKMbi;rFQX(K-14Kl?Avq+bQqnM55GEa?J0wK9JB8o#`CZrdFW?%x -z_MGRObD!7E7KtX7J1vyH!;Rdy_EK~@aV0=|lSp{o;CMwiN4i&3*%~fOdCNlTK5Z$z -zbg4>+kAHo2uFjcZ-ZsHnj6-NXk2UKigql_UFUF!M8OT5mbSpKI&*_`dNHa;yYbS*L}|KWJ+1i&-&+x_rR>r-9;(-i~KI$-Axn4n~IuF>IeP2M)EyDtY{u>crYD -zgq!;C_skw7{&3a_d9y96m!I4YQcoG|QbNZ@*B37?OFTX -zmQF%w37`VG7u)YWK)gB6pzE-ol%4G1_h+8Y3SFTGy|=8gCzs{cYuZ=x^0Wa=X|8QQ -zz#13VgapnM9y9I-)N(}w*r?;m^rt?UJiGdQBA%5Ds`EBmkTq`O!Ekdcld -zIUCT+!VV_IE~XHHMF+vt-8XU_jF6W@`gx$=j+c&;JH7lOOj=QU`M;u)2w`A=+9h-A -z@Y2BLEfa()QgbrX^!}PlBX7|O*Hre7mlQHIe}W`ixYhY!1W)$X%U+G3$8hE2sO*X&^m>mii0X%x##5qz`!fDvK$*n7j2 -zLcF(gDp>2Srn>wpA&e=+aqr3aJ(SmNbQQ>Z=_Q3wOvRy*NA$iO!L?GF)_%Q&uX=n8 -z@Ty|JkP#tngEvV{-XxLUYf;$(Gb` -zN97=1TEJ4lTOCFYbZBI{pd8#ysUYN))vLCv2o|DqDqM*%uPQin!L6lR>GZ6Bf04J| -zNfquT5N0es?YrLGSFp7^)irTB_oG)_bc(8k)V%r(E3_zGq-Fh;wri^Nu)#qax5HX7 -zM@S<;Ku5qlPMJZgx#E(N;H*)-Vuy3imQcnGE?X!By7_I?2rh1f -zfJ3MWoBSU)Fafc3mmH*&I7*2YqEWHRuIQ%_rQ!Du*6`isYoy)e5{D+n -zA{%(XN3m9nDS?%=nx;lz;8R+zWPt0eB$Y@uEk8;$*dG9Jrp%~=1cRv!|LZP$#oJhx?lx{R*>+%_Mu*++?zIoS+A)|})SGx2P1lzZ -zOvpdOJuLOyp-R^%_Nh^`tZ{+i!x-Z)E0kGb!mw;hW~& -z&ikeoKo^*z8(mOLnTa;8EGSwBzH%$WPbE$2`J-h5O6 -zbU=Ug<$OiIswzy5r1}AM|2ULXcFF$FTD#3TMQR}COUT{>xrZj7#&SOD^qjoeG*c;f -z52AEqB;D@gsorx3E_Os&l{jYCWB2N{`&jY>gFRbhR -zcl9dop`xBjL7CB;U1K$;e*u9E!?5Yl&~tI0bv;%RC9~e-n2SN{)3y4Yf6KXUg*^5K -z!s%?>xgOGdoGBjdE!*|mk5ViP=31hMZcTuSo=VZ@V4SS@Xf>Z1RHp0sZ-Qt -z^;uW`Yf$~FXT|=ZD2o{O$Z|FDc6^s-Xwr#ipK_HNrZASCGRuOQ1L -z2Qr3~bLu!}zN%>;^PU&iGANysqDr&rYDpl-JRNig^jXp`; -z`C8d6E8E*+`u_RvWigk=F5nEq@lpO0Gs!+|n)b|EI_{@=8_=|to?WaNMmIhRR5)!w -z(W8GABN`7k6x#~+yin53`^?p1i}5M@*V}vqt99tiKCCKO@W_(UN%c|((-UMVb{eQP -zn{%Lj{+d7`X%~i2!EFnf29xGHsx0s*g=x6|8F=FWU-U3o9NYk(>7;h_*$;`ih9!}6 -zORg`yLCrq;p^&^g>@C+MLt>342yv39M3ZnQN1CmsTcK$MzpRxYublpCa4OS9@eFy8 -zIVP=c3_6&3Uj*e3j#g@{6gam2V^LB@-(6~TejUndnQMiP0WYLKB@0Ahi<=s41D%6a;y5c*o1fnY(b}T7FG~sIEvN)k3moWdA@FAJ|AYTpZgAFglkbd -zM)WURX0pDHVK+8d{2)>PfTK*O4v=gNU#(t9Sg7yU6nEBqYxK&z*BPNjDxUT{g@rAC -z&0d6KlokGU&Pw6iP{heFCF>fu)+k~?;B*smlF*sU=up4 -z0CK(g96YJ@&b5H==#RI%Ij+W8X|mHLNw~@1GHEGwmvH-Z6p~YIdXE-2rCA-* -zv2a5UG?BjhDdhMbodwK+sO-SgA`2Epol-@N(~dNzqvw$HNG2 -zzt2l8N`76h&6v -zu?Kge2=ITo%X(V0;w2M$VgaSc-72uR7|t!$9f#PcD-_Nq+oynk_`Kxbp7W*SDX3}? -zP+ASU7Y;5kX@+|SJZt%t&ag7DL3;xohy70}U(TCN37rg?>8-(3dyPM(MR18V;-eyVC -zo{m>1T8(OjYExYJl(H9{$&B1#e$8K$r18h>bxa{YB&C<}*9W4zDw;mUPir_c6kW_M -zUCh~CK3lnDgm_EB-WR?)7> -zIG^_>;nH^7vQpW?i-99a@a00)+tW*b(GZ#t9oj665Ko~=Wq`#(U5IGVP9Qx{U6VzA -zYi^9xphbRb#LtX02i@OkWHOW4;$8WkeEK_fW2iLYp;>F9Wh_eO?!&zyDNTB9qvsxc<&iq$l*qL2zsEm^tpg1hmfWYyV! -z;v^r;WlYDOyn0?7o@Vc$M=rolE(lbCyXviimJi?I#S3Fi(~Lk#(7;$ -zA4oGc6|v^QUUorHioOS0!d{d(EfG@6c2c;$QE{-4%PCx6mlW;>|CgiC1w0LairGee -z*;JT!6^!}%RAF9zSFGqe6&(NFp>mJ}2x{v&>pz{G3P!=Och_V9s(+B28QW*S_>nL2 -zjIY9D$64Qy@R^*0oy2SY6EzlQqVt9K@y67#ZLzox2)^-R1~D8KrZBJk=U`w7`L$vH -zhd^r8H!Z%?o|0BW{sQ_!4OwDQS*U`^LfcxT0u%p>4IU-uJm@Ons_TNx9b12qPRCQd -z<{N9cxhF1D3}vU%a4F3YiFCginwt)O9XhbbOrlN&iH1L<9?H?rFpK -z(4bSc*!(L&%i_v|PP_M?DKCl#7P#V`MyAmDs=83Zd3WnnQ_~~jLXCT>KvLTu7DCgM8ic<_Bz9F{jtn*qqCpGzqVpUtkCX=S+$#}kpd7wO(HR9-5 -zRALtYF327=RA!~!F+S#l%bxtJh!Ubaq=3KCxBUZ3+VnCi>H=<-E1P2fcd7i@kjcHp -z)W3oE=okbP!O$YAZ3;NygQX~exNH=G*7nYekV+f-mfd0@L;>V~8%1FL!6k1L{^`%R -zDiGc4S&e!t(2*L>Y74?S2DvtlItL>Bu*roy+u8A)G#+IB!D&S37LVvFsqf@dYm8gSg9YZUdqwQ?yzXBJM$=OJ`7&C$e&%d&~4C*C^&d9rgF9^xX`|!lT<&pCJf0wiYHC`grnPNq -znA)sV<@HJf=Yx;13^yMM>7NR<(@V8gPDmlA1&JKpvkG5?x_xT1VX9Y`4c+A!6aUl{h%ne3|?in>Nv#HaLQ!{sW-%E}uV -z4iE)~(V)@4`gxLj4Ppyv@@M{ -zqWGj-r8k0k26g&!TT!7Xv4P|$p@xUl(C5FaPezDEJ=GqZD(Xa}j4CkE;2x!YO16yu -z+(_AdEWlgn2g|C?`R4KmEjOk|@L5rF<2sjPV0%o{CWk7O6(MgRZW^S5W|^uElHf3$ -zEb0H8y;7|yBCZ_dBw6Sqm~UVAK<;E{&>$i-HFr0q`qoL7qtSTeAckB{K~E$4mA-`z -z^LWP-fJZ`wY&a>B!8JC98WZ*utnI92;ulN@bNls1YK_H1f@G_FrNo?cxhc*j*^p)_ -zIj5DpQoIl?l~^#kl?k%^N<*QL%NlRNauKEi+}XTOTzYq -zaLMT^y7K2{Lh^Q$@Q>qt@0jl)d-PMEv8ln3)B3BG4ej>!HC;Ac$wPT2vJ3tiNHgt5 -zCzp#(@tQYxaP4KwqdpH6En;W(evrbgzc0t7ZOIha5G-ul4EkA@u0g=~dtfbq6L4L4 -zwHUo8eYlLWD1msB;}AyX8ToDqVtA1-Zo53@0diW;b)1PG3SrKY!cLfwl$4QcwN3pI -zNQ*KGWrwe()?uwJ#DszIe^!4*ZtMLjC}2MOu&o~jzK_f0^c&VzSV}bKlY9X6Ip1SX -zAO|KtNs)SNX1I)K#iYm!EuY?w>_UA;T%5qf#}C*9caXSoBebDcmAEMgx)`6O1MF`Q -zg?jk9iAuNPLm&V-&Ib?C!YvX&0V7)^`4SLHRRZ@|xdgU%H-}oc{{n8`$8O^xXmF?3 -zgbO&IRje4&nRc#TN?T3Y7ycESv_jZ~*)m1)pZ4&LzRr7cBce+EU;mo(wSI#5>i5BF -zJB+LY088Wb{ViJNX8Di@{+^M8v20%k1HrA)*?$(o-Fx(+c^hq{Z -z&TrPZ;zr!!*(@;ywcQ62r72>?)rPsxOBuY_r=v?tS{P*qKnHQ;y_lsff^qlucV#$6 -zleJ*}czS&9qjS!7zC#z+q%iw+!IJsM3-Y+W1b~A;H&ZMQ4~E>xv@H$u?6;Cz{I`Fo -zunrSk{G=5fmV0sh`2$P$wj@EQwD97eLQW=K0?A-21(s&Tjv{DpT4ve@J^N6o$l{IX -z9SGi@f8TptsNjEqng4K(5Mn0f;`AK37f)61EHRf1nQV7+SS!BJQn>+kY7*mJ_;1ew -zdfx7J+*|D>M3Vhlbv4m_dA~`pOWM9XO0a9|K|8@sZ&&*mTC=NuT}0yr0&h_@^M5RW -z2rI|R6K{77Em9t)cxuY^OiBT2ra13@E17{O_>Sd>^HWVyk=~zgCn`1VYkGjgyuHJi -z>_RF5E^<~}*4ZMBi -z@-X%{DkV(M=g@5-ctF=Npt3IHRpyT8DEq>9sMOxwdwDBs6v5stri({?MB%dT&FJ4i -zz+Fb(58Pb8rsbO!qxeHCQu(`-Z0$d6N3yCsPnR~)mn-E2iYMY?^mi8xC -zvv5=g!pu%1w%ORY+NLZ5Q<{LaGXkK`s8n(HuJtX3V`-G;Qm4b~wlL9+dBhmgLNdkr -z+DMcvbH;BySUCM7lyb>YgX>R@Z9|5W-!|uSRh?_|qK03$y9ASOvCmo1qXb%ezrlmM -zRhzMH_QoM(>lrH-jrYx^g(m3~n3{Z-Ei&$_JWnWJ~{QXAm_X -z&9+S2O*@(;|0CBFTu3%@t8gV2Z2N&w%ofj0@o46MAHym*ZAM_Repm!Ka-X~yC(W`u -zt$g7?#+794y?*X8mg!F8dSN3d;+QE`d-QFucrjFe!Exs2$bV1i{-C^kTlDi+aTEId -z&|aeY?Q$aX{sall?z2Dd~T64vty|k)NMi^*!4Z -zxI+JvUmvQOy7{?2$UhWowtTlr@iN;}({fO3=0s>I;#C(*Bbk2l_Xj@S;u{u%7r_?% -z-o6r0KND`vGs%iSaB)|!&)PQ*M_(OlIbYeG4LhDPRKKpMh?)ZmsHTOiIpd0dgQ`jc -zNPSYnv((6Dh8`_dY|7Sdx`m!+dN!+Ig!D4$g%?tO`%>7$s4`~f8+|BvzwR!zF%V%r -z)?3?P8Ggf?^LFkeRMsj{5Gb1+Z~TkUr@B&K4hE=oizr*Iy9!*M2ma`E`}-!e`J+gP -zi|kgO+(1A>w#P~FT4Q-N81Df1FSRX?jJYR&&f;{H+?JRyQl3Za#;>?0+jG*#-O3^& -zjbKQ<+04pMvWW2+t1mw#^?WC$V11=EA{nmiQbvW2^R_?T5aS{`C2_Q~`&!vZ%OTn4*ViGIKsZQ2>Ny8rC< -zFC1wS+X3^ZHSz0&uGy!GN+QP>B~!MR&SMDM&Sb)1uer4(dnF9(Ne4GiR}nPl<9SoY -z3hZU$AZ|y*WA_t-7P;2!O{|xcDs?N;iZi56tpu2SQ+q@;v -z+v1z(cLD_V4#pNUZ0g~92I;CAU_@%$T8h#}9`H(h$U+OzN_EA({LeR8uS>#kLriUa -zr~}9lK8LsC63hqY`yzEwPs~4cm0qymWnqwAgh!$5ye#ik0W-q=3K -zyOQt&vx@!qAYS;Z=D`SVsQjR~wBRJQ`9MDnI&8`j!Mk_F+%oI*#~RJv$R9*7a^~+i -zB<3!P*gbi^zyyUm;1rX%=Oj6-EeJe3$eF7(Hs5wtd0SZ<-8e`#HS33mqS97t#oiPS -zX8x;?<1+p$7u-B(J12#C-gwX616QrcxpB3v(?=n0{%rc&Z&nH@oo{P#Y{+irA1@oZ -zISe(8Lu&{Nm?l@{j0NmbtP?;H+{BWN+4G!iC-rl_7E?9q-5+uDx6RjGXn-QXloph# -zX{{9w(3h~|&l}!O`F%F4Z4`Y=DGoz^*w=~`Pg5~(b%MVMs~T@_$}&5FSlUN-$q!oJ+btC)B7i&oq}UjhIGnnR=J)!y -z9>A5Mm`DuBerd%9q*c`B40cQ;LJQu7T)S{4LFgtP-9mqNS-M@R)mCoh6BAn!LW%7h -zaVSb0F5Y{G46gGNgFjpb(M8~?yoH(o^0e(Tyypk09lm3c=Pk41yX6#V(SwVAebG>2 -zc@hp7d+I$v>KLgt+wQ)G-F)CPjC_3ZV3 -zuPo)l5}|qSF9#@rpB+?!?4=zDMfI)RPO$2*kXMEx>i4*jW}L6v#84T={?}e9gC3KF -z*EbXlbbx%`^N2i)qk?i4z_=n5vp}o5TZ_7`1XZ_QnCXd1pD`MbrWVdmh3X8iw!a??Ay;U_KY*E0t;{(3+H-nI3!ue=S`k4h04ks_ -zj|$EnDlXev&MS8voY|*s57bxXYr~5)Qj-w+e|K?jGem8d(LFz#_=$Llp&q0!*aukY -zV`@G+U*)A#&A(jTHvONg+{u-0wZ@pT`r%`(M3!WQEPw*G-p=m3wfSEFPPumCB`~Wr -zV=jd04QyE0MdZyI@>>*U-I34#&h(;aQ&GPdtY*X>M6Vg*{D$Ad>-$SzswUH|G*@?9 -zVa}7=)qg0^XbF29mim(Fho%ZQ{RC0w_fl>Ehc{OWKI&0O49xmsFu43?L(lCgQwj_w -zn?x@6MsRJbCoee1iGLyCrv^&#gY)Fiof$vDdxckea%VCF>5Aksj~dY8jVVKUuKZa) -zQb!A2d9oT)M^<9=~Su8AD*E+sFAcj2x$LU2OQYgTkkl66F -zvQu}JOucVE($XOW|Jc7?9vXp0o1Iv04-hPCZ$$s(P(htFiJUE1(b&9nJjXbGej0zB -zMIC!4&4M(``i;MAGA4x1QcGh9q0=4xz#nA99`Z${(2~bP=wPQXfNF;ER&e$GeCP;3 -zy?}bq8gZY3ZRf+*(to95hOfKdt|(Hww0-Zj%_uPyc+3}>HC`%Iyx(v*4M|LNbv`rX -z=Lj+xx#?k*JDx}==)EsM^*`qOodKq}26SXs3PyXJmc|m`)d<)CazM7^lj}UNf42Fk -z1wzM3A!SWjcm(GR6E`ilKHD0A@nxH$1o%sVXdfd^)*4Hro%D%HHP!$l>ikxFoq*&T -z$z~$-Gu-?HGG$!Pk+BiM7>Jy8t_)(%Jukdd7 -zq?r(^T18;bWZ>f!HvVYul%-l4-mQfCdX?pWs&>IdWzy`&tj?LVqS?SfWhO^CK*fwE -zDR&^Eoab_gdzaK_>zgt-CZ?6@;9onKVWuCfK&b8E&`1pDWg;Q=qF=q;uTWb3qMQVr -zd<;fkfRn0i9YMUkYYb2^ChM8S!)x>Cvbou4t9Ey}60CB*vq}9N6-80@SSEHkgSl*9FEcP&)@9 -z_^UuiyFkFFIt8XAvhZr@C{l?fXlX~XH`{+ME1c{|IiXBS!vCJ|BF4b#ok;Yj3>A0B -za-ow8@6UZ%28%aZzn;UrpdpSF2ng{&v~BESKM%T`tqDINypXcHzc#&JA_f(N&!qgRGfA< -z16heu6hfyHwtT+x+F1kcnr5$Uhm8wyituo=545;oobGyK;!NtDY2*SQwb8)A4h -z7u~z7_&lxs5n`yPKg)8ugRU!!t1Amd+hu`yr<*@;*G|TeX22zB$3kt^Y0*6bFqrI5 -z;)odQmBf7wmVP+1R=P!^xpZjitu^}C&z&jZxt+{LykFh73&_v9=+Q4q$$oX1cCSXc -z+XLoICOX`;z8`seCOMRtHdnVp@aR6ML?j-C`$qO^0n7u?`W>4%w=@hE_*OqRHaLiXzCLpbEhl%ID -zq@o8;qmEQ19b$-ufrNPobG(H{3XIF-3O$3jOCyB>&zPzePU-T*Z*Tc|faTxu5ica} -z-D3w1aZr`@jyr3)8(T&23&x*>NIingd)O^wOgS+ch&z9L5q7J($Bnq2QLk_nj&w%IohJ7jrxhXg} -zv-kFKLTN$yjdQT^rHNwzQM1WczcBmI7H_W*D$%plP8>+}ns6SbR~g{T$rbXBA1Wj)mqMiJVZPGG(vL}3lDi4@&k{KfC)w;p?8>vw}zD&o_+`hhnEuKdl$jhQC@6ar`hDu6#~$HX5I%k$EJBDj -zxUY@@UYLMW&#w>$NL=V?1?%Mk7=61}cz0mks(+y~Sv=H0Hr-AtoG{y;qL& -zI)GvmTjGegZ;`gp%A13e$e`5vjzjPh7|gf`A!@^gT#Aw?iXP-kHI#-6;eYvm55QYS -zQte0IqZ5EeY~O)b3mcl-Yu=-ty!bn&Ci{ZU0b}@EAa1k1Mgi`}@Am!W>c5?n%<-Sd -z(;lEJHB;3GE^qjEg8K4JRIaQUfHi03{aYuO{+k3nxOK_OcG@NoTYU|HBro9vY1CzF -zMYi$59{;IkK#rbsw{VWz(W9S=6~#fkzhK9c9f7w&zU>weS{P`UiWCWxBuL3)qVxX-)~7LA~-ugxbDL#hO<<&Hw^+gi1C|tRifO7Zl3t>kZ1gF -z^&UOe=>6h`Q3-(F6NC@l@a3S)EYL*gd&JOeej?_?JjW_z9oF(_On~xf;FI3YZ -z9q)ks+~buWBx+_L}zE0xd6rXA7Yyf{X=>2cl?l# -zFK%apT2$!WnRMH}4{KrkA%0Ex*n%DUj2!RPHO5b4x;g5hBfcy}EYufibRlw7Wywnp -zuO(!J`(9`b^Y*JJL~Z97T{=;~6&%?sULOt_rpb>6?`F9$B#?-^p>HcCfLpj}xs^{A -zZsSJ_Vv091EH}y2zY7}kqqZ-mhn!LeUA-5z!N7>s;KR6=zoReC%2{vsYHqEkBRm|M -zLU3$F*dso!zIyobv+h}8ftSNuYT|ZOUKs%w36rRLZwi0oMj?; -zTHfX$?Nn!_){b{7&-~G`ZT84J -z+y!I3D#OzN>Yg|~w(FAdl^sJ*M4AD(Ga}YQAc=0rz5r+(ZcM=VapxETAb%wabd*!L -z&;5_a&m2ic2}GVfc}!NEa^l~%O&B}vX4VC<=eU|yARTnH4lZtLr$?7V09$S@U}FFF -z6pY_X6}W|v?+RXd&3X-*b`gsDm8L*)DC2;|G8+`oM{vgLyoz{Q+qNvfbg%=aagUIn -zAh#}w(jo`=PY60A%}hSsEKizI4Cn)&G^iR2P$9_SzUD;gPs2$d-pUZ6R~!cJSUqd=Kbx`PNh*2+cQYy7R^lczHWY@k -z=O>;ARASc9k8jgJs|>{-ADZ_a*SdV9)5RSqXD$AHQ&2v7ly$jvRXcQ$;%NWKbzyKN -zF0Bvkg>wp0!<7{w2`X79ugy_yKy2m&jOf(rD8s!bmdu)v-Ce5k)&f~6i#7o8Pe~V0 -zev{IdYOv0;@IpTsJ+38FZSgCYrJqLQ*XMZz4;4Kle1E$-d-!Vgu8-^xX8qvES*CmR -zY%`zoy%DP+$6TfB{j49^6=(k8U=|haH8lA!zga_?-HcC_Mtt)7++E-mwg*3@BRsWuq>L6_L -z?YeQVU(g=nSPB&<9Iv&Y|8#Z0#c|smF)+_ZaVCkCXiQJxB^Yh(Y!h~q9l=u@d}U`V -z2YwtJBC%e%b4xFy+A4ebx{4przdYla|8F(B_Q^EimHjmHG}ZXKNB+YtHSat_YP -zOJ3cj9#WEXSFV=TDfW=-6|lT!$Z2xhXBW&uoQzKNU;AKgGx*Gt#N<+Ip8No9P!8Q& -z-)$rJWFU%O;!B`9#(W_7YbOZ67|T}X0E^>2WWdjG&4ur4yxYYv1%vf=#ENBH=+SsPq9MinXEC(xnfqGAovUz#Bos@S<yh@rMJ~mjC -z8hY80;)Y-?yUrbQaEoyz7Vb(pj}zEGKSuYhx0Ug~W(gzh+o#migWWrI-I|(CHwTBiYG16KmUD3hnE<#nL-rT4QN_l37 -z3YOp1Ao15NCAQ%`HKg$T6yT=}glIBfp>NXLXr^Y?-nci>Uv%0@Z@$FMda;mVz3e~e -zQUbfZAiO9FS^()>B{}~6cgQKLEp{uo7*}$((Ksx9TEN7pehv?U)9-btN0Hs>W`5tp -zG&BXhjc7u4T!1wRr7rdxT2HPV=&J6BoB4DFg@{pK@**(JPsh8IxI8+>s1{P^dkrXr -zaZOdU))s&Eukpso{47{jVi6Q8lBN3YWxun-Uzb5czVcog)6C_h+Ht3AM^ukI!HC~4 -z`f(YLsL8eJ{R#bO{ziBwc+j+`(=D>gQD!b>)pJjx-a|kE4WvVw_k3#-TWCdn?tWML -zuIqoAcG<;UiKt!0Yz#rj>dQ3Z%Ry@9YS6qXBr-J+FfU@*UhA5V)$=7X5nppn%*!in -zUCv+a{cE&HcTvnf&D8PZs4?EEbs4WMaQQuBEVu|_@Ej{5CFj#=|H+i__A#UCsWn#m -z3Gwr1&z=xZ(yOEGCiHo%*(lC -zo)ltTy8AK*bR;kcvjals*;H>P`LZD^i3m1Xw&Ii5GLC0JS9!Fdv-0m;?BWX7|IV(L -z?6FZ=<2?{`HWhQc*(DGz`yN0PQb1^%Ub$3)mLcGV6A~&ZUm*pgTU!d6eUl1sL_wAp -z)xe=n_Zwd_PE`SiU0dknw2NT1@K2ZD=y0ZRJqq-;<>?~%IG-zpW8uKQO<(5a1EN(_ -zFQVkag?N>B_6hMASFG5B7ORzmXvuJ@{o8=p -z4PrDfej^Z}h9`#&Tm6_Dr?>g>MBAp*n8~L4zwk>=3Nta>TLH~;=1}}h+g;F6F%jpQ -z@L?jr;>BTwS-XyDz|8zmxe%@p%a+r;UYb%d%To9a>-IATboi$zJikt7L_A0vWPjhW -z#sIi~lr9I-Lfp3qZm_@DQ^P)8LL#MEigBcH&S__V1!)`vh?v-bw23z=b~0Z1UYKsi -z3M4N~*#j@hJ9YtIPDDMxm=spt-IJ0iHx0GNzLNNADg>Cq<@y!H^kE>E3jT*Wrk{1$ -zHD>y{ulYOh$wI6=XP@vA$3w*ovwtJpEq -zySQ_JCFyL`(+QDp?XkV#p`E`ysAv8S$|?H0Mia&KD@NynkpxP6iSl$hvsU*p8&}gt -z=)>Ra{!mjV?6x3lfslLB<=q$KUxmV}{_?T^{(iX}dCLr^HZl&}c5vaM(8VlgH=b7R0+;yD -zh=Eqp*N%bfs`dDB+=l@f9+IzP<`LiMrF|0@Rx6M0`rDvmI8aaN -zO9b~`VeZ)%jgQQRYI}`aGIm3uS5s%ZffOPk#Kt2|FB+m)Li%B<8M2$r#FsS2#_iLc -z$xa)7Ch`B8ZqAZD|H7^KpHlHJHJxzD8>#T0K7Xv8bC6IUhUGDd^W9&t_!Q)RD -zA#qfv3&ohKiO~4R8aBn4t9?ykW<_NUo1D`+TOZ3?>*AU${LGBTY5qUNT5V$1!oXZp -zq>#Y-it373qo4;R{5y94=5=b5eJb5Cv*DH8saN*&lc#Z}sgi-ok{x^=9}Uu(D@&Zo -znmya~RZ}61S+zEASg|ET2@V-<37j1k1S{O6Lrii~3J@SO_PR8J|%M#?xMG~*zo7n@&S -zlOS9rC58&<7wHy7n$6SKfvO&n6X}_bZXX0_XX0H3&AWL`09??Gk++h9`-G>aweA#4 -zU&zYC=^^0vV2W=jfYHuc|2zcsuSl=(|5yOq-~gOOiW1lOr4&G4UwrSa3lhYB(dIiz -ze_^XCvaA;4JX_J<{LcbHi3`SN4L{Npq8`xM2 -z>$_vS9zn|G0B21YNr05@QLu=D1t`alEnE2gQ78nStK~3$(PUG^ftIm1;!D_rNr?hs -zyDFZUaT=<=HTQE^mH4Ag{JKiT9wIBrwJLAi;Ko^95$|NYSu4X@;^%Vrn+KCzvqHA_ -zZ2T1(lol&H_Ujs8o$jRPP4tYZzgqR(i|QFG0y^F`sJ)X_gO>BbRXpLdzp5L)ovr*0 -zLTrz`&a>6XuJUv)=dq6-q<648geXma2noN9=C_)Yr|S#>d$_%2YS|C4bHr1t6g|0U -zaL@@4ctsS4W?HVvgIT0Eifub)_Y2-I%Zxj9OPp^} -z)(gllR#T#q#H_Z`YE3?7kSnK?E04cNnB&Uzmx^LuXZ?N)n@c5@)_teR`%CvxV6bvW -zyv@zah$j~_NuEpBTzt70$gL9X#|#kbFGDagnc1xO_(C~z-QxX4Oz8_oT>YIEA%rp= -z&^d-?6DbeAS$x2ju5;(8bku;G(K->lT3tx809KC?a8$5*0jFEhoOoZopnU1mxPE?!UPv)Lh7D0IoSrt}$=dY||%t>v$+9uuCo -zQEFi!bgi0VxMN)GJ>nn}0em?lmJoOC$z$2r3Pk2F)xHIKI{eO7Jk^0_`0(Q2EQ?BE -zgv&jHe|tuPR3<`Q?~bz|bW_*SeMt1~{a!(1<}%AXo1zSC -z+-OS1FnqX66@Fm?=Doh&4?1I^^_fnibwB2s|3%xTc&RkqF4*TXoo_zvsA^l4#$0sl -z_Oe;-Ky;>;VXC(BKUZ{3aL=hj3NuqX%~CGU-J!d%2|LH)PjtRjoX)N)r}rr$)Z5%ANORNCt;3IyMLG -z>3nQzd>`tUX3nFop-~Rh8&40#g@)n@>%B&o4athn){#XrF0UoKlwNfB?eYIzAZFU% -zJKJ6)QLR0kWjgb+agi4-e~VgCSs+MfNYDcp-ad*w3Kdakpf3w*NipF1-4RAT{R@d?6qEdFnTy*1z -zd3qDiz_B|AV&^3yFqEXqTRz=psN+woPAZdM-%40FDi$gea) -zjWA-qIjV+=8~aQb+D;I+rNw*Jj`?CssTu{}cmxu3&6#N_N1g3``jH>FL2R))bT!W# -zNb@ScZnMOlEz=O~NRji8)2-IN5Q4VnbX5U)Z_^21ckLTflb}bfUDoiP?m&(}&b?bl -zekl1t9WhX4ckFclolBLeHevw;jiNQ3-L^pX6dek+%ODS)7yIJu#9=95=d0w%gOd2| -zWid>hZ%~u -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 -zv^dW^k{uFB$z0<)FcE -z>Uu5HORnpN2QDtrMKvYzxKXEg@F4Ss=G0*XGW8oc}VZVsr(&|U-h{s)#7 -zlNN>i@f3k42NZpfZY|^W3q2}uX&hgdVN#^>gh;dsutXHBqj|!+97Fa+{`7ZESdYGd -zP}`UhHz!c@&gmCcsvp%RnAA{VlCS5K+>L(Bt$&&{RG;m%pOgf$$)C=EpE(i_xUSd1 -z3DU07y!sm+N6+S7vi`yA+PMZcNZxRz)Usz{Ycyeh=V+Yu9j^Y_|C5r;if%P7!lHl~ -zkDW8>;u!P56&w-9mtmPhgd%{R(ytN#J3h4Y*L>K%@nCEi#=1I2aT8=r1VN}An8csJ -zgi9zYZH) -zW7l2ly+YU=j9^~lmJ?5nJYV9?vX>v6KW3a_6&SK!-yx-%<`T{)>%6|kJ< -zi_8nYIVo}{@GT}32VzfhHN8u`w=wP0x=hKz&J&q9vaKqsRr0l8ea>$FgF5AW_0-%P -z8@#Ync0}=&if#5k952(2UnSdL^Kam7nHcIG(67%(t@Aqd+VWNX!qK=Xhi>A<2F@7& -z_;0HZiw>pw4>bY;3^$X7ZLCB5t%kO5xMWQ&t_;E^kTBUaJ11 -zog&Xfh2K5P@^{nCf&JehhndU2Lr&fag~z26%cUxb+oElmf!;#?-fwqC!{JUu;bXBi -zonY4Ay+5-lRQ-J^-`f9lf6w(VV%F_9M(lYrE%W%78NK}b6Ya{oSRgysOvj2F@fk_lC>>mtT@ON7KN{*1=O)7*$xYH~A`$=_AFAxPznMF2non&-wJ{sfQ|Mp-r0M -z!fxk5TT7?r^kg$p$+XY_pHQ)DoD8%1;cpwNsi|}@Yddk;ksm-`#M(hF*(t@%TYC^? -zK+n?5su=8){qbcy1Vv3N8FikQFS#nCpb+gs-ZRO{XrfR)nA^l2aGuVdJ3na|On>;fXZqNuY0VU~zY&n9CoqvmSdj1qnI92x%n!H`1=@ir# -zTKJeAYLPMoz6g4CD@mj7Bm-J_NCbA*_XH1UeV}iCOyaVILjf}sb5^EhlV0uKk_tv`-dE&5?AR;o^oI$EdsxH35}wI+R}bY -z+46}Wx_NwtKu1Ep*l2R2wgzQuN``bk(Jy;&_P$A$4~+UjN>TTZ0W~9KAS9(#7MS*_ -z^mMt!S_koaqz})&48!4FUA9F9&@%ePmIo>TSoYI|$xw+5RUMogJJbO<- -zcy6ycOiH{?AtZXZ1PnD$L==PNs_jCa5F40ueP-=y!*Yu?CEBE$6Eu& -zZh1t5e+i=95zM;g_s^u*yAhIisT5eu`Xv2;=BlFS#ISZSI*fsnP@MopD~$1}F^4X08gUvH2?@JnWYV{7L=$JUK{p0`5sO!9nbF_Hb|&Lk=A{xso&1_>S_HOP9%fn -zeu^y@f)S!zYVKA#+Kc4G9~!>MNOc&Z==+Uhbtqu<8_R0@TG;bpk~7b!&eA)2>sKpy -zvx#a2W$x?OI+`v~kAQm1A=0g(HU^0F{_tNOL2WpK&FTTr@N01j;f!tqhAwb|hujG@A -zmMRWZQajBMCK+|5-8ob1QI5TKsBp59ZUr&dI*^Sb3BZ@9=2Z<@Ek>x=Ie+#@Fr1!T -zUwRUsSA2E%lqk56J9^oZ{|-8H^65!;tOM=s@N-eF{_as0vh@Rn@FdooyXQ0WL^LTl -z*$LZGn5v4OAD7rXHyEljPG1E)d)?o|4tA0Xh)sVmv4*BSg86GxVcj_iX6RUK%&OY( -zSbwArkVMzzB0hYnm!bV{OdvrXJ=thB3~H4SafQ6_qr7pw;q@ktpPWqg$8eA(|FwPv^;&F -z3nGee>XzVhyZpoe3H5VslsP|M4m3(=^BAU5HS?PJb{wGP+HFLZ!D~ -zP9eaJc#k}th@`Owx&RH2kCq@9O_=C^Wtgd92a1PnxSEcirPodi|0?3}RTUkSZGk`N -zZ+R>)z>RpGQ#-E`im-sT=V+>poxeOCa79JE!DiJcIRJ$p5hBB)*FJ_tTX6~8QN;o&e -zj1TKi`37{~u;Es@aW0A%iY71rQ7B3X!``Opj?Ufe1UCwuULm|(2bl(G8{1*t7I1vm!dgA{+s(l -z&`!sE-@>>k5T-%Xn6!S+V)P$#TQTHMUug)^Q*3eLvC{$~R(IsE80+?hjuTO#{UK_eXvvVLu^ -zKZRPO{a&@Y6CW~IJH1@(R?f1eoJ-k4O;OA%$LB6Okg!YrChT_#f5svD5X+S;#PRnU -z?H3)-K!Ev@2i(ddC7y-h{leeTDJE$#Kb1>=g|L9q=cIsXv9jYJK&}63^%KqYQNiKt -zm%{<$o#rz@ZUrqSo67RsZLsw# -zQjvxX(;G3yijpqvqI{x2+xOycC4P=4Uh26m)fi(3F7$b#l-(_nt7PWpZaC2d;`&W& -zJyGuQI=6wd$I&%KoC8gJ?BZq22Nk<@%?=+zmloLlyxj0! -z?vBN|{z!fwSY94^ci2q(x^BU4=tVojs7a6F<*QGP52c^iha!wbw}0v0AG$cr%A-5h -zdG2H5~6c0Wr7{)<=(c?2z0XYLYjW9F({ -z{D@j01%hAcf2)mji^3!8zoRTQlFXfh5F5p~ZO`1$hH(DCd_rX>5+KamPtog@zt`FT -z4;J(`aMGH&9R02m@2WvF%aoyd%Yls5RkzOdUERC#O9mJ1KEE#3akdLy9Krk%XlYNv -z50Qc29sH~*Jr3d$xyw|RNY;2gAL -zTJ8lEqiC!-Ugct?QTkk3xvg;hI$loDavG}Qr+}GKKEa#SHv9^lr?73jJIu{35$*Dh -zqYGLNFD&e+YNcSm!{KbRGz>;WB&DRj+plxYD4>?{=5o{(?10RJLI=iV;}*G>Lgb-H -zH#8*Eq}){1QPV=Wo!Wy8%*$vE&z6X<2+dI@ADOxcq>M2;^a#*RYxGza>V?|yG+iI$ -zG}>R`J7WEvCqG#_h3};L$CyASkRf^$z2|}YKv?iA*>Uf8DEoKIM@c`HPf)_-#Z;#0 -zv^y6p;nO^-L5Vbl$3bsxlFJ3xekfyI11*(O&gya@h;~{~;*G$2&O1L& -z=;R*NP0GM*0JVCQ(8%mqE4C!xui9bq_w*zR|aJhYEzg{)sWqAsuY|; -zTGgDrY09jSVMRyMmZ*AEIK%!uV`)hWQjx&XtBD3n1>!8;QGrDpjb35Di$CgQ%AS4(C2sfrF>{Q -zgmG)KGvMRmAL#}LY4qu?4_gB>RkL~^X5U}xMIiYT_X7L)E^Jt#OeoX+2TZ6QPsC~! -z)c9Z6#KpdqR#GMz9R!NMN1%?$ljhJa@V8xjs7o0m)j3cT&5yN9f4)<0H)hOp?0NAb3-0 -zoo7*M`vWr~P?tuZpj#S)O2mo-&hP#GaCDZcA4f9lgByq$Yv2JNq3t~|6n_pv(&vf8 -zTbZ~9X0$Btyxn6~3*WR_$xI6;;K73bnzqxzRD%Po{I>qD1t^H#G>aC!ur^L>j1OA1 -zF{Ar0IjLOLyN!2wZxnHS?YVv3n8 -zQ_3g{AfC&P&KV%%7*+;;#f!L3f5v^-kF*KC@(pF%nXS)XW>XUvS5Yq>VBJz$2&COu -zomH`OBh4O4%B;K{huR^2Z*vWA$l70F}zcQ^o3VkK# -zfas(+{Bf1sOvAZQQx>0`cT%=sq21(nbchjN7bj{B{4@P$P4BPKLG*64)4KXbsRGuF -zBV^YRk8DQ7A?T)CvjCPusUrIDNpIO<^ODOjHhsm;jzdmT(er&7b<*hr=L?Sag1;NF -zn^JE^SvibrTKQpGTA?aLHO2J7=YJ^Ts1^X|o#(F)pZ8K|$%yoh{&GD%TLq;%x6PS9 -zN+RSLo~`KxZ@c&^Po9rGzJnYL -zgt#$EPGLYxI_LlLVZ?-`KhVPMZfxKNGfy7Uz^sj&s)i~ETb*#9s2~Dp_13i{h -z14upqN;d7-L}HXxeaP3C(9zB_l769)yLxbDShYU(5iW8XWI7gIppuq$TGZLcgNRw7 -znBV3Ha-kP@`Gxgl)9ksmSXmGs6aNSr~YGS(AhV%6FtISyu~trn9>&3Ha3>0fDrALC$jr{Z?=eP1B+IW9!$okEJ*S -zViGp$C~{3*d<{YM<2%1}PS#{B!8Qk)X(0v%M<5%8(ur^Q2K~m^a)(wPN?6d4u>tP1 -zm-QkrjndbQS&iZ_n<^lieH9WTY~c7+ic#Qn?V>SUypEXy<~$L3b~Pz_>=Y5-gcywu -z%*|zNMy2s{3Ayk7{pb$$AetD9Piob&ObutbhHfgQH=x+OveXucuRIBcUZN)h^XAg1 -zSsg!eh}W2%bz>W}N>pV;IX!FRNDNElbRT_^x9+jg-l(W+>gye8{>nR>wwQ_ldilQI -zCbbqHnIyRO3qWv<3B;J<@&U*|f;A}}4%>liSsO&2EkY~$HRxEXRU(}j4TY#Q6Q(A0lUIIB$+{0JgbDcz#RzgF&(j`k#$MKQ>D(Gc) -z?#3Cj!SLj|ueE`8e6~M3Vu+O$-ukrP_4>IeACamG0Wla549BUZI31c{rkkloy6XbR -z;SwJf-bo@s+v35W{{r0!vr-hI*#!7aNr!wXEP!w`U~o6EkDc*IyXS3)@|AJ?DkgMR -zo`RDnd5#~3&Gzurctgm7Hpn0g~V>*FaP8x(%LH1SM9i` -zATbk8v_h#U3@Co9S<}*vCI>GbJP~VOfI}evrcV201GN3cI*;_M}Km%paNcp-G4@~Gt|95{eYM8TuON(E}>x-YmAdhRs-s8@%;t0Mij!>#* -zEKA3@cOcJw>`Pn!LHS;IEEtmBCJeMx8o&U-v4;L+C=T9rOz5jg`XLxmZ;qi-I!y`i -zyvzc39;>oLk11)TRsd5K!WroC1E3Tvn@pm=jAg(RU17vtIGiZf&AVxUeHWh_p)DVX -z=0L96bwZ%G#PU1{iH`PIu*W8FlJt<(%`PwTH%_5w1bO_m)fj&e9T1DW8{Iwb6TKLt -zV(Y3p38s{0pnSbIN@C3zFpL`Lq&9siW{9rs1+fD8_GsE)yC5J+Ue`%XIa17B8(GE^ -zlso;iP|N&F-hPm#v5Y<*W98l#bt~?l?-#AFx{s8wX(W$Jwrd9$uF;#1^dxs&y0_0|%sVyib~3hx~$IhQz@06)jT_-Ru`6ImHRL=;zBHCBNga3v-Xf -zZjy=QwsTTn!j{t%Tfm4~2nx9IQp_S^;fZt*N^ZcOC2i0f(|~YtaL_+iB=OX6{~9e& -z`odn`A?)9nI>&tN$uqdyPOxg}+wdU!f|rk;2Yatd%`L7UP7M-cYI~k9bz)!#(BIsg -z!1C;~+xY&9MNU-Kd?1E!cYpbmubzWi-bh*{)yI0OHhLWUxJg)Ue(87Z4{GP@mdxPG -zw5f;JTbB2$Am#Wk8<0y)%P$k*r;RGiEecjf+z3K16{A_+V*a1c-ve}U@7fiTCfB|i -z-8R+L;}DEs>TzLm|P7^ -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 -z$eWIJ(`TZS88MM5zM`8#{ -zm>T1|1ci+CE{RL7g>!^pQ8_ig=d$Trf+yCm|2lx<)NM9ByGC7q4e$(~PNC`=JvqD# -zvdYymTQRY7+&Y!a>&>e(xkcsG!Cs|KBR+BeEvy2)kx8**O+akbZ90%;O+{q1_Yaccl9Tk9B{bbk`Dg=a1y^7f%qR7j)t)Hh -zFJZ|X#uNbRY$JpCq6(u(g=yZ1rn=vb%9m$&Zra0lB*##=n*r4^msmQ`*kWpUE)6V# -zw)RWznd=93BR^U=t%bfQM7F*I%+3}bu4#k<9+)qKFT?Pa-?IS=@E5<%v99;GauA}}cz`CCgv-i75fn34f(c|dH}Kc!R?~{Wk7iX|Bjl5W -zZ_U6|A<_SYUKrYuQ;9g+9a@hPb(w&>%&c2%Vj}>o6Z+N{sFYEkm&5VQuDB{5Xbpxs -zv0+yHw-@edA%J9FLpGf^lv*;pNdN^PQDRmorKBf>lUg4u0m*GawdTQ#?%UHeA>-@R -z>44~-Qxg}OR{fg`1o+=Tn;y$Ft3A>9Ak0^qh4&4^`irIlh^3C<&CW4~-Xo_u$} -zH*x-4T*`Mo{881VPnaqG^l_kN>=7=-sbM3StR=zI0YX!eqYT|VWr5&X%cC2v5A5PK -zC%qHCH4%F^d(KyAzK-ZQ@c)I?TG?{&HYYP4=0#TF)LkY;J99b%%E~l%AaHaF=Uas7 -zWd-xj&w#{fpFII8K>JwrLfujd4l(ul_1d<5xQ^AAlr(jNQZd+%?jqeo8x!zCP3f^f -zBw_sVit53_3s34>0JbR6!6!jZ_T2319@|KNt<$HHhgW?!gywJI67E%YkV^MiJDN&d -z{QTLpk6(=cygEi!7R;J9`_hyAA9<%5B;lm>Ri6~)SGrkk3c&bJ#mS;8sW4JAL^|v9 -zF5M1qkcu9PXWU@>ElH@Nd2GF5zL+OONud3ldR8&doaa2aFq4@9rFI;Vxhr`93Sy9W -z_mEFdcMYTc7qM&jbI39;V&Tu3I!;GKU80EX--!r8sRQLV>FG*pbjeK_{zkZQIZ$?0r -z>qyCDlzs3%I@y$$JYdAWAKb|UBPRwJ*3Kz`dFBHt;=9K22M{!xe8a^HRR6WxR;T=+ -zk$>cyRGT=_D2=4eQM_Q~EL%XA?M!sc0zxJRE>~i#j0@eJaijhH;8{J!3eg4M3E>xF?V{C6Xjph0e{X^p_yI+^5+*Ptzs=<2UW*EZv?Uo7WVvg_8P -z&VaJU`LlpU&ct_~699O(43r>@!nzT+c}Geg+A -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 -z5~^>_*n#=1^EnN!gdqptfm@bbA48Hyc| -zQAu8-{AF5em~qQ$tO@p=Tcv$rP?g!{fh7PHfxTeheBW-FRQDSH6h|1NfI=YbD#DqF -zs%h-xkE-Pv5Qg~+3yd$+X-aeAZ3hQ!$9@srj3U8G_ld@k;{JQBO`Yz(iv6oD)ALDc3zGglzhcz(_;q~L8!z`(Y#uCu -zrZ8kPb^2o^!xoRGw*rVebN3i7&2PrSOe1o6Z$yuK*>~D$w{~0xMGq_4OWGL#S}Kr8 -zZF;nU!zXujPoQb`gBXaWYFPg=E$V&F-a)^`Zj@F5>iSxgbpMgmD7NBfkiJ*8wh!Gb -z0~^Cd>)R1cVa-Pc!UEmVnFDlv?^1Rj-b|Zzu{}F)WZVa*c8&~6pyZC(mgms)E9QcN -z9Xc6zzM%!V5{TOPIoH8t-Bh8TI99B0I?M-2ixxu;(ON%g%+(6=zvD$^S+Ab5JLAtU -zJI*g3pv|MQES{7Hm2*68{zdeb7e#Vhe!|odcb3Pq&PL+0EzQ8Q{{8Kq<51gNP-D}_ -z=F2r!qtQi|cNjr94&1e=rn2ZMhtG~;7w4TNah;dbQx8XmHzZ~2e?o4>w&U#M=xd^t -z2A&Ao1ar|&zbJ|_Huyy?ZoO^{b3W0%k9%d=r#`pkXv5SuAEP3e+>}r=iuGFr=XdiP -z{ngo#%v7p!`?XtHrGw~;&P$P>YO;~&Y?g}Ee=6Qrb=8egLcb=;o|{z~G#xjal~6vY -zoY&69gi(XX{@II>eHB&Tb&8-e+I285NLlGM{B!oTt&^n55ah-gm7ILCuq$1W6x>TZ -zxwEe8FF9$!R6HSjcg1ajXpv0 -zg+ivrQ7)dYzl?CM8|{;&op;dZ6b?+IPBG87%r<_D3=XMbUds}o(7N%JJXP{ytznMV -z(eVeCvof^ -z?^}bpVvI>X?F>>2Ffss)fd&DnTzJZD&B(~9K)f|MvGTNXQ#(>LrRYg&DwS@^K15gN -zU0Ao_h;A~zexMEc6#&JkKgHNSMrUYY<~fE1l)Peps2u2dC@lNI~>iU`| -z4hlxU@CVGHJ1A>#0p)dj-Tcm3PEFHvO`Rz0CQZr?5ANsFXxK&Q5^R3uD;W3;Za{W| -zl7EMSOxREGG50j0z#_jfjngpZev4vlqbpj7cDrgoxn{T|;{r?BpmZh!;9Y6t`G8;= -zrkD&O5*r-CbkeQ-jQZuaxo6S!)o{lX&5i$i}5$a39w$=zNt@WrEy|G%aj08S;8n`-P-*NJc -zNA9{VJrR`(O&hkS6uf)RvKCG| -zQ|ve)lOrl5@okV3RrV*Mp!b3}Ip`nXidYw#IjUYx|TaqaA&Lv1<=_ -zbV?A?1ko=;x?fbk{2dY6CsC6t%x(bN2-goK2ZMZ19N3%{eCHuOtW -zqanbtt^FfY5DxOkyZw1mL4Uu0 -z0+xbpA&=@6KMC_QNOdOCLb;GqNTSh3I~JpY=U+dR0KRyKoaiiAU!()uCXsNSh|q|0L)ZbD$e9by)OQ7z=eDAA -zS?YeQ^i^EM+FQ0l3mJin@TI0IWl}BTEU<=t$@dGtF70Vx=jVyFn$r+l&mA=^W0x1o -zcb`Oi8XU^!ZCd7*>k4MOfCn6rROOjC(ESuEvxB)h;d&zxI|)SIoHtgShNj#PNud}c -zE#?-MG1{Z0-->P_m{-jl5^G>(BLeCVxpx^_L5Yul#ms`H_@+`Q>gLe)g!9$>Cr{^M -z4LEk+p@9qhM8Pw`^VIif8Gc6d;&h*=s+;I1k#&!(h>q1ABP>WT3=Iul10uf>U^4G7~Xk>r; -z7}=Y)W|M}UIl5`M_a~ZP!CybAVm!NA&SLvJQ0703TQjR?SX-9TV8ss${=PsCg}Q?1 -zs&qxQH`mlt2D&+8|1~llR1#QxsN_1SFNIvWt38SzWA8b>WqiFu8OMy?B0a%=ag_4X -zGq94_?Vn$PG1wp?{wT_oE-`?{_@j%5f6CJVae9A>Q5D;g6&BGfgRoqdKhuZMAML@9 -z7+suR=}Nk`#5E2Pt7;2OPY|k-;b+2=ViU$PqF7@$o{Bg;`%d`sJ8?$-m|+OTSKi+_ -zPt_@>zmqWeU)4TLpLsoaFr4Va6CKp?klGP3M3pbTx+#vZUfE6#*=D@%80ePQ<>8_$ -zvtVG2Ic$7=P@yT1>4&Nz^*r)X3>K!pF=XjKsP6j-890Mn8cL++%WM+dE2Z`asK{J5 -z6kJ#q7qLwA4Cjy*F9)mIG;58$!JmN>N8D#vht>)DPi8c3e%6Kw>C2 -zTyjF}=r>9r%wp*x_HRP2$JPurVE3Z!3_KvM2rendo(ru#EZEU~Ay{p!Jo)bw9SO`m -z{p}{Pa^rA(t)f^PD>rqzWTUy&Y)hqm@;}Q|x&~vjO$(LEo)H>Khf&#~?~zYMzPmjm -zJaG6%AI}sFiNQ$vv@Xyg137~-v_nY*)7C7&#cwvFliJ-#%qK%WDn26Qbz5 -zYdRc7KHZ71wRohCCNo{z -zi`kLR=$>zHB)$}$yssM=)z@Dlu1sO$$XOoqsU;81-=p=+byX%d -zg5u{r`G64z;$#c)SqD+B^n$@?ZKKe;8{e_B9& -z41HU0@&|(BL*`78k-0Uz2#;J8x~ca38~w^09IHH!N6sSnJQx -zZddKox@(%bK8Ga(FLh85A@0{;H`-^k-aGrbjbzQHzR*O3DEQh99!D$9odK00k -z64MRKgJhdb?w*||3}C3li+jH3_gjU>oi*~ZhcaKk5%vhYaw-s`aqb+D}Mvy9%cIh0k?;;7|@@%Z8Ca(qztgPU#T -z^37RuA(uH?r1eJ>r4&fVFEBl90=vtVoKxl{>*+Dd&F8*Y#2TvtZUgQ0A&N||ZBBR5cK40{-ob!pTB_7De(=CC?Y -z@cahmX<)^uqHX`Xx(;~WH8bEE#>J4nAJrlU^4$C92*M3z>XCxW#<$H`k+oOXFw*jI -z?Py2F98>yL@P?}>`F_DVnab`35Uno#ZL9}|X~>hYjcSOEdXmiVvb{qKx^_R%JeA_* -zr1J&PKXV#!*}q8w5;VmyO;pM>xB+Oj(e?seQdB3+@8#5$?O4b?hA&CHumM#v?x5)v -z(Pn<~2az4rU)O0HQdKj>1@hpQ9+goYR(jzLPsPV{=_zdu1IyoWp80a6+i>^3_CelN -z|`5C=ozpNqAVvu!s%EH!$^4CUaN3n( -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 -zf4kP|JbQ6S)QnD1Q=C -zP+?#?UaZo2Px|AQ#gmZN5{5+i>r68>)cLQa`^I074&lE++#4M`{>ziaKYK)Zs``M- -z&_W=-5mRxuRY}g5-xu<3#hbpRTqat_`>#qh(;od4ht_@iU*#pl`H}MOFNs)>8X+%h -z0i`!g$OA6K=^<~;)NpOGK-EWG+XO>f8~KM{z*cRFg&_s&Nm1RmapSgQFRgA79iH0#R{fGYni|${;ne>;f#vbvxMxuxWB&Fm -z9qs1=hSk1&!zUop>E=hDLrgnepnr0TdE<`w#JF+$)$W?cj*7_+=Bi((o+R6ZoP?5Y -zeUop;AfgQAmyvW235pFPfEZgzLJiyV9=s*=GTj%C(7n8vLT%U32v<#mO%43q7kq?f -zO}QQDY;e>{(<)%NulVT|6+LN(J>A78&xD#O`s^GDNp{i(;l_bRYUW%A)LwUdnIfJj -zBRC-D&31NeruQY8u6Y73I2{!U#wOpcw*MIB{^x~i<~IoPPD5Wjm`XV9Cj4J|L-GgW -zCmew;SD)Ammv{qz&>4qX;K44^VCU$%+Gb{lNEyeR-^NP^$9jpG5Z5fSf>)NfZ0=s8 -z2qt1tel_&uh4EcmSX_4sa^lWPzUgo(@yC0JaFYUIC+ux}p%k7GU&>=+fjLc=a$lx} -zL##sjPPXFv`Yb0sm3m;XA>iu2B%RszuUzZLfN;;$kDh7WagkcU^ok9IHBLcNNIBlb -zPwNRt$zT-{PiUKGN0m6lSa!yR2jE?ITMS!xp3sM(4g|9sY>Y51MhZ%Np$%FLFG5iZ -zoc-GjGO^`?*790kE7G$!jYFgQbdihy7?+%Rdpmup;rNLbyt;(&Nn~fTKOf$257=m` -zfyjT3z0IwtwOVQ_nm44-eUc5VuO;W>AOFPnyr6~~0~=b7!{r0Rg(b<+&+r)56$djkIbp`!F9>ApEeQo}`w0RTz8oDc##p^`33z)r|Lof=bv$Pjz%{|<`7 -z$vJl94^9L(uFuHOue`h2D>i`0bhm~j{;M;lj#Zb{kP?UXUos(D@EO0p(+U;l6UAjq -zOC-^i+4s0j=597}uTyt1qNUFX8Gg_#n1x#xW3*FX1ONZ$1y1%|Jv-lYF}hr;1Hz-U -zQ#s_^D`k*L<{xcB33$J53BS=Vy`Hz09pm=X=xipviN^#4<4LfdjKz`~HCXlq35)NE-yJab+s9`}4YowM&t*lw1 -zWGu~)>YtK*(#4+QCs_5MAdMI4b8j3exx23rTV4`~Xt>?8;Bl1H>YF0N*0sZs_ -zaqNes6G21#n1ql3e)y-al)Lp$Qquzv=Gjs_KAp=Ov6V_yzuHmNCXo!(21=bC{4xCa -z^Ya$9W-tyF>czdLoe9>*pfVEA)wwBPcGj>e{B~W*qfMcvY^6qaOi>E9UN7l(jfK74 -zZ?wM+xzjI2`UJr%{zvVf21_fcvu$uZx1N9KeW`v+yqGjJy)CiLg+Nya0jR$_elvo} -zRMQLa{0th}Zs!SwU&Qy_yUufsT|)AP@`5BkN5WooG+_N?4o_+f?fE9L_CD82P3dw8L%H|NR;wDUI{AC4Hh*aTyEK0Gpv(R -z!3IcJUKrM8uOsb%(?zyId86D{Ekj#Asya4_ETX37LZp} -z$JQNYiNTX4VpS7JaL1*`xt55{=O$X!!io%Y(8wfonQLI-SF=J|$~ahbn<6p5E1vkm-1+Mx{5cP)b_ZmTTwsP{5?LT09y#!JLVC$_{bQI58b|8Z~ -z{6tS@*8{{OL`q6Wy7^UE9*^nV3Ire7&2l2jg3GT+fi!((OP)KiUU}wDb$s1h1Bb+q -zh{NM=R0;+>0uHyBF*ZZiDwI-`rT$8Qe6CW9HBt!Wb7MkS5PP3i_(xv(ppPNNMz(v3 -zI*X!AgL~N=JlY>`#K+6Y`aS9NoD;J&2%? -z%7pgfUl+vJM`8DZE9{3~>X`UqWIwoT|9tnB(=frCIjKWQHQx6{A6mFLi`bmmLV;tf -zbwrZj(ZtoulO!FY$Kvy6VOVDQAtv>?L2^z8G_?#R(n~@f=&wp(rIos@iuw@qmkeuz -z*v^u2=OFlw^vpt`Ssb1yQi|v4vk&g67}^EWoZHVXcO^JbpMn)9W|^3VyC#ZjVpeOD -z`H|HS{qT;6ESf(gj@J%69$G~sOAs=&FFMc*@6i5$a47SWgLAdjCSYBbI;P_y)~zKOfXK%y#a1mA2=dM-D4c}ddq|PMA3{N@4G>dJi0P&(DeIbkUL1Zq0rDdD -z#zQ9$Bso$X;jS$9jbbVnB#N<>a-So|DJq8hWW)_IYhs>-1s%^YE&fxLhocb664%(} -zNF^OdD;mF-a~!8~^4P*buOkV_D->}gL{|Rre5J{4;8U66Wtmxo# -zG!oc^LRNSjdzbDTD$E?%3a>4_QLN^aCAM_&0#zC6bk)6gm!*efmZS${sQ89X`%{s~ -z%H&WRd>b1+)={7gtDlCCHBQjalBT!wo(n<6Wngt|S>?%Gm_kL?)^>4kqvs$-(?8hkIiPI9pS5s}!{4?94Nm@nb`Fpl;DGsvZ -zGXk}DQx+qK{wVcERgi6*yaBK@+oVh_IvIBEJ@Ect{h&&9eJt -zjE8=z^O{bvS5v|qSJQ{E=+kd^h+j>{5IX-&o-_?t)n!d+aF5(k^nR(tf_(7B*buW? -z!JxX#z0_9US8Yo2_ptn%@uF_%sQwPeyRszeSVjP1w1CLx=LEl0VIZWLUB$BBRyjnt -zq3o6ZYsdwM?W&z7glQ&k%S7bc=1dcF(EG7s2o#ja_T@4K7K__$NIwM;`b-q=9Xua- -zPi@_`1c0AXK=nw!3R-xyieT5?-UYkmdEH^dRm+bV4LaiR@t$HK6Pk1w1qqHL*QnMj -z;J-C74G-nKuN_`?9Fm!SX`Ce(dir}T$HJbpSj%&Z4Cy5&z+7UW`140d&C94;ydMvN -zjXIZqb&qabx69^FM-aFy-V+??aR9IRB`j!JfuXu -zX2*n38^|wG&rGwz&u+?aja0BUWg(z{^xJU=hQ_E5XH&gzL$P<02L8J}+1rRs>w_{kd@**l -z{#$(j8SK2KZzZ4D;4dFv5loD%#D+*MGr*Xxpk -za#Cr}G5LsrW}I(%2X3a~VM6;+Y^^hGS+h_t7F*tf&RN=(TRhK5@Y);-EZ -zkthxYdH(Q8NmJs)%w?2iyrz{Tf~nz|GZK;Qy3gkIFu6?&+dYvD`XlVb$KLqK8?^wG -z?3_U~k7?v7Ztynwqw$$=O&VAuG(1#x@4*w=`K~30`&=J!4Y{ojZlj_|ITH$7;5`ek -zM*fdNj=V1~Vu#qlZP&@#uKRSgo4Q4Ey=C(MBD#{BCC%qpdTn?dOO(H@vusePzT5+A -z*BE3A>_Bq{o?6~2ypo}br{%~QAe*T-j^KOytolrY-VZ!3TF>RUelSrK|N;GpLNKG}8xqabqyWv)NbzND~-*866tUcO- -zrS`5jA#_AT7m*1YP^8uW(I^mKwL#U}J4X5>_mZ4tyf5v_ctF1}qSvmlWG&THgayU; -z-YCu|@>zBIy@d4`D%38#zv4@+8aMxnjeEgBrK;R!ah)T8PQL2qk`NRX~ -z-W1p&S03TM69ZgloQ_?3aB}qKCl#SK<|IoRxaZ12HXWqRZ^E*KsOG^JJ)TD{Nj&-1^2-_F=KFFc -zS0_5Bg}$~_gs9H*wmI!$#&`RdF90^p`Rn+S-4l7=l!Cm_QZ?}B+7?}E7a<=eZqDE* -z-|_ls&s2L@a$Kj9db=A-+Nrwy;`ljj+&OtJRht}@+fgVkb~RAUNS_qRrr{~}XVm&f -z(*gx(WALjn$>{vmgu-w=#cvoV0@~EJy^uk%EPUZrF@D<4V**H#L=6g~HPIM` -zOwWA6ubyg1h46he_w6uUhM~^Sm9Nm#M9^ -zq=X`o1 -zdU0V~`otET{={m-uG_~!9!CPPg5KxlQ=XR;yr5F%J}a`oH%uy@zpdB{y8|!D-Yl-p -z+5Hx3GDcl8t;|Hx7wPY+4IEW6CKwB(b*jAg<`*8ou?UBL`TogPZiMgDCyR5XO%+D@ -z&+WY?M^C8a#`i?8PS~oRHFE(8m8GW@Dx=6!=K9pD{$}_@t93l2UT)*BCui-q_0~e+ -zYwcFdnwc`o(>OO -zqhjkh(CftU+n?BP`;6PgE?c!eFmQIaNVrk;d`Fgf=$4DW|vaVuL^po=z`p>@37Dy%Qo9Ql`echCH^FygrnD>9Bl}M5Ip57g_ -zuf4cAxkspFtWsZ#$UMn5E-tu)AF9GGYhFzK`_yS)0>zF6%ia%wtvB(` -zIiKz^?ge!da@g?Kv+&JAo_2`HVC?#T^z7DRk0Y=N&BtrGaZK0Hx5Ti@2Cfa5(GdKG7 -z6M>=L>mBJ2TjC*9hohKWqb@*up;<0=|FLsqdWo!xjY(*5fd{Iiy9FD;kkT^L;*Pww -zY>E7mWpP)^n>{vLIX*cpNodoo&vt|Q*E`4Bbn?>4CU -z?mXNZwzQHULW$Ub4@ahV=<1JDl%08?&Lwc{f<#qI^9wqMowZ^!`qlzK?m(fu@7nLl -z6Tc?H+ZO!OUo8qRm|QkK8)kzdPiut7Qx?DvOj1{NpGoiBrra^3u=~2u9e~s_-_x81jE)>9k7BOW2ZTj+gx9n5f4l@TIu!%^j2!g -z6BaUg{ICX_FRM0GPWm+xv_FV+d4-f@5#w^S$3HQz_4r8# -z{^TJ!EQhSLstH=zAglaEw=>`O>k@# -z3$-jIk{r$atwfOIdZoI9eQKaHnX$euslosEN!BWXKIV0eCKG4NXX -zpjQ*@z$Eu3IdaVzp|Z@Eko*yVD|H2c&!-JNN%9sMa*ij^x*RJPr|OA>4{pS^;icq} -zHpW}jqRqG#fb^c1XTWgi!K5vr!DOdPZ1J7#>PI@r@mt@;&RpF`R^Fx)j3S%=fsN3JwW-wgp}!u5<$#u{k7nSnS9(T7NAS&n2=Nb=hU`EJL7&AncN~%mBA`mBjy9{0<@Y -zc}_I=u2&SVn2;y@HyDs!Y{;aTQKlx)BpB{Vl_+>A4I^2NLPgbr^?yw^7 -zD5z^wld#>?m5g{sKHNARPGIL;Ey<~edX;cj9}Ks|@$MSA`{-Fihl7P7V+1sqNm -z>ApI?tg-<}V?Jsex0|Hz3pl#Ed; -z1ZhV#G3774`S&?#RyR~741a?(CGhQBR&u$?_1(GwZf(k~M4%DI-d8#PVcVnlq? -zA~HWJK1y&?q_jTpacP5p*qp;nQ3P# -z3=`0t?bhX9)8***jTmh5d?C#;i}6-JPpfr#ncjN-^a>hNlIXxO|G9jd9CP5g!djEk -zOMQp3AN+-9T0=TdQRiX41?%w)a3x1il= -z#={sA08Ac!L5f&U_)qNZD|*Cs2p_&#$J7K*%1xpu#a+@F{`D>%p4INufsIjDCtzcv -z!6_WuY15M0t_iSRMt5pibk89OTQ0XWKCOq!b-2lj -zm=q9B*>``eZR;*AJSWwc5!2xl3^+@Xvdh!%A65-g`hW=dB0-Pl8M)t;zTW>a;`P1oDtzq!&KD$45ngmmka -z<1jLoV_(x@FlFt`kIrjPHgk+70-nX`j^%(&?YBpRF6y`=X1eNAki!>+Vlt -z8!ml2vbbzRxUi-Wd!zFyUWuJ;dlHwmfnM`T0{5HYR3BqHIx%yc_!)Ix3lGD9MxdD7 -zg&NM&7%5=!3_K}pL5r_{R;>;4jE&P8kv6P*`ps9g3@mS@SQ;>mt9Nkw<9OJ8j~SuS -zU>?^g>BrvrIJPhU8T}*4H%R+T!dkQAfD0XoRn3pml?6&Piq6K8aV$p?V-Eau7KfYr}`9XaVs?z2h^Hf8;B1K -z)tgW!SbDDBe2Jr=L_&uRbWAwYzCK^wD{*}$NVLZ^%+S6c^;mEuNW@)U9>$O^zv0Hv -zs79LIHmIE=1&KZ%q)DC8^AsT5C*@2Fc2VQsdche&2GK?jNe-6=2<@*I0SNDv@BgxD -zM~16y+r3lz%&JmCt0h9n8@f2G{At&t~MU}B0NWC367G$qDeg=3*R -zIID4s^po=F;+p-$h{>=paTD%*7}t<`vkC5P40Z|Cdi{S|fb-@I=kcPC3Mr3UeHzj< -zoAqh%uWrY#E}yOb#_KN#k~TV1!3lb$6Y7&7&_;xadmwYcODFO9SS~9LR8@rnM6pzB!tG~y0{5>P9mHP- -z>;Z|~@EkM9%Gxu*^AXSpe*qqH%4UGfsEvgNtM7Y%SJyYYL2sPfeOrWbpbSPVz*L@@8 -zEAK`!+;ypmJNHRgpQ1lfiZ>XXv!ipLlE6B-CKtRnf7aCgaOYxL{iwuomW9sJs7=N3 -z3&+wT6JnbwImKF3{sbYk8b!0Gy$gZ{Fw;nPua0^}$@P|mdH>mqs3JVrwgB^0%2@}t -zv-IzV9%YuCL@meJ4~}jcTU~XvP2arZPd?;}S#*>Fa+Z-giMgywak3m%(?m=Ux4*dC -zSGf>54Mh#zkjnSsp51rsQ91=>8ptD0jo|dtHuY(HSb+9qN`++DUsuEvq7R= -zd^k(rzBwue5+BM`%CQ?Pd7Xb8x}5p=2e*Pwvv4z&-Y_+Wq6l?;x1>u`Ai@IcR_Hh8 -zQhBPSqj{lA7KQt1F2N@UMm&{L(H=&8#~!g5J0StL!bMfNz0dnoTo0ma*tH+OXJ5oT -z0~6CJUny7f#c)}q^`zd%5BdWe8@Zsx3kR~-4(22*vt14S1e(e49i0bK9 -zN(u@7c4R!Bme{ThDK>K_$9*97)?0QM-k$cjX9gR3k`DQ(Wru|Ax!|ci9oyFsJ|C5{UXJ({azzgb2n2har7?b69U>FfxK-Z>|Df -z%AO$m^R0!NCr|21F&PtaI0*h1Lm2Q&vBZyh-a_0B -zLxa}zceBY%MiE4rVA<0^1He=6E7*vK=HRZ%HnmDnd8Xp$F<%Uu4c>0CeU6{qDG!Ty -zO}@e5eeGrY$rkzEWg8?w(wDLc#&Qf;c|Tq-QwAo&8sfSoc)GdpX8cI582?K`=jo -z$6lO!fzJ(hZ!$%8)6Uvb^HeCsWoKHkEjd^0?TFiQOMqafhb0LOH#mkRfrqRB?XeGW -zc4Z|lOLXAMMiia{WTHMQtAD_Kztxa_a}W7K4r2PeA^npv!FcoaZM?*7u7EP2?i$(q -z4WqpSAr6*F%+Cr(fsJ+RX+>YtMRLv-o_g|d=}*1dEHCZ*+J6TJfaT$kuQ`VB=X*^Q -zuuh5}owlp|WAlJ1WN#b2a(UCS@+A%2PBJKHN^a%zAPFB={ODS!dz}TeK?q-Y9ih_} -zUYG`8vtNBw49Ozt*d;f|si;NBaoXX3hsj||X$@Mrn|kADLvBv(%{p3YxZ_KXzA=$! -z)=1NYMiPWw41_E^_grjLz~tq`2d=-kC4uRXz7hZHg;2XvhA}pl#P4=7lRPaCZYQmb -zQlQMAF=2A=$;n1z1c#}K;dCA(K`S0Dn3yK>YJGIoje9zPd-i&@c|^nb*`dtk1&39! -zpHC)@)OpeDk!+>R(JaVB8&6_xS8g7_A$BrBH~otmgPW99A|}P{s!z?F -zyDf`rWT5oUt=(~F;YeB=-uWItFQXy7qdiKWoTs)+-fX1fo|P{KRW+B%DgAnZOrw*^ -zk~J{k9ciJouNpoi?~9mI`X{ttlbQRp-Ubz}HvakF(yiIP=go;V-gAi!D}Bc9d=dPh -z#MP@%M$9wEv1teHTyNpxf1ee<4u+DvmSOtbPXA>KTwSOuL{lS4-RY5RLwde$Y|)kn -zD3M)G8{gGvw>kt6ss7yLFTFcA_{Z(e7ri5oZVAQFMN)t&c;0cC#6?kYzXy8m#;Rr} -zV5Quf(`oQ;&0}SOkeO|P`)6-xl%u%}X71|!So6mtlthw}wG@EEvSYFnVJY|GxRbBL -z7=ReCM27(m55u0E%%ua-hHL~fl3|o?Z;0OCP%NYexO{1_LXBgPF7=fa9sQk8a#MwYjlF{-kEC|LZ!)68`N$M3+01wZP2#|0>TipUCV)nsH(6E%pF$rqb$h8?20zo1@D=4VaPEHtg(xE -zL7eTOjnWAId#~Ectr7|2DGPD)=8!2e3OcUq+?=&xBJSh)*`I;5Ie)>IIDMT}Mo(_! -z{(;na*9%X|zp-nE9A#X>VqV|_uGnIYzx4FBl!4WKmx(7J -z5K8@+Q5a(SUN4*DTU%WA!q!WYqr@@6tOepUXKTxm{qNg3WBOOT>q`}TJEq>}#&-0- -zUC3b#HY1`~S}<0V9r^Z-gLqbK0EEqx7rI{Tm*Aj^$G)Q0QeDD|lt6q(W4~D<4Nmg6Kz}Dhm8}Ae91x}#sNZE5m~sdJ{Qe8*qmL -zVozP)qTV{=N}x!S{A8M#sTSqjlL(nSPJW|kN{KCnY&&p42$z6F{Qew@sPX0+zx)*| -z$Z&m97(e`ggDm^0tWPH4WfcAo8J?;WqipBhRX;FDE5WH|2W$P@TkX$NN#6Qc01fi= -zjb#s?6SSMY;adQ9VEOyC&^qtD%z-!Lh}pLJLXLmvUlqVc=fyMGyGR_9BC5@`%~FqVZ8Hy$4X=u)1b5( -zg~~}clh`tLGEGY?a|pkb`-rr((;IRmET`R1Hcqj0@D)pX>yK0I_=On3F7pUM{2tSKO3VmNU+wCyL`?#}Fqx=9^RVlPiA -z(e@47{9RbEX*9eM~_YD#p+#JWs -zKijh?@T)z!y4U%{NA-`F8>yNfYDUsGu0P&B;! -zYNYP?j*??1;OpCu)NruO>jbPg2^pk@JI{b->L_YcC{LaA&ZW%zjor2JVu%k9Wx>gj -ze1gMdMWI~QsJC}i&DIGI5`ImVcQYcfUw_kILd&bS&BKwM?6h;aawJ>Rr*N;cpYrh1 -zi{C_mlp^&L@Ei>~Rwt!0mI0YOz5O(TiyZuvpp9%9GBA85hDQN(>8*=UQxyP6CJHby -zCY5fb%OaL^0sTVho^RzdM$4)QFox``h(6$BWn?R*KtD<1=FusO<#|zU_*76)#TThL -zPq!L^I{%XbL@O3Tl5l&FJ9**r$x{_>h}f6rmnNq?;r0XHE3|j+4(rf;ykGz>He^{`8w0cL@pYZ-<66(Yx>vwR -zm)8}WvKPukcF{24xjZA)pZ0a+^V3(t7fy;;;#7HXfcRLf`k`K;?_>zYNug7yfn8^v1F4#{00eoF+o% -z(5h{_UJPcoJe|l~vvZD%233p?Wr&$-g%;%5+<<#p52RRy@msDnD;5sS%!g&8s*aYUnl3{aO_3F)$$>a=x2RoFuFK*G{>>%CLEN^1|hTjT|Ciy -z+KzvAz&`BuXyCuk{~MWyy&YuH4qr4V1tKtVl9({GSn&A1k4rGpXUZ?3zFv=Ctb@Pv -zT2z+l*ORf6>rDYt#DXr{2;c)POd*%w_=*j6P?D3Q9t2P)4fUdOa^xz(q4+M&;i4qy -z`BEl0|2uqF49`nc0Hzo7R)%5PyES3c<~3)PEk)eOOK{=r92I_J_VOvE{Fh -z5cFs7-_5Nkvscdlp0Y;NH8X!ieAhw9Xg9}dC-Cr9y)?Ect!t#b{_|xJFQ^~okM4CG -z65XMG8LsnAkP{77np1`$0&swT_~}dR2GU!wO5qye`mDXcss;UEsWemFJ2%1a3x+Q` -zP`qw-()h#>hAJ@Ub9_M=ef#e+NHuBF@Vq~Iv;aoZU&tjz^j}8h$@kB&on!DN -zwbH-kzTokJc+%*qpLru+-x-YJ!4zC4u!V^FtAp~BQW0l-;|IUEvoEtRK|$} -zn6XIUK%z4C{twu;re0rF#znBa@I8Hz^wu$n=GJ@Cp5kOvF{+zL5!$L~J?elk%p9zI -zy`KCG8>Vj${Tb%R@lE<`uadAOflMaG3+@xh_eRKu9cIf2vt~S53S2KUAYWeTNdsw@ -zfF@x|z^P%A@A82Xd9$o*#AgTW)hE79dtV)AYFYPutKEP7qyKu@&GS5n>thj+QY{-A -z3K{G;YrEMwxryCmvj@?QPwS?`qe}SE#urf__LC%xHyGWB)nXpzJ=rcrZsTsT`h?tP -zYm?mFm`P>+s{*-AwFc=(8>i4C9(a0`TMC_aR9hy`cprZClYu7^Q|!`0=ZkRKPrmiX -z&oSn>f0@mnrIRbo7H^xwq~m%*sUpm^vH57t{W&_#2R>!Dsh2MbDwjW?@n@N*f&H92Fl%4D;5B;i}XdaNCUiHun$)y38QsmQKj^op0fXljuy)v>Tn> -ztJBjQ;%sSLgfCaE`c3!vV4ANZPx_vyf0xMYR|_Zg^(Y9|mHXq)mvutr<4VhAJFkF1 -zY;{TOqy%gCpL3e%s?J;$!0=*>q^K~-Bv_bMbO25)V5x@-82q#_$*F>@IlR+nDa^<7 -z<8944)0tp-XS;1C5 -zkEGCB2Cq3YPQ3Hjd7>$MeE?`k`lyL;m;>$T{?6>7)5lMirY9#E>(hCDir>;2`}foJPjea}8U)h^UFJvc&-e4hXEX5hO)~5IUm3Aks=GE$6p1?EL-t38 -zZ3{-Tx`EHXJQ`rK6#zP)_qY%j{z9HDd0N+>3=rCGJVY}`-T?xeagh3qf%>CZtAsfj -zQ+eT}IlF4K0*&x1ib|{!SGT_LV-}SmN3ud$v$@=gM4JdwS?w3augw$6AJ#yeb7L8e -z28hpd0@|tXdALi#2@g)l{dF3G>(obza7;x!V5T^-`X_*HyfXP&`B%s};7_H)W!`S{ -zeDm|^&&{YxBI~cYmx8)rXPt09Ky#MrHjJ6@nAzI(nA_N8N(t#u0PVCWF~nhs)U(jV -zImxi2WwKtzTD(b|6WX!#-p*!0klung8&;Jax&|kt=%f#TVJ|sCj4IPf*2UM0hg!iB -z{k7UOeui)x99P=s4^lFS5WkEarA`{v*AE9a(LAXU#@zS&z>t0Q7~#+yD@Z13Y*|@X -z4SrGmu(s0W=x;GwP@NT|P3bp1eJSU+dzjOu7XDmOs0-y_iXTb272)=QB+{lfo~T4T -zYg1*2Tx`ACq3vqbU?u1i|A^tSMg>N4DCj)CuB7pa>!{?7SKghijE}R4MiQNN_Qin< -zc#DXU-faEU5*+L~?0EkhXUp$4ZVl|=obR1HNt6|wyS8_FrjlSJ)_$;&?nASha5DG1 -zRnPn*l#?2|Dowma*1sG>-L8FNqs4xFfZj^!%lZnC11LmSq8uEERIw9y7CPOhv5-tbHj2+YG(?PT9l$v0zi#rbF(-O=$3 -zQ8v1V)FvxS>(;Rkxp?C5i$3?+ -zgs(trb@OeO2VWnXB~qY=>zghU^=#5cD1E=VfMNAHlKx(E_4Y9#X-osnQB_l14iv%7 -zkU(t@S1gpYBaTcag=2XpLo6b!O@R=z$00X4@#bKR$Ok(&OYm#|Rt^V+Axk8ay-eTFMrM?m|AX}qy|xSAg!CePu?UiG8yLtCeB -zVa{kJJsaXYJX^zZMaf#ptSh=PMci^dmKGdK6cL%7|BB4GXT?FrH1Rw<=2wZ*F<;&% -zHDrJb39&h1PfnV^joveTCVe0LW12+V5kRa=++}BkH~kL;oa`Xs6NnDeJiYFxHU+_Z -zMwTLkUgv!gIOVVokOOK{QRw1`rJ1+ -z9c-h?kDjv_E+Yq(Hh2Ik4oW9#Z?mcOUWd~m)75tAof9to;xG=34t_2XRxTX@H5r-6 -zVLG`}3#CM4M^$nF$blrJ7uGvTU?Xs@j@(8+YlT>_guoPlLH{tS7BiV0DFZ+O!Hz_W -ze~><5LG`v5No&D)g)Pe=LwWpIS2*5c%%fe;i#=gsy}Q86dQ9 -zV9ll`gc!w2LIC%{(;9h&l^#nc-FmZ?-AZzs*Mi={DubPqSnOCQP%|F&avghb^f|oy -zlnOtxlVWJ=^oG2)pz%C!M>_zx#QCKjjguzw9%^WrnN(Oah^p}wn@bg1CXw-*{QLqj -z0RL!?a{V9DH9`gB8}w@6tm<#Hc#=|@2N!vpG!C>W5fc0wy*2%ILa~HA>=oM>pO_{+ -z>YHM7B_`@RCyHW@Sx!&oUoSV3c;)I1|@#ypxN881Z@PV`O<0$rRSH30mC -z%gz-hIwYl6^6;2{9IyRrlUOT$`yfL`doNg_bk^bqYIb^B#;DbD!xKL -z#JORF=gYml4p|wEX*asPe&v4F!^ -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 -zN85I|;?GFc*}}{H2CcRW31AJ3?ye{OB;esBcC -ziTnfVDMVBE@5H$k62u!pD1DAWZncqMIB!!)mwt%{61CO)fkh*V#!S3wYBGiDU%;KJ -z%O{d!e~{18dOIg%$0|nr#DksjI)UyNprv1^MEb0`KB7Uihv;e_k6dVi8srIJx>l7~ -z$vCKx3jkJc0tn|>F0$UPxSR;39P5y(h`Zb-P4_A?u6KQ(Pz8^0+fsqM1JM`>5f03r -zU?-h%C#5W&4^fgitiGbgdzul7@!^4&{jN)^FSFMvN#Sty{F|I}V(lKs-9gD$5$?22 -zFi1TkbonZRtck{Fcz5fs^EsivM$>Q>WoH|A?-xzE8kb68I?D;K-Pw4rLHF1sOCmj< -zjS!Q;OVxn8=W%{BX~nbGUB>=8M`w{gz|%$4sSIYtGOsP-p3VizG)>qVyQAO9Bv1s% -z_50LW|1&x-yrg?ItwFNC9nC$o-rprxu0-1yS9d~rayfzKfo=Kv7qLdQ8L;^LoBDQr -z#m>X>?sRZRB9B%Qkjp}Ja0<_ZbF*o-KQ-b^^6Qvo9NNP|d5KNdO^^Y0v@&V&RWDh3 -z_}r_^ejHZ^i`H1tBVlTOgH_&D_$JvF}RJ+YmX)A;g@V -zzq?6&=|t3fGvo(vuVcm=L$~0BSc1e-tl?`sgS{9`=Ha< -zSPk{n$NAE9*q;g(EaC7M>fh=Y1?!#F@qCZFM`K}9o}h`X@cl3+iHZR2_d^t%@CEKl -z#?G|Jk8jeN>}lYH$;dk1jV*)fDEJ~>)XfmzRX~t3B5Q;XZO3y*X-uh?f1#NargK{B`;a`K>w@JhvXN0mf!t -zgW|(MzPq1&e{a4C3f68VhmDJ@WMH>c#V{ImEojh#_xKTcvNHc;d25Or@b-6>J4 -zX%|7KfT0=7{2!3|U*p8?paH?Mito`V@a$+-1iKqt+UL~K3imD@xkPXxbu^p!?69EV -zt&p}vXSQE?j3=I!2!1>47Bsrb7)jqf-k|Vr{*poE2pAmhbtwSz9X*8H(((CX0ors} -z7tFa5p5e#$2nT8sh66KevQ5%QkUo2I=<&E`M6uaIbhLrDD(Y}fZHkt*9_VFuzNq~B -z+hpheP^|KA`>RSQr+J#G9A0@{AOo -z2h-7{ZyB!h-d-hDJ7fBg*@YBmqqRIS!h(3bg@-kBSrkW!&}DxEeUC~_c=+8}H1Z60 -z(saO%iiqE)U`dybcvwYL{I8$PXnF=&_OAyS#r9Kytj@w^CT!NcoJf?K5SX0s8yT -zDce|{bt;lJE$5#rPg_nJRv9IV=MANrXLtvv7ul4H!fkp@rBw6v7{mk -zKUqiByV|LFUax^sm)gox6nl-xtQ6w7?rsQmug;m5iwNVwi=dn*=)Fl@e)}>)I1hSn -zHT2%N%fPv4u4rjOF?GiuL>cj}dLu6;ucqSAsY)LBrH34w-bwiee@>gg{w29zhO5P_ -zuZj;FMdKqvZ_KfK0?Wd!dKjFrP(*{G-itVSyz=k9yV<;jpzfv2o6F}~9wyWRB=wJd -zYI{TYkc$=`nLtkib(7eh>5X1ON8gC+4<3nOR#lX&XFMew7MKZ)jaVE5+9s0-`#*m` -zDsPh_b_}39X?SxgVhzt8HO#cI`9Xd-rtIM~(*|VX3XB!P1^f>BRkOD4ubQDmAL4)1 -z-Cn`YlF7V4YeYs+6Yv(`+2j7Yj)5YjIu!3k=a*U -zhk=v#e6Ko)j}PNdFTo0N8&x4Eo3zkQ;a;L&sfE<B36qj%|5 -ze&P{N5kBi@Dsaw$Rpl4tp;!0jl~+5>A%- -z?B_j@!+jFYq*lVIZu`){o9M=>#5%}#F+BJh(}E0U=ogMFDS(IS5hH+!7u__+1L9C1 -zx@$k0g&{qgVYkecHU4F2EoK*60S-uH9V=TosnJ)4Qjiku=*f5|xgUp*I9^i?6y5kj -z|1>GXtPQ>^HV=62nzt$xJP=>|l<>JlcL)>zaOmUU2C@4~dNhyqe$g^X6NtKoz~Z$3t1q015g=9Ic6~=8xTe*ID -zheq2lcq(wd9*H0lDMmwsLQh8668y+;h$pIcCyEVLI$LvHc2xH>nKwq`@Y5aD-@gae -zJIO`ZM~i{skud+@SG@#0nESmj4zw4Jit(~d7g+HS5lY_5E_Q_zq8p=8C9ZH`k-`3L&<&T+}##U%$gFZ3+K;wyO`d!OhQ_%Lq2g553Ii#ck`W6{cQ(?)?JU{b&l -z2&iBXDG8(rf1=Rk_`L-q%}+8u^o#ec0jZ|nQlbd>(65`ww}37v6FkVx%7*5m^LcMz -zk_j%+5Z<*>x+cnAdW>lE5B-KC(oTl`V39OCQlH#r0rivhD5wS?yIk1p{!S#Y`I^%z -zET84Ts2ka8t9>e9oz$7lg#_jTJmg7II4G8^qz^`y)uio@EZYov=P?w(?oA<@a3p^|g2 -z0mRG!eX&4V#EkBaH;g5!>DJ`g2f9Q(uzZ(bx)#~Y_hu`}oLgGhkbh -zG>7F&;W;)|hPRZgzG6&_IR$#;uX*&&(BH9Z>j&K>Vsh#>VdMl^n%BYGuh~m}tfiMf -z#_9k1dYc~eXZu>om0m4Q0582pLpmgy*4VTTf>2srAHBUN)uk>fin0p9WWDTAu$j4gRA3H;e>f -z$}3`pjiUM@!T;##jU?N^vtCW(p6te?DCGAYk2iaftgOdNIO0{6_CsUiMG>RoYZd?H -z+Y6{Z0(|Tv+F{Iyf4lGSAAa57Kiqgnu6520FBUQYPs?NEl%VA0uO|j{y|Ewv{h&f0 -zR*6igq!FL(&eIdYoF7kr*)AEC$a0Y(6=V4DIXXhZwPL=f*elKOny>6NsG)Ynv70B= -zfQAoQSD4oQBeKrTZb*hmm=-~OAb5^4{Dd%-3^o9rd{+q=<&oi^6<8Qd)c=on23RmxHJ} -z+a^Wd%4T6J84dWe4>inHHI5<$KSnqw8szao9QHW>=Yc5*0Qa9Uqq%;49!J3qxY8Lo -z>1(tO -z1l5MeajS@H8~I>MkjD-_V)I_}vd#{Bv0+h2&TQ9&HyzPu+M8qq#w;m?H+@nI*LiM5 -zGvdtF0AdHS*~aW7MGV>Mz7;BrDIWDeiJ0|TdZ`);4eMI%IaiXleXJZJ2r96=KOpji -zGh*0mEBNemEoGu7e9d6}4iMsrxbuH!k$)j8)y`|CBX&VSzNQiBBEfPNtcl&@vQ}2M -zgS56Z842^i-?Wl2nc^8Z?)m2+&gS^T?tQOl%;}B4XmBInx@_;5`n6|<^$Ot{kH}V9 -zf9>LE-ILZ(74(JL9ST&kOl%vYux5;NTorLTismC|b;;ehKFNu`&h;E3tNSq=DK=@&mM7iZHRL3bg$Srhh%#Ny03ZS())PmOo!k3LJ`k^B7N9>dX+<)R$ -zeReFDxw}yvlkUZM-BR#S3(ALdKFMshRP>~%-COM&qppeC^bYpddBsX3R9(*hqFkWh -z_A$rK0LUk_WRRbEfGa!fs|+5@qPU39`^ZL&uFy5^k%NG_%+p#EXnM>PXPg4a=f*re -z=hJM(FB>DDO7iZdKI#D@y+zSjENSOOxA&8IMm9dME^z|O{IKqV2M48|;8s69wACEs -z-YNdkS8%N2m64z(R$K}-I8IowqR#Vkg#nN|?QY_7Jr<2*p+%Tid0#gHzA{3al$t3{ -zxbUzbvTm-9quaphBOo5s0#hagE&YU5k(Aw0FQBP@8Q@|qWOp&a7xGn7!A|#G`2NUW -z4T2Jg4HmH6l=L@oH|2sETd}qLpBG@hMy&Zgz*UYA$#btT#~n1?F*O;k#F{2V=%Y^J -zLCM6Yr2u72T1Mr!`pKDlp7>?id$^lW2@U$%urD2}5J<_n)&^!A{B~^US8c&z|M|W{ -z9y4q{tb)#UQ^G=oMkn(;e#U*G&`Q5O`=6T5-OrvaV}4{Snk`h6q!;td^WbGdGDI*T -z{cP;%+yS{SxtCQ1Nt<3PjJ -zc?Kdu$Aefn1zZ8Z%I4_ZY*;K`zsWntt -z{#V=>@+GdBY;LI%9&O$`ZSudfRIl4D9l=CrU^l->6h_$Ikt>bQ{(oiw0 -zd+1f6VbiMW{!Ae%`8WS&(eI(XZ-tShU4*aJemy!0QVZbzY%$s2cx>`KCWy#sP0928 -z4TLk2uEV2nUW$fEZ-&mLjYxx}yA+G6*=OYPi88xExK0qt4Rn`Fh&f%~zQcn5sA58{q4L{>vu+Ruz3J3mX= -zH3>2F^(nc}!*BY{D7uNz_@;m!fhe?+4u2{~^rVFFskEz|r%4wzRan -z0>wx$?Di|k<*DUJY@T2B1C}g0n0t&h+;Sy)bZz3oUqo;sD}beDyU!(y*u(YR$>J*X -zoDt!UBPW0lZQ>m@3kq3XeCq~b?838L`YjUtCWUTpAi%HG`b?;Q<^z(9aQ$m=|8#Q* -z1}5{AK=4Lx@~15gibB#$Zp8!TJChjtOyO3izlfa_G3YAZ+4W&00^3TLM(S{?e8vAUO=X^C -z{cXPSB#CJ_1>*MSapebKI@&m3jBK-ZKnerLc#j?Q_b~MgT3HRUbI51gyB%TTY1zDy -zP24XzS_qF4P(!x4d{Dd(k3#((MZ<+JL#}I*PAIYB^o-33&>kgXWCnmwx$_It^DIHa -z-$Y5z^t?kE%)i;ui{RTR`cHM~qga7DKdO3H80`P3*JqjXkHs{aU*og6wD_Q?52d** -zue$+i%%BEn((IkI!aouEEWS1w-88oY*st+?vs#?~`@%mOE=G4XHCqeDxKDTDp;_w%=R=j^F~`D(aKq};%eROQ4Q=m&Jy8=kaH*Y|ZFlfjO1tnZ*tq*7?6mQZ(onCIpl5 -zyeqqFolBlWfq*O)a#NjqqkU`I9M6Y?%7>sMmj%z?vA>z@V%?aodPvAsq{LEC1SLm{gUCoXL4WEU_&0@I_aQ>2PkQ -zK`-;Pejy)`Nhk1~KVN+|hZRU-Z}Hj1-!E(E{M(LF3H=vbM1WAd*iNCK&|;w7O(|%~ -zzJyDb5|sjc3ShqDu|2FJT`>FQQ#4puySnv- -zIp_5<|F$zVRp)<9tuMUFVxMHD(1PEii-iu>x0gY{m4B&-5RhG!2Nt@ZqM2ns4r_&B -zsRWI>4>OK|)0WB|-5mGV|FD++a2NX2cuR2(Q6Dj0-r)!i?QtRZj{t;&I^lqXKLuLi -zofk+C9wVnpaUWS85ta62U~hF!P<~ICnGJ0`tDL~Wn!fp1Vjq?taY<&hkh%L2yL|6i -z{)c2deV;R>Cc{ro^7()c##;OXsY@h$bhw9*lxKOVE-l*=MxT?C9+01sjKdvbui%57 -zUjOM}KseB9*G<=Dbl7@0@!qSYpw`-gp#*5(^2US!qqN4v*}6q{B2ix8Ibm|fufzg6%?Z;UdPGsl957?(EE~0Ti62^hR{*13 -zXb>m-)%2jd(a9 -z%Z%0*Z-i#h`mZAMMDxOnZY=i-(S)w;Ab{RAD{$Rua#41J0; -z*|=Rutkmm@_C@!&M_P`=(?>0Nm>&5Y@$`%8 -zTBqI2ec+U!tc?6Hwym-8!Cp7eJbJNVW5dQmK^6;elAuRPi+foOXoY2##&0qL&N -zYi0{G`Ihul-%-D}(kGOcF{3<7P!D_2d;YoaEMY=*1?5WPpy#q_x=)*ln_WeS9e;;T -z>NGGXw19wH#v6S -zC;ncglNCW&Dy%SfDu=wutRUIJ!*giMT8r;Q0_iP$#^ZoAAovsUskSsFFf{A5$%`5a -zPGcgfjB>SaQ`Jfx%Ej$3Fh*~vB=nOI5Wyf6cmgqpq{Np(L@*twL`SxCNx;gPeKzAi -zX{~u}#eeZ9$#f@cu`-_ -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 -zU0*h=MJu^TBh1$6~;ga -zmBS>@RH3Mi$&S#<5tTR9=Ce!u`cLU``jW2VJ6#}@&^=HPWl3m<4kNJO(A26?jvP^R -zL!@F^u~F>V-5c6R@c3~UWiAKnQ90dW=TwwFFa+M#UP0KpJl{YZYp|gphAO9vo%&y@ -z?z}^I5I`vAy)AILm4VbZ|E5M_30JDIm1T?A-LsADHlXtg;`;&|3{wRR3ce4bAS;`a -z*w?V=8sV8+JP2)v7NpEb@x^64s`hsqFon%$EU*VAq~jZ1;NG2FC_)^%raxd-A#*z- -z&`CwKA#NPIND%M~+4b(USPS@TMDnVKm?(3cN6Z=VEApn|g!~0>FcoY~{l3%e=zahq -z11T=C4vXGEMYhBJR -z$`XP4=e;b3w%j -zs{YTbd6`$DEWo#6{hvbrzQ+CJ|LfqBJg(f|5JNP1EVfXB4GdAfQUB4g;GuOmVU;X0 -z%AsAnX8-BeNh`E$0?avLCnd_QhnD}b7bHqv+0NGteG)u+pMR^0c0|RJ2M;t864R95 -ziTIWEcd|1^8O3(@=9~67VlN3eQO%}@3U-7LdcgJ8$LCqV#05+o9=E=ZkNs2+@!y)2 -zx0*@muv8*VyBf??OvHB0F%B`m!ZhqS`sDDkDwMHqp10djep~ui6rbnoWsgdw1+0vI -zRIXLoplT&^b%g{*A_`O@N_3ec8(fmr%ZevmR?M)O7$vt_xY3u>Da_62@=^c(@|8%q6x={*$m3tf4cTx4_v#Vd+T1TLK#E&aa#C)C>0xp$2w= -z<#>27kTfos8)o;1E(dzJt{wU2s2Kpxk|lCFU$?h?J?JoRO~E7>d0f(Y4NuiRVwVzN -zLa|6HoSuFKdNiQFp|IFXcOI5qJ!x)3MFGMf-XW&FRwOiAbSm21B-tAm>c*MhWviOA -zNE@_98nH(se1H)A)y~4tBjO-ve+G~uY~hDE^0Jl99)PG%PQ6SmMa>(@?cy^u4{c$q -z3s@>_k&6$AI4`jihbcSMMC`Q!Ew1eBthGUVPnU-E!3880Yp=H2_oL^?z-Jc_5a1c+ -zcVHUw{Rcz|%9=U^p^(flDmd#IZ1UH~hDAcds7g0IHz`BB?oDrcP(4P!F(NUnRqkPB -zrx9DOQ#C%TJtaoys(d? -zbD;66+N)KZ_N1&1;{xvH-aB_Y@;m63`KBXfPX3bJ0<*he$C(FHDdukVE}wC -zbzxb8^lNidP*Kwk>6f@caUhwK#(+c-WO5`$lC{RupTp6IX2_{&PHJxq%QBU@OD{q) -zQfFQJhcH#Pf0Neo^z^o0`nGZQx!y+qGuDPvM(ywNarPwF<{65yjuv2Fvf?LB3>3%( -z#$yBV$%3ButX$aF9%(NDvMkE#-MAV914RoC{ILYIp-CF+TF8e2)iBE+^1YA?OFcEt -zJ-;uJNK9r!O+6)B?CUADqtSR%DA*Ms5@^#9Bj;yR0_59VSB3*GYEfE-Q<8@p-K#3r -z1-8uKZojyUnMz^nlg)#4qBg|L^lBmy>px-@#QM^JnG=1F)KsTFkp&u0-Od$b;Fh#P$ -zDl8Ra_b%#a%uN}wz}_*V^ijx$mbGK_z=&Ln%BmTNyj;o?FF#M|OGJ*9W1m+7d=pv| -zh&Sm^1IOCf;6oIfD*$3=uvr8w*_ZhpmN4j}mcriL9d($Qi`HF?8I$0-PexBZ+JqY3cFvwFjKasj{lJ5qIC17ERd>HU%X_>^Bconyk@DF -z2+$i8!iL!TG>A;0(=J~Ep3)#^K10!-)z4?y}feTvJ^V-yLI@DEiMcU8G3`|hT -z60OqcKi~C$*}7Y_sh(Dxh%N1fL!Xqy6B;lCgcvsqyRss0YhprxFJx9)=oXq?bv=QC -zXt;;Jt_A*f_j%vk2cc3QMqS7SjrAhKBkqw`R*x=@-E+<|{Q7q8p<}otor3^{&R$Q) -z-yLvrrK^b>MYJp)S4EoC=+SM^YO!@rTK{LGp557aSj$tq`x|d~?3JW9a|5Y^w_I05 -z1P=DDc>S#TsSHUP{#ZCDk4r&|?~4Msgk(~_I)jf#K6<3Ftx>r9z>8~T9{Y~zDDfsT=dDS6$rQ-50^c}+nN6AEghtrP=!#jv^n00MJk -zfWu!{leY}3#Ze!=LA-CWuvG~3a$;E)rmTRynr|?vk7hog^?`x58hLQ6m2|LDLWnbX -za;)q_rE>CIXQ!W2>-l3VYue`8@B8<}%8_l0YOfc3avrm@O>;!s9O~=cB$K+4B5Vsr -z>qmp7v_7cHsJ$-7re%q|V3U$WFZ}T7)2Fwgaq*!bQ@petQ`|A9fK|UgW8MkL-)0}P -zANx;S#SipYqdu^geW_S=GwK77caHTElZ)l|=1AKQUomA(QC6Gzic(o?eVPP2WA!Xw -z8kc`RRW{1B#GuG#+1og7bFBC?|NG`rjYIFm<$J>51)6wQJz}jGGflM0@=pI^l8Kj1(-f7RrVCRY2>lb0luo|8 -zGiK|3=VgY?8^aFi#a#hkuAeu&{R382-wg>`` -zM$bb>cV>r2magJ5bpnl5!u&wq%TRQGDZAbx(O)$~Z_k^`SAVpR)lN;Exc=IMl05zW -zc97xOf~htHH)hsV8IN5H*v2czp9_5Q6&BVgeATj?m+Js`Y9;-*7R -z_r#PtF-N_{CNY#H@lf+ONu{+hYwG0q@4bgR`0ug%Xj@TM?J;hJ?DC(%f%|(BUiuyr -zrQ_{?5wyP79qv#2PgcqSRYCFiyr`@e8r~#=(%>mmBpDXyT5rsnrHd>W?n{RP2IuyC -zE+`wh8hnQ`Jm9m4z9zlK9jBQBqI|(Wdq^#*czUl<_OFCN)5QLlf%+uuEdwfX35ThK -z_3jKXGZtkmhz%RG|8Y+1DTfZDA-HgYD60TJfWSDA4)(HlogAU@79ctQrzJzifbxpO -zdx)eHmZ{~ybq*+lz)*60V&j?Isd|3|^udn^B8jh9+%@p*!V-9E;vUAP3emJ6EsPuN -z4cPK|d;?**L%y^e$Kcrwx@GC|Td%4A(+D!Zhb$WM)eB0{ra=n-Ser+z{U#5DXc-WdtO -zV~y##@Aq91weT#R-5Ifk9}sn1cCxWw>*{aUdd9AAapw?6-N!{R=(O|VmD!x?*6DTjIumrMeSQpWEV$^Z9�dhb{_EtA7S$h-f4FC+$7U@vL6AiWpnK^z4xXnWwNx -zhZoIZCa*TiQN&8gP({U9$qifmue!P53HwZA$$efG$Zw9qh*7n-oKt2{(NY#f!`Y3( -zIb*vNgpIN}zSaE2^j!=*D)mx18}#BjHX_~$dJlL`IOM4n?E0RbtR0-aM5cDm+{9Gu -z!HS4~X&HMLawQ7Rgh?~xk>!71-Izqiw0=hANS|bw_n(h5Iv`{LI0@8!#2U7qT6=#5 -zL(U)eDwoPJI#MpjPhq8#>n-mieALa_s(6P+rK&nts;*H#quI+fj6J;15lo9@;S)(- -z=W$TV+<9i-w7pjoSSg}axXB+lwfKdACUa@O_O_Vzwm6Cy!FXG{*vK_ReG+b6yVk(l -zp(LKsGz;b$aq<#s2-s@*3QMBOkNcDU7c2_5*5e35uKi=FmrV^)_7`h^?zqwZ{S?_F9EZL%n>Q|y?1*W6tXYKbAT -zBDQ;a-XWlJe7ut~l4aOYv09iAjev6TiT3=qdAS*()^@&2VD?I0F}Du~S)obWeI=bK -z{X!$ZH}oX}51Ay{2t6!SLLMkpgwVLeb(%-Ofmn0HJ+1;xp+gFu0RnBi)lVRl&s-?h -z#T}tLC9h!?gwHxiGX5m7u9G6jM17}r2N77azh4LWS~ehv1i_}P(2165nVc7Vu%K#I -zi(pu^(*y%axpEqNpSKPG^lrnGo99U^+jD@*UCDS&N6lo=q4g0da026KNdYpc+%$&LoBtBB(QB?$V#O1)Zyr-S#|B!#+I -zkWX1~@Zx7O7ZRe$LBcdYyYt=L&QH|OhH;dhS^%&!F{CT$hNbzsY$yST4PGe~IPptw -z*XJbx8Uf+E99;Lwcaglw+YLro7D)MqI)|<^qaa8ykq|!!W+ZRIGkfAH75|!v$h&1( -z|EDdqCj@&Ybs8@x&e;ofhjVR%|*h&?K&LMEY) -zKhg-+R;>CtQ!Rk|=$uaLY%t5{b?F`nS#81q$+h6kBoH}RO{c_`qNpX(nTZnI~Gt}+k{VZidAc>#~Qa1 -zB%m&;d<$gGHhZy4+=xv{1c7AFg{CUcgYnH`!{?h7r1xPUjaBN6rl-ReUozpfPsB`v -z4mqsS|M+kTd(yU|zv-gA5vMxKEsIbYB1tuhOmPi2rkd)%c( -zJ0CyiMk^3gZJrdpK7$WxK{M6+iz8ys;TSPo=PNSGt(}P{Lv(aJ&r-Nh&*HRr{059f -z5YUvS>D7HkG=g9s!bq{f5^XNzbjJ?0kx(jytXpHr?-LtNb?R^4rSRewmeVs<;DEi`Ta^7NI`~97_nJ?6SGRF!WKPc=Kn$qq1jdr%Sk(9!u+xsw&7Fi3Msa@6XJBny -z0KY8y6O*_R!Fm8Y^gJM&xX%6f0zlDW$jd>(A%J8EjjwNA37YDL5+T>)#?P_`? -zt_*#nnnk}FAtRajRBPpxuSlE+m!y7DX>-pb3Xy2@9Pm&)WM -zqv-gYvf5{Twn8$Nde1g3zhtbdd3?TePI59WVa2oQE{tg=Ru&W{h&T48+1Kfn*cTuH -zlQP#sr`NumynYHPL>z2||C1T`9Q2!>gNNU1wocrky+4tBi=B&2_lvHExqYX6*cu?& -zY?oOf{sM6;%kO>%>Z3*mhcPY(-E2CA4W|PEJa)0)=S*66ih2i5f6{Zkp6;Lmi5g~X -zBd!asICy*?wgz+ITVZUe&3j_C+|^t|Duq6ZCWKoBO3oRP41vsFf{B)Vt;()EU6i2L -z9;AFTUiM<22gE=J*CiO}VsXd~-8-|q4DtSNKuK>U(Gt`ln*q&YGg1ZVD&-emb{Vtt -z|GoqQO`OIVl-iNgK6i6bF66W{^7WQ!l8xCrXfkphFZTf;M@+HRZ6Zw}>Nz(G=f_^J -zrfBj{9BcX-i{PosJ6W$$Z2FX)S`RocYp3cY@{nB_l7u&Al7TOqJ_S`f4}C{gKpGAs -z?Y=HPxj^=U94}2Ely3bLmlqLVYJG0a{i!by=55X5J&`Q}m4~ig7S>QZKIvxP5V+-m -znc~3iPC^}K-V}vQWi*!%p!Rw(4U{8hS&CJ!8mjH3;4Wyxruy9JK(o_4uTLwN0NZ-Dp%2k -zR_bfW7C5LenYvzc1m;sgfBrz!3}Maebcw#X{@*#k0Ps`}2ld(>meD -z_FRTh={C?BRC5P$nKz(E#v!9|4C>g|_0NQ58_~3O%rSJBSn=tfED3b#e)7oZCvX1)9cDcmlwMLlIOEq3N=1E((q? -zToL{mpc`HhSCD-=Q0##LY(-zNHmH>~Emcv=utq9u>8~ykx>UsqCZ+L?4-@<{ -zr|%uwc6cbV>%zTSUj;$e#|~uhbKPgvpxb-2cqB9{%r21$1b*Sw8N5W@*!y+`N+qLw -zvem)4I6s3btPhc`m358+tSXUw5&P~1aktZM2#gKaI$5PF!7!l!PV -zW7mnge|BxXH+3I_ZE7bFktS4pSX(mK%G^!5m-Iicoo&>v6)XG3=UM4lN4c2w{)7{X -ziedQtrO-smep@)Dy5vxNs5uvE>cMF7NqT8za9OLr`8rz2|9Ob3!taShN6aVF&RC#3 -zUnj=-{vg8hW(q|lV`eC#fa{z*X&k*Zorv>DZE}Axz}}Fq32$SsP -z-LR}bIK-OyYxj(<9R80w%ys+piU$?)n)FL6B)7$2C|WiTrT?$k -zJsn4Z5yx+%a3dqtc~X#~X@-JCtAcUs12_akCv6p_ndTl_hNlGL$`GbG`WRY<9x)_V -z94qA@Zb21W+r~H4Dk~}`vVE~alj?Ep!?t=*Ted6(y0HB(8K3i;NNg;%nT?evpE4vt -zVDnPY*Z)XDZQbTQu2+nkf8z7~$8hc|Y -zrgL;QkB5XKQh+~RK;??St(Dg@-aA)!8^2DNeXI3*9U&7trVqK5h#+RAW&8CO1hduE -zTt9P>hN{Hcx#2Xp%MKm~&0UjNeTh8pp@PefoJvQ1(HMM_+8sjvb2)MELN~<@!OHLP -zL55H}I<3R_z+7yK-+OoknP={v?XJ;LEmY@&nWOSm52ZNi;Rc -zvO_9dBRRCCFr*=Dd%eJQnDV1@!n*M(%RcN{LG;+u+(JhaTx)?E}L*Y%UFfCw@bixw!fjtq_7)_@#T)ZOmzBANEyF0pc9a%yi -z8IoU&g8>`w`l4dDj}O{5nZ+rL3tRg+RZ%ur#|e1}(Hr14%s=79?cgcT2U1%?u%snK -z@1ek)eYERp3<>9d9)l;b6(Isk$7c8m|F!c>9|_@XKWXa1Sko|Osufcfn=Oru{IE3E -zw|HdNbuw!Rhwjl&tU!iOT)-66I5J{#(7%~`RFDKl -zcf(KXX>IxpTfni!!nJ-`@TE62Yl1;vfHaNlSmLTRpetuB2y2q-RZ(23prqCw^W2L3}1lxUz1lX5tT(7S&rNrSBU`+ -zLU^FbJq4Z_)G50em6{;=?7`&ti8J@##T+5qa>XI2JZ)(nn7uZd -zyaVbw(yvbw<+>M%nYa4QX=T#i|I#)or}Nd8$rD8_tHpWO!@mX0fakB`0m9-vtHV*} -ziGphW76{gR0aqCiSo|(gLfWlp55eh9PyIA=QsvjF(b% -zs(^?czRr=l5eYuN3U;e;EKj<9|If2Hr(hyjn!s&&d1IN{JezfIH>SpmObmwNtUEbNKK8d5#dvs89RCx1 -z7Yp^a7ZSN*{ZkBAoiZ&x25UClC)Jb7FFjN$>Sa`qY1Ls=PT8>vw*{5#o|3@ak#ZEg -zGNklM)t5ztktxf!iI$$xA=b4B>n-PF@5b*rB3}bf#3u(ls09Yo5)B0HB9ma+G9t@^ -z1I&JzXCFAN_22<7id5pwruz22f8;LVHs#jybf9KT7)^3_Uu^GYNdwVmsyfJtCFZ;k -z<>tP^&nlEirZ*&2fc=xwl`|$*Ku-_J@95dMm8*SR6y{ELy$dgO1?^ecCV%y -zUQNBp-$2H#(#L!hn1@aLt@*V(iJ182#T62~zn@Y}X#30`h`8`_rLczU#t#ymo*Spq -zYf&j!tgTX-j+jOmwdejtB*}P|%M|*8+$(mz8uf( -zr>MwB4c~C&@ZGmLFIzjN!8gLFrrc3k&0U8mvstcT8rWk=y`C2zGC8#jyzq#1X5>bN<)@Kp9Y -z(R(&F^_O|@O&nO_l8SAJsR4dIRYaHUu4 -zuR8-#yjIppJuSD6Gt3(((y%>pw`R6l&`LHF=7>nXcr~- -zB)Nq@4<*GJ;ySVp{LojNRBVSEg(ISd)igs*Zq*R(pHM($=4{JmgRBCDKIY9expNq9 -zpbc6u$3#Q4acV)^51OeL>V~64y=5)})|Q#Iolrf`mjj`y<~j&%At|CXq*%o`-9n;T -zrx8W4c_m>sanN8%F8%F_2{OqG_LAV#N?>lqN>jD#eEvC_jY2|E)n!i~r4zJ`T@d8J -z%V(=sJ&2qV^`85J(U%J-fs>mpY7v%#VsrKp-ERC=l}J*_1JkB%};EJSF -z5(|>_uTXr+=h{;w?)z}%|5yOkeeQzgoo*L+&MSteegv+HCRuh_u%K4BmloBFt2?%3 -zj2Cu(#v+&sc-`D1rtkw<-xTUIUFY5n6t^x4_uKPgg(0pSC?Q7%nMe&erAr0{w!Wx) -zy@VV_lDnjIku{PGgLZl3U>Rp%Nn;k6`!s+DxPu9UU`}C`p1{nBbrbFT640{6tx -zy8dzPfA=4SQJHSmF%_wtm`~RUJfGfhaqH7OdomV`;I*b3xz}CR*5;)q#1!*hoY+N# -zP;y`h(^2fX2u?E7_ceCCg;k@avNYE@Z8$aY_f4z_^n3rEzW(T7rYofa?aL-n(icB) -z51Fa_$P}nOxmhU~e^W&_U?cx72F+F>w;;QEx^1j62C;9l7li?!9o5F-m=w7;jc~mhIz7>id?;WZw3Ou1^|&Yz}ku -zEF%K@RVR)$R*q{+|5&S#+kZKopE!a_rAptv= -z+#yt%YrtbZSjGLI&xI(mdqt3l1CDf>eFu+xD-#>BN*xHxzpSzNG~w37Qg{%5U5__B -z7mUzZE694Of&AZ8NKGGK0W>@yE@$)KJk%$CKS5+Y;z2_~5tGQoBYf>;_F$zjJ>(sr -zAG?5ea-foAp&XbaC+5pN-31-I3&hGbV;X-aCC@#8)2ZzLr=+qI8_azcn@RS1DVvvW -zC^iwaeX{-WHlld~wd>!7%9!lU9Pu4i6dM{iwS$rx8>}uH(H%uaeQ+r_X(upkCopba -zoGkmJUv_4a1bF=)*vX6GtfqdJM96?5m`3o5VEWc-&Rf? -zF$y0!s;XG29@ij_@W!~hmb#l@Iys5GnBcnEtpapSzAH;7)qq3aOR&wDBhXo|X3o+k -ztUtjlLglKT3EJg|k>T0k`-QVIsb9ASKZWX4uZ5GT-LR>@8pPAt3oZpmDn3(Z2WpiE -zVFg%5t;5lCbnsh;ncZO8yJx-1Fe59N#v5yQz~cOeic`zGEnv8+Mee{HsjJNPpJ(UF -zRsmV6bO9A-3VF89DfDgO^!kw>M+Vyfsf+hU!-3`OHi?Q=zt_fF-xVBIa$IVPAe(0A -zW4(iO)xt5>RwKTK?goyV{5RWj>p@Q`!hEuv9;apMR-$CTb%##|MFddDT -zwp^|ClgQ_Q`E$1zu9d^-r}99*ODYWgwkTSE@EoyQE_FZ+bzR~ -zq>*N{$&F)!`!7@})>%#;%4L^lnEC5FzNeY}!q&b7z05D@+E(zi0C9ecVbg4_>k3(f -zNqNfos}Il*0BAs9mfwX+Se9b*+aA)c2u=jSHhD-@!%ZT(xE~&b(5yfZwq6`9NP;PS -zXxgbU085aj-*M`mxSYuZ0cGiV<*vRzNw++~4+>B7%~-5sFX-SoN#}2KGhv2P%m1M~e46Y}Y8d~YLl%%IkG@lDp%_ -zK<`(9Q68s9GC6sIlS#?5Rv`0*XWKG4GWentSlbQf;XN&z9l+~h#i+JI%;A%+2yC8> -z(xl?!d-=N0n~%JVsPm3>!woNEm|wIQu;Y5&fL^O1?)QZ^sm?2@p}$16)~{0C9oWm9 -zkMkHGTHR@4#2SJw{lJpHf -z4qUA9mxsD*duOVifzz4b@4&xp-I{xV;^b0r*5MEp;5UkwYTwei^(hxscaVBn?=Sk{ -zxxs>fM}yVc?XIc`QBi7W5*6Wxc;Jo`I=NBX2ycv3v`LjxQwUAy6VNKBLW{&X3d|8} -zNR7w8GN2wH#pgQ!vIO+%^mS)+h^V+m6D4ViWNR@RbwzuWBpmYUTFqD|}VidqxU*OB> -z#z9SqFQhJ3cHvpnw^8omnTLE3u1?(1?6NlL#Zz8hwTUU+AX5tqkJTIo*Z^K!#m84cf1pQjld0>kHe3c_7vYqwzH6T8D?Z -zhZnGGU2!iO1ZKt6r?9mcHlr{i6(KmUc6R -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 -zJU%ot#=k_su(1jP$ -zigcYUw*F!}FjWT&!HQ?C5XzggrEoE!S>Q@w28ES8wt!t~` -z7@qjnVEnJK&`?w#%aY9B(<>?;Jr*n3pK`i?Mav&AZec2n=_)-|5THp=u85c7Bc4vA(d#e)pEL#T0+M`pTz?yLaC6NI7S8 -zOQ7w{9Vk8LHAL0b?Ea1Bw=(gQIERC{O_P>)NFN!dtVN_x9tde8-4f4~Q^C5!Xj=5n -zFVQxsgz8)Zaz1sv=Xg|L=T`Wh*biPs37IksCjNQlo%v65S`7qMXx_O+E4u&DSY)(u -z=5mn2tFF6TKshx8$}hxkyT9|xm_9`~%*X8q&FbZgmr99F17O~RmcWtC6+fhEVlLBl -zp)|1oRlhXCM_i~EL)H~-OkP~{=pOa>qGD7pDPXF@7#|u?YH?z88TO}_AKei1&I1i} -zIsC&j6sYU*)iIrH>7C$#unTYWbws2$X+XM4-A_<5Ercfj<}V%Un=Pths(#lpXB-EA -zvy&`kNL%i}6j!YZj-`mpRqpkJn=OMWZMwS8I!IE{)(!+FY5(bCtyL-%=y;+36J>(6 -z0IHW1*u`fT>vioHlTnt5!QO_vDRddLa}@0m((fqO>zcJ+$)0{6fnhtUCqk^dS3=p9 -zRi=r9iC21DoH`rIPp9oCZxN7cR>4_NN(m)eS$L2Re!#uA7QzyMnHwK<*FqE_Fx=5@ -zqa%T3i&K5!dkTTs^F!JnOw8tX0n3fvQ)^*XUN=-?j!qQ_P{OYP;bgR&BHz1B5c&gc -z_~@t4RPKQMuE5s0+9i~E>A3)!2oXy4+Xwf7=mL`{GyM58s+RC+nHLRj+9cQgYKNpl -zlfWMtbl`hCGe(+g?QHNs9`{78fhivI`HjE)DQfjTF{7T2GAP)YrTfa?QutaDH7D;p -zIXed@so+TDklUJx{)+p!Ab&S78hLMBniIRotNhATxJ}otghcyc_Zt+`j!U>IC#95)7lD -zgYPjKnt`DD^fEABy}sB)+PHKz+;^D68X3K;<{d8<4w -zFF*Eey<*m5JvDIethU2M5@f5#3L2-IxTVP#qYZ*>B@;dR6L*Y)zrK6fD)gD{E*f;| -znh4}nK`oToQuq&v3Z`P=uX>1*3rxfua{g?O6fwm89=nmZMzF -z1|w>^G!_`1{z#UxpE0DOAA|My}oAV -z{eVdHmQJj1POQD`x7Xpv-M6?*AGnrY>tIz;_|wfmnZ1s=Zf5X&N6G%H_vy-NIsmgY -z{_pG;U%d`k<9YukWU(`Kmt|z^K(aV?>V}qn6`@5?yt*F -zMFV^$ycDJQH-go2Md&Y(n%*_BzBT4Ac!9KFm^DImpAlI8o2^7_pFA`}f#5WsHD|Vs -zz7OnnGh!vP6A{z}f?RSOihk>2=)ta|0ZnjBAJ?^^KgTw{_A|v_ak@XZE -zKeY@rc0|kN5MUKkQNHsRDoiy0uzUZBP8nbP5sd4T@Ho{<8tRkiz#O@TS&W%=u`mF_ -zQ8w#i!G61N7SlQ2Bf~1b!4?5l(yCRgoR8qBjZ#)$iMlHtJtGr`ITz*fo9Qx$zBs{= -zmH?6Mze1;D0W?h})M~Q9O0RduWEY^SAHZv}N&*FYxKbn`q)J!UZAH|7D7p7B7T;R9 -znO3}a{SS=kw=!7-@uP5pXB(zhlZIPirYx4{d4TWPa{_l!7KNDu_ZsrKClwY!8OpN( -z7z4ucO{F=7e#M>2{dni0FQOO4WaDdNG+pa8O2L{qGvUB?IN7NIQED^(`(Ik0mj7n? -zh3^YKOMC;LN|5$Pb&e0FDuK7Nj@^+@O?XLF7)=rhEGLq_ZHox2n@S$_>Vadr?0W($ -zp4Z`WI!l-|j#RUvj(6b>oF?C>Uec0k06RzX(o;ZZ40w8o?A^PH1BbskZo9hh&1Q5% -z1T`4bs7jr1_2i?WV;c#Sc)Se+s0Aj3sXKvCt!ds0=FDwlpGKYS)?LC$dVukD-rcBk -zT!byn4*mNBaW6L6)NPWhSXPoi&*O3u%je -zx<*{a^fnH8eKQ_W$F{<~<*_0Xx^0jYVf&3JU;y(J^-@3PZ*p#vNzK&iPo1c-LYW+| -zR(=Dn=+k0xiguH=lVWkfb`ush#JQqzq4lT9DtIe@uh3rWvmaD5co)>Y_d>NfHkUoT -z%AABt5ODO*Z(YRty#%`Sz`rBS6UvZMt!>Jb!2GZEvhH8sd0WYulzxw*eb~w1@6&Jo -zkt8t(+gH;+XU~*;H~t&$^=h0kSaZy}4Ho*S>6`nf@40rnUO#ZeC)*?pl_jPIaV_YP -z)!!S7^s3`4=yT~nJS*Q%?hQWQOPf&FQdjlAGZ+kZ`#C9uHRGHyAFoIM&{D<1%XpwB -z`tKVQgzFYWzW(uC6Kn{GL!`y(dI#3O_#7WigF40!{r-K%&0oR9P8U)d%Y$U#bci~h -z_hc)^#4PO?e*9|p0zn;Jf5jo=DeOvuWA#hKpt8YBHk1(fi28-@elM16*gl5TS8v$eVW+BGT1m -z%^H{F3!Bbz&9%@>S{)TX`b^UAK%822Lmqv>U^csTy2TikVsDzvd}QGDdo5Nbg*Hka -z4|>SviajbAvXOW`Td^7bxOJ&w_18PSuyuL~&(gdQck2xp&Tw@mwON`UWVon-?i_HcEX{WJH#16~9{8y& -zx}w+?eLu1-=yiI==U=T|jknRmmRz7P>!=S<8d36wgghT~9o3r4|z -z3Z|C5hGtU5tpYv_2(E8ZXO}ePOedb2aU<(*TH4rm#;C++PKI9|=gBzZiN)S_?4-4g -zuE|HT%ac$+_YSq14BO1e$0Q;cN%=}o=x{+=Wd -z5(V$VdHvH|*+uvS?5h)6Q)%^{xIDKlJi%Ycm)zl*`Wr24f~l^Ds%lkpBFsk5;cp`8 -zd`-S>#k}$xi&2G~y#O*9-aik1qY#A)J0ZMZEgyI9di){|pLz9m)rN@O+*{FKK`w0i -z><8s7u4rxccs@Z~?HA9voK{>_z*8j5?$!Uw+<4)m^<98%Nb=9Rd%gTj@=IC!fj!|N -zsR=>SliR?5*HV^tY&Pm~M`2t)Z>*3p*>VgU&RJxL#Cr>~?!5Th!wAhgUri0GLbmT@ -zW$`@?JAe}QswzF;ElB7}*6{)S=25}ZzwRZ=PZ7yyxXe64y^I%eugI>O<P%3`&UXbuQZh}m1R5|-G4acLE;Auls2`IdCtj}= -znYW^4qDCng6y|L%O9qcLb4Q!6<(A4keTq4q50{{_Lps1D(xcyy+4|rFG5`x?1Qfygybp|Mh^F{APb4B -z?)Q-pHaev-3vPLm!-HUk?Js9PFrz1_x$z+msMe8<4RtCJ)itq;u7Lu*VKPz)6;$oW -z>TRY%Iz{I>H7kA}vl~U%mNnElY!ug?+&i~xI5qMU18YkDwMlB;K@vLpr%qM#ADT~O -zak(;b%>y>dk6ZG2j(lISLexVlKaZqik0v;~)VBrc2iU9VdVh8H*z5iSPTU>~yQZPt -z`N_xBFS*+dt$aAx4wly4XJt}^cl`yIR@{&Mx*|TSjX@~X`-^;Y=>I>cR!-;drO2k=-)*Sj+o^o -zsiYcjA9*Mz_IaPV>nkM!ARTsp%ISdjKg+K0=VnHW3a)S%A>qs)N_?H!U?N2EBm@d7IYPW7}busy7f=%{kJj%3Tf05rqIk -zBeIgDh+=D*u3fYcaP7C@W3jLX33VkUR}^T0sNWI^5B$%Tnv1`jriRF@^G#&(y1kOx -zrNMMN)mfSLcwyYP-o$6foY;Eer(~h2mBxgRRYc4{B3TiP*H@*gV9^EOoHunT9^}gP -zUnl5^Rpn^rUv`Q88yX$p#COc^ar0QyuF$ID(|l#o$3S%+&KID(XC!Y|0szHh{Q*S_ -z-~cqmI6E0prVCGe>1C*Nq!3CA#^g#90MWnQG1YKt5X`_1FpGMu^2m}43#?Ubmv_m*C0k{w~;5cE!I()0DL!9c4QwzgFb4Dh3iR;3xh_GF~iGx{{vNmF7h%_`^q -zwL_#vl%@x(S^8mIHx -zj*&v*5N&^K!lPcGlT)$LpSaD*uO4;xt0A=#6ON<9Pl&}I7H-T-bBanZ{St!e%FN<< -zuCZTL;{AcqLfVr-M3Cd=ssMa|i%Qc~%m}g72 -zapFuESa|mE^|k5J?Ao!PVa&UWzS$>}v!Nv_(HCCc$H<5w -z!YDa~0s8NFlpE&MlGdYeacV9d8S_~-3K?%1Z0&0?eIByrY5mN5E@MmasFN)vT! -z9Mr?8l%eMiP9dFw+$8p&a{G##b1)d9)0dC^4G7uljY=GPTkdkPnw$1RM-qoV?;=^~OHH?{hK`HxTdCEfMU-I4fClLAI`hPR*x3b+f}oc{1}kE_ -zNyn*Cf~q|Jxd -z0gZ0BCS|uD-(153f8|xmo;Hzp$Bd3^4GFSxlUKL!4*nVBK2<}+43WC8RAZ*7&3hI3Z -zYqEaSJKAMn(lGZow6<=b+XNB}>olT!1}m@SuRvi3qbY@2Q-aQ7)u8gA1eyu@ZalBb -zm45LSP)+ -zVq0Oc)>T%8UmY@Zz9JfO9+XWBCNs}Z@KTOy%A)LIOnd1*#0Y)$d(@*8;u*JlYFf5* -z0OftR#t^I-sa(H|I^+WsLGWIhnFXUqyJHb3B@cf`=qa7-lg)rW=N -z__2fn_A)q-#j;F(9Ei2H;8I=(j1q%Kf}v};BvVy`b6uZr8~4F{%t>Hh*p{X*n%vT@ -z&7#13w^?=bCiUYI5>>8RI=?jbLybQ(_tF?IXdv9j%cQ)C4OID&$#eV#6~0z%{0hO+ -zAI@9$&JD~qs(k9ZI^`uO_v;L6`Va$VQMn%kk`HTr5$(g{gv<$ivZClql9=RdENHDt -zj|5}8MTrMV4`T_W$dd@gzF-B#5Fc}aHh;v>9ozuDY_@Xa!CJ!rkV`EXAleyG9*G?u -z(hN)mp@IS=b|k+7Y{Ox4)bROUHYW|l8b0wdnM~+z0~$sj`Qe$$Gf}vbK4m{%YIw+L -zvy{CPQ;>ujDXpxOz1PPO_fE1@Cgf3uU?gVyZ-(#V$Psd3xC)T>V9O>gM?WX2+# -zU|R{0`}qVX0T*&5QH20zyI%6<>;@ZdL;$mcqks7kymf#dHBbb~Lxk6M%& -znmIYx63VXn@MXO3(UB~EBCTP8N2-GV>Cy(o14eoD$%PU-?S7u~=*zhOdpXJ^XY-0i -zEQFVOX2^<9n^UD3sv}&w@!igSe%!9o*crvhUw!29LiA?%-z`~deUf|rG~)wi59fMK -zgKysDPYM5B7xRS-KFsL2#m%q3;1(vZ!V_-Vzx$F!4ClbY+RTq0!r-(_QpM5h#K9a= -zxGuzRd7w(?92(|0_$okEfwn$ao95)=gI=X65jUq&ihfe5dP-_2@)6H@#*=e-iH*1I -zFi>94i*MPD)^ep262|&Deaw1MQ2E6ps^Ca7_mc}!vsWOd4$sUEM;n>2t?RZ^nECWY -zT^q2326jpC1?fkge47|o{O-t(AU0{c2vw3;!zh*DAW#AF$MEX*+L -zwMf^Ubk$=G8Kvy90g6hzu6=g0zKnkZ{Cv)c -z_=UclYP1dI*s;x%tEri0(aG5^M~Bd}!P|wysk%DH6l-c5Fu2{{s_ve?U92g9V=m)io@}eKFl`aHl -zTo}z3S1bIrW4PS-&G?Uea{D)WOpj(H;-=l!9173x+dmY5DJHr?BBcm1)^TBH6xX{Z -zr%JFf+Zq3U&JW%h>Vys_anb~EReRPL~yAoX;DM*Anx;$@oVc+jdap5OP;&TWotY6Pj~JFZA+PLmos!8biKt9VfQyblC= -zWhR8|c+lO|DhD0`J+zlq+~FP_5(j%N;fKrZME)f(Im5wKc?r%V;+S0sI!51m|&Nx5me5& -zb{NyhZ^1_0PvlniTFqc!>N4cc!rniap>FE9>(-us1hCV%W6Y1sh5fi+T50zhYRHQ; -z7y^g=kfDyVG^c_vQy;9#&Hc>Y;-Ymf~eOOUhL@KGfvr8kAbi(OO=w -zRH$n_iRj))&a7(;^8Zvf(A-aw$2{y=^ej1vf0PXzlWfY!G)qxWXomB#G57ZdMS$XL -z!QjK>8pP;c3>AN@1W8QPGZn8&sw-)?Mb_Xk$6ElmBhLiK_dm?@k3R3bTssRt_cT9h -zSeckU&t7&qT~*${g -zUI)kJ-@Ok8)MRTFl_L_51FhjFY5%s9qdO0iO7A!?5 -zptV4*g7CkBK_@R+o+JI^g^RvuBIRTd3jJcr)+w%u(y&*{4aIpJBG;|X;< -z#fANbdF5$Ck4@{jx-{?m@Gi(r9$5ay)g(}aSoU`|q;^mmzsD27ffR}o7(I-Zybc;& -zX~cOzT*eg?y9e*Mz0cf=Q$Nq0w%fYTXeGh?j?lc~hN}I%aWD*T58{9R9sQ3Gc$l%S -z`%%l3(2z{nPV`Aom6x~?D`1}zydrW)+&1lu*p@JA!R%GQr*~*%S)l0IT!VC -zGs0Audggu|;;%){#&QDQjBTY8(laXIo>rjq5nDzcpK}Z8&X(9|opW^VY!(c(mHa77 -zrN%)uRL0pl5B>Cyjv|G>Vc_REGcd9`o_b6v&`5*!H(WbWE=BijMl+_2+O0+eRHYj7 -zmsa?cbRvC;<;?#wUK_af|Kvw}T_$(dF~BU+tp2!paL5v&YbRv?@#I>?rv-9g%7pYa -z3vZF(rhH)`Te7frWK!0%HvhL|X8UMP(5JBfZ)4`s<&_j)^xs}quPSA`=w$-0Ut@pa -ztt&kn&oYPa2;z7Pgh$^WCFLZX2Xd^bOa7%HDf~)yQ -z1+f{ASA(nok_H0CnA!?fOY~x!XmB41t@oh5(%Puf@h{-LbB@@m@1SO~@Qv)z@1eNf -z`OZ#ZT@=0az}mtuajQ<+K>>_Uj)Rh#w_i;_q~uTcr6$-hUC%VY8aTQvJ@TACH95$W -zje0O7Y(kY*12)XH~Dk7TuXmG)l -ziY`eRrH>G`ZSKjOM=Uf+V-}5NQ;i|WH-;Is%>r4Aj+Hh1Bba?*Cu6qFGz<~DD1S9O -z^5qj!_V_WARK~5raNeBAsv(`qmZ|!0#8!AhUE>q>j;W?1MJ8=Nr9Bn3bo6D!y_=!p -z5?fqV!o3LOO3&YxNgVnhp1h!)DoUtkcAmliu>e;b>6%i@F*3#Cfx2!W;Q<>EREc1- -zrIw<7>}d(0r#$_`9GIEh-)7YyFHvb#%MpxP5(Ntt0Y-~BVc4kk7i1=tJulQAS@Ve2 -zi3k*kd5JW@_N~%awW=GJHtN%FSp+3Fx-tj5P#W!h!?HRgk3c6KN~*&s|50wSs(@HN -zcXiZ#-SZSCZy6KzUHvCkLcxtA1yEMYZ~RsyyQDrf*UCG?GvTogEu9Csb5@7n?GWOr -z+tPS%jT``Tud0YW7>F7j)!v*-Z-w)0jA7j*bZForHEq3=)yROSdB$2=FlEE1&6;0- -z`u4nfDEDR^O>5M^Gs!c$*|bkrPv5n!8nvB7AX1O5rM$d}_ -z27W6Fwrm#+mz{Zr+vQav4J0Lokq6oeN*G_SXzj7c?>rQspe?1)t%~=&RC`>jp?Uo< -zF`i(4*ZwllLBArHh>L{X`0=e+jUMoh~9c*4HL|0dk=7-i^6PX&xNC07R0GP$>LGRHs1_TyMO9k!0UcJJa*wm -zyl1^H+)nl^f?UhuZIl(edkhIX-)x9i6iMvO+F8~t>FIp_Ti1~ZugE3iF7&nl&>V$5 -z9yfxBm3{(;LJW`c>Rjq(XMgTRJ6N=dmnfnkxyp2H*K-eAZuCLO6*5JXvzy=>rCWug -zC*qrgpv@=|phFIMBh*6VbA=Q0h%-24sSis63%a~4H=$f%mpU^6R1yDvnE5c&Ku6Go -zKZ)^q>_F>#jTQt?mBv%yJ?-jo_dm9EJ=>V<0{@ft2y$kr#rk3nWxH1hJ0Zco+=K5} -zzZ~fU-aqMh=$kOm<^a+CIgAX9@f9i}7arVjZiw-b>^)neEmJ-M*4WYrPq%Sl;ZTg=H<+hl|MVz3LmDtI(^cjVR0PMc~Y7N -zF_-Ky;CVoW&WIG+U9HWLh$a=F+y6J2@=8^nj=ot=+o`&U?oS$XTcJBSx}@aHz;NqC -znZ@7dVOCj{p~+5F17@{S#M+5@Y4NbKl$MuWf>t=LM#kFZ31)@{*<(fz#E}{vRup-y-ouVgb^UoeV?ydoXDFAjbp#6;I#gv@;yoQA%NlVvs8n#6h+`~V -zKBFVdZ4yI&Rp~QPFmQG+7()gne1EwUy_2x!Fn9P(d%t2W+}=r_Kn28pmfJ9r`*UpV -z8DGZEks6ysW_bPya{^PNyscX`ZjI)+*$s)}zdhQ!#58BLOQD}KjiMhsB_%i_> -zvLZ6W8=u2-RUbXU-%Qgaw@yEt&@3mH@bLM(7lFqpa< -z2ug3|Yf`avzjFCm{m58ep{x9TRt4QA5n>AcpSYl#5Km3etfb3;-S0a(@Q~0n30%(I -zv>0fq|fRtdQG-8tUG)SEtdPavFcT1~Gq$#z{M2 -zgS&{o=T4Sf>BbAgp<2Y7~%`F^2Jpn;)X?mG<2RXA_9_~ -zj!c~~s&OdzeSZyjw9V3btV -zH+=UyBc|9#y^6P(m_6%|C#UI?I1n~Fk7j4--3UN&)P4ZuZRns5@lbf(KwO~^0bIl+ -z@Rkb{b9a0R$_dh7O({#L`dMVP?8m`0ThLvlCQ#VoA3c<7ENA&xyS2ioscdG)&GE~S -zfb5D>PB)Q`Nm+s^U!U-KDU~$qv>kZ!E#@w{nOZ_*^2zc~>qOa`XYF1M?-OG+b=`%~ -z1uC=4ia91Rq1W}ra^Jfx5rut=)~u3rq;Lln=aipoe2O@zuQ-L_IP7pDek&FHfgXc? -z!Nn>2>l0mw>ANzcgI3mOuprtzdiaFfX50i_kX)I@Imfj4ka+pbrqB^{>+s*m3`qTk -zF^u~drM+G0A}QCxL`U*+P#&4w2;=$W{_ag;B?r}kV614_0`hr8QKIQVF;2%&i>iSJ -zn3PwZPRCcSVO|t;`kzyjHIgu9NE-)*JHi0oY|W`7KEA+-2~Y{vBsF}S;0Qv#ie4my -zdvSqOVs(tZ6wIwR^)rAtiz6zF5ep~2iNe{vjhi_IU|==y`2h%1ZuSuU@=|d$61$b( -zb<;&{feQ_)HzED+$<5?nsG{$$ba&Q+JyN02R4X6N;ERs%%)O8YVRYdTvG(+k(;M`e -zA%U5UwA!^S5<5g#8+_zonl;&hHryx6n(U3Abp(o0$M44d4AJ}~cVs=(11TDI=q%yf -zJ(@NJ*yp54eNYwY7K6U8(m~1K3FDv?({)DgGiJICso#pan2_7VrihG>#8=kF7&N2| -zN=VIYx;zQD3Qr-Oh!0kPSYz+|A10^scLrc9}qo@p|t~a@h-@f+*UlPUqlgCjr -zvcdd#LG5X)J+3t)#Qgh-`mML()V6EG_`UQmH200sB*<6YW%VS7EOoB)K@!`-G^TMp -zjiHE46Xy;_6$IB);eIqJ;jOTvhoG1e%MK#s6)y0)OezeR>lO$S -z=k|cqzOn34;-Ih=1f%b8Sa?J~^(6aQvZ6bK@Zlr>Y6&VH^2Q{hI!M=$1o9Bkqo3Eq -z7jFxcRist@AVl@F;aGw;KbZw%hodb7{R9SSmx-av -zPEW?4zcK7hLzE4){fC=Q{WvP;F{Lgq+ny>8>TO(W0EqMb6L;<%7w(;Z+K -z8e%_W3I8*Fq+jr!On3yT*rBr@={ZkcKuBM`#C_rd(@o%Z!wcN8l6@h1gA?f*&K6xQ~<2aXMVCZ0HOSXYkAq$k!`M5#4OI(dx -zH^krexw>ZSk-BY#2lb}(5}%7tIa*X21w@DaD23W(>ZB}PWcb~uk^vXK)QF^6mkxr~ -z>F`x8c$Iw4xk>Ak^`H@|p6C5J0iq<1$qv2TH-4L8)77!KoDFMrGjlOF1mi3XT?K$avLtS#lv}>t@Qj{r83xLga -zucxqz%}dDFhaw?&UwMSZLLQ2WsLRht0O)ML5pr(OAt6;5l)!ocxURyA+GRO|A%((S -zQ*#hCLmar@DhJj1yO{yM$13q_U9pYorAVaC*xt0rMFiclN}jnF+dQhoGK3^Ylo%*2 -zLHy``?f0EGsakOVCv@E=RZDAs)PW0jw_aQ^usPQ8E|L3G#XQ*lI(97matMIO7ZC0* -z%KBJjco7_AL0zo+mt6xkGDBW=c -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 -ze3yhcdk&uXr-0I{zy51U^Y{&y)s -zVDYQ-dJz+cvsX6eaj^D&hbFVai_u7RfU&)o!hs$Lui118IggFsmF`w^xxDsfX4&fj -z7RqLKR+ph!l))^M&RXmx=I|(;(sD-w?Sei$g@>P6h{Krq#HeL@vqTW3Q_$;doZ+fv -zt?YL#5!oKYEuP5zLx{Jp3cEdV5M}o@&=(d}YR{8ZUj2^*?I=?yH*n(~NqJXLK7zvb -zQV?o0F}h}#c|^6*Qvh^c954c*#qK;kav_#AgIYunL?9XN0qmXQaKEG;6t`Ch!`$;f -z-dPw&CCg8n5SJ{ROiOs%)OP$8BpTHg7*)Ag-{UFJCO86cl8J-gPHmYY5k3+QRB3_x -zL_ot`&UB*BQ}&l?2|oAb?#Nq~g@Gv}**{ITfk#uB-1@f?42;mgbNjr(Efp0r^hFz* -z5#IT9f*!sk-&SiHx93TbU(L}x6E3FXqOuEAZLkE5O&dSo?765 -zxPJFpckFLd%M1ta2B)?jJu-r#a!Yr- -z6eiZZzRZ3x={Ry3{!0#C?Mm=o9};c~Wm!K@zK0B##HV@2wrnK|vvx3QdEN^@3Pt6r -zaT08DsSZb;#+=6WKfGmo?Sa1Bw7YikmWw!h%&HbFKSmDtrr+>xZIFPkqO?Iwz>b%w -zm%{ND{#SSR!dh(jgXe8Eskbu=z!7Dh0;8{hu7ySY02?Nf-J`&6n$%BjI!teb0N&b% -zUsJF|zhyxk7(*@!qnB&Vj0;yI<_8-ASsSu(`4ucO+&P08(r@!1_M@f$>w^-`{|Ewx -z?@a|LCGwt16-XNnn)gorjv@20dvu7xs7VSN!7p80NAADDV?shsFaT=+ -z?Io>-%2V2ZT-M468yD!sn0-4<(2aGW=@wr^CTH=Rc)Q{&NQ1`v!n7 -zLT3T+cV?V-y&CK2Z7oCo}Z96I53;8!LGoI-AM8kJShte7FqtF>?KGCcHIfzEi8Xt35ldn33a0Q(up} -z*xU>g_d3~fxxG#aC>HD2<%)!A9bCfGpwIy31rwgyZo(QA>A$tlm=$-Z7!+L9w;^ac -z`ts1fZg}YRX*+Fav9H;4UT65H9@lXRU7Q<_NUfP6p&CY=3b1fxeu)iY4dVh8knc0* -zWT!GL56IMx_Fl_~&BN=eF?K&Cg1n0QnED`{3Y2iZM7`H4<-!Ry!gAd>QI3~;;;y-q -z7(|>nVdouGK&6-b!qzz}RU$6hJgzCh(qzjkIKP*WuamL3>mM9g<;r3yG4h8{2hHl4 -z_i7zn{x7krnaic7*rQh7WsLRtgZ^R<1UfH#g2&Xzsm`NIb6;dCcup38P9j#0lH%ssfw&ejoGC7(}aLUf$rs*d=h#73}$u_lMl5vvSNT;y=#m -zM`Yo`5n4(8L3Qs8_lSE&xfdDJ;|F{3*6Rm4JnbDlp1dK>891dr9?7j|v9-8re|nBZ?Z<1}No}j`H1jeQ0STyO -zMj#BuNFc0*RE}SfxOtu2>e`{t -z%$eutBu?U3HSmEV;431+7k^cZW&O8R#v?D!fEIgK&*DYWi>4sUmcAymRb?rh?53$1 -zIkn++6p+jr*loII4BO+W98RfS@zG1_xgDHTV$EYg8t588BVJ(+N=?RSe|v$UTd9uPuE1~nF?hq8jP(878TlS -z7VIZ%xHq0zp%&wfi$Y9A}~P6ECFR&Q#g;Ol$3iw{{qumJZeU;_j*$Z{`L!;tfH6dv57!5iq)RkejHIpQ-ZWb@p<>} -z6slqV3|HJxc2o_}WKX-4rs}ac=|5QiuKyOrlCn+T3t*9gqp-pN=;$-qme1t&U$Osk -zyVz_7w-%ec@-&s~E$b|_LhOt+=YJ$dk!{DkN)8glSE+|dVopVo2KLvaIMZ6W24G;26p91#yG+IZ -z`&QpL9are+fA0X0Gc}Va1*YC?N{;izbQ*AU;dS1RoBh@si>50|Q2zR#n~sm)v@$Lh -zZ?-oh?zcbw1Tm@G{r)Y~#@7s_ctzy2)V@oO>ayZmi=ebkk3D0B+vX(Qi`cZVYbxV3U76F(WjPu{~g^BQEteJnp!0qUy4Y;F4CAL2?S;(VTy -z1(vE#e{L4(-f5H7tt$$)%=8!f1Q8G;lb -zn{SWk7N}r1nVc+$2VCNraa6|jWOQ+w|hCaj32-YIL6afaeQ0R!a$!4SzIT`h@S6Z6p45lQi&rx!nc -zEUg#k1{?Vee=IqMr84>79WQ7dCwLiU=ilae#8D7ETl}nGkMwJr;@8w^fUg#=_*Q&x -z_US1V49w-%az=@_Y8>?tMj{pQX2p2Dw?G -z%wDmaIAK)Si2*r4YWb~Lvmy@Y@r+Y~s_fvR70_&)(@2^OA*j7@@r@ZnsP&)y;3!v+ -zHVag|Va#x-Up8be$HO;PG*N2#fM$|eqXfNq?w1^w8Zk|@E4*g|+GS~Lx1xEvhErVk -z`T1HzVvq_sNp4Rn&FZo^q}Uw9WLZgEq6Ze`tbB6PEOpzd5L55htT?{b-N2InYiYu- -zS%6GJ-~a5yI3u^HJK~>_Eium2ODFL|-4meo)805Y)S%E=G^OD3B`neB9yvf!Jc?=& -z%}2P_wz1do*_VFoC&aL4%ntwFo);vMs;dT;_PV0^ViLFaZ8d~^1Ky(3Ssg+>vXvU; -zk<-kpt$KVOxZCUkPTmH+?{6H^Bt{Q4=UVxO#@X$(3$(%-1cpaig>Rsu!z-nJS!GZ+ -zZJ>SVDjQjvK_(3-2$H2aqipY<>|5X@^nrlWQY{c9Tvq#xt;m_?$9<4sWajTfIT6{+ -z!v>^bN_95n>v{%bCiQ1tF1p2nr>!|!>3?O{U4J=B9%fkF`f;EMY`YyZL5^R6fYj~L -zgT75J32RUEkfTvedBigX6bxTnkrc&dRM*}|cWP792N@sA_u=*!oczuLV<8lNnxT6$ -z7;c&Cnk8E^OO+P&L52#;av=)r*DOio4ehS!BU@U2NCikghf>?8mKZ?Ped>TDQ$urY -zmnY7|wxlu~^HpxJ_qz=3q#%CIsR9c(iFr}D0FhiF9CMuzJ{%kXj<#u -zo?XT&UzO(=e67ELpH9eUcqXDR-w%=CT_20>aJgp=7z^E=)a?)rKpEOed3N=XTv(1O -z%hvR+=!-Xs{e1WgcKhh756Wc6+p`6S)KSp~t#U*LtMAn&^F*4pE)r@~S)g&Ov}V|c -z$L0;g7LR}`)|oQEhtnx$=TD4Se?VHx|D(o}F8PM&Z6+My1lJ56RW+_(G)H -zVxKJbwz$GmXVsFuSNj<%L)5yTd&aR}o5bkaAbgf}8NP?`^+wzWY87*7_D7QAPA>}V -zu05Vi0qM!bCgcWJZ3O)ZU7W9)AMN21MJ2$#fQ?(#7fl3bO`4Lje -z23}@sbNY}6Bx+|6}PAjT5 -z?t`|k?Y+Tm^$1DYnQ~RZ25t4#+Km_-tB{JSD(x)({+2gjj;xMdA2o+fM&g_Z{ma69cUHl|RmYi_R97;`yHw-@_hn!{f*S1a9 -z_Y=N~Sr4(wT4Z~?<*!9Hv~bB#A%~Z>lQ&pKe%tuac5igcPXqsT@|g^lOi0CtNoJ@m -z3(_!nVV-974;D}(NU8@Bc8wJ}$cKGDzJm&x=xIL6F>vs>(_S7|v&mKH)QZO+qdFD{ -zQEsN`_I0h&_^3wVqAxsu+m?^?AcnLULBNo=h|Ls5Yzuu}N`15=64ZoQS^ft;DO7^N -zPMR%PYQ<U(~Zc)D1kj -z!=J*HW&leY>0Cq>5r@q5M!Wbhp{9a|m-$V59y#A(^WUTLB&JZu-5S=EUgKhgJZ@vCr8Ai);)3>z9wP}wdmGJ=?j -zC2v05gJWM*+%Emp9hZCewAcYSvt=`V(C*x`2GF=k3VuwiP5T~=R(#j0hSNUwjE -z=3HGxmRT@g`W*le+Itq?S05TTI}zI=%a0!ztDdIj2XIFutf6^G9SH{&HkIHPxtY|F -zpdxa6{71ZeMuC~-M;C8{QqKo%@_jq69#G#c?7H{As+2hrKB9qg@7Ix9H+<5p1wkrO -zVts4f#*@X$+JB$;!yLL}|5EXswOJ992}Y*>mU?DOZ2ROphIDTwmxr}VmnUw~CBDGT -zAynG0gAlWC -z2eh~s;n>6j@rQ@t*G3Va@(M9BjS%s2nk`2~PtiSH5YQULN21vV?gNF_p%-0PwovTw -z^hd2oo%+;4Cl={+O8YUk!UTszB6cQ1U}z-dw%hecX>Q0rmSzu5NzYhU -zAKR~Pj`5;vx;|DCLx<}JT>UX;ah`!}=ylY_%Ws+C3y|5c$d-lyxFx!$T!ohU(uGO-hBFCaGJrn%i_1A%q8l)ZJ_Z9PXd@2lJcv0Q58CKi00z;U3MdKlfv7OAhH)4)6 -zVP56BxZ6i@mKO|{a*H7j)sA5gQcU`rL!PH9b-we#3E5TNfbo9i3)q{p1i3h-U$_I*|b<+~Vb0O8zs>Gvy8J3#ol&3>&J}|WZIe04gLTYuCP2k+P>P{WoKhwD3no9Wwt7ntjKbRXo -zQ1Mg02pOxANvGn^${6f1CF%|3)F-x$pXT}5OKNwuWc;$rnQ;Oj5NeX1g#FBt4Zbeu -zWQ+XZkFR<t}@CC>~{gdJ`v=!_mB3L(3%w~_L7R+A`J1ClN-CHd!u)3U%xdy#cal2ro9o{&ZdGv3p*qr+Rr?GV_vP~6@_*FR -z`3(7(%h7{(M8K+(d+kN-`;I&os7)06nSLs#>eh|{K=kxg>6&=i4C!i)eU^3MEGvgX -zfm5(e{uThH90#^-Z3j%xuNh7+XNElyRaan-!Zzm#>l=ybcdSJub_u -z6}TjodYKvgMV+took6S@HZA%LGr50lxS322$r9Lt47{u_Y*TH5OQnbGWztH36=&EKGyt@}K90(67d<8S9RhkH) -zu>IPN9BD-7ta(Ss;-{7l)LZ*?rww#mR5-XtjAgoN##j6NS%Mp?k5X|;oDN@2T7Po| -z4yr8IJ~dYy_wa&^z?-2D-u#FS> -zvl7+7!ard?ho%iI`gTP8UM2_l@fDp>A?d)BUIrH^^8r|Zib)K^-238+(a${f^ew7$?~51=+J5>i{3^fI?@fOJC$|Hu -zk@!KeWeKFS0d~e31%zGn>o*R={VJWKFXT|#kTo+)rimA}H|d{hQNg4pwQUJ1B+^Y= -ze$A>j3T$R&%9Yc6x~SZ+mX@j2!iUY%#-bsQr+>m@=g2gM#whGlV_Uq7=ro8^fpfB< -zk~68~nO7o<4IzZWqY_Uo`hL8TkgWcn+TuI+>yh#+*%xcw2SO&>^Z;)oLUxO1fsStH -zO~?c89g&6>pqm`94jSoj=K}#TQbj{Y;*KF!JX7m6UR}6+a?Ah4#;i8IZ&6_f^o|G` -zj9W<)a9uVi>r!Z~pD$>CjuQ)uoSxkADjp?A@y`P_K+FF9w=rO0V>U4{gY= -zb|RqxaHNG=yw_?RLuIfWexT`|<+XW?ZaC|5H){`8`{YF`N -z<$m>0MtzAg5SB{>?hL$iR*km=c@iDkRVmcf^7K~HZ``0wK5lTN2uECYopRX` -z-A|qjnOyH>lUJINB6)3`zDs>@GCY+{Y5EPMzMPTI(w}xK^_~tI -zg3PYfJuQi%Q7x@DEm=!Qtj_23ndLh|^@j*BsH%WOiukrub2A`lG?T<)_VGzmyYIki -zuy{qeS5PAt%kH~97&`aqlRKf(3SWzZVbsF#`O@U9jg_?9dqYIYvB7*f^p{(4&UCMp -z&B$B5U}~?7jAmemh_4t!GDG -z9sLR1++rii2Qz#`Dg8o4UqY=)wBIH(LE}s&BdF)6>h7>zvpBp$kI@ -zTRYid`zl?AC8hV>_;Q}k?{>(2-`%hc)_%9Ri!hj@F4C0H)5y3Y*<0uou3~<4`iH_z -zmDVCjNw9rsyJru!0G@T}Sj@K~k>Czvaleu%3gLE`$)FmY+VrV?x}bSvsuBCzL-b3i -z0gu$Cc}UyX(MpLVFwnUEbeH3Jc)f;O(Tr?qy;FR2FdD<;o}qT(!@7L@un+3NE&?Mk -zXe(gg&=Z7eLKtj->ft4Tbl71W%Ul0`_lPk00dI|n`t -z`+06!Ff2rQgMeKgVA|_-8Ac>tJUG%7)v9C_FTc(ZVK+>&w0^LEZnIDt8Hiib93|o} -z5W}u1$aW181>1z$LPU{fBEHSwN0iN820Yl-yKC?v{bt}(n7?(st5xDc#oKH-IXuf< -zSkQ`p8f%eOnNINUcpP>1%8(J=BwA<+KN4)cRJ77ToZA_jQnI?Fstaam74`^-o{2?@ -zoaIpQN47xw*M=ngW4~ -zE}v&z{@KdbRdM^^PZZz8bGn*xG0Z0*xk;?PSyiq3=uE?Dm!i5{8ozpBl~W#n_`@2Z -zCE6qQ&fCiA3zJg_^EaH#>^;~t&+1GJhm?R718(6QwToyOQitI&xCXR$;mZaw6(=gm -zJKw}S@n5$&vJgfc5T_f`m!~?&h$Kl_|vX#a(8eEdKfbR;n{a!(j-?!@`-r+WqBi8tD6*~hiPbxE_x1V<{bBc^+ctsv=1 -z)IO1RLAo`*c0B~`a4DS>EI!XN^-^Hd62uQcyo7Tflp&!{LN|8*-usUGkb?ME4KPYq -z=vr0-SOC5KalH@9gGL0JSvKPc-SaH0+l?*FQ+B^R`u#eK@rIuyZ$&4xucL*XNg#&N -zT!q5*c~fgxdzxlF0Kl_``(A`+-67}RQKO;bezSHY8#rNF-0XX;I(h%Ylc*Nwu20Ww -zxlATn1moR??IwYC-yT^y?wa7=T_9W03&ssxp6)Ovmlz+&*Imu!qYFC*J`qwdsG2gHDhQjvklecVIV#zAh_SglbcXB#) -z9I#@@RcMGAuY<|IOk?OGtJK2R)FY^enWRJdz|^8M$9kC8&ywHbpHzGQT<%!K1sBrO -z{(C%bSYHG;;T-euO!!GmyUp+2O1vP7j$%Wf_cV&2j15h}D_WwiWcb`V4Q+18@cp$v -zCF_~%)Yf9!jQKJ$T7oCI`YLMqiV@UD!`a?GjwAR~q21#>d++K+8LK-Nuibv7D$CX- -zdHc?=2f993B?Rnk1Kos8O3Y3_u)$4%&~Od%Rn`E`ckGf5H_@a(90kj@NH0>4?Yw_M -zDiR1G{NBrf{vUTA?_XO-y8kTXX8cc9hbalv|_cy(XeYVJbazjE^M+x@eDp9RkTsa0J7&_&aYClOv4 -zbwBLpI#)A7@QVGa{|{H)fmoy&r~OLndm_}X3jK;F57pu7BmR8Q;pqC8OM6W`um&au -z+tB#lOJdF7+7Fc!495Sfqfli8@oOD$Q6c~L4g)-W#fv08vi@(pjV@={iO7gh;K*XF -zK-m6Zbr-I1$vCDvAmfX^u#2zA%WrIFYKo5g%XV4O)`$f4>{`Bza+4{)yI3U|yT%6L -z$UeA5O3$$%`we%aT-z<%1+}%ki*ukFMJ&HlxuJjg=PwG+PhQgtn;#dLgvR}vOhYGL -z9R@cI2|c%`D=N*z`27Y`%)xpU?`_y6U{@5*Vs?y~N&wZKDn|Eg -z?XnklC_c@*iBj>5o8m}{0P6zghBH{Y-1-oHue-X!fEQrL_JgI~!S+9aXoWf3p9cb@nsp1`fs -zhcDf-lGaq5GGT1v%t|BcEqnbxZ4kaIl(Mw?K>6w>*rqnz4MT4--pQ -z#IF@6i6?d18U)6M&`cRH?mmjW8Un%RoZY;zd89{yiT#^Xde2s2k|Nx%t7_`Bnt$}e -z*DC7gk6&T6stVZTMWE}>QxVTJk*|mjLk%j(_oAaGyl;Llt?^e3)OmW$WykeSWL( -z2fWiSiGJkHq@^MA`mf$0RIpxt=i{h-?Zr`y<>Wr#00ff;IZ`-!%QrxiKo@b+?h7WBZ+6pzcrO`usCUEyybd -zc+GNpVXNTL5EP*SenWC+>ZT?6i#03u$DQi!K_K79mSrYrHgEske4!en0e1;X@k)ltj -zeVq6&3`=s*5i8W}iO|%Vq-glW;1Z%N6}p7}`B7)XA*=+u9p0)3+45ij)kbo8B0zNA6>|QhCGcH5 -zqV@E8zT)yU$Ki4|!MyVI2Ai(h=K2}8!9o>@)s$m{W&o#~5*aUVbVlH;*y3D&{o<#U -z#R* -z-2YjPqezl5U$RnKs+iY!^Y#1rZ3dmTl~jMFt)0kiAnJQu`!vtmVDOnDV}bO`53`iJ -z+fBjFHZcHI%gf(D)+p06smC&F;oj-ea8^%dt-=iNiDKh)waS?<`!z%_IZk@^1t-uj -z%hxcvwi$3*JNf{5S>7X)dr?2SR-oxU!Q2<@rq=E=w00u2q8!4^BT8589f8`mdhekl -zneVi{RVO<&LzFcuuId)GPA9MYjKj{V1ea;Gr*42;KbdlKf6IMEYewR2U4=OOCy}8i -zy6)zCTF)9DLChnZbZEMBce==Oga4Tv1$l_o@zL~Gp5#Lx%1~3+nidAx+{c$!m4VaM -z{CJ^p4f97BBO5pK3vT@r+=;!nkF?@6p*OFmCR|u``2g-8BPq&dNGGoyRpJ(?=k56F -z0kaI14_DG{)9gRK!_vpI(zj;_{zn|Ulb98*xLF@7kKuqsVkxOfC>4H-3vWI>KV1!0 -z`o0}Z3-Bb9Au7*46cM(45afoMZVT&P#pJ71gQ|>nMkRggA>(=^uNo308qKoGqG4$- -zx}#yNyZ$P?_*B?rd9wIO?2%{{K3XeS0s-xAfB#^SI@IKEbxSwFw?xRC|D4It?y$e{C0@?vzEbX7jbD3aT6g0p*X^^=4fVX3W%6HaN5hldVqQeOknL1z8`5 -zdAB?)MHmhoSPHHySz0X#65;i$-upP&p|X75z=qQ}q24ya4~&v5lGhTJ_+^> -zpp~i<#%%ZTnY@TiEV218_;g%5Xhj{>kap1bAF4yjdAQTZFBi|)z>u=nqBWhAVKQ$ -z+FxF}d_#mc!&YB?S=IW5q60f)`iv|k1`L@O*u5C6Tt5;4NuJ6nj9Tfp^naf{gB`q_ -zVbum&7qngB(QKnaMx>MX+rg-4Q!V@zib9urii=%Q{mUZC?B|AWJ< -zC6(i-vw6TM{~sjSE;RDzHv1jxk7#wf1CQBA#K(RbjPT!byanIrrp=3;f^;i`EuwdK -zv2hGH$``7<=BXx5jJS_?wZmB>F7N5`TKl~QIowcUgf-k98jlBr$NVr;H3HaDfivw6oO0dwO??@C25O -zDsw9mu-W!^VGOf>OX|_g7WCFCJMiHd!MVyy^@{tktrxu)sjz!}7nqY?3p00_CWAn}vc0F_Y&WnEYJ!xu*mACeA+hH# -zMSLTO?MWrBl`dPK60U2YCt3bbUi(`#y-2H>T@Cz-b&9cUfPrMDL1ar&#_rrW_W4se -zqj6r@{ho7j^HOXLk$mN|7{2~gi^fu6Y1K)?63d5C@L5R{j5m4SmH%b#lr -z?EKH3=GZX71aqFxHGzH~YO6}#$ -z8pYUYX*{zL)WdpkUHVJ<^tS-*G&6oII}goAz(emB>s1P$Tm -z)2sBM;bPwluM8Tc)lH}!vy)N+X80P|4YS05&8P@ZkNv5wk-%aV0sGSuTJ)&vzq7si -zqRxS!E~~zjPXGfb&fWOe{j8LCLEhu=*^_tvecsmcR8^nePUa~2awJuC;xBq{@l{O!1NR+(Lhq!R*!Br3m;YYopY%6j8UmVaU2!X>*w0pG -ztJn*EI>+n;93C9}P1JaK{fftT`!wW#Yn!`@> -zn7&W^2XAzebw#p5J&k-dsh&|^4C={Cj` -zU^LdgaUnV?et2qphh(f%Z>Q(TpE7Ax5`@WlsRvZsIK#E;Seb%b=FPfWJqkWqWZLWh>!?1 -z&89Ol-a>i!HVln0ZQ4$Lot`V`t+(RA2uE#I{F3)f@6+R$u4`Mu5@$s$+5weCxcddO -zf+l_S5>88NVvz<~{dZo!u~c2<$_W1J%~Cjnhs7N>^;9(~S>_UaMgp22-0_foWe*9@ -zbUHkw!LzLiT+y^=-v&E95MjvQDuG%L64ofw)@DK_AD#ibIRSzNfI*^OFgxxf-Swr? -zocqZ8`>mTm3K=?+m5|S?DGpud5Hn52k6(n~zpT)o>{1>&>Y0M)MR|2#&>w%| -z4D)%bfB&SjItU79dm7Ks3tQM0cui>!n|bj?-Vm5ftg8qSKRx@5OMXKYW|{IYx+Nky -zv?=7+lj?yvwVqVNR!bWfPBLxQV>yxZ7Q+V)lxbLXWKl0nGJ|Th;G>AXnL|7Hj+a%5 -z>liKY=iP#NT|4k^fU6+Rs!}{|u)xqNTP+H315AVRFGwNl#B4VH`-vClr; -zQ~nkSFrF4cs9R4DPVN9Hm$OjC9ODlKJ#l(K{eTH8a^kin;FJZlkHWlBEIDc;oCrDd -z*?r9QS=GN1zWyNF(8v$u+EhrIE051LJoQq4x%EF5T&g@QW&pOP)N(#%vl$GocV* -zVgMU-qnp58x`X*6qRu*rmv^=A@(XCMK7iyetz=zIW(Sj7-Cga$Pu)=+_`_vC2W9W= -z7_T)bHiPs|-FcHwFJ+h34!J^FER0NrkSohL#TNk!HmPuLH4(&lV)x#g5Lz@MEo`18 -zBxIFqSfqmHC#i@+cD?w69=>l& -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 -zOYmq>wR>}@$MKbVZYcS -z2XBcA?#Qb)hg=SK->vWPU2s%;Ac23tr|OGQ0Y2zg7sIU(RPe+9)yNPdv -z*dE@@b*djWTzNkx_N8AyHB1^$-Q!#XgPKqV3tHjKryo+=zsBANii$Z*muml4`I{@z -zY*_fM)(l$0wqhcqRXPg$gqb=6V%WV|Yz;&@T90pvwEqiy#Y;PE9lx^~b}k&Exa-;# -zzB=w3CfT|x7C(MC^TKRrIgO>skV$WA|A_&TXWr9)ES}scFr2SQLPD;6fYMOI$pGZ0 -zuBh{`crA_-NBE*n(@NZ?K3|S -zKmYPNf)iB$bnaJf5lUSde^)3&>~H_oI8hIiWktV~#=HtO6-Q)8zJ-~)pAg2fl3H$A -z$Kf9P8q9VymxIJ1zDN2zchV(`(&WEr(r)y0Xylf~T^Krs4_zzjX_H#1%LdzD_8Mk! -zli<~T=djT?U@VPs4~iJbbjym67Z%x5XkljQ*Io`YriQSB*b<6{pvk0Hb0cIZh1wuN -z+>a1FHaNuHDpKU4AIF?eh|?X9McSHs!PeUL~gB5AE4LsAkn>=t7#1Fa&h}GNx>pmOomVfvhWiUaj -z^Zj#%;ZQK52#uBzNex$eoXpWMmlRE;WidSu048G=Ef`u+ysCb9@51~o2~V(O>0D>z -zS{zYcm-G{)T{{|MBJ4Vfi>Z(V*XC=&G2f=qcyu!d<3!GIrvw-1X|J}z^vJbZtk4V* -zcp1sVqlSf@!+r%xc!f|aUq1|%7Z}n4Gxd7Nqr*pZ%=WYAWpHpI?3P?bIXs{z&+-2lXK`9?{Gu_gTKmBWwj_Bor&Jro5z#2i)Bu_F=9aV{}(3jFhjXa`wj -z!Ph4Y?pl8TSDZcW;IsL_2b5`&UnJex4Dqf4I1^MvHIlr&o7H_QEo_L#i7><+Yd?gz -zp^9|lUM8~Tp4hDFHsG6zF|ON2ENWnfS^rzaL@w?{^+($@o?#hj(sf1#`i&uCY(gZw -zV>{~ihv@TJ=qa*7%kL2FmgRrujx3io9P($h{#%zVbcpqdOkw}+XlxLk4Z%zWzUEj1G -zG2%h-?HiVnJx7S2q1eDlDi`v7OW{8;dg-rIK50A`)=QWTXUHfiBLnkq-#ID;t4x1@ -zr1ZI}V}1T)>kcY)LFJ^-1opCnTHH{Kd5)|%|AqZnSsD-O+QHcyvo&8qOkycN?u*q*jvS85^KPy}ap!;iiVZbI;BSal -zV>cqABqK)Vy)TeZ3*oi|gVbCCt=|;p6Z<$1nHDp@mcVurbat&*Qposn^}5$UTsC$Z -zs$@p%;7$GtsIP!aal#-r86(QLbbwEidCKD#bi7Wke?cff>!1$zfFs%HS}xqCrDol{nCK^q}=C-)p{Z8GMPNL0*rh?qf$SdazsUxd*0>J`zvQw$pl7@Csq -zZ`yd?WfP&AQqev90y+p$LP3mtgP$k9PTk5T7$j`}CttK(D#z|rknCsSnj&4SUB7g~ -zu|p5MCXzMk-Zkys{X}w+wdEiNdZ%Bnb|*jwa9tGPVPhX`dkA%qK1wbVzV?C}c3TTs -zY^K-iQ-qu*{zhdKZf*CP6dr{Siu;)5iJO}HFCHZ`uPJB9wQ87Hb~fE<9;k>o?7RC` -zkL`v`0dCTK$}O@oH#&+%t3{R`y{ZQoi3W!MhB;v367=7-a*yunMDZSuncSOR_5<`PeH$;{&e5YBOx)b(+b@D`KO$AxF*|$fywz -zPgS9}hX1A6JT)$AWhdDIyAp|EY{vjioNo5OX)Zgz?_SW|&iy(*IV#QW(wV;yIeAB3e2)`rC6fz!VBCV*I_lz8YZaNIgTUtq?mlr0MwD -z6f$(9sHX$!%{F3oLJ+#iIepu|Gb?PZ;E1cMdOd!x97Smr3Key~e76E6-9Grw*I2Sa -z-qvEi$PdLr5~zf9vU01G3LtHL6vN27?_=z%#1@`0VLQnB&e6HrOJNBLi><%VU=-|< -z5?0Zf!TJs9u|#H_Zh<4zme2djFcjp{6rCM+BK9=k_kI{WVv(!aL$ZN=h#>+w9P;s= -z-J9`oC!Q;FS~^XM!>ZkUxWUiji>#Egcy?ZX0~$gSKfLG>6TVb8|UveWm_3vhV3F}~~mDbmhaWH!D=vOceA -zmP^RQkF21j`H$o>WsT_aCIRF2ypQGaPoJ#dv+^QMFz(sYRpvTJ_bt=qp9a~^dUn(H -z|CJsJ24UI!=!Y0cd4O{qW|4t<$%9E|OA4x2G-UUr`V2!I -ziwj!r~fFBnrMU -zmM?6DF0Rq%+mQ%UDBf*kDro9lC)ZWvomLQKzBKJs#tXP=FQC)hnWoyLBbnFgAu#BV -zZq~4oJap*x(4)1JO4<3NXp%FBWXnR!bzdbz>UFlQPM!WJ5%p&W( -zAc>2BVt=$lK=M%=P$nZOrx4vIA+$61<%!b&IdjgGBsSFkc-MR`38e?)uKuvD@dd -zPP4-N>q4U2Bo`P-%D6;76V4`bFw1Xo5Jn;9t6@cMdb#xp`}##w8A&&3C4D`HXK -z`BGng!DICYw@dM&m7id{9_dETAJTu|{@~X?v9E5#-c5hX)BGG>5%F###>Ic%q24K -zR2bo0_)NDm2FfD7Y4LYM$^FBt6$ly7%e{a7K`-sNjze)UAnO&#aTf_6&O#c`%=F^n -z7j#ik_2%uJ$Vf^6L$`n3&_;?BRi4g*|L2o44Izb`7Jid*3!;qu*CwQ+(crJLzgg~t -zgE)E~0|VPufXa}WjGNK*XiccrcIGUQ<{48!yr}aQ`KE1>PX9~0QuY-OYP>EWLtV@! -z`A0^jsfCNaUcHfrJ{{@p9-7H`{11uP>r%Zn_NN@grha+65<@`_Em11&8$ZKe2CxCX -z$V{si-n#gJIQ3tPW*!460T^nr6*erF(OgINn_dL!Rurs>Ww`PVb$1)7($Q}(9g%3c -z7qw$FI}QmnvAwl+l7$+$$*IB#-Bo12VaoSaaJ||%e_}=sZI=t395-p0Edh$qvKCiz -zX72#?)E0@}6)iHbuN6dyQe!TCK(AGz_pz5lOR&$-0`ia)eov;v0W|in>mKm27!QTn -zgDeblXhh1b*aP)QQp{k$7}eIXqJ80%@l1`Yfy5%mf<%5$O!Q}RN-Q?^S|WCn*y_gH -z5@Miq_boU;i{wW#QyECFO3d@2muKQ-^VLmJzYX8?_SYAdH#_exSYO>X43$bll`v_M -zqL~%=U*DcAB2C^}r(s(VW)8V@iBLMf5ZB`4ty4=t%(m^gpOf`r&|mcMETDUTZbJwu -z_#^bw);?FG!S}V}^?+G=j_z=VsI2lC@-5GS4@pVYgD4tB)Obun3WGr*Qw_>&+^#U5 -zuK3Ps&7zz|_GndUfGomuXO(M_Qkg|iif>QH965QHTgb=gTx*V2eLw^73omMU_!Fyw -zx;cDRk=!G!GJgG7L509F72#=ahb`<(tz)-&)Gyv7xss6@nz?p0di-p=-{DjGUyS$a -zrb-2b(V$mXRnZ#iI;Oc2X7wBWB3i@$yAeTfa1<{ukxA1cmTBG6=C)TqVfWFI7YFhz -zm*5|m#TK$q4JjH5+F6L82o`+%WP^j;9Q_Jq4fb^!Vk!p}@GLWc&viAZ0!cR;KguEQ -zL`NaSsrTd?txd0SDcOgMx-LIMkpkWs94X*EE|SOuENPiP@1LW*+%A*6oY_nUBNE6+ -z3L_mkf#Av`)E@W;G;>MH-G@Uoo6aWTZZYOvx){hgoTCTXkL}C;;u@Ng#xOkGUM+?$ -zaF9eZn97XjrQ^pWXgpyeq#82=+v$U(M1iAqyG30!f=_t~1)V&JWsHrHfOQlF={QlL -zoUhnZJCngycyhC((*oaf?6ZoQISr|J2kp0ez7ewpojBkxfTb#C-^My3?qc3k`Pk7C -zHvgrUr%V+u{$5x0k(!tf`zzh`zg|HadjHdOWp>2T_Ht7;la&HGr$`R?5rVW^+JaTl -zOc7kLE`{{%2pW;#dv -zny~n(GYt2}3*_p{xMo1VE}`IgK9ioRoy*8hqffC{aehj^0!<9wG1E+s0Mx76gQM}? -zOagw}!A|3pDxB{UlL*L0ZgK)7XiSr3yoLQ)gH8-lwt}9I_MX-r7hY&BbO#j*i-+(` -zb+E{QGt8YGhD_IL-!7*A_)|J;>M=m;Q3n$=I?sx5GCGh2?}eX|vR3hH{>CzY3{m3X -zm+sG239%(I$R=7I>|Z1E*vDxrPV3-DQx-UkTl}X;p>hKFo&@VE=2x&Pksk|&Cy~%4 -z^o!EFmc9x-9^&bgHmh$ND&oTtVyQ9c;ECFFkScJY%rMmQuubu!bu+NqOh{SYPhLh} -zUf%dq2sAE>J2$77G{JvG{C>fMM?wFMrKf?VmzYAt;_60S2Yjd8DXTh_b?)$DGhg)P -zI38L6PiS2aZPIKh -zE!upArO0EoNX$h-FQdxqb}jm?6!hG87oXw>I`)C}phh0-x!vwex{S6u$KoAP!#r$! -zHzS=ru6K)OwvC7f*WB?2wV7I-DPi3n#aSZ8liJ%KqZ=%k9H09bM-8d0^l~qfEnM{) -zk=;66lrFoX4hw`Ao$Xq?7dkB#yT_m?wW6~#C#e2k7ugV

    #^pn&F^Q`Jm#_dqQ%lnpnWe34~DEfs68M)=L6Zs -z0xsAQ7aT39bUE)h=6AT@$Gc^=UDCy*&u^DPwq1nMi-F12%sUN(%PqdxnPO)qR-tN> -zF6Yy6?&V}w^~-u=EYiwhd7eCf=Y_hgR){96wu>VrTFV$JTu5#lHNuf*mQMhd`G-ma;k7#tD(F$qGDKN>b -zg>7f4PQa+@h&MNfEIR6Oye{NoE$lrTQgPIy>Y&fw8lS@#JPuxnShO4ZZ%p%PS;U00 -zh?(2f>J^!7_R|UjCTz4=e*}&tFaWsq67;O_d2&;NUk_s1%c?Ix^(EMLBxJ!h8!cKc -zI0t)bL-t;dSa}>ist9Sn%`+G9ujJGSwXZ%??C@-{Yj)qMCG3S#=wAsV%3wgL)C%8Z -ze+O$xrQoGFUZgo)&1gGdRsjrD74nW)d3mHb-ud#RvL{k@G$j%3O10}n;r)nqWg$;% -zPhMrjv*jVrR73`FUfi5w>b{T_r(jT-!{0YLJXin^tHn&g`l5hGcEsfXvWOX*n3}_+ -zq^Jhkg!DsWTNA`cd68{QHZ=iEegrg6>G`=mF;ZV1`@g_TY$J;U{jHUle{2d&HYbLc -zyq)Zipwb#zTA%+<*Y&jqU<5JUH`Md~#(F;3*kGo|<~n+8sio(ZI(luZr_Z(q2JC3! -zlfov37Bw=wsGec6mMI@o+Q`VVMut~5F{~=Vh@A<>R3-VcGG#1fl=I)hQ+ODu^yCTEg%TqkKB1yXq%Cw~Us5)hAH>)m06kdtgRj2yc -zAg*7oby$AU=ert<8AohB+mm5XRfeABwpn`lPD!lHbScfoJ7fegRldo{ysu-0Yw|Q* -zN?kgYdc08_1I+8WW5;3@1=w^hQ4^YLY-K$v1A0~ld|2W0VTEVz>z1>wy;Jxi39#`DBN$(eFI5aillM?Go{MMghsM_vph6gMPGmbOf6JIe*)%i@}1sUk0y1!i~43uUT6{y&X&xCH;7<|UI~33<6J -zo|p8q)NkG@)GvThOIdpL!-vLQtt9Cit6`rw+y;kMZUYQy5yuf5( -z1UGM(MzYXkVcy>9qtPxHv+UA@@_l;j3Fx&qpzmIve*0Rc&%S`(dz70Ad0)#hm90{( -za<$8QyB&H}dkozhF??UdM|(W_?se&>N@Xp!Gz%>QKHBFah{=cfn^l-YaTaFGA(uD{ -zkiHRY`Wz{)1&cj^r -zS%1M}lk8-de70WE2x2@6YduQqRI}_;rR~)X+Na=~4cCX79F8VjjwfAeQXVyFmzuO- -zCP2&Nc3t(@T9abK(JUK|d;E6HXRWd^t?HIdQ<-2!5F*R*DBY5 -zjB1x#s+S!EGjaX0%lxgb$;cR(+2ru;Mw@x-tyUlthyACovYEO<%P?)m|7tUCiNn}m -z9LD_YFnW>8$b}BWezX~~z~(Ew; -zj8vH+QfHK_(8Y8-3Wnc2IG&qy5k4q`)RlMyGcC{}Sh;DS;3UPZgEQPbIK@qalH4ee -z7?k3sk5k+-Bt@HHNp2h7#BIZMOmW-LByB!T(q>4STlBd8Np9$y;D$a;+|)b4O??vF -z+*i}Ytpk$WGBC+4gOc3(QIcDA)X)1UNt?k*+I*7awjn8Q`y@@9kJIsM7?|Rw0V!_Q -zYa6Jakv7NtZQXbCfHXG^5Oig@X;6k62d3lEx#pt`H<{49GDFG`sSF`)M&~yUR>nxG -zRy?}hdh++*JlNuvk8|^h#jP6UR)$!#kp*nH!>uD6+Kh0_-$}p{mpHUE)ERr&2%9@c -zIJ6yQ8>PimACD2RNNKTo;7gkazl!aOQu_Wm$>x#CQd}&anC|e@42NfDdp!5G%ky(x -zUi!x6mG4|$oA2`a0*^O-^y%`GOP9qSoqzRtXL&&P6#>0hr1^N&WhQK|W8H}ix^S0u -zNLHX!2v@_1O95Q=B5G}yi@r~-AClCDc*mpGvbkiroRi{`g|kvF?1(ejkW(3-Q)!>m -z*?_azkaJdKjtcb4(t4=LGjk;Eb6nOiS<37fU}PB+;GD4o&N|u~<8#V~>ZXVdCsM3G -zVN=lryKSh-h7>jgY>>io3Ray}K;LDJnjFvjth^i=c=_>&_L^Im>Z5 -z>&7`9y?!mLRKwNULs@>TPO<8A$hIr6qZSGhF#Ci}ucBI}>~*P0>idMoDt0~tXOeM6 -z^f_JN+frX5qfj+Cu;-%1+C7bwp7M+}D`khIvk@6DGzGAWb!YL -zpvJRtya2~kDSKF!MaBzg2;kt=h+nHy%&TyjRUGhriAB}9$XLV@O;Fz$P?rv9Xb6#7 -zay9K3c+u~>_;AR8jrB~ewn>CwB`oy2T$K8f@u;^g8f=eL7LsXM;o{#-*%#TzWG74b -z5l1pGx+KB7n{1}-fdi^$u5&qYI%MC`h|)tA6(=0_p7l9=88+9z@U01k7lurf`eHWO -zM<%pCxxi=Iwk%r@!pXFjiK=Bzi^tPEzA4MZYS^zbfD0j|=Tra?GPf|z+!Bw%Q*h*x -z-fvi01A~ejUfJUCLJ2%?7B+?^1JlmzWN~>)>m$q>3y1C%%AKhB3**Ak4!>@CZDlY^ -z@KOwu$|9x}hX!CiFNW7ukz5?|sNkg-9?yeHu}`~Vk9H+N3@`>{LY@&AmBR}a(5@<= -zU75@Cn^TP18S>Lf_3VK -zW^OC6Z!#~Sb~Ck(>37$Tn|4OIQFbQIyhv^Nv-*UKGQes+`Jz0{=amhNHEK*F6RVSarSN<~ipQ7MbJwDr -zoosRH4*=5wGC6=*rZ9iTz{|bMQrx#Z#otz>xo>6KK+C%LAMfW0$&-dEQJ8HA;f=fxQ!_In}>IR$A28Yd;v#dUEvEYQo -zl*0}qwQz8kM~@1Rcgh{QlsmjtX7hHLjl%w2)mA23S(V2Jm2nlbaxMz|zhy%AvT%iT -zES5z~i!@!{RO4Amtj5Ta)^n#%k1C%Jl(i{$d9U1~OSx~RbD7Uuf*I357PpWIXgZbT -z;YLT@@0(0bM}bbRz05S1l?QaJ2xoT%MxO$dx0*lS7PuJD$t{-@{FH~htR<8>n$dn2kC!SG*w^I3 -z_j+t@%+JvMxlz6)4=@VkYfQeS!f&>ewO2D)rB8t1t@m=Ud5SC;Rz~$C9(Isa7^tvhyBm&wH%Pi@YY)4uJ>;?Wpg=~pGAEafQCpcp{w~XMwz4G^c}2$K=Tg^HFUQt0 -zmmdo}V=en(o5%bu4&QIK4a9uYtjNe#<}hom%Z$|yQ&zf6TJA7mnafwdx{O`oGUgYT -z(LXzk{K;YHLYpBA1u+(bez532-=gn#4!yr|=<$uq2Xh^|&vAI~YlnAdJG?#1q4O+< -zw`MwYn&HrKx7&GpQtqS=a} -z=5ql~yo|8zXEt}rUN%y7%xX7_FOK6+^;@iE&5BGu5T3J}-SSDxMYmw)mO)u=9+=^l -zkK&2dmKaE>xOC}SRTi-DU=3^;?*=J&h#qYRpx1aYlwcT%eIDwWRlHCelK -z{PW}T_ZjQgCpK+{! -z$hY|0Sew6p(&XxV$*e<)v?3UiseT -zwI5tM{OIz=PcEH)7P$CyTkO$oX+Spx^H;j`Ta{t-?^oGSlQLV^WdqZ0lB5@sZ~)gp -zD8FSH3#j*1mm5%P2WIi2*|x3#w?3t}LeAPgXC05T%8ytf7Y)b+oXz<07qMG;>3|DKSA}mI2Y6))x?(4qPk=S^aUzW3@~0U!0(1Ri1AH5vgLbNUWj8y -zI41Yvkn-TbRrr0s%e+#-OUQx}pQc?{HCO*&joL2c3_m9|M{Bc!|}vmuF0L_=2L{df$#I6mh*_*S;3)mIr@ -zYEyJE;KWrpaRK%mkElKnap&;WK4B -ztlnvxtd25PB^RN8kxlz;O^n*>QhXi`NZGjvTWccb7dobjddu;U>e`5kT3A*S@rl+o -zZ1;Gjz~kk@xU%?Z)e;x`=AvJj6lGJM-{BiK&9HJ9Q3~Cp&XlOsDP&YB%r5qsQ35kd -zV0>xFgpz;>#n7)f;^~rz$4iuTfhP>SNNEXZSK{+ziATHA7+{_(3wWwL;>9v(uVt0x -z(5}+wsU0bL7CC%(3_jZv@#@wL|J?5LfGU$sij^gR$mOjbYE9XH_e7R-rLwRT{qUzbweFpH`Vg~rUpLT(h%1zYj4c92KsMrU~o}_ -z!9|S>DQ;j`aiarHxD$vcIlKH|Juc -zx@hiOo#wtZ8UD69%l&IC?pvMZzBM*~U6rNn@)W9FzI$1g`&U`C+vxJzHj6=(4qqSj -zSavGS_Dh18EPESmcGcSyU3K{FlFyH4J!aO}j60ZR_+FcVJ8gQFX6RlTFTNCrC=2sm -zxkI-Kmk%nHlZm0GTV=pI6#<=P?=p5WpAMxS9ZDTKmO8vyrfu&&?|)8*|7C*BBO;hH?oTP41!YJRiCCqHi~M!)@#5&4$W{%Aj#kq2T5f$;zFy_iu_~a0z^2kS`4=^j#lLS1I>t(-g;QpcrN=u}xdoNGL$fC)UQQ_`CZON` -zfc^(U1|A4oU?#V)vX`-$Ieb)Y^ZDL@NrzzkVHmd0rSEQs-g_MS?s1y|X7FB@A$xs> -z?+qBfPl0~d1p2iT=Ci|o^In*7M*_@lnBzW^j(bcw?lHZ_XNFqIjFrqaR@vMb6!e}&&G=Zn+(MGY%`e{pTgPzWn$FoS6=5*Wh`aB3CRj# -z4jYIGIGGf@gl0~d-3)=r$Y`^5wXB*alKg%o&AMZb*&DO+u*d2nk;%oZKjg9Dkj>gd -zE~^hpjZs@!tjMg`olY^{fbJoX8F=rc)@tD5aWy(s2i7RZzEwlOJSDVk5IDGbt&8VMkhW+F) -zWTD02g*G28uo<|(rr&&<-t%pGd}q`B8;fr9Y`V_1cz2G)J6~J8J=^B(*{*>Z0gdL( -zSvH+!T6CIW(P@^$8#8S>OwZDOT88%1vb>_1p5Q*f3V{Nm$L;E{gYMQ0aSO#un -zJJXoT=F!@;F1u0IG*jI^T(+_dvX{jcGmAE|EPWbJULD9EZ;>MNamFYtHw{js(QT&eCRRl3PC&$RueqG|e3&^fNQG9i61@XARu>S&}@*+&MhO -z9Ya&xrtdQ_MVkR>11?fs@*{W=wA}tlJhy$4%Be01ZX1%|j$ujjJ@kEU|1|#Et%977 -zGG=ZYoJEtrefyv+n*8nj(fs^Y&uP<2CDD5!Ffwp7B+G3>6`t4o6{{$+dZhOK+DVDxV$hwwI#)Yi0xoG`p@9-zpa)#gsENunk9l!`Uw~sWFp+5+tFb`!$p;$Z7P2#r -z$2rI1oD-`b#}bhV>!0)@PWuiQ9N)Bpot1jg6tVI^1KTb}?9RY`C!{jr8(Y`!XJPeu -zht(IetTA=-@S9r4E?F$Cg*k^Jv$*$Yqf{i-Bs)gYIq6_*Qff&%X9Y%;si+P3p*qRj -zUA|Ftw%5ir$(!q8%x<5a+mb9g9tZU=+b(Bqms45ovx$`gS?p>ZmwMYXd5z0HRG!JO -zdG}?G*T-cCi2xF=OUkjxnEfs>s0dCpwjY_1BGWQHwjW?yZVWG$Z&a|uNm#buWo~)E -z)B^avB%<(?$`q7&v1m+1@#4u8)MX;B+71ntZ&bDgM3-+v|nGx7du_H3S1gPPMr5Sa>8ThQJ>vM -z1CE?)||Q5N!OVTR5HDHa@pul7Yex!LB?tv-)z_j#-s -z9x-Z5m|KJ?aEVI+WD#qpx@T1-7sV=!cD%GJ@Z+lF;<$Gu16Wx?RUV -zjS22Yf5^Z*vPIzX$NT<}joAwS+zJnGiQ>rtOAIY>6Pc=&H4mEF<=mc_jqpF+e!ogr -z&HCDAfDyb1Xmk|R2w*M4QY^fjVu1<`Ju=;nT6pegToTP*KGud0PBdfqg;vZhZpX$dh4dPQd|4}VP~NOj -z&}idygM$7Ai(rf(tS$oFKLS2!WW5Gpud&{LB* -z^4tUiJXtPjz{Nxw|NV7xI{`3ZikK)eiSo)2VB~qB@1@woH>H7q3E_m0LU;*_F25?| -zni-A!=CKf9*a1U$;qMuOTlhEVUr0X;P5qAazA!eKJukz`5;4h4CA;LxN*Mu0l$a|H -zCSG+h>57Mm6&}V`I2dUU#s(+QEt&4p!c9u==KpHHkGcdSNy(S~<}T!&NfV593NQ -z*};1nhZ7w!$q$)K<{&KrF&P~YLr;v0bM=lyEE8f_cF9O`G55DPC~tL8ArNECwKUj< -zM%!BvAJwf6s@s(8uUE56rryWt>L^mKwIi+C#qsMNQm%VQyY3_9D$~joj$gAyjX7R! -zBl)u3kyb{C;jr(Zt4D?)b0Ci(qp&Z>7PCJM|GUn!OU9PfvaOjmHnT@2Lt$gO0t+$! -zNO7`;#ZCn(Z -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 -z0T~S*(raTlSFiD(?R2ca0?f^g -ztK_kTiaHxiAB!m$QQMNE%>*$UPzqwuH_*c9WCJhZ(UKk*584S}v7}NfXg7*_3pja; -zW_J$@F1T2k7sGiP_S=DY6o|F?Xp1r(3}|lm&>o4Q&9(&$Q*W{hMdAC*cC0A2aIX=t -zY{n!j)Fwg)BpHnWWBK4Y0fxhKsz8x=fVP+~Wt>!}CS=7h?Q9Ge>w$_UAD8a|m#RHf -zRsvPGHE!21bqv^6Xk%J-6jSpYEaxg#E~M3d_1PG#^u;I%Q<_=?EX?yTnZ6VT9c6i#Uj(cw27W8hSd;H#16Rp%94spgFslFp -zJ#QCyc(V|ApQ~d}tdALJA-r%tWYTLP@Htn<@_|qC9lUiRhS9k$4&DMLmuh@)&cYk# -zd@vP_@bXr!iB%4j7XnOZ&hH8^0xwKZ%k}X|ejpuxjDZf}<%0ygyqo2V@t+W526+2| -z0hq4qWPgX2&;w(Rou+=OFoc+Jg)BUV;1V7QFkK;rAQR5NMy1zcM0%~1Sq>41sWEfLj3_cK7<;xwyfI8Fo0QXn$+^v#oNM4^dTtY@iz*Yv -zBFFR$-z7 -zF!aNO)9ZK~;q*Li;g#byUO67eE5~CUL!jw-f+|cLFQvrLov%r?@%|~csoI!aYGL&? -zg(G)8WIl9}+W-`|1So5DQP|?(Oud6+j}-RbQ&@A8DN!{1$1tfZj4YwXCKMWQrMAps1M8FOxX(oa#%bBGc)E31KEY5@>jCUSr;a??b2w#{i7+k%U0- -z&quc1o9SERbN~*!SHk%_xDZZ6MJi+nfs1bom?#!Pka-_uFD$z=ZI`&mizs -z5@0|{fPN)h7jy7!u@-;{0V{+y{$2zamRJrb@nkw6CIK@c$WWCTRAP+%qQsOq0x_e? -zG{#=i7+=nnGJ=f81gb3+uE5H)t1hNr^EzhcRS%pQR~Vg4pm9ZY;ksD}H3oDXdCtsh -z4#Gq-LQKahS!DuZszOhU#_u;ZR^N89hAK>#ewa>(VMh$(l?mq#4&2v}h~)j+XaoyXKideZDYeJg|#PbtUal*I!$3^ -zs=|sB8owr6Sej&G(J_UENg4}|Y0UXcW7c6?KxX -zZJ9AU;{r1@|Bu|pHM4|wW~+r^TdB;%WjbMoKogFI!J8EZZBZDw*+&1(7QWxC@ZDw` -z-)^$-%_fB}H!Ae`BaYA3S@`S^3m>nIVOZ~vyi -zLd`dRV~L^h($M_fYe@_}mc#{U_>Dhfcm-@0#^qw07u;Rvr3EojPiP`1{Jgx(Mvvt- -zdM>x{@~?5cw3rG@R7~eIpVN3w#l@_Nh3j2WJVywb8NssxFCn;?BVpy4X;Fa|9_5_R -zn{IqAA*?(vfdsKcI6yQ3T5$m^dTzMBX1q92JTr@+W0V;J2m$5U>1O0S0VZ9~2`r(? -zVj#w-N>q5d!i)Tlb1l3y&z1?HrN;sbJr~5$YoR405ywkAds(E&l>ZhhY?(J!YWcSb -zq2-O0alE}Mj&~Tdy~dJN!jIP50xbj=t{Hx@RpXoOTA=0o-5UM(I2gFs!C->RVGqOq -z3NZ3$fN@CyCLGt8cr1pWGc=~AMX;kVBH#Wu(I`$czVZ?E1DO_=t6~9KdMREWE*8BU1PmB>;cAyMoiE~lNdOGN#K4L1z}$^!aAcJ#@faVkQB2^{ -z272NiYHeTMyTLVH8Fss!sBS^VU4_eSfppPSYagX;0WxcW>Ej+Xp?y>xmp#a)Jt>eq;+k*&j -z`C$Z?9<D%U`W@(`*iOdR8c!1DJa0fz8G6((*Og{IZ@#HX_^Ut_^J2TQZs -zk#@&HjjVeGh%|eMw$QvEpwXf!-x1}6|64d+6JT~$9D~j&%(xJhW_p51L}@g{6`JBE -zHH`{f2rmLKwhyk4QGqdV8R9R@y?=bJP -z-^GB-2Z^p1_Pl&v4184t^vUz^!37@!^AtAS0Dh~W`96+UbF@hnJD&g-z9-YnvIFUk -z2^AO~*(F1mVGseqg)4EN&{M^vVqIuhAK`7@1Lr;TZ;EhNagVaG|k3&6xYcH8KK>01Zw4gqh4H3_I0~ -zp(mR$EVBh8Pqkvy=@wZn8-KnD6SJByA-fqr<+Ndv_+lC{EvHd{=9j!Ue#s+Aw_#d- -zE2bCF?B9Zg#jTiI62r)>C_X;Xj290!!-YX$rkkE%Ztwu*77Itj7tBUa1aVK5pTq;}N``7R9^i -z5qxvj#@GUd*_UGY5Sr#3+v{aY039c#((Ug&qbMx&k8fybLHZ-j^Q=9dIpe -zOo_tyQjPItRAgLPFB@IzVMO9R2sAYQn|V@2>F9+?q>zOd@?GI21ekt=7N)34YFU>f -zjqg-nx&TcGHcuW26oeNx-g82j=~O`o9Q4qH)74`m=k)XxxE-(~3RNN{jgZ4(mkSjd -zLJpybpCN<}ril$mfJg{f0y>G6xvl`yRe=!|CZWi5y`O*6ABtTJDd9L6R;n?gOk>nV -zjnOQsyu`vvjh`<$m`qPgg^MXvU9M?Nzos$sn#P<;7qbOQ9L%nCG4m=xB{3C_K+Tk^ -z4yIjmLHHrSaE)yCwS)>&>0(i07GHO(b!P}tx|Uksy`FEzU;Z+38{ -znJZ;3s@pu=YIks_oxT{2I}sPRBfQVWU7qv4L=^KaG2#OG4;-ATjw7`)j#ODIQ%Je) -z2+$m_ba4Et20O)a)}PW?ds1O_hQ{w14t`73SaCvOX^O(q;~I;Todn1z%sWb$QJ8(is4_DS -zT9|&o#>uL(8feLjXoF2wN?5_-dmqo|!&>STJMb({(mJ -zU2EZ!wFYWFTy5dQH8wt?KVr4Q`>Pb*U9DsV&8(i8wX@gR%)VUVwPiM5Wq-(0GfcP& -zr|050dMt{8$DWHcdP=*yjUI%a#4r)9`vP9bTaujBZEj4~#0W5ExMF3XpxdlCy3LH? -z`57@hH{JM6jPHbA7~_X|Zblq332zGx`h=ox^9U*NE=o~U0s&rF$bbO)Yp52*@ccX` -zpLNc2O!u12pKm@xsH}8dJqy>~_&GyJd0~zX`Mk5@cwx4M7v~UER0psST)NL!=sw>@ -zkNGxwE#O$_z0krdi!8jl*urc4o6>YoC5)=d?>63CrSR|7${bfYcx$zTw^wVtvsw$R -zyuVK2gFh5LTyG`T!yIru?5k}KzTWQQyPYn+-|eFR9v1`mIr!m#hoJ{Oj5zFI#8Hh= -z$qvS*xcDi>!;}*arlquDekRS^F)^Yy&?GJjOCYW2Eq;JD*F(GKquCDxVCa2m_qa}G -zqLN#+k0z=twu@TZC@zE+4grQy!SxELqv}Eff5OBsKA426@_^>}M07IK$=Ghsp*cKM -zUZ}oMsj0Jk)G>zH1FGWz3Ts`QyKCdZ-8inadw384_dOO?0@?LGG9PNBJ=93A^^p45 -zM{0LLB$*mGUuaFs$1O7;yHEk2&XK7<0kHtg~@s+zI60 -zC1M3=kGN=$`e3I^tK}eW6I5KZ*^b=TMlX~y5Yx`^0qx^PJFvb&VfdL=?7!iox)Hd` -zxa6B2N~;`PyW!*RV;5KW?^6ye&DNNk?_o&+@M}J>G(W(c3l5f?w{ZTJCsEK$yxdwH -zU`S>Qe!Hl|^Hd%4P~GgKx{m&t0Lf(lFs0G||4S@9%=c6~Ll -z@+$DddjES1#!4O -zDx(&|Gt4U4kQ22Sl3Ir$RA4fiFeJUvoHK5jYh^U|XEX`83^~<|!GxGoEf{{P1tU(k -zB-EHjj62tipR!spKC2ZIvs-1IY)W<$Cg-$bQf?H#S-C1HO029N@NuAS! -zYh+S#8AGpRvr5)0C5GN7Ec8q@(<_Z2W8sxFf{a4%RE1Yl2{E>L&WSjBro`~t2^;U6 -zjNsGrtr%Jm#rz5z+iz(k-FJ}F=%cvBL20Xvq9&RJjd$Sq0|$HWxY&5p#megr7GAL> -zig^ORtrvJ<fu@VbE*0?d+*buub33M+1Cth}Km -zUU}Uu7k|h)nUnCuIM{L96^Pk&*MUIHeHRBFxW*Urz`?PHjwmrF9(f6fad5KM6^J=q -zt8ung<3gQIs4joJhlsxx;Y -z9P^Fqy(rJ=kpY-oR#c;rS>2AbN+y@tI9?SX`MQgwN(V`m%FI;<$rUb=%Uww=OS-Ia -z?4rieG6#Q^I5@)i7Dh7&ARJjgqnAcu^bUp5+Z9GK^=ya2 -zh#d;UcGwua-Np~w<1z!b+vvAlq2G2JeYYxnyV=Iqn{0f&(ZW~j!%_HRy$vRt3CygC -z3)pN%Y^F3dn!m}WT7Z=9yBHwdi3@jSmx^ -zmX9}@AcxO3+eT^Ode{yJ-|u!XfV0=dp#44u9`Nu3J6n!=7I~P)T(mkG4a$+;k_JUZ -zghSPZ;1ZbiFCp;PNO~ldlhw284Zy7(8bm(8oRD|I8_6r*K1_dD4eZz -zaqJ!=;Ef!q%?wwkGpL?Y9k(MqFg5n@IZU0Q4Z+qA(Y*V2B@g9aJ^2U -ziHep(BfKjB6Xp7q4Ol9W!pb;T!dOVj$YfDv7^Cb!DTTPwh-hCF52ambLNCW~RgvaD6U|E)fspmY*$#L=5r8w@! -z81+m;et>8+Kr{xlTOQgi7jf~wxQJO6+O(3CF-9o2F}9f?7xA(7Y8+$EHezkLFI_AT -z8a!0r@^QHmsJy}WWT2|nM^c50-*X(y$qq0tFTkQ4hyi|nUV!=MDXB*;kG7}M40^ni$*8nYh508X -z=3f&|)?tszBmezzJyq(@;=43O5 -zoNAI8da4P-Pq)ZO?DFYmj6L6u@fX@K{z7ZVYFW5mMs;RlP78j?ZNuc;HcZKD6SF@f -znCIlTU}ixSzwqKUGm2OKYC*RHonDx*7bfh3>3-B0`lSyh^ue$fCOO&>soXO;(&2~c -zO^8W};gu6{yqaps@wGHt&Uxg#l5V3nfhI8$0&pUR9;p$$mL9=JC!-i}t{oHdqgZ=g -ziWy%G!GyjV^Exesm}5&_j4v}Yw#>ngR0m2l -zh8HV&EnmY`HIA&A6;Z9=T36?47uA<=b*yiJ!uN&xAEK72#;`Z$NqCX9vW^6^&@Yql -zlyvo%{7u;yQ0gEYu4sjRlL1BS!BJwU58)_OjKX7wa#X~)XTKvF*(fOHeZyi(zIXWk -zp-I1gAyeHFAk*P_q4y=RE>`NwYs_o4oOhV{OB_*Q!ieQz7d?!+;zm@bEmLz;K0(BM?*N -zf_@m|iP56M5MqA2>4*v=#{NV{%%;J@CX6 -zLtl(ZD031CWk!i1#GI*B60>~1UYn@pMi2RoE(#i{#yAjze~Xr+GIqw$7gOEtO9U$8 -zmU%%yHHO1=k??l7J|d-jdmQbj3Tv4Ng<|y%yk#Zm9BVXj3SdzX4oZj -zStIG9#<4P%Vmdffq5vyF)V^_`RO4W=gZ+i3v}_kaMidzb+jCrO$#Ssati~T_G}fIa -z$k2j -z4BBa7;0_A|ci9-QL!sX`3;nj(_+D1d9Q56!@!ckkZy5?89vVv$&X{u6hkl7awCSDU -z3fdnQK3ZqvgEcm|ZuZ_PuAkX>|96FVSK4@oP_x`h0FAE1#!td?vj!JK&!rqoZgcgG>uh0Y06i!K5Gq9Bx>u;4JbBx|2_uU+FLPaP -zAv;*;VKMzH>|p7!(2_0|o^uE;{QJDNlz%IQ*MB7pD*SsnV~#ccy~>tumiO0b6LY+d -z0Syj5S+DWw21n+zjT(J68Ks53man%dSr6;GOQGK$4}JGRd@X|+easZG!!AY~_3>k} -zk8vk7#-uwKneO73Okj3~jb&+%arT~vS^$k65P?azV#1Y}^Tp>vuS;TR+NTdD;eDZD -zzmZYD%9UfY%eHtkO|lB*na4W-#uLvA6&LzpWTlKNVN4W@nLZd<2h*m1q)`El$^cNf -zf)>7xU~|s`^6$rxeJ6^m&4eDH*)jf^i!DZRq3S|#NvjP+b;)4A%L5b6bNsO{F~^7Q -z`Pg$cSYuW8001BWNklN$+7M74S@iG(c%(EQDH{)|L}}n| -z1gLlvLv_6+zek$}B8naoqrMPa#QQ@3OJcej^m%S8M_?wVjA5R>7e_mYJHX{8U`<{O -zbIwHYdqD*B2~ib`L>#oW$I%qkXp2MA!{~qEs@MG(u&+X6(y2J6oOiJ}%f`_wzW7NZ -zTqTs}`w4LIq@VV|S4whVqVRp8Ug}DJ1<@uPI4@}K=vE+i1Fqdofz=IgDsw^hgsB0=* -zTxY0VMiOxW@IqnD)8Gl?Xg4@zLjEfIg+bXW6XYaIoM?fZwWse&=nx -zbtWo3F#;-y6|@jqx*lcqEdevUUslHWI}%Em>ctu=ZP<{FP@t**Oij1f+gd4^zCls0R7>&X9~|Gh8oAtdw!BES!;NTQK@;6ULoy#ZMPn -zCF7d_!~U2F*{ztE(~1c>Etrtoiivscn8cMbCY9wjV^$t}WNb{#Qy6?cino#*@!X*n -zJayQ@^MA$B{YX1{9BD`QzhZdlm@UPYvP#BMOG3>5Pk~G -zvUh%jqm1P^{ru84)_ -z^bB?VEatO1=ug!o0WINs5kBNS`B>qT6aEasOUKVIb@4;TIC4Iu%=E&Dkw4K9GnD^6 -ziDWXCU2+(+Om7TJD;c%?bGd_w6&jPTXmCZW!`o8n3BW8O+{zd@At!0hrz!lN7Ot6T{CZqrNwUV`ByEiUN0s7J4Pne{e4S!?4X -z#_+D8mqz0wDg(bOyd&NjEf?Xu80SSfJ7}bbMm#iT&5Vi+FX%f*3Dn3%{$c`8=USS9 -z9`js+Pj{x0&5PsZxp8!#W68Wcmw;m+hn^DiJi<#f0V{EdiYBZOT6+B&NAG23!otrm -zsDRK!|4ENU1SbPpp?cEwXnu}?tFCau*KtBn>Agft4~vvYE)JoNg_0)D`i*4_PcTE{ -z{X6VuS;aVP8y~KBBT|N*;bvf5<-g{ -z4YW{|;SgM!l?V2_5MV-R;qeJ@QJ#Q`nD_0@bKd5KGu0QaiE*f^aJ`IR((D-ZrJn0& -ziiubnEtW4{z|dNwj22S~5=rIea6 -z@u?3SoT%a27;yL=u&YAhNOc>^VlM9Z=D#tFdgoL{T~tSGFaY3k3^;nj#r_I~jGF<@ -zKX7F&jefzb24KqrVA>@Y%P+U1qSZl*Pf!8wwQJmqXh~3G?6O2eTl}mFkF9@YsiA;1{r#p_5Kvjlcb`j=(7@Ywa@LjL=?xzxs- -zvr(+gZbiX=B8#~u$iHoKG>X=kgSJS3wg?buqtV_Z!yT@4G5xHEnR&p1Y#TfB+eNit -z`J@>9V+M5EEk~4>Hp`RP-i1AQ+z=${YtS3xWU -z@8;NeJI9gY%Xg>{5wfyP;bhk`%n)R_`o`Zw)D~GCGa$p?kpM;I<^Ky{p7g*liL7%B -z#88pxoDgP0aQUZb^Cl!XvOU+sdeBCNvk)?O9E&JFN7NcOb9YVPqtw2Nu$PeRb@t;YQ(71P5AL_vw#fM -z7?u_NoYf*TF}np5I63Y3IVXaNIqjIim9o4RSu5je8CS}F%#Pxd^eA3BYz+O+ACBM! -zcEcQvB2;2RPt5-YFkMv`rjvy#Ob9Tqro}n{CIlHdW>|Pd;6~x~bQirdJiL&h@j|A9 -z7c&)JI~m7EC*%0`tj14yQ7pP_WAiOX)^Rc)E9BPOC~i_HX;NT^Mph$N%q%27G+vnv -zHx!m}rHB`{7d3t=(->XC7-d`5#6*dqzopc}@G?(&NQRbr;4t0H41q*pFq6-UHHH&p -zN;JkX-ua@7@t4?D;>v2%k9_}9uAnIl7Zpc|sxydvC(?Ohyfa*_qW7kMu@ZnG%n%F= -z)R+Ryeo_Q!?hB!z>#^%=y51jxO!$5wyzuys03&N#3G;jx00}{aYh44Rw}z@uC)n`w -zi;7chj(k1=W=N^mF}!b(l!bOa*QhN9R=S=WkO^ay&A-WrGGpWq0cONSSK^f!vD^tU -zEVWFel$E=Q&KO5h%BElCdYFs3m98i-MpYq{7*$1%)h-rQ8K~jooF@Us1G`}eFiUTE -zSXS*}IpdXYIL6d})4`e>j`+7W+*H^k5aVL|Z7MKkSa!*w5)(qq;Rh~`K43zbBM@_f -z-(n_WmNOC%!;~_XUJ_z1)EkJ&tv9}yq6XaoG8dbbNh@pRYMEoy7)B}+WZHcJ7@GY< -zMdoh1hQu(-<7PkncH9#a?bVh5=Wp9ctEAaqBc)0qIT68}%=NNs4wA3BNWS7qa#?43 -znZjQe9ULih1Y{1BxHwSaVNZdB-So%gIoO%&V0*5Et=SGXUr^Y1UOxdd>$qk{zf7is -zH76acO4nGK7OFEE%a~$zoPHS_3yxWse@tO6*UZE-!w>+CnT%$Zbu)$OjA%{_W16S# -z*ObsC?t -z!F{#D2fX-RsqxMV2XC#=cyqbJo6Bu5)l4PLkIN%&>V36%R|)lrBj68rnkF^Smdto@`U07v}g#pgyockmKJuCco2{g -zMMnFHl`(>e83QdwP2qi#JQg>K43!wJi#2P$zmFCcU}_gl9LGnCV}5R(4cuz=Q1&Q- -z!iVjsY&8l8q2__*qO8fq8LBOhfy~DqF4X!s{RlYu$VXZYlNH(Z;v) -z3#T6VD7S%|p2khv!cBf*(gsn9Z(Ba@TR=e_aPYdu{_6_KEVz6e;KV~8r)mP6s{__m -zd6-&gW7Bmdt747x@=P0x(-zrNf%SR--T`QXyTQXrQ|(I>VcgV9%h|x#rhH(1vLR8EVGPj -zM6Ebll!Nv-5N-EiMKo;o>qLOm8y=>g)tE-5AY=vbPTpYS&p2wBPvIby6c00D;^l`)D%9xL;dX35^ -zA0>>&zUbh@C5^IsjAsU_>VUJ4fHmbdhUM7kTL78w3QR;X;e|>IyHG-f;?qQoF_nzI -zIX)Jb0`rRke4DNDX^zJDVqg`!Uh;s|g}|x;sxBT@=LA@l3oPU6m?$_N-p}{&KG(qt -zfe#bvhxkvZy5s?$mjvi@iECpFM>2(#?=aA)NMY3_1`W7)KgYtG`5r#b2j0sK@Ncf8 -zQ60(wL`li_#ZSZd7gcu%Wo$M??XbGnST+W!1O9D&?FQ`zzBL?(i#%*QjZ_f>oM>|y{wLPC@)>s$p|uo>5n($^uNhPGn`CC@vJ5kZaamD(nI6R} -zM_TaQktm)$8b`OJ2wwWDMHHA2U}Tl-9~78>0+=Tt=5GM=dPWRSP8@HXwD4-CjaRA8 -zWIE`5QlmH5&C=s|{iG$yWnW)V7*$|n<|T!7*KHiSOEa{_xjH78xhQI4dXqwSy+Yq5?7O3|<(7k0l?n?PpUYyzQX4;&D2yq#@gu+4r^lj{J_{cs%X|!{VZYVR#8)Ma%2QU2-t~qJy6=YKRXfv0^5$MCd8j5+Xp)4WVdIp#g@0MO@)B -zL*;{NM+hc=?@I~Svi@(6{fd<+Fgy}qLg)|`q~mvT1wKM(36G(o5}NkIBR@l^q=Zlu -z!d_<~r4Ono^a^nXm6#b=tUAuS0?gnt4^&?`|1W3n`DRs_ZvFPZbk5%U-Q8z*w-E!V -z7%+g6bB>}SVgwZtB!eiKB3DsV&N(MC6jY>g4r{GB=QGoIuW>(fRxQx(_nhNPScxwOHOO9oI-g*n`0<7l&uW6cW3nk@X* -zOeKaf%SDA``oH&pvmZ)V1<^47YF+1RG00 -zX46?Es?7Q`7FM6LuO?1Skxbut;h -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 -zNkl%69QidAcPGL -z*T6UnYBc1;t26w4a&1rhUzGeF!{4QT9wiB6Od(^Oa;Urryxh>>LU@sMGWubHVP6c3 -zFE`%eN}2A3nFJZGjp_9;!V94#gcQO_I5h2t!$Ql+`6IxvtLQ+JjYG{2js!)QV(kAn -z5W|%+ftU_QASSU>P4va2bQ5A+G0YNT!s5%K9u{9Jl=RvH>Xm(JLXBZk8ND%5fXVI{ -zsxc!j8b@3?nc!NPUMiX8(Vy#Odc{m%r{TXX;-Zbs)=}Wb5Kz)?Bkdl$WK5(4 -zT{7&G;cD4+&Rqw|cigzuGDl$MN`qc4yU4VfIveL|tO<}gU8!)Q!p8A(TPrgqHhwQ= -z`?G~(g%*w#*f^SJ<4CS8y)sm1=$qNgZW&24v+%QcX6y;`KLY^5VR7d7i3&TeS~4ur -z+8d|oNc+F#7{#{&E^CfgqRHp3hOQ?ti7nP`hqbrt1c>pLzp4l -zEIVfeqXCDv%Y7FtthlIT2tA7vY%F4b$Y~{OXS0sQ@cyqcyvw*|DbiGUW4|pRBgX&z -z242}~PLwLXBB^E?WLTm}xZzPQa|La;?xWEs|GMAg1(t69%=9yzfHn~rAW9AaNUy1B -z^+rF2-6#Z;7k<%@^5Q-dFYJv8xV&`0fF27|_G`G|V>tpl{JHqoqnZ>HM24^;o|Qee -zz>2^Y-#5E;_E~r(XugmC+}eb%4fs+jd00u*@jJ(8z&9uQS!SI!!TIovg^$iE%n@j@ -zu^@qJi-V};KlsL`50syJ6D1n9i=?t=~b~1UIcIg -z-wRj0!eR0l{VRRSpHN(=yvRCOux`fw80nC4Sb*th?~Uza+|%*R^ntJwggq$tddKlN -z;)tI@-oHz43~+bQMPY|RPM3$AJ|HIqm@We}>$Be_rOOk~UUr|0oB>GM*ohm%V43B8 -z3uv(zjja2r?laEahJ2G>G3epSUHU8>Tzv>+u=KLcLRzPfG|lSJCQL1;}IoYDOA;> -zF&lQ&kTT2`6Ub_I@l!zr-n*RBZen{ -zLq&&hH0tRX>+dQ?urYTGmmbmg1ayyBc-#-%XaaI-ZIs{fQQHEXuQl*>fej{keO2yZ -zTcwXJB??~@nmASGqji+NE#Sczu&aCwTk{5y+~P=w*qs3fw|YI)cLJ%mU1Z$`8rodk -z>T~drs$2`Oqrt$3#bfxW#K)XcU{;wYy?9*RBEU=!;DylgdKDEC4Kp*#T!EG!8-Q;b -zfcY%=E_3l!4Y044QOTZ^f)ZdD^SqnsW0k-+wZOtE7jKlh;xo}JX?jI%dZmXqsyw_| -z!sAi>onw-0WVf)fSF#x*U%vV -zTyqoOPT+HySc41J)!6$I`eFz$ua``atJc>vj#Q1WDR3p<`Cv(4NBxPdt;X53}HEA -zmve`(tZ)d+ibk-!a0Dx4#cWt2nAaAKVs+6N)|8H7UFj&eTJ~w#Ft%{YBUn`&!^|ui -z{73O0mq+n`Utz@Z82%$Mg8xd=BMMBQzWhz1l%x26lJ$g&3>6ry!Wj4mlgUyH{4c4Aq&;7@p5G@M5NgDOoYRz}s_7Jd>mFj~s=6W)pBMyg;u^ -zP7E`P#;~M3iqCJDIN0RkY`cq;ZW{%CHp&JRX!@rKn#xRmFN*{fu68*%)o$ZxE8EsB -zY`bgVlUq@2Xoz8Toh2}`qBe+PuCXPNY*`I^VO%V((S8~2`*1K{R-kMwsb$)kUN2*6 -z*6Ml}Ya3jwzd@McW!|P?hR?l>D`|mxK}eWOFA5FI)-JN9o21qKzdnjA{&1+5!b?A%P=q7Sw8$ -zDufpebD@I5_+v*_?N-z|SVnb)p$hTJmh`^p^|6IqAq(P@`FmVir?9kM&oV|S)Bn<- -zu!51wgq8;SkT^Eh)G4fOP}4#}@ak$CBubgHF#{^&; -zStX+ibF$6BskX^=vJ35uS!P#^UMUNsmalg?NbL%}F-L)Wrj)mC3L#hOx?AEpyN;G0Rk7T(php6^&L| -zHM7wcwa_%~iz4$N0#tUG$b2x0^u{Ps8*N-`bdcQW;u;Gv>5<{w){}JGM&d08mv1__ -zd_&Kr1{>$=6cTDIoU2hdS7YOJm6D-nMz5OL(kpYKL`gyB?}ZA-@>!Cpf>krFn`vcc -zf2M`K83Y>bo7t15uqRbvcM8YGt`vn`*KPci>|p0L8$Tpk_&$kXLxsk`*H=w^dBwuE -z%L-dBD|}8b%_W7;E?L-o!NA8C4Samb!p2J`He9x_{<6aQOFUZGa7AJL6@_(I71mz1 -zu;!A9)fe@wy{xe2iZwB-E}K|+$&w+=EWe$m>)pEU=7mD$~#Q#obT82#YrfKf9QK -z#>)gEu4XZIn4S_w4;z@W&&10IEWCWs!Yc<2J%^&0dc?rg!zQL4w(#m9KE}k9eKEYW -zp9Xry73=rH_e1sMRZ&lDxyv64CAKvS@M~5QkcRUhZUwDGG*R8Y~d{y -zj2^Y{?yol9J*M#fZ@N@+=1GMQxw>~&VIB?m2{vY5bTI#dgGCoyEWhAlTFFPQ# -zti0x6O_IWf>n=8>`S>`)#pWyrpXFHiGS9^J{1|>L7{m4Z23i?a>j6>6L5$JIjN$dP -z`99*hh`2T)a$*dO2c~?TEXFuwn)5xGVKr&ompEl6PC4|WaNW!osNs5-ULB)(-xt6L -zW0PqRrxG*3u^GS2=i_VWRW>{FkftfKz -zS#y+*i{_CY7|YP6`3MdDrVC}-Vvgs}jtB9|EOV?M@Nu+a5Wm-s&B#1-4h4*jOAvUMGVbfX8D%2SMYGhrB8aMfD0dI)IYLz%Nx6zASU` -zO*zE4zq#1M7xW|EbkIBm437IK>F}|;auh#Q#8A#Ou~FbA6UT;uigp)yw+s~Cc2Oq< -zm=5j?0@*FV7iBTbEslvfer~yg1!WFql@nZmcPf0m#cr1}4)7+|x~i#KIQXa%*i@+v -z`d`%g^5y3{#RfJrF1ZfaTj^ncIg2WN@xKsaIA7NQ%PMTVS#C+g{d6XN(Trc|Q{J}F2m2jl`%cjWX+7~%w)_m*UrLWeDbTsjBD0uWRnoX^)X-Knx_;3 -zQ?UDkI1&%NxS-{9%EYnxG8$r@&o(h7D~hQ( -zQM_AhU|E&I=6VZ1-?wn8RUxU9z5*5n(hTjPY=9?zG)F6B_Ss17v2m%>#<4bqeN85Q -zxNl+WElb+lH?Tml&cZ4gy)MR7GWunf)OlD~=Yl8R3*^K*NHk+|mJ~4tC*8rS6IGe@ -z^=_aNI9SVG6Yb52n19l7E8pl_Tz+}9KHs7Xk-P8U?ZvxRTM`$ZRS+z)ibTq -z=*|`(1g&!6*xWdxBdBL{+z6ON!;{gq8roMCY2Wg-6Y8HcB&^FDlm*bURkf? -zxSZ=@jIyqCq~m3g82|NW7JvzE4}X4XJz+?L5MfAwsKLQXCXvbSH2|1;sxb=dZceU| -zt-tAD!!1Wt7(&eE+b%wdE3pjYlfM;zjEx;!ALFXnBOALOIoR{i5kT4d$Pu&tFO3R& -z8WnzFlrjP4A^*L&;)B`u$i;z2E)F(%INa>wNRxx3j|ed~erwUIWG7l3NhS*cCN%aF -zVlJ`p@-b7&*cam9z%8a(f-*^wH$6|4lPiyj0?rJyZ^Ps2=nL -zVhA!fh8;=p5r0gWRyOA1;TTmJ7oovFRAIPd9-91H$9S3FdfI4 -zMB0OKTz}*s>7k2j54`|n9O;xH$k6nkc*n-o+YYYWvi01waj8M!LY;*RgqeC93AF?n -z3klT<=c*LWR)$Gt?3PhDDIjCvcd9b^x?kqkJcT1UdJbnP9LltCFw??;3=8`*Ozcg! -zus2;{Pnv~2X^z0m?i5F0hJgT_9Z4p>OSH6yCQ)JARfR9E=nXKKNDP-J_s4(yIbh<|gB%0X -z4qKRZ#KLPwOuTl)z-vchc>PxsZv?~Jryh!7>OoUpmnQnDEQKUs@%?c2=@{dQ+rs{p -zgN!v+k`hKhn|{c`+e~jes_=FIEHl`_^Q(#X*vCWv&~b%XCpi}8oK^xZ^UqmW6qxWA -zT~b(dMPb=x2g@%zSbfFAx)fj;xjc&x?2LE -z5mm;O6|vD^MNE_ie)DhZkT(cq^#d0lx;TH&Kv9>AM_k|H#C$Yb -z9v<4BC^0t%m}qF>!fg+i?*qx~4QaI{LO!iUiSaw31=w?A6sH~E{^p -z;o-66q0<4HM?BnaGx4y?!Vp)u93WzQ8eG^?A9`TK2Sa#qC&n;6 -zScV1~#w(i!$HuraMLnapiM=t^^ySaZU!9c4_iKH*{k2LeEcDiR*iZ+oss!FHR(Q4C#jEtr1S?`R@N;C{t<2L! -zloAv`cyWW#T`%H!A*jTGOQ^!cA73fa1(rO%ROAMc%1^2>Qwn_O0ba}prWE{fczgT^ -zyyWTI!plz|pATRqRB4{0U*=zUWYKa2!-*)|Jo)GoquHOUJRXEQ)pI -zF)S`L@m9(xUbr%dzg`@{e_mlanSuXGjN!i%#|2;rF(Jsr15CI^_V?r{!Xe0n024w? -zxK8$5hA99;)n#%5h{=xP1x}WM7qiVj84J&6D?Fd2uxE0 -zci+O%W)lgW9+JB0EucE1P!>#auZ65$9~nJCgK(RRBhCDV-NtwKENr=B;NzQy_$;_0 -z#*^n2^;8rrEDdIHwIPwr3u-JZs0~IUn%PT3pN%Dc8OATuAH(&sjSW6F)O%Q4uj84S -za<-zzlEgHwvgs8z0+U`-TO@$P6aGn)JXhJMlEnK|^h#Mg(CC%3a7`_IZ2Xb;@p||e -zIR=r-RAAVT6Gl=m4%Wsr#7wS{g{x!)5UzspC;$^2`FrE=Hm-v$t5Y(fw$#P>UgA73 -zdKHcEVq^IYM^C-}dB!O-iA<-FF;ZD8FB)FlKLQLP=C+Mb?>G{-yfx^7`SPwMJu%X@;D?7Ub~RF&b3qk`fI`DQ{VqJpG!bA}Y-wTtLrcv3H1r>Qq@$Io#PHt`A%EJsNWTc -zDeI>i#_3`Qr;2QxEVOZ=z{c@>h2!}S -ze#=$(Eyuyp92-Zn6$EOs6b@u49L#iaAj83dbPxN}J^Y-iuq#D(&d@`%ogj0~!Z%3@ -zUnMGhdDX%fS50h7wD3ieh0m{A`23oU&yp;BmZb1WlESCS)*t4R>lQXAn~)ifYp)Vy^lI7S1WN}1oU}3bq=VVVZG8BHrFff_0i -z9G>J8Zr)<2$stRI>s7L1Mc_GVf*mKE>4cfXhTQl1L8>`~3r0HY;dPlqO1vfXmk@xa -zGs)|ig|~iFGH)I;@b+;7?;KY$Z~ty%I$?&-&&MC(Ygu5=O88!+7l+pa_~QLBGu(2V-#^wx#tywOa@NI4kKjjT0wH4@OcZq0LC)4m8UA)v%VOZ?^V{%~z9-un_7_$5h6 -z0~hXDNNKWgz176EW(%p0fTSjXkd)BmV{bzgNi8}#bDWOH^CWJVurVHEn1c`cb@Cs(I8bR~XK@UN -zs$J}>RM=f=;bgUevd6#}|1CuwDXZk`%lk2HSs!D{*tlf~z|fCGc#TFqSX}QLr&nYI -zpA`-wv4fpAKwpFfp1{3sAhX)Wm8uvDAGj!M22R!i-xs*pQR+!o%Bn&an@TNQyyu{G -z5HJ~!-R|Mbq6mJeH&N6LG!6M^98$PHY@qJ3hqQ($avL4gKlbsc8v3is)70R$&@L)UhZIe35zr**TbflvoD6@r5oX_2~?T&Y28?x){8aiy;zwZLJT97Y3%O> -zP5dFe!~@KSse|}1eMsh`j6sA$keQt|C^IK}2%Ndugc+S&wjg&HgcutA2{J44^sLGo -z$LjnDRu_$mDzmC&7;DN#wb{RP6r0MT__#cR<%Kc4n?8zvTpGatx-^RayvmN480d>3 -zxDaGQn0Xpt1Y)j5@ITig0x_b*q(mklCR`&6SIPbyVhmANsIa`09g}%E$H2=uCSK05 -zWTxaOOv!QZVy=Vdb3HtlW8)dBHn}EV%!^`bv4IcDB3M~9j;%Kh?7U~;_hyBw?F!kQ -zHVPQaES>@e0J!2Y$n7?e)@>rGTj5NHgTt*hereV%?O)!u@Yzih8*f-x+hAc;y@nV9 -z3{Tp_M6G#LOv0%)L9kiO6{>1JKIoRIcLa(y-f*$$hJ%fgXr{d#RDD*~>s7Ypa-z>Q -zEJt_G1c1QT<8u-m2r}UiKC}`u>6M8G6M~AYsr^ZOatJkie0Z4vvnVM3)X*}iz&w3B -z)tC@q`2P4=2`VcCc;V`oKu10OLcHCQUKjbSRBgh~8hB`)1{eVuNg-2M8Ndslj|z$nSGd(C;7~Vs!bXgPK7-gc#i&qZJuK4Etl)9rKV$L1VV8lTnG81Q@Pw*b-OT -zBEA?~`WGI@0)GtC%NWHP1N#{G1CcVSLz)}GNbul!;FIqRW8m~IyhhH;e5G^gfa)`N*$ajRyb4a;B=9VQw0uA -z=G!vI^KAUi$#n&2j^;QxoT=wvrh~odK}>V1iJwv|{1D8J>k8YG6~0MU`1+b9^VKyA -zUnN`kGTFkm>lVHUW?PB^=Zh4Dt-LL`{CTPZXG@x%&r&UXmTKeE6ot*#ZRrsq%zT_| -z3(yc|)?86o$@pHX2i3C$CRXh(U-#5Vk#-&d*N{gZ|8eH7DO8VrXh{MGV{2N -zSto3Kcv9h`6PA4TxePqu@8hhEh39C#cd+<^5(ECyOA0HlI#`wDiI-(Aav-k&Qlp;>-JIgp{Do9alQxDZg{FUNyRcsU+k!pHMS6^B0?1_jVFA!%Y<6=P7q -z#1O6+5&(4YONo9P?PEY6+uL0r<|sr|Ouof$kNK$SRw!y!$Zhu|vN*S&(Bh$>*BAdw -zR+o#c9uK(#J_?6@lng^Awar1o9S7H2qPWGs0WM*K5y39n_;fm$BLDy(07*naRCmDg -zabo~TyJzFf%?Qptbdl5s0hDX4N(}IsEjn`d1pO1$Lr89k;QpvS`ImLEDF6QWvM$Cp -z_|9_7ecZ^}7)TM64*r -zjhJ++uy-Y9TC$qQ!p2`~qWHOF1c?vnxq+;RjYrv|LzM*LoiQ2RJO(7*x5cEtqs+nn -zN*nttOzf`mv8Nz{{0EGB)`@5|_(yozR2Z>LiAtuCf7s^QSQHWZrKrGhg^m3_QQ*jp -zF|02bLVB|+g`>Tei~g94$9+H^BkU_oq~9`;*8(Km27WA2()03d8L*bHUh3e~JqwM4 -zz#tRddKpV>;HN4})E53Xd^l+1;RwA@K1%Le$iJh|&%pAO3qp*s~ -z3sc7`eeA4q@e_Y%RA8z+?5+W}FqXO07S)AGW7Da=RQqDmf1}#RJ9UH>AG7K_%&PbC -zULC{(qdhk^7M6I}SOF}jFNene3P*Zi=w*4UWD;5kF5$!jj6^aA@S*``($N1j#E6NX -zMt&KszJw4H7FzymfC-hDe|LORogu))0}ii0&vdf5#4>tj1Z;9WeT-WH -z9%2YHA;<{KWNDCLV%d`15iHFc#q!({tjrt3%KULGD;ULcdS!}+vAlR#U}kN}7}l3? -zwQKyJfAdzzg`)_e_a{D|B3^bcm;;g5Ujeb~YEE*A+MEGRT_sL8_a -zMiV>kGv&(0$2VPB36n0ET7n7{7!&hrEPsK_{| -zAF^?iX=TzK!`NjTjiZjJF}esdF!_&Zm}!l8VBgEmk;Nq;Q&3=-@;?RT{z!)fujw**KV`0DeO#B_#xH84`~YDr&`#aV&Xeas--8*!gpy3-=-;ilNvW^Hoi_%_$r)q8((MG -z*p{KNEyKna=?YuZI5s{{a|CDzHJ@C!1!@R1Yp)ns9r$GEkCAjUn$OQF%s-T(-vl)vGBne6Ca$3Vdhx_v(B2Bb(XiAc>fer -zzc>mXoTQ;Xc&+0mW*+C-m!1!f^F0~zem>;qVR4{IZReS1qjKN*)!h6bBpATzs5HSfRpVOM=+PIX*ULyV#QBV_U9=uk#&z -zlkZ?hiG}T@F&wQOL4Kzt;6g8n=>Vq96Mi3KK@{@8Qe0?y=2{uoe8SOSLEw0Lw0aW4 -zN_d=11`EOf;-ZxK7*P`f#fK5idKlNtp($M_jS*^i5>6H5(U66<0Rux3h6!+$ivAd1 -z(#co=$+e*3#|H8{3^Cmo3;=n3J_>qu3K&%pu8rk(*}6P;*hSf>kGx^vQj3c-cMaq` -zc5$CdiJ|Z~YKbD-s(jorfx;da7w$%J@qt3pBOl2vz_k|OdW(s}7#=rF7>18njHZ1HqXZb! -z$G9Yt0b@a^K*X>Rv6MhlTC0Oig?+fx!5|1=d|aVB=HX5+kXx^iSYjjjhL8M5z~#HZ -zPZb`%uQaf|I*LuD4z`v#61?)T*G115Q1uu%P;Fvwm4lmuKjZ&q6Ps9IrD9q^;9jsc769lTv_VP=JkE!Dton)WMv>@RmF0Onu?0S4I0#IZ^X -zQ!5-<8GD;C$W=bxsBtm9h5+Q_y?S6~1JxG~GwWPXjd{CTgARQ#YiocNjCC$?L`fl> -z(3c|~8bVe8F7eP3-o_)Lh2aBJ%UzjiPoJoR!zR5zgw=UT~D`h}tW@?{+%!C>fC^56M -z^op5YGh=eukQo0L<&0u+-UycDjmj*|AJyti!3dTX3}b1*kig7}qEW0W9>Ln8eyk}T -z!RqoTmRBgu$~Q4JbrgTU(vQDg8OC3qQemjX#KX(e3Jd`zgqQI6G{l4}Wg*1S7sF(- -z7c*lrlOPi+FjQj2m>3a{kacsb9-t9cHl<=J>E -z*Tl@iC>B=g80F9Jxj5Kt;v}POnf}!0Ag`b6IW~%W9TfMvDC+l+C23|R5<4xNf2?r4 -z&B6XA2R}8s`0k!9-kDEsnAq50V0FEL<#h&@)LD|kMgIytE(92=GjnT9%&Rf6u+9{a -zSyE?WIn@ZB%m>lH1ebM$Bleuo=Mhc=jqD5yV4sbN6}1-VFA3MO!j&^oX9!HyL40!n -z9aL%-1R(N9MP*W53Bg9g%jE4LyhwC%pv+9b3;i$wz!0b=*5DY35G1t`zyxCAlEgw- -zBiM*SLvBfZ|Wqn(8xalF?ZM%Luhd);Dt(zs4@2( -zY`bgYtGf!{+*R0d&&G~>mZX*a)M#Uu82hz}e{Yip7=p~f7N(FXiBhKO5>B{6#$Fi0 -z%M$?8=Hg7dBM_6&ZVSL%>U42AP+|x%j9E_XnuHiBz3g&jH(jEZdmQ8h5JM$qqWCiK -z#ZZmmT3OAYt7Df3ZGo5@vR3Bc_J}S0G52WnAJyI%Nh=FX{xtb=ErruQ?#pUN{CY>{ -zxQi~Xmx)Klm)O&qJ_ngi22vkcNNx6z{K!FavyG%j7Lp&@GE6X&6tlZrGt((%Ofn0L -zG81p=Br`@cUujUdT(5A2(abeUM#GE}m$0N*s^kVqCnv{PCk>( -z6prL79Lizmj4sgJo29TPQ(;$zg`d(Dc4pZ4F=07#_PMcug3;}1hC>K;OI0OU}bI(|qdxn5u2`Fd);#!u457|o-zz-E3 -zUgm8C9s!PB1V#A%;2U4a~h@VeWYga}t>LWn%UjMipE5=!~g< -z=Cpo&zV750@?PehC9LqXSeSp-z=Cro7M-^OSRt@jpu)18ULh(}^bRFCSe>M>{q0dFk-5w45gaZu_;o4Zd`a-Y>p@pVxUMA3RM2-3X0Wefq2rWDkn)rG$0xKF? -zs0tBYBtc66Mn9fCGVQ|#8V7B(j(Qk2eZ*MCC_f8HFS|eHqmohVR9w0|6b}If^fC-k -zxph(4r`N|aJAvFDA0>kdl_LhqhJEDr0T&t-&NUh+9s?d&4jx;2&8scup-EY2^nq-4 -zyWF*Ku~Fe_ixR&}ViRzs8Axq%kkjHLxeeHN$Ht!8h-^MIdk}zWiSi2&y~5f`c!}ER -zh_J9yt1s -zT+mR@-y0P)1}QWS183^S@l&ON!cGP;Kz^rGXNFBcQ5G?ECrfdwkJB{@`-&9~mistd -z!L>0@Oy@fbqDZJQ&@`yMNBlQNV}2xNBPNi=)iGNDMz6f_eGp8_UHn2ojpAf>^_nGy?$H8xUj14*}mV^uzOmfP4~V_|ERiBHO6NPOhU<2wg{ -zTfM;18p2i#RXsrasE@`zg$I2u9t;AN%|6N=0JUv4n))3)><0?kfv;*}m{V%v!%ARr -zg^wj=4(69Dd{|*%MwN-TsukX;@}$6$>dd=UzNj(W;@DURd{xcx0bqR%Fulga)QTw9 -z*Z4S84ID1_u)9KGH;-H~V~J%o@J%&e%fYm2g=w|Ebhxm`g>b@h%C~Dg%%t*iLjw#~ -z$KJ2=@otTWcPd@HR}HMF2j*5&4Wc*4!|Or(@r+WPlJ;sfJv0O@ZT6RA05x10<4j}h -zGtf1h4BP(LIoxSn-E|^UEUsWLjEQZxnLy>@w^kPyIy|KG -z`pD|@ki$Rr{WgjQ_-(fmz{%=k8?lY6oeCG)OgTB_deNST7QVk{VA~x7pWU{wfhXCu -zhJXf7=oi;mQi{nw8A6O6OB9<0)uybOF~&Lc%}B~ty^Zzt3LB`%h-zVBHPs59*#BV_ -zi%_Fvs9b~)5w3RqJ7|f&k17sFt1OdVmk?kGLcH$@c=;26k<~XzA`8~w>Ksv4LPdqi -zY+8|d@)*VAA5R*OaSJlElFeoF}Ia~3*qIH+m@&=RA8vQaJJr4 -z`24=Y7xxstx})dYyYxW?1()|-{MhJV=OZ1ry!%nGTGpg+pgD+9Zeg;WnowQz>X?h) -zn;aZ(cJ%~?ew|8Y<4haeKyyFW$-=%E`eLZW -z6a>B)f_Di!k@_83jjR}OP&J@e%5+j$kXAP2;O4N4+as>@$Ar<#^v6(<;WwT%^S6y_ -zQ!SMkQC_Ibgq|6$e(=PDCmRu_mw9M4fZHQLL2C@Dk7BsiWa3(rLTa-kYi8FQZCrog -zA~l$6_ZZ9Ui1|MZ0H87>Yi73;uG~^cY_Mgn1~7A#D`&M-W(YD0mnykVp>VNWfiRO$ -zuEamXAb=CaK}>T1GXxoS%}C!&o{jyv4)*0Z*qd!*ceaC{vuv4NSvG#kR8P#0Sq{Sa -zA=93?{5|1?u)|}H!uA|T=DTcLASMKvFVhvarQ5P@CM#zt7CueU{uz2^HYVCwd)3D3 -zOEy+gdAML<*?AL7d6J(nISc>@uXFv3YR!{lV*WV;3(s3vcwS-Qd0P~Y`Aq9NtH2d4 -z4wW4ZL4*wrJrj^YMdZAN1s4?-Tr_1CUb3+GiY>F~vLpA+J8yzB|GbF>36{hbGrE|w -zkctXRBhOn{be^h;DUc$d!q3KpHm-xQlO-6!%9?97*3x*N;$TxMl@=GDW+;4?rLZ;E -z#us@GzR0ujWxj*23tW6t$Who)r0_$TiyzBv{9HPYQ}tu08v}azjk~WCotWwr^K3-H -zZ}Ke+i`RwS9z0>?NwJRKomdkK6c?&5qL75(5*Aj9SLM$Y7{W;iDuk6#feF{dc;A>C -zfD2R4=)G}$0g+e$GU59nnewXjdrc@K8Je -z6tUBz#}jDb$`}g}GrL^rc3~89#juB(2v9Ntq;&d7;QD8iE;W4YdT3W3+Mq%HT^jM&_D%yT&TQI;f(_A1{D^C -z&WH=~zC`#%2|X`9It&j~kGgH3al}K>y#d_l^w1mC3KL_JBT6B{t`}JsV_1QXBM!lZ -zM?wt&h7G7*vXYajv474u+Hx -zWB&lx#~e!%=57rFyUGS}xM5U&Uwohaj`lBQ)Y~{$;^AU7kl5hjLcNC*H7*X8D=C3w -zIpmfSOa5E5414Gvho~#RRmO0nauikFEWQL9`z!&hyM&i^2ZfChl($%T*atKY0au%W -zZPg}b7h9NJ3CykXu&4r}z|5?$@c~!HDqMU}3CyYjJ`gj#i#IA2W>-4+qE`D|zO4q< -z-C%!&P+(pz0yqSh_{$;4 -zg!hHlG(QsxnU>C7LFOE#;~*~Ch28s -z3Wl-1a2OkkMzOXig4Go+W@npt_R0|c=jt&2c6AhgO&Z64Cr9z$$w9eg(zsq7yB@{g -zIiZ>V{{z50lNJ$xp(>;OF(#hRS=P< -zrI<_>lVmXQooFwMs2dWqY+-q|iIp`bR@azVQ)7x6BZ^Gm`{0Rtcyj-=zk~|Sq-ov} -zm?0c3u2ERR4x6VE#Qxs`3>75;3?rrEpJNGA)Z!GFKZ6(EHc?a=*Pj!vlJQ7r3(G0j -z3A9aqMt;^1SVH9`y#5CT<_Ul?@$qdv1Q$XK0dvb8g{^lqzz|{xFx&1biCSjdGJ9h< -z-`umY{ei*`7NR!V6Q!2)$1q0u5X&s3(9*<_7E60yM0p9orNzO?W*1>18CS_p1*ZP9 -zTqkR@1Y*v&E8P*(>ETMJi%ayxFrnV`bzv|C7d6cttG`XhyuCKoA>T%!>8$V?!?98@h -ze#&w5> -z`qU-umsxSq!tx8I3{U=-amDIF2sXAr4a+kHZZ2^Bim6<-tYOhZLXZfdB3x5rq;ohE -zuyMh}BCc>8bj?e$UI1LSwIMAAV@yM^2#7gbRQ -zwNdSNxzgm|;O}akSFG!73dMyqyYg -z!;mP|TuqFcTyJya{SC()jM>4e8`r_)JuCFvro=E0D20CC6>s71l{R)(n8@q~M#l^c -z$AH#B4>|W8oG9bpI3J1CHZIiqI921}_bLm&RN45X3RqJ_5O8p>%SGQfWF_u=gMq^p -z5!CkhXc~tkqO}bH_xgd_4xspvjncLVZuJ}Z-;}-in-o>L?ce{@_qpesd-|O2KF98M -zo=_A)5pW*6?QU&tXG8^25Re&UP-H43o81b8Uy;EAZl>#e|!W?*Ln@PU*`Dm>a`MSANd-twlzS^|MxRyx!K3VtKdSTzAFGDNo4fBa01il%k+it5-5Ndp7&+qmYGPF -z4KhE67y~fDZPJdyi_zHJuxp8PvN`RVh4PvV`B|Oygg3X7RuB7V-b( -zCGjtLDg5s%N&K2I%lS+A*Meoy|1MZYpnoq|UR@^(*2s8f`(c747XDC`#viII++A(szG@qfRHg7_Z3^2O -zQ+Oj{;hngJot-pkYn&Q!a6aLnV8X`LDF@Zlu0%9*?W|&&D?N;EW_hLq78L$C?BL{( -z!jSw*=FG{?Y8KzZ8qNSFc3qS`Fp2>cRMZ7d!07^ -z(P<-yTK=fp5qKfM?C93wecI8hWUb5?{T(s-@4cb%ZJ)xo{R;asYh}j7pE2;$|1zNP -z{h-G8gqK0n3&Tmw_e1Q7aip8*?1;vXLx&AiTmS$d07*naRHh^5(x`{rQ6ISp7dayi -zE|1u&)0l#Ui^6daMdS2vc_^K9Q8uMfKBaJVTFZ)vtd&h`)C$ZvtG!5}IS1i6XEky; -zKJTK1Yh?=x9rIe&%DNWmkQ)hahFPY! -z0#uJ$DDJmW(67WN!xb~GndIMeMTOTjih6An^;jtCaZu3X$YdtB+eKa{SIrE>2+Xu; -zUP(mr@mgC7G>_IQ9I17T -zsx2I@ws5G5vT>-&!NE!g-&HEpMRQGIzf5fuzO8Vux5B}m3J2d*D138`a)!Z~*&$DGR@N+zMKWe$Jm0x -z@U(@IIfa>I##6yRlh#=Bd`v4J{mUMrlM40YgcT1BETNtAP(AIScG{OIOy#(b@(~v$ -z!%X7z(YWLz>Ud~QL5eDWxRJ#9n<<1Be2GJzP(DV|Hbxu=qprsP>3>G)h>J6wX`Jr0 -zae2^1!GMpV8$ODAeH8Ztc_YBd>k9i?7V*<{O8|5NlRni)#zDJb#cudxZU2I@1a>&Joh$ld?F$8RA^su?v$J-GP{|IY*6!!5K!bHf! -zqfH8bYVmO(4jhU?;E$sU$|^}%>#Mk7BN^YK*N -z!v@}qLZXuI4|#aF$;0FH;1H@pX2QbwV@_9s2}^JtoU)EaUrlpX>X>+9fCmUVnG#E` -zjb$qvV0cYfA;A1kvC7#{!|MQ4IW -zM&C^E8lKrcnqO_n8Nt?^5p26Wf~{9ZjdBy%l4nGic`kn(&lgM><&T@k`GlGYyjV1j -z7mFwHLXnAB-dfCrvMEz`neoGHkZ5JbD^KIeLK^&MupvC6o?5x=9O9lGOzM%u&}Mx!eeDixGQ%Szs{M(zve7} -z<(B`NpTfVe4y1d0K+x1Y){PX5JQ-`9bimS8IAo} -zM*j@V1P~Jdj5#gbTb06n)oI*Qs)t1&RMwIPMqA~xRbU{V!f -z#Fk>h3keT}Y^R-4k_g3BGx}$$rZi}>E*@7X7}Lld)3`Y7;oOji?*~2U3;C+o#^*f_ -zKIRml&B9+>Exgfc;nlc>7wM0YCVR8WB`aMt=*KN=jazt*31}@ew-aVeugvT5z%N6v -zaqtGk5B@w^_?Qu)M@ltWtVy_GQ6%Gw>06N=7Y8pyShlG}FGMw-ry?pdxlz~_ve%|B -zT#aKQnxw5613%w8g9fqzCb-T%2`K@%1gmesW1jM7 -z0EQ6r7m6J}9S;85?tl>Uw{~lFo$TFCPGf8Y07Ho3B!+&Nk24S>D`he2eVSPr%z#TzX6%=`Z<+xaJbLGF{Y6XD4ZBHGT_2ORgKfboW?jJPGf!; -zRsy~kMl>#ux&kn{qYAmB4swPqTpF=(Y0SZu35~pQjeM5PO(>L1YLregDm>$jnQ~Dz -zMRPwPTcdtjp>f(lvrJ+%LbDp-OaUfM{w?!dDboTmoeLV>3z;I!MOV!JTq|RgvOo+A -z>sI)oFqoBh@L7R)hHW&GA8u@J=@>)IQwz#;`;^A`K#pRfXOHmgW -zB1|=72!M-o647j6=2RogGc`_fLX*)67QWRvI9{i5jBrz_*_=a6h5nPvHhyX -zCtNwpz|8x_3hx%#c)QTX-wG7|ny)3r?60|wq?)~z>)hZL3ss8>Q5$G+Ad$!=qb|-|PvO#lh3JxpQ3Z+X?N0+k -zj*n68qB9L#8B#djY2l~q8pQ(&Mg2Z<`aD?~E9v)qH8 -zoZ$KxN*PZJVTE275hpHb2cwq4h-Lg9*B5~BpoPZXCG^jG5)r*9J`%!!S^K&LU>I>s -zP)KtcLu0~U@%9q$;0?j;EwP^NFX{0$>v0aISzu0Btr`QTwC%9q;EU!Qe`pJ}o -zq^u4C9g{vTwWe^m$-=>qi-RGBgUt>O5Sk;vzJ?Sow -zEWMEVZ(S)6Z7<5UDV9tBQ^ -zT%3t&>}FYZ$irKW4vw@~h)qD&^Vnf?Jhp@%qAQ3beDp6sye)mR>fD -z#{feu=6tkF1G{2LY^`6$mS$jEGvkLfHiif+ga#K+hBcmT^6-32M)(LX(6}(Uq)Q)ifHT&`}iUTyb^N3)iios -z9_7kd*uV?{h8~wEGEvEdnDr44kI@g4iB*22*%xqG-^2*#HBUt6(zXD*Fm^W{-&xtv&2&KR~_8N=3G%1mSkGJyy*fe1D)6i(v#!bv<= -z#ALE*(bnQ=Y%ZR{#)3)lzR<}3WZ?{+D453jq8U71IF0p%b68(AhbIJVjKM!xDa(eL -z;F>_Q`RXDzS1gF0y|#!gl}jRCb1K70%yU&sqUUSYrZO+rE{oy+mAYlTRBz##$`l?e -zUBT~j=kafs=kYK3EBIdpN&IX6GX5=pNyO<(05HEUG)ZIxm~4o-(*z~}m~4m%CNRM| -z+3f&xYvl48$lN-Op(lpmV&mRw3-?tfac^Zx?)|YwNkRluB1}?*#viK9+8HM_57gLL -zS8ro;Qwo2IrtyBOjosHh9P6{e^`FZL^R4*RDOb{=2sHfgSVQm3ltS60gW^erD-$*@ -zBy5~XD4ZBoI5g~FU%w+w?_XTE@KI-4)|>v?uJA@1Q@J#rj}u^0*c?lXo{ibq5_2Rd -zU>l1dlx@8M8`uJHQw}49)xk -zG4#Z=a|&ZTF|tx7lNbl@$y%A2#C+K4fD&WBfQ*e#x{bD9CxF@pWHM`IyKXr6ie;C5 -z>=Lr2FJ^zANh%}EnDsIn#|9Y$q452%nZ#sAEB`RcRYYYxF~c?(txOM0!I+EughpOM -zA!m&Ltub!dMsC6}No5l*3MX8d$dpXzRga8WeKfr>fiH%!;an>dqyL?Tyxntx?qFqOeno3OW>wT;#V0 -zFykV(g+SvWC&pDXjmuGuOER6&I3HrNnTcv<@5~uaX__2aIg_=s28B}%3g0&nZZuBR -z886N88jYj18b@jr4%ZqTs&#R&M&m#&rEq}e-Z}^S>$K=Vy$fnzoxOpeX!#0n7ihf0*AyRM_cswG7Ilr)%Zt+ -zi+9WDOHp{I#KpVCF5WHCM#UQM5l)IT@3}c@YLjCcf`ZqsEs`_2YX^J_C*wqhSMm!?qH1V_FNOwT095z -zH>6#K6%i*D#%Chamn{DZP28qD(3rXTn6MI<^X2F6G<}h2%bHJy)0<$LBNH8EiW7t0 -z5tAThO!>hzCofzRGcuEypnGN}pq5lIu8ZaO0tJJ>l9GiJ&)KxTKq0cOlG4mi78{5 -z)vIiH;WgujsQ_Y(=Y=a^zIb33EC=(pg9Vww_?UHk3@m#nrUAY!jn)|p3$}t<0<2{q -z#XcEDKMqhg=;HfG65oXs4n=$%j`#vGhoV0AhJo*zQm7r!m|g)K20e(kg*`K#fKpmK -zFAP}#<|sl-+QnR2%Nipiod=hIQ!y7`H7FDh)39%*MMDcfQQX3@dJCr_8mA)=or(cx -zTRrUM7m&>k-fmJjeVsAL26#KBU7U?B;CzQh>m1O#z>-QA{nI{rCV<8fh5A8-o)I4d -zqdrEbe1sCf;dWqK!y-1Y?x7iYIYc8oCovv2hJmNJ?#?eULl8Y3@$qm>;gOhy*J2)a -z5MUxM{uJ}^L|9>6nBHFpdt<@}svD|ZK#KTw8`{LuP2=JG%CvnRUMm#)3FAZ0` -zB4*-4cwy2QPflV8H0#1mlD`?DS^$G$M9^9JW)LRGd)={2Wms< -zES@Tx6K&*rS;Zorxn}fq#R3R125M;fH!veWQ@sGf%qz7Ec(rZ;uM%dsYE^3s#N1V| -zh=0kM#lPe);eY2ZiE01eau-)u#>B**ff<6#e-tj?B6?r4l?^Zf#AE|ZFoC%hVoYaD -z05Uu|jR~eNJZbU|*2f4j!Sx@jEb+(OU9E6;t;XH83U}8yGMV{9wS~K?9sIsV;SV)R -zCN_^&uV7>Ciuh*U`aes=?1}ljM`M4#2Y$o;(}*qKj5EQkV%kJC^Q@S0P(E#=WHOEX -zi4=0DEL@zla4uotELYA3Z5-}POHtzP8;&%^a~kk=yM@no=UaR{7k8z_p1@$@i8Wqj+Lt7r87K$>511A8N?33`qBF`Z5IanjR^}VbCOprjf_C6fE%sw2MG})56#`hY$ -zE&wos86hScWd78)1~6~7+N -z@NthVlbFwX6+Z7(;)~gNLql|v5M%m-2r_#!#h3eN_8+iB0y6A}8Dz9F*T^)^NHUpP -zTO}J+I5(njJ_9lAh9Sfhk9jEJ3fYK*{2>c@!?%5nhqHk*OxSI -zWIAN%i5X5A8Ia+(sxA`zaFXU43O^LN7*8n?zmXkIx)?|SHPSjBjj@3IjR;O^Z-snh! -z!r^-77V+Mp#x)&mR5(ztu&>q@m=U0vZy~4rvs|uf%D|}M6 -z779SH;mX+u5)9zr!(xpOi!?qcR3ZYzdxVK%B>-d~$oOqcUkxEhi`GEM+%rF`@Lnkk -zAZ@&V)#!r?3m;W#(T5cp@0UAxznpNQ@jGzdvovUY)o5c^lg6%Q-?W*>fv@AhcTpDyV-60-mQmQ3!XP_PnA|06 -zVHq>LtFi2v5BdZPSpnlDMb^ArIfL{mNuZMU^EGfGM3||{8lYsuNpMZiOK>gF!uLQw -zMwYT+#jJ`2D`Vzl=M2Ty$t1?7&xI>v4yKbCaA6OPML@EVTJe!iIk1(3 -z{$(JyJ%wY9i#X8i;BXW;lF{Kfu%`+5rp`inkAvA|NVKvglNK$>W^;sL%SV!4r8K~4 -z8vnV_)W4WaA!#f5Z-t=-=ezg?#*%oJMwvL~SfGcnVSxQtDV&LL+QRiR;A{jq9|!h# -z053(B@z;hla(azXe{fOZ<_gopJY0;epm&ZdV=lVc^D^t9cM^yWL*S)rTw#Lo%5#uZ -zvTr*)yxFX_BFVJK^zOh87G%S<8} -z4gTVfVWL@>1pC&T_*sMWIkYE;+VeKs}o~xvBtUwiZl++EzFv -zdah_1lvyX6#>RpvY$%w*lLeCkF^?5Y;j#P~JXSC(5}+Z}WF*s>!Z|!qG%qp$Gmj0W -zf!08VFk^sbVHIc$%*^B2YerkEm{zuc=d0)OV%5APmKlh#@FYDY#f$h|-W-0Nw}5}o -zC%i0)2rF`3xP)I9E#p6^48UYVOK^QVyaWJq`x+VHC6MvK+zK$kN*ParjG4r&0Sw_q -zfTcQP>gPnJI*t3Q(|DjNg$JvWc(6K&2W!%}zsADdwKo1(ZR6frjr(dHJWyld!Rj;~ -zs!QXs1{)h1Z9E^c@TXWB@3tnfqbr3yH&gP>`wv5GTGuFKVHo2rr!uK#Qw#{O#XD0n -z?x1MgMqa|krBMgxMs1uPwsCyOe2c&5rpA{&3ZHaZc)uehYfx{trSVE@8ZWe_@jTbd -zVm7u#`9C6~t&DSyJ2IhpzQvW*GcovQO+MD3Arnm;TLYK?6oSMvLIi(401^R|h=muU -zHeO_TB^BZS!0c6k30})Hn7$CGZigqr$=Z8agB#up-gEGNg7bEG;RJ?7quJmR_+fay -z)ykDJC6gGYl2M$%WKUrTFzp+}gB1NRX0=S#%SKEvgn-P5Bc}e`AqOQR8f9Z1 -zN(nP#9*PqD?@FUUCN&C$V~+T+xWZU6;h=QV0h99tWLBe84a|t)f7V6AEWgEd5uW!E -zo;M&9o!5xX8<=TZ&}d)O0y3P)bc;tuBD3RjM -zyN$7=BdaB&X^sArj~m>1pL9_hT0@N;+K>cW9BB&}ihhE9A8~$Zb`~Z6VOmKa=s$Fx`xi%~8fS(?{drrwr7b -zYgYJ?9W+fEX9aAO2?*dCT9d-bj7~IZoM=)%SF^_Pkizkh#<7sX(Po9iO%4t>DG+MD -zYgE|Z;9y^a#<%qfdzf@otFWua#+TI&zN}Ip(8%gpg@YXxDiaXEkN}f>w!K_qdl>@* -z6h0~CIvVBRldBFstuQCAc~6qjN)}gWi -z*X&?#SYdBOVNcY@o*1yN#mB)`g`;h0ob9ksIp$!3QOGV!94X^zS#jwfaj}?z8v0#m -z*5`+Qu7Yv0!f)AW%BLqH@S+6MmS9bc_p>2{*SCWTCpm$F-#_>n#`LC?pYgUBI3b|i -z31C+5ae`!dm|RkrT-M^JF~)vIE4x_Gz?2R2&iRNkF>H!oIQVE-@X#~|G|l;Fn)lH- -zX23a7f3Q9tW}AHJulB?r^XX-uSCDW4om -z0plycM2ahK8VM_fgi2!6v5?S^62{ -zzzZiY242L7F94&!C}gg0u`IK)a~TyKE9hHxG0%VYDVpj{GTDR;#K#m)$1EIZO3S*~ -z(Wr-GQ4fd18b_kOc&!dLBvCowOR=T4T-a$X@00J36CX}_`1=uJIDH|&Fi3zg$;q^h -zC5I99J_>r1__}rm^;5ts0ZVBND4=H4!^Kt`--m&-G2m$2mzA;eF&8`I9$sin;m^%U -z6pa7_3&7~ShyHmVSFbxbA4?%T4h+mX7??@o`m{#(gpbIei{?QO?c+WMCT$GP_-Gmj -zzG?Tctx@6WsE3zgz>6Ut+ggC9V;(lg2rsS}eFGYNr$b1_zpt2+EV|y6*JnCatvnxKBFIs>XIcW(gtPh)DfX7%)8S}9r -z&VH9Qh#}O7KPKeiA(4+qn|-WrHq#dZ2}>>?x&y#u15Gx#1lIw;@Fc_pAY=Msei>kX -z$sZE{Og7Y*iHrf9wd=L?vS9iWKu-WP+4t{seT%0ivvS6Jx4_OFrZfTE{OaNJqgZ!g -z6zeaIVZ#6;LEOHj1fIH_z{bl7Y|0s1)zeqTK|PZ@v3l~F%AU{=X0joMFvE$=W+svq -zOyQ~g2|PuRDV&m3GD6Jb1v69<1lj-qAOJ~3K~$^I62MFLNs##^hzX`L0x=Z}*mQLP -zoW=y=x)~vc6PYblOQLPni+G`C5nL;Kp>`QtYm(ShnZ#pd%lHie=E^+&Gk<9nRQ_)P -zCV-UyVghK%K7&b2058FrJ$cE7m*Cn!%v#j401Q{jGPa -zg{rmj0L7$>I!AP0y@Pw}Y}{Xy#=|vftglOBLwypP8&~jRBqiN2@3kAx%Yhp-bGx`W -zqLH6ak}6d)ZlESelq%zgPQuKXjXe4t5)LkoIygIQ6iwm9SQ;s5$hQd$;B-3~DP^#f3OHMVxm -zq_QAl`gVXZei$12IhnCCAVY7AG4-!POyG$TLq8#g3QYYp_M3#V54sgT>0!a8!l#6n -zE^BR#tj7_E`Mg)-i(ZW{uQP7h1r7eYZfMZwwEOxR#4xpt`u3(V{U0F6^l2RGcX4FE -zh!Yut%*i2>Xm@JF_+;phF%ubuOT!LwMwIwtXyh+t%M1~MUMdn?^7F@(vCo+T>Gm+_8_RzcH;bumJ -z7*kBA%~VDp#=}TD5bv{{n&0$lBMTVJnEh|E6m!Bs)j$emH`6E?aK#@(fC*IEuRxXc -zxhTD7hOqZ%h88pp#LM?(rn -zniUQ;J2=>^aG=R(Uz5V#28BHh3g6Ue?5u6OAux6h5!x -zbLM%jer0P{t-@D)-}P(yrcp`h-=1bArF!3n8MUi$FsiUWuCcGx!~Rwehg)5oYIAU| -zbq;moX>dX?%S0~6MVb+{YHdAi+2hKXBZ*#w7Q)R6)5O@b!oCj&nB%wKnGTR_D7pQb -z5E1}MaIQ{S2u$>$us6mFAZjf=ETw`j7ITl0$aj{BKj!^c+Z8Hv{Qc&w7v;Z{E8#OTocMfP^F(u0?hf}DZP-t24(d7W0HV~S1Q977H?tsRn -z0UwtKJX}q9h%Z23Wrz{UX-`tjhSI>*Q5z?&r?9Wv#ib#jguxrb5O68#*C-zHaB;}T -zfp!}g`b-$e3_q}2KBiVYObV!&zu#jrdG)1Lp57O(k&fC53C9zY`i%u2%{N!jbbUcu -z?Ux*W(D$*#lsH9r@x+U=Y;l_6%4(LtOSW-;b@Gy#x}+GJoJkU+f!^}5nDQ~50-E|( -zP}{wXn^PXK!i@pkp%oVueKt-;0{A`x9E&TQX?3wTrtosZ65eb|$toXH#Rir%ZY}@~H+`IMoJVnY -z8a<1^&1oA0b3S^eeY6Z}ga>W3jcMGR=1Lh*#$wA3g*TcU@v}S|1GYtc3F+Y!<(UYu -zHSA+cNK2>?pQnL-UD(1?Q5$c@U3?M+K8*nHv@re4!MY{~FE=ZEDSj8z>%!HtPs6^% -zC4Uw6@fG`F;=pSm59^z3JR0?|j*-ahcZt%dzXmXzzR21b`(Ff52r$Oz|5ylkoJEyQ -z=J5m4HM8b*A)o}lmjG67J-LEr*3fug07i`e24e06FzkoPp1{x_lMOL}H|9?8l6@~5 -zYVN7`ac><&_tgWpD|qfs=RLJRplpaCxCD<^A?B9==DzbIc<{m~9=?#sfXt|X%!bRO -zpq{!kdJE75AhQZExs$SL7Ob1yK9S+$XA39A4?~DyKMVnerIz%>h##h4#!O>4k;zCP -zM%K$_#V5mcv-QREc%o!Z^kiw~x^xy#md#>A`5d0QIxpHNATy6mSGi_prZP`oo5QAS -zi+H+n37Z9E7O}N*4$oCDU`xe3UaU=HTXh-_SJ?Pn{yhF8XHGzd@M2cT7V+ghN6N0{%XglO38U& -z=JA8oHXf?A@NjJ!57nmeKy3>5*IIb6E-lj-12zusuXS)=jU{@pUV(bJA&Cv4B%TW| -z}kxOGgBB&VuExsn)?6Rmhr{3 -zn}}tJS#G!SUWX;gWFL3i*m1+djvFqRBuDM&&Qgzw%@&C1(b(1F;HzE-oWktxQzGMy -z(FS5Tk?C_qEW|uG;7SSR(E$yLJu=cIGo-{X!_~smLk><8Xht2J8Flc(h=q$I7OpU= -zc*H?*g5ctUT@O_4q**7ap9bouy^LJcO|i%>Q+_#>>5Z9mP(S6MVOohy5vCS@OlVFa -zI&TzPaL}@#L>)^mx|Te2FMBXB;|k35r??`qXh{tEF{&YAj|0`B@k6V|*%lY4V#>fwj31Pgd}ulv(V&iml`##6 -zH1;=X>}yc?w%(D|vv2BLd|j($?To8uvVK;r@wEg7&|BkXyfwUbu(QSifnrrP3cL84 -z)z=vx4u9?|uCdh;I?ROR>n0apH!F!~-Ag}8#KWGD58melFx6#lcoiT7X0C9u9YC9B)hGV&^hqbHJ3(5A!}8rI55O -zX`^5CeXLNNywKDx-`bm4P&Q&CG@C}BqcN;q4BJ3rS&MN$vgG6J%@p>xr*Za%kCIU!f51V`AWwyYAs?5A -zffF}?{jJN$A6&+;3rxA3uDTevxhCpjiqn=A!U~YEe2iHx#w-UDj)&o-l1?73j4{Ty -zs&heB#-=zS(~LMyns{T2ojhE*@{m+Y`d$_Z3~6K54wvW?$_5y=z& -zB+jL+<&3w6-WT(}mQuzClT5itrj$Sn!DW`IXIvZefKeOB>*4fu8C4^|XeI)CJn5l* -z%)+JEvP@i##v%V-IUNViaz!iVVN+8Q+hYo~xYB`DI{@@90oP|N -z^s~Tn42X^TXdCv?HRhmi+QRi|AH@T}yUjLUY-Tu*kLR0QJlAX@h&RPFHb*^d;UuQX -z$Cj{*XX08?$sP@9Y>B$~TigeyDxZXX{JjNuCgR}nn2i_XKE7-Lj)y$#Z+5Uftnp#Y -z#}^TRUsUXk`1pvR6msxHvyJsJ59{K(;F`Y3U?rmDr -zJ&i5`1%UHE0n9If3!l3a!0_Ik0EX~lrZ*<>Y!zaDwti;T(SCLJ`BB_^ApwHS1LueE -z=*3YyevuQIQ9PM5h9`3pcq-@ismwSw<``v9X9zW$^CnmIZ2lBB7cf$JLMAYTmjGY_ -zhK@{;(E!WH}{ -z0VZp;>^Fr=_+8<$=(k17_)pOaepkGL|0+q|qW>;UArPVEccrPdg3IzG{`+bQcU7b_ -zXA-}!FdmoyV0ivf?yW%#%P%RGTdqM2frKDqt%{G0GEs -zJY1K?h0_Tar$;qT4B0p`U}JxuEgzV_=yha*@P3z#ce)rW -zoWh%JNxa^g!ppHFUT8_<`4$V$wOH83RkWx{LSu~b3lR@5MqIocrIbuvUX3^i^jcKm -zwP>bXGXplOP$NlW#?QiZHA2#hErc0sb)Afpp8#HXuEG&h)-ncu12qm_YjyB?o5CCI -z8gH}_PLvde3Xl*=T5SOn!bt!qL4>lL?BvPP+pRYK(&mc(+V0|S?K-2iz8Jy`|Cupf -znQ3G@yIg$Lt?^a2gD-p1_^d05PkPe$=(a#?<`)%y$ -z*Z8*Iz{`O?7c4=g$v^POun_YI@w5K7`rUd%k;{OYFtRTxHRVB -zN`lipEkHvfZ`Fj0`big|86UA353y+%tuwx;W!gi_tcUoFM$4>5e8v&6FD5$YgMJv% -zyh51!_lwS|2r^tN>sT_YWrP^<$1J4@SxQ1q~_tx2<_SD($k_^E9UEz=q^Oz2|yq*h2PC97G1uSCu)s0gMgEQ`!8j11z719Sc@KOYoD -z-odwWr`PeGOk^a&c+Kp;x(X)7e7@g6zJv)dP(X?^eKRqlxqW=umtGepiJ71Gk@Nu; -z8ul%CXq(~RPZzDTE?Vb(#20+|yBMZtVIF9h_Hm7WzlUs;a$RiN!wnmv)@2u!qb!c~ -zEwP9d)= -zB}sSuZz-9wBr4hXY%>0w%v4Ac(2}mK19_ -zDd{0Lz%NM@jz%?(w4`w|nnq3&G4c1$10}-_K8UVhQ0{bE^w#R|z`TDTNx|oYcW3K$#PsdqKY2f8auBkCXIkE;Igcc^0vCvYKNhu?o -z+)13Q1W9JW>Y16g1kkcJc?rPfXJ?olGyW|lmz=;D8FN34{8Rubt7j8%Pe#GLe+Dr3 -zHn3C1$G!C)?yL8IHi5|on>#_wJ+(flJ3SZNPxF7EXP9WlG_z|=Gh4=%>Li}2PGVz?g@?+P@%#J*{5EeM|CzTaYh}MKWHK3j -zFa(+v{H|~Xzb#xgDq6;Gik1an0*E2B1Td2gF#lba26b1tg}bh%@ZaTxmNb6PX-h>C -zf4KT{fT4;17FDDKU<}0Y+Dv1(P8KKtnE+r`frM~Un_2^u46Fno^H7}w>fw5YM{6}6 -ztTrJ#OQ}HV0pHDSUI?#drOl -zd=vjeLgB)M!lem?+zEyJ3Hlvu@y_tfW3lFV8dt_FTpqJS8|`v(HBEw -zzf5B~9K73Z;~(udKI*XXS(nD=-R$k41rq+EP+)5V^C58rYM)9>OyzXn&z_75l=7;y02po2q$rb9?3F$0d6{s}Sc -z7NVG9Mvyr(qVdCs68$)$#5;9<)W*e8OV$r_M=ca2(kLC{Dw&O|6HLW(#LQnarWUYJCm)Ma9wyShd_WpY@inH@j=xvqND|ljS5PtFpnT8; -zOY};Ifbu~f6$3gWg=+%}RRao@{WdE598~rxRNi!drfWAeDz2+lUG3FU7+2n{QPxGd -zDD9*)N;^E1bb2W2a76_j8u=ZJboNAf?JlS*t!v8Rb(<&3Y4<=~Zg+9Hb4`~zU0m#P -zalTXIT)W1PZ3;iME1YRFI^C*qy2Zu!aTh1!9!|tunbL5*^W&KP`sUC~*L>IH;JappgJCWDE~N2Yvx@^%6DK?#4y?*NcQE4OP|U~SxQD|nE{?Q% -zIM(KicrEu@d>qM=yq2$zdvgD18*sP{INIjpc)P~;?HVWB6;5_)F^7NO3!LppqO3oO -zo}`B<7#{?uDyt=rY^WE*zFEEE{a|`RLp_TsjSRquc|VglmhE%76PN^RVm$Bk{O$La -zwFipeVPcTY8GwtF7L?_S24UZx!ax%>iT#7u39MuCfiz~Np8$J!TBF{Zq -z#Z181d{2N0;N_p40mu+os3j(UF)G<|Wp%J~+DA=)Qc~L%IgxW*0k_sEANlm~G^Yes -zj>x*0gYQEroCw>pLiSw@*xNvONlRok|63v?Ey#LU5E_tKT}zu4Hv)|Ka4dys+mltZ -zC8m#AK>1AvXCkwx9af+(kS2cmp6W&&oQ}FU)$HR$l-tA+}C)k?q>{h<1eUzYiVmhbYH{I*T`;%nBZ{$DF5sXCN~Ch{`nN=S9hHo -z0wLxeLd>~g+;?sm51bppLq8?(2>mgaMzQ|#7}j4(;E78KY`ADv%$~fQz=oVL(Nj6& -z5DCmoVB?huJauJU#OtRCF?ocTDLh>;ji>2}DV)Zp!f9;eDp|o4)-ztYU|QmpA1frl -zWFV%%K+L0s)1cNBaVo=U3@0<3#>|PZt~}9*+x!f=#k+%8I^&V -z%@s>{rh-$MWo)im!Djkms*`xEdK#=(9D1t{#LujYn@9oKDq(qrNM&J^BlPvdP) -zG+NX6Q%f3e(qGd;Z%+!Z@;XYtjU~R6*P{+zkIc&lCi%&;#oBYu~_ -z_oBeKYRbS%05HbbA3)4|?HccOD7@RjsAU`f=wOh7CFx{e^t#yB>)~*>iv!&nd%7I# -z?6R?g6Pq4|kFLA;h#d*N3SUzKJubfLbFsVM#n=5V_71rCwqIl4pvJxd12P8(=#No2 -z(r;aV}xw!nnevF@?)x3RlJya+y{( -zPWZKuKk1-o!baJI!nFwpH4{p9=$j^8gl9CuGYZjJh4`FCE8~?HRVIzhL-&%0o+VCP -zJejuitpEmKJTdbVT1JvS_+g3XC=-ZMzO0roWoW`8r1| -zij;QbgVCtvqjO%Pc8CyT;p(u5vSFZ%)0iPGx;m&)F{n^Es8BsXKaGv*ehXE78dd!+ -zs`@=tXH?ZksL`t;&|JIWqN3O6YLAQZ?lqNldnoJjP}=39q|2QTt)QMlZraj9G5LYKn%E{&f$70z|K__0IdM^0(l -zU7T(AaHh@0DXyNixHuV8I7u%})WwO2&d9@wh%4TjV_}6OA;&1};3(sVW7;U{;wV2X -zMJSq-T^tVka`K)$7jtp6#l!J7S9GGo#mP<&-*5QV?Gnc -zvcbgwj2QMa{Vn`(9KZ_`t(MiAsXiM@0)WZB_e -z`U)_&>|;J<;*{Cvl9V`R^Y@^4!9nY+BPoEg9!8(bl84Z;i_iiM`an&>!?k`JHA6O< -zCp0=%fIjWxx`O!BDuyhS4{2N*^HDPkR8G?mXQ63MNstCXf~#H((-_x4AB!myHV$=K -zI6J_Ib`OQa8pXptN=Jag1n~WU!q=V4IMI`qg3KwVYdIdK(~iU=^YL_AV=ColzI5Q< -zXDv$bHI^1{&7_8$?UObd`j#aXYu<*K^wSnsyo~=R02nig`Jds1P(#QeAQ-T4Wd)60 -zFZ^eJeGaJXOCvg_Bt(E78+NWVO?tS{X5mnyjYA1CxB(%t0$4j3+$Ycbv3T6Wgv#rA*P>6A5EqZl}UH(+!^z6GQ5Q1-ers? -zJ&ZG|IR$7N&^`bFAOJ~3K~%&O9!|%Xa4f>-A;$ghV?K_x@I$|cm+7GbkDhHn+1OCb7gw+Y!jy}!1ECY -z&xO)>mfbEu@p)9^{fNe^5mRKjF5+Qb -zNaNM8E1SYbod!v^|XxGKiUOAD}x{u*|? -zaHTAIE4*+L^LTho>-jh%_QBjqcLJ85-!o;H0mz8ACMdro#01k9CY}k@5NueKX@G^$ -z@=&9XhZ`Z{wRFie`FJoR0uNtzClP#Bbz5AsOm-bJgtjd%>^w -ztKXg-!hiiZj6a+k#UFnh#XUcb;ohIdaL>5}9{6e0_+u`O;n7RucVk6%oP;s1%t -z31rKxn~h<^mGN8jRPF>e5n^&Du_=E_v@vfI)aqj?x?Jt%Czte6lpFS-R{$`)>kUZzh*Aci1wo9K@TJThD{3*wkJS1;qq$|N2xU%~GS -z7xA0?1^j2hB7R%2gx_Ysg#g2Avre|S3NhI*lMOP2n7c}{wSv1!R`C1MB>qsA!rc`q -z+)a=vH@f?(g?lRO)oBZXg?^X&u34+1f&bo$WX8yE;ejeku6aMu157BZUV|8VVIHhW -zt%{EyuCrG4NWBe;t7DJUTUaNcLRc|CBWJC`ql6lfBQV6kfJbXBJW`X!=I6IuinPD3zhtfFGZ%K;Ufqs@XI@sOI@E~dk3-j89PIP3=Z1w{ -zy-5jNV9!sWFK^h={UgTy>khb1CTV2@8uZ0{*KZ8|gqXk^b98{$Tr0cHBa`t#(ezJ$ -z%-InK?36h-s_|38#rcGbi({VX(zuJ935_e`8o3iL3MNeKvh>GHGEhRHY}!HDj6(U0 -zgNj*&YcmR!vkq$J6zb+2)XzC+nsE@44_*#pa|$hUHd^N$v@ZmpW4dE{7ZoUW$gm7k -zI%H_vUok!z@ycXATuEA)82l9yX%oFXk+Lx^31%jmc`ya^TR`Jz3YGm!s2a9WKBQ2_ -zZ=OdoKr`&(+OS6DutwF8M)jb(s+s{8fvWp8YWg*5`!%wG=GqNTW}M7)hLf6%dOcKR -zWB^B_tj9B+8cuC8*W$71(kRJzZ0NHQuT8f`VYeeH=y5=?v{Q6LA@7D3sJYy$aj8e) -zQa2|wTA=1UCp9vy@$plKhacPMrBOKBVss|%;7nYL=&w23!fS=oaR=YWEO0fAYig%j -zIo)w_s@28!Ejl9)CuPcG?(w-(?JiDtuzlUd*)9)fyET67@$qA?j~}{ybFYi%ns}e$ -z&ji<}dlXLhdN^|v_@NIt*K4D!KPAPJi!f$p_$7I>S0()6(;PMRcZhr}Xx@}6q^7$fgHs|AV*2k3`aD)^3 -z-ZJ(Kl+ZE>&^N*~v>DUHv{^yH_T}qL8cgwWW%41tFNTLn%axU}yv?;S4-+A;d7vjb52~6X>6^ -z&@i%uz8N1AWhRCNNKFBsbz9gUsbF`fi}yQe)DN&PVq#(Gi_x&(c#G2*p3*mGwNYS#KXhU01rn!Y>T?sN@!u{3)jXX -z7Pdvpcs}9d%_#8Sap0#BNBl7amj{^=7Ezwp-*-X!nO^O5@KV&qs|goeA0>p*u)i&0 -zV`I$4#$qrjw9?9WbM>6;}{V_+gxbM>()_j)7hT{|1 -za6FH?69s{n4JWeLcrv#_b)V-!)t@R3@ -zEW^v1vs0k%1TnQB!$}O+$@IyzGMfFh(Vr(FX4BO<(dKLOpft!Rh?x_g%+{M_Y`$5+ -znyY#mGmC#cJ&S)kO^{LWawmY%&{BKqDNHTE5L~nfF!x+3;agWK0yBgd0u1%7t7Qc@ -z*J#>bh8G1gl@$P^p@pZ0nU(Ousf#l7*PgWi!)pPUmI~IkRb -zXrjJB0m}L&6YCktT&u=P_}Ij{1{)h1Y;0_FP}gK*Q?rSO+YCI?X<}QXBHb`QiqTWU -z8*3M@^tt%Mpd(PjckSt``6O-P)2xkSOg3X&GgHnAPE{;MWKp6jOH{8pk~VQDZQMsUBe2P-X3C%Fr$Snyxec&g+3F{_A1}V&$~@LlQQsh%D|6POa(Kva5VJD&?iHXIgxd7GUo}z5M)jlJ<*vd7iXtE -z>5#cJ>Ep_jFY(LQr+n#=X_#Wmw+9yHHO=~Hp7YTbs(sE?5zO;05{o{POD=krJkjk% -zPmKP3ORgCGhsyy*N-VZi9+@%I#klE8BR5;QnN+5vQp=Vfd&pZ5j|^j22}T`x1J_0k -z+{n1NnG0}n%*K^;AUzn@1Y|tiOnYb;UsmI|2ho^|rcnZnBR3Shsn8>p|@}$V~^niy`{mVc@ -zsL>+W9P4p#tjERCE*nR?92{Y4mx#|Pe+|zgDHn&6jsOp#hwyW>Cs5O!ZccYxnecGR -zLmlq+WcqXHwui&L9**?+INI;w=zxP`gFcQ82KaP9J$GavfD)%F9uD>KXWhfmK|XeI -zXn^K$;Mj0NqVOv8#kweLk6>+f{_Ie5_@uZ5Np -z<8FCF9VUv^PFZ+uy1oJzn)9phqQHf~#hde4!^cd;!GhzWq6;{r18sY#`7SK24pm}5w -z@uDr=IrOazO*=T=W#e7Omv`8*qP0H~;6T*FzKDt4F&pp1f!}um@3fV1D-+1tm`Tv0 -z2|p~OGwbvoD= -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 -z{i}Fn9AQAJ;~du8w#Rje58` -z=1EAw3I6v&++>nQ}gC5QdxH!|V<>7RnU)8BTAJoZSPIEZb -z@o{$pIfHL;+3=csM!e;pC8y&xe6iqrmAg;MBN}Q)wTk(*aJ6`SSed -zW9$|Qq+>+&j089_;;WAj+tLa@YN+YMdQKZiykOp_&uooR4ldgj)&&OcJ!;w6LL_B=R -z&ZJ_1rg;xd(=J-40K&_@AqOA!n7A~~1VBi^$hz* -zP5~1O4hCidbc|YP9nJmzx*0lLmvwtnb(D+}gmBxRjnh`|49AwmM6tECX -zz6@OS$No})A-oV`sIPo=PZnR@lg8ig8OJ~D9m7BEAIHCZoW{Q&%HZpVGWf=!G`@8- -zr`E}i<#7Ko<%?PKSr%)L=R~}&K0cAf+7lV9JDJ7$&vT-6C-PW-vQUK>!pz1~#buo? -zV&fTAZdrGBN><49$>%A;%-StDs=-f2cgq|42F0VO1Q=P`p6H|9_ -zUbTuiyIQ78FIO1*Wdfu8FzaLzW5^mA -zVP#XZ1;Wb47IpIR<|d_wn{8n#LZQLum&` -z(iV=6n>dy>aHK#Jxrt+011H#9lQra;QO``u;^c-R6cLUDbjB>O?}XYrYGW_W>YVC~ -znD}5=d2#sbzB6LU_we?x4eG5SOB(Or7<6Q1?)L&gE`B%YfgtodnfO%jN*`t7*DU{} -z`c&-k%PgquH}GO8UNaV%=L-V{emQ91*L?euhL -z@CsM!22A{B(8kL{Hhw+G37Coh9yGCQ$igQhHcpMXxH`@oZLT^wxISj%>ZpY)BQ`FL -zSU4BH=ESInV`DCkj4|$%e`YrJXPl}IragQ-&IoQ(JWTA1`6O@SP{F}bf(!p=UU0?# -zLJti6FJ}ra&K7K3C^)!Ow8j5&b<)Na@xM5@O8?8OiyN~pZq7OaF1!Jf$;+&V_Bmg= -zDL8$JF0iA*M{GVoVj)0sF+fUg)_jRuR*}mdZZCQ0Em5w705D-}aLL1P$rqqu876yV -z7{AP}m~cHJa5L-U -zR?bIbo^sKgqX;!F+OoE&J>#M+qoy^@X`n6bRnY{-s -z1PFdj4I=+P=koXX#qvqQPu1TdzkVR!BmEZa{#dF2CEk>C>f$??_G!@e&@*i#Iql0N -zB|Zxz<{;ogc;VyD8K7|zxRUc_-LWYjppP9Yj*qnM<2EOoc^fxIE3z`yTx7Sa_C){y -zAOJ~3K~xWnic;=iL1E5Cl*N_v>~v9P_W6p3IUg8s0$iJ6EPn~_43=?in*JD|x#Xdt -zq39c$h?o+ -z`3lmr%8x?uBcyOmY^6zGO;A77io{3@&!HoA@|xpnZboFadrVxA5VBN)3D|LbHE>b#V_H;}+H@ENqAv_(8hBE*?z=cp?cro&>gY0+S5H`@+c!eK!;h{QR}4+H3k^Rwx$8s+n3h3)jkO -zz=jZ`0Y>{{2q_yo7~8C*{W0{&tX>(@am=fq|8k$q9ahWQm%)b9m|D2G^Yt>+5M1u0 -zF9V*{ufN-CHLTp}{L0^cl)>MAG%f)1kNd{)kNd~)PY1^EFCUNN-#$rK4gU9jniq(< -zkLzS1#5{B?BjB6Q%ggPhL>;OWYJ|!yfUXU -zH2|Xx{l(QZwhS>F>5Ji1rAdikBM{SU3E&W3G}u%jrp3X-tq$s2 -zZPZcijub?(Bua{++Dxo(U)H)d1MAu?tZOI0SRlYK!@a)UKwVn}b!}yA;tE=88JpWG -z*xFXc&h|2%>?q?uB4zw2R>9BW27ZxL=KYs@RFUIr0}kF~yF9y1MjY(oI@5@UPexoZ -zgdQFDWOBomv!fX`u{kEw8m^_;B0gU$!jP<}ja&F++``9WCO+0T?c+A~rEQ6oW~{L8 -zN}(5o$!s5tIrw1I6}>;^;$2y1v+>TDjd#a9G04*-&-J-?#sd6t#1Xwc>fo(02XZpB -zphhgA)OusYg_e|5a)Kmfm1-?d7gy@nygBAT>y1$x6n~9(M=g9XY+&zj1&2pXoES6Y -zX7xq}Xv_gETod7$_2uTeDeIvjpXF_w -zm~e5T=;CD2#VPT*_&77Utg}-A&QCE;)yJi2Pjq!A^t(*EXqa}RfySN^3Y#$ -zF<5diRCY03@xtkhA3}^LoiQr`hB3`7)KilfMm00}jLqWXyqTGD(UP~&m@&cCoCf|m -zW&=@EE|6&q;e|JlEqM>EIS=hQ2c0<|?YzzgXw3xzGwm54U(mRR_E2r(0jSl}n(E_m -zA5C0i(;gi9a>m>h{v7V#->i`WF5pHs!1atTKO;PAMVPrX#@2PlOS3!2#pMxSbV(*S -zzD)Z#@e_>&xH!J73u8Xcj(Ipc8i>w~u?r-S0>pFa02eYoE@lH<$^#ekz}Y--ItQH0 -zu{R{Z*|dYJX#=roOS&!Q0nCSS$IEcA5=6B5ev!q3&T?v)1{WrYRaLWIR{Qm8um4{G -zruJ*pPFi@)iHsH@h8_-?1XNrs@*R51txl2%WQ-UdnFqQj7#Zv%H5&+E#OFQnh4H_E -zj#(GYldeo#ZjRb$PFvE$G{ki=7wBFBBJ?n139b%q<$*RGtvur*TC@GX -zAUD`^Tx0Vg<+A&R%2Jg4Y1%`q0>lgp?G+ozvhvU{osz*KM+Zx?rbd5G$#t=4+0v!M -z-^Z*Kh^J#Fgq76*Gh;(QM!)mm~eSS(3L2`3`-&(J?Y&x-&IA*Mzwnyfyy{VJ>w -zS_m>cYyC+qDJ|Op$^-^REIXb+RCl3*&dd_J=3Vp|Kx;9;>3$RYJD0Gp)0C;pegPLp -zQuQR-I}u=4dkLQ=m(Vk*rbL_!%@L#|D1d(!1QpdUqajB8O{R|-lkmiXN={&axg{5d -zX@gU$R>s>iE;;95*Z{g_0s7fK?6f4J`Eb<6{!SD7q9uG11742;Pj{5@R@Wkuvnn)! -zeJw;-14<+N2O-e2~g;@%G?=YS022Twz -zl`vlUivUAlsRbB){Xk7xnOZZeV0~i+8ycB1wtOw-{&2lauab%PMLaQTTC-VCXqvfN -zW}}{JwNc;Zpsv+WYA2YOsP7=mnAk{ln5g694jUUgtW{DU=kx129IU4quHD6kHU}G9 -zEo^FIV1R`!Z6>z1S=ioTU`MBc$0Dj5=BX$X$1MCf$?g>wFEU7g>s|dWemUgfH=K_2 -z+jytXz^=iHm_>IFoA_wNl1a<{Q47>Th7F7}aKILDQBxYOq**vLZpz7PEy9hKn(C<6 -z@wF5~3l64D97r2DAlEhyj9WO!sZWM6)D8}eD>0IIUyb;f{+^G=xQgXrf5yW;kt-3# -zj4{5O_GMh`&DhwNaj-ADS}ykFTzr)Gu!qVy*qe92iOJD%8^_Z&&SY6w>f%O$69OBp -z1qbZ~3vC4p?F9!N1qYo47wvfmtrISqiY^)^UEG**#IJI5(!!XpHA@DdM@OWsR_0Tfwp>@_p`z%fVF4%7&H*{k5S3Vi8nstle-$n0|i#|?gN*)GF -zF2|;B8+{eC@hxZa5-s1DgGTL%3vL&vr5sDn?qgk-n^Rf&r`f=6c68?G2R2b9% -z%vOK}!$HaMkX-<-^%^)Dna9nni`yj@2h)G!Vt35Pt~ey3d4I&h;h2kkNgFT5T>Mw7 -ziL0X?Mp;l<0(vHaWG+BY#zc4CMJgZ2q$SCeu|j}U&O<8gp*sWg(!8GsP7MJsCro@V -zQNg20mPNZV{n(iT9!WvK<%xueCz2L+rhGgSHs9}vdU!GEVRtX^ryk%(?XGxM>bgB_ -zrgtT(yfKeQE&MhfU|*8I2jK0Pi?=&%?25PoFE1p0Jf5_%qszheUSL}f1Yig+I|wcb -z4_p2Wz(|}jCoeH2HEr>g!JpkRF)d&t{Wvw!W`3Rg6^Z&YNAYC);o6-70 -z*9?6yp>)5@>T^veCppW~kaDNz^vCXWKG@EP=1?8LL#w3YoAoIX&S9jpe(ukm3=+`r -z@=%zh#*@!|<*z>+!{2;3hQIx241e>{D89O<24eP)YX14Lt{0h}wo`+Wbl?70nuF?y$ -zsIK|=GR1W>Y7X_+=CJAd0_v|Xq5kS3?z^~zZ*hg}?3~j11$>=Tn3}aRLd*XOV6K$$ -zEvg1y7_&^@%l(8Fu8v(T$@yLSTx#^d4FmTPTx8lpV5xzYRj^W>wuH~uK33O^Tvk3A -z`exQPD6MO#fLbpT8D;X<@KWDoU}IAm8=A_>52GhC+AkBXpAls0T1_$W)5xzTDizeV -z8!}<3C%kadB2r+psnbS%r=x(T)5eAlE0m3m5m!{#;b3FCjrw*Qn`%_wZV4O_Y&O%Z -z*H)I`fGzD6Z0#`cL}wX~#>&_lFJWt{jK@AnTheJgNhYL227Ssgg^SlMd -zUbBSqTEWGQ2^)!3Yrpe1La -zDd(XfAE2=SffqG}@zGZB(Vq9wUU1Qw_Yldu=qv=w$_MDo2Z->@`8D#;N#M!4cM&H# -zoZ=|RY0G+Otx*fF^M0rRt@!}0g#ayu0IiJ54b@z5(L}f{_|=ow{Jn5Bj_=;{CQ6;W -zW<$FdPHh-B?cr*c@ZsZn!N=7+K}P9v*2CrS`icNdfQysB#cANeq>pRU0j?Gd+$x&r -zD>*0zz+9k`#AwhreBRhoD<>`*R`gl>@hY4UQ0}IhRWw3MwJdVgl;rM^@|vJvDAVm0TwKmjETV>XeGF$eKasQ -zqM!`?ecGU33D7<3BUd -znGJAYw2Y6&4P2QI&}#-5wSDxNmaJ5@&H+cpUA)`BC=vSIWni8YE{E_!pNEA7n$>N! -zK1M*{O*_r?>^vdJ%n@RE1J7%VQwUG>z?3~qmHC=*ozGz`vJ1m@1zs%6UjZ=HsY?hi -z6~d0a3@Un(ra?wOmhY8Q5!XeQZ*~+NM2j9`OF-*ffYU=R4km3JWL$XM#({*7y-Aj+ -z0w47NyHhUSk1pX*S6TjjWP#|S!__-w!e3wt8vhKKDyDzW{Jn<1-&y{9Vz`(wxLRfl -zyv%X>V!Ftg0WJ?ZI2to>bIeD72}sTbxHxR%!_Klq3iHPQ!>ErB69L{!0l$m6_*Lf; -zPLFyh&H>YNE(Rt&B=SIlurg^QmG_X~iDpS->^$9>fotl -zfTy}#Je6|rcnToEJeCB$7xnSIn1?5m^uqv~y8>)U*?2Z-;ouN(U;ub7>R@ZcMO_N0 -zPX*Y*QcFG;_who^$NOEthe_bwn2UE~9zI}S6eFLz0d~CY?DDXq+r##r0NcBO9pbkM -z#AmZP>0vW{I5q2IYK=^-kLfisPG0Io%itmjWnoW@f|!-?QVTM2y&7ItrIxLi$B@!Y -z7H5idw@id^69Ud%O#a#*Qwu8US{whDp+--0G`OsOte@BC7r!P@3mmJj?*t_pOlm*I -z>(!sDU-y;2`fwB!Aw~dZ?>N4?cN~AWFO7fLKdz=R`_o|DGQBa3TmJgttmqp@2{U2b -z^06H56OT+D-~Fr*f()lJd8|265Uo8qQ9XH0t^2%)b*Cn==JR4zYfnu=Yu)K7tUoiY -z;DrElrYIdT>(5MKof!Lo}ZVsG69zhOZX`Zl&E`%6n>&>+hTa%zYo~!nBBn$(^YP{mM@0V& -z#Wgg2@_KuF1wV{9_-Vw&f3}pcwRsNf+UN0Lq>POb2b(#~i7@`z#G?@tPed(zKWd7k -z6f?>6FiXf+tBi}%KD>>jr8AvJ2_-L#EeSr@y~YAtPV#*vANOjXiqg{{_q -z!u}ObP!41)IX}+vq|B-gWi1@0G6WtMhjTs-XFZ8J=5y?9p=afjyn|2jymoO&J|5t3 -zCcx2jfa4h#XL1CN01XA8Ee}Lw7urQK?I1C3Ba*cd%Q}eXTu~zLB9V6xD=0n^un|je6&pjp**zn&xjyX;Heau@Szng_@E*JI)oji&YX+Y(jVhl`>~EZCp=#i -ze?9*CS_D#xrf<;%zh4(^6P`4+H%|~$2{jIy1ads__%!5QP>qEE4S63o^B!(Y=)boB -zH;VzTPx!c2@NlibGr&!XU^C(2(yWh*GY+oISZJLyF~)c3p^~`Ri$b6vkT6kfK_)F~ -z{fnI_8dz#izP5IC>u%RH>aUiDi#wfnhZps|-f2aw_Bs7E`D^k9nyW*+k>`4mcy-w2 -z;``vuFS}fBPXoy*$UE(^*#Pkc579XX(b)hI#v2#7QlubN%=U|%h5#ds`z-;{X`rPT -zpk>NO%cPCSl!xSWAVAX0)yJ%bXwJj%EaYdGoidAd1tq5H0X`c+wT7QfHj_YFH -zP}C@If!|Uc$nj4b@2z!NbakH-S} -z_?B*9UAKqFVr9IRawW{;KtJ$8w}YLXC2XTnpB|YcusP*pd(^~FlRownUJ?P`N;r5s -z?qGK!z=vJHo87=qXw*-+c%my%&=e13?QAQP#c0rvIjE02*c5lG-WTnG(crTBtgetn -ze6>y%u96ANL~Ej#8Na+rH2#aR|1J|6J&E~C&o9I>{~5s1ptJg9C_q)=${7Jh!;6L) -zed_1+sh_Vsb+~{I7+}ait=6^ycT*K$2r+-XdsNoRzPdLp5JQlml)0Y}lg7V(lEJ?p -zRwBqq0p`&h?&U;AASRFdk125)qu0wc#PHPcq5)=Y2rmy2a6T^zyy%kvL&@|d1Q>c{ -z)}NmIUjxj8=chrf1{n=6wdZP((NLoSrj8JEX#qSpURe~?U0qTsW()xc$Jfry;orGl7EWWn@g)#Lfcef{0OsB+WtBd5WvL1<8e~?V3TR6B -z?)5V6yHTz}%zd{?xW8ffF(IWEVyf$74GLrkFSP(un_kAWG7T{sZ<(mORl&mzCbl-2 -zc%<3FmPSS^FZ*MbCp4x608|spnhh|eOyGr6n=po1gN#0_KqFHd6ZLHtHnkhrEHF|* -zeY+C9FpOlTwi0Bt+AVC=>aei2!*T>QW;OF*&{iz2qWa@)XFFy>M-e@S;J6Cu3dJL}rTdwi0pcsr47rmlc@_ -z3z+bLp%P(Y5zSds;GiY%C}aPGFE^KjIt>my`Hr}T7kz4oiA}H_TLH}-&+vwXe=oH# -zBS53!sNf=^HQ|AfNkxl%m);lH?3{E#aSGQ?@T?KRrlsgX!HkEdLZ})jZJZ#qc(^s` -zhe8!%6v+6v&bZx4;MR12TN4Iar^^^*Ty5xYVe`G*{Cl3j2%$t7^HpJ^cv-?^F#28i -zajh=`%N@+~cYqgyg@z1$S{`8W##z1}brXFjkdYf}>2hI=^Rf(w-7W$6bvV`GJO1Ls -za8#-of1fO&b -z*^|Q8$Rr^YXd}c-dFYt65uI_tpP@EFY0*R9Jfx3=&Gq8LuwC)Fu-%?-I?%(ie{e}W -zXycBFoao9g$lNV9s$hhYTbC6V$+OF;}lMt&WFi{)aT -zD^;O1z|=+@GX;#3kuqbkX~++!EgDRC5>5y(7NMyIT2^1{$xOxcK$&(RpTp1PYZn|( -zCa~Sp0Xn9D#%bWhppAWT2m2E~4tBXX(B@dP$T?jJBrbY}lP)s=W21Fo!L;p3gfwHM=RBZ)KES!Y3Jyk>&`jSG -z!y0CRYncF_BrSXpwIw`YZ`{D{l!JG=fZw*4u{&8pOBNVj0(z!t!uKHmCQtC%menz? -zh;e;PfsBXlf`{HIAUO>%IOFw%>OXrTY2(oz;89Ln5?mMau`}ta#IJ;pZ3zcl<$5d* -zY)ClR5}(5deI70j1BZKopF}N5BHO`;<(MlFL+{HY5f{%fZL9}UCB%pT03ZNKL_t(I -zm;`o3ExePk@j-VWD`&5F13yc+cs%KdVV@DnI}!o5#XW3|`O@*SDXz}VoaV%oabLrW -zn#Qc0!0^6cHOy>YZRn2%D||8XFSVro{#{aAlaEx_=4T?eYEX#|ohy0847 -z-6PNeBy&zu -z%j&K#VePdN?&l=s;v&9reo>kCYbGzXAfu-+_g*Tk0GR3&=1K_~U?Q2?VLrUU{Er9tJ-orIgaPhl*qYotsNVCo4lw@hqnFtEL`f^7mY?1NG9%PRmz -zM>01OUX -zs^Dj#SjPEGmnm_~PxI`t@l&c>#WAx(hB3^~vhEV~j+#a5LwjIZvOAnzjh6@PCwCM`85pM5v;JF8)t* -z(n8Oq38vrlOi`xj_Oy-O83*iGp!#M#^v`%0q^3O#&G;A;xfq-c#i`1ykD;pg*u~JS -zi{UvBBlDCSo<2qwJki*q2d<2XmTZhI*)o9>^+BP%r~YB$CxK -z6S7*Sp{8Il9f&}qCNk5!i7`A(SGX3!E(>7D0AhUCJ7=SXH~o2ErWwse8iRebPf#8@ -z1Sk~5aP5bR6$8YJkekow#N7cVR`3zaFYAkt;~`e$-JZe3U#V6uVFYXrn&ChVWA6*Pv?F!PNCi -zfLT3t(T`WJjcIuKe+3xZhXNN#%kr^cyI7!!-0>v-m%lGgEVwF`E!*<5&l|}2On~^D -zC&3hq5AU4e6cgx}0NVNUFdd+aiCl{w`j6qqvK&-g8}mVcL7O-30gm)J*fZ$iY|+Dj8(_ls!Qx1URsvDY@MTqwF~%iE2y<#_`7(`J4KOU3 -zEE)8+02aT70E{CAp!`|{Bh!Fs<3oCIxH{J5xf%Mp0mk>pC6hb<`|4=0#-7NB0F0OpaHi>=ks*4Ap=&iXEz^s0bvC;auI|5A&xYWXohL*qNBuM%Q_=yNB^tAB>0yFdAZ%u|JK!*+-4ztNYTTzdw-1Kj@UQ -zL*w|j!)g56ku<(`B%_S}N3s&TeD9}O-1}Khbl+!rP~SaXzyrr8Lgn!QjsGVKq6beD -zP%8~I8frAm=!s12$rZEpXQ>%EB~tmUGWiR@oSni0=ce%B*%?tS$Y_9BK9^U`G{n#= -zqx~`hG?(YG?(#ecFPy>7{y&fyyu -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 -z>70l7kSSd*T;o;BZFJB*cR)PRT75O8Y{U2 -zQ7-@pmPA@u9$`GPi)9JmDf(Dqkbft4q%AO>|7aF?snNlbItPoQE|$hEEKOK=Dq+j# -z@$+A6w6HDi;b4-GXyafK*q;VI%K(2#*w_@e#IR4`;Vh0)bzy3mKLi+F^PU=(RuW(s -z$-Jb|!{T5Rgvx@Vpbi@V>091yRi5IA&QdivW*DAP}RJ7zH#u`7u+U6Na5x -z9vkJkdAPv|C8JHRsHwCx|M?$QaUKbka?UQ~R7q-&($f=)hMt0y0804y(H|KFD|4L! -zFoc(%?;yPR^NXFGxO-P8ez~g~ckllG_$y^SxO-nOe!0I#%>CkxImqHmu9HoBV+b<$ -z9PP)w#|FL!GK3g43S!i$U}j2*IWvTLrw3&SG74V803#3+0vINfg#kt>FyT|di~^bY -z7jjr|(Kq`mfZ@p$vxhi=*O`%A(Ykxz5>sm$@E4aIFN6QeSuySd=t2S8e-J-Y>-hZ%#zz0ID{Ah8mcn44J@m+v8=|y(pvrx)5elI3rng?c&c&? -zn;Xh_J8fZqKX7=^!x!x)UXJ-|X^U=aSRws08rIj_5(e;0gMnunH9Xx=7SGGtMhj~q -zHrCd&J=nzBh$Zl{Hs(r%r2p8$dZx29&YX=A6X9Wk%Ep9+RcRBek{UL|O884u$H#FS -z+Y&Bzrd)iPa`0)w!Y6Tmw!~~vYu-!Q_*crp+bIk0CJeljH1KxHz&}$aUQZi%Ev@6v -zX&o=8HN23~@M22COMw^X)wGV+(taSp>lqVoWNiE`W#TU>{~m)1UTre)=VlXsZZ+^~ -zyNSQFoA_J1h1c6{ywPssA55TWbMO{RJKJ2D_u3rs=!j1z>)?Z|E!{J!<7R8tz$YCV -zKF?~{o@I9KIU&%##&E-v<&;ESRggEZwk64Oji1-%yBy=TIi?|*To)|j}; -z)Hq^Er$uDcMuhJ?^F?={6v(warcZ{?+hXjex!)gp0IXn4X&G-EvmlM*6DFb)EbX%p -zXKLA`h18^2>~76Qui+P9_USJAbO-$c -zGkhUy%8OZP)MiYq=_@jWHjv5bxYeim-v_Q>4MS9nTf`? -z`Xm&1G>!z112rZLG=vv_d{t})#1LpgAVYZJzP$pN$b<)u-@D_YZqi2Gq$Ou9yGJH` -zkg3jj@CUd#0aT1b662~z8DH&T*!97M@7fbY@+_mI|HJlE#gw`tXW)4uxZDw5<^Ycw -zAaMtu%bh+(sVw1B0ZaJg^Msd@=ml* -zwM6yorebJ8yhQ{JusG8N5@p~>kB-lpi#XD0fIb^`uJ};tU;sdq2b}3K1#oUp0NwO> -z*#6p8f#r&pg9)z1u~3vz#R0G=K=IedLJ(t2LySrRE18TM_LIU07_uf7GUii>QT`U1 -z^f_U8;kEi4fgG-w>5%m>|Kpfi=Ks1}U-MNM7o)lduCHEfE8}3w!ND|eIOX9`!j{<| -z<@%V1{Y}6gssnX8b~Y4I(QQirNXg{Sxr|X=_t(FQe(dommDeAbT*3F!^_o7!=9t)K -z`+m79M(i?<>g-jC#Qvkz#`0d4dI -z4*9A}V#xOtQh8y&OMJjUX3#)-z(it@ZwLW3{lLy99e<7Gu{oh*ecZvis0+T4w>)NI -z5ep)zgb-e0y4<7RM>y@d>w`uUQa<#pw7tZTEv~vCo`j0CIA>h%=adMm#L2r0ZbTj -z!q*B^cq&ClU90D~hNdR0=J1;LALH|(LQYYBLQtb1=EqJ37ldav&`3W{NPSTdM4A~-g_Tu;Kk2%r{DZ)HHfP0Vo>tr)j8LpR|2(On7 -zV&18tshR)PFdq17UUE>SHhGU -z!{;8Osh@tAP&%0cl{?)h!2CN9!!CFu7<^I -zY=~J{A2aZ5q=YvjWqcGjurpy}N7BaUNef#N20ly}_$X;&OVYw81e>IVPg52?P22c1 -zW8ssug)M0lAEga^n9}hN{6K|&pIJ%r~rFF<;47}BB;$KWrYj*Hq)=T^ -z_nY{{?TSYrrpFpIxPIN-NKt47XH<4;hlC{R?6OQxA9@SEoGxy+8u1^ -zaPd*6i!GfVKI!zN(DRF|gY6v_c6K<}-QoHrq1`6-_Lw-(f0SlJ~ELR$_yiWh -z2Tyf98(R2SsWK(qhZy-BoeE1Z;*ar7{`9&q5FlrHqPX73S~#7ya5(MYP_u)BO&$&> -zJsgVZIFxh*TDGNt&l^qbZkWW?b`8x1PXMn-pH9KVWYGfwWK;vjN(RQu<`2RP!DhSw -zNjdCiBzwsQqmtY69=>G{S^YS!w*s}jjK+3xv6HG0@MQ$}JnrDjl!Y&o9zKk__#mob -zUs6ZI2+)%A!1dhJppNvQh2}vZIp9e_Wr9jezk|$xg>)aihaULM%H11((gi*;l{z;Xn%@gJ2lZ=B+^$wOa -z0xRPVR-_CpO&C}n16ITswd~@hgo9lv;Omr!GYK1~(=LuSQ+aXmV${N#s3|eYi<6$f -zi>NQ+y`c)@LkiWHr(!Oiq#sA3m>r2xCR9-^T1@beaph!0b9fY#s8cC4e9VM2j(Sec -z&}x|gPLwNiYTeBD_B`20)n?{A8SxOF+0Q>7@xBK+VR)JAS}8NLpL>+C&;mq+6|SqP -z$2_SB&4idR&=6c^KMuo;dhYRtnE(@pnW&vbg&|7XNXm6Tdprjb9(_!LN_>;5SEm@!KOl#QgDCKR71(>;4I*r8}=s*FM$_EjQyeYF{QlB -zKIfg!fiwTY7#0vz1Xc(v{ycbLT+|p*Wt19oX&et-_Q7T9B*4r8F;rz9yH=D=8Bu0f -zfO)-uc~=X#muqDgCjGfI2?Z@Y)wO~bp7(|3{;Nf(nNnS@7Datgj|nml1PaV-fKiX9 -zRTm9vos8h3=6mXktd04q3zZi&KENo5DPj4yC9JE^vG$gMRaF|6RhIE&MM;3=ktz)j -z1#4u!AEqqP%a2$39+xn{CfNn;1wF|Yl~P}Q^K+u9n0yFX>_nLV&S=H881dlcqwY*xrl|Qsj@WaSldv>nnn$4 -zg3_*4Ecc2Sp_zWXK5Ae97eVO0ebmIdxQ2BxO;njpjTSaVn3!f_Q&h+1Xb~^ON_aD- -zn6>fsByW*`FZ+xVo##@03) -zTiV#4L;s73_u34+CnporOg}xX!^FE;3-5GUc(2RChglmRciPyRb@553i_fwSzR246 -zGV5Slr-RSC9embfiU>~EPZ5-*dajehA@qPy< -z`(2#scW`>Z#hC#cX9q2u8?y1ukc0EX4la$jxXhx=oF{!EH<)lW$^uLm6{9XHb1tgJ -z{Gl27R?bHCI04325x64Nz<0(cY{VuUF-oTq6N`AV)KA9tq_D7C_mCn~4H>vSY@=$#6OgIO -zF-;1%J;GHi54EG7tQz?c;|Rnwj8M69(J<;8y=nH21S4>g1LC8e4C8e9f_Z9!wXqrS -zGVXVZuqcu03ri0h3T#_<#C%^j0Rfnr0&pu2+|GNrHEHAaxPj)fiDA!=L*~j9RSHJo -zO7t<;s2mTIF3Ttb1AfTI685CbzE;rj@19f}erO0Q%4|1}SizFHm0yvh*_znurXVk~r0sXR?gH6-yMB0+kliM9DN|EsW}k -zWXGrSd^;Qi>A|+gC -zby3&PXlxIc+AR6~u-}Dd_iZWu|KGs-F&BTY)v&k8l9V|rFX=%I$w3pD0T<0o6C1XX -z8S;=EaM3gfWcn?n`%R>%+KvO4`hbrcCh>CAz>9Gg&&7ca5g%R%F)L#ZRK3 -ziF)FTp*M!0qej-tB0lIWju337XGw(M;$aC_<)ZM1j~o4uA^a>R81ZXQ!H@zN|6C-n -zqSDa(^T~({HC#PY>dn+Og9v6pk3fxhZMdpNz#)K4U#olSNW%sRkv_0D=D&~i -z$@n1ChkK6q&48KvP7WYE_n#UB=e}U>|7r-F2Tl`UMy6)|*-^|tH!LHoW5G4=DJ5n$ -ztb`vcRpx;UW4Qmq80MWH!~6^5Q?uZL?~x(MNRP}nqq0)QvP^noXyTV>WvVivwKAo~ -zsC6=`HdJKP*Tcf_G8e!opdrXiLCe)5<^^yw -zb&ntucwfS&QeVRNcs>8yA{Kl%_bj|w!a{;erDI)X -z8LKMGc&eg^$196?q_QxjzHpU{^F#<>WQ~ll5=1B8@vJUS7h&GvnmsNYNho743{C&H -zHE{iF$!%R$#kej;fDxGCSxpcze6v3d|J5dz)mf5S#txZ9H5%63n#9`)9S6IBb0fgP -zUJqMaO#C^bVb!fXmftF1MNJWF>kHTvDd3ex6Mu==cq0M)EoS4DMh(w4l(4>`fVB-p -ztcsMeu2Gj&GOm+xW}+a4-zImN?O>OwDAeo&(bcwNIT-GA;idJ9DLs7;jS4f6s2cCQI9)?+nIaQSD$1tViV+&+xnAbVV|q^5uFjOOdNny0^*KV!%$bUxR-h7`Y6WjfaS5p} -ze4)(MBC0P07_N%d=e?<^oAf}4shi{rBMb2{1AQ(q0tG5AxIQ)R(SPBJ4}^+^s4)Z= -zdSCdlbF6}W4_xN>n12UiW_wwtz=ZM0fubU+N&qkXntai(Mqq`30)aP2DMpecX85UF -z5{*n_KGhf|i#ZU3dl$Q0a+W|#lxvM#6AP_8@@K?*QLc~?SSJ0G_ojb-exD0f7pg6d -zR9pxygDjZU5gXDZxPrhuPL+#)E(5T*?&U#}#jcJS*w>lEH$xiI1Zw%Su(Z+tnGAS9 -zWgghwRKmgLJZ=q{=r$mIH1zKfw5b%7H5Zm)pk$etux*qr!pqFzJ%$wcoidKBm*owb -z{Fy*Dt;kS$@zoXI>!KiK>f{>Oj8!n@cbR4AXA+s|uZhWeSkMteupvxR9rGiJfop9B -z&JbEMz@Zl4aGQ%`O(u>dZ5&UVIGi@IBgO{!0uDy=sOdE%L2!a^GB90?3QXR`c-imo -z$>}C?njv17u@e0+nEvlr{r9X9ery^3H_mH`Qr3Zf1E}oMaW-M#a=UM&zto}QWUGxm -zQ4_lw9P!_5UI#!6Go_#Mi)C -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 -z#rK=tL3tJ9ts!V6Q( -z9=uk>gY?F5t_L7mqS_LI7lr{4Si+-}m)R#FX5Nh=9te#x -z>(6y61%}U2by2gB(aCcF%tJQ|c(|e{^GJmzYK$l{6-DvHEUzq!3d41>r*CT5c*|F2 -z2sZ?oMOC^04AaSEolH{6W-2VR6US!5%3P17)N-oavOGh5Q2?`8N-ceLg#e=>mSue` -z9J#CjrlyQ#V(zEGU&D&J5|-DMv83L_lXWf@)i_vwtAtIrCh*V5BzAR_WoNvi2wW`! -zM~8vWIt)K@vUU<{Y6@6YUBaeXL)O0jp3v|?lZMY*4Sd;Z;fodB56g%SS^we+ -z*tp47aevq>E&w7B;vg?;IMXoV0|^9d2sbl^Yh+w03s%cUbl3OC7%q6t1SNLL3|cJkaZNJ7=LfXQF!4L`}|;kvO%tYgJNP0`fQ7yhrgM27bk|1Nb5Zi#DPKz%Sf&!ilxhEe -z3Se9pdU$3T@eS97<+(5e13tln(akx>hYxmd^qV#YEE^-HBfwZxUJ?s1Ennr}uc5({ -z&YE$;fCY)trZN|$l9J~tm={DIds6gBfKfxBiA{3d&P8;>1ONVUU5tLE+EG{fbn3av -zHwv&Iv}(w2MyFENp7&pr3qZLp%JAfS%vkEiyo=+#I(D=daJbz7UugExvjP4YH55Dt -z6AsX(0av>XoNk%GrTzk9eBo`f%n~pP4hk${G)+v}e%Ypi7Ijit@k=`S{a`xS_th8W -zMd2xmOaLu3(}xZCvms^npMk^a -zG7b`4TIjj(a54=XYX$bVd)U?DU`Nu#o@f!5+DuW-M(LGdn%KC8v0NUxu>!`*z8XjH -zm@GS@zOdUz0nE7WNh#%+=1CDHdtLhJF_OoG8=6H*RubM2J -zO)*j!*qa1)WPmLx4}XoC_*jg3e;8L$8E7mKbHa5nA%`q42n_O&avaq4a!`ck6Ddyt6n1%E0KxHcs -zOM9ql1`ad>&qs=qY(`LFR5QymY4%^9aAj3(b;9%EB>{n&)kzPlrMAGqhPaF8(!etr -zCZ%!xj3EPDIh*#)@R}h2cba7h-|$axnG0SNz;LZC3@mp77zHot`S9l`U{NPMIpNhd -zmV$;?%;vhD6KX;}n>kgR(DS|z##dFsF!H_Yz<2Y#`=Qk{Dlv0Gl2T|?+FAHiF!Ph2 -ze$kHq{bd_|x~&~Q+unhn?g&6;XFGl_31yx5*{%-UwYLqw+TV`f9c;zD1ev29c>H)L -z7N2Uv>a$sF{5p#lzUjnk7rOA53*Gq3r7paBr3=qr>cq3>yRqS17gn92GSh=cPWE8l -z3BMnPUKkqt>5Jj~;W!h@25}D~mleF62vW;tK@0)ro)E++gFjEgjDnbd2Ve*)gc)@z -zupzvtYXvR}XcV}FPXY>8!FVcwq4F{nx2$59FZmz$*p)mUz3hho@Z%O-nE)Zh2beKg -zFOwCsYXqCT3?XO!l?mL(^|By|Oq3U{i(ScM!PUal%!ZcPj|nhy4WWjhLTH)yT|s94 -z%_2B7^o#d}27dZpWM#}>8&m3woMC{u>3dx0WqG)=h=*_Hu}C~I8aCY2@l1t|XDiC0 -z#;mK-K)6|QOT$xDWh|X;e!mlEgD{n -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 -z3r+b>y28DFDgh^a#WhTqIe1n&&E+ -zud+nM`{GFfWrX1oIp4s~C}f#YpkbI1**0Q>d^g=hXTim=?*DA%`)PY9(cc1362&4V -z7uQA%QCm(7*k~+y=nGce%BG(h*6Vs`wt)HpzM-JuN@p3-5gR=vh{D7`2(BoO8UE@b -z{|=QM2Zm$9bZi)oC!i`nbE<2zR2YJc8a^leDukAhF`r;Ug(VCx3Sh#}LeSxa;YERq -zf*1L^(&YmGYtpz+a4~K9`_9BZ#+I`K=j)~d4mVpk)D9eJ2Tr!ptgqo%s)RGi5*pfU -zbWPY8HB1y;8+pyc$heE{0Sg18E`}xvbpH2$O!oxtCS_gBz=UQ9$c$+Y!jse3@nR#V -zJ2In&EoHU2f`Pp0ztQqd*21ooj(trY4rYKoY2awW#)+hfohc3fNa=W)-6{!9lnw%L -zPtHJV&PFN+v~Y!x5Ho5bopX@M0nMZIyYR6k-BgW}!0BH8|67xPFBpydOwz-%DOZxf -zHl!T!s?e{pG2weKH;WI`#=4A)Wf=!cQWjoMYB<$lAvFP9>w-l3KhMsxq>HCpY;0`R -z@pOxYmy^J=gr2m8R}*C%NI9}HmS_iVw|m&rYU6K79c!cz)5YSXBLK5L;=gcTnsNew -zaj-T<^@WLI9@ZutPz~A;HStW+#fur>1seZjmJc?Bl_cTE!OE0_RVf#%Qw#v$*K;9J -z&Wv*oW;V?D{u*B~nGGi4$6>`~3Q|I_LdEBY=6jz*I254qc|AJGyO3D6`dIqbmGXp;F=vdOkE4lbfGBl -z6Porpj8Xpi_7?nNXB&R8vmL+K*@3%ub>L@vTk*49Z9&;(7I*LL!ri;FxO;a8e!05? -zzuwb{U+vD~S9?3~>jPQ*_D~1@`%oM1J<^JW$J(VgX6flptT@|=wO@B*-8bFXc%fHj -z-8a2hbB=0EFCIJHgNMKB!h(}sxc?*prVIC+=)oUP^x^-Uyz>f~0vDbNSmrtjF@HKc -zD0APrAr^8}_+AHoZb7 -z@WM2*Acc&+7rDM!#A7#0GVFL^;@D$B2h5|Dc`Ut|$Lh)wo~zRFa%CAW-z?z;f=p!@ -z>u!~>x=O>!N`F>VF@jmc@>?2~Rh6;ymL@A_RAabi_WyDA-v4!#XV!QAs`s5|Qb{tI -z%sZK665Md1gM07BU>n<%$s~jX3>a*{RMT6Gdy!SFUXM;w@6wTU+U{+=&${k?OGiRL -zW`0(d2c%;$5`UV3V>Md-%LvgsJkM#|d2bR(|Hkf#{(Z$2fAs%W9@IbvIM*d9=CF$!u -z*=ghTfdF5O`lz1?FZDE-xlMypZ(pH!7tDT)vRspiRWrp)P7C_0l0@MhY_I~gDE -zWqo{*RqyA+UI!obDX|TWz86Zjq;dVU*TE;fE!2s_JhInr< -z#Q8yQfj$`W@BxQjj(9RR=F?%uFuPy`vz{6A<(MzCW4;^@@b`%jUyrNVF_$MfJI0^W -z)yV+Yrb1lH`M8k_P&LC7{|MD0`a(k7DFmo5hLXtDSmcb9Ks*U;az#Ew2TyKGp`843 -zn^*36BFx_pUd`t~%-(V&)ubT{60J%z_BdmedD5*j?t_?Kkr3vtBQ+6Tu=IFobUuJGDTpF?S=wX5iI(N0(x9jn^-C~ -z=AZ8`7`4VpV-*0S+ru=#RGRk%SO_f~hUvt^ -zE#qp-lJF7_xpc$}$210<(am6t?Gj*LmxtY*A+{3; -zSpDb4?9l#e~#5%zWg -zySsr+X&al{Z5(R{K2L^d82~bUKvNbt(-le}4ToRyBz;qRgw1V{RCxGW8{0x`Y74Nw -zlj1BG#x*N|;XIlh?Ewz*vysY6h;1?q+7nPAtZZOH8q?3>mB$`QsA`M`m&L0F8CIFJ -zz5y9Apj3hh-xsBi>HY6p`7`OCtMa~lo^O5K_`T`d>BadrX;4{w`@@|JAM<_t;`iwU -z9@Ju`XbDxmYjG&+001BWNklN7+d+<+;R<6(wU+=|_Uhf50>c_A5;3seN;>U0H;wR_&VkwyUmv{Q{ukZHZcONJ) -zS^3Ej)_gLAdp{k)gP(Gi%m^O(RLzrF{pl!HeLRe1H2Qxyg#Y+p7{8I0G8L=LnC1WY -zh_hmb@$VlE<3Bzb75(OuQT+Ry7D9}M8v>00%%@}ckI%+MH1umzzg`I~-_}}I2{ODN -z_jQZd+MlgA3iDbo|9D>3xRT$sknucxr`Vs1`6!R3kix(h>C -zad{GVUoK$n*9O*oUB(K|i@7$9l~<;*igRPG8CZFhb7Kn9R>pPtHHto&g7VT_nw^6f -zskU5Y+t~cjO!3rQXVTfcmft7~%n)cO!pdTR(fis5vy2s)TcvME8~B&sDq>|-0n2VX -z_`~fGE2|u=t(w7_>KUxADS@qDYi|}oh*?{0V12ELy)_OF-!$>~O%wa7O>C|$V_S`h -z?b2>$VndaIhpP<%m`7_JP>)pGxWC50eUe&cU`?%oHFYM|GHI-y?P89!jY<1hMeEqQ -z1{0McxGa{2n)@47+L-pbuw_ic3)l7aN{==uh~cakYGZ>P%f*HU7aJQ1Fpg+rY`)*n -z?1S3W#M>Rwqm4E;HJaGnTE@wQi8FmZJ{_fjS`DU4lmLpR-CM&ZE)SUaFk|6#!W4-3 -zW1EZTT5UYv>fkS}gbW{l?r_C)|Hp1mVCF=ZjVC)yJlSD`^IvGv=RBCFI|9*(b{{9& -zL-D^n-KwDI)s%-12O|7^1h_m5Tpfcz&Bwhi-cDI~Em6j)&Jvz$FXPXQgYI_m=cFsK -z$$v{LNMSny;pJ4ymr#P2(%g0y=%us^ty38nFJ^qakcQ~RG;k^dyqFFE^gs*0aVj0) -zA_G -zt2y9WF2c23fa|fhLJ&Lq`dCggDOJA=LG$LYZ` -zUgmz!#v`ED1zHNg%@G%udP=Ap_9ZrVl<>>%Hzc?+S>OWS+jsU;}EaQ8_hmm?+WpHCd8Q}15yH<>-O>bv8hH+DB46FF`MTC066cAC*eGKezemUNMgDfp@JS4p4dxx -z0HK8tC1C=-41nI<5#ewOIGhA_cQ64h5Ks|t>GH8L5r|kd+7Rz^o5wdKR5eB_GM$Ws -z4g`7#H(C#OsrR7)hwq0iXwrtp>Q0C9;;3p6u#vu@3T=`1P7hItP4p6VMcBerw8Xr& -zb^#OtaWh-r;>Yv3Hg-m$4IPoBzKQ=Q2C+?D3{+6bZcKNR`|~jskJFDQyiw|NiLjw7 -z!o~z--=!8|W-%DeK@UNQ -z02Bie0~G{dG`w(~2bc_gcs7H7j`hRWv!J-o^+#{?d_xN%rVl@RdjNO6GZ0s0dhzS` -z`tY0g2c*^P_wNs2`3D17@xg$klimH{AbwAH`CtgY{gAC>1ehTiZuuYdzI-?=03#6d -z@rZ(#k4NzD)EvN!;y0g;iFi!I3Riuct3F-{F_qw=w{;ap1B-^3Ibew+mMiyV`|BM3 -zaA8W!`GlBNOdY#0BdumM>fe2F2Fou_VcEs$xV3Bs%PvgezAH1>)8Jv(?IP~GIF4nP -zrm^C38TVW^vFdUGE3eLA#kCw(Ud!X2s~m*MW8W^`&O|f9i&SAM;e~*5tvIJjh*`XS -zcSZY{h8M2$08{=3yev#0D`VA71NT;!vHEr%%WoI4yvo5E#wFk4u`*WGSXgtrjMY^| -ztgB)rri@+H1`bx6I9y}mu^J19Y81@y__k^Tn`;bgs5Y_bwvElV9c-y~@o1fehwCgn -zP-}x``L(qM))HdslumuS!pnvR -zdx12ZY;3ZiwW-;b|70uI%}qA8HM!W*yg0$p{y7jMNTsmFD;<57%=( -zs&XD~PkE@B^rSWGPR>Kqw1<{iA8oT9x(WeO@r;;WBa|px&TpYve3I!<9Ih7+tdwd; -z3@Um)4BNBvtSH1&(xtkV-vg{#Ygy=HZDi%ovO*}3Ipo3{+k~qeSOQ0YoABoqcYc@jHEYKmt -zC^K|rfGJyny!Jf2R00eQ`yQsO0OCPo|DdA*i5v&5U;?Z9Sk738vf+ -z(Ko{xRBRdJg{~6zx4YPxh_EXeV0XgBt}Y)t2}cPZ+q!&gON7{zWMUYN_7Qe>K`Jvl -z+YP*y4RD9C-X`$*u#e-N26lIpu{+~oSJubQEL8O+>0(E>kFALSyE_=b5}|$sNDl$+ -zgTTjGA5V9du&JeljU6Gjwkd$xknpiS;Y;<0C+8dGB%LSNYFkxP0&J!KGZo?SEU>>j -z!mf5--s4t6LN`y&18nB(npg}C;5OGeai3An-JztSZB0ek+#O<5cMwZG7oSg#S3I9Q -z7pqfjxl2H_ou5+|B(`~17lD%i$NdPqn24s;6=BCB@p1Zj^tz=R_%0EGHdTs|)ZZih -zc`miiL5zm77;H48=~Y*x^r|aBdY@}0yhzn%QTkhD5?kdqTiL#&0+YcH&nW%qY!+Iq -zxM;ERQVB8ym`eTht$u-+pS|6OyWZ)?FW&9PFW>FQuiqQMzr8nze}BJU^qcbo_|5r2 -z1uO&?R$1l-Th3Qr2rsO@{H6k6^foIp8e|A5+^&R`r2s~Qj0Tp)>rw!-7*-ZTjUfCFb{+XYhwBR33MWVSg6)T$sfAYk3@~_p$4?fi;&V -z@VhJ1xci2I6_*QGb%j-!SuydiyHr&Em?Z#4jQ%wHi%K$6hRJ23xMgfHr09KCV6^lx -z-7?0N-WR>EeK5;!siS}^08DJ+XVRD$_3Jpil71BBcloxJ^IixrOcx`xR90bh -z1x5o*CA`dmOI%&i@WQncT=e$lW*b|ZOl)m&q;Gd)i;E4-4!CY?GO($!gq=;C2~)z; -z2@|J#9lY0XnQRo{lR+OJaDsQn!5e8CXHpJMCmp<;w4_yx6`50M -zR%HUItei@RcwtTi7-wEt7cXU8oXWa*xyKVRrHp#5H=NU%z6jLW{s?FLBD~Q*uX6*y -zTZ6#cgVCIH8`*n90p6uXe7wt~pAir5j=7@uhC_(~{a`r4hroU3){n_LP6;H9>e`yb>(~R -zCoN(Nz=iS3@rkqctO)2-y!W_mjaSO)L0~j3B`HvjYMqmxl|G!ftxTPSGjWU&%Bng< -z!#(HHj06$-y$~6jCx?2za-Smdb?ZL<;jO=Ys@>lQ;FWj_$eWLsCC -z2UM3Le3|p{M!$`-{Wjhkb#bc@qK}_P9Gt+a*@zz@?RaRO3UFuGLBptvPM**jkpK`Y -zNb&=?ct04l{G0QsI@UJVpOdR+p?f#U{}-j_A#RkQHHu!FaxoixM;*$`i3Lww!mpkdO*NSW=G -z5g6NCGJ!$PN9l9WnlUguY0K}FfQzl+h3#yCB$<`J17KuerKLPoOahbvm8{m3Etm$= -z#v-)MvUSbCnNH44apeCyM(V%L*;)zUxkQA6G|#u#c%|3Jtz3w~vX7y>jcm?GmR^?} -zkj;exF)4{kCb+mrPFqOlePsDNISYI;5a5|ETZUZjO#w92?@9;Q-R)pkmxG;&5Zk+L -zl@ykUur1|bb0)yXG_a*Tz@b(P?+&lKy%`_7GA{PA64D)D -zN5;nHq>a5@YzYQhhY5v1`xx+UZ-k?5MQraVVtvxZ=5AnzcyIvm-gE`xp^>VDR4WJ{ -z5w=hQSOE@YBODn3_VTruxS8;=y*t2m#x!>`syV{;ZYZwNOk- -z6IDJ(BEt5rZ)!((B;f};yFyUA5`;blegv4s+C{HXg$OwR6M(6#-c$n2cR|Su4`Gf!GZ^|o4n@$LYA_1+-}GMU%EIl+eF2mz -zV?JrD%D|jyKR&+lb_w@Xm9XQEgJZ28jL -z?yV_d=j}3%SJ^mOW#UA&f#WqMj@1}=qNa?;Y7A*H+kM-_u4)TAsvT^vaj><{#fCat -zX0Om6!?v>fYgH_=YALg^u3m{rWD=KLXXC-z?*|xy%|8M#mGHvt{|UelYSuSdc&ObF -zv;X>52b-FGY;F!job|G`mHoeg^!#pYa^oTp#msWdyh|6yb~h2%q$ac(32XTRk4m -zNEL;1T0Hzs%=)T=!z#{SIz9Zk)xcj{%XqP^gtJ{1-bvZwmHDdQ!Sx|W(u;130p7>; -zi3nH6LtGqnabeiSmwf>~>kaTx#>d-f2X7K^(iUDxn|LX0;#ArKeK4Z5FKuI-i6iZ3 -zY)NC4riT?6uR=af^(wv87vQD75U=zFqSI2D@o{D##B2Ql&h+~@)6eQmh}Q=op!3#1 -zh_?m;ygd-$-9aDk4|$>wM;v@KY~#~m2cHew_;S?7g)ti!Mr~Xgw{dO4LG`4XkJ2;~ -zNEM}hHjpYxl2sIg=6YbjQVC)7rwE|%M4Mm|`%eTcXsnkjy7QCA+3RmOfif!7qhfpN -zim&efXH~%tMe1rWAFEnk<|f+5Em1s)pJgiy4d;X-F=IzEc#$naIorn+&BXC>HD89+ -z7X>%E+Mrv>xNpQh7J4r#t0$^bqAMl~Z{z*`5ulMOO$PMf@f -zt)`x{;=(KEIyAtGXSeY6*h;3WK?D$1j98V>^IQgOLWqr2(L%Q5V8{++$Rw*WHXzHX-f%cr3%X9!U~(Jx^R|@GV*hxI%i~baF$Ly -zYo~SAMGuFYIs{4uUAmRZ2nn#tzrpsOvqLuiHc-G@<0fv+2GSD7)H7CS*zPv&GJ!5a -zvKZjbq=(xRKANUXqzzv}7G_v+B9zf|Zbed6kfEroQpJXR@ev8YL<(N~5N<%PO=a8I -z_d^T8WN}5N5>}Snj?=>wyzt+Fs=DY33_*qPLP-mm8N#GkeRG+z=cC_-3~Bvp*u+Nz -z4n7cW3_%1>5g -z`H4`erSp@*%PuQaQok5*MBM0(z%yWO9M3#LPtK -z$%pbc;o<~vng;oH2M4+%?Bj_$;U&Y9cTcpl+s6)lqRy&J(#8ISEw^pUL^zZ%@aCY0 -zj0=1UOLu^+ -zNrD#yCg{6a3>!Pxt`-9bw|5G}gxJwd1=z`m=OiIWfzb9Cg7{t*Ydc{kJ}%W5w%)~J -zfWczzpudR6I|8*Xy3f`Q^>{{0Q+zJ%LsDxf)fL?erdRFnVQbl3OP6l#`ku8CT=e!* -zEnvEuqSs0=;r8O=gcWHCjN_#jZ*#x0>cVY4k3RMT4KG|P{V=+fO!;9l3o0;`!19wf -zd!Y5xbG=wfKRY*opPd`T&(8JZuD1r}^z*j|@r!qc@QZh;LHv>fF5e%m6_ -zUAeCzhUF-8f>}jat_NbPvOytitB1PCR@mqZ>Au}czh`> -z1vo2imY_vgSxP!O`JQSMci%R#{I-L2HwxHYSCGl;&m~RluFK)U8&g<)J&%>OWtsJI -zZWiwtm@=qR -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 -z;b8+$;-yWDX=NUEbn|bShnd<8ct -zLWjC9eJ=!+ZLtSNd@#}u7D3v;*b26U__`|cnf{jmJ5m9*rvhwC`O5zyuMuH8+tN~y -z7BvMm5w_6qpCWLv^^K527-J=gt!xT<7!E){A&_im`&t63RWDxIwl^o`7sU)+dwig3U<^B); -z>6LE$pVLbJ{Av>OO5umEr9g-gRaRoos!GgH-{`?l-^}7?Z}#A4=jL_SxnA7$Rxf`3 -zRv&)OL6`3+{rsI?{PNwt3Jr*<|6kr20QIYP>4h1>uLv>k4dPet58+=4FXxBB3XD`? -zVh@a%`5C87h|&6v>dSwAK8D|ZF|Xf!!Ai^6A`xB|>i2(VI~hS{LUi|qNi5c~ujzG( -z6>l&9I;UXdB3sC&<|30P$w)oCodn!`Pp$Fbqs -z6pl5zI8a;0eOD*2{PHALT%W}~SEsQ0>I_z2En(HQ5?0^0%SjubkA(7{>ao@tJXFn?Wkcq -zuPfo<8Uv5kmazR!2}c^r`0qOg{(8s6^YteF)M(=AdIL|@n^K`UUT5KGttBvXxW0@7 -z^+g=GQ^etV2ZtI6H5T?ZnAl!#U{gaG>+8#SxS@zf^HXmP}7zd4J)(#U}+6`=JH?gI|#I|-D+uLpI5IO1!Q@e#79VT{BT^4qAn%I?auq)wXSHi>I -zgo(Wg3;Pn5TDxr=NU+b@m342z!>*){9SIlP6TIqWV|$0C43B)SE(Zs?OdRR9@MOxu -z(`ggW_1Ji+&&F#54&EAKDp!b06RyAwt2ec|5cRnb?bATl43LX -zN|2gsG7l-CyiZP-r`YDi>WV}j#}U#qOzAQrOcGX1LJUOo#t?3JvaXZMoVbEyGuaG$ -zEj7o69w5G_AvZ+78)Co-(eFe8B|UbCtfkt(GF(l_{ve^kRwvLCAp}Ck0u@`FVIo=4 -zM|(lFk!1@llh3I8mGJj_|kA@(|HbD;LjAxM)SlI~G3?BJBVmM({#rIj2V1*@$ -zr4q*~0Y(Ffh8GPWdS9;sC`@{z=zo#msxVdv -z+X5^TFs#@c#`!VwJE&&vw9JO6o^VhzZlNV<69TI)KA6=_g|~lovb<%Y|oihD-#T?Q2%-#gRY(RV6Yk9~J?{45h-t*1TEU -zN5KkFEQc@*1`hy(25@yEkU_qEy0EhY9 -zSs#z5LmWs4IFNSnSk}VhSr>Xf)KDK3D>`J=WBY(%}!||~_6JmRsiX;SpUYEn^2*-MW#|TZlNXH9w=?I(C^tvdM -z{f=Y^5zYL1J6?CD2q;R6w^>Odv~XU{VzDKT;&DO^JwrQE1Q{*$+I$aN2|H;8J=>Cg -z1^npyC_ocXiQfwY1o*yoCL`>ke~9lTKBkWIcBMJ+ntN^i9{3sXv!91Q!qwIkBvDN& -zM=63HG*(}pkxI;JR$VUTu<~+F=DTpl3q>edb9EMLuH~`(`Ye`RnZQF=CvddBgyT&n -zw%nS*%Bz#O=XwsS2r$=6s;Y8x7VB>2L~CPUA*57_W_i8O?fa{WqWdJixPW!H)cx1o -zDne`R%@Wq|adAS}y4&=sP@LgXj8}b3t!rxxXsu(MaZO3IuC@&7-r5rGt1XJw-k!w+ -zRWo?9p@cX3LtLB*@!miYPqY;9!0i&&-f{6@eF+cN=W%aC9%~y4xVNE*^>@lRP;23t -zI}V;}u<=5Zg;R|tPBmM2zRAKL8!VitFXPGjvV3+&8VEflJlg>p9`+?E -z2YdK@NgMl;2KILwIM7|fp+pIX|8HjJk&K1o857TB4g4`{;00bu9CUGp>0Ki(J{@)N -zcMf#S1-LO2qIM=i;|$Q2S8ZXsqQa_5CRR^ALJ$8C=Qy{(MN2M}VSNqbHtvj?s2wv= -zH*U?XHDfkv$62v)V{zL?{iHLe#t94GrG`lhcczr;b2jR7HfpD=1**we_%7AuTr^Dj -zsGsmeO&l^f9-wI=MDt`MGd!3$)|$7_HaoA5f&;3n=ps?_kS;k$mt2|g!q%@L)5oY8 -z2nZ0krX?Cy8Pr)d;)y%kn<^#47Q?v8LUX-7d5l+{X!!OURxjpE^Ko^7@Wb2b?;zYvn4CTyO7)4* -zMYxcJu!^}NJh|rcXb{uY6?!%DHYb`#$dw~Zm4i7=vrWflBAZG^qXAvoo+=W|#FSp~ -z-2B-Ko~lg9dn0@iV5M>qVcY}8_*t+j#`jJrW7Uj45>`U!;bDb}{+dwTmnY8jCbZ24 -z;)7u{Hd_^$az=wa2YWKbja8IBA80Tmd{uDp@wAE0au%)@JXDuMbaN;v5=Cg_t -zV#EnBX!*z*K6=bRX3`8fkqi`N3^KnzzAt_+{G1ui!02m!FRYl!44p;ocN#kWH)|!p -z=xwe7E=#O)0HZ;s5@r^)kkNZ0341imGp;yp*WzbEFc~+29>!6Rn`j)j#7{)1&0kd4LxL;kPfMG8VNgA!Dm+I;I;<-WygYb+Z0DLp*Xw0zj6 -z50ils;(=4Gr6&C@{C)8mn+<$0d2ffq9_{@NGeZ#@A{_eOZ7C%`jl8_%T5I5*&; -zxvVN?Q{@n&vknFeAqI*O1_~ki(E94g6Qi#IdA>qpYU% -zMR=k&#E~8)+3xdkv_HfX{lKw);6$%4I^G-NXxhWGSqJa*xza9HV*xJ>mvOYGguO`z -zk7are@ll>v!-(qKsV$Q|_}b4eZHA -z61TiJ?L%vK#s{@86R2Zsb4&R+mW^<%k3Jh$+SPVvLhKU70R$=uwr7;Kr9_U -z1~Kf&D)IIBT9vEb-kJ`fwLJ|9I$+pArPw;Rl;}kF{(Z?6V -zjD{E9M{jFzS;3aESR7PIXd%cfkHus6UY^0dS7x#H$_!RtCe+Mp&6OFfy)un8S94f? -zeHzPe&S2&B3EY2e6#MG(IMHn5U{ygt=kBZ1SXouX>YFoo@J0>~U(4aaYk91>VPMrw -za}HK2p@rb0ML?K?7|x%e|AcYI75Ay!X2dZ8MyZ5#)kUnUDbK-*h8C^_mwCnDQfJ`a -zIs^CB8Mwc$ELD{U>kT|uXX2r18|$kLJlS5tha)Dwp0x1(kb^^w1w2Stx>Lfs#v&fA -zH?h8s$zc}OHrsfp(ZDXYlr=bbvB|_sEf!9-n)qvrfxonv_+zt)ryEV2Xs~d+(ZaDt -z6HhiN9cwahwAmINYj*KOlZXAy4t6zL*xF=BT=ApLCLW1lhG}2~nGG?tY-}~Lsm)R? -zUac0kwiwvnVqj~ltzf3zg#b*OgMA%74t98WqMb=E0giCH!^V+z8%Ha2ti#4pId0)t -zha)=L;egWnM>-r(PjtC>JmKPSmxIFz2ahEj9I99kCT#4Z*vl+e+*}-BTYy$tfy&{e -zhf2-CO$;zk8shSQ@pAXR{J^~haTj3Y6{j4JNVha$GQvE3~_8^~2b -zK8Dev>3o1pL5a7??Yz2~50RlXXcblDG27UB%Sr?E(Ue^bmpu#{Y~S)RYK0iHL$D2O -zf~`9|8Mfm#vACa}6%&2J&y#zpoWv*c9HywnE5cNnGe_9+6Pw+|{4Om(JWdY-C!q(@ -z2F8{jbs{;R#%0A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 -zfSKE7um<1qH0Wcb5bmc`uOeMgmmNK@LErc1} -zR;EEl+RFZi6`6m1zaNx_7`-k9GrFy8ag6d(l^FsJ+si5;hTDJma^f4ucziL?=zSfd -z%vA%-@(YuoSdCd;(N;!~S#fDfK!xpM1eWC&C$ap}lxW439F||BnV*0%i+ipVu;OYF -zcVC^w@~e}$_v!?8*B0=^oieuH%whGVG4aH#yi&%RYX;U_D`4%-X{@?FiM7}B5?w4H -za-;B#eI8$^f`H6@H}bguWU_(_NCz@vQ`B;F9lOE0w1$d^z#KxLQtgD&A+B-!& -zT*ruH8xPf$abJA_58NqY!<{1b-6`SOCKG>aD&tgR886ls@j^ohe`_@He1nZY*PHkw -z?^9pI)Ac1h)o9=(t2B)^PBvON*<|5(vxOtg77jNPW-RP#FtEM8jBO1jHc(CU!6-3l -zjOP5!^t*6vvaqGel9gutO#~cPYg$cgZe@~~g?%k1j5Cm%8q5sU<|1ecnIncXv8L$FkjZ>Z&SiXY+lBhVAWD?C4-&q%OyJd`E|doh*^; -z)Ul(}6m0J_vCYT!ZVTJHEFm~=b(z@O&9oPVEfEV_A|~GOvANs81}Zj`|9z~D83?e3 -zewnB)V`EH@;h2CRs^*&2SeY6vdo5nU+PH?baUHKG428If*ZH4X!ovEvjZJX}8-1)# -zI9L~`H3J&+iui_+VEVZ$bkB#v^O%oe_n1|Sus$fg1f?cU9_NB@=mM-IX -zwu)1|8qN=pY{rM#rR!NRFvY9uheqmE*|COcGgt -z*~4Jj!*GS;D9Y?RR)O3w(@Vh??#ZgcR24#WgzzvDl?2BpHbQV1=_&-rUskx>Y}scpsi@4wP>QHXrQ&EqrGCFt!kiKGbAdQH^IZED>vUvIis4QNR(12sG^AH -z#r6F3Gv#v`F>DO$9A9#g)jSzr;uur1Y#~vxkgVEBX|}wd4Alav4>lxWYnYuRBrC2b -z5x-djNE!5yxQLf+B+3?&WfNJ(8CNX~=&pEcsK!wB5EUUb_QZ%}fv+qC@yR3|Y)>cA -z$swm$B$Ip1X&)HdI -z?~)^ZFWs6VF3P;`px?C6XM4yn&X+f{B?nh>2EG{A@x{1>nw*Q4l7|8MfjCx1VrRRe -z+EHEMXT;B$ey72T1A47UOvY{h_ko`+Lmn91P_)GRHKp-ef92^R2%`VEAWE;!osE2SX(bnMo6oVFTU6782u*{GFXN -zZ4~%-iR4qv^|tt2bb3=PpugZEGGd@@P(yOk!EnWs&&Dzx7`iFMg?~TA>mr8zAn9yo -zR4hPdlEVhq%0gw+BlH0aU|{GNE+CY -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 -zn7DAHOyLh_GYIgN{+%X&#w;_XOfZ1|{G14) -zmIv@(j9L~9;=jHe#D9~#d^LpsxiBpF)7L}z(}f}Y`Ridk@XZMR62`@u{Rb|N;;+QF -zW7Bx>+c6NLx_m#TqLVL;)V)?61iyQ$PJNS0+K_ -z<&kS+c;xyR7SxPm(bXIlUoA+28B@w0x;ljgSI4mO<^Z;Jkf%7T%!pLZVW|;_DSGx=!*kCWM9R%c7eB3Rrw2kEOSYSbn>V<+UX&t1Vy| -zNzCmWmfkL4X>9>iWtP^K1WP2%jNX|UEF!t7En)GU5*F2#6hV>EF^-Rsq?Bdlw%}d` -zi|$mg -zU|qu$mfy)^(d|5h{L~v*R>Oz~ak$+Q6=y%yoDPM99VUoFoi_Fp -zT?%`sxJ2}6?C#docGSS$n2CLH3;Ux64hm5*aV%=!y{L&(F%zd_CeFl6d=RtnLDa@a -zF&iJn9ekK@@L}A>2MG%wCb-%-mvC?<;o$v*jZ<+G?D -zaioXJi;W{$OK>b};q6`v@AlYux7Wn+UJECBZJg?LaH`kF`@K|TY@8+fEQyW&u-_Kq -z@yVctPlhafHfZ7VK?`3EQk}7Jag?eI%R6=47&A~iVd3tijryF2hCI-i2bv2&TLI`| -z0$U#FE~s=Wc8A1$B>Z-Ec8sJ6k_`jWJ;Gu_CR#~Bp+8oX(K$M%JQ4Ioq;-Ca%MmUI -z@v4Jp)kas@Mn}a(TiHW>&c@xGg*&p^xSz97m$Olqvt)#+jjizvPvDJul^za81uG(w -zlGowux#~4JCRSl{y+X3g=w8)FlPa@hM)&kfMWxnj;{j}AR5^m>Rf-H!vdE!AJb -zn|ARP(Idg@g2-ssf$n->7YsuPf&?*+Z_yYXDcR_*I8s!}Pzfqd(*I&Y$V$@m&|`VX -zm>wET;8xkirJRXtEDtO?5AIDc%=s7WL8@i)nvSlQY=X_s~s8vkb3K5y7Z&ms7j9#JuS-TBI<_4u`cBcqq-uHMte2> -zC1Y5+>TSxiONFGv;^>|&z7io7j3g%6&=jeaLQV!{Fg|@kL(jN@ft-W!3c&J7Mj)3A -z6YOvz*^x+Nk{6;;hK!k4C=ibcE?5oG} -z@v5*>c};@nWr3%H>#xE7%u2#C9|H2ib#)RxJgiRgvHt6Dm7-AJ<3i63-;4hl1wR+B -z;d>@ISse$~B-9#gui-JD)bZF)LC8($wO5JHhh85aagrH#I=Y!8N5x6cUHRt~AUHR( -zucE0{%rhS!#6qj%jI9oi&8+P934 -zOiU{;!6;ckVAS{+jr~6#vpm-uGoQ)-U(fe|_&1W6k9+a&pY+Yz=6-5*%R&4P$x8@-zAy;lFJBMgfp17+=E22b{FP&37f0|Q4g2$A3=e%j -zhH26gkQZNtdB|5^sK5v=jSFF6(Iv?XP5yI}$+*viGGbv36U<6@0SC_X0YgkD|Iu88OBOIY1d#`fkaj<)MK -z)v4oyP7UX}44mrFalEyRBh4ioXsTdeQw2NgS)N(Njs{Ie%c#ukYt(R{fw9d7_B3hO -z(OkurmI~IlRI$26!>SeyFSb;~-2Ze7Q_UFB%=l#;D}z{OSsA^Y}CiX>0WK0~4m^d6U -zaWrD!?I@d~Eu4s%I2pBYDoR3Q3!yn5v+!xm!sl@dUnMMjov`t3(!uvB2ba#=dQ$CkCG*FsIdiyQqeZuU92)9>N#poe>dYP~z;;SMqE;_isQ4mr3t?BX8F)P`Kt -zjku^E^-w>`)kVXYhsH4%jpL4>i4n{b9vUY+G)(}_6CPT|J+w{&tz5@lv`={GnDWq> -z^Uyivp)2PhlJ^kH1F-_(AyEL*{8qO@9|GY@LJ-HE2CBTF1~}p)iC#?X($#Suhj9MNhkdT1$lQXtxtCmC{4pJ&pLi@P}occ&cOnR0P^ -z(!=dZ;MN3ibHYQ-q>C%#Hm;6aGPYL3@w0IYx7j0-bJ55Vu#$`J3e^-}K`;R(Wznxf -zHHE|@ATQD~PX(srB2sh^DcFb* -zL70TUk}xtHp-dybC@em4u^my*ib7`m1U(W7A0#FM(?#A?{t@~~NGhmeOrIy|Aki`W -zUKI&mP_f%V@hcU$zMO^ZgpU541(ubv_lN!`KA$KhR7*sCQLiD#{nrb&MfIUFL*JBy -zJ5aHqXUd1hJ{Jc$jmdXZh%7PvQ@I(e05?W#oJ<(l6EUzO>0(dH#lEDA{YejdlOA@& -zExgrT#=98{4O0$!`0qy<7%17|cgc$1#YOLwhu$1j7sw`A8hz$hOBSmc9#kh^vNnm2G5RkPjsZ8ovm12*WgSDLwj>lcx90IyVflECejzp{25UKcGDJqeS -zWJO~6NmOF4jGU32P^ox@V_`p(8f{8=cr)Q)gP%(FTGRo-a!es5Ayp$x5W?HRDAzOz -z2@##}F_MJv<9=y-K9UlsE#b!o*M*O*;m;F7aLwE`{Fq=nxJF0{iAtQr&Ih+cSWA^F -zj2N)ihY%bRAC7gCQ2E%3AX23rwL4$ypYULefiDL5SZVcih~Ffm_UIE)?Z6tg7L91aS6vQbNin^ -z%-~->%KnJN1f(Ur2IPh7TmtidKcAn(kjx07xiEnL@$sjx2l3}`h6I1PIE?x50Ex^T -z{FUAp9}m*RAHqYy7#aO8A&|s8`2FZ~A{mp(rpe7^U#;PIS%}zh>}-J$m^>c1I)TTo -zOyb!ad2DMlu&1Mf&5cu7er*a5Uz)vfckKf8;`OTcHPjLG-kCW)kAQ(Xta&xO7BxjkZIaG9%aVQHg=#~YP5=85_e9+oykEkL_sV#!PQx3moIft% -zWVDQPaUGvT4SdpN;=?u_@3&QPjD&`%W_3FD)oIvMuli>8HtX2eq~lPNh9iv{jyC8x -z+GyfnlPM!DF-~X5n1Y!AB_@pCv4OnX>RjQpcA` -z9iOFje3H^|K28|;C`Qs_;54HxyA2%g(nZCglJj;K36H|zE**zD2?P7PEbQyDWZm0o -zVNaKh-CY)TciGs}?TC-&K-9p22uI0G88185ZQ|XCi4##9r{gZp#vObVv+zm6!eEUwP!?i4MwbulR%#B_XcLp5XA9PSZ#9~VqE#pAjI1n9m5FhuDoB+~O -zkZ&jX4Q0X41gBR0Mtc5rdn -z79Y)*!;CmpV5>Uu>7ap626VxB*>-S#z{SUd4$cob_-Moxd^qajgHZ<`jJo(}6!>ri -z_-Gh7PYikZWC-|_aiwFx<#FKpBvXliCK93w5G8@)=#k+!%KLOwPfgkcEgw(WE -zT-4`G+@G?9P&SuUspJHsj~Rf#sAfhWvs_cglTUM -zr7d2tkjR@zDQ3(jkoHe+Xs~RIyXO;3z{2 -zn9^0WFkE)z?=KVTrVJpbdjh7+Nz$C=$k>;VqtI({6l@m!*PCJjpW%rzCaX>ljq=gt -zOH3lPP_`TlXf|#R8#tTNurpG{_LPgADPVWP!=AK-ojpwaqDkMx+X)jjqprkYGbp5| -zU?MApwm_!fA(L~_le5v6H!(oJO9AN41D6L~oK5Q3AJeftX<}>E#G4rdn^Tq$7m^ne -z6%v-9&x?eGK`9b@PvXLF+o^^`syNweXS -z6D+HAu+IOc{{@bEMKyewv_*O0ztJCLisF-8-K}9Y)t#7&bx{ZFqc+yY4ZM=lRADAZ -zzLJg@_?bM$o|w1dz=njU&XctGBxly@6Pe)V{%>6aa`RJb`1yo5$hev!TWjJRpPLQ7 -zxA0?rYC9kyf6E#?SMZo%pDSNCcrW4Y;MmWuAtEJ2hKf)Kt5X2MV^n>9jgKZEF~J)4 -z^n^)HaGq;0q86+qD&g(9#3g)gn!p63W3$%?esf&mx9>#}#_vwVK+q3EGk;*}=XQYK -zpGx5$-cRFq?OhkFeEKu1j@`KS5=Z3jr|YQl<=3DJRZCo2cxOmx6p<-oS#1T&Yb$uXwuT8=I@x+o9uB)WP{U -zZ@4X7NNM;oQO2j7Rqia|y|x05wHBpwW`DDW{VgW;HCs5)WZ-aOvJegrd>n5WwetZ3Eoe5;A)TP-}_X5s~bf#=&5p&_Yx -zmgSpm23~2^@p_w%H#>Cf=`e7l%ffpR2d85$K8>6BDrw`JjEis6iY#1CIk=i~aV_QI -za>~WGDF+vl7A_tx1;pNm^cvE -z1^eO}_QrIDxPd(}Q?N6xOCj4%DP_~ZeU4NF*cUT#Fy`P;%)voEXVk{qFe7d;j(^qRQPYv4kkfp7XPTpTcQaZuq~ -zn(v1!e8c@ALhW<=+hG$IM=X3ZthT=&ws3LC5PUPt@h}5l4jA~1#{NDXANOzBR&ofm^d_O;_#4#V*~7aaByPK!O1}v -zrv_cT@8is%hqFV#*;z=a3cy*|*u-C;< -z?~5db%1^JM(8CDjDo4;9>7yBCL8f06N#a3Lz;FI(;AT9sx*?x2kdw5?O?-&hP^Dnv -z7}M6M_Vls*vE(3L_S9$?6&B4yG#C%lA=^}5I4%~|JhWGtAO_sayQnK#Xs+0Z>JEB1 -z3dS3D>1aFQhFIGD6;OxR2eV~ny&E*r6JjLN7nIr}BX=Y=LRK6|myhmXQnwWeArWCLxW>{`5~6_IsBLXR0h -zQZl`+YKn@JXR=;d`B09htJoShu_f+dClkdo^vhY;m2|N)VPi*9$KG@qUypGFOnn)` -zaDkzMN*PNtxi4p+hw9oCM+1RK#Y1i0!-Y{7ClVFxi|E)Dcd6Z)uaz*I#$^hQZo~?%)~Qw6F-aG%tv_s#$&wk -z4?m}5a1t3SbY59ObTKA@oZWM3rWj-2$L9YQ-KLo -zm@tu)gQjbU@!I1YAKvAwQ{ -zmun^@EZ~9b1w3?<#AO0YuIGfnET$4e_=f)3DP=PRX8BD;OrE}7#7g3pA~Vy3#V0O2 -zFW1zT@bsM$p14Of#rMwmBu3O3fBW&fRUs>Z+A`nzWNj5s*J^nDUJ=Xc@>p6wDJx0M -zqWd})-Z!xPb{->{h9Xwh=kR2`jwk93JW*G{GYuuIZZ2Ug=RF24^ib(A@mW;I -zN9`4yY1i;>O9e-oN;uR~#etRz4mOu@xK)$*<|9oE3ovo4iLmf?vxy_khK&8~l$jUXYzR8IT7s9_OuXD~;^j6StJ_ViX*aQ+{+V_S -zhdT_s(@oEcjgOPAkdtpx7A|FMTuIxwlCp3$ZR1+T!nG_{8&@-yLe|1{9_z7jCCkTH -z_%3VX>x_x7G6ufPSokz$;C#}=hY17cQZ`Ppd@X6>SiFkEaUBQa8ur9A?1~xK5!J9g -zs$*Ns#8x71V@pC|Tb!nU3)^BAw#OI(U^U{){Qum$k4jV`Fc|#-6l|-DyUNI@pud -zu{T@AzMcRY_VpUr*JogVzl{U^Hjeh$IM%01I*<3cIML_fWIyo!0C0K$I6L6sg8^4? -zo(jvLi%*CF2cHf)_U19?^w -zzL@l-Mz>g6IAl5KH*EA74zjw3M8%bHsJ0wO>TEQO+h`oK&@yR@vJz*rcU6sTu{4r5 -z%)HsBYN6nYhl0Kb9%tNgUTz8|ZNE8eiFY7LN=q>_Lsw`A~NK8nce4^4X -z1)9pFo^@0wN>cZbq@Sj2OLQ#9#8?VR;!@!F70WUG*CuhHsvyM0R4RjP`!Ucm9!AAM -z%0B(3cE13UQN;A;(5I6qyYksE2!SbTaYK!SvGqQpD=$!c1!yfnLKNzY4w^Xf$Dc?1 -zDJq?e?~6S-dB+iwLZTwYrMB{}P-Pi$JPbMBbeW})7D+Wz#g{#07wLkHK9UxG(@$@U -zUz$l$z?=SQBH>31lWdS!kep2ujDXPiqg@>D`rm-*bbMT(p2+L-7|9d~h^dV8(htk{=%&`%)^(Y!VY3<0{uy9ZXdm*c@}Q -zG45gmNrw;@dR!a@77-^stc?I~MKzoqFmQ34O09=oOmXz%^XYNnXqg0}#4Pc+te2={ -zMSkerSd+4`Hd4XKjElA*pl1wd9JcUYx`a2Pn)ooppOK{R!^YZ#DWNOtVk}Np<4;T> -zTg_PfsD(G9F198h?_1I_CLk`s8ju&RVe-Q5Fo6kg2V_Q(7LJYuPy}W^5)-H~KQ%@cC^3QZ5~wdE -zEWxorg_*0s%u8VW(XzQCWphW#xF3v?1?$W>*(e^mM5Dh#FisYbnujir{YZhKA~Qo^ -zCcwTJ7G5s6I*x@`NAYOQ7#_Ypi3dfADdEA(IV`?DfQ|LzINn*t(bf_++|6TY%_JUW -z2_{L*O{SG8^=0u58u(`t$-@0G?1YhSn44;RjH6>u30cTv}t2Lt<97qve!CwyxO5-ReKdLi62JCOYH_;Y&Y>zr;S%SG_2~V -zVpS)h$^I*yI$rM3@k+afSK17$YB%s&hmN%!IyQDzv9+s$U0o&YkCgCsLc`gFj!)t` -zK2I9>DrMs9w25ysHoni0teCi*v2eY|!p&YAH9e-_dY>($UNtiEW#U?oftzU;H_|Sy -zXFXh^+LLi`A?@IcjDwGpCe9^HoJ?4FhhYE=1&ETA7}yy#u#JeD*iMy(V-X2MMkBVR -zENmx|Hg@pa%Y=F{Z(81Hb3;sNxuro0Zso*C8M9Fxx_eB5BH~B+?%j* -zcg)1SQ3DNQCP-o;B}G{1uOL~GQc3ZJc+edix^0W9!h|s1L`#{Xt$aT8@}!FN2)XDg -zxai2+g6^V&XvvlFs~~(p%=?-xC7PoCa9qs>GM4IoVX9Ym*+ysCK%~TkB^v{p?`!e> -zGjj9pk4$lFYWhZcDFP(3mgVo~+}3;Uv3o -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 -zOJ)jL+L6w!tuYd0g+U%uz@B$jj*_ul -z)57k!jhzW#tGt#YG07ZRZa*LLnh@yE2Jom&dT=+hIKV{V*Q7 -zJSxh|qwIvCs&aV>+~yeB!&k@f=+*IASa59uVJxhfz@lqoc#P4@HF+$kDadm^UNeNX -zbrU$$UBx?*3f^kU3jWA1P*;F-Gxym+sKRrktRbGL{!wFS9u -zm9OTkyj#H&_c&Ho7XQqX9P7GY!ixJvthiSaJbkxk{mI!?740(RKE({A8Mhlv9$tL(C|wZp*14h`!%b*yQx$|%{(9U5Nh -zFz|9GN6&P;EGmqFm%B~DE8QkmMQp5!SXk9<;gv3PhUk#&L{z-xYMLv%b*zmTSl6Xv -zeV2xfT{_iDY&SV^ab#W%+;%wH%xvVEE$0SZ?9h~WL -zahlh0zsHsRGd=3~nI0RnAjWlRCUUa3AzAqRqszD?#98>d;b0mus5?J!$ktB|h#8Bbk4Zlw|)wq?fbdYrVnD&nZ -zK9V^ruluEI<~u)&^!NmZ&n3i(<6;I&B-wJWeqMg|nX-p8TjEPhhhw^&Cw?XQIb<}9 -zsdGwYp}Hcf35g6z4aej-x~NluaWHPUU|Hv=?Funw;6r4}LDz(hK;b8AFPbio(EK92#$pjyq+bmBL+!|qfoJ={E`Kje2!d2krxv2?}lw0PwUto -zXR)n^ZM`mbP;tq4*wN!+Th_r=CXFRD9M2lKG43Hz0WJp{JY7DeB -z&y+$JACM5l4eX6nu_s|*ciO`4w2eI}8+(%ub|yV+NqG{L%!1yH>43bjAlMQg;f{od -z?I~bO#>J*2g9J3}&pLQ#5IEH9V*3wy-hLC?WGWyYGpmgaBv4d{QX~lK`NAY-?)Hzakq`m~5&SergutIgpYZF1kNxa63q6D9oU?BDg>yXr)7Q+XKlCdFMCF&(jY;6Aus#h%WaRfm6^XJ; -zGys*l*#zgu<7XUe{3V3L1OC=+AuuE{bBPQIOqj&XB`*PyA&DXWa3Vene>|B$fN3Qr -zL}bDw=8vb7_@}cZF)94>xwMcKt^r710t6%`AT6`j^F8=?cEo(#i~nF6nUDWuoU))7 -z|M_Vz{x6frd<0`;^AQ+DVibWPd6~vHgLvQ~6&ETmgTDHr_W%0r@N_SXbj64dX0{jR -zf$vp!jP%3^i5bJf??$ln(l{Q!I)NvzOknYqF+6g41dm=C#bZ}kbUBHI)0n`cRBNs( -z|BI~GCa}v^*fqu`7sUIrpk@S%uM7xj+23m5WYola(K6m@7{xO;$FPtl -ze->WeDq+cu2`sxchGjRWq}+1ZtqPXkDr5QWBA&Q4g(q&0?o2=MQ_& -z+1>GecV;wB4kv-|9w8*WHv(h;A@2YQCpaW}GU$@SE?=ohNa@(hx)j#dXRx6@i`N@-*w&cAmiiRd)y1)@ -zE`itT6IjuZ#=6EFHZ>LTdQ%Bon{>R{RKi=$Ic#f6VRK^~>l+hT*^t80#;j;rV-Cxj -z@>teX!1BfdRyO6Zsv(0l4H>L$$YN!qf)R0wJO^TT~PY-&qlMN1mX2tb6Q))H2=YXUW^ -z+jOjLGq8?oHL$kDz^WD>(} -z_3HSNGhq4*oar<0uFQKW;ZSc0`+G~+-BZN&o&vV@7O;gSWKwcgz=pmOHuh=QG@xVS -zAc4lfh5=Ku{Wmb*ebC0%0UKNUEo|#E@n*k;H~YDo*xqMid%uqD18lnV?!xKVIjCdz -zfQG$39S3}D*e~L+PsM)HIr$)9;8VXYvCrRzOk9oFxE=#;$4uNEF;O{c;vr#X)I$BJ -zj)pNEjpGKICrq?WIA|Sr&@$$rY21a%L*|Z4iX#_!Q$-7t -zB?}V-7$${j3TVXX$XL?*(v{%dS~ -z&pA+0z-iNRBY{~KrTSUegTW?p0$6~t#hQb@qJ^GfMqk!JUs{JRqalzp5G~mlBY3#LLidNF6C!;omTJDA;jl@Qa(h`MIn2To -z0~0)maiNAkCmpCjk%L5agbJpB7NL*eBePuyD{eU%j}cyYE?)S15F=$*x@w4LQ#>6E -zuJgsF`En_zhHla0<6gO$wh~uJSgs1o&D5@Dq!K@+h -z63f}(P|+#3&xdeA2ZaMj3EbZ%oGR>rVK1)_ynPtV9sEPN23K) -z4QJ6Xk%yl%Zy4lIRDCd$1sfDoHBquKR#1}q#25MT&7CU&uOmgk8&I3BTa;Cq7K=_`nH!?`d!f+lvjj>w)t -z6T1i=Ll$;1EsW`2l2m5m1aoM4vzaB9HQ$JRKP&^_|Xe~7hcMr;{l5tbIaveGWP?~&5@ZmbakFB -z1xt^eo$~kcwgo!oeO3>s_#AHkZzM4Cl-GHX^5d(8w}L8|!F!(P#3(1o5f~&8{y;$o -zJA%qBlE>VA9-FW2eBO^pxkbvY@k-Fj%gIJllu=`mi6~%5Bld1Ng6x2k_HR2A|N+KJ~%V&p#VNxqk7vAHVz}FsEN|+Xa?# -zknxUr@Zz~JPe6<7zWnwA!6hR4-M3Mci_lUo4_>(bk#k`frOX}}4z|2HBJy0AKYd3> -zW<*?=Ie@u7hUZu^c4HiWrR(CZ+@}8S>TkCuL9yS((_e2BW+r9k3wvJJ2lM=$NxX1- -z5-;AGz=GRT0x&D?$FcH$982y^&4l7lg;r?9qe3P(E<_4SX7zA%QZPHtjS_YO%kuwB<8fVHi;#5DZEmj276toW$yMeIxV$ntYGO_ -z9o>~Aw%4bzyCI8R^%=Zbm&V5W6jn5(@M=>MOPexSS5Ma_kL}Gl>}kzlZ(9bt+tPTm -zC5?@ZX{>5Y;kBlW453`yoW`P-G?uhv@M?1gOPe!NGPa^A2Tv=TbD&nVv#OH^W6- -zAEI-U$F=@EZVnc4Ye2*8J{@-kOx$1u^pJ_mJ_8qgrVN_oY?d<|NZHQ;mL(h>C`ohw -z?w&k$_9$27t$sFT8WL%_tzXBReXh7Yp!C)tR}F8letD2hnQXo^RsA&Y&b<=3%C -zVnq!c95QgsZ{noi!f84*ZXEMxL!1?(^o5`EY;0T(JGjO$fQW^PsM}{VtfOwEg!)kp -z&0_{y#tpPinCO_Y(K&6&5XymBV33LfeN;l-Ib_)bdq}zxyqEy`XMx^XpnDeRoOaMQ -zqtr5O$pFmeDWGZ6LF0t|gm{cZ`qu`Dnla%46QFQ#U)HfFO9CUX|1Wu}EHd11;DXJ2qIA7_bV -z829QRY4T^;75ib>Y|aaD -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 -z)nOCW5et$d>1ywEumv_Eo|X>M6K7t -zCa!a4OvJ=3&X9@dxEC>SKVryS88-Ici<#2Ae`lBgQo_Sn3Dt~e9;OUY6_d>(oK0h* -zBIckX>YyTGqatF-{F?ir$8&5dT&TG(V56fts^L*oLrtWFx~PV_sE&sMe+FuXP1KFp -zXc)H8G;E_eW}zi!qjkhW+o*~5F&iD@wzw-D;|@B4W^&Y2SWlLlB;#^(MgoAXPY55pNV4yNVqx`A0uN4%(ERyUpYnT`MKnF;4@_&9Jg&3IxR9Z6l1(&*;2r`3fd9UTS$Frmzg -zJoeFTDFJ;N&{lBJl($jOVSia0wHXU784Ep(aOTfWN6DRPPjF$1S4ubMlE6H8@Bqbg -zRlNNi6h{!e2ik*;V4V;$~0265GxSuY>6Ib8W$7by0egId&Y({Lj3xegKOiE -zvdiijO&;d})Ug~eopUgeH8GMi5GfeaZ$nsN>6(BG;l0T4?j`}4rv855sHixLbXb5>#m7#&9=I*x@M91TO#v)=aUI2)itPe6h6x(sCu -z^redENNQ+H*l14x?Xy5N9hVUu@A?Wj$}~j|pbVDDtE<7HzaUjTk -z8Vh^E7IuX#90-~?5wP%X7}08$&%q%dUvFY> -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 -zi5U2F%#eSFbOZw|%Zyv-V5wrlMpsfmtH#F3be -zqfwTlSvbxzF!s8H`5gAHnAjJ!q~C_AW=GiP!a=&yAH#jlwKA|jAvSo@+H_7OJxHum}~9P$lT}poXJEMVXy- -zC~V1WEzZ+A7-4{cjy+)wd&8Q12EGrSB7)K3h>a5w;5d(kZRy`R#`x!eBT>`*Y?L@e -zuEVsC@HNkgA5R3tSQO$~7No<^zle7v+HA -zfrkeH-pY&pe+OL3pW~ftKZl$~9>3m$haX$%$cf5I*1XT692DgQJwEo>8Jhb!Lyq)r -zv42Zoh3=6HE?jw>@KO#i-ag?)phny^^}0Rt+#0$!yXHAIJVqC1zW$ZdLs;Rto~EDt -z^mGUQ>vR|X(-pUWdb%4wJJo}qp6S6)KT!JF*hmE`zy88Mr{8=TK)HVVRS?wgz79R1-=7P^(;v=9K>hwgNc1d-Q2-Og -zpDq(txJL2kD>3}#YE<;+D-i)1mW>f;%FD-|)(hkH#Qd-qMwOFE`4~&cq>M~CG3;*< -zV7WVnm+p?^0&QbP2r^~x-g7Tp23UNvv|2mm6Q=oC;|)nU=}c0>|q>qQp&aD -zVM6xRn!v(`De0kETQ!E=O*8nwSHu?_J~*V|#P@X`I~x;NQ!|6*52vx@Q5*|v6IfK2 -z!7KGyEG4Marm?KfgO(JQ*Qc?<)$+Owme*ymyeT_Bn%5dqSl5)s*5))0bmZ|) -zua5V6G@R%vVt-o}Z?$Bwjy)=k39PP9V0~i>ueWBfy)%RTQestfQ8e3PF*%|VnD;u{v!7G7qRF2E5DtDk?uU+?4j#Y!0X+4ye?}2Tik(^ -zn|qlo#vzrIj`jT-)-xt~po9$rMQrL<+R|6R8ysNSTfp|dB6jzcuy3GEljQ46PI7Tz1NaB|qhiI{;CQ3EF;I*vzm9FJ%+AL2w*!@DsZ -zr(+sEis|@r#KzZS7QPubadpDP?P&{DaSKhH^qvO>*=)|_FkTo+oj)&JRY}hX%asbe -zi)_lBWL}UB5fYM2F;jPeyOOrdagiaD>{rRC{t`wA(_xW$D4aac2KbbL-h_^xq@j9W -z;%ufi(LQUTGj5_QZlIg99X2Gx92s2TP -zz{2V4oR?!bWm5e+?BStej7-+~xZ0N?p8O21Yr&PrynSx-Gg2JjDRPH-dfNm6PwauB -zxKBu!6Zd~02hq~A72)gUarIiJrtut+qK!~qxpv-jxJFnCCbH#q;i7|3(E)pa_;{E@ -zEb}ZEQ+-+lQwA>7B-oEd7&mZr%)*sP;OZ1`ZIq6Sj`oCwe!>U=k#W-!Iqk+XXKjHK -z4^rkF~S7Py$pO3)le~GqLofz&PG?#KxcwOSRFK`Y*b8}xH4hj!$=8l -z2RTsJkQA_k?3WQYhrKh8MKCx*po!SvHsR%9#1e7;V91o?d|aLvwdFBB&wH-7?X8D` -zj7nx1nTdT70|z1;=BtMH(luc!8B@S^6C%PToQV`sIi}p@ig6C+G;qLQ#6B02=&~>@ -z;2;%LjsJw9eT<8a5Jc2tbe4`2#v(S3F-AI|$>-`~d+#qlNCqF;kiJzV76o~ohnQkcc;Ae!F9|0H-S_m~i1}_3MW#B?!A;>%p -zUI;Sf@WSmmfH@b$?_B--x-u*&`;1eb5`bBBcM?nQO=JCoI5t-$ -zv86hVbrrK%es2n|R7~Qf%1J!`a2o%7CluT;mSF@G^#mw6(H -zFcMkB?b;+3KZ;|?qiL*bh~rRa7H9j4xG+$}`N2HS_M~vUEspK=ajdOLVELm2UU`%N -zoBNm7C$OqME?QZi#PS9LN(RdsvU6HqpT(+r4#Lb}RYMl58nakgpTL^>1U5G%vAsQu -z{atyuDS`9=03ZNKL_t&;zApp$@tZGhTV{;0-+VeQk -ztKrl@2_O3l_&kutXMqgP1WI^+pnwydIUH@zVNXjAuQwO4o{jwNEFU9$WJOZy#d5EX -z4Aym|v7sY_O;l@6w3*HM9jg3m6CtLvfDN4mtna2nQ@}c|9XV|1%(}15VhbUvD~Fw( -zdF-Xj)LX)dejV@j8#p^?;!~fEFNPd^Ib`FDfP*iB4n7UoIP16Y-jFUcR*nvqaA=@_ -z{R2hpi9fl -z;7f@dws9`v;9L|qA7v?pg-cNrmtz*L4BH~vj#{`9wMAE>7OqBZeCH`*;XC%zL>*j< -z*s^^&%7JP;mnA^;P1u0MA4eF0Y(dR#G4V;rz{g<|A4V*kjav91YU6a&#wo556Q`pV -zPDL%eA2sn#)Wpe{DFAYE#KJqnHr^X{MDN5boQzs{Cu-p&Cv3ao-BVuZ9E)0_<1rH_ -z+;j1~AC1`fd_>3BqXsV0Nnum{jD@Nh8+CC9ttr*x!3(z`cYX@Xwqixr>vIMMQP3i%G2u(IWo0QB9Vu~0*k@zdper)$Iwd2vf{?HQ1T=!14PSwCZgdRf -z4Gb163>IzpN)G%ShG_ubm+vED15rzXPSkJ^Wl5gyAfnr{dcfjA%lv&0PGt4qil9Z8 -zqojI5yz(jn1f#O&Lx%?u<*?yBM}Y<5K?N0fYlKkYN*yC)sQwjiC4l@uoaaM;aLcP$ -zV&y%@8%nC&GXft|)_4vBp_1v!mY$%_l!bbhiH(bQfe30-+rTBdfr|6Q{7|iH0 -zIFt?yos&CLHa;FM;NWl``^R(~88vY{sv?K!zEH=)CQgKOyb~_q+_;IFB+$!$6Dbug -z!S7~$7N|@C7si3JVGZvEOE?-R;c%F4goPs_Q>{@)K!h+tm0zS2Qs&?#V$DI#9K3`H -zCM+dWL9pC+;f!WaCC3Fc;V~He>Xn{ -zF^BkEmaWZyuQC|)erGJhQ@=C*O!E}t@3&maF=DyfAs0^OLjd>7;e?5Fbl5x{l)owe -zu4RfkI5bXa?i450qiF+Tp2 -zU!Ly7FHU#j=X74?0LBHG4|?!3S3f7Hl<60ATwK?M&P%zYLNAKO4fY -z2r!@d@N2p+W%|t*e*E@}0Dk*r0KcQ_Qm%6W{O();zbB-)`oo0~o+*}+x%%&KBM`9% -zMz+KF)5R$Md?|{*UK+;Vu0-(w;Xoe0_sdGpT^@F!CI;EQI)dls>$_n{DH+SjM5Fi{ -z`(bX3;qNz8AB@)z!}a-_<9Olbe!TO`oF6jmW6jbh?&B|dsBFs -z;BtT3U8k_9ViJq*PGIr92`sxmB_JbZWe<|r_#loI52ht?Y#~#}DyOipipgWsSWrEK -zg>2%ln!&48vslJbF*fu+RCxW7C!SCINe{s@m@kw -z0&lcuv55`+Eg7tD%}R5>l#{WftRssJ?RjizD_~1o5nDP+*xXSB9hmiOS@_6ri#{B(aMs6YVx=>K2F?tcI6Y|L{XrA& -z4VpMPXyDj@jw1s)4i4xzz*#NdHx29@EMbSM?Y4rwCpzwL^z6NNNc`PfmGIs`Q-t2i1qL9t%_a6}WaOyg*T|C2RE$HTUi -zV@NY@6gcYYNR)R&EgXqiI5O<6F$+gygcB3TBZl0meJ85p{g{qZ!zMnC>G&+BOLOjp -zQ4^Qhh&*B9F3ZR!f%;jXEdg{S89%HX5^2uQL&}i?B^yEB>E?x^G!xq(7%--mQ@dkX -z2g5li2%sZS0NDT0lT~oinp8bAjnj^rBQx!waoR@Hj3eS)877Cd%$R7N(qyJa+YDV5 -zIw}^r6P)|PG%?lpA{TxImFz`#h8L@xW5F^TN*t9OSJi*O2I^?WK!jyJZ0^qL2o&e0 -zCxMs^j7pi7D(Q;pCL)?CWk$TaPp2d(t`7TrY$XDQ=^*NY$M+#i0waSZejW!s9C9gl -z(G3g`V2UPunvL%Rl0+;=`#xYt%F;rF7?zUh%B2bG4m^e2ZMsRGIOoRO_ErTYs{g|S -z6y6)7*uPp;LK1ec-#f6+uhSEYd*B3e7Ey*G4t@cX4GLxI7MA9d+>C -zh=B*=8fvC=bY%esGVr_21g{~&3&EVQ%kO@U&G8O~SiYE1{U-jLgCV*#GQr+KAj2W1 -z1QV7XDlzzijwHh}0%;&fu*o@SN!qwEY2b9UghPx&9Pobvs0Frm9rzVB`G{k(0i -zbMPaOr`)Z%W3H>?xnAD!!y%Ttxe7b7t$q*cnEYKsgdReR(jk@>mg%sR2eL%a7AeS7 -z+upImF$WZfo<2=az>W((bngU;1Y*>8i=~D0#qS)C@f;qgJZn7|1`=&pp>Y=i|o|z;WLLxyMkWAk2fYxyKozF$~fEn1gctF_w*$iN~m4e=;cg&8I&6`m+K2>eGH% -zx&52Z2j}$LFMObQ%-iPr`>*_>KYSek_1mxg0x*P_a*!zpnE$yD#?$ntZzA~fw{%{V -z{&bQ1O3!^8#Xl}Z@z2XK(cdmd;py*JV))zDC-wL5hVhSUBO-49^ZMuy#O8hvUV&Ld+xX}A%wlU*0$U%xZjdfbPNvXrYffR!!x?dASU$GAA%hi-S*&Uzq$IGaaTd#) -z5?J0C$Lhv3R@Y~+wowhKTuC>kIVUM#YwB}Y(~!m5#tb$zB(SqBfs=h{d^nVoUXJhl -z7A_9z_-v>s5yV^DX0f3yCBrP2HAVMAvLTRJpsZC84o -zVBi!r?#(2mDIR@836MVXx1`-XWzuLnf4T -znf1b$%yK<`Ts@CTHrqowc8E0W2zk=6J7ko}lxR;je(njIlCHCdq=||t6Vh{l10!h@!zl~Vl!b7{k|ZTgFK1IS9Shz$W)e~dBY-mw8j=9Tv -zcEZG^DH}H@E$Qc}Ni*(Py_VqvypU(F2+Oo$CZud@i1S|44u*3KBwe2R(TUZ8uc0QFM1WlP1W%4vM8`WeU2FmmlM6eoO>KzK)W=&%Aw>vOP`SbG`Lx&*8Bl$}Neb -zb0Xm9_E7l=4{jVaFYqb;O$ijr&ERWQ{|ZAC&%I+r7vq^AZuVSXNqJyVKLvaxy(%hsif+Q;u#SV#qWbTmd!a9LZ``srmXi@)P6X*% -z1Mf#2yh9h7!304aM_4-MIyVFZ{&$!<5h%J+Zr>oZ;W)#H>h8H*fXbJengmg -ztY3ZHhhKlvKPT@0=2HSqzpUK;?Pr5?`rYR~{FZV-hU@RX9Ga5{GF&~F;rhpO!6)?J -z=R^4K^FjR2h0vV1?;ZQoH{m&e`7_-Y7hwMKO$5(f4CAktA_6kcUl|5PpdrBg?i*AkK#Kf -zOKS^wx5+C&!ao%6Tl~4(n16h3G&*S}`Bo2Q+sTMj!~a@g3M!OEs2UTcYCMQaLc -z+tb+Ek;ksi0uFZ@_@KXtFN3-?-k;;t^{|OA0vbLVR6hfUe(q!$SbIi>S#qG|=8haT -zF=4E;fQ?;D5G!FL8}qyKqD?(Hyxx-+vBCb0-n=y0%XUuzZ}gP#MvsO!dkwtRZHcz` -z*m$GY5WU`~O262|?=|vo?knK+o*cIJ=CHLdhi(0NZ0pP6&HlXTt$_lz4;Ha&pn%=| -zR1tdyO4vK7VgG=E1A`_G4w^VTXyE98E1!wOKE`7jI51>jzb7Wz3>h*E%^Q^F#a-@V -zd?#Z(18!3(8!S0AZO9#9>C>^-r(>Ta(x_%kuPKx3el~c{$&wTsCfQK(KVvq}GLn;t -zH@vIp0*hGV@;`O=Km6YRoa7FnjiW*S&y_OeB7^_4eJ|$V{TLhPi<0Pdeq3ExU!62@ -zgYL<+BSYrsp0v(7;-0V!Yaj~@@~*D*lGt)_FQqFiQAq**lnsB%fBj+|j^BC`T^EfY7sjLez?tBl<`0zB8 -zvN7noM*=KvoG}~nJMut74yaB8cay-483&iA9b6b^Uyp$+6FRPPCe5^l%7lqWSzDU% -zyNWgl5#P_`lZazN3;R$AG5rNcO5r+_KudxEXP`D&LVc!$Hb&I)^Af&FCc>5@j>(`2 -z^cp~Op8Ycp9wlu&N|>lgXaZB54b!Uu-wzrWSA`{Ed~X5^0Yu8l7%EUCv^)tegcO#X -zdGf$SUc=WCW<02IA;g1`e|IH-5G*_iaCqQRbl_u8jtd+D5$<;RF@XpUf+WI^r#|SLvIQVcJI6r3N(wK%j -zlbR%Uv8<6UBENqGl>zCYGT_Tw7|dA$DJ-e<)WhDaw28iq>XG5`ft=$$&SM7pvKsm_ -zMf7Jhff)rl>fZ!=s%|H2d^o~hGzvIDV2L?6Ib!3)81VKOFR*MJ4Hxi9w1j&THri6W -zi2xY{%d|k2dlI<6owV@5a0y4kMR8J&@_Z5CNJQNTIm&*Ts3qbB>EW0XkCnqqIhc6c -z-i0hLZoTJvkICxYh$#b@`9O0l1RM>j88rv_yif_J!X=y=wQzqLsGJ7A8!6#*u!w_0 -zwj_~Bq%%|2Vj2#_=mHt)h7Ui7_ny2d6f$r!Y~xf6cz+l!yy!R@VoKZN&+L8n`Rjae -zng6)AU;aEE^Y*#@0~neEHy7Yo*5-nfw|eJ&;&)jFhEF@r*Uo>PxBs+Nox{OVrq;QD -z;d-uIvXzMdvN -z&R(-06QA?6*Yem;esQ`39>fr21ZD^{bYnhHz~X^R`C1Mw-Zo*yQ#r5@TFUif08jv48g^d2QXZ{W8V70jWN7u|?b+m*qA)+}~3 -z<8v7Sj}4N0u7Pbnv+F^#p&SrL0%R<*>js+EoRS*&ekN>~vaT1qn8Wo=Uy -zYg-c7+?K%J);K=s$>5v8JgyEEa5GrKwLk$E{ds)sFX5fO91eD8v7;l6O)VL$ZOLMF -za}jG=b*yX2V@pR7Z*>;L;dp94rU`uyasVj@k-8pRTq4H8zwxy?t&3$M5 -zz_xx3+xj%T*{5TBpN_YBHSD1JH0DX)vW6j~>o1Nvkq1mXI|kfSOsLYL=hF#0_co -z)p2pOi1T9_z8*7hepHvxfNLWf?oU~$_a@t?0Sm+?;h#!Hc~dOTmB+&T7$t?}ulLW5IH+0aG38)*Q6tlv~48 -zvC6oGN`hPhsAnlz2IzDX*ZNtWWT-p+K8=Gb9kgaSJW#`9eQ_) -zou(XDwtP3c*$0*4=TzTSZ|#=PNcYo3p9?xH4Qww0H5uUgv?b-8@BRP1z2|onXWH#O -z|Jym|nQ@%xnemKsz!77x!8ifVi7X@`az-Q(B!mJANJ0`QqJScjI;(THI#=4S_f>U^ -zLV)La-m}*Eu-9F=s+*R5|7u@hzKEZF27V0Ku(I0=?DAOH;nA_xt6{sRh`pX7E{AQ0 -zWiVl(KVhObVc~}4X8~t|CMvxJY+EQ`t5gruv3YPX=dBF -z2vmES`d5@Z*ApA3bz??B}Fg{qwvXdb?v*Lm6`i7a-at=h)%8 -za^D5pW#aJ+*WJoSo%ikofST|xKcfQ=YP)+>$GEq-LBtIfa*PY++{bYrbC_0&|1L^u -zAJ=)jx;IDn_rG$V`#3H?Za=T_kQkEuTXN1(&)|Lzbzk*6dHnbwv?%vSL5UjO5aK?D -z&WX4u{{bw1rpvejOn&jwO|iEtcu@eteUH*MFYjml|I+XNcX>a4UonU$D~9nz`4Il# -zK+Nwehwxu6fT8R1UoPimr3<6LMUBdZaf8cB_k|!s2j;2AxGw}4<-jO#Q6m9{Qs5#^ -z%gGu1`P8iFFQ@OpEjleWz|1`WFihnCE0gz~ME-xCox{H`c<^G44=>bs@j{Ic|Elrg -zc>$RP{G(=eaRzw{*w0rfT0ufLakrmg;mF1yyC$dwR3pC(U0}* -zF?`q>#j1KAUaj}p5OXakO)Ot-4CB?tMZDG+!s`t#HHPp;(<0uu9>E*U5dj!N%&O*y -z=*{a9*b3vV7Q#{p>slgM&t5Vu34Gj^!iQ~1yw?)P+pST&)fUCu?J?0i4zSp+OB`>v -z$MJ4^9PhNo@h;D4PvgCgG~Vq@f@P22xf#N{T~WN#Nr*|}-J8sFiR0~#2;RRD#hUgA -zHg+Yj<8~5hdbVl0EI;U)akpT$?bX>7ciz}lNJtd`KS -zq?9#&zc+<7Jz0FzoyUj0OIUp?fz^F6yx$kahkZ$`y`9EKw{o^q)04x8-5G4?6mOBOfGG4&`i8PMRWTXu7@q4ygb9~mo(J37V#)~K$ -z%VXi1FiK}6tEzB5v9X)YF8afWi1dSmm8tyI?MN?@VlPO(bL^%Z3w!PG%=hsFqAMbm^3kvv_xze$v5MJ -z{ESQdjKD31ucb`fNSJ7jny3%!xD+yQE@+@Sq@#LK$GNbM%P|9uDVBG(aGO0`vL@~p -zOdAI1dQhC4^Uc3ZQZ4i(fVQZG=7^5^a1o7B4J~YuvhQ^*ZogS?O0sz+1X_lR06}N6Xkw;lV1{`uMN@!8LeWZg<4eNLFhkyoT({($ -zaSgajK+>#b5xNL8l!TPI9F~=?iQ5?wH^d3MqD#UY5BD}!m*Y0Ik3gWDj+OAi?P?qI -zcf=`iT$Gir$w-#rQl^Oi4iCtI4p!fym`z -z(wZ=FF{t6RpFN5!oCpHP0|rh9bV2U+cGhdwxLA9(Qw)X|2_#L -zLuo#fDe%wm$030k(*-mZhSQXN9ARZB$0Y+TOD5_QCe8+m*z3z4{&Sc -zx#~WT0v!IG5PAe){?8s8VhA#Ss2Ic(j>M7KJB;7ERdolyU!gzj8^II%M<39W2gabJ -zAja*yxR;+gLXffbH1l5^J#%alN>3l36!(Py^Eikhy!^?57&p8uFIUgtuV-c@WQ<{B -zZZU-Hx$|}z<-eV`^I~4T;K3Ugym;fn0$#0|$ICTyc(G<4|0d8}^x|KaJowiYdwlWo -z0$#rC!7Gc^^vIlOdj -zUh-XDZiwQw#zo0*d9%Tfw;BTCy1dyC#T$(=yxtfVCx-bgbY0$P4vJPaha~UiE#|(o -zghg+*MzE@75%0ATD&knz7RSe}aeUYok=&HkZDEMoqjH36)0qUt?W;R@Tm&EW#IU6|f$alJI5?8U>G36;C(KMFMKz-- -zoEc5y$XF6(BMJOCl*Cs9X>4HVSXT;bx>HhN>;v{`VS;^c1|Rh>HzkYpy;*$R!|<>? -z*51xbua-4^OZeb66Y-N+-=vPN#NNMF3y%vJ&{4> -z9lJ5+=Kd7c_b2heP!g+$Q&>Hi#@c}_J|4(n-R%@U=}+T}0fJ8k+sAXLn8@JBY#yf= -zzP3=prFk6}=M2=$XgD{e;n+kT2k+)kHIc`jyIJg_b2FR~$oYOahi`_n*m5U_O(S`H -zap%6i94W}QEu#f&8L{=vC@X{6&|<@j4KbU?i`X)*xm3cY$pXG~wCUGb+2#kN<7oyg&b$vl1}v`8*YQSxE7Ghb##$F6A|WsHHI(nXb1I;aZf+DsYPGtFu?B`G?< -zbC{6-^GsgEWc&Lt!iI60lhDtk{v3AA=CMceb=cur!@+6xswv^rd6#S$79H8d=mxEeI1FAFOwo%858<1ui0L6>JdHkZc{hNgK6IO5CWm@kKm -zp*(6Mc7l3m61bhVLsLfCPlaJ=3@ckQCHFw(AV}=L#P&l<6sxcqd1EdUOFN;MNyP(H -z8j|zE7=8IH35LL!xScX_D`|*&S8>ygh!eTm7;qtC;8dt2 -zst$3Ir=upKqc*Oikv&)lLMa=hBxH?Mz35=%?Fn-Kl8KvX12pV(+|;9X=CV{RVdWirD4Tu*+*<6`+N!~d^yzlOkST_FtHuv%l -zR%l!xOx!=-{W;b0wmG{RoLc9|ZI6=s7`3d&v4L*yghy5TV|^?QzZup=3MH=jhz$aU)+m$jgUE94BRzr3#tj#4w!fiOL~7Svh2f -zmhBzF?;ZW2Y8b!Y_ptu3{|=rwF!F$&JU9xaKOAIU%qX5b%>0)JrND)w8(g@o;6;tk -zG7sk1Bsl)@#Pl+(DA&b3El2Vs%`KVh -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 -zF+hH$ -zCznNqJ26j%jta%Rm_d$I(T1AdjGd>`5!cX}D4{EzDhCwlWtY~Yn1PnPECcu<{ -z;i9>GZFP^Kf`yeLAjxyMM;Exz*%@@iYFrf8S)uK>)X&g4mu_bm7H3I#6hov4j_&=; -zB~i!x*4Udi1Uw0!%vI?k490Y{#|(6)P29{{=*d_D3oO%380GgRE?CyW)iiJ+X5o0q -zz>$E7Ljem1gBFg4Oq^P@a4urvDnXY(nqdf_h2D&b+e-{rG^Nl(Z_2*D0uq9XT9#4r -ztL%R}=2_h&tU6-Czgp(llQM8Cp`kZk5|@#`k@gf&7Xc23OziQMu!p%UJ`0t8pdtY5 -z=G)(Zi5(#mI|DlQ`bszxAShetNC53gpf(AdjcPa?&`{~oQ0Ad?L-^r2CU*NRad9d< -z4!{s%91&u6d(8*5i$LL$4LbI=oeSDS``r80d1VVaD7DV>lp^-c -zYdGVh(+QjnnmFn&V(+|$oy=C|2F1Js% -zJHI*JPhIbE%J8nY;+#%K+z@R*uf!+b+KiJN(;oYZ*Kg -z3=u|rj-2J?&&zx9{1x|*=XlKa-#t^&k0ak%xzV|PLQ>G%Zxd}8vE -z`pd~Fxb@dl(@^>w!Nt*Y)wB5fnR||A@b@z__{Z7VhxE^L_dpR;o`f?8Wo<@Jh{`z{^{;e!O=z=)lZ8UcWSlH!jZ$h~BtL -zpz+~lChc?iY6x%CFWS9d*axP`hkrMF@LHn}?_Kj_eRBYt+ZXYDcLZN`2C=>+fYr@G -zyw$jf)lDJ1*A&3J%|X1=6abwUC4rdc`%Vn|!K`WJ`XW|yYzyPP_OQSVmkBl0nvN(w -zq|4F~k&0jhl?`3dhxEzK7?jlh^<7aYeS9;DkGo?M>cx<+PrIV{ygQChdblly^|unD -zPi`ggX)l$*hFf-b`?a@ISbIBxPj1Dq<#rr92GclrCy!&JS*d1rmSvL1mvD;J%?LMR -zSzDud93L;>&`1H5BU$ViTEe#j32Yfi;PZhvJ{e$zvIIWu&)Ooe3{hEpKAgdqLrk?sAMd<lJPs4R@Nz~-k#o1vG5sD#g*MiyuY6!8MuOX@r8j^d$ -z{1c_C0YiEUu&+R^bk){y(QAroJO(I28Fgm9AUZv-;rJX~86Agbi#RZ6Yu`PFKon4M -zFOPk*S^4}Nm8$OLu0?3()w^hlSQ4292lzZ)e5RO*E+#;W^J2&46HFMN -zPhepqNah)|CM`523^c?v$ql&>F>yA;{u?EncXYvDLQO!E@!U``HQpdKd0CoKWEhNvN-VCNQ@w6CE$Wa3;1QY!gE1i0wr%hbo2kWU$?O9Gcu -zz@;SjTeuW4QL|{`e9**&5O8VHc7hnb)5)Z3hAQPBRDZ$30GnCn4D@GB^yTfG7y<#^ -z1Lnr?^S3#U4jq8*9OStEyotda!>M?l30_OC=fI4D8jj4h8O&S%K@L2zqMDOqvT~H? -z<1;#9_?laM=Kmyt3WCK7u{1R0-rmh})JvvpQ_CC~mdEdbFhU@03YVl8Piw-ELI<5o -z{LU@;-dXsdGiz6iYi6n81YuVbDA*e`urFZXNXWv;u!)+8iMqJ`ebb%cv&eI04D>AN -z=uR2pe$ka_XBSQE3uxFK(6EbcjWbbW -z*cpLkuh&GS&qRgK#2!DTi-SWKr`&7Ec8+^Ix+BxIthU`B%N7VoI(F0Pc!UT>++I%D -z@RqRK(JoI>iU;iR6tQQah%(Ak#DRHMECenEAb(Sbylk$U!>;)ZcrQW+wcDeid_e;N -zh0nU3VPru%E+qlBeG58{cuXAiS~$31N^@SGQ$`6S*#IN?KVIe$X>$EN{5+4){qKVy -zrY(Obk2==9-+i81cAulRaddCzGM`s{-p7sZd#yZQ?XzKyK=&AV9t75v;K6kTMUUEd -zf7_#f1Mc620_Dez_pfEzVBxh#1sm@DYT3Py%X|C~sqJc=qkEfLcAuk;E%RF_3z*mw -zw3fwnC5B%r7*P=N$kBl$b={RCzX$v8(EfWY4_Hw8-QTMQ@Z8=3{IUENo-XUdlY9E{ -zL^%`rhwxP8Af9$ah2l?BnNS`Xf?_2S(+AKts_$2;}+^}4`|?aaJ>H6SqaN__w?Ukl)+ -z#sFSz3gY!^eyqB>fcLM>8-z)MJSUYPg7{1*i> -z3>#bBN{3}p684vq_S+Y+x_uEJxU}X*7|UvpVoe9b#A5ikGlunDact;}3&?!h6$ACz -z%{V@HiR;wHZd(ML4URT;#~|vBV`Fa|pY|pMTt2&%f)aC6KIvP+1}4h)FX5BEGzd6f -z_QdebtvG(_i(}Vt5_`v%a9})xqjz&SeK(8h@hr}arE!i;G)EYEmc^O7Ih>HB`7A2$ -zX0T&?2|tY`@!d!QTLzb~so$+MwhX4RWhjL$L-zj7Ls@(|OgANqjShT#ekY4Be+|NC -z1I+L5#PG{#3_I_pv1cNSy^~pKp2;w?b2A#MX9_qmo5#`V9QFy&q_AxyjbBEW@ZIPV -zzWudv$L3Kc=i3STY)rXjWC>r5r10%%8sCkv$z~cmdG0hP^LZRypmU&0@&Pgs&F{EM -zXm1D@Xb$MO&hGD2pd|f52rl=PN3$=7>)ryIJ$W>G^JwxF(CDR#Xz~})6eyz6Uy!jm -zSOTT4#r`9*EucI1(r`V<>RE>5sW4ZiHDsbS2(*P9G2|*_E{loxqOg4q8{Rd9?Bw`s -zizQs8=n8~QTnU?~jT*QbxvzRw!g9nACGNXMMKv_>Exx?T*U%a(p)GFWMhxhTLCO)| -zj9QWl!w&Vg!WMejsXoq5)HY~zMKw@#K@@QGL^a%su&ce@*`9eg-MmiJa;^!x-$+77 -zTiieg9UFF%kJ>pq-C@&lQ0T7ME()*F!)iw{;3kU@L?I=ETa%oS1I-CrO>CBzupJF1 -ztzU{+sEL}W39}KThBKl3vZ{kQh(dXs3m0)EYDg&9b-FPQ^r(EiXoy?#y`PWhIJH>Bu}}fWBL+^!fYWi{T*RJ0UXB8y2;CU_Z8-l;_-|Jo -zHE<$o;#61z!RKPwl(*$g%vDH3CeobT_YpWKC;X^4YoaG_p|=3s%$w*f*vl-5%*k>$ -z6Z+-f)kH^(mB@fDZqEZf1v{69AVi1|=*d~QowJsqqK}0ER){W*f{y>2@m9{lec4b( -zFjMgHxUq*Y=7^u~QBwN}Co4smpafj9KxYnU%RoZ#>cg6Z=e49Q++cs4457x9f(Wf_ -zIGF|NGQfo-a4KxzSU|@Szb*iCbkRU{)Iv=hXdp1B0m4r=0hh_{NgZ7&9i3?%U1@@b -zxeOkJ4uYuy5j83x;ktqr>DQAmWu41vJICdHDWD|<)W?D9fR00c1AF~C$`(yj1`O;C -zny3hwC=Xev;JRPOLBED-HlKCE7#mZ-j=f$D2mA&O`Ar;T(SwB& -z%I9q;A*66JttR@sCc!{mTaE7hYTNR6;UxrU0z`b4$LcZPm-=30bbrSWK%)(1W%9iD -zp-;h|dsL9(em?cg|J~7ju3G-BbJZ~`$Hzg5+P?C5wXS}1966a+$GgYJZRarx0Nlr` -zWwlR@3J%oz<3=7=5rjyc^Pk4YT}y3$)cM?}?xjX`-{1XfZy)|u)sN@*4dJ<}A^fFk -z2+vdw;;HgMJXt=7rz!@PAx6OqN5TvN=IH}>M9O`U^@AfIyeNPn#JKhB;W4=N$0PS0 -z7zHyN2{g)yA*d)fMnQ`LnEUWDiNBtj#NSR&E$g}JX>ncXyeO>%83is1TK-K~xiF6x -zD1nv*ftP>P*yWR1eT-GdSdr|ti}P4@aUSp2d9mi24{PeZc(0D&;=!sb^LXou2X9|t -z*crF`@cvalR$mR^y*fYMx$4K8*SvV8egQAnd+>UF0B_a>uf8^x;*)OhZt5 -z$Gm;bhqaA4_zrnabcSHNk=a8JwHQicU{v -zacG(@$`UHZGuSnn#m{%L_|hvw5t5 -zFGg7*tbi|n4V2$}Cy%d(3;6y{7QftCLfLp$s*D|)%H!Bn9w%p*uR@^FaC%0=saYLI -zXG%CYRY28b0TmN@lus5VH)ZQY5kF28@a^3Kn0U_;$Wl>kj6GlS_--tRAICHJWqb+S -zCo?D`*i2_|XgZ7I^F^GIuqYih-V!ePN~jBHsAs`|UzBsf6p{5}G3= -zfsK}!hL#w++G}Ww>dR`4TA*4Y%!gqWFaw=2mPIzuDeJm4e7q4eV9S(=Eho3O?1qpX -z3`>&G86E9$P1G9K(3YUM&xVd0aZ`Y&ogq@JLZsGXb~qM8vZyxRFK$XG4zG73p`$ZS -z*M!fbqmv;zQ937lRui33r*HuCd18>x^YskBi4qb_T#6W|32V5pXyCk~vz$0C>Nve< -z;6zZv@n8wZS*kX~?IzBJEnJEMwNc<|6yV$BX1XeINN5Zvm@*0GB$F;n+RoAGNt@D( -zqa$fZZV5xWYU37aViu|yE))fhgbbVvS~yNcfDz9;blw@O -z!v;U%EYiI -z0v10@N5YWry)~|*HEEzdW8sFA@K0bM^biiZvX;0GbROtHus8s>-^yCji{?=-k8*to -zE(D#&={}fP;uN{p-OG=I6mC}#qDEF;gb$+>O^%L?=P2tp~!t_-KD!?n`cpcBSY+7b??qcdfQ1H^4^wKAN|5nUmrc5dUp -zwd|w2$OL;!`T|{A)NnLV!al!-ihwDwQ5gXC1%axdDZsMVugU&HejUd{rhr#{61Wiv^SG=g_T@g^{=U@r=6r|z9+j4l -zb)WbDaM}GkQ4@7FuAHz}(n0iF;wExb=eoD^9CiNxWOSdWuFKJVZME#axBD3Pe*PU+ -z5Mo3?Wr$9w4KhezPnpN@>;k4MHpi22jeyP`iIn^<1vHd#MDjz6Eci@%(lcu0g60hd#g -zc<%HR{!VCd=^tli@Xxcec>e4(o)yzx6 -z{!32PF;*TEh`Ge=b9n9Y9Nw<;VD&Y>K+FgA9=umKk9V%jVbvwNG6WhQ-l_}WZ2=e$ -z-mmwG-n~kv#fLZQy%1-nK7iM*1@QW{0A6bd;I+n}h^3TQUGw6tdN0pG)$b4h1po{QwabVVdwj4sQ@n=yQPGcKU=d3OR|bjL+scE|B$cLJNb -z6ZpK>hMA2$wgW>KW&?Gbxhf1Nvt60bdXxBquFLI|X!Eb7XEy&@&WRZ|WD4h|)6!70dOCwM -zGkF}J%Hz;f4*MpvD7%}&*3lfkzmvhY!x>4^-#nbgraMd6#18l4Iq7o0c{DFjL9qB{ -zG$&zV-`q({Gt2KsGZH?=GRb9k^Qf9EN*>73nY_3%XJ)fFJDoxGOiq&VnUGJ=IW}F8 -zWc+>81yoMixh1=13fMN8!!HwA{5+Avk9RZpemsM3$1?bCJd3aIvf5Z4-`=(RwQQRz -zVE0TBm9r)6pVx3`z9bd1PO=Ayr-*7+So4-}&ckY3CDiyesl0W;r=iBL<0AX11PmEv -zS=Q~QbhQB;SNs~T_}Rlm6LDFsUk+-x!jASK9d$ul5`IP?3Yn;1)KR}!Lj9tKYhhar -zVGRvoU36`cqakXH7}86kDPp2oWJrh-!<3rYLnLZ}`>sa~v_zfiVzNvaBK#O=jc5Wv -z1R;V_D}jj)O|&FETLf~VI@+T)(6q;Fm?6Y)xm`v}uGb>_EHJl&c^>SI!p4*=HqaQh -z&=6+z9}~496PH6KE(Q#o3+R&Y%%ta&0TagqI!^cvTLBFxS&lZqQpFlh1&gQ-7Eu#6 -za4D>#E@FVd)1;m$Vckx -zWXZ(+CM%ZZfv&ur;Ljv~icZWU#c-;;4K;LjSn*6j2Z4p|j#NThF%p7Sisw=fZC~NE -z5K`PQLs*f}Erx6^hKFT~E69+<;I4%Sf -zp0iR_0Ta}|pk)J5z{Flh%8l78t`FUv`%?SVxDsBtuJ);Muh-tDCg%)Id+<0D6&}I@ -zot_f*`7|8#m2f)95KIfl{U-K14iudxg3CTWKXX@n9PMHS -zroI>ZzNO`D4;;_$%wy*%apY%}@6n^lxR;KZ^IfRXeZKoXE4M$e?sC>RVRwHXS!QKB -zx?!$x!iWCNo$piKQ;q6#^7-W7JHX%VqvigM@i+Up;~uwNJrno4mw)Sc?pyhH!FB#! -zJn%ezL$;~y>ThRx=acq -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 -zJs!YIY56+GEDNM^9X-f+YNtnjhkgos-4t@ -zx!intU{fW-^=Z-wtnPBoWGBwRB>fQjSW!A74X~vBIYJ_qU>lhj;DG?*DX&#|L2QnU -z+=|X0bLx$b>kW{6)WDKa#d}_mPesa_K?7mN>Z;SL=EX5}@sh#8Yyc4TjS(B5QKxEj -zp3Jwo%*moI00IN0xyuVj*_c98BPLSxYU^F-`VLz+c8p03?w^mpm&vnMmX=YE@}h!B -zY0W5{jrpfgZ4^i2g5^Wk$pLpWCZ}kDI>bW@kLAyh@cN -z<&labl|oL!ih@)o4SQ -zw!|3=K|}~c*U-=qMB(_7_osct!btsbzgxIy1Qxjeyh`+qew)^sVbDcQ@Dy8@iI>w- -zXEWeqeGlspuceM0*|)QqThExca@%K(#!6>Wl(N=V -z9?Ps_Q8t$=sX!ANy<_fkhe_S7mtI?Hdf=vHid{f`udcS*hFVtjtEO7lBT_cX% -zpAY#Yt*x!$Hn?leE5ZjQ?K5@CFf>6#t(^dnsTvamM_*3^xy% -zOoaUj03RU02OffpeYLlbMYYFntHar1n{sc`I?uP5umfNREpV)JvM;}Csqu8WH@L-U-0CZ4v&*rs1;a|#$dZ_ksfqL@Ak -zgz$Fq5^igcKjI*WqwLY-Q0e;QVB5}x$Oi7!;F;REkjTYBhIukVPTEqV-5wc3&lIGz -z7tOGO)pKBh;OdeG9%2;KM<=Z=hG={3Qbt7-fk6TZ?fAWHRm9)_L&vUZHdL)a33?i2 -zB@XfKu9YQy@7;pronPUR_5o=fikac%8_M54i|(+{q6Uz?<3QqjI)x*pl`3G434b{K -z==zsX^_^ez;C2$tFEJ3SN(jG;N<-ziPR+EDU?G!3^~${Wt!0{&;gSM(wR5SW1E&+ -z4t&96L80w_forPEivAH#UQnV(?zau%I!Md -zd<~Rnf;LfF+1hRpFJ2;!ab6`aez)?U66%kSNEt+=$vVPOWHQzw2L71DoR81&w7sve -zqHGEgk)e>b%Jk-E-3B$+aF4n0<1|lLQRAfw|8bmwgj!|Tzj(Us10rz<*y8bw*Sz#T -z;-sTAW$5z;`Wqcxs@W@rajO3nHvE>$ybRcPmY4i-)fCysSN`za%Tz55m#cZHSMTF7 -z#nFCR(%B!i#Qry?!ST}(OVpm=sCZW-8z#hjCXf5NDmW^!Td@bePlX^w{CH?e;Tp+9@ai-f;O5ksl=JVLO%o7o<% -zf)7Hx%gn*pd$T;266i{=dg}AzVnJH?C;JFero=&)tTQ~0cR-iL%!@=q-?6mTRKYNz -z)sok$8& -zD;-~|z#LW}z^nO&NZiCGbL2_AfvU914L3gI9pv<6?S~OfwMX3*1A+9>RH)pmFF|HU -zOnyZ@i`84s?seYmhB}{gXy0rcBma|<;FFz?I|@5>Tb>G*4|xTH%PK>wI -zvOU?A#iOuQx&pDGqJ^6zCswo~mKjs+Gy*hj0_)9Bg0vTD4f{mbE`+Z;q^IE_kFM*; -z3(bt=qHz!@i+Cj*f=X6o#^{y9BexpGQ&f13hj%J`CVx+aXU2lpWne0bL!~0AUo=Fak>@5a5va -zjlV-00|l4>0EagxOE0ld_^S8_)eg(w;6!)^C2}M~kmPFghYJYE=#)rah6Q9E+XxMujNl!*?=L*Ai2Z;X?#?8yca`KP=zgJKEXj} -zWeJFaP&sfP>QV=1kLPA*3wzC#fAqA!1V41zejH;wVdUc}(n_YoZ!v;g2jFBP$AZ^jCgeKVBO}Jdj0i1jP=rXpi1dv5UC;HG~i<=SmtjsVG(uWHa -zNU#`ApKkvg8ttepwTjIEV9io)N$e&jWXozFFIK**2i~KJ)sup38jnp?|8Gjy>d4|s -zoA>zVv_Ndn4 -z>KBhlt2U1t8#o=J-kdHC|vV4R(pi+5Eg7B$(X3^6DL1Jv(Zil -zsM>7}za^#ED=O*U+u?NcaN-DJ6xpDdj#oYAP9-h)F+J`hL2^?Xtu1cy7KUv8-kz%Z -zZYr5Um!7{txo3-15#xkG1JIB^LT@zEb2bllU(AhsUpAWC6QoJ@ubJiB>cpldPfBvB -z@>Nz>ITEyD*)^v>6KwJDmN5q!6Iv3LhtmXey`Eh03jj^axtg(fAz|K1^Yu!Tnnk^H -zT!hVD(p4QxWm{;7!5p$o_N5w{duu6mDD_TmbyN8@91cEAulKU#*qW1{)1VIUQ}0eAPz^zx7I}Bo-dQ5AC?gEJp5#Rw0B!3zU{bF() -z#G}N3+?ikNUzY5srmOV5sY*)uFXrG8B~Fv3Ym~~PRe(WdNXO+l9&Ds;E{4K?{DYaD -z*3wp$e0Km*msf#y<0v1iC0CVh`5T#xt)}b|bG+&TJs=9zJ+A4hR`j(YtAJl^2%Krz -zRZM7M3fP>4R?%8j7RmD5*pZ%$cXCtGK*@))Ni6PW<2LC75P<3X7%a1BeTF53v_|N~ -z+J7|A-C7IIbIDSoQ+Nb$)onEl?s`uh-(J5<-PmFOvyuPWYgnK=U37miVIDe>E{ISt -z%$MJEbJh@`d>GyM)OvHwpg__Fz(p>cFPQ}9>ZR>=6Q&z(la;#dr_kP2&1gc49EHP& -z8g>;cBP_>t#UVZ5q-kq^ti^d4*imJ5Df|A~1_f{#3=uw4F;a$A6h2*RI_=~Q_?g#K -zp4Bta&2i9{{z!Fl@ww1CD$-E?Pq{%_XM@VYB0%Y-arf9c)2yu<+4pSZ0twr1ogRhz -z%UE!p%Ww_iybXL^|x0=i7MS~Bkrd9{*U6(tRH -zR;VYP4-{LoFx@h}Gh-d3XiRlQlyxg0G$I%-5q&-qxwYD33=cJCxKWs-K3XeZ)=Zw2 -z1YvvOFq$Z~NFS({k2mPakCOw1(Bgy{sj%4M^6l^(O2#^PJ-?oH^3k`Rn^Gl`841b8 -z@q)7WT0}<6Ug!;61k#BD>Xugf8Ut=B^1A>&g6}gL7Rza?>t>b2xP(PbV!5o5W?^T0 -zqE3U0sy&Kk%z&W~uuk{$nUI<5Kd(o6!}WP}7q#zz0QA&r*ZtVQ(TVr+esmkaT-W0?+OnP+KUKx=Osuj;! -zfF$&*X2d8TJn^>$x@RjbI{0Z6c1iNV-b -z@;zGmq|T)F2;I~9tlU(Md)EZKWc-a6ENU%jwO<}cfW2m6l9bC}aPJyXbp=K}`&4!Z -zUI>pl81-uc?@T4VR@4FM_(X>B_3l%qVxzxGVeeUM5~6=wi)?hOyply~Y|~_H-z-O-+QcS_IL?^O{kc=wTT2l+ -zM?)VwQs&f{%>ZY0S-TNijA?m8vk6yXAlwJJW})Cww_Qe -zod<-lK(XO$P{VD*0lL5@lxdI!u>}V}iA*#{>dsl9aabFTn2G}l2ryRPmS*Oz+-X!) -zrps?Bf6OmbrBL3sfMgIgG6%2pB)>y%5{oP_VO^?Od+weiEizj~Mouj?H*K_=`~l2& -zn!uRva(aeDm7k@Ig!f0kM`?9xspoL6hYJlG6-u%<(A0eW_jmR{Lqqg2=hMtdIDfbE -z2UrafKjj`G;|1U{i@uQA -ze8Jp&HP|S^7qGUrh@;1CIGw9GrPPwSXNZHKCpCQG5Z4p7+j@P!f(X4<0Cq@yTFeeD -zx!^{ZmWQ@!PB!}H&WWP({{7?&(m4AiSr6BNg=F!|>)V2BDp`t*5;KZL57xvqCy!~x -zMo$ZRiIJT{(zDQyi?B@pe*3>ks65&qqWH>iiQ#er?+mlPMbpaKHsL3nnLmR)UL#Lh#zpZ>Vu-+bJzUeF80tq} -zPMhCbLBy(Y5R(=Z?c45TLfLh32}Lt<&&Juc(^?)cg3eu&v9_S>5+qjtYQM2>FUTk; -zbE_*n7a%^)h4F8|R`B@VnQ@7eW1puU!Z{(SF`5TPA7CagP`{_;*d5t*J -zp)whQN{;yayoNV)Xjs6on2?7PmnysZn7dP1agFMW(bQfBxPrJ$?yLS*&zs^mcT395 -z{1XAslae7GC7u>I;vKf8M_Poi2Pl!3&a3%doc3V-2K}{!;GoEF|8DL&N}rx581Xpr -z`t#RXH1~Tms>iYg_4MCf5AaPIS%d9%7NU1DW{0eb3X2SNIzGn|cQOlAq6npSc1XVQ!xd?=CJS((kj#!qN+j^1*x5X -zJ;VK$32|q9s;yx%@C(G(&AL7xkM-EgS+XIkyL -zo#8bT+hxOL9y<97-;Z9 -z`n!^Rd`)$wvL%x-6b1XZO7Is;pt@K?T0~nx9d!cK8eczzy7o_2o=uLU1Tav%8O@1c -zRuYJfYLEjWQ7cc2b%iy<*%gIqgw1~YrKB^Y9LASum9-bgZu6~%{AI*8?qos-Bj$b@ -z`m&yr1vVAVN}QL2wGKLHpPjC+!sAZ>0E}9&syM&HPW~w?xFi&Y%m0J{07+1P_M37( -zXbwNXuuTcY|45+BcLabjGgdrlwdfEE5pz?8c>NV0k|<#lqn(4hm^^Cfgiiw-SYu{W -z#kX9$VMQ153DU`=LB6>3thi_fQcAlz!R_&(HQhzCJE#O8VybFr2C1eTdaPx&T*hR# -z^@D7Hx-ej*E2d)ORAE{7Nb<2Vdg*O@HIf&E3;fiZ)b*}ePT`*uDQhVACr!>QMmf^y -z-6`d)PUvT1s!~%dBGrfaf0#H8<|t(Vd0(7ZpRYZ?@k3piJLUbJeXdfIy{D8E4c0+P -zgPo1j|1;C>&AHCgw&Ufu+-|T|j?`skFFR)j$}XW^>$428^0xj|;+tqO+cUkT7TC=? -z4;++<(gb(J52|LLX9>bhu^gF&PoykaF+^6QYZ;K4+!lJ!KmvX7GF`vWqCa0YxAdX| -z>-ygtshMy|bH^8wcPLha!_2FxBl9`cXt7V<1wg5xwrRxIbDvNpTvGc~8$+Z_Mx|-% -zR$MBwm=7C5q)e=afq<_BIyPS&wDz(ZzKe5l_<3Bk(Y;ix^gkJCgLeBG7Y@YMlofx~ -zU*hhpU)mKtV{MVz4W@zWv6cD9VZ)WV5KNeVw!w9gjcZnK_UhOdw_D;v;{smwd1a@1 -zhKsxbVXw^g_YE+Bh*4w!G=QKsga-pC%fS-Seb?hKUrctezYh_bR{ODZH?WvKD)->( -zo<6iz`Nt93Io&;}z<$zsp>)oQ`pcsEe~Z%vr=Qe*hMl}w#v9W3sKkzT-yt!Fc+5|` -zBAAHxM~J$f<94fGEOe>(x+;f#V`8senz_uFcBbVSQRw7-olje@)l~IYeB*+?;Dz{M -z4o)(uoGK4~MEd}Xulkwtt8)gCTRSNGYVas2v+&8IB+Kv9z8fiAr9abdewTel;sUXA -z+X_vlbUk@qT|oI#VX@8U1R*O92}!Nh$Uc=)*CiKCrx&*NE^pe3UpqE?2aFF{?8g@d -z!qO#{J0d0{R=Pgom$*bxRV1jDruT+LYn%*u!Dla#5Fe(RoN%3!e52>Py_0T6iBv4_ -zhQB3V(7&3P@!YLm0i9~=EuL=_G=<-cv68|TU*{02w#pF!7SI_EFEH5%Rkf_tS==GD -zBvK?TP%yR2>xOux*eKI-+J4GU -z!Q~B%7_GNoo*IeK3PZ3j=VTvlqD?TJDZXah>!tZwwSVPh!VHeSW1CpuE9n0MttC`Y -z!|C5ROmoi6FU-yviOUkh3LaByDo~9@ypFJ^6c6Rc6Knh-1Wf1oEipL -zRxCdd-LgcXa+Gv6wy#h89M%{M;T^K+&1`CD;8FveEbcQu`J!V@QDd=Hz=cvNb33Pr -zZ4Mfp4K3}$5-XBQt4&QzSACsXaC`Y4DTn?{%K8loNMOqiQtStFN1>9MiQ5l(Sc`To -zX{RtH(8+mtf~bHOixu8SR;JmY3M1t>A45w`?~{!wHqoKb4EUi@XyCXl_02x85s~lA -zaM{nu#Hyq+`mX!OyNbc@cSr^xqJ_4O@|uan{rX|E&5~ANV`Xk^+je-3!JUelT;XEy -zbwG`2vz{5>S`WAC^-FPDMiW8;+xx_U@{=XCPmAu|L%|Go&YX1e -zdOwVcpZVi&NG0|>+Y5=kevr|yS2fN|_dHW&fXF#AKfR3Ct-Rxq*?N2K!c)cf*w2im -z+x(-VQ2yemqWkFl`b}-@N0=|-Mwi*<9ua-%kW-SEncnGELAN`VaQQ#^-&%68?X)gQ -z@~_M~OHgEadqH~6@>^r5_*mCdTfg9cS~uoV2ZIWxA6~MSSlda@U3;g+!ld&Cpe0HWzwScMPzjOQS -zuNgUuAcQ0|a%;y!@cSlev*O*Xy;N|3&-Wu0qBM0B31VBuc>gc+){?1eOdzE)F(F -zozL=MKb-0@C1%g~D$g!n(`Cr_ef&^-7A$~y5wqVg-{^y=_=XuczuPk>s*>yI$k*Py=Eg?m!w5Uka?E1T -z$rGD8>7HAEGRzwrZ1|&^O5}i<3yCak`kn8LX}o$AkTa8oYPIfV_z=Z8TV#)H&? -z>Ei)f^4CZril8tyIW;4vIj}9sYamAr!5irA>bE~=ul_JFw%2v`13CJB~| -zgFRgrU=&C!F~Z8XpA=7qoNq=Az=KeY0m>!iKEA~!Hr{bSON&riRnc01Y-`DP;T}B! -zCl=dJf53cUp$VSXin$?ztdZ4M(`Pt`!lYOf0LxXOikwY_9vYDGm-b!Q|MBxLX{7&g -zvT!f}lo(7V{sgKH*Clvr`Z`g7MKE`Q>d))(u%VK|Ia!c*^?Y@AD}K&G$O`=69}2nq -z4E57H+P9sO3rs_{AGM|p0ORPew|e8(HULlUHuFPRi!lrLG2DM@#7qzc&qY(v3s3E- -zb*o6zY0qPBFCFH+FcGM@^N7-A+g>>wLpqf(4Ijc1drvexn_Z%A$#t1nsjzAw0Kli! -zSy<1pLeP)M2Xy`M4o(a4TC`S=()^y&(B;vT{$JYmKr+<}wA+Yusp4Xr^1jewHiHw@ -z9RuUw(j;dLjYdU6Lpma%u!Di1cTWUYY#XsCZ2$#Alo1V>*A>vE&1Br-R`B;VU53co -zBtpk9|M?yJH20$RX9DC1L9V^sEv+~07udO~9ey3JM_YZG$+&AQEUd!iQzP_wC1j4* -zTiXJerzVXPzv%{VX?ogp>F?0DcK+hzXOp%I#2PG&ihOV(?_`^^jHwlRoDqQmx^9Q8 -zp2CKHPfJA+@g{a9o_Uz1@*@y+^7M`+++FLv_!&7zLJaS>O9IFWIt66s{T~l3hUY}3 -zC#u78hxVlQEI9}7BY&w<(P{nAM&TUMYwfsIG_kp!V{ujzzG#xjZ_=Ds|LWgZ8oQK| -zZJIZG0UBuyt_#s5FkK1P?4m=9HbRBU`^QmtSRpWgZ0`pmAV7U^2O=x?uKrz3$I({A -z4F_KRj%;#U6P4hoS!YuRCYXQG8idN9to?xXzGR@q-?3{}f*A<-6#e%r5R;3Q7AM*N -zuVl&MO?+(kUs?)j(ilPWWxCIKN_I!KK-yh$dq+kgNzV0BMh^d;$K%?`+7cM~kbjG~W#fBT}QB%DCjJr-RAKh&+BSPfF>ApLw -zkfYyg-(`1>v5|RfT-ba@Ms>M|MI -zVp%Ok(Qmn_FATpI?@v~?DM+gJQ#8PAi!_sMLqfxhjbBr(GY&9btWeQhSFTUmk7)hx -z)5co@9G+iMjA&d_Vf#;Qd5eW-%v6|63!)W!cFP5*w;RXTATjOjlhbAY;&h|fruso; -zTFgr!LF9O)EDqMH_6n9CkgsnoW6ei^2ueOHJnRiSIJa~&kjh-nIfg-^FpG7k4`=2^ -zZcjVNihStd=fpWUGw&eZ`Z*g0G7jHQ;n4g#i8?qq(D@qN11-whn%sUhd -zU%KQLj3VX``5uXYDt7wQ@O3Zt?r#-D~-Rki2 -z4B?Z0l6_c8@z#97MLla}T}71nYoM$(Z*m@GdK!76^2W?&zqKt`&9!&&y-uq-3IM=! -zSZc#F>D%tJQA{`8HSL(MPVEu4M(Wueb8*$p)rmXP5d;tOf5ODw{`FBG8gK;y68CEB -zVQ+e=xASJ977E%v+P5Fi4dWZqu6a3igaL2y)gLdTuyy9xBDJz^j2|{aUk&1Asqs7B -zJg@M@XcNEiKD;h_GH@CjM;(o?$68C>cECk_|I49B#Dw(j84cfJ4?=iN(4eZgW{x!1 -z^kiOZuY^{H%)^O0?u3h-6^UR=-2xXUw(f{%beQ<)`eH25-qu9NJOP6v15 -zxY3zzQfgB-EBL9G5sU-fb_^8fy#k??8)51YH0Du;;ufC`rAa%?($f~K5CSS|rsUnE -zs}~xMU3f*zP?#nK7j-bA86swK*Ugd;L+8ii8EA+n_fN9zS*yfzqc*xgXLfcr>Q^<# -z5#iOAjRadkrNX@KA7yR?ExE-zdCz)zS!hzct9bX;%*5*NN%eb1D7E_7jJ*zu$Qf|* -zAF!O2_yzY6!5uB#h6C&Px&3u^ZAriJdFu|fd7^Z=M>|}9wNB`PEJ1?P_sBPH_BVya -znW&99Y|36sv|jVi5|df+#`J#0s4O#@{_$7UHGQfbwi?+qulf&Nn=Ore7k9^JpGFC}kI3k+t~u)Ea688`##@8~V$yUj1OLqET(LR% -z88laEDE=nXg#z4|c<;KsNm^P?D;o~xZ$^H9N$}UI|{I%|dV+j;S6JCE8-xH~+)*@gx)IcL;G57SxAoCxeT -zU+;d14%UJc+(4tu@fI6;xa3!;k;Dh8Bz6Fa7bop(EP=k_9EdVG9(pI~qdF52kU3b4beb1za*Lqja3W)UN -zZ+^SY=i+Q;ZrVlwVqQ{1Pr_-Hbv%WhLSJ`@lW*M$J_)}(XAU9C2t8L>~>7`QX8ltRdsaPrT=D(-~U_*UYCd7|>kpY^Px6 -zw5*E}@umMne&Xhf>zbLKdPR~P%(H*ba#gSYO;bY@R15@Bu>Xu`!uvJ&Bycfs=OrY9 -z@k`(BZlZGd1xQrREp`gLv$_C;xS#8n7tyL6Ky!4}Vj7b*MsR)lo87T?YCt$j9 -z9>@vFNx_N2lzD!VdJikgnW9}d#(`39Y*R`X0j7zvezv6M*)L~C=OomENq|RUZ}ql2 -zzsXR~e-88aOS`tPV1Xds8BTn#xpe#6NUso4htfGP_Wo^i!GOa{U+c?!{dX`=NpNuz -zex$T1h=9Ku*%p7lljdDX9K2Z6jLcmkQ<7k(Lj%_< -zcn+N8$B~3U*M+Z5?%TMd0msdF=t{fR>J4cJd+N+V9w;fLI`WJ({bV+~FZbQ#=ced( -za_>R;>_S(X4xZr~=3OW26S`wo6MFKbzRoz0k3|hh@TfT%g4oOvuZZI8s?6%bdi)nv -z>S-}nYgI=-%_2$_$D>ggg8~JY4>C^If3Dn5xz5f0l~8BDKmr@?m;WA)=T9&*ZLm!| -z24*zwh0zn3cf8IAd6l==QE$xXK@yy@Z$oOPvaeLtK(+cN&34hh*Z%S?R^FUXTL -zgJQrIJ?d-s-OLfXM{Cl)lFy1SVOm%6$uR0&ESu>-kful`)<9X-9Jg^%-YKL -z->|FfPguJg#pdkXBoKoCAm*_&DSYwnZhog0lJP}gx^VHWXfGf3Mluxiqy7#I95^{j -zb|V+)dQo#4Z>E9|29#aBWGEmyqMYEgz1hbaYTsUQ_&{+o}+1lf{lwAq}+O4m!3XAidKvT;@zjhX=e#=c2Nx1Tl#WH~#mX1Lg -zg3-SR51v?-@b32D#&uSIYm76&KL_zBTr7dDx}iZaI~Z!Ueduh3$3Li|kY1Y<18a3e -zrrdP353|TI6>rL&$fM|XDBM#C^TM(EV -zTn#Tb(pFd)4{0tD*zs!F+Z@`HRNQ%d35^g+)0rHnvwdzO1^P@u?gax6&;TjE41#<& -zy?Xhd(C%)W4L)$SOhA7yGwMPQUy@2Ltk2* -z=WwyoCufyqEhcEeAm&f)k>Eiq;UKX32Sx^nyJpcjXf!$QH<5<>So#YN$L)IhQ- -zicc`S9h+nUYX+$bSFf|$=^t(juOugKa&3WtmE^m(d4pR1d-ofg)%!JlEH-!jDwV@2 -z8|pGQFM{(+PM^!Nhc_8Vqq^5fQOJDzLs&5fB8BMt?iCXJW#)usCzA8;?23+DJ(x -zV0F|4{U-KLOirzS7T?F}r{ky0qflJFWM{0|PE4x%$0!d{7i6VzYK{Ce;+gwrl$%pw -zDF({b&fe|rZvNS;Cd+!6L}>QNs~MmaHdV$5wH8YXbba?_UB`C{x8gR=RKxufEOdOM -zvkechR6B5^*b!Dzo@ML(ptbpc|Dxh#mNW39$oVFSlT@t%S~jK8Pl;4PYYO{vu%?hG -zV~Rf6#88LEzT7Q!VT@v7N~u+8T6crZbaj@3{*)mxZ65D^(DqZ -zo%~o?bK4gSk*#|wYw;gtzJ8S?kba-fIwOn;D@!R01pj(@=J~X>2W}EO!22%#*MLi{ -zzNlt;1PV}a{S0owP{T{>lLG=Ix454BZ36t|hzuW(l+Vuvuk{{|lAXJ_&nF$S+%I6e -zmJ5K9NPOkdMyVBBj-T62R_nt1a6U{eNV5&>t*_9)e43?1IxpdjL*}G-naL6V!nF6| -zHkcbmD;LOC++!Ol8@`zr<66=EdQ@+2(6_m-k))~F3A#JjJFPw}Z9=ceZJNvY~TVf3)soj>NaVZ%bN3rEuJd5E^w$j~;P<*szWqsr3u|`Lt$R%E0Vg -zS69R5VG?OU7fANi^U4!6bb1sA9p;U#7Z}}FMTRiJO+j15cxf-kujPVHte;E|*z2u8 -z=6ZRD?Xwjz$DAptXy(rR>?DQX>_8l3i}1E9g#P3gXtqT>IO1#GA@#vUrsz}u@3UiX -zEVw-j;Im+tvyawGeE9Mq6fmi#9}qegP;t4hJoY#mvv=ujlU{A)ZZweq@c6Prp^muP -zzYCaUdfTW;sYhb1L?fe-qS8Ia`l~KXsr<=JflG8S -z?h6NluD%Pm8dyd_W2e3Fz$;WLxZ8TVP8W)7qm>mIj7wo$5ZFU?A@s{W>8qt!JH?Ta -zK#812_dTDFp;sCIvb)NUSR|C6bcoJ1{zuwyvDc9r^}Kf>8z3M20OHXs3^0%UIgH!q -zhZ-~xG>YHsJXJXD32yozWwd5;0QGWiVidP#4@=ZPxupj&o3pU$jmo#8t!-UKoquW;VyXuZ(^wBz@oK -za6j5FvtxO%i8PRzKv~W{F2LIR-0RBNkd~g%t!zxa@N;5Ks*lhq=d?LUN8O -z%7?CYQY|UI$#Pvc-pf|%3X!GiSSYAPQ|LxTB4*RbdUM$ -z?@SL}vCO3nz1A0{A;^KrRMNkB4CgmdZZb}*FSrL9iGo43XiQz3;`AFnKfDiSX$8Um -z3P2Mq2Ok%3XwG_LSru-(=h6>N%%phoFLGP0UIQB!2#EDzf1XT$ae(gx>l<9QAXyo+ -zwz$?5`5*?9?pl?d`=bfU<^N{^_$nEOAY40?OO8(Sf+FL=aShs;OGWNf9slgA9$Z_W -z7@{=YvmCF*Z-)r|PF#Z*9Zsb>95b5uKLA~3n%f>mTYHv;Nvx?4WKNTtX1OQ>m78$W -z4RT@q3Kb-qL(n~M3?177pAs*et -z>F$m3@pUjaREtp43rYu7r@>a&0&}`YR!8c2_ZF>mzx2gm4IFoye<8UwjnFXt5FhQ% -z++F-&qF1FGyucpbyuCm19oe+qYV+@an=zyVB0CO0Es^ocN)v%TBq{q8gxFHlw{xMD -zi0L}Bz`|D0(`ALUrO6>>#>Y6BUZeLUBfj;odP_@I+n#i{wo_nSH5aqa -z+UI%p{%Lzy&abs*v>)Egt*>^{l*L9NiG0EmdaGY;)G}0*f-UYW*7}c_|KjH3wMRwu -z_DIQ%l@WH%oC8k-l(@iL6^J+uOtKva<$}L?BpQp)ZxRmESB9s? -zWXGvbFqv`oR^z)L4wK&N-W=h@m!=c$N$9-Nh}nPzzEkaXF*}mx+swKmR2FJ^7h*!k -zkO`4ve*yq;JKG~&>f5&3+~Tc#DGD@_R@yP9W2rpOCP5CV%Cm|4LjIn0eZLc`m06HIhx{e_>&q+SAHaQS -z{31I~cKdShiL_b -z?4-s{3>UkU#{{vEGh>SUQDA{P8_Y7OVVxLh)@DDN?0}-U1UTR1**^eT<9RoA5YgPe -zf -z8MUX!A~!vPI&$i|y=yDR=AvYq6ZW&EF85dDivt>#pToIQQ^7#XdN)#=_L>(H;`b3E@R9>u;&62aTI3RC}6(x -zfd}89xmI$OLVEY?;59}LnYNOduzY$Us4ZB$Nf6#>8Y~EHpSW9gxQ*#8Dq1EQ!;Xa_ -z1qr&OSv*8fl-1yndNl}Nj^&>E##e;k8M0Z$i*j(`7T~P?DEF -zr93Z?$8Tb1zFgrn@@^;X3jnqW_*_4K7yXFJgaYX4T~d&ME@g39Kg=CAf3jB>ZnowQ -zih%s_yx%<9EgywGns1GiC9#Etx8@hLX25UvXZKZt8nCNU*wPX$a^ANLWFa?AZw4F< -z=Bd5c;sEALxAQgrCA;fo9pF10?3WMuWg<(eB5?@`Agx(sY)CIE?zxu}yJ$X8J!E%7 -zhyZa-_So<^iCj?uvig{ILMB7)u2XQEw70Tj!aR~#Z*AJ{L72Z-zT_l7CR8%0XciqH -zZ7iP?ah>)A_mP( -z;weEx#T-=M5vA?xJeuwU@v9eq>scVZTrqtl!%N3cosuJ4?3X4C^mg+%<+QyF}Db$e>C# -z9>b453Uleaqwc_vEumFrQXe#}r5^Fz@P6B!kFFwad#O`es4zK=C;4p1wwHWASSUe6 -zd6E=p$kzH#`tEU)%kQ%E`d{#b9A(7{gs0o5|MU|U{s_=tG~|FTJt`T)#(9OyzopbO -zz)zOFMX4+3RO!b^fbrSf)&1t8JACjN@BV`FY0;uom_H(yGMcDkX+U1*mqD`|{or2% -z+@Nk<@fhQ__Ts&((o*jjn3MWt;pZDoW|LoC3VK@fhac=jE)O7QS_7!|>wkzjCB4qw -zk8EjTYXzMTCe>ZMQ(@zTjlxrh$4^_;tU={vvww883w`3YqhvuZqMzie$GoDwPZO;>XYPRM -z=F(}iGJB*(W#cV9GsID!%%4=^=k#xK-m`_hMQ0v0ySAF#^sw!~j?nugm{=UU(@wz^ -zcI-h!-sew`vp5r(NLqq#UBmz>76ydmx=UmKkTAVkEw6jXSt{9H_Bg@;Rm;0g? -zb@e(Fl-0`WT_bdix{msy>lZ`A355$Py|IXz>_+On{yjDk863%!eARc^%HP|AYvh4%~KCK^t=>Gh&c(%9LY2-`bUwT -zdi1B$wPR$amUTK@*5=qK+R{4yu7x>TJfZKOi1a2)b@G_ls;^t%HsCI)XVJKR&fF5$ -zHp2)NH{#**A*JS1XnC;^*kIE{*t`ysLjf-Riz^*$NK5*=%vG>}6zFw3jdiu3iL^ji -z3un<=O9I9GtsPDWVLSW*NU9lQyYaK(Y0im;tL0Slv>tb9wN8#MA!910e(9{W!04c9?2=*u)fiP?A!DpNBhhQ`NO6XAtCVj -zY`|1ex)nv)2Fc-BfuBJK9q5*mNe^ePZ*@I_`xKUFx -zxMUUnT8Hdx2TM(zj;jeKjt04Hd%XcSsTS-NU^hTE1P^pkMM$A4;S@*aA6{JH4-6Jb -z5>X-$*m9m -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 -zM*D8-lwaz=@_(e0&ALjn#5y -zouV*9Z8)&4``Z9F<&UQUdVE?&$xtH4f1@_?xY>%nO~uyQ-l;O+tV@mQNtF-HiRyHp -zmzVxpvlo#tx2|#SQ~rJt+O3V5Shu$|V+{DxMn}Dz!*-n`^ypoN8LTD!jB0Yz -z)2w4#P;Q&X%&T3>73OK@tRVNEeyDZaPiQ=LY0>%}cdi0IQs9jCSBEoPodxcv9uwr- -zO@re*YQ&t2BA*GwW)`I6FA1U0V=BM@zzGl&b0}>IP9XjnLnbWbV->5HnPA}-QqA{H -zdPibu*PJu`_m^qteC3BMMr@3?5gpdFb(cnOMF{2=J|9iy5G&fVKqffdaTGw5+C8IJ -zEnmweBihHTa=v}Aq{ZPda*Bc+5VdXA_a>zmYmUbno`Qm?&9k&dYUW8W9lfG_tv<8f6>QIRbT6fwFEPHg9P0i#IXo;4%pM;QI{ -zjj9j!0t!!cRBdyv1%IY_s1BUAUPda(&mc#aUp@viJ8=XIrYWVg5B5KRBeLs_Mobr& -zw{*0Wrvh*Lt>8a`4#a>>W-vWizFR~9s@@fqC&*51i$CQTn55(=N@O>)oFm{H7qkS!>*x>+ -zPuqFqP~EYAv+Y3vd^vfae0K1;2^UxeA3)FB#BeGY7f@HK%^y3Ift)^SIYQ|s1;^%M -z6WLik5(=sm>N0b&c2qBjjC%$I@C(K(nNZ5fK0xOoA-4T;LzqIs7pQTjx0QIj-8eXE -zzkBwg*Nfqm(9VCTy&T>=tl22M4BLinITyQYiyD~vF3WoVEo8678xBxs%C6N|A}A$s -zh#>s_#kSt^LDhKa@UUyo5DQ*MK7F4XgkkREr+FmpqZuzGMtImu?f$hVMd^NnDnQk` -zvqR{5Pf*x|_OvRz=8e;Z(Ye)nRb4Tenqia9f8n{WVa!C^8NzYS~p&E?}YIV2fC#|wI_5h^`vtV~v<5rUK_qegfizz_piaJzwK -z{pK5i#vgIpwptf-!Q}IegO=t-#KDL0@Q5L*Al?5+izNFp`jXd>8O|q-{|$F$#_bc2 -zO}#1ptGa!eLiAv7G@MUop0}08 -zqft`eL8qt}j!vi!Xs!|#o@|(HTNZ?Zrm1T}%tCg+US(#DPxp&$xTQ@Q(eYGk;`;I+ -zCj@HH&+RKb@3=IzIdeDmRO&727SW?K5<|&zjqGZdtEo|U>W>NT&NF$*AQ=ob$4?P0 -zSMEQ1vrq?ljY^C2zV`1+`6-Re-~3=L%rX2Ki=K~OI}SDn -z&|SBxBL294v$k3GRRI9nyPvQqA_P$SHW#58vwinPbJw1$Wh9bcCA1&!Ik?}?Je+jm -zKW8fzmF{4G(TPps`G2oIu?{i7kTst>+I#|he^kW0F+Cj8?bsm-`P8lQn4gLSH)R{6 -z_$&C1|NDmmqH9t5%9e$3|AAR|D#L-_V_+kNjgrAO3zr--d$L1f*@{RhbKUcZ#pJ#E -zH{_LpB;{BY4Y=UqhYIv}O}f$Ve%B@1(34G+t0C<7G_?V>88|XuqNK; -zf7iwWd_mL4*%d;ik4bbX7BfoJnvKwGVSN*r?)vMcRvz&EjmkI;YCtrf8&BXoOz%{X -z90-D$7ht0>iQ`WE9k3~e_{0)!*=DUUuTqEV-G&~T -z+PUs-IabC_H7tn%S+<=D=AIroV(!Pec8QGol`YiR)2Po|J3 -z*}#c>y!TISk9L$$KQq@aW4WTBNk6oA)EuPRNgNbKG|HXBiV3uf_d}4&smd6MCDi5( -zQgDwf369W%ONPTNldGyHA_C6Yr%Ci0=pY__n7swRl?umJ=GRW@N(A<^bJk6d!G}0$ -z{Jl!g)uwc&EVTRWD<&Hnysw@wnUq6v(@!m}XWU4Cb~!{ub{e~n$F8of08Ok2;^Dj< -zW2C=;du&D|=%s3(@L!A{&m8Y1&HynL%)Q+6&e{ij4E~^*S#cf|ULBv95N6qdBZY6GthW$%7Tl -zVI?;}_&lM$GN*orXsz8EBr9~}6Q2)+LGT?Owqj-Gh5T^r5{|fh5C=GD4GfdV5^0oi -zEvqFV^1e3I9{m?0=e6>+AaW_xfNB%l0SXGXKhQ-KK_Z6lw~y6z21gnKSod{R#*oGY}t&(<~f7H{?(Hx1yXX?zqRKR>CLUk8E&Nn9Q?uT+loR< -zy5e8#Rqh#5N#?vT;hmr6X6vO&l^q?BfrBDtuE*FKTytyP$ntcUzKSH&YT6301|w4Q -zO@~sYUMqW^47Z1@qWFkwSzRvD{1Uj~Q&0?N7t@#=L=LGcim%~hIm%Bw-7OE|$6td$&-NsqaY3P3sd`DB0=J -z`qSR+@ljk_%?KfXcrR}J;eVKUD1byzSl7YP61xCL8+v+e?H5!bd8XS`Xd7$|;yYUi -z|7Ub;BFcdiJ -zYRQy`b9$Dwz6$7Q@fYqKX8Z9;pNDD`no@UYHUAMDlUY?vs0nvNJDjTQFgwwsJFNsOilz5^{K%4d -z87bzCaG#pP$m3 -zUtJe{kksF_U^arAG{9RJ@q^TN9MQ(gRvkLw?BaN@*A{#sX6)c>8VfBQ>d11Hi${;0 -zy|%!j$jplJHA2?e;@`tlSdvR6v#pUx*6=|{WQbCTdZGp;vnV@}n|J -z|ECE5$zpZR$T%cGLh_o^zoOzB^|0i*g_CxER!mdO%)BwxS4OX?2_E+6#4bp{lSB&b -zu^{$5-N-vd*6X*^0{NShIz=b|Q77PGYC!2D?&FNX(Hn{&wAyeB5BXx!`xcB;cFX8$ -zY*8@?=nV)yPYzGbIQ2R}`~AcRBeMGVU&zvjXMi~2{GuI0!d`hrY4LTP{NIX~*;5MzdK}%Azw7_0gC!wGZjr)r&UHLajQYhanmrtUgq~a~Q -z4%?s9R{>AfH_K3)njJ;s-kcQhtVdZcA#fTxJ7&6 -zuhI~&a};@5NPv@eDtE9eZP0B$uH*)&SeBWzClIRsaDNed9sCl*2e$Nw6&fL|;<5y@ -z_iSPY<{ltYI7hqXWv(c6eLGhZ;W`5O)Vsp>Otys-S`4OfI{5vOg8?Ogwn;8rP9cBx -z)g$DoZ?LyMS4fl`Eiz^5jL$2$UR1Z@)wd`o6u@Q2StuOHRJ;#Ahf_Jbe(V%Eta^H( -z+)jC-u*v_?HU3P|)v_XsqI`u`4l1WDVS*!?zTnhf5DwZcW7M5JN~GZ5M`_Q5fx5`! -zw=LOW#mfJ#6*Lyzp<7y9QN@gqP9taEzx?r^GlA7`+N@=SF5=Es{KX>|rnAfDa3539 -zGf%0)WdRS^HVIpv@V_f|N>ieL{zzl8ca1Qw_dwSH@qRuWL{E{ftz$+Z2L+~v%}w-w -z?IgXRm3sB3_pocptzlaILDjZ9nCyJA+1OYv{_)38rRg-c6Nh4vb6ko(*C9X}}r?WQQ9WA@~92H}j4&od1Ca6*mE&u#Ac>Bfx-~ -z6TZf+cMFtH>DQ=;fHFU_Sx6>*DM`!Usl^smOHhj=;+cM`MD)jqvq4C2ViOF(W53@~ -zw(uw`0CJbFsPDU+jExB$(kY0T_2}H6 -zG(J?%`XDAG5hJf8344>_(73~Q(xh;(pq#*(dBBG8t%hNAZeIUl7S($F+Xp1DN5&}F4%rof3PK})8)=e@#8{<= -zGP`h;6ZSmt!`-sltDl-`0`!zsr=N^xsh01Lf?WgTBQSb4j?Pcbt<+1-*$$8^;t0}o -zcmCLIVe#STPqzJUagr3nmr6T4?DqGrY`=DIc=Y{buA;QD=GYc(^BcMw^=@sY{X{+& -z&0h;uSv>IKjMBq)ZKGS}2emHc3|Cr5S|<_QwgqAyBK2k7(!Y+_*4v~yimfh++$p?! -zQVK-%GF(Vkb~BpA55BU~*Ty4->W2n2&mo~=7W$X@(}blY92#j;6O3*gnK;U(GrN3t -zVhqkM@v+4drD3Dz$FWNB{84hK?qzg*TQXmF!2{x~{8MaIzk25ylgqO0f)RMkk@pxi -zYt*Sf$^3DvGYKb<&ULIP>p%yxEDn<;z?@Ai<$a -z6$ZJB9_92Fv$ -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 -z7^1*Ure?v*><$-%z~(Y-2+JQAfBhNEF?7R4h -z#O~~86M67uco>jmI2BnzRbGuXSuZks8WH1eko~~)CzcEmzx=9Jc#(vBuAM-4aX3FU&WS)3rv -zcj_9_Fq1UxY -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 -z86e9SJfr<`|?{F?G9l2LBcnYRmLz -zwO0`Kpt#@2>q#01l1Y992WVInqP-X>{gRhlbaZnc4L&Jvs*Z|Mf?5F^(|=vjg0!KE -z78g8wPb0UyGD8GZs7BDhK)mM6UkP7#ulDh3;iC&XU*m~Jv6{B@^Nh`^p#E&Beet~c -zvc|s}1><@1;3fSsC6Ke=RcqO_q2WQX1u?-I|3_XN9p^(I)Rlz+!2tlJ>)puquZ$g2!A2A_c1VhV;~I{G1; -zMcRr5|B{Rq1kL*h+XLQ-a56i+;BraYC@h+LzwSk=JLh{}1nFu0H(B0dFzqf6NrU+tuV^H18eiwX(^*Pf4_R}wd3`uC9 -z_4Ri1oe=TY=ge5TI&!(b#9vC`%OzlG8IXBc$@JZprBtR+wlz_x3K4gX^#ttvWcyW| -zka(d1cGa@0`&(#}r;va3jtrkwiNZefYZzD#lw_z4l(c|mLCF$Ro93jS^fQegSnI&DjU=d5CL^}NtAH0!^-7pQp#E9iw3s)5JvsK^UvH1#{qlQ8CG`S5Lqdz14 -zceY1GxY}OeG@c_;Q&1@+tXIhl`YzUI_+qh*ad5DOjguC;^! -z*WV(RSca0?p8qLay3fYfNZ2y)JSXYAXQEiaGyGDb|L^)hyPHJop17jV{@>GL-1FNk -zsnOU;b6Q6O?fEF7h{=W#x*R!vPX|txObM^?=S#G9q(KC8rFqBv>!W)?=iNixmSRDA!T}7R -zj$ax34Ra(VaOhB0)T9BOST2S}1Uh&d_Oq(R#{k$`OX(;q3b1ATnv*$0k^rju%qS$4 -z+D@IS#!mfg-E*9nqh$sDs(ykk61A-8mDK#V4<`VxoED2)MfWg}^Lg3piSQ@VnMB4j -zsRf)NzGjKS_AyG+4KE(@*|>oaw+zv)Wi|jTK+lH|^?a_5hUsl@L6z?_dF;kAf>&8cc1&>CuJQ1g)_x3g|fx30(%B9%j(XK^M7 -zQ96uYV~dI&Z)!Q^l**!{pj?ScW*_M7cU`EhqqCQesibOADT(2?pqFmB<#cFNP`G?- -z)Lbf_VyV_+Gus}<7u$bxWQI(S*-l0t(whGGf!~DAqyGN5Ikbjc-dZv4)_O3%5XGH$ -z@Ll|;O7&g!QvMx5_?TBd6Hnr%q>+Pkom5e8O$6LDR)~wOBEr#7e&FfA(*@mITy4>g -z(Yyaogu2qU3^iKoB;ThRiHEI6O9iB|MWd;9tvEEV6WY?ZsY0WZnBN+V!chW@^~M)6 -zKKgc%*z}Ah;FfuOZo@A`zDhFDZFUDBWJScp*9P|nxcwrx-9+GP`I;4*ph(qNK8IPT -zp5<(dNgI-K%vQmL^k;uoGaCv(0teZvUz+m!_?vrM4eB)^IC-%Yh!za~)@dhdp;$Y= -zz3-9wi9NN6y7GgKHKqozo{Ml&V{(XIP^8?IoCHH9{aAVNjX)70IwR#6Ni$2g%NeOvC0)c -zcCmYDW*fmMY_c>8$%g#qBbXXI#^_|?6D)q$ziCT7OU_(~fpxWcqK}j=Y2B}u{XdIj -zTG(QJ<#r;5}zj?7#L*b2;PMoAx3Z`ZNq -zde@N9_F3fn5%ha`0y@6-R)45SawWA9brSq)lD@*5Df#^$C}S-h41Wi?q7@O2<%7;7 -z_g?0iJIkX^b_evRhvrf-rDk29oAI$H%nQ}B`Z7SgT3urXl@{isSZGfUvLi5(u@@9& -zYb+H~BeMnyD447ec=x4)FiXuHBH-`EgR;&K)tZ&~fGkWx@;N6{$1&09R<2>A8uuVfByZiEBZdwMPX6cqwN0Ss~&|Ul6 -z70HL+)v&|+Ym>0OsrP#I?`5p#x*6;{{i{*JIP?#AC`?wk>ts>@62>U{!?*m|5vaUTsclc%Z$V)KAU4vg69H -zeo^^s&=qyNxz85N--th0Tw`ZMvs7H5tifMeCeVoPb|Qq>bZ3Q^ZdO!`ZtJA3ChgID8Zj80AYF0)q->6V+hGAq -z%g~5~R!${r4|X5LTDxdSIAghnX5BRk`(cbjpSYwM7wMGD1065Q -zKAunrp!nd$smc(e(8qd+UpVt0a@c3rN2?=8D%5T$VXK}TrXKs)z%jpP1)=agYnG;( -zI&SlEBV|Hod~C&Vb(1+Vm3XGtE)n}3#Ywj!(PQB(vRt^3R2J_M9FQtFW1BY0|47kP -zEL+;=$#)?jh+DVHeN)+Z_isvf9v~wHGH)Iw7utWol_ELMl^&^Z0voP-`OhC;K?6p) -zQA!64KsH|dbLY-AR0o82bYOUw)RZc?IlaEk7t0H$I~$vW<2YsUR+`VZfdFVG_!=-r -zwNlNxDU`~x@D&w^ad0pc1a?eyVYvU73SNOc0SI#qcGkNl0zmVs%GH^5P}|3AgC*f( -zPT&Bp2kRa+4oVnIn4X;e2>^Bu{bTC;@nv~Nq>fNu2H9WFG3B~OO~JPH -zD?a$Qc_jS;yQ4npNVl7hNF3=U1!5($TRqQIza93PFUR&-Pxt*VuM@$ -z(sG$Ur5zrJEc+Odh7bS-((H{v3>_~gy0hz@=i5i1{c1kcZ6U6?H2(vkYsXo{D4*^U -znYdlR3^V`&*a|U>ota{VeJr-9d`ONNyz6(#E*v|jwAY5Rigk54#Mbt$(MMK*=D1ny -z@@^|AvksB8)}ohJQFaUqDAr23>J%?Kd+k0U2^Eb?GByBamo# -z4ZG7sOS3GM6L_uJQeG#rBt!gTx%b4!>pLGaJI=yeU^DW|f0(2}^|{alI`>)wqd6*F -zMLp>gxZswBZfQ{UP74D%3k(7bSV1}LEy52GHLYq9_~3MNsFJ{llQZ@Ey%=z^OPj6R -z`Ua3)A6p{DC&a6M%Ju$YQS+OwuHGlggRldFAi3XB5nX}xcL><9q&~9QRL~_t6+%r# -z;`4E_h4M?N7;-XI)xtSifdf`~KC9^tImFP_)%?fm{BEth63!Ag3#CuR>IJH= -z?44Ca>qX@HY_AcY{@c(gs9Gb%-4{2TmBtR>CH*7nC`?=HCPo;&JMM~t;Z-4kB8CH| -zQx_^pYgYYH_FXSHdyG@Z7xcLD{fCaxbXi{vFBfBxO1A3Kx5r>SRW(5cUV_ufT##;s -zQIL8Nu*ST7mF05O`Zs2hE4`!1k|CDjx@#i7)zXS^;=|om -zSm1GN?6=T!RBM_PY3l7i3i(%oIvq~=RardqYJsg*8b@aIsPFnx2%(-6isnhM6k -z_?w&R&9Z3uk_Ook%fsQ!Y_v=B+jC-_QK|QMpB490GOM(vdU9hl5&teW!wqf`yg`nI -z^5qX=!w`z0y}lvez -z*Ihqo^N-K<%uX>P8_eH8)V_@oW)8#6VQC4hLCTw|v*OMFU1S$9K{KoE$d%xp5n8&8 -zNUKt&bR}2vX9SHe@gtY*-!grV9vTZ@H^WSm!)Slsva|LBvGs>5r&sHJcATkq|Am4o!OP{)*yj|yrx%0z+k~f)f>Wi@ -zmS4wuj707#PKFXzYfN%Kc$pexU7od0;(g=fPtk|1B2K_U5DH+qIp%)G4npQmuFn^pU(OhmA4b?l9qqp60;^O1_xf* -z_@74bt)?#?w|N(M7a1)5Qbd5XurcOIlasK&2fUz$xpwLgfmkGl8yO~nG%|q1m3)S`dY~^sVW16>2d5)5HZvzdSH;k*CBx -z`Yq81TI{1!mt6}t)~ELK|JMSz(y!TNX)8Ayg)P&$(w~|A*2Zc+EFf_duy!+IxJe?+ -zl{#hc#B!Oq5#em&7WuZEcjRut&_qm)uql)#or3Fo|1y_kxj8h9#H$19fwJ4w%3^D+ -z4>|5nay}X0k-S0P_3OUnQw6DNT&Mn=*JX1esEi)k5M*U;z;cC59yES!8mDxd{n`4* -zG-q#vHwKw=mW5^ -zUz#XpaPVin(ak|G;{#p}0Y7=N)YKH0)43;UP^L|GcG;YN9}7aLbaDP<(^p3jMCM0E -zMq-`m@_w;mdjA6rz}x4s&y960_Rmlo!%Jmhj+3rEn5?Yan$n`A0rmc)dq&q@Z{}al -zd>M*;zzKprU2qhv-``)MAw{yLW2R_;puydXgR@V6jlXI?bQ_)0Jv*7B??wFnKu5NhU3b -zqP%D$xycagY1!5@aoJGo&z%EhxneVxrb*boU#RD~%>g}#g#Kt+UVbj&sT9vuQYWlB -zYLv0ak7P+Hv`A?B!zrcn4YSZjZDpr!Tl?s}R47(=)GzbX{JW76whN1$xKfv=F}WH(b#&MAb` -za5%o|kk#;&F#w%qSq~g2C)bP*X@l6)F%M!2wg|m(&ssQOBFxHr*Qe)G;tHrw%E}t- -zDDKx!c^Z48vxkYgYJnTDl7=)>7M3G&WflqOO6G{1iITr%NR6+TTqdB&jT%0|AeKGt -z7Sv2H^Wpi9C3q`}G4mpm@;clMZ(n<3dvyJnc&mLIZ|L-`cW!xo5`1BIds&CXY-L+k -zn)S$lSI;R2;Iy1o<7oR%xe4wj^1UJY^_0hcaFh3!hjg8S8}w2`x+h$;LP9Ut+tvy- -z3Xzm8?65^J{`LL3T^OHde|7&szO`jARmREN!Vrk35&1UDaCL~p!KgpQENh(tUBzO^ -zhU$J(^QmnV%*wi|k$)KvT%Xs}%u!e@oWzs@CLX`<6hbAYi<;P<4{2Ghy((sXps)Wq -zUOMekz2{J0BtPIf3^MYZf7laxXqPO`>f?R1EjL!)%fJ>E54iL7?%<)GcAGamThFma -zDgSkRWg83YbGz9cQX}d@NnFGiSfxAf+Ej={de+v?+j4i|lb!3n8@6tY9K`P;Gf7}lQ}cscV5 -zM+F7Te4v6qzl4tuEAOK=v^>wcy!ga@+coaYik~z;c=;7dlDs<2TmG7J0pn*IxZW{* -za?O0Vbsh+&FZLvDGT+*T*&fxTd~d?FaR!)gJe~DST7#g@zCwTpu~|>B4NwATK<)~! -zAxn8Vk5)?&r619Z!L6}ItFfH7i6koUJj8@rH<;CVl!nKiaO@e5>+V_$vqpdN+jCNT -z&A3b~JGKs;yG!Yhox7e7tVyMtV^8h!37~wz$LWF2wTef#=eqsO0^x;{D-0br0+w-}LlzE^%28T&(q|7tU?fQO<6 -zzqLFU9}6f8AGlxfGjYu+dy-pSHr>39BbAfQN?CL-W%R;yZ)Lf6#?g_efXZR%kW_hl -zTRc_BEBsg_-I76F_%K3g=N#F{==%qkT7$x0{y&8iXQR1krhMHTIaW6+Lu&Zth^-zi -z$DK0OM-8ro3?Eend~#_ZR4Qlo_A&A1KHc-q?8gT?&rs_OjC))wC9IX|>q>wAQ~_Ef)OMcs0z^J_Rv -zh`2Y8YoWCpDfMeriD(*qv;7i5_vX@~w{LElvIAX^4`>1A-6w(EN}E@JyUkPWQiY?= -zHLer;yk}b{nO&~<|9WptlZ9+j_E)Zz6Xa9hy*_+-EkI3*st*pPR$cYg -zi{eIx8a~r}W@=9-;mwWa0%l$nb&f;F6r2kVQm(`9l9iAmL%pp}2@frokbq=0 -zOj@=chqB4v61~s7bv-uFBU>-S8#CS9sK6Ab_H%5u%C>zC+%gg2fq@e?K*nZ*_3&`+ -z|IQ>q9e1fGsDx$fr}uu?X?!dS%9e4f>me*ark?LN(8~@pCs4Oz=YFGO|2PX|ewI`! -zRg~f(RZ?mK0I<`k=B&CRkzS{RU>LIk?6oth+@SvAdCd7n^W#?&&B>0+ib_RYHPZDV3d`hp59@>-QQZ#_~hW7jZ1raKliJeu9;yQ+Pr@>N^J9nH0V;A%Ui*FST8~|sE>r6Oz+ZmT4YahX?wsiE+x^OIweqvJenivW+n}FiFVtx)6DAo~>DBLPwRr*kGaPAq -zti0Ln`zM9S*+*8qp_Z$1+;961ZB*;xOX{s~ -zfSju+m@z#~-lF!em_g#5$EL%SqjbUP0lk9MOX1g#cx35ZG!jP*r?7yqPbvqQiVvu` -z>Ua|?w!1kRr@Q9%DD8_6gRf;reG=^wpbo@y_fmPsLPUH?F+FepCHH4e7-)G+NS9Tq -zKV#Cf{MSIvvJ~?2QEz)tRki?9G#s^GE+EV;654MRM)Pe=q|2Byg^4uPDVnp-PiS{6&UPgb- -zs0h-#8b0)05P_IHXSnE3g%dCr?z>*Z@4v4oB`4nQqxEvA%D-JC>%B*rl3-l2Lg!SC -zIm)J;tEkLg6h^Fj34vB92;B8qYL)=OXN!n)w`+CnC|D2w_@w+H$p0IDoA72&qhJjaY%m=aX_s7e_u} -z6Z)arDp+w40k@zM3IStljyqF1;sPwqTR^l#Zm_Xhy~Vj&D=2fz5j#uO`^DXF*B&XY -zEpd=*-DZcA`((!}12&@10|tRtj?$W8)Waz^y4^^4tA?J>XY32sfiz(_I=y%#`jBoK -zB3W&*gvR~7i*jg>t{@!P;USKktmGWq{@eGzDWu>c4`!~T8SzBi`>F3j<*dmMcB&Fk*4AfihSsO -ztAkjg?m12zZM#L|uj}=saaKpuQn)i>w;lHxWt){6j -z_A6^UzI@T&5`{BifDd`B&8kbFKofn+=|M^HHnA4~-lUCA*C>6x=t_q))2_CBtj<4t -zH(hm8HqTM~rAHLq>_*g&*jG!76)XjjUb9_pc0a8d>C=Zuyk};YC2L+k4$_JxLRCGF -z_Z{AAxIM~9K7~6IRM=)ndc9u~iNp;2mJsI^*iVoCG9oENRXQk$?RkCGwz<5P1W3jr -zgo*B~{-Z@rk{{zT?xp6A)@&yP{Jx5Oj7$(Fl3hFn{OToVm$ze!1zJ690-hUuhNu4J -z8cZZrBK#844@Dqa>JoQhZ8x4sre9R%Tpf6PT-e@f2UU8(Bs(S~Z+&#$x2i$Ui>4;z -z0l_*UTp3W=KD5pYPUNOTSs~)eHmybM#LWC?Q$po1fFBc%=yh6^I~H!*;)TRW54t@rQQ10;ai>9}RJnKvR- -zh0a7UTqI30izPRWhe#j9stf?efRQ4eRuVxOMeR|R{UAq3`Z>Nrf#tHJkiVtNBDw~@ -zt#D6??ykGJn0=k7nAxlpQltS>`S32gk9%;-YojBBB&HblKaXSL28Sj{)35N%zmdM` -zMB!ar;j_g!V#E^V+$LD;B?afHjxFC})g#FeFd*?s;AGjzF0zIKRovFKBKa!}FyV^A -zjSl!Tej=^uLRp)%4MH{t#2 -zg0}smqI!bG9_jXq@TPkF-*HLd7agH1`kK2P9%3HB8O?yu5*!cudSV?bKD#x{l((A1 -z5*$OSFr`oWi#j^?-kTFJ^nDfm%qs05ccW^)Z)yt-;7VorORdb1+ug<~r^lg}W`H~y -z)c@3Nj&*dj^mk`D^Z?mFW9x<7Ro2G51%qOv&*01ii2ywIt%jR7L%AXkCM5pKwu{PX -zPBp&PyM7wIB*&EaeFtPk86I_;XhW1D%2$1z@qktZNcg1Y)mzy8&Gz+c>J1^`aLxX{ -z?~BP|uJACL9&6P~V>_tC8+;UW2H{tEEJwVK;l*e!sNBQ5M~!X+HF3J0iv^ek9k?N$q9yx6cJ%4%6tMXnNRzkNQ)xO@fp7ktmr@4ay>@q4Xbu_=q<<>T3 -z{~DT0$%?I&`8Yg7e#}O4u7Gf~2LsH^sxX+3`FeMn?iDG5AI{ONrki6Sv??&~+l{P6 -zL~S6m0%{e=fVzC6C+kKTZEbHQ^4rr&D#&^h1{;eiKu*{4o?oW~=|VQoxA+P;r8 -zCD1(oIKThiX!y3H2`gfxK(~qn;9K_dQoFf7=US*L5mKRgj&3BCPP5d1k4$Iwrd_Y! -z-wDtREvU^h`>_-JNEo>iEC+HZJ)my4Pe59a%#w~vo!ewa9*asAeb({7lY3@d8x8^5 -zA}QwmVpl?_PK9}$;h;aVdagKhZ90nOFM9+90w&wE>8piFXDh{T%ZH3%Sac|$PhRq6 -z7*`$eE7X$`=pHj^m8LiMU1U`4|HCzyT|*bhG_O4<=aaa6vb9$O;k|^+f&4oRI1Tf0 -z(_6SJKlTCT1fv6A@VpAm;RDA&LD_aNY-Lf=wmilcT#J* -zP&4$g90JwXreJ+HghS!KFBpH|Z0J1}SDUWNiI$FaS*Lw@koM>GIL=)7ra2x2L_+ -z(6~}{8ApJK@+~p+RMU@gMQq*{k^Th(!m!B+wa_Ky -z6@?u#OGaOSf`{w&O0b&p=5_Ukiq5>~kRgM`L*{nFaD%X&3h -z?}W-S-_`HiUzHAcRm!B2sf$Mm9N)!I?;9*(!xRbJ<`#!^5vxpL;v*<-ORbRT%$Vj%sb -zw`P*>_|L$>!$;2RY0YGW%0|MAGg#qo>en(+*4gcXZ&W~M6J?vqbB+zsm>W(@1!&n} -z2~#}Uu!a05sHb^R(scfp7QlG8J3C|oSphG+=|NdfK1p&sj%gma@M#i>Qxm($dn9_c -z==9dtbe2lr4QO}iCJi@Zc4RPt(gMP0TNah-#N4Z(o!G&5zL`#Wn21a43TZlVSG~Hu -z#Ktz5Gvybgw`6qvagb~WI&n~pu13+ZAo1e8%i$DhmfVUZv5V-JtdD+*_%^oWAssG= -zixbi%e`FDEuG7^n?Di!?*2pEA+;5|ncxK6i|81;@6`|k)ez{o(foh++I26*reC5{*>kw>rSZ$ye>~nXCNU!e~0#~2Zy1r -zGgI{+A@Q{{JjQ81MJG0djV@1JGg{4^!2ReS!W0!y!b -zZhad@{dlD5+YCM-SQ_%@s{^_ORmTG3LzX@ZGrupd=1Q8Y6Rz@{(kJ`G$xmB|($Di! -zVeQZ~;1Ry6mi^_u*{Jn*B!rD8h+gkXuJ3)ok}>s;b1ETC0GC71`)Z8S**I3ou5Nn|WTkHuWvSqy$y$3u&4w -zZ_3sst$H$s&OLGr7 -zQ>AWZE=Y)e1{%?TdHd8%XM=)4VsS0|RQ$=qmlc6YWRlY}Mx`VtoXWyM0JsD&qPJmj -zx)o&Qh&ns(0!3~KqVaB#bq+||Jbr=zYQ$$Fbs&Fb9}DKYkb8`m+l?&H7`hD`WPidlKQ5R53U>rnu17fSj)IS(S#;siGSvCOc56UN8X8bW6jX{x#5b&!EMPo9t+w(gNFxtcCMif*oCg5?3=e6EN{;e}M -zh2Ac8!RGWG>xiUvga7~&;l&h61<%*!MjjOpTh;{IS!5WnE^badz|)_v&FsFDY^1n< -z?=Y&Z40H}#9{v6lxrm5-RO3sG1`O&l`7R1$_UOR{;K@N?_qWzMpL4RRxaC&P8&2-_ -zilbSyf^EDd`k9>~UneL50HkwCmfhH0ShExbyjpAn!Aa|9H&Z1MgDr-@o;uERArsT< -zQ;!A&I>F}zE~%y9@dY!rr_STj2jf14i= -z4?4d?(~a1M#jIpc&H`Om^ZC>a_Uji2EuWB|^?2)q8u}~UJ!6qI?+2EPTT7qbO6%D5 -z|3`b-B0fRBAKkh4n#s^1!a5kO#|{hLy_El=1sRDdS5J66xrKWJCa$enH%03+l?W-< -z?pcQ`p)#m98${5D0{Rypiv+h>WErr`icsXhZOcN%rt>8WlLhZLy*We{PyiI{2f8`M -z`0;!?zGV>%Y%xG2i@qJVd*Y6Z%O$d)>Xzh}rDFwYi`z4^e~CYZB;TJQ1)mzSI114$ -z78B)wFDW4T;8lb6CG4sNL&zBHn{XWk_CCU)PGiqX_7S_Q)PifUOXl~^+u6U*Lj}VM -z`9}wp^?^?e-XBP-m8f1g6n!7JP6yFii^(NTNRWRyoBz^6v1w2OR -z5#k>WiT&A(1=E$h*ibuXAxj9H#KUWBqpPQ#GV-J_jBS!3BD7u1D%VXimBMA8Xgr9P -zDA5U5!7O-?DB$#1K4Sd*%|Sxjp{}v?Ao_JS_F7A3Ui;OdT%&Z&tk2YDiML3iF%3}y -z3Sc&haSqaCv>GhIl|5#6n^>ZtgM2lJ*@hVjM~tl2q``LinIhBvs2?%rLyCK{01d?4 -zRR8pd}+fhK&>6SWP!anBZhrG!>M$Z -zNhKoia!m0j^l_eXy;!C!A9lS=a`wQ9!m=Wh)TXsLsxe+aH7Yl1u$iOzPf;7Wq0D{J -z+yp;zwwe4$_b*7q9Mj5_6Zg-!FAPa*hyXy`k6^JJVSg#jW2;&^p5J=vdmwMI>Uu{Y -z1lK>2YP-G7V%wPZ%i7qrvFwXU(!P8PI?F@8G&Y^=PFXI5Pdf)%JBRg{=iD%(Cvcg( -z@XP8>mr&3kh%8Ao^YEj6RE-T*+1!-H=9pSRzWAODp}2Q8?DKo?Je8;13deV_%t%7Q -zPhD1qPT#*%oi#ObVYIRh)>xt_XH(hE)*L>TKJ+e{uR11CWM=6|ZdrW5XbdK;=1V%c -z;07>rSQLdZ?3W%jSVc>sj0u*|5OtmGNI^Q39q>!nvGt@{m(h9QFSebm!GalD(}t+u -z++<4hzvO)KBZH)5YM@|?e}fhING3T!*SpgN|M=9~k$%+AVy_*4e=>4~x{oDaViJJc -zl$m~R(WUyHB;-I%z;yVd_f?`a?gBlWjcHKQUGMf2RcEdO20pLz|}sPX_nHcgT8I(S)}(9SFo0aLhm=B_bc>NmBH_Aa=$`QMrZ|`;9@)Xgx5Nv3h5OztmRO&8)Js -zeTp+Xr%<;j^o7wtd*>NH9u99)b9Z3-l2VL_nE2ijJ62p^U#Inm6xa1@V*hJaMuRt) -z0T`0F|H;g3fa~oS-Wk=~?_;>_lN#1=utpeg!t5QPC2Ozt*1w?MGXJ!NfT~P8EI@4$ -zUB@ACj7{^~>}2%i)rq}*WdREsV0Y>Mc#gYtBHyBKd@yeJBFO?eKu)kSaQR*CyfijQ5}M`WS!VwktYLH@G#|E~pr*_&AO7@hb?9sz3N -z9ThA^V2RR&sUqDrr%Pe^el}73b1~BX&RZ}h%B~>-P`2udQe}m -z@ZL3{6sI(oR2vQqpK%bu0)Y5I2vm~xkcnd7Ox7m-)BEk{{=LVs -zb!Qqnd4+`LsRio`BrN)UgdCEeI;o!MDeJ=`^0}%~^gXD(M$Ycq#MEqK2jGA<6%n`% -z&yT!Iu3;%2SQ_IobF(uWx35vdjZA6lll&f{cK@B)b~dr0#4}>Kev^x#qrCv!@HOsY -z@xL@6>I|-xD8P>z><4)WeVpuJfx-dz^*C$e45FF-9B^;-L}BdAl$t4aZ+6+xjxER`co%gVeHO>lX#xZUPl2DLATJU7j00kcn(TIHbp? -zDq0n*tsd%KzhgvrnC=Afbjdfs?dGK?J%yR>KAxzaTyno(@cnLg922lAd%?_BmC9=4 -z7Z6|5JQTcFd1Bn(sN;wt@t&ax;{4(ye}w?*_W__aolXAaKFyozXZN<}N^~108#t!a -ziGCA`%yx{lydphMB&Wd*E!p`9cBDFIH3xlfaRp2^)^UZs_>r<;xb0~*e|f0K?oU7} -zx)noyb_@0qT@#_oGr7N+Bq6mA6xo&*i?`pJdk8d?D&CDsFZ0Pk5m7s7^%Nt5dR!Ls -zKcFuvAzy`=^B6rt$mXOoJHPonS6Okw4ABTh+^cTMhR!Kh+A>>lVjpBeo%=* -z0iO=IeH}B>lm&EMDR&REnV^A2{5jA23*mDEr*eZDQ0_S2e91Ts=&xR3^uteVsd@^^^rZGWh~UwF0Ij%tP$Ro8iOdn5}E>I -z>+EdFhH_sbkjycyZobX4!ud?#mj9JP=QTbWvL55w+TGJ?F^LiK_WY9{+}6>2p9aG& -z+kGKtEnGLR_F5KG+LHY5Ek@JvSbAo;>@&Tq7yx8sZacmttPZa`kgKk+p7pffVl=hr -zMVdeRjiN+V3I$|}$l!Wv{>%HYX^Q8f1R9Qwb%QltPY=%Yi#uCWK3GMg6Oc+ -zeBD#i)<5aGIytq%A1mSX9oyTnKS@E8` -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 -z@>1}If?VZ78gTSjiX -z;rbdCN=Pt;6g|u0vytOeg&h2R?b8Yoh2+Ou+>X+Yj?%7+h3Y2aJWXBfdbiDN1zy2B -z=oGOB>oiL_cV^^Ub>^@Tu5c}%uNJO8@&D$MaUe5$$W1}86vYZ1w&IVw -z%+MhY*6L_ti8)nU$kl{d*RIqiW9V -z=_1LF0xa+;UBfd!HSDYRzS19jQ9lPd(*0jj()gA5yES~A+caE_a{fyL9mUk4s%g5D -zlDpQ?w4&yb`d4#M`euOZ;p`7(j62K}${a;x -z8P->fX)bj0WnwuRRo0C&#TjS)CIC^Wc9Xnnip%Wa^cDbbE)OI{@8i74D_rs3W -z+tpIcCn%V-j@F$t7pF21hD_}Ijju*Ho5+a9u(G8+$Ew;p^Rd;H;ycQO=ElA>EAxdf -z0m-KCea?I|CNPO`Rr>AWo8#B;1HcW4N#Qn%25YUqQ0UAxr6%$E@*d`i-7$ujX4 -z{Hf%jsLvbmdt%U(m0ACvxhX+n+S5|W8dJYZZgJA9LjKpWP^-8?G{IpGctGN(z*Em9 -zW_^%{AwTh{CG|sJdrFK4!z^2Vma_`j$_h|pvU -z%3S`xJ~NE}bd-1%z4>Ljsqm*a^5?ypNtEua)!c*ClujyL%arr4)t?JX7YeE?$Otfb -zN{epr_lw(XY*T-$Gu8|nhiTK_{w;Bd;|G!^*g|bzr#UoCSm^TQE%g{@ -zBH1`MBhixot!s34b?mARHe^Dg7usut`Q2_w#!)>BJ)JSGlNRb>U#;IjV>ly5X$3XA -zF?s0AHmciN!m7xNHcI6bTe&`~d~0m3PkUmzdzqBTkp{kFF?LqHoUR#BBafj{C5l}@ -z5+8ab3%AbO;+x0z7VCmwF9TiAVGkv40!?b^rocC%(D%GRQ&d%U( -zf)h# -zZJavR_Ur7G*6=cE+tCRlr6--Qa~%_-k*$ksxRT;%DlfStVj46BtheVo6&>@pk>hiF -zzxOF=pZU4@cQBCuZ~8>>c{q-! -zxClx0E{f$orp0v51LZe@7}o?hnSCn1-Ga=*BSx$it!YdLAj_eypr@%Wp$N~O8dEfh -z3cBd`g!P);O-Pds1~Oeh&Lw=1tLQ;&8Z~%R5;6bUWs9+~7N}lD`NWLChdyVk$Jgr* -z2gm>b1JVrpz!E0^S~&KB!{tedSj10A+Yzj!BK#>Y2lHaDm--|!mcE~+I5U_5D{D9? -zh5bXDNG*F&(4l7+H-iKvB_}V*E|S!0l#@|TVHU#zF{EsKfM0Jwzben=br?^%nf=X4 -zA@Nhq-x`HeKSN|2Y3z2%rrh7YA96jAVC3u{3S+kHVoDOAWL8fCaf9NFd96X2pCsgSzX4*ieeC{poM&*I<636Q1M76&#J45 -zl`_XVli)qdiZfjQky1qBlOmWy`IW?45n&dtUkH} -z7Fc#Yio%5;$?k%;Q~ll)09BD8AQ8s{E7EZsJ4wln!WHZnX&&nH0Cy+w%Sp5Wt6tPt -zUN6K#Y#d7b6YLPdfsKcs-9Ij}(_PnoUmIqE0HJDJ^SA1z^;}H+n0OtA -zjY;_7{2i8R1wx8DpG)}xEJZ8>zueyyx)q{etm&BGbU;vKPgp7J_x7kgR(`kxITY9^ -zjwcd0SXpvJ`TzqeN%ZAd+`!xdi^-=^KBN2?WjU-Q?up1{Ui+Y0vnWY?i-@1LL0%8B -zvTqA2xA{?VE`3DsH}>x$y79b7!pscCGYB2&>D)zb8&GHn^=X2)7iw>{^iTu85{M8Y -zT2*iLT>alMuzB~XKfP7|h|~J2cfnI^S(A|E{s%5Xgi~7<5#ti?D?+z~1)k>vG>SL_ -z>8AD9#mXs#wJVxk7^)O8u&2<~nSc2!35Yp$?k)?Pd~1?J)l6Jy#DjtxJzg|)Ga|F7 -z2t{}_@$A?CJd8>jy_C_U#N!j=N4GGyXy1JhopL1?6#>_3)hk-f=SOQV=?0xSQR0HV?N;(H6Ki-WsW=|^$ZS+?Y#tF2`P%_f#|yD0+bfWdAE656n2Ban -z<|tuI^NsJYsES&mXZ4mF2FVO0khMHlnARiW4;r|z`03h@p@sM;W -z79MPEAICnGF@yr3KX6RJ)AMHjj@Tf<&|ab9+`Vq}l!vttaxjgBw=vzcv;cdOOj^Aj -zm-8`zXx@xrI{M}!*zvQSRq`~Os9A#4t?7xc)7t7Rd2?OfL$IdiH+>{o2l`8*6k{_Q -zd6>>yqK0Xb;<_EBKi?OcN@M*mwid3Wsi2Sft$#UyG;KMv3bLqtXaQ|%ndip`Yr@@H -z2go%NBH+j5fN5!>DH9dAe=Kq2E*lsO4NMQ{YO}6)5GCs{gh2?kE{*Rl?fP64QC9kY -zan_<(BR-a}#Ev84nG7;?1o=5)BlFv<+{)l)eav&V?3R60t9h$8EHk)Qr)^H=nj;?yhI2 -zGnsehp7eq~SA1HS@#J5v@cT%1AIC4$-K8kSy_c>ZJ|g{5G&8Q4z=H!AAFNk%xhK=oA(y+~X3Q$vo_9f6IJ!(&fo#C(KZUPk4$A3S-T3?!U$WW3?Vz5-|8akOy&K?)mCv`d-Dfb -zbCPob7v98z!|QPo)xX2|p{z~x6`1{-&SZ5`sIfzF0DyeMF(&&YkAZdl2Jwup$3aEt -zR+>vBM#{icK4U)25|Gx<`$UkE2CkB5OtepNJ5@|25a{>p&FyzC9Q9r^T>JxOZ);ii -z>m+Fuh5h%Uo3PHifhYq+{fvqwH=V(`rZH{@Y -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 -z$gQ$h_O{cBqSc*=B>Jjc( -z18UKpuBgvQ3LY5rnx3`WRbRwbXIrNwNMZJ-cRKwU^14D{;K{)7eorY3HX;eL!pxLU -zqo1KBsHD`xeaA(^UWCoS7kQ=IEUsyPR^H)SCg5Sb$=rI* -zrBx+U_B;smIV(jn@f8xH-!9!`)Y9_7xE*vXu9_TZ&IHgvXnp6iY@&-+4o(XabowckkgB72rqDskn5u?W)xj -zv2J@vN_Uo0o$^78=*Ll)wWs9 -z#0m&G{1uw?nN7f4$*480PqWfOVsegbkSZ-g`vA~O7WqOlD(-YI1oD^bj&ro4se*&5 -zf+(EM*P1;l_m^>m$tANn(JE1m?0Q@6)am4e*3eDGcqdyWM07lMmCc -zw?2~aa{TfTmy94W)gJa~qt~9(5vz8!uS6+_cpS3}t)rV#A+#PdjPvxF7ealW@thzip-msc1 -z^57pq4Wy-|1X7RT|>8EQ$k3)Uj5G*YJT#OiUUwlBSR1wqh -zDLD}O1iNSZ9$%*~)4^?T^1Km?8$#FouyPyLZ};q*=Q$5c^fDn4V4uV#r9|Ghb9lX< -z@jw9$oF2lZ%Vl~cjI`aTW7CxmIu3o1*vC~zogB8j2CZtT`^*f+JWBfJW9-)Z@+lX} -zTfFupK~!K{t{pm;>vjt@`_N`XycNyXn2b-A<_DYg@zaTlee -z6wUpF$%sDCRSPqFeGD=*jHu(VpQ~_6jkUEwI2K;hykYs*_4(eRrJ!(Cli=||WmY(a -z6c1B!@gOe79vFm8Sw_WNf)l>{z$QDyjO|t>Rg4VfxAAvorPcweY{>x{^;8{xgoF5L -zND3eI&Ku{;FR6k+3QJ0=H|O+!2UQBPZ0%hvstd9n^o#2MZ -zL=OL*t@uxA!0&69LZIEMuq*r_$;1E{_2T+IGxVI=y8=hV-WbZ0VNy#5~U4jMUT%s=tJ)wyQ%V -zye=6_6~#m|uWEvvs9~UYnoB0UZ-3JO -zjQBOWwqnL6+n%gi7{uqRq#LWY(r0*V*!{ducZ8}QCK`!~PPqj%c><~HE2YLLsHu!T -za_?U5vuIt5X7?~%UALZmR*MG~<$qwRZ3-tcUJF!zl^=05JvK*y4H!IP`~I$LuqP|{ -zMw91<7!8)WRTG#g`*3W`)7&g9Wc!<41g6H8f -zQBk9a8ri2674>XLoUFZ!CCqVUV=#}{^rOq8rL&?J2T!y_Tp*q>7)Yn{V{gfCr5T7j -z>~Iwn9JY|K1=v}3O0-p2)A15n&yXFs3eUi3&3wUy#mYmkMG<5#}emp3;Q$NM0qkfKFbJu{esb?5IJ8L1BlfPtUrze3{mdX!m -zX>-{70}(*Xb@Sazz{G;R(|+zQ@5$`KTk}A9^0JM#^Bz2P?%FP@%hrU@Z_JGy-yUM= -zAkC8?1*H4t&b}2Uz9Zm<`x9dz)YqYRU5NfEUP@GQ8qPpo#_|@`tsDBK$@7E0 -z*cfloO=lQ8wGfoZp5@7>;^l|#s)Gtf5bC|C0)FTa{!JqXHK<;}4sd%bcodODDcejb4OLa}?-d|A9jVCsOf -zjB@YH1`(TKgRSu8E!q!un@MBO -zVHFG>R^axfwArZZ4L5 -ztpT|MDa47V;TWSlIo8@QcZV&)E2L`W_=lq}3A(N4>tRK-j#vgzzy(LX$8ciai8nrd -zU%JmusgAQ(zlMg*l0Lk+`}k?pSQj*^NTtXGVhhP?i&Ode9vW+XO*1R*IN$5dZHQ+} -zH*5HH2H>pYJi<;!=FOO`LPh&=W}@Algr7+CKfmLs+-{BxZ$W(E6LVD4)^#dnNLv9B -zL3#Xw?x!T~OewhseEh1td|aT@Z9HFtT$Ci&!lR^&^f+Bs=s%0F7C3;(e72HUUK;wN -zQPooT-U9~E85`jvc$4>oDVQ-dr>x?d@h2>BuzB0&jM0~TR`T@up#IHeMXcwQ27`=Y -zUxjAgsn-<8coz?YCN^_p9V=t2_-m1Hy@mqXYX1o?JYY{&lT=zn&-2qVo`4Cnx@7Fp -zng98E4J_ITUG6@+<(}eH#$N-~yosTZeHyDU0YG*s8G<4j@6tyAYC}HXHi+Rp<+xee -ztEvthH5{_9<1*&ifX@A%+|ZPGl0{fphflDg8eGHQBtP==jnIxv|Cd@=!l)%>i3RrO -zvPWi~9X>)WVcYRQ7C8*QO6$s#b0T~3-op@@d;`C}eqV3b3Cgd4I)+s8W3+N2u_%*Q -zV?2~v^@B_+IF5EnG;ZiH-;!=Wo6AY-yP@J2NkvlwH{x}Js>gMi44Wr_m@tbwnc}|7mk}Bv8YA>Kes(ha*8tVcLq%rO(~=eMB7-$0q|wt9rlb8I;%LfCKhYCc_W{j@UgSGVsj*+ -zQS@f`boHvX@}4Am^`~baF){IzN;2F=(XJ| -zbZl5BNiYRu-DjV -z&h6&oKE9@vk$|uED5pbXv-eC&5Leg$qA&L0g{}BRttRBv=R3XN2Ow*p&mm>98A0}R -zoL_q*H@pjd9^H}~9$+$XuXIiu1Kk4u79W1Psj?@0z~gz2l5MTN8tbn2JdXb -zY?IMHYyK@SIYDLlkw%at^#Zm>zD8Jc%_HMxgAHnhWM?X?jP^~!QiTriv%y#kt-pH0 -z1oS~Vex=1nL3#fVGd!=H^%h^>+?drdDA7x0QUA&}>pcalJ2XOPb#7}oku_gKoa9Cu -z@(uyNq~sLq?cbw;kp8MTe8fp8oN*(cC)}O)MwtRp-#jzbzQ?9WR22U$02A -z0qPWZ*gkn!QLN-Bw|HNEe)iWP3SZf4r62Ybh3!iF6)p$?ooP^a%bwuq#|(^npH6O% -zmVA@LCEVCRwm?sR_>Vv4b(b>(aFvxk%JK4Nn97iwj8hxYLC1se_i;YLpC!9`AWW;2 -z`$p}5ZUYznmqKK^93>Ju?C!Z%FMSy-g}TW0NQQ?4q%`#Yo$?+#hl5xX4ult=*X_bl -zYm*_Z&vSh9x2-<%T~D2-)+k7^*n8g-2I_3#K`R!bn%Il#w1X?MyW4CB+CRCrESqY* -z$F9!^-s^*H4Y+-@9w<=FkzU;#Ze$sO#>dl_)^_;FwP4VzzzTWFYp$N=cwR~ME_UO% -zG!MnEh+iO}*W+smVo482B&xNZ9CWbd5@)2py`BjX3CL9i<*#x9)>ul_(`M{8DY9Z3 -z#Psd-buW|=b!f7+T+ap_uu|gThyGC(!>Ae_Ad?R*oN93ugo~ -z-`=dLK)E7TvTNe8SAmTiY^jijh#a}u3Br}?71Mh;@_H#y5`iks7^P(YxLcTO1a^0} -zEkDEd1W}8Ot_6{-0?)SqLxfO3d8e0_89Rz}_G%N2*VAmh!N`yUGfugLv9VBa2jZqMfBw#8A1n~V+hG#2~{#^ZizVi#G` -zF{TKVs4>YNwThj+%nqyPL@)3tlKY<~t(eh=ZV`d5^DB7s5`D1R9$c9rVrOS=zM%Uw -z3mH||5|a%OI(G=uV@n{v#z~JvTXsFF4$H0;Ja@6*6an;eabdbNTKE3@1n>8SJRmCp -z+9?qsJ7{IHD^ORA&=fW_SvzIi^s}eqH(W8H$a!^3=BT#+f0Z01Y -zj^%Utnf3MNxdQ~VOFlfC)a3}Ab$d?^Hllp0d*mnGnS(ezcx9NJBp-f=9KBPV5I`U3 -zSATh%o}Tr*pTCv=aZ2!`?^k3o@zm04_^d@UTbyZ@4o>hl=VV`gbhGPkbR2~*?=+oy -zhJH!G1s2eK>XzU@xkJkTuCsYHeN=$}zyC%iq1kRJ#viT>!{n%=DYP}2^Vh^Dd9aH4CY?TOX-z@eQI<6~6MN<(h -zciC4$WNgZchL{(aX}$zCy@Hi!p2OEM6tX-IK|hsb9tPd -zq=~eejFgE&Zh!(1)So|!%UctU?@2#FQp7@+A@l13Ee%Gow0@u*Xt*K=4)x%<5=T1u -zr -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 -z|D)*~gY#;;D16eOal=N9)7WgR#a{Td^oLER -zWfd{>$wb1HO{YK1%l?%ZdHMU%14NAPU-9^}SX8i^-nqwD(fb%}#iy>G5x`b6c-z7Re>rz0=k$k{|T_$=WtHFlvzK -z4azjI$s2X`ulgu6ShrAstHb -zSqyTdm7~U&Gb&5!`Ar;76bZ4P1W1T(N3&7rM|zt$bBY+ -zp+jm+3pmMKK9>91@kr`(%pJYoX*RdTzgoZqS-vq@O7b@qyD0mdae>j`zVi%SQbdC| -zDM{nqyB(u}I^A8f#K*y&P+=SnPw5xQJVqaWFa)5^>=1S+(e3Z!=n|@m5 -zHK~KvFEK;xGQYb%U3n2KzuQcn@|wnMmraoQJ)F8(v;Ff4TkR3pT6dSTlg`Lq -zUyKZ`*BQ>JV%myL{T@gvCF`|O&U0^XD6bqbUT?KHjk}z`Fb`4`5^uxy$GWs^=|7qb -z%o@BN2|lN*A1clf^}HQ4p??a+MxOR-xVhxTWFgw%+;0gEZ>(%~9M!YWmle~h(Nc1(_zihtFGx)!`2raknh@H-6)G{2_%m+5!&W>)KQFcMH^KLK6E!p?Gyv$*p -zmHsGxDUGJ=6RZkYd(=QstDesg}lnS6q -zXX*so>A!q0(?7WaPhzPDJ_M&-q@DcG*HdIrjN|xYcsrxP3C;GwQHDNOHniU(Ms2l9 -ztc1vdmP@npUx8W6a>=@9nyycsPEjLv+oacKJk~Cr61>)nEbWoemGcK2KcdOM{k`lz -zqe+B9`(OT`E1Nn7ouCLRK9W8iM2r+4O%z+Aos&^Xs))ts6H$d&9!9aCKtVxzn74gd -z6XUSxnN+T-O^^yiQF>tijHaT|PnnrZoL -zbTM5HX|>f%8+{SZlaUc_3Ir1)iJTTijA(oqb-X_B8z(AXZLSRyN`8DxADxb_oqZ@h -zSbiiA4D+})vsiYW6rm?h)V6+j`I+;hGFqza#6z#5tir%`W+%gj?wN7e!~gwhzDu|{ -z^0!&!iSJh{mse$>r({+W4kkNfwSEV)tK!83y�==0;j%F=Kq0P>U~X0$-7~AA^Z= -z+a*N*`&^{e~`k2;E=>+k2~oi>DYz9mXO^Wm*!9>B5#JZ*F0Ggz4>VU -z3x6Dv%XT!XzkC(DndqFCglqX2(#qabHLRxC0Z{^7b8XtU~yj}3Mv3h~Ed*LwN -z=@H3R6U -zCeF6W&Eu77Vrffut>>^ccJ3|FRS9F_v -z8Jd30bX6t8G-%&OC8>0qyYW*t6Ti|;w$J#ULfu^5t)?m$VvOboj)=m=eNV3I6KVl6 -zm0j{Z3&i?B~#oW3Jxydgt5B{n#ntUHU -zQMexpP1{P{HeHHLq7JSH{`$$K_|)1q)@u@Pb^Wn?nWw&-hc{tN5eEs@^2h41%}>LD -zB927avo|Ftof>__pWiwJqI~$>P=z&Wx~n3uTMoj{c3O;LMQGVx-MEyBAG>=+%vw1p -z{)(P@7}ae*nWbCR{Ya6$mi>enGQ`Aj#G%sfJ%!x;wUCd|j6kx>y6?vf^R2GF+m-=p -zY!2lC3y1VHcyVTrA&lJ;{Jn%j>X#@e%Knod1!wXZa=$bcNwW+A*Z_+!(T;qzw&%+B -zW4>4Y>J*dHCR^)a+CX|U+?!h_rxaJsWz!Q;7`6VZhnU^c=2a-4#X|(Mv)2R<$NqfY -z_j#ty)_XZm%SDewed+vGy6osxf(p4$yq#YPpg&f-d2m42xl_@Hj)5GQIkTb4t3RpF=;3o4fG!aF#i>$!XcBfyI^STTNaaLRz^cO<+|{(D%q_&+}b -z)BFh>CK5+m>9wyg2okFF4O7IvG!VMG%mFLr;>`MO`ltjG#Uh1qUM)rwL -z%0BG+l%)YRZp~V+<7U_m@m{T8(OKy%=%t&rHFRpO`nu12`^>kxqS2fk69;KkRvR!R -zr0=nr>I(DP?z)RfpCOwgRk=y^4|_xyxo_IwfzFD@^#0Rm?sZ02v6E;1u@_T(SwRcw -zh+OH3oA1j%HdGXp7U!EZ+fuLeY|kfMeF??7-O&9EWkLg!cY#i&ur6<^AH`p^?l0dg -z34$`HcIOXCU~_D3M@U6vOsM>YhGOgI9TpJFQsl+8mTCB*l`tMV7racN=uyRg<%Doq -zUdy=mwM{Sy274%ad;Jk2Z{>75nQ4+-`fM4#IQ~3>XQ-JS1%Dk7p1-}Msg(%P3G)>x -z_m1FlJ~}B`~&?|LA=554tZAEZGUcLs*YV -zG1w5X4QW&+6N!(ed~)Sg2xABDfw46`d}@gg`(PX2tF3jcx#B#PbAPeOmUEsH+U|m0 -zZvnatWFZVmT^wkIqYL5eKfEVtqaR -zqegF21Br`!$}VXXurZUEaa&><3n+-fU;=wd3v-C`Ii()qwOx#mz26BkvEnR=cfYB= -zB$Qx|&R^s^=tN=EtZdkcGjcT+9M&1>z}QyxODG3#IT`Kzxv%m+r%o-@xF$%xU5bsH}?8oO^^tJ+MzG|p?rH2aZB -z_>b)o?SBu~$2 -zT_($Xk=d32A3v6_mxZ5Gnq{c0s3ZytY*()bUk|4vELg%oH)`kHd2u*Y -zPtCjA{7GF7K+pJmu?%CA+VbeSiod~eq6LG=`p(c><;bk4PDW3-pb%?CR>nY0Y;0%) -z$^v?|Y3FsPABBfFDCC8-ApkItak1R>%WP|hz=_teD -z3e^goTJ-<$Zbamkaz1osl~HA+s%4>R3y$V+iX~DVtFto3v4MeSr&ZvS5h=x -z3;+v0+;W2^n~Rb-vcazB6x!3oJC}tBwR^9B^P!R3YFmXF88BU>fBzE&(JeWYSp}1bLyEuPriW}m!(!j~oZ+c<( -zTs+`po`M@DZczsDI|>Fm0^TsW^UMz4i<^n_`%H~v`*$*wY4xFMLL0+^xwf38A-*s5 -z*sYWe`3H2zquKThKK=^raGuC>x$~1Bp?LNofbTH6e#FaqliG*R(@G6_NpQ#GHC{wY<4%gKsXI4U`n -z)3DZ*;h!!YMDuI9%HT8m_iapI8hT3()lmN2v~#@lGuX3ns+Vk#(ffDy%kRdOp>H*^ -z4NC;gflF&uUT8xR3Veua7-N)`1=XZ^LP-9~3Lrtpbap(_{~C_s|NZQ(aAmI5!rQfL -zcssH1VgD{fnjw)`i5(U%M2{4fdBA8^hLl_lf&1Y20RkX8TB{-5+8atq||H4Tm({qok#66%bg+59FZ7W{;@kzdI|h$2_5SyMcdOA?qZ4hEuH9tR_* -zk5!d9Ld)ZmSUu5gB4j-5OE&{0>am>NMqGoNMqP!B5cXjDcaV@hl`+)TC^II$&Td+h -zv(xPSczfcVY}#Iix}x)v;CW0Bd_#mST^c)5;E~PZ3&Tu2x)GjQiLoc5|ofub9X%oZrqM2AP_mJgW_X -zBY9wUBO3a2ALDlps)oS}20&9n2|qrfIr4rvMsDl~fQlv>uuWdGYrG=Ve~#c -zIg&{b1At>>zCwUpcc0x1(*0cC`toKI$(H_F8xedWyn-{!J`7by`=q_-#bYMh>(Mk` -z`qBVhhC5=#9#lcK$5zwt)K5#1>)&6Z>)Fl)VV6{&h)0ZM$};cwpm@E#265uXzNEj~ -z@jD;rLU@{Q9RJwcY`yrZ9j)-1}997=~}R#2nP#-PU+ -zMh%e%f`{P%AV7NHD~2MMq**j}2w2o9`Wg~p)hP`NtNEawNPt1rV?Fo<=Y+(&^R^w0 -zw!IG)xhu9ru+(QmGDsMcyLXRx?V^C6JO(|*p*1E3B^nvC9{@}+Rk8Hui2Sflv(#%W1B5bL^kAu80Gfp4y -z-BSGZp7vUG1ASpE4C0@9lq_08~8WgYCOXwirb -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 -zQjl1B$0gL)W$z)Ub6-1E#$`B=|K -zcPydA%XQEq90LD*#?RX}qq2zx%fC3LM=O07h`ie-?}R+c@ERhySpMdwwOUi&o@COA$&P1B7op -z#d#jSyg1j%IQ}ZPgNVSzNwpdlhdQDTdtp%UQOm;oX6E9Ns1y?-9XF_#uJvlSZcINX -zhJqdzqHX0%t<`hitQ4VFk>gVmN*zcME(N6hgXip^Ud9wuU;``9Lb`x+vXU=P9m*6e -zNoBGxHWI*yMsri@r5Bz3`yXO&hWPhM)Ys?ce%I%2>`d9`&KWYFgZ)Q582Q-vP9a9F -zGma&+cdq%I_ZiIeDfzMCT+m2UBNIWQEXGp34*QZEsoUN_1Sf(lrs0@6{I3Sn0xLlp -z9I@l6uNXYJL&D9j7%7tY!>tHyFV<kh^k<_z$CP-5<+{# -zAAUpZ@MT(%;v$x9o~d5{wjP3cAz&&im?#l6Pl>vO&}X9Hwk^Fb(}U%Si5Z{H$6_8^r6 -zW|c6`_18l-#}s`!&xO-$hC#u(2ba-a{zU_TMM!xS1w>KugbBqolD6u;TfF@F*mOv{ -z2Wl(4In4E)CCzy#K>Q$vsN==eRk0xQVqKyk=nX$TIX$A^8}VeojR1eqW3g?nCmqP9w{6hvLvs%IuA-}%uV -z0#*!PnxsFMbPmGZ-riDl6JW|+*>fm|d+T@{{7Y{bt{z(QNnAuqgauIYgyr>|LI-D4 -zoEh!dbTsBI0ZF4BX6!JYH!}g=KqCb@NVDcpG0;?Mu4og~tGViKtFEAe9mGDXW)Ju(}Sgg(Y~m -z-&7;F=u>&d65qM^_tDf6Q2A4db~>n!H94cA~^DX1uDLZ;_?p>Fb6m*skTF7pM+9TcBTOuL;u -z+h3G-bZ1UxVIE4w!BYnUZvvuM+$ZncJ{vt{4exW!c--!19Pi!90baixZ+**TX>E%4jsa>^XvOh<@eip3KC>LrP{_CyU -zKNFAR*B(lbTi?)dUdOVf^P?1u=)tO6S`U+&GjwP)LJiv^Xd1J*o*_p5D9U{tkL)~S -zabQ#|LTXn``uojuYCxnM9B)}N`eUmpCR4Fj?HkqJsQfLCB-ohkE0=6ER4x3j9ZeR0 -zX5YrbUDDtDk)EOKk80zh(i@5&0D*@20il2*o9@sun6(GqUtMigZ{wbM-gw -zPYHJOh7)V&Rng%kE^`GcPe1(9e}0~>5lRhFG@f)N&_w>iYmy1#bXa~_N8y~8-74`1 -zdRr`SaR6obF99>ec3ak|X%4-1DTO!(&{uiZ9OnB@oF3ivF0XOHUdXOIH`(dwY5dRL -z+j-0$iKgKadx?rJT?6Z`+pOe#r@OtEyX*aDV7%PLG8>ejCARrdmtU3Rrn_mItV!$u -z1fM+PvE5J_ib4%B*gf~fC=u>~ -ziMn@3yAbbj9fzn74fyyXDJ7w22+Fnh7fz!-;T{hjsrP&SS0H#(fo);$-<#Q6l)>d` -zJ3$-78j|Bnwt4_exY|k+2wR(-XT(QK=3s~SZBMWahw>dGBK^eA)S9h&^2;3Fm+k!^ -zbJwq_9s>mx09pq>ue+oSb8Y*2AOuu*TLx6Z -zzG?6lp0p3iE9Me<$`5GrkLCwe^_R)DOU<+Ybz5q{X2$jZn2Mrd7H7Ag5`C( -z#fL<5PpwT|)_7O)0g21O9!_jHEEcuuCv2?eY({n-7qnm%gSNkrJnrQ=W!6*Ui7zO; -z7qCa}CaJ7d{M(*TNkT*vM5Sb%-HJ0m#tFWM0<4$cI|vyv(0+qCqN$a}O+)rmJI~vf -z{%sPOO;7d2NSttj6~j9wyoG0@iVX)G;=%#EZDk6qI^9d8!Fus+U5>B0az`c9r(hr8 -zwf99v<|XOjTjz>}dK74{5YuCRj&0O7wJP%4W@b`&dTfinPr!n_o#ng@aMw`Orv5IW -zE&HGA>3AiJEP{5kU4sS@YoZ_pPkbW+if*?vAWdKrbI0Bg{v!#mu^m${0|=}%zf$KA`@ -zs5z)LM1vUTo?Asz&D~;d3j(w=ba;KG(H#SCI$v3Ziea^z%m$_+{o-ytv+3BfrS6SL1YO;I%D>I2cjZdb= -zPQTS$kf)_7G5_0>FBDGvtC9{Q23aSI(nYW@^(~@C2oliGid)ymOw_G3+1Tn9V&WQ7 -z<$yIQIp|r4T%W0F))+bcCuHpObvCzAnkTGhSHV`eUkX{LwLi|8^$wFGKKnI6_cjqO -z$)}TX~D389bM!zvp*|=Nzn4M~Q)Z -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 -zsk;(u=9Yi)AUCoMb$iBIPJy< -z_)d9ry@0>21-D-=y3jpK>Kot1F5J%szU{M6H|UPOkz-~q4<%KBVoLl7=!IeY!L)vs -z;FfKA6lnlgV>aHWY9&v%PKPlp{cx#V&+y66i2MN1ay|aKt7CuZ>CUljCDZ;awsQ1V -zpm)>G*IwADcd`2eMlK3lFlybd7u4_y+$wzHYW58G^pVAD70VdOtr#(L0@zh_NBpZZn4ELp<#$tvpofkS1lrzGzHq> -z&e-)gG($D+v*b>XrV*WNXAJ6RwNL9b>Uz`E8Xz8sn8rU7_Ze5KHoCVHxy0cB%ykX; -zq#9Y%jB=U7gC>X)`Y0^@ab2eP@+4}*fU9JL7aZUv4ZNMRanV9$Qzf_NqdzvU9&Bro -z+62iI&48qiuiRV$HKD}VJP|%^+9K;?xw#ct(Sx&GaSn!-M^UGhqV=lY86yfD&HhpW -zzr}_45OZtvo)8bcc-e~?<)>7Q09cQ`?fkDy007S6vGkkd*nkE%Tga3!NIC}N<34!E -zYsqvSb(d1W*mB`l3T|D^HcG2o8SggkzOh&0f{?Q|RfoYBz(jPz!Lz<(Egr<;G6Ppe -z&B%UQ?l76d+Nj&=thzqZ*)&_0C4hYx0szEhWI~S{bc|=Ya8)c^^_5N)HcH1mpB?1c -z^W$a~am15GtcbUQuz%Pb}(Fc~Ya@z*^1=uY^EU%Z=Am19Xl -z=+jC3dJfvE|9vXdi_?yM?&@Ta$zrqu>>;ty9NXq@=4Ow$6_gK!*wrhiT2|!N>J|{i -zQo$QqYLcBXb0!l-qkjt_niPUNEAPqcbxf)a-D{Ra7^ -zBae$5D?dVk8auEb?NvNg3l4L;`nrxl1S_F{v1)Yi?IZYIbOVBk-|h*2q5=8_>bM+l -zI&(~32x5GGIa2l#Vx`(MDL*gWi|K$JREI(17_tf`_azMAOALHU{i;{Gr;LiqDLXjZ -zBuQ+^eevX&ySA_zJPmyta31G=6co=YlerB)$m>Uh3Jx)9tY|OZiyH3ok*hf(NvUwi -z6Yt%tpv;V1JTQN!w_XjN!iH3K8lh)g;Gr|{n$!d*U2birbS;O%3U6n3?W5&b=I2=v -z&VJJVaBsdht>6Y;q8=dtT7nlM%xzm2)r -zp61IPIT$S4$Ms>qj!VD!0FW<*FZ+@@vj~&}+>nqTldm8)f~eq0&srbfm$mk -zI{5Z7elcp3==)QW6m8&iqLWZgHZqYz_tB6yD`IbxYr4_bnKP0#i}n^V1%78;L_u4` -zE^j1I5SFn485Jdz#K7iYt)t+(v*)w@{NFN=0u -z{*B`(b-r1~hUzU^n4^P*)O3D-7y@@0aT_3-uw=r_TxX9}Z|f*%%z4?65~J_!*gN<^ -z(`n*eJ3r^V_3w^j9q;O@Pe1TRoiW;Yee#sSE3xfSNMFa*(W7*YZqMD0#xJ)35mw1% -zmC2(OIbs)#u#rQoW79_ZtEN{P&%@!;Q=0?bZJqnsXGyZA)oF8wlCMU$!QRb)3_d(CM_dt3EX#!+-COMn6pxVjR~ -z+5DZk=dv4iQjQ_u{)&O -zG2EV-bjG42)!JLpdF}@x7|IJ8f02T&ys%2bWAqi*4~Q~9Z*6b0B -zB_(pNmjxFIbZ^fbikHI?v1Cu<7w%)6KnGihjA0h8fv(Ipw!lQ_yIfc;wW3KuaKtSn -zl6{*;jOKMW2c&qqy`n$dLM!S?3wYMvyKg}FW+r2t;nw8c{3&hWl+b#SocmkkTbW(x -z5_`PL4=srD^6PptbM#dap68uP3LVqze*v2XWcmtI*D8a;YY<<3UQe5zAj&ZmlC%2? -zcGu*I#Bgy(#hS5qGYd5HtVZ2@R3x1j5fQn|Wzp}RoL`yJtH|BUl@@ER*U -z0|Qx#kZ>#$1OVcG$+P<-D5l0F@<5j5Fq4xE;aFNEm*C-!u7(jT=`kfOE1!JzX6Ian -zaNsiv&yDv|Y+sJ0#X1WS%(5JIuE8W@D8iqnnb5=`F>(MHW$&n!O!@pwrcLpW0^YmIYqrbL&V+%R!RPw?hAu|l2j&AE;fvHe4Km*pjI#W0lI_-edP -zBvo1v1UTX85dxsVpPaPyr~O>|TN2V?JWyR-odN)SRATCCu{?kf$yC!1txvUy6aiU0 -zLj{_3?dwro>>n4?f9_9v7E-M`dz{DA{)xwU+gCnP>?sXQb~!BIq3NRYZr;uoxuOR$9U(+zUUZ8=zXxsqJ*+4X)O9BLfv -zHng0vwO?~Jb~sp6Ec=JDPt0tuO&=Z`6TL(7RG87=%SJgKfS_12$I^{XhwXI6h=}?5 -z+3}TgKfD+N2&x(v7j$p6j$9p4OVdpBgV(?ErMLrPRba8rVp_Jj>{8Xj9T%VTCAA!i -zi-+94s|$&X^t;;YZ?KWQD@KHO-`|Na2_o=+r|s;1JAz{S0f6^9x)Cq^2L1i|aZTBq -zwJ#VPB&$}6scWUnEYmlhopz`00*XtORLQc@RAE*dkaoiTX1YsPw~Z8-Zwa%>=3xNjw|3L8{K -zxh%+y_9T{J*bc9?OGCMB2x0A@Ql`!>Y`jHn4eAr_$<2I*U(spVmyrEeeKm@_AZ_rw5k?RJfhVN?jvZNDS~Jn+ -zBz7Pep0PV;q#>@K|Gn4JaVx(6+GFiXeLgK^+?5t9<#al~V`*|))z%j~rxctmrAQJ> -zcqV9mb;I4aajDWB9j5xC;b!Xuu~NNA^M1yRVY4^y#Kbb>a!Ky8iFrpWr3$}Jmqovz -zByXxZ=cAuagaxWTF3U?U7JA~z!Gv2NAn;`P4SzMlXeZw_cQsqa4j(uOLy@Yy*GJLM -zr#%B@73bmF@z0MPx?&&Mrnhfo0h{Hgl>Pn3_oix_{4%2ry3WxEhR3KBGP~L4YU4R( -zgGwQv>+n#qxi7@85yfZ4dU@$9(x<|BJHeh&$Ynpa-fn+6D75cDgPjyNx851V;&T6a -zOIB7@e!I&f^oEcD3JCn6BriWCkthQcQ%Cfnbr!E8P$f3zXUDSu07uI5VS3gEU|CMQ -zc-NId5o)Pv!X?aZ-X?gQc_T@U%}`!M@A|9j2CkcVtbvwq!wTS2POAy3GE0mx>kzNpN^6951J -M07*qoM6N<$g8o@6NdN!< - -diff --git a/src/branding/default/squid.png b/src/branding/default/squid.png -index 452e4450c56c10cda33dcc9c5d03753ace458862..21b7820a00dde943d7088a4300adf7039db415fc 100644 -GIT binary patch -literal 962 -zcmV;z13mnSP)Px&d`Uz>R7gv`ms^NcWfaGM|Gga@t%z<9Ne@zp5p(t#B8mu%Xy}6Uk}~5t3JEDW -z5HuED#&DbmL-Fz;^i%_d>DgoCM4>i4#88n>p`LwIFuGYPMu^bZXy)vd`y6%7K4;pq -zkIwi#?r*L2+w1bJZ+)WCHP4?-Gw%S)F#8#)mtyXtM$9O+@Vw7%VaCW?h*iMMxSkzE -z?#mqP_%4mT6wsk*WKO+=!&>03M5D&%NUu{|{6mslGBn%&JcJuSbJKWmS>_@}AFkWO -zf%ZSg(;FY!;y;ALyNE{`fYn6YhB0mAjJt*7?dPgD?_~uXqwzL-FW` -z&>KeE73lo~cQE~*9%P-Mrbz^jnKCN@ZxG}MMP_FkPWTCM>y*H1jT!^O^M6F#mkMY$ -zjMT+x*DvQOj)cNh4ftVkx2tJzD0I~ -z(7KWHB%-gJ4zu%^`!uDFZ>~aG`~|q|#_Txgt4p2hS6~j}>dz*7YJAT{cOggGe=8e( -z;NzQV8Xc}V8^=IV8;lylQs60!0fOAZm|V91Rj@6U>P_-AWDTX!z6BP`A-Q^KTq#tS88= -zt}ifu2O^)&Q?Kw7(!FVfFUyRSdu%cHX;rS*A-$c}Ms%M>x5lo9FLC2+rI45lx;rfp -zvt5;OC9~r;H -zj=_hfk^N&Oglj=}CKk-3JS(aR(F1Dw->Y%-O5Fo08fzSq7XU=Lg*m9b1NOBD!qt82&ggiqDZeQRRmO|6RLn9 -zMGz2a2I&Zf8X(|5{$4*H;K^E9XU~;6vu9s3d(LDhv8Kkl=jeIp0RT9sucu`W03hlR -z1i)d`i(O!uJM{t$($KerQ(qBqH#}9Q^Vj~7d2f!uynjDv`1ix(nX#3V-}C>?dEr>@ -z9|$!h22gGzR|N60?cBbERn-W|)m>5b0xUnCtN}x_aN`)U{L+lvfVvw}8i?sbxdG5r -z=RN=~*p&ie(ZUHp`0oK{lTu>?7TmQ~3%X{29gG)as^@#xk1P -zMyU$VorzFC*;*i>rF!Atlge}tOT -z7p4@tOPo#K-Dw{Xgw;z|CpfNB0j4IG$I36>DYFusq7C^2M!pHEtm#k$^8};a)NSHc -z<3fqFg9=R&`+(32Jm1m}0#@wi885oE^Y -zs-GbIh2|QjWEs`qetUrT&MgrZQ8z%qoSHB4e}8vP{W;=`S)w=NDs}B-`Fm7A;B6)x -z!Ep-P-uOFj$R_tdc6u@3;h$|KY0OGl%+B~y$Fk6PToXX-E(mOQ*; -z3KRjipn#phT@tg=H}k%aJ=WSz0YT9UM6T}d&|(%s`xof1Eg%aWl>#CgN>b5LXfZnh -zEf1>yhf;OPdTLa(A4=rMsQ=i)stb>Zy8)`wfu!bRHbUO;Wd+w$kL|eNp27m+Jn85k -zh~~{|e>dwFbd5O+?MF4xxAzyr`|L2{dq#^+H3hwC&3N!&#W8&UBvR?`=tDx1LeyT~ -ziyio9H?X}XY(d6?IbuKofwv0dkEwB7UTt;kr7F#t=P!@hFyf@M(7pfspEl$dBi4J+ -z_Cc@X82S0Xx`6c&1ih=1{m|>tjQr>{UvMlUYRvtS8`$68Dfr -ztc2G0ELmsq;HC6jlgLDJZ=*g87BOyXbl -z&7N%?P3WlBgb)=)vV{GMq6=)^g!J(Bz-;uJB&wP2#|_!&DI#qrYn05lglvEtoq*4w -zbJL~>7Gyj7%4c8h16*|M46$C{*$9Q7-roW51ur0__uK2SGk|p@xiWG^F0lU#Qsw0H -zTebQ%=C+s_+rK|@K>e&#ZP0jh%sQ!vU7ZzenAP;xr%fB&x@nPVMT%bx88R(@7=hBJ -zI)GGbhM1*Tk{I4Of!zQpk#gabU=qVuU#dXI?tS|(C27UM&~C!cwGTcn~baLpFHIJ?at$fHZ00loS`X*@du6HP6Z1dXzxbkS(P8i~vMW -z43mWxA^PcgDix>te*EnqeFI12TBZBvGy7OI9knJZ@Cd>)4(-NVuVU2M46&a8bK`1P -zumdr9rj3~ba;gX#!1pXmcDxcg%76`p! -za&w0dqo62>VSOeJ<^tnJ<7_`e-|=IH54+XCEClKn_xR_&RLdvmyQ>&peTsUb`YH^d -zF>O8tgQ$Upc_l%mCC_kb7F!OK*(CLDF}6ZD|4aPSA~?+ -zN6p5e_Uu~f92$`E0{mc4CW_(J-`ZiUpRnE`0V%tePh&ey_%e -zTDv{fEwH1xpiex)efQG%Fu(b$w=o>R>p!ixRw1u-Wh5T@!G=2x_O=Yq> -zjj9x)uQJ^~uS@hRFkvQUaCscRwV@htMPdc|p)+$~ -zMk1s`%Zne3J8I;=??JhNQI3yvqE%~ed!LaXUNPalbNtV^)+7qhtk^{xvPGRlL|jdt -zx$vil$|gRa+fr%g;x&9XLF>UbF@yQ{kAG+z(o|`uVt3kSjGBG(y5ZB;n6?I>o|-Jh -ze)Mr-2Gz8#2VXVxDe?})jIsZ67N@BkkTukQ0<_*OwPGiiW!a*1*X%XzfldYbipFYe -zyJV5vuXI+D3}*`&6bHZy`o#f=?zdHA?||V?jhs(3gK8dJgA68_fD)HzZh@$hXL_&BCRNxAFO3D=%pc&S3bTYUiYC#$Qm4!=kKN0%+^&zvqoF>IhOLCy!q*ib(Hxv-gVagp#D2OQqX_$|Ktrc$Hld(nBhT-MAR~GM55%wkT2RVrm7e3-9zggJS2S -zs3Dn3wYb$w&F2nkl6I%%##}DY_(c;-2%3uRFNZ`IXjda45o -zQ_MiSDd{T_&BV4Kx?M8%>*$1bpz7A4Z8hchA%mv2=aILK$OcGWIqdp#8d~V6c+*?W -zNuL8B$<&ACGX{4943fdqta$v5?2>3HSgZA}s;Ik*aSR#61L0?jsi+tUR60~}6<&UY -z=cAIz_PC;=Z)rC%Rtgc6*8MLSbed-DW6JEEK$qFSJX_xw`S5kU+LM#5^Rp$rtk~I&9x9%Hf`C -zKHO;5H{oFiv6PoQ)8mg1!+;X0V_j!@M&J9xOm1bv^Ne4>ELm7F`gWxTXT8`p`-L&F -z4@}rT#)OWD1w -zYAdSgOkfNF;Rie02bCkZW}`o-+XFG4($OEDo=SgU!SgR%-O?WuEHK7n7@Y!m6e)^R -zl_t>z54i6x%N5>&?$M(f7?Ih)Cu>NK1kHQ|O-+D83NQZSpuXEW%HK_L%Ets`Q4KJ> -zM|*LWZJ;r5+mDb -zzjB}!pTTrNtM1ksIVeGFs=-Sp)ZxB>yzlgR{XNzuP>qlY_Qu}1g1 -zfuRnCpEvu_=BS*X68oGH!QOa?;c)VHTEQ!C_W2dgoMfQGRZ}R9*yJdYT#S+G}_j~N{uZ66YV&j3^7&NY9@>{D45>iICh^vBslQ&mzm -zHm%ho|J|vY{5A#Gw$~Avhj%`^R?sn`teT^QKruqpP6-7I`;!jmD0W?4LgdrK7UltA -zVek!;nlbFINc&dPHFgpNz4b?E;V=@k`d;mY?3B;LB9%W&3q8z0uInagyO=z%O%wGN -z*`d_iMWASl5^1qLJv0<@2d)3|U>17#<=k0mRH!b$(uS4iJb~lxPCEMCp+?pN?j~pK -zy=Lk0T^*X72Q=$Z82Yjo8aMoYt~v}}n~(1N?>1Gi-28FKexP<@Shn(JqCzp8s5mrR -zD^%lY0HTc{n_gd3lFglxr>z^(*LEiT! -z={Pcj{u&w?yUfqErskfE_ghSzbo+q^)G{U7%Qa2&Tf|e|D0h}=hA#}1S$!T&7l2M# -z9AaC4?s`UXdG_f4;yaO8cJ~kx*BtTpT^MydrN_0T>h*0#Epr>17}2EFvpudARXZ^b -zi+>2_S39MTOP+_cIwT*%*al7N;QL&Ei9UJzo#c3C7ZTYZGcPB;%@|Bp3jV_{EYii@ -zwbO}WR5|+P2R_2kD?Tky+nm}pb--L5r{8f2{(Gtzvh%7@=FRZD%sSuF8Xt}P>?DWI -z1;ojAZzn}%Xs{ru#eqWkiHklR*5Y#RZy_CTWaek@ohl!zI+l=IM@pG@-s_^sL`}sT -zK}^CgjL>FZW$wLJA)S`RJIMr+x$Ym$FuR8Oa=v`&isZhS)TGyjl95Tw%E~H>2LTJY -ziwn_^hUKP>$S;%gYP8ECHCz{WWP02F+h0}FvVT1Oay(9P|4)>2)V*`<$er+WjpwiN -z9^`aM5*}Apw+>BmgB)o=-)kXGk#BE^r1i_^zEhZfGvPh5&oXhzEg`TmA@ -zVw$wITj#G8XnXqxtUcV?__g_E1RRU#O+HbEE%X(CS?OFFq-o?m0Yi`?1fpAa -ziw5w#b@0NSwr6wmDrNi)!5%x-OBqbkV~HzreVlQZ6mPFkuDl=_&%n^OTpE3{D)LSH -z?~Wjw?#1iK+^4?&Kmz2OH%CI&@S4!^%Uf0LCSQ(!(BSWrm|3q~sfJ8gia*_FVamjq -zR#}^gvKNYeICn=4iDR9Y00Kw1{B*PotfWfMvZ>!DEGttb%8eixKX&3q5Qsby_*Yse -zjmA~92pG!g_N$W|W5;^Gj*BP)F1tRYBlono^HZIzZU*mi+>RKC*W+BGC|>DnoI6s= -zrM>6xKVHG{D=>VWX|Mg=oq>f?cPcrkiTrI>U#+yvp#mD@AlpL=#GOH&dTG9{JN`kT -z{22qObiw^Q>EesZFw^<_SxU@?Zb_5h>HwZ?N@&a_%u(j8Djip_eW57*(5?3qlPaf? -z@=ng|pI%fJoIq8d#K!uevJr4KO)dNh8?BQ%seQU9l_s4=r3Ccv}wwwcDK^VDsh7)TIbnpFA -z&aMWGzdd%l+jM)k`HP1%^?VAp+mZX)Tr6}pIzlx$X!r+fh!g;H2?(=5HH@C1I0;SW* -z>5FfqtPJDz!^vjD)W_<0*bGv~>f`Ho4`^?0RDWpWdcX1G{60d?^INUGTFsdA=`u{W -z(Gq8-K)IJ3d1hA=WaG)a=GohmVF!C6))uAqr0efr?`Ac?b#^GFvMlwxxayPRKQ{qv -zYiL}+dxOt|fpNx)Tmk_zR`%I8E!C@d!G{$mlt -zjy<_3kmy97eTA;su%J;J?A$(ND#Xhll75pLrU3R#Z#`9zl}<2_BnZwtxaab1{hQ*+ -zOc3M<)6tz`sJ`?gDWAQoyvkfFIV;F%le(+@T4A4m35bqW!!Qy+*_-RkrM}0?{#E>m*kF;f -zi4LpGNKkoGLq`WY&AC|C)PbcM-!9mBCCaJMHQe+X_(I9}z+Z8_R5GPxVdO7Qgjqfa?7b^1l*TKYEJ%=$(VvaeOc>?&6MBk`HS -zES&?As$`LIil2Y0?4DF#=B?tc41>XHoX3P)0`^3`RaH3}IB=EKjhxC7aLjq5(_kzs -zwy@~|Z3(S{3z@7c3cBhbRuCd!+;);vmR$8EpG;$@e(y(!t>`2wI8ZHOb_E0=yVe-g -z@N2wn@O)lIJIXC3^F&A%LwjI%FWv`W+VE+K4J*fpmR* -zKisioWA`Mw;}2|DQwC_4jkYKiHp^7Oatxm;=*-P9)XKi%U4IgAHTNOHc>9=T{SktN -z!SI~~CfXU9nU$~gv!}r2sDoAtb!u*MG_EuGb5EPEr&DPgYE#$OEjj6vYX|^wJ%UUs -z1U|_N*YP)*lZ#!Q{?}ptZi9;3RM8hcHpu-;YCX}o;Qh@<&d}JXvy8Vdy##fzE`(J5 -z$P9TVsZst=*(=hM<|g$tF5vWz?ac8*taS}9Uo3%RNXfm#!}RTQ6e<$#TCIvJvKV%C -zT1K_E+RRw>DinX%a=Gf;2uhdZx|J>(dtHMx(EBN|>Fr{jP4YsbLK5*;?4l@Ve15NY -z1HK+4puU&gRTUQ=59DvD`tGUvxAaB^~* -zUg0z=e{Lp`QB;2AgB_Er>mu?3Z~T`-d^Z4~CqoR4sEh@nK2_m_d9p4!Rhp%eA3h37 -z`ri1T<;^?Fw_>b@jc=$&=(9zA`V*pC_}2JMxouM+#BZ^M)(gL2ou>}T1 -z+U_(vcbbBaW_kju{DOv>-Zg@W3a_&Cae2wlhAxu~yb|Q{#4j>f&p0vKs!ByG4HjEU -z{6~Cxuj%9aX`Rni!&3emNSX3FjAFxOOsQ&*(vwp8aYWdTUyHDWmwBsjQU0?yLNhol -zw!+J{EkeoN-Myn~*0?9{vBK<;cICp?JU;WLT|bMDC31?9;iH1Tl?(frYqlvZVzVvI -zaC!$Wy0@%lzM- -z{RxyA?Pvbq)K&S{_JEL9*jt%fAhJuu0*FbN0TyYIR-Tz{t|urG!W)4$-^#C0`K`<<4A8a+j;hh -z8wB8jSN!OmZ#RMIm`_@f7r38vB5(Gj*{cCOU6|&%S8p@IEe)pT?;E|U;qxr>Si5NA -z9L0#&=0fX?$tFnNhLv0ijbis)XR@UWMP7*~h;3$+?oZ=R1NCy>)y&8L{K?A5bnbiD -z=0|5jnOQ~+ft3A$?j%o({=`+|)qB99EE`u_8!$LLd^;5Y3_c9ORW?H)i7&^OYmIFO -za{o*)o#eqJblxgukEJP1&tKE*>H=h%A)&fAD-0lsuA+f?{gYbo*^9TIf6bMMKH}#2 -zoy?qC1+k?!vXHtiANS-a94PLfE4m$a^5V$L;}SamJ#Ks@<43)1kdyr9lAud&`SZ*; -z9IOLrDv_T1z_WQmW9I0~WXgIuX-IN?`bFb&_ejn@!yCP+wuvCwXBKh^2}wl_HBQNN -znJAPdThr>U!Hw~x6Uu?CZPN+GKuQq>r*UzrsU7x9X6=)aDfYd-wtJg_$=2c&^1X7U -zfptIvn^59~=Kvz_opZfl`p6vn|;kv(0Mi|%Dw|AUResXn39Cqe3@iFD1Brb26B_N>Ka*Kx!EJg -z|AZW>U`bB`nNH2qK51#3bbM`|x=wSgQcP^qM74Gs+()H7x=5h8z&lJ+Z1XVBPL&x| -zXkLEnN@ + #include + #include ++#include + + #define UPDATE_BUTTON_PROPERTY( name, value ) \ + do \ +@@ -220,7 +222,7 @@ ViewManager::onInitComplete() + m_steps.first()->onActivate(); + } + +- emit currentStepChanged(); ++ emit currentStepChanged(m_currentStep); + } + + void +@@ -368,7 +370,7 @@ ViewManager::next() + { + m_steps.at( m_currentStep )->onActivate(); + executing = qobject_cast< ExecutionViewStep* >( m_steps.at( m_currentStep ) ) != nullptr; +- emit currentStepChanged(); ++ emit currentStepChanged(m_currentStep); + } + else + { +@@ -466,7 +468,7 @@ ViewManager::back() + m_stack->setCurrentIndex( m_currentStep ); + step->onLeave(); + m_steps.at( m_currentStep )->onActivate(); +- emit currentStepChanged(); ++ emit currentStepChanged(m_currentStep); + } + else if ( !step->isAtBeginning() ) + { +@@ -486,6 +488,20 @@ ViewManager::back() + updateButtonLabels(); + } + ++void ++ViewManager::restartInstallation() ++{ ++ QString restartNowCommand = QStringLiteral( "shutdown -r now" ); ++ QProcess::execute( "/bin/sh", { "-c", restartNowCommand } ); ++} ++ ++void ++ViewManager::startDebugTerminal() ++{ ++ //QProcess::startDetached("/bin/bash", QStringList()); ++ QApplication::quit(); ++} ++ + void + ViewManager::quit() + { +@@ -524,13 +540,33 @@ ViewManager::confirmCancelInstallation() + QString title = settings->isSetupMode() ? tr( "Cancel Setup?", "@title" ) : tr( "Cancel Installation?", "@title" ); + QString question = settings->isSetupMode() ? tr( "Do you really want to cancel the current setup process?\n" + "The setup program will quit and all changes will be lost." ) +- : tr( "Do you really want to cancel the current install process?\n" +- "The installer will quit and all changes will be lost." ); +- QMessageBox mb( QMessageBox::Question, title, question, QMessageBox::Yes | QMessageBox::No, m_widget ); +- mb.setDefaultButton( QMessageBox::No ); ++ : tr( "Do you really want to cancel the current installation process?\n" ++ "The system will reboot or you can enter the debug mode for further investigation." ); ++ QMessageBox mb( QMessageBox::Question, title, question, QMessageBox::NoButton, m_widget ); ++ QPushButton* rebootButton = mb.addButton( tr( "&Reboot", "@button" ), QMessageBox::ActionRole ); ++ QPushButton* debugButton = mb.addButton( tr( "&Try Now", "@button" ), QMessageBox::ActionRole ); ++ QPushButton* cancelButton = mb.addButton( QMessageBox::Cancel ); ++ mb.setIconPixmap( ++ Calamares::defaultPixmap( Calamares::BigLogo,//Biglogo.svgz ++ Calamares::Original, ++ QSize( 321/5, 297/5 ) )); ++ mb.setDefaultButton( cancelButton ); ++ mb.setWindowFlags(Qt::FramelessWindowHint | Qt::Dialog); + Calamares::fixButtonLabels( &mb ); +- int response = mb.exec(); +- return response == QMessageBox::Yes; ++ ++ mb.exec(); ++ ++ if ( mb.clickedButton() == rebootButton ) ++ { ++ restartInstallation(); ++ return false; ++ } ++ else if ( mb.clickedButton() == debugButton ) ++ { ++ startDebugTerminal(); ++ return true; ++ } ++ return false; + } + + void +diff --git a/src/libcalamaresui/ViewManager.h b/src/libcalamaresui/ViewManager.h +index 5a449a1..da9e9bd 100644 +--- a/src/libcalamaresui/ViewManager.h ++++ b/src/libcalamaresui/ViewManager.h +@@ -87,6 +87,9 @@ public: + */ + ViewStepList viewSteps() const; + ++ void restartInstallation(); ++ void startDebugTerminal(); ++ + /** + * @brief currentStep returns the currently active ViewStep, i.e. the ViewStep + * which owns the currently visible view page. +@@ -213,7 +216,7 @@ public Q_SLOTS: + QString logFilePath() const; + + signals: +- void currentStepChanged(); ++ void currentStepChanged(int m_currentStep); + void ensureSize( QSize size ) const; // See ViewStep::ensureSize() + void cancelEnabled( bool enabled ) const; + +diff --git a/src/libcalamaresui/libcalamaresui.qrc b/src/libcalamaresui/libcalamaresui.qrc +index 62a7df2..ddb197d 100644 +--- a/src/libcalamaresui/libcalamaresui.qrc ++++ b/src/libcalamaresui/libcalamaresui.qrc +@@ -24,5 +24,7 @@ + ../../data/images/state-ok.svg + ../../data/images/state-warning.svg + ../../data/images/state-error.svg ++ ../../data/images/Biglogo.svg ++ ../../data/images/Biglogo.svgz + + +diff --git a/src/libcalamaresui/utils/Gui.cpp b/src/libcalamaresui/utils/Gui.cpp +index 57f67ae..3915cb7 100644 +--- a/src/libcalamaresui/utils/Gui.cpp ++++ b/src/libcalamaresui/utils/Gui.cpp +@@ -101,7 +101,7 @@ defaultPixmap( ImageType type, ImageMode mode, const QSize& size ) + break; + + case Squid: +- pixmap = ImageRegistry::instance()->pixmap( RESPATH "images/squid.svg", size ); ++ pixmap = ImageRegistry::instance()->pixmap( RESPATH "images/Biglogo.svg", size ); + break; + + case StatusOk: +@@ -115,6 +115,10 @@ defaultPixmap( ImageType type, ImageMode mode, const QSize& size ) + case StatusError: + pixmap = ImageRegistry::instance()->pixmap( RESPATH "images/state-error.svg", size ); + break; ++ ++ case BigLogo: ++ pixmap = ImageRegistry::instance()->pixmap( RESPATH "images/Biglogo.svgz", size ); ++ break; + } + + if ( pixmap.isNull() ) +diff --git a/src/libcalamaresui/utils/Gui.h b/src/libcalamaresui/utils/Gui.h +index 1264bc1..947be64 100644 +--- a/src/libcalamaresui/utils/Gui.h ++++ b/src/libcalamaresui/utils/Gui.h +@@ -50,7 +50,8 @@ enum ImageType : int + Squid, + StatusOk, // Icons for the requirements checker + StatusWarning, +- StatusError ++ StatusError, ++ BigLogo + }; + + /** +@@ -94,7 +95,7 @@ UIDLLEXPORT QSize defaultIconSize(); + */ + constexpr int windowMinimumWidth = 800; + constexpr int windowMinimumHeight = 520; +-constexpr int windowPreferredWidth = 1024; ++constexpr int windowPreferredWidth = 912; + constexpr int windowPreferredHeight = 520; + + } // namespace Calamares +diff --git a/src/libcalamaresui/viewpages/ExecutionViewStep.cpp b/src/libcalamaresui/viewpages/ExecutionViewStep.cpp +index 71ea85b..c34d308 100644 +--- a/src/libcalamaresui/viewpages/ExecutionViewStep.cpp ++++ b/src/libcalamaresui/viewpages/ExecutionViewStep.cpp +@@ -38,6 +38,7 @@ + #include + #include + #include ++#include + + static Calamares::Slideshow* + makeSlideshow( QWidget* parent ) +@@ -101,7 +102,7 @@ ExecutionViewStep::ExecutionViewStep( QObject* parent ) + Branding::instance()->image( + { "utilities-log-viewer", "utilities-terminal", "text-x-log", "text-x-changelog", "preferences-log" }, + QSize( 32, 32 ) ), +- "Toggle log" ); ++ QCoreApplication::translate("Calamares::ExecutionViewStep","Toggle log" ) ); + auto toggleLogButton = dynamic_cast< QToolButton* >( toolBar->widgetForAction( toggleLogAction ) ); + connect( toggleLogButton, &QToolButton::clicked, this, &ExecutionViewStep::toggleLog ); + -- -2.46.0 +2.43.0 diff --git a/0006-modules-file.patch b/0006-modules-file.patch index fd74598..d7473ea 100644 --- a/0006-modules-file.patch +++ b/0006-modules-file.patch @@ -1,120 +1,60 @@ -From 80f4857847a58070aa1f96b08b4a084d7747ed38 Mon Sep 17 00:00:00 2001 -From: lizixin <2271170409@qq.com> -Date: Fri, 27 Dec 2024 12:22:58 +0800 -Subject: [PATCH 5/8] modules patch +From 572a273a33d05cb2811df32bccd361e3b99a7c61 Mon Sep 17 00:00:00 2001 +From: cui-gaoleng <562344211@qq.com> +Date: Fri, 8 Nov 2024 02:44:45 +0800 +Subject: [PATCH 4/4] modules Commit without .png, .svg, and .svgz files --- src/modules/bootloader/bootloader.conf | 8 +- src/modules/bootloader/main.py | 45 +- - .../ContextualProcessJob.cpp | 37 +- - src/modules/displaymanager/main.py | 10 + - src/modules/dracut/dracut.conf | 4 - - src/modules/dracut/dracut.schema.yaml | 1 - - src/modules/dracut/main.py | 16 +- - src/modules/finished/FinishedPage.cpp | 6 +- + src/modules/fstab/main.py | 0 src/modules/initcpiocfg/initcpiocfg.conf | 2 +- - .../initcpiocfg/initcpiocfg.schema.yaml | 6 +- - src/modules/keyboard/Config.cpp | 185 ++--- - src/modules/keyboard/Config.h | 23 +- + src/modules/initramfscfg/encrypt_hook | 0 + src/modules/initramfscfg/encrypt_hook_nokey | 0 src/modules/keyboard/KeyboardPage.cpp | 39 +- src/modules/keyboard/KeyboardPage.ui | 4 +- - src/modules/keyboard/SetKeyboardLayoutJob.cpp | 2 +- - src/modules/keyboard/keyboard.conf | 12 - - src/modules/keyboard/keyboard.schema.yaml | 5 - - src/modules/locale/Config.cpp | 65 +- + src/modules/locale/Config.cpp | 14 + src/modules/locale/Config.h | 4 + src/modules/locale/LocalePage.cpp | 54 +- src/modules/locale/LocalePage.h | 1 + src/modules/locale/SetTimezoneJob.cpp | 4 + - src/modules/locale/Tests.cpp | 4 +- src/modules/locale/locale.conf | 6 +- src/modules/localeq/localeq.conf | 2 +- - src/modules/mount/main.py | 5 +- src/modules/mount/mount.conf | 9 + - src/modules/netinstall/PackageModel.cpp | 2 +- - src/modules/netinstall/netinstall.schema.yaml | 4 + src/modules/packagechooser/Config.cpp | 2 +- .../packagechooser/PackageChooserPage.cpp | 24 +- - src/modules/packagechooser/PackageModel.cpp | 4 +- - .../packagechooser/packagechooser.conf | 43 +- - src/modules/packagechooser/packagechooser.qrc | 3 +- - src/modules/packages/main.py | 190 +++-- - src/modules/packages/module.desc | 1 + - src/modules/packages/packages.conf | 35 +- - src/modules/partition/CMakeLists.txt | 1 - - src/modules/partition/Config.cpp | 6 - - src/modules/partition/Config.h | 5 - - src/modules/partition/PartitionViewStep.cpp | 240 +----- - src/modules/partition/PartitionViewStep.h | 15 - - src/modules/partition/core/DeviceList.cpp | 23 +- - src/modules/partition/core/KPMHelpers.h | 13 - - src/modules/partition/core/PartUtils.cpp | 2 + - .../partition/core/PartitionActions.cpp | 10 +- - src/modules/partition/core/PartitionActions.h | 8 +- - .../partition/core/PartitionCoreModule.cpp | 2 +- - .../partition/core/PartitionCoreModule.h | 5 - - .../partition/core/PartitionLayout.cpp | 8 +- + .../packagechooser/packagechooser.conf | 41 +- + src/modules/packagechooser/packagechooser.qrc | 6 + + src/modules/packages/main.py | 132 +++- + src/modules/packages/packages.conf | 37 +- + src/modules/partition/PartitionViewStep.cpp | 3 +- src/modules/partition/gui/BootInfoWidget.cpp | 10 +- - src/modules/partition/gui/ChoicePage.cpp | 229 +++--- - src/modules/partition/gui/ChoicePage.h | 4 - - .../partition/gui/CreatePartitionDialog.cpp | 33 +- - .../partition/gui/CreatePartitionDialog.h | 12 +- - .../partition/gui/DeviceInfoWidget.cpp | 21 +- - .../gui/EditExistingPartitionDialog.cpp | 13 +- - .../gui/EditExistingPartitionDialog.h | 4 +- - src/modules/partition/gui/EncryptWidget.cpp | 19 +- - src/modules/partition/gui/EncryptWidget.h | 6 +- - .../partition/gui/PartitionDialogHelpers.cpp | 57 +- - .../partition/gui/PartitionDialogHelpers.h | 11 +- - src/modules/partition/gui/PartitionPage.cpp | 29 +- - src/modules/partition/gui/PartitionPage.h | 3 +- - src/modules/partition/gui/PartitionPage.ui | 64 +- - src/modules/partition/jobs/ClearMountsJob.cpp | 55 +- - .../partition/jobs/ClearTempMountsJob.cpp | 2 +- - src/modules/partition/partition.conf | 60 +- - src/modules/partition/partition.schema.yaml | 7 - - .../partition/tests/CreateLayoutsTests.cpp | 27 +- - src/modules/plasmalnf/CMakeLists.txt | 2 +- - src/modules/preservefiles/PreserveFiles.cpp | 2 +- - src/modules/shellprocess/ShellProcessJob.cpp | 2 - - src/modules/shellprocess/Tests.cpp | 2 +- - src/modules/shellprocess/shellprocess.conf | 35 +- - .../shellprocess/shellprocess.schema.yaml | 10 +- + src/modules/partition/gui/ChoicePage.cpp | 10 +- + .../partition/gui/DeviceInfoWidget.cpp | 13 +- + src/modules/partition/gui/EncryptWidget.cpp | 2 +- src/modules/summary/SummaryPage.cpp | 9 +- - src/modules/tracking/TrackingPage.cpp | 7 +- - src/modules/umount/UmountJob.cpp | 38 +- - src/modules/unpackfs/main.py | 144 ++-- - src/modules/unpackfs/unpackfs.conf | 40 +- - src/modules/unpackfs/unpackfs.schema.yaml | 5 - - src/modules/users/Config.cpp | 41 - - src/modules/users/Config.h | 5 - - src/modules/users/CreateUserJob.cpp | 29 +- - src/modules/users/SetPasswordJob.cpp | 2 +- - src/modules/users/TestPasswordJob.cpp | 6 +- - src/modules/users/Tests.cpp | 71 -- - src/modules/users/UsersPage.cpp | 112 ++- - src/modules/users/UsersPage.h | 15 + + src/modules/umount/UmountJob.cpp | 23 + + src/modules/unpackfs/main.py | 82 +- + src/modules/unpackfs/unpackfs.conf | 12 +- + src/modules/users/UsersPage.cpp | 2 +- src/modules/users/page_usersetup.bak.ui | 710 ++++++++++++++++++ src/modules/users/page_usersetup.ui | 158 ++-- - src/modules/users/users.conf | 14 +- - src/modules/users/users.schema.yaml | 1 - - src/modules/welcome/Config.cpp | 20 +- + src/modules/users/users.conf | 2 +- + src/modules/welcome/Config.cpp | 3 +- src/modules/welcome/WelcomePage.cpp | 143 ++-- src/modules/welcome/WelcomePage.ui | 73 +- - .../welcome/checker/CheckerContainer.cpp | 2 +- - .../welcome/checker/GeneralRequirements.cpp | 2 +- - .../welcome/checker/ResultDelegate.cpp | 2 +- - .../welcome/checker/ResultsListWidget.cpp | 22 +- + .../welcome/checker/ResultsListWidget.cpp | 20 +- src/modules/welcome/welcome.conf | 6 +- - src/modules/welcome/welcome.qrc | 9 +- - src/modules/welcomeq/img/squid.png | Bin 8313 -> 17377 bytes + src/modules/welcome/welcome.qrc | 10 +- src/modules/welcomeq/welcomeq.conf | 2 +- - src/modules/zfs/ZfsJob.cpp | 6 +- - 106 files changed, 2054 insertions(+), 1564 deletions(-) + 43 files changed, 1392 insertions(+), 340 deletions(-) + mode change 100755 => 100644 src/modules/fstab/main.py + mode change 100755 => 100644 src/modules/initramfscfg/encrypt_hook + mode change 100755 => 100644 src/modules/initramfscfg/encrypt_hook_nokey create mode 100644 src/modules/users/page_usersetup.bak.ui + diff --git a/src/modules/bootloader/bootloader.conf b/src/modules/bootloader/bootloader.conf -index 9679f6696..acaf424b5 100644 +index 9679f66..acaf424 100644 --- a/src/modules/bootloader/bootloader.conf +++ b/src/modules/bootloader/bootloader.conf @@ -41,10 +41,10 @@ kernelParams: [ "quiet" ] @@ -133,7 +73,7 @@ index 9679f6696..acaf424b5 100644 # Optionally set the bootloader ID to use for EFI. This is passed to diff --git a/src/modules/bootloader/main.py b/src/modules/bootloader/main.py -index 0a9e96598..570fc8797 100644 +index 0a9e965..570fc87 100644 --- a/src/modules/bootloader/main.py +++ b/src/modules/bootloader/main.py @@ -25,7 +25,7 @@ import os @@ -223,164 +163,11 @@ index 0a9e96598..570fc8797 100644 else: assert efi_directory is None if libcalamares.globalstorage.value("bootLoader") is None: -diff --git a/src/modules/contextualprocess/ContextualProcessJob.cpp b/src/modules/contextualprocess/ContextualProcessJob.cpp -index 9b34db42f..30d57947e 100644 ---- a/src/modules/contextualprocess/ContextualProcessJob.cpp -+++ b/src/modules/contextualprocess/ContextualProcessJob.cpp -@@ -58,18 +58,45 @@ ContextualProcessBinding::run( const QString& value ) const - return Calamares::JobResult::ok(); - } - -+///@brief Implementation of fetch() for recursively looking up dotted selector parts. -+static bool -+fetch( QString& value, QStringList& selector, int index, const QVariant& v ) -+{ -+ if ( !v.canConvert< QVariantMap >() ) -+ { -+ return false; -+ } -+ const QVariantMap map = v.toMap(); -+ const QString& key = selector.at( index ); -+ if ( index == selector.length() - 1 ) -+ { -+ value = map.value( key ).toString(); -+ return map.contains( key ); -+ } -+ else -+ { -+ return fetch( value, selector, index + 1, map.value( key ) ); -+ } -+} -+ - bool - ContextualProcessBinding::fetch( Calamares::GlobalStorage* storage, QString& value ) const - { - value.clear(); -- bool ok = false; -- const auto v = Calamares::lookup( storage, m_variable, ok ); -- if ( !ok ) -+ if ( !storage ) - { - return false; - } -- value = v.toString(); -- return true; -+ if ( m_variable.contains( '.' ) ) -+ { -+ QStringList steps = m_variable.split( '.' ); -+ return ::fetch( value, steps, 1, storage->value( steps.first() ) ); -+ } -+ else -+ { -+ value = storage->value( m_variable ).toString(); -+ return storage->contains( m_variable ); -+ } - } - - ContextualProcessJob::ContextualProcessJob( QObject* parent ) -diff --git a/src/modules/displaymanager/main.py b/src/modules/displaymanager/main.py -index 6ca279e18..02fec0f6e 100644 ---- a/src/modules/displaymanager/main.py -+++ b/src/modules/displaymanager/main.py -@@ -410,6 +410,11 @@ class DMgdm(DisplayManager): - if self.config is None: - raise ValueError( "No config file for GDM has been set." ) - -+ -+ libcalamares.utils.target_env_call( -+ ['hostnamectl', 'set-hostname', username] -+ ) -+ - # Systems with GDM as Desktop Manager - gdm_conf_path = os.path.join(self.root_mount_point, self.config) - -@@ -571,6 +576,11 @@ class DMlightdm(DisplayManager): - # Ideally, we should use configparser for the ini conf file, - # but we just do a simple text replacement for now, as it - # worksforme(tm) -+ -+ libcalamares.utils.target_env_call( -+ ['hostnamectl', 'set-hostname', username] -+ ) -+ - lightdm_conf_path = os.path.join( - self.root_mount_point, "etc/lightdm/lightdm.conf" - ) -diff --git a/src/modules/dracut/dracut.conf b/src/modules/dracut/dracut.conf -index 190933bcd..ba1a7b08c 100644 ---- a/src/modules/dracut/dracut.conf -+++ b/src/modules/dracut/dracut.conf -@@ -8,7 +8,3 @@ - # set a custom name, including the path - # - initramfsName: /boot/initramfs-freebsd.img -- --# Optional: define a list of strings to be passed as arguments to Dracut --# By default, -f is always included --options: [ "-f" ] -diff --git a/src/modules/dracut/dracut.schema.yaml b/src/modules/dracut/dracut.schema.yaml -index de1114ccc..d6008e1bf 100644 ---- a/src/modules/dracut/dracut.schema.yaml -+++ b/src/modules/dracut/dracut.schema.yaml -@@ -7,4 +7,3 @@ additionalProperties: false - type: object - properties: - initramfsName: { type: string } -- options: { type: array, items: { type: string } } -diff --git a/src/modules/dracut/main.py b/src/modules/dracut/main.py -index 9e2bc318f..85e6f3e7f 100644 ---- a/src/modules/dracut/main.py -+++ b/src/modules/dracut/main.py -@@ -35,15 +35,15 @@ def run_dracut(): - - :return: - """ -- # Fetch the job configuration -- initramfs_name = libcalamares.job.configuration.get('initramfsName', None) -- dracut_options = libcalamares.job.configuration.get('options', ['-f']) -- -- if initramfs_name: -- dracut_options.append(initramfs_name) -- - try: -- target_env_process_output(['dracut'] + dracut_options) -+ initramfs_name = libcalamares.job.configuration['initramfsName'] -+ target_env_process_output(['dracut', '-f', initramfs_name]) -+ except KeyError: -+ try: -+ target_env_process_output(['dracut', '-f']) -+ except subprocess.CalledProcessError as cpe: -+ libcalamares.utils.warning(f"Dracut failed with output: {cpe.output}") -+ return cpe.returncode - except subprocess.CalledProcessError as cpe: - libcalamares.utils.warning(f"Dracut failed with output: {cpe.output}") - return cpe.returncode -diff --git a/src/modules/finished/FinishedPage.cpp b/src/modules/finished/FinishedPage.cpp -index a31595f91..51be52678 100644 ---- a/src/modules/finished/FinishedPage.cpp -+++ b/src/modules/finished/FinishedPage.cpp -@@ -16,7 +16,6 @@ - - #include "Branding.h" - #include "Settings.h" --#include "compat/CheckBox.h" - #include "utils/Retranslator.h" - - #include -@@ -43,9 +42,8 @@ FinishedPage::FinishedPage( Config* config, QWidget* parent ) - } ); - connect( config, &Config::restartNowWantedChanged, ui->restartCheckBox, &QCheckBox::setChecked ); - connect( ui->restartCheckBox, -- Calamares::checkBoxStateChangedSignal, -- [ config ]( Calamares::checkBoxStateType state ) -- { config->setRestartNowWanted( state != Calamares::checkBoxUncheckedValue ); } ); -+ &QCheckBox::stateChanged, -+ [ config ]( int state ) { config->setRestartNowWanted( state != 0 ); } ); - - CALAMARES_RETRANSLATE_SLOT( &FinishedPage::retranslate ); - } +diff --git a/src/modules/fstab/main.py b/src/modules/fstab/main.py +old mode 100755 +new mode 100644 diff --git a/src/modules/initcpiocfg/initcpiocfg.conf b/src/modules/initcpiocfg/initcpiocfg.conf -index a66039397..549157c13 100644 +index a660393..549157c 100644 --- a/src/modules/initcpiocfg/initcpiocfg.conf +++ b/src/modules/initcpiocfg/initcpiocfg.conf @@ -35,4 +35,4 @@ hooks: @@ -389,395 +176,14 @@ index a66039397..549157c13 100644 # -source: "/etc/mkinitcpio.conf" +source: "/etc/dracut.conf" -diff --git a/src/modules/initcpiocfg/initcpiocfg.schema.yaml b/src/modules/initcpiocfg/initcpiocfg.schema.yaml -index ddbe43b7f..5595b6093 100644 ---- a/src/modules/initcpiocfg/initcpiocfg.schema.yaml -+++ b/src/modules/initcpiocfg/initcpiocfg.schema.yaml -@@ -11,7 +11,7 @@ properties: - type: object - additionalProperties: false - properties: -- prepend: { type: array, items: { type: string } } -- append: { type: array, items: { type: string } } -- remove: { type: array, items: { type: string } } -+ prepend: { type: array, items: string } -+ append: { type: array, items: string } -+ remove: { type: array, items: string } - source: { type: string } -diff --git a/src/modules/keyboard/Config.cpp b/src/modules/keyboard/Config.cpp -index 54ee7649c..ad6bee6f7 100644 ---- a/src/modules/keyboard/Config.cpp -+++ b/src/modules/keyboard/Config.cpp -@@ -11,6 +11,7 @@ - #include "Config.h" - - #include "SetKeyboardLayoutJob.h" -+#include "keyboardwidget/keyboardpreview.h" - - #include "GlobalStorage.h" - #include "JobQueue.h" -@@ -26,7 +27,6 @@ - #include - #include - #include --#include - #include - - #include -@@ -36,7 +36,7 @@ - /* Returns stringlist with suitable setxkbmap command-line arguments - * to set the given @p model. - */ --static QStringList -+static inline QStringList - xkbmap_model_args( const QString& model ) - { - QStringList r { "-model", model }; -@@ -46,7 +46,7 @@ xkbmap_model_args( const QString& model ) - /* Returns stringlist with suitable setxkbmap command-line arguments - * to set the given @p layout and @p variant. - */ --static QStringList -+static inline QStringList - xkbmap_layout_args( const QString& layout, const QString& variant ) - { - QStringList r { "-layout", layout }; -@@ -57,10 +57,10 @@ xkbmap_layout_args( const QString& layout, const QString& variant ) - return r; - } - --static QStringList --xkbmap_layout_args_with_group_switch( const QStringList& layouts, -- const QStringList& variants, -- const QString& switchOption ) -+static inline QStringList -+xkbmap_layout_args( const QStringList& layouts, -+ const QStringList& variants, -+ const QString& switchOption = "grp:alt_shift_toggle" ) - { - if ( layouts.size() != variants.size() ) - { -@@ -161,16 +161,24 @@ Config::Config( QObject* parent ) - , m_keyboardVariantsModel( new KeyboardVariantsModel( this ) ) - , m_KeyboardGroupSwitcherModel( new KeyboardGroupsSwitchersModel( this ) ) - { -- m_applyTimer.setSingleShot( true ); -- connect( &m_applyTimer, &QTimer::timeout, this, &Config::apply ); -+ m_setxkbmapTimer.setSingleShot( true ); - - // Connect signals and slots - connect( m_keyboardModelsModel, - &KeyboardModelsModel::currentIndexChanged, - [ & ]( int index ) - { -+ // Set Xorg keyboard model - m_selectedModel = m_keyboardModelsModel->key( index ); -- somethingChanged(); -+ if ( m_useLocale1 ) -+ { -+ locale1Apply(); -+ } -+ else -+ { -+ QProcess::execute( "setxkbmap", xkbmap_model_args( m_selectedModel ) ); -+ } -+ emit prettyStatusChanged(); - } ); - - connect( m_keyboardLayoutsModel, -@@ -187,14 +195,16 @@ Config::Config( QObject* parent ) - [ & ]( int index ) - { - m_selectedVariant = m_keyboardVariantsModel->key( index ); -- somethingChanged(); -+ xkbChanged(); -+ emit prettyStatusChanged(); - } ); - connect( m_KeyboardGroupSwitcherModel, - &KeyboardGroupsSwitchersModel::currentIndexChanged, - [ & ]( int index ) - { - m_selectedGroup = m_KeyboardGroupSwitcherModel->key( index ); -- somethingChanged(); -+ xkbChanged(); -+ emit prettyStatusChanged(); - } ); - - // If the user picks something explicitly -- not a consequence of -@@ -214,36 +224,30 @@ Config::Config( QObject* parent ) - } - - void --Config::somethingChanged() -+Config::xkbChanged() - { -- if ( m_applyTimer.isActive() ) -+ // Set Xorg keyboard layout + variant -+ if ( m_setxkbmapTimer.isActive() ) - { -- m_applyTimer.stop(); -+ m_setxkbmapTimer.stop(); -+ m_setxkbmapTimer.disconnect( this ); - } -- m_applyTimer.start( QApplication::keyboardInputInterval() ); -- emit prettyStatusChanged(); --} - --void --Config::apply() --{ -- if ( m_configureXkb ) -+ if ( m_useLocale1 ) - { -- applyXkb(); -+ connect( &m_setxkbmapTimer, &QTimer::timeout, this, &Config::locale1Apply ); - } -- if ( m_configureLocale1 ) -- { -- applyLocale1(); -- } -- if ( m_configureKWin ) -+ else - { -- applyKWin(); -+ connect( &m_setxkbmapTimer, &QTimer::timeout, this, &Config::xkbApply ); - } -- // Writing /etc/ files is not needed "live" -+ -+ m_setxkbmapTimer.start( QApplication::keyboardInputInterval() ); -+ emit prettyStatusChanged(); - } - - void --Config::applyLocale1() -+Config::locale1Apply() - { - m_additionalLayoutInfo = getAdditionalLayoutInfo( m_selectedLayout ); - -@@ -279,11 +283,10 @@ Config::applyLocale1() - } - - void --Config::applyXkb() -+Config::xkbApply() - { - m_additionalLayoutInfo = getAdditionalLayoutInfo( m_selectedLayout ); - -- QStringList basicArguments = xkbmap_model_args( m_selectedModel ); - if ( !m_additionalLayoutInfo.additionalLayout.isEmpty() ) - { - if ( !m_selectedGroup.isEmpty() ) -@@ -300,11 +303,10 @@ Config::applyXkb() - m_additionalLayoutInfo.groupSwitcher = "grp:alt_shift_toggle"; - } - -- basicArguments.append( -- xkbmap_layout_args_with_group_switch( { m_additionalLayoutInfo.additionalLayout, m_selectedLayout }, -- { m_additionalLayoutInfo.additionalVariant, m_selectedVariant }, -- m_additionalLayoutInfo.groupSwitcher ) ); -- QProcess::execute( "setxkbmap", basicArguments ); -+ QProcess::execute( "setxkbmap", -+ xkbmap_layout_args( { m_additionalLayoutInfo.additionalLayout, m_selectedLayout }, -+ { m_additionalLayoutInfo.additionalVariant, m_selectedVariant }, -+ m_additionalLayoutInfo.groupSwitcher ) ); - - cDebug() << "xkbmap selection changed to: " << m_selectedLayout << '-' << m_selectedVariant << "(added " - << m_additionalLayoutInfo.additionalLayout << "-" << m_additionalLayoutInfo.additionalVariant -@@ -312,92 +314,12 @@ Config::applyXkb() - } - else - { -- basicArguments.append( xkbmap_layout_args( m_selectedLayout, m_selectedVariant ) ); -- QProcess::execute( "setxkbmap", basicArguments ); -+ QProcess::execute( "setxkbmap", xkbmap_layout_args( m_selectedLayout, m_selectedVariant ) ); - cDebug() << "xkbmap selection changed to: " << m_selectedLayout << '-' << m_selectedVariant; - } -- m_applyTimer.stop(); -+ m_setxkbmapTimer.disconnect( this ); - } - --// In a config-file's list of lines, replace lines = by = --static void --replaceKey( QStringList& content, const QString& key, const QString& value ) --{ -- for ( int i = 0; i < content.length(); ++i ) -- { -- if ( content.at( i ).startsWith( key ) ) -- { -- content[ i ] = key + value; -- } -- } --} -- --static bool --rewriteKWin( const QString& path, const QString& model, const QString& layouts, const QString& variants ) --{ -- if ( !QFile::exists( path ) ) -- { -- return false; -- } -- -- QFile config( path ); -- if ( !config.open( QIODevice::ReadOnly ) ) -- { -- return false; -- } -- QStringList content = []( QFile& f ) -- { -- QTextStream s( &f ); -- return s.readAll().split( '\n' ); -- }( config ); -- config.close(); -- -- if ( !config.open( QIODevice::WriteOnly ) ) -- { -- return false; -- } -- -- replaceKey( content, QStringLiteral( "Model=" ), model ); -- replaceKey( content, QStringLiteral( "LayoutList=" ), layouts ); -- replaceKey( content, QStringLiteral( "VariantList=" ), variants ); -- -- config.write( content.join( '\n' ).toUtf8() ); -- config.close(); -- -- return true; --} -- --void --Config::applyKWin() --{ -- const auto paths = QStandardPaths::standardLocations( QStandardPaths::ConfigLocation ); -- -- auto join = [ &additional = m_additionalLayoutInfo.additionalLayout ]( const QString& s1, const QString& s2 ) -- { return additional.isEmpty() ? s1 : QStringLiteral( "%1,%2" ).arg( s1, s2 ); }; -- -- const QString layouts = join( m_selectedLayout, m_additionalLayoutInfo.additionalLayout ); -- const QString variants = join( m_selectedVariant, m_additionalLayoutInfo.additionalVariant ); -- -- bool updated = false; -- for ( const auto& path : paths ) -- { -- const QString candidate = path + QStringLiteral( "/kxkbrc" ); -- if ( rewriteKWin( candidate, m_selectedModel, layouts, variants ) ) -- { -- updated = true; -- break; -- } -- } -- -- if ( updated ) -- { -- auto kwin = QDBusMessage::createSignal( -- QStringLiteral( "/Layouts" ), QStringLiteral( "org.kde.keyboard" ), QStringLiteral( "reloadConfig" ) ); -- QDBusConnection::sessionBus().send( kwin ); -- } --} -- -- - KeyboardModelsModel* - Config::keyboardModels() const - { -@@ -533,7 +455,7 @@ Config::detectCurrentKeyboardLayout() - QString currentVariant; - QString currentModel; - -- if ( m_configureLocale1 ) -+ if ( m_useLocale1 ) - { - getCurrentKeyboardLayoutLocale1( currentLayout, currentVariant, currentModel ); - } -@@ -579,10 +501,10 @@ Config::detectCurrentKeyboardLayout() - QString - Config::prettyStatus() const - { -- QString status -- = tr( "Keyboard model has been set to %1.", "@label, %1 is keyboard model, as in Apple Magic Keyboard" ) -- .arg( m_keyboardModelsModel->label( m_keyboardModelsModel->currentIndex() ) ); -- status += QStringLiteral( "
    " ); -+ QString status; -+ status -+ += tr( "Keyboard model has been set to %1
    .", "@label, %1 is keyboard model, as in Apple Magic Keyboard" ) -+ .arg( m_keyboardModelsModel->label( m_keyboardModelsModel->currentIndex() ) ); - - QString layout = m_keyboardLayoutsModel->item( m_keyboardLayoutsModel->currentIndex() ).second.description; - QString variant = m_keyboardVariantsModel->currentIndex() >= 0 -@@ -605,8 +527,8 @@ Config::createJobs() - m_additionalLayoutInfo, - m_xOrgConfFileName, - m_convertedKeymapPath, -- m_configureEtcDefaultKeyboard, -- m_configureLocale1 ); -+ m_writeEtcDefaultKeyboard, -+ m_useLocale1 ); - list.append( Calamares::job_ptr( j ) ); - - return list; -@@ -796,13 +718,8 @@ Config::setConfigurationMap( const QVariantMap& configurationMap ) - m_xOrgConfFileName = xorgConfDefault; - } - m_convertedKeymapPath = getString( configurationMap, "convertedKeymapPath" ); -- m_configureEtcDefaultKeyboard = getBool( configurationMap, "writeEtcDefaultKeyboard", true ); -- m_configureLocale1 = getBool( configurationMap, "useLocale1", !isX11 ); -- -- bool bogus = false; -- const auto configureItems = getSubMap( configurationMap, "configure", bogus ); -- m_configureKWin = getBool( configureItems, "kwin", false ); -- -+ m_writeEtcDefaultKeyboard = getBool( configurationMap, "writeEtcDefaultKeyboard", true ); -+ m_useLocale1 = getBool( configurationMap, "useLocale1", !isX11 ); - m_guessLayout = getBool( configurationMap, "guessLayout", true ); - } - -diff --git a/src/modules/keyboard/Config.h b/src/modules/keyboard/Config.h -index e2a8c4f0e..04659514d 100644 ---- a/src/modules/keyboard/Config.h -+++ b/src/modules/keyboard/Config.h -@@ -86,17 +86,14 @@ private: - * keyboard layout. This introduces a slight delay between selecting - * a keyboard, and applying it to the system -- so that if you - * scroll through or down-arrow through the list of keyboards, -- * you don't get buried under updates which might take some time. -+ * you don't get buried under xkbset processes. - * -- * somethingChanged() is called when the selection changes, and triggers -- * a delayed call to apply() which does the actual work by calling the -- * relevant apply*() functions. -+ * xkbChanged() is called when the selection changes, and triggers -+ * a delayed call to xkbApply() which does the actual work. - */ -- void somethingChanged(); -- void apply(); -- void applyLocale1(); -- void applyXkb(); -- void applyKWin(); -+ void xkbChanged(); -+ void xkbApply(); -+ void locale1Apply(); - - void getCurrentKeyboardLayoutXkb( QString& currentLayout, QString& currentVariant, QString& currentModel ); - void getCurrentKeyboardLayoutLocale1( QString& currentLayout, QString& currentVariant, QString& currentModel ); -@@ -114,15 +111,13 @@ private: - // Layout (and corresponding info) added if current one doesn't support ASCII (e.g. Russian or Japanese) - AdditionalLayoutInfo m_additionalLayoutInfo; - -- QTimer m_applyTimer; -+ QTimer m_setxkbmapTimer; - - // From configuration - QString m_xOrgConfFileName; - QString m_convertedKeymapPath; -- bool m_configureXkb = true; -- bool m_configureEtcDefaultKeyboard = true; -- bool m_configureLocale1 = false; -- bool m_configureKWin = false; -+ bool m_writeEtcDefaultKeyboard = true; -+ bool m_useLocale1 = false; - bool m_guessLayout = false; - - // The state determines whether we guess settings or preserve them: +diff --git a/src/modules/initramfscfg/encrypt_hook b/src/modules/initramfscfg/encrypt_hook +old mode 100755 +new mode 100644 +diff --git a/src/modules/initramfscfg/encrypt_hook_nokey b/src/modules/initramfscfg/encrypt_hook_nokey +old mode 100755 +new mode 100644 diff --git a/src/modules/keyboard/KeyboardPage.cpp b/src/modules/keyboard/KeyboardPage.cpp -index dbb80c600..3f0615809 100644 +index dbb80c6..3f06158 100644 --- a/src/modules/keyboard/KeyboardPage.cpp +++ b/src/modules/keyboard/KeyboardPage.cpp @@ -43,13 +43,14 @@ LayoutItem::~LayoutItem() {} @@ -843,7 +249,7 @@ index dbb80c600..3f0615809 100644 connect( ui->groupSelector, QOverload< int >::of( &QComboBox::currentIndexChanged ), diff --git a/src/modules/keyboard/KeyboardPage.ui b/src/modules/keyboard/KeyboardPage.ui -index e131e5c9a..1d6afbf21 100644 +index e131e5c..1d6afbf 100644 --- a/src/modules/keyboard/KeyboardPage.ui +++ b/src/modules/keyboard/KeyboardPage.ui @@ -45,9 +45,9 @@ SPDX-License-Identifier: GPL-3.0-or-later @@ -858,55 +264,8 @@ index e131e5c9a..1d6afbf21 100644 -diff --git a/src/modules/keyboard/SetKeyboardLayoutJob.cpp b/src/modules/keyboard/SetKeyboardLayoutJob.cpp -index 81eba130b..beb5780a2 100644 ---- a/src/modules/keyboard/SetKeyboardLayoutJob.cpp -+++ b/src/modules/keyboard/SetKeyboardLayoutJob.cpp -@@ -233,7 +233,7 @@ SetKeyboardLayoutJob::writeVConsoleData( const QString& vconsoleConfPath, const - } - QTextStream stream( &file ); - bool found = false; -- for ( const QString& existingLine : std::as_const( existingLines ) ) -+ for ( const QString& existingLine : qAsConst( existingLines ) ) - { - if ( existingLine.trimmed().startsWith( "KEYMAP=" ) ) - { -diff --git a/src/modules/keyboard/keyboard.conf b/src/modules/keyboard/keyboard.conf -index fe82a9b61..2a8e85149 100644 ---- a/src/modules/keyboard/keyboard.conf -+++ b/src/modules/keyboard/keyboard.conf -@@ -31,15 +31,3 @@ convertedKeymapPath: "/lib/kbd/keymaps/xkb" - # Guess the default layout from the user locale. If false, keeps the current - # OS keyboard layout as the default (useful if the layout is pre-configured). - #guessLayout: true -- --# Things that should be configured. --configure: -- # Configure KWin (KDE Plasma) directly by editing the -- # configuration file and informing KWin over DBus. This is -- # useful in a system that uses Wayland but does **not** connect -- # locale1 with KWin. -- # -- # Systems that use KDE Plasma Wayland and locale1 can instead start the -- # compositor KWin with command-line argument `--locale1`. That -- # argument makes this configuration option unnecessary. -- kwin: false -diff --git a/src/modules/keyboard/keyboard.schema.yaml b/src/modules/keyboard/keyboard.schema.yaml -index 0fb1fdcf3..9db89b2e3 100644 ---- a/src/modules/keyboard/keyboard.schema.yaml -+++ b/src/modules/keyboard/keyboard.schema.yaml -@@ -11,9 +11,4 @@ properties: - writeEtcDefaultKeyboard: { type: boolean, default: true } - useLocale1: { type: boolean, default: false } - guessLayout: { type: boolean, default: true } -- configure: -- additionalProperties: false -- type: object -- properties: -- kwin: { type: boolean, default: false } - required: [ xOrgConfFileName, convertedKeymapPath ] diff --git a/src/modules/locale/Config.cpp b/src/modules/locale/Config.cpp -index b2ef0e890..fbcbf488c 100644 +index 8fa17a7..0d70ff3 100644 --- a/src/modules/locale/Config.cpp +++ b/src/modules/locale/Config.cpp @@ -305,6 +305,7 @@ Config::setCurrentLocation( const Calamares::Locale::TimeZoneData* location ) @@ -917,7 +276,7 @@ index b2ef0e890..fbcbf488c 100644 } emit currentLocationChanged( m_currentLocation ); // Other signals come from the LocationChanged signal -@@ -370,17 +371,16 @@ Config::setLCLocaleExplicitly( const QString& locale ) +@@ -370,6 +371,7 @@ Config::setLCLocaleExplicitly( const QString& locale ) m_selectedLocaleConfiguration.explicit_lc = true; emit currentLCStatusChanged( currentLCStatus() ); @@ -925,51 +284,10 @@ index b2ef0e890..fbcbf488c 100644 emit currentLCCodeChanged( currentLCCode() ); } - QString - Config::currentLocationStatus() const - { -- if ( m_currentLocation ) -- { -- return tr( "Set timezone to %1.", "@action" ).arg( currentTimezoneName()); -- } -- return QString(); -+ return tr( "Set timezone to %1/%2", "@action" ) -+ .arg( m_currentLocation ? m_currentLocation->region() : QString(), -+ m_currentLocation ? m_currentLocation->zone() : QString() ); - } - - QString -@@ -426,6 +426,61 @@ Config::currentLCStatus() const +@@ -424,6 +426,18 @@ Config::currentLCStatus() const .arg( localeLabel( m_selectedLocaleConfiguration.lc_numeric ) ); } -+ -+static QString -+getTranRes(QString& filePath,QString& keyWord) { -+ QFile file(filePath); -+ if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) { -+ qDebug() << "无法打开文件"; -+ return QString(); -+ } -+ -+ QTextStream in(&file); -+ QString currentLine; -+ QString resLine; -+ -+ while (!in.atEnd()) { -+ currentLine = in.readLine(); -+ if (currentLine.contains(keyWord, Qt::CaseInsensitive)) { -+ in.readLine(); -+ resLine = in.readLine(); -+ file.close(); -+ return resLine.trimmed().replace("","").replace("",""); -+ } -+ } -+ -+ return keyWord; -+} -+ -+ +QString +Config::currentTimeZoneStatus() const +{ @@ -978,22 +296,6 @@ index b2ef0e890..fbcbf488c 100644 + { + zone = "Hong Kong(China)"; + } -+ -+ -+ zone.replace("_"," "); -+ QString translationFile = ""; -+ if( m_selectedLocaleConfiguration.language() == "zh_CN.utf8"){ -+ translationFile = "tz_zh_CN.ts"; -+ } else if( m_selectedLocaleConfiguration.language() == "zh_TW.utf8"){ -+ translationFile="tz_zh_TW.ts"; -+ } -+ -+ QString transFilePath = QStringLiteral("/usr/share/calamares/") + translationFile; -+ cDebug() << "transFilePath" << transFilePath; -+ if(translationFile != ""){ -+ zone = getTranRes(transFilePath, zone); -+ } -+ + return tr("The timezone will be set to %1.","@info") + .arg( zone ); +} @@ -1002,7 +304,7 @@ index b2ef0e890..fbcbf488c 100644 Config::prettyStatus() const { diff --git a/src/modules/locale/Config.h b/src/modules/locale/Config.h -index a26d25a9c..6a8bea12b 100644 +index a26d25a..6a8bea1 100644 --- a/src/modules/locale/Config.h +++ b/src/modules/locale/Config.h @@ -34,6 +34,7 @@ class Config : public QObject @@ -1031,7 +333,7 @@ index a26d25a9c..6a8bea12b 100644 private: /// A list of supported locale identifiers (e.g. "en_US.UTF-8") diff --git a/src/modules/locale/LocalePage.cpp b/src/modules/locale/LocalePage.cpp -index e74373ad7..0568067fb 100644 +index e74373a..0568067 100644 --- a/src/modules/locale/LocalePage.cpp +++ b/src/modules/locale/LocalePage.cpp @@ -31,20 +31,21 @@ LocalePage::LocalePage( Config* config, QWidget* parent ) @@ -1156,7 +458,7 @@ index e74373ad7..0568067fb 100644 diff --git a/src/modules/locale/LocalePage.h b/src/modules/locale/LocalePage.h -index 66502e69c..b5fb06d8a 100644 +index 66502e6..b5fb06d 100644 --- a/src/modules/locale/LocalePage.h +++ b/src/modules/locale/LocalePage.h @@ -58,6 +58,7 @@ private: @@ -1168,7 +470,7 @@ index 66502e69c..b5fb06d8a 100644 bool m_blockTzWidgetSet; diff --git a/src/modules/locale/SetTimezoneJob.cpp b/src/modules/locale/SetTimezoneJob.cpp -index 3d88bd02c..2a586f7d2 100644 +index 3d88bd0..2a586f7 100644 --- a/src/modules/locale/SetTimezoneJob.cpp +++ b/src/modules/locale/SetTimezoneJob.cpp @@ -50,6 +50,10 @@ SetTimezoneJob::exec() @@ -1182,23 +484,8 @@ index 3d88bd02c..2a586f7d2 100644 zoneinfoPath.append( QDir::separator() + m_region ); zoneinfoPath.append( QDir::separator() + m_zone ); -diff --git a/src/modules/locale/Tests.cpp b/src/modules/locale/Tests.cpp -index a321b2f89..bc92a8882 100644 ---- a/src/modules/locale/Tests.cpp -+++ b/src/modules/locale/Tests.cpp -@@ -293,8 +293,8 @@ LocaleTests::testConfigInitialization() - { - Config c; - -- QCOMPARE( c.currentLocation(), nullptr ); -- QVERIFY( c.currentLocationStatus().isEmpty() ); -+ QVERIFY( !c.currentLocation() ); -+ QVERIFY( !c.currentLocationStatus().isEmpty() ); - } - - void diff --git a/src/modules/locale/locale.conf b/src/modules/locale/locale.conf -index 4463f7a94..028071f75 100644 +index 4463f7a..028071f 100644 --- a/src/modules/locale/locale.conf +++ b/src/modules/locale/locale.conf @@ -17,8 +17,8 @@ @@ -1222,7 +509,7 @@ index 4463f7a94..028071f75 100644 selector: "" # leave blank for the default diff --git a/src/modules/localeq/localeq.conf b/src/modules/localeq/localeq.conf -index bb2a7e816..35a819a05 100644 +index bb2a7e8..35a819a 100644 --- a/src/modules/localeq/localeq.conf +++ b/src/modules/localeq/localeq.conf @@ -95,6 +95,6 @@ zone: "New_York" @@ -1233,24 +520,8 @@ index bb2a7e816..35a819a05 100644 + style: "none" url: "https://geoip.kde.org/v1/calamares" selector: "" # leave blank for the default -diff --git a/src/modules/mount/main.py b/src/modules/mount/main.py -index 4a16f8872..bfeb23ea6 100644 ---- a/src/modules/mount/main.py -+++ b/src/modules/mount/main.py -@@ -345,10 +345,7 @@ def run(): - _("No partitions are defined for

    {!s}
    to use.").format("mount")) - - # Find existing swap partitions that are part of the installation and enable them now -- claimed_swap_partitions = [p for p in partitions if p["fs"] == "linuxswap" and p.get("claimed", False)] -- plain_swap = [p for p in claimed_swap_partitions if p["fsName"] == "linuxswap"] -- luks_swap = [p for p in claimed_swap_partitions if p["fsName"] == "luks" or p["fsName"] == "luks2"] -- swap_devices = [p["device"] for p in plain_swap] + ["/dev/mapper/" + p["luksMapperName"] for p in luks_swap] -+ swap_devices = [p["device"] for p in partitions if (p["fs"] == "linuxswap" and p.get("claimed", False))] - - enable_swap_partition(swap_devices) - diff --git a/src/modules/mount/mount.conf b/src/modules/mount/mount.conf -index da9539569..bf06fe955 100644 +index da95395..bf06fe9 100644 --- a/src/modules/mount/mount.conf +++ b/src/modules/mount/mount.conf @@ -28,12 +28,21 @@ extraMounts: @@ -1275,51 +546,8 @@ index da9539569..bf06fe955 100644 - device: efivarfs fs: efivarfs mountPoint: /sys/firmware/efi/efivars -diff --git a/src/modules/netinstall/PackageModel.cpp b/src/modules/netinstall/PackageModel.cpp -index 98eb446eb..01a0205e7 100644 ---- a/src/modules/netinstall/PackageModel.cpp -+++ b/src/modules/netinstall/PackageModel.cpp -@@ -378,7 +378,7 @@ PackageModel::appendModelData( const QVariantList& groupList ) - removeList.insert( 0, i ); - } - } -- for ( const int& item : std::as_const( removeList ) ) -+ for ( const int& item : qAsConst( removeList ) ) - { - m_rootItem->removeChild( item ); - } -diff --git a/src/modules/netinstall/netinstall.schema.yaml b/src/modules/netinstall/netinstall.schema.yaml -index 1faf65651..8f057b503 100644 ---- a/src/modules/netinstall/netinstall.schema.yaml -+++ b/src/modules/netinstall/netinstall.schema.yaml -@@ -6,6 +6,7 @@ $schema: https://json-schema.org/draft-07/schema# - $id: https://calamares.io/schemas/netinstall - definitions: - package: -+ $id: 'definitions/package' - oneOf: - - - type: string -@@ -19,6 +20,7 @@ definitions: - name: { type: string } - description: { type: string } - group: -+ $id: 'definitions/group' - type: object - description: Longer discussion in `netinstall.conf` file under 'Groups Format' - properties: -@@ -53,7 +55,9 @@ definitions: - maxItems: 0 - then: - required: [name, description, packages] # bottom-most (sub)group requires some package (otherwise, why bother?) -+ # This should validate `netinstall.yaml` also. - groups: -+ $id: 'definitions/groups' - type: array - items: { $ref: '#/definitions/group' } - diff --git a/src/modules/packagechooser/Config.cpp b/src/modules/packagechooser/Config.cpp -index 642311b33..0abeafafc 100644 +index 642311b..0abeafa 100644 --- a/src/modules/packagechooser/Config.cpp +++ b/src/modules/packagechooser/Config.cpp @@ -238,7 +238,7 @@ Config::setPackageChoice( const QString& packageChoice ) @@ -1332,7 +560,7 @@ index 642311b33..0abeafafc 100644 QString diff --git a/src/modules/packagechooser/PackageChooserPage.cpp b/src/modules/packagechooser/PackageChooserPage.cpp -index 44a570d2f..53bd82a1b 100644 +index 44a570d..53bd82a 100644 --- a/src/modules/packagechooser/PackageChooserPage.cpp +++ b/src/modules/packagechooser/PackageChooserPage.cpp @@ -16,7 +16,8 @@ @@ -1380,30 +608,8 @@ index 44a570d2f..53bd82a1b 100644 } } } -diff --git a/src/modules/packagechooser/PackageModel.cpp b/src/modules/packagechooser/PackageModel.cpp -index f2a0b434d..d183680b0 100644 ---- a/src/modules/packagechooser/PackageModel.cpp -+++ b/src/modules/packagechooser/PackageModel.cpp -@@ -112,7 +112,7 @@ PackageListModel::addPackage( PackageItem&& p ) - QStringList - PackageListModel::getInstallPackagesForName( const QString& id ) const - { -- for ( const auto& p : std::as_const( m_packages ) ) -+ for ( const auto& p : qAsConst( m_packages ) ) - { - if ( p.id == id ) - { -@@ -126,7 +126,7 @@ QStringList - PackageListModel::getInstallPackagesForNames( const QStringList& ids ) const - { - QStringList l; -- for ( const auto& p : std::as_const( m_packages ) ) -+ for ( const auto& p : qAsConst( m_packages ) ) - { - if ( ids.contains( p.id ) ) - { diff --git a/src/modules/packagechooser/packagechooser.conf b/src/modules/packagechooser/packagechooser.conf -index 5b40aeb80..3f356382e 100644 +index 5b40aeb..e7b9b00 100644 --- a/src/modules/packagechooser/packagechooser.conf +++ b/src/modules/packagechooser/packagechooser.conf @@ -9,7 +9,7 @@ @@ -1424,12 +630,7 @@ index 5b40aeb80..3f356382e 100644 # Human-visible strings in this module. These are all optional. -@@ -147,26 +147,37 @@ labels: - # - # An item for AppStream may also contain an *id* and a *screenshot* - # key which will override the data from AppStream. -+# liberation-fonts, gnu-*-fonts, google-*-fonts, adwaita-icon-theme, atk, atkmm, at-spi2-atk, at-spi2-core, baobab, abattis-cantarell-fonts, cheese, clutter, clutter-gst3, clutter-gtk, cogl, dconf, dconf-editor, devhelp, eog, epiphany, evince, evolution-data-server, file-roller, folks, gcab, gcr, gdk-pixbuf2, gdm, gedit, geocode-glib, gfbgraph, gjs, glib2, glibmm24, glib-networking, gmime30, gnome-autoar, gnome-backgrounds, gnome-bluetooth, gnome-builder, gnome-calculator, gnome-calendar, gnome-characters, gnome-clocks, gnome-color-manager, gnome-contacts, gnome-control-center, gnome-desktop3, gnome-disk-utility, gnome-font-viewer, gnome-getting-started-docs, gnome-initial-setup, gnome-keyring, gnome-logs, gnome-menus, gnome-music, gnome-online-accounts, gnome-online-miners, gnome-photos, gnome-remote-desktop, gnome-screenshot, gnome-session, gnome-settings-daemon, gnome-shell, gnome-shell-extensions, gnome-software, gnome-system-monitor, gnome-terminal, gnome-tour, gnome-user-docs, gnome-user-share, gnome-video-effects, gnome-weather, gobject-introspection, gom, grilo, grilo-plugins, gsettings-desktop-schemas, gsound, gspell, gssdp, gtk3, gtk4, gtk-doc, gtkmm30, gtksourceview4, gtk-vnc2, gupnp, gupnp-av, gupnp-dlna, gvfs, json-glib, libchamplain, libdazzle, libgdata, libgee, libgnomekbd, libgsf, libgtop2, libgweather, libgxps, libhandy, libmediaart, libnma, libnotify, libpeas, librsvg2, libsecret, libsigc++20, libsoup, mm-common, mutter, nautilus, orca, pango, pangomm, libphodav, python3-pyatspi, python3-gobject, rest, rygel, simple-scan, sushi, sysprof, tepl, totem, totem-pl-parser, tracker3, tracker3-miners, vala, vte291, yelp, yelp-tools, yelp-xsl, zenity, devstation-config, ibus-libpinyin ] -+ +@@ -150,23 +150,32 @@ labels: items: - id: "" # packages: [] # This item installs no packages @@ -1455,7 +656,7 @@ index 5b40aeb80..3f356382e 100644 - id: gnome - packages: [ gnome-all ] - name: GNOME -+ packages: [ checkpolicy, code, dejavu-fonts, liberation-fonts, gnome-shell, gnome-session, gnome-terminal, gnome-software, gnome-menus, nautilus, xdg-utils, google-droid-sans-fonts, google-noto-fonts-common, google-noto-sans-arabic-vf-fonts, google-noto-sans-armenian-vf-fonts, google-noto-sans-bengali-vf-fonts, google-noto-sans-canadian-aboriginal-vf-fonts, google-noto-sans-cherokee-vf-fonts, google-noto-sans-devanagari-vf-fonts, google-noto-sans-ethiopic-vf-fonts, google-noto-sans-georgian-vf-fonts, google-noto-sans-hebrew-vf-fonts, google-noto-sans-kannada-vf-fonts, google-noto-sans-khmer-vf-fonts, google-noto-sans-lao-vf-fonts, google-noto-sans-math-fonts, google-noto-sans-mono-vf-fonts, google-noto-sans-sinhala-vf-fonts, google-noto-sans-symbols2-fonts, google-noto-sans-symbols-vf-fonts, google-noto-sans-tamil-vf-fonts, google-noto-sans-thaana-vf-fonts, google-noto-sans-thai-vf-fonts, google-noto-sans-vf-fonts, google-noto-serif-armenian-vf-fonts, google-noto-serif-ethiopic-vf-fonts, google-noto-serif-georgian-vf-fonts, google-noto-serif-gujarati-vf-fonts, google-noto-serif-gurmukhi-vf-fonts, google-noto-serif-hebrew-vf-fonts, google-noto-serif-kannada-vf-fonts, google-noto-serif-khmer-vf-fonts, google-noto-serif-lao-vf-fonts, google-noto-serif-sinhala-vf-fonts, google-noto-serif-tamil-vf-fonts, google-noto-serif-thai-vf-fonts, google-noto-serif-vf-fonts, gdm, ibus-libpinyin, webp-pixbuf-loader, firefox, devstation-config, wqy-zenhei-fonts ] ++ packages: [ checkpolicy, code, xorg-*, dejavu-fonts, liberation-fonts, gnu-*-fonts, google-*-fonts, adwaita-icon-theme, atk, atkmm, at-spi2-atk, at-spi2-core, baobab, abattis-cantarell-fonts, cheese, clutter, clutter-gst3, clutter-gtk, cogl, dconf, dconf-editor, devhelp, eog, epiphany, evince, evolution-data-server, file-roller, folks, gcab, gcr, gdk-pixbuf2, gdm, gedit, geocode-glib, gfbgraph, gjs, glib2, glibmm24, glib-networking, gmime30, gnome-autoar, gnome-backgrounds, gnome-bluetooth, gnome-builder, gnome-calculator, gnome-calendar, gnome-characters, gnome-clocks, gnome-color-manager, gnome-contacts, gnome-control-center, gnome-desktop3, gnome-disk-utility, gnome-font-viewer, gnome-getting-started-docs, gnome-initial-setup, gnome-keyring, gnome-logs, gnome-menus, gnome-music, gnome-online-accounts, gnome-online-miners, gnome-photos, gnome-remote-desktop, gnome-screenshot, gnome-session, gnome-settings-daemon, gnome-shell, gnome-shell-extensions, gnome-software, gnome-system-monitor, gnome-terminal, gnome-tour, gnome-user-docs, gnome-user-share, gnome-video-effects, gnome-weather, gobject-introspection, gom, grilo, grilo-plugins, gsettings-desktop-schemas, gsound, gspell, gssdp, gtk3, gtk4, gtk-doc, gtkmm30, gtksourceview4, gtk-vnc2, gupnp, gupnp-av, gupnp-dlna, gvfs, json-glib, libchamplain, libdazzle, libgdata, libgee, libgnomekbd, libgsf, libgtop2, libgweather, libgxps, libhandy, libmediaart, libnma, libnotify, libpeas, librsvg2, libsecret, libsigc++20, libsoup, mm-common, mutter, nautilus, orca, pango, pangomm, libphodav, python3-pyatspi, python3-gobject, rest, rygel, simple-scan, sushi, sysprof, tepl, totem, totem-pl-parser, tracker3, tracker3-miners, vala, vte291, yelp, yelp-tools, yelp-xsl, zenity, devstation-config, ibus-libpinyin ] + name: DevStation + name[zh]: DevStation description: GNU Networked Object Modeling Environment Desktop @@ -1477,20 +678,23 @@ index 5b40aeb80..3f356382e 100644 + # - id: kate + # appstream: org.kde.kwrite.desktop diff --git a/src/modules/packagechooser/packagechooser.qrc b/src/modules/packagechooser/packagechooser.qrc -index 3b9c96a5b..b5c4a9cde 100644 +index 3b9c96a..05944ce 100644 --- a/src/modules/packagechooser/packagechooser.qrc +++ b/src/modules/packagechooser/packagechooser.qrc -@@ -1,6 +1,7 @@ - +@@ -2,5 +2,11 @@ images/no-selection.png -- images/calamares.png + images/calamares.png ++ + images/gnome.png ++ ++ ++ + images/Minimal-Install.png diff --git a/src/modules/packages/main.py b/src/modules/packages/main.py -index b1aa6e3ff..2c6e6adb4 100644 +index d2a2552..8c165e8 100644 --- a/src/modules/packages/main.py +++ b/src/modules/packages/main.py @@ -123,7 +123,7 @@ class PackageManager(metaclass=abc.ABCMeta): @@ -1502,7 +706,7 @@ index b1aa6e3ff..2c6e6adb4 100644 """ Install a package from a single entry in the install list. This can be either a single package name, or an object -@@ -135,11 +135,19 @@ class PackageManager(metaclass=abc.ABCMeta): +@@ -135,11 +135,18 @@ class PackageManager(metaclass=abc.ABCMeta): see install.from_local """ if isinstance(packagedata, str): @@ -1512,11 +716,10 @@ index b1aa6e3ff..2c6e6adb4 100644 self.run(packagedata["pre-script"]) - self.install([packagedata["package"]], from_local=from_local) - self.run(packagedata["post-script"]) -+ if "package" in packagedata: -+ if isinstance(packagedata["package"], list): -+ self.install(packagedata["package"], from_local=from_local, options=options) -+ else: -+ self.install([packagedata["package"]], from_local=from_local, options=options) ++ if isinstance(packagedata["package"], list): ++ self.install(packagedata["package"], from_local=from_local, options=options) ++ else: ++ self.install([packagedata["package"]], from_local=from_local, options=options) + if isinstance(packagedata["post-script"], list): + for script in packagedata["post-script"]: + self.run(script) @@ -1525,7 +728,7 @@ index b1aa6e3ff..2c6e6adb4 100644 def remove_package(self, packagedata): """ -@@ -155,9 +163,15 @@ class PackageManager(metaclass=abc.ABCMeta): +@@ -155,9 +162,15 @@ class PackageManager(metaclass=abc.ABCMeta): else: self.run(packagedata["pre-script"]) self.remove([packagedata["package"]]) @@ -1543,7 +746,7 @@ index b1aa6e3ff..2c6e6adb4 100644 """ Installs the list of packages named in @p package_list . These can be strings -- plain package names -- or -@@ -172,11 +186,14 @@ class PackageManager(metaclass=abc.ABCMeta): +@@ -172,11 +185,14 @@ class PackageManager(metaclass=abc.ABCMeta): NOTE: exceptions are expected to leave this method, to indicate failure of the installation. """ @@ -1560,7 +763,7 @@ index b1aa6e3ff..2c6e6adb4 100644 def operation_try_install(self, package_list): """ -@@ -286,8 +303,10 @@ class PMDnf(PackageManager): +@@ -286,8 +302,10 @@ class PMDnf(PackageManager): """ backend = "dnf" @@ -1573,35 +776,7 @@ index b1aa6e3ff..2c6e6adb4 100644 def remove(self, pkgs): # ignore the error code for now because dnf thinks removing a -@@ -583,23 +602,17 @@ class PMPortage(PackageManager): - class PMXbps(PackageManager): - backend = "xbps" - -- def line_cb(self, line): -- libcalamares.utils.debug(line) -- -- def run_xbps(self, command): -- libcalamares.utils.target_env_process_output(command, self.line_cb); -- - def install(self, pkgs, from_local=False): -- self.run_xbps(["xbps-install", "-Sy"] + pkgs) -+ check_target_env_call(["xbps-install", "-Sy"] + pkgs) - - def remove(self, pkgs): -- self.run_xbps(["xbps-remove", "-Ry"] + pkgs) -+ check_target_env_call(["xbps-remove", "-Ry", "--noconfirm"] + pkgs) - - def update_db(self): -- self.run_xbps(["xbps-install", "-S"]) -+ check_target_env_call(["xbps-install", "-S"]) - - def update_system(self): -- self.run_xbps(["xbps", "-Suy"]) -+ check_target_env_call(["xbps", "-Suy"]) - - - class PMYum(PackageManager): -@@ -657,6 +670,55 @@ def subst_locale(plist): +@@ -651,6 +669,55 @@ def subst_locale(plist): locale is 'en' (e.g. English, US) then these localized packages are dropped from the list. @@ -1657,12 +832,12 @@ index b1aa6e3ff..2c6e6adb4 100644 @param plist: list[str|dict] Candidate packages to install. @return: list[str|dict] -@@ -694,7 +756,22 @@ def subst_locale(plist): +@@ -688,7 +755,24 @@ def subst_locale(plist): return ret -def run_operations(pkgman, entry): -+def handle_packagechooser(): ++def handle_packagechooser(entry): + """ + Handle special logic for entries with source "packagechooser@packagechooser". + Modifies the entry to include specific pre- and post-scripts. @@ -1670,94 +845,54 @@ index b1aa6e3ff..2c6e6adb4 100644 + :param entry: dict + The operation entry to process. + """ -+ item = { -+ "pre-script": "", -+ "post-script": ["/bin/bash /etc/add_selinux_policy.sh", "systemctl enable gdm", "systemctl set-default graphical.target"] -+ } -+ return item ++ if "install" in entry: ++ item = { ++ "package": entry["install"], ++ "pre-script": "", ++ "post-script": ["/bin/bash /etc/add_selinux_policy.sh", "systemctl enable gdm", "systemctl set-default graphical.target"] ++ } ++ entry["install"] = [item] + + +def run_operations(pkgman, entry, options): """ Call package manager with suitable parameters for the given package actions. -@@ -709,37 +786,54 @@ def run_operations(pkgman, entry): - names (strings) or package information dictionaries with pre- - and post-scripts. +@@ -705,24 +789,28 @@ def run_operations(pkgman, entry): """ -- global group_packages, completed_packages, mode_packages -+ global group_packages, completed_packages, mode_packages, custom_status_message + global group_packages, completed_packages, mode_packages ++ if "source" in entry and entry["source"] == "packagechooser@packagechooser": ++ handle_packagechooser(entry) ++ for key in entry.keys(): package_list = subst_locale(entry[key]) -+ libcalamares.utils.warning(str(package_list)) group_packages = len(package_list) -- if key == "install": -- _change_mode(INSTALL) -- pkgman.operation_install(package_list) -- elif key == "try_install": + -+ if key in ["install", "try_install", "localInstall"]: + if key == "install": + _change_mode(INSTALL) +- pkgman.operation_install(package_list) ++ pkgman.operation_install(package_list, options=options) + elif key == "try_install": _change_mode(INSTALL) - pkgman.operation_try_install(package_list) -- elif key == "remove": -- _change_mode(REMOVE) ++ pkgman.operation_try_install(package_list, options=options) + elif key == "remove": + _change_mode(REMOVE) - pkgman.operation_remove(package_list) -- elif key == "try_remove": -+ for package in package_list: -+ custom_status_message = f"Installing package: {package}" -+ try: -+ if key == "localInstall": -+ pkgman.operation_install([package], from_local=True, options=options) -+ elif key == "try_install": -+ pkgman.operation_try_install([package], options=options) -+ else: -+ pkgman.operation_install([package], options=options) -+ except Exception as e: -+ libcalamares.utils.warning("Failed to install package {}: {}".format(package, str(e))) -+ -+ completed_packages += 1 -+ progress = completed_packages / total_packages -+ libcalamares.job.setprogress(progress) -+ libcalamares.utils.debug("Progress: {:.2f}, Package: {}".format(progress, package)) -+ elif key in ["remove", "try_remove"]: ++ pkgman.operation_remove(package_list, options=options) + elif key == "try_remove": _change_mode(REMOVE) - pkgman.operation_try_remove(package_list) -- elif key == "localInstall": -- _change_mode(INSTALL) ++ pkgman.operation_try_remove(package_list, options=options) + elif key == "localInstall": + _change_mode(INSTALL) - pkgman.operation_install(package_list, from_local=True) -- elif key == "source": -- libcalamares.utils.debug("Package-list from {!s}".format(entry[key])) -+ for package in package_list: -+ try: -+ if key == "remove": -+ pkgman.operation_remove([package], options=options) -+ elif key == "try_remove": -+ pkgman.operation_try_remove([package], options=options) -+ except Exception as e: -+ libcalamares.utils.warning("Failed to remove package {}: {}".format(package, str(e))) -+ -+ completed_packages += 1 -+ progress = completed_packages / total_packages -+ libcalamares.job.setprogress(progress) -+ libcalamares.utils.debug("Progress: {:.2f}, Package: {}".format(progress, package)) ++ pkgman.operation_install(package_list, from_local=True, options=options) + elif key == "source": + libcalamares.utils.debug("Package-list from {!s}".format(entry[key])) else: - libcalamares.utils.warning("Unknown package-operation key {!s}".format(key)) -- completed_packages += len(package_list) -- libcalamares.job.setprogress(completed_packages * 1.0 / total_packages) -- libcalamares.utils.debug("Pretty name: {!s}, setting progress..".format(pretty_name())) - -+ if "source" in entry and entry["source"] == "packagechooser@packagechooser": -+ packagemeta = handle_packagechooser() -+ pkgman.operation_install([packagemeta], from_local=True, options=options) - group_packages = 0 -- _change_mode(None) -- -+ _change_mode(None) - - def run(): - """ -@@ -802,12 +896,21 @@ def run(): +@@ -796,12 +884,21 @@ def run(): if not total_packages: # Avoids potential divide-by-zero in progress reporting return None @@ -1780,7 +915,7 @@ index b1aa6e3ff..2c6e6adb4 100644 except subprocess.CalledProcessError as e: libcalamares.utils.warning(str(e)) libcalamares.utils.debug("stdout:" + str(e.stdout)) -@@ -817,6 +920,7 @@ def run(): +@@ -811,6 +908,7 @@ def run(): .format(e.cmd, e.returncode)) mode_packages = None @@ -1788,17 +923,8 @@ index b1aa6e3ff..2c6e6adb4 100644 libcalamares.job.setprogress(1.0) -diff --git a/src/modules/packages/module.desc b/src/modules/packages/module.desc -index 3e3053bfa..9529af615 100644 ---- a/src/modules/packages/module.desc -+++ b/src/modules/packages/module.desc -@@ -5,3 +5,4 @@ type: "job" - name: "packages" - interface: "python" - script: "main.py" -+weight: 50 diff --git a/src/modules/packages/packages.conf b/src/modules/packages/packages.conf -index b9777f606..31e51c29d 100644 +index b9777f6..490c289 100644 --- a/src/modules/packages/packages.conf +++ b/src/modules/packages/packages.conf @@ -36,7 +36,7 @@ @@ -1810,7 +936,7 @@ index b9777f606..31e51c29d 100644 # # Often package installation needs an internet connection. -@@ -202,13 +202,30 @@ pacman: +@@ -202,13 +202,32 @@ pacman: # "binutils", and then a second time for "wget". When installing large numbers # of packages, this can lead to a considerable time savings. # @@ -1835,7 +961,7 @@ index b9777f606..31e51c29d 100644 + - coreutils + - efibootmgr + - shim -+ - java-21-openjdk-devel ++ - java-11-openjdk-devel + - vim + - gdb + - perf @@ -1849,86 +975,13 @@ index b9777f606..31e51c29d 100644 + options: + - --nogpgcheck + - --setopt=sslverify=0 -diff --git a/src/modules/partition/CMakeLists.txt b/src/modules/partition/CMakeLists.txt -index b5185bcea..3af8e4465 100644 ---- a/src/modules/partition/CMakeLists.txt -+++ b/src/modules/partition/CMakeLists.txt -@@ -60,7 +60,6 @@ if(KPMcore_FOUND) - core/DeviceList.cpp - core/DeviceModel.cpp - core/KPMHelpers.cpp -- core/DirFSRestrictLayout.cpp - core/OsproberEntry.cpp - core/PartitionActions.cpp - core/PartitionCoreModule.cpp -diff --git a/src/modules/partition/Config.cpp b/src/modules/partition/Config.cpp -index 085c45179..f4e404c28 100644 ---- a/src/modules/partition/Config.cpp -+++ b/src/modules/partition/Config.cpp -@@ -448,12 +448,6 @@ Config::setConfigurationMap( const QVariantMap& configurationMap ) - m_showNotEncryptedBootMessage = Calamares::getBool( configurationMap, "showNotEncryptedBootMessage", true ); - m_requiredPartitionTableType = Calamares::getStringList( configurationMap, "requiredPartitionTableType" ); - -- { -- bool bogus = true; -- const auto lvmConfiguration = Calamares::getSubMap( configurationMap, "lvm", bogus ); -- m_isLVMEnabled = Calamares::getBool( lvmConfiguration, "enable", true); -- } -- - Calamares::GlobalStorage* gs = Calamares::JobQueue::instance()->globalStorage(); - gs->insert( "armInstall", Calamares::getBool( configurationMap, "armInstall", false ) ); - fillGSConfigurationEFI( gs, configurationMap ); -diff --git a/src/modules/partition/Config.h b/src/modules/partition/Config.h -index 13da58ac4..8ec139169 100644 ---- a/src/modules/partition/Config.h -+++ b/src/modules/partition/Config.h -@@ -38,8 +38,6 @@ class Config : public QObject - Q_PROPERTY( bool preCheckEncryption READ preCheckEncryption CONSTANT FINAL ) - Q_PROPERTY( bool showNotEncryptedBootMessage READ showNotEncryptedBootMessage CONSTANT FINAL ) - -- Q_PROPERTY( bool lvmEnabled READ isLVMEnabled CONSTANT FINAL ) -- - public: - Config( QObject* parent ); - ~Config() override = default; -@@ -176,8 +174,6 @@ public: - /// @brief If zfs encryption should be allowed - bool allowZfsEncryption() const { return m_allowZfsEncryption; } - -- bool isLVMEnabled() const { return m_isLVMEnabled; } -- - public Q_SLOTS: - void setInstallChoice( int ); ///< Translates a button ID or so to InstallChoice - void setInstallChoice( InstallChoice ); -@@ -212,7 +208,6 @@ private: - bool m_allowManualPartitioning = true; - bool m_preCheckEncryption = false; - bool m_showNotEncryptedBootMessage = true; -- bool m_isLVMEnabled = true; - }; - - /** @brief Given a set of swap choices, return a sensible value from it. ++ - --disablerepo=* ++ - --enablerepo=local-repo diff --git a/src/modules/partition/PartitionViewStep.cpp b/src/modules/partition/PartitionViewStep.cpp -index f356c7168..2f98fe1a3 100644 +index db087b5..2f98fe1 100644 --- a/src/modules/partition/PartitionViewStep.cpp +++ b/src/modules/partition/PartitionViewStep.cpp -@@ -21,7 +21,6 @@ - #include "gui/PartitionBarsView.h" - #include "gui/PartitionLabelsView.h" - #include "gui/PartitionPage.h" --#include "partition/FileSystem.h" - - #include "Branding.h" - #include "GlobalStorage.h" -@@ -34,7 +33,6 @@ - #include "widgets/TranslationFix.h" - #include "widgets/WaitingWidget.h" - --#include - #include - - #include -@@ -50,8 +48,7 @@ PartitionViewStep::PartitionViewStep( QObject* parent ) +@@ -48,8 +48,7 @@ PartitionViewStep::PartitionViewStep( QObject* parent ) , m_choicePage( nullptr ) , m_manualPartitionPage( nullptr ) { @@ -1938,2111 +991,122 @@ index f356c7168..2f98fe1a3 100644 m_waitingWidget = new WaitingWidget( QString() ); m_widget->addWidget( m_waitingWidget ); CALAMARES_RETRANSLATE( -@@ -61,18 +58,6 @@ PartitionViewStep::PartitionViewStep( QObject* parent ) - // We're not done loading, but we need the configuration map first. - } - --PartitionViewStep::FSConflictEntry::FSConflictEntry() {} -- --PartitionViewStep::FSConflictEntry::FSConflictEntry( const QString& conflictingPathArg, -- const QString& conflictingFilesystemArg, -- const QString& conflictedPathArg, -- QStringList allowableFilesystemsArg ) -- : conflictingPath( conflictingPathArg ) -- , conflictingFilesystem( conflictingFilesystemArg ) -- , conflictedPath( conflictedPathArg ) -- , allowableFilesystems( allowableFilesystemsArg ) --{} -- - void - PartitionViewStep::initPartitionCoreModule() - { -@@ -124,19 +109,18 @@ PartitionViewStep::prettyName() const - /** @brief Gather the pretty descriptions of all the partitioning jobs - * - * Returns a QStringList of each job's pretty description, including -- * duplicates (but no empty lines). The list is in-order of how the -- * jobs will be run. If no job has a non-empty description, the list is empty. -+ * empty strings and duplicates. The list is in-order of how the -+ * jobs will be run. - */ - static QStringList - jobDescriptions( const Calamares::JobList& jobs ) - { - QStringList jobsLines; -- for ( const Calamares::job_ptr& job : std::as_const( jobs ) ) -+ for ( const Calamares::job_ptr& job : qAsConst( jobs ) ) - { -- const auto description = job->prettyDescription(); -- if ( !description.isEmpty() ) -+ if ( !job->prettyDescription().isEmpty() ) - { -- jobsLines.append( description ); -+ jobsLines.append( job->prettyDescription() ); - } - } - return jobsLines; -@@ -247,12 +231,8 @@ PartitionViewStep::prettyStatus() const - } - return s.join( QString() ); - }(); -- QStringList jobsLabels = jobDescriptions( jobs() ); -- if ( m_config->swapChoice() == Config::SwapChoice::SwapFile ) -- { -- jobsLabels.append( tr( "Create a swap file." ) ); -- } -- return diskInfoLabel + "
    " + jobsLabels.join( QStringLiteral( "
    " ) ); -+ const QString jobsLabel = jobDescriptions( jobs() ).join( QStringLiteral( "
    " ) ); -+ return diskInfoLabel + "
    " + jobsLabel; - } - - QWidget* -@@ -375,7 +355,7 @@ PartitionViewStep::next() - { - if ( !m_manualPartitionPage ) - { -- m_manualPartitionPage = new PartitionPage( m_core, *m_config ); -+ m_manualPartitionPage = new PartitionPage( m_core ); - m_widget->addWidget( m_manualPartitionPage ); - } - -@@ -473,12 +453,6 @@ PartitionViewStep::onActivate() - } - } - --static QString --listItem( QString s ) --{ -- return s.prepend( QStringLiteral( "
  • " ) ).append( QStringLiteral( "
  • " ) ); --} -- - static bool - shouldWarnForGPTOnBIOS( const PartitionCoreModule* core ) - { -@@ -498,7 +472,7 @@ shouldWarnForGPTOnBIOS( const PartitionCoreModule* core ) - if ( table && table->type() == PartitionTable::TableType::gpt ) - { - // So this is a BIOS system, and the bootloader will be installed on a GPT system -- for ( const auto& partition : std::as_const( table->children() ) ) -+ for ( const auto& partition : qAsConst( table->children() ) ) - { - using Calamares::Units::operator""_MiB; - if ( ( partition->activeFlags() & KPM_PARTITION_FLAG( BiosGrub ) ) -@@ -542,143 +516,6 @@ shouldWarnForNotEncryptedBoot( const Config* config, const PartitionCoreModule* - return false; - } - --static PartitionViewStep::FSConflictEntry --calcFSConflictEntry( PartitionCoreModule* core, PartitionModel* partModel, QModelIndex partFsIdx, QModelIndex partMountPointIdx, QStringList mountPointList ) --{ -- PartitionViewStep::FSConflictEntry result; -- -- QString partFs = partModel->data( partFsIdx ).toString().toLower(); -- QString partMountPoint = partModel->data( partMountPointIdx ).toString(); -- FileSystem::Type fsType; -- PartUtils::canonicalFilesystemName( partFs, &fsType ); -- bool fsTypeIsAllowed = false; -- if ( fsType == FileSystem::Type::Unknown ) -- { -- fsTypeIsAllowed = true; -- } -- else -- { -- QList< FileSystem::Type > allowedFsTypes = core->dirFSRestrictLayout().allowedFSTypes( partMountPoint, mountPointList, true ); -- for ( const auto& allowedFsType : allowedFsTypes ) -- { -- if ( fsType == allowedFsType ) -- { -- fsTypeIsAllowed = true; -- break; -- } -- } -- } -- -- if ( !fsTypeIsAllowed ) -- { -- QString conflictedPath = core->dirFSRestrictLayout().diagnoseFSConflict( partMountPoint, fsType, mountPointList ); -- QList< FileSystem::Type > nonConflictingFilesystemTypes = core->dirFSRestrictLayout().allowedFSTypes( conflictedPath, mountPointList, true ); -- QStringList nonConflictingFilesystems; -- for ( const auto& fsType : nonConflictingFilesystemTypes ) -- { -- nonConflictingFilesystems.append( Calamares::Partition::prettyNameForFileSystemType( fsType ) ); -- } -- result = PartitionViewStep::FSConflictEntry( partMountPoint, partFs, conflictedPath, nonConflictingFilesystems ); -- } -- -- return result; --} -- --static QList< PartitionViewStep::FSConflictEntry > --checkForFilesystemConflicts( PartitionCoreModule* core ) --{ -- QList< PartitionViewStep::FSConflictEntry > result; -- -- DeviceModel* dm = core->deviceModel(); -- QStringList mountPointList; -- -- // Walk the device and partition tree, extracting mountpoints from it -- for ( int i = 0; i < dm->rowCount(); i++ ) -- { -- Device* dev = dm->deviceForIndex( dm->index( i ) ); -- PartitionModel* pm = core->partitionModelForDevice( dev ); -- -- QModelIndex extPartMountPointIdx = QModelIndex(); -- bool extPartFound = false; -- for ( int j = 0; j < pm->rowCount(); j++ ) -- { -- QModelIndex partFsIdx = pm->index( j, PartitionModel::FileSystemColumn ); -- QModelIndex partMountPointIdx = pm->index( j, PartitionModel::MountPointColumn ); -- -- if ( pm->data( partFsIdx ).toString().toLower() == "extended" ) -- { -- extPartFound = true; -- extPartMountPointIdx = partMountPointIdx; -- break; -- } -- -- QString mountPoint = pm->data( partMountPointIdx ).toString(); -- if ( !mountPoint.isEmpty() ) -- { -- mountPointList.append( mountPoint ); -- } -- } -- if ( extPartFound ) -- { -- for ( int j = 0; j < pm->rowCount( extPartMountPointIdx ); j++ ) -- { -- QModelIndex partMountPointIdx = pm->index( j, PartitionModel::MountPointColumn, extPartMountPointIdx ); -- QString mountPoint = pm->data( partMountPointIdx ).toString(); -- if ( !mountPoint.isEmpty() ) -- { -- mountPointList.append( mountPoint ); -- } -- } -- } -- } -- -- // Walk the device and partition tree again, validating it this time -- for ( int i = 0; i < dm->rowCount(); i++ ) -- { -- Device* dev = dm->deviceForIndex( dm->index( i ) ); -- PartitionModel* pm = core->partitionModelForDevice( dev ); -- -- QModelIndex extPartFsIdx = QModelIndex(); -- QModelIndex extPartMountPointIdx = QModelIndex(); -- bool extPartFound = false; -- -- for ( int j = 0; j < pm->rowCount(); j++ ) -- { -- QModelIndex partFsIdx = pm->index( j, PartitionModel::FileSystemColumn ); -- QModelIndex partMountPointIdx = pm->index( j, PartitionModel::MountPointColumn ); -- -- if ( pm->data( partFsIdx ).toString().toLower() == "extended" ) -- { -- extPartFound = true; -- extPartFsIdx = partFsIdx; -- extPartMountPointIdx = partMountPointIdx; -- break; -- } -- -- PartitionViewStep::FSConflictEntry conflictEntry = calcFSConflictEntry( core, pm, partFsIdx, partMountPointIdx, mountPointList ); -- if ( !conflictEntry.conflictedPath.isEmpty() ) -- { -- result.append( conflictEntry ); -- } -- } -- if ( extPartFound ) -- { -- for ( int j = 0; j < pm->rowCount( extPartFsIdx ); j++ ) -- { -- QModelIndex partFsIdx = pm->index( j, PartitionModel::FileSystemColumn, extPartFsIdx ); -- QModelIndex partMountPointIdx = pm->index( j, PartitionModel::MountPointColumn, extPartMountPointIdx ); -- PartitionViewStep::FSConflictEntry conflictEntry = calcFSConflictEntry( core, pm, partFsIdx, partMountPointIdx, mountPointList ); -- if ( !conflictEntry.conflictedPath.isEmpty() ) -- { -- result.append( conflictEntry ); -- } -- } -- } -- } -- -- return result; --} -- - void - PartitionViewStep::onLeave() - { -@@ -689,10 +526,6 @@ PartitionViewStep::onLeave() - } - - const auto* branding = Calamares::Branding::instance(); -- -- const QString startList = QStringLiteral( "

      " ); -- const QString endList = QStringLiteral( "


    " ); -- - if ( m_widget->currentWidget() == m_manualPartitionPage ) - { - if ( PartUtils::isEfiSystem() ) -@@ -748,6 +581,12 @@ PartitionViewStep::onLeave() - const QString possibleFail = tr( "You can continue with this EFI system " - "partition configuration but your system may fail to start." ); - -+ const QString startList = QStringLiteral( "

      " ); -+ const QString endList = QStringLiteral( "


    " ); -+ -+ auto listItem = []( QString s ) -> QString -+ { return s.prepend( QStringLiteral( "
  • " ) ).append( QStringLiteral( "
  • " ) ); }; -+ - if ( !esp ) - { - cDebug() << o << "No ESP mounted"; -@@ -839,52 +678,6 @@ PartitionViewStep::onLeave() - Calamares::fixButtonLabels( &mb ); - mb.exec(); - } -- -- QList< FSConflictEntry > conflictMap = checkForFilesystemConflicts( m_core ); -- if ( !conflictMap.isEmpty() ) -- { -- QString message = tr( "Filesystem conflicts found" ); -- const QString descHeader = tr( "The chosen manual partitioning layout does not " -- "comply with the filesystem restrictions set by the " -- "distro. The following issues were found:"); -- -- QStringList issueList; -- for ( const auto& entry : conflictMap ) -- { -- QString buildString; -- if ( entry.conflictedPath == "any" ) -- { -- buildString = tr( "The %1 directory uses filesystem %2, but this distro only allows the following filesystems: %3." ) -- .arg( entry.conflictingPath ) -- .arg( entry.conflictingFilesystem ) -- .arg( entry.allowableFilesystems.join( ", " ) ); -- issueList.append( buildString ); -- } -- else -- { -- buildString = tr( "The %1 directory uses filesystem %2, but the %3 directory must use one of the following filesystems: %4." ) -- .arg( entry.conflictingPath ) -- .arg( entry.conflictingFilesystem ) -- .arg( entry.conflictedPath ) -- .arg( entry.allowableFilesystems.join( ", " ) ); -- issueList.append( buildString ); -- } -- } -- -- const QString descFooter = tr( "You can continue without setting up filesystems " -- "properly, but your system may fail to start." ); -- -- QString description = descHeader + startList; -- for ( const auto& item : issueList ) -- { -- description += listItem( item ); -- } -- description += endList + descFooter; -- -- QMessageBox mb( QMessageBox::Warning, message, description, QMessageBox::Ok, m_manualPartitionPage ); -- Calamares::fixButtonLabels( &mb ); -- mb.exec(); -- } - } - } - -@@ -941,7 +734,6 @@ PartitionViewStep::setConfigurationMap( const QVariantMap& configurationMap ) - m_future->setFuture( future ); - - m_core->partitionLayout().init( m_config->defaultFsType(), configurationMap.value( "partitionLayout" ).toList() ); -- m_core->dirFSRestrictLayout().init( configurationMap.value( "directoryFilesystemRestrictions" ).toList() ); - } - - Calamares::JobList -diff --git a/src/modules/partition/PartitionViewStep.h b/src/modules/partition/PartitionViewStep.h -index 8224154dd..ecba73f45 100644 ---- a/src/modules/partition/PartitionViewStep.h -+++ b/src/modules/partition/PartitionViewStep.h -@@ -39,21 +39,6 @@ class PLUGINDLLEXPORT PartitionViewStep : public Calamares::ViewStep - Q_OBJECT - - public: -- struct FSConflictEntry -- { -- QString conflictingPath; -- QString conflictingFilesystem; -- QString conflictedPath; -- QStringList allowableFilesystems; -- -- FSConflictEntry(); -- FSConflictEntry( const QString& conflictingPathArg, -- const QString& conflictingFilesystemArg, -- const QString& conflictedPathArg, -- QStringList allowableFilesystemsArg ); -- FSConflictEntry( const FSConflictEntry& e ) = default; -- }; -- - explicit PartitionViewStep( QObject* parent = nullptr ); - ~PartitionViewStep() override; - -diff --git a/src/modules/partition/core/DeviceList.cpp b/src/modules/partition/core/DeviceList.cpp -index 16723c750..188594963 100644 ---- a/src/modules/partition/core/DeviceList.cpp -+++ b/src/modules/partition/core/DeviceList.cpp -@@ -43,6 +43,17 @@ hasRootPartition( Device* device ) - return false; - } - -+/** -+ * Does the given @p device path should point to a device -+ */ -+static bool -+isValidDevice(const QString& devicePath) -+{ -+ auto result = Calamares::System::runCommand({ "blkid", devicePath }, std::chrono::seconds(30)); -+ -+ return result.getExitCode() == 0 && !result.getOutput().isEmpty(); -+} -+ - /** @brief Check if @p path holds an iso9660 filesystem - * - * The @p path should point to a device; blkid is used to check the FS type. -@@ -187,7 +198,17 @@ getDevices( DeviceType which ) - } - else - { -- ++it; -+ const QString devicePath = (*it)->deviceNode(); -+ -+ if (!isValidDevice(devicePath)) -+ { -+ cDebug() << Logger::SubEntry << "Skipping device due to blkid failure: " << devicePath; -+ it = removeInAllModes(devices, it); -+ } -+ else -+ { -+ ++it; -+ } - } - } - cDebug() << Logger::SubEntry << "there are" << devices.count() << "devices left."; -diff --git a/src/modules/partition/core/KPMHelpers.h b/src/modules/partition/core/KPMHelpers.h -index b8e6fca18..3ceafb003 100644 ---- a/src/modules/partition/core/KPMHelpers.h -+++ b/src/modules/partition/core/KPMHelpers.h -@@ -149,19 +149,6 @@ execute( Operation&& operation, const QString& failureMessage ) - return execute( operation, failureMessage ); - } - --/** @brief Is this an MSDOS partition table? -- * -- * Deals with KPMcore deprecations in the TableType enum. -- */ --inline bool isMSDOSPartition(PartitionTable::TableType t) --{ --#if WITH_KPMcore > 0x240801 -- return t == PartitionTable::TableType::msdos; --#else -- return t == PartitionTable::TableType::msdos || t == PartitionTable::TableType::msdos_sectorbased; --#endif --} -- - } // namespace KPMHelpers - - #endif /* KPMHELPERS_H */ -diff --git a/src/modules/partition/core/PartUtils.cpp b/src/modules/partition/core/PartUtils.cpp -index 8da0aee81..9818ea71f 100644 ---- a/src/modules/partition/core/PartUtils.cpp -+++ b/src/modules/partition/core/PartUtils.cpp -@@ -245,6 +245,8 @@ lookForFstabEntries( const QString& partitionPath ) - - cDebug() << "Checking device" << partitionPath << "for fstab (fs=" << r.getOutput() << ')'; - -+ FstabEntryList fstabEntries; -+ - Calamares::Partition::TemporaryMount mount( partitionPath, QString(), mountOptions.join( ',' ) ); - if ( mount.isValid() ) - { -diff --git a/src/modules/partition/core/PartitionActions.cpp b/src/modules/partition/core/PartitionActions.cpp -index ddfabaf85..b5fb0cafb 100644 ---- a/src/modules/partition/core/PartitionActions.cpp -+++ b/src/modules/partition/core/PartitionActions.cpp -@@ -107,8 +107,6 @@ doAutopartition( PartitionCoreModule* core, Device* dev, Choices::AutoPartitionO - { - partType = isEfi ? PartitionTable::gpt : PartitionTable::msdos; - } -- // last usable sector possibly allowing for secondary GPT using 66 sectors (256 entries) -- const qint64 lastUsableSector = dev->totalLogical() - ( partType == PartitionTable::gpt ? 67 : 1 ); - - // Looking up the defaultFsType (which should name a filesystem type) - // will log an error and set the type to Unknown if there's something wrong. -@@ -154,7 +152,7 @@ doAutopartition( PartitionCoreModule* core, Device* dev, Choices::AutoPartitionO - const quint64 sectorSize = quint64( dev->logicalSize() ); - if ( mayCreateSwap ) - { -- quint64 availableSpaceB = quint64( lastUsableSector - firstFreeSector + 1 ) * sectorSize; -+ quint64 availableSpaceB = quint64( dev->totalLogical() - firstFreeSector ) * sectorSize; - suggestedSwapSizeB = swapSuggestion( availableSpaceB, o.swap ); - // Space required by this installation is what the distro claims is needed - // (via global configuration) plus the swap size plus a fudge factor of -@@ -165,7 +163,7 @@ doAutopartition( PartitionCoreModule* core, Device* dev, Choices::AutoPartitionO - shouldCreateSwap = availableSpaceB > requiredSpaceB; - } - -- qint64 lastSectorForRoot = lastUsableSector; -+ qint64 lastSectorForRoot = dev->totalLogical() - 1; //last sector of the device - if ( shouldCreateSwap ) - { - lastSectorForRoot -= suggestedSwapSizeB / sectorSize + 1; -@@ -184,7 +182,7 @@ doAutopartition( PartitionCoreModule* core, Device* dev, Choices::AutoPartitionO - FileSystem::LinuxSwap, - QStringLiteral( "swap" ), - lastSectorForRoot + 1, -- lastUsableSector, -+ dev->totalLogical() - 1, - KPM_PARTITION_FLAG( None ) ); - } - else -@@ -195,7 +193,7 @@ doAutopartition( PartitionCoreModule* core, Device* dev, Choices::AutoPartitionO - FileSystem::LinuxSwap, - QStringLiteral( "swap" ), - lastSectorForRoot + 1, -- lastUsableSector, -+ dev->totalLogical() - 1, - o.luksFsType, - o.luksPassphrase, - KPM_PARTITION_FLAG( None ) ); -diff --git a/src/modules/partition/core/PartitionActions.h b/src/modules/partition/core/PartitionActions.h -index 24969bb43..fdf56e56e 100644 ---- a/src/modules/partition/core/PartitionActions.h -+++ b/src/modules/partition/core/PartitionActions.h -@@ -37,11 +37,11 @@ struct ReplacePartitionOptions - ReplacePartitionOptions( const QString& pt, - const QString& fs, - Config::LuksGeneration luksFs, -- const QString& passphrase ) -+ const QString& luksPassphrase ) - : defaultPartitionTableType( pt ) - , defaultFsType( fs ) - , luksFsType( luksFs ) -- , luksPassphrase( passphrase ) -+ , luksPassphrase( luksPassphrase ) - { - } - }; -@@ -55,11 +55,11 @@ struct AutoPartitionOptions : ReplacePartitionOptions - AutoPartitionOptions( const QString& pt, - const QString& fs, - Config::LuksGeneration luksFs, -- const QString& passphrase, -+ const QString& luksPassphrase, - const QString& efi, - qint64 requiredBytes, - Config::SwapChoice s ) -- : ReplacePartitionOptions( pt, fs, luksFs, passphrase ) -+ : ReplacePartitionOptions( pt, fs, luksFs, luksPassphrase ) - , efiPartitionMountPoint( efi ) - , requiredSpaceB( requiredBytes > 0 ? quint64( requiredBytes ) : 0U ) - , swap( s ) -diff --git a/src/modules/partition/core/PartitionCoreModule.cpp b/src/modules/partition/core/PartitionCoreModule.cpp -index c2fd61db9..51e99f2d2 100644 ---- a/src/modules/partition/core/PartitionCoreModule.cpp -+++ b/src/modules/partition/core/PartitionCoreModule.cpp -@@ -619,7 +619,7 @@ findEssentialLVs( const QList< PartitionCoreModule::DeviceInfo* >& infos ) - continue; - } - -- for ( const auto& j : std::as_const( info->jobs() ) ) -+ for ( const auto& j : qAsConst( info->jobs() ) ) - { - FormatPartitionJob* format = dynamic_cast< FormatPartitionJob* >( j.data() ); - if ( format ) -diff --git a/src/modules/partition/core/PartitionCoreModule.h b/src/modules/partition/core/PartitionCoreModule.h -index 08b92abab..40a1916a9 100644 ---- a/src/modules/partition/core/PartitionCoreModule.h -+++ b/src/modules/partition/core/PartitionCoreModule.h -@@ -16,7 +16,6 @@ - #include "core/KPMHelpers.h" - #include "core/PartitionLayout.h" - #include "core/PartitionModel.h" --#include "core/DirFSRestrictLayout.h" - #include "jobs/PartitionJob.h" - - #include "Job.h" -@@ -168,9 +167,6 @@ public: - */ - PartitionLayout& partitionLayout() { return m_partLayout; } - -- /// @brief Get the directory filesystem restriction layout. -- DirFSRestrictLayout& dirFSRestrictLayout() { return m_dirFSRestrictLayout; } -- - void layoutApply( Device* dev, - qint64 firstSector, - qint64 lastSector, -@@ -274,7 +270,6 @@ private: - bool m_isDirty = false; - QString m_bootLoaderInstallPath; - PartitionLayout m_partLayout; -- DirFSRestrictLayout m_dirFSRestrictLayout; - - OsproberEntryList m_osproberLines; - -diff --git a/src/modules/partition/core/PartitionLayout.cpp b/src/modules/partition/core/PartitionLayout.cpp -index ff049784a..b476a3181 100644 ---- a/src/modules/partition/core/PartitionLayout.cpp -+++ b/src/modules/partition/core/PartitionLayout.cpp -@@ -221,7 +221,7 @@ PartitionLayout::createPartitions( Device* dev, - - // Let's check if we have enough space for each partitions, using the size - // propery or the min-size property if unit is in percentage. -- for ( const auto& entry : std::as_const( m_partLayout ) ) -+ for ( const auto& entry : qAsConst( m_partLayout ) ) - { - if ( !entry.partSize.isValid() ) - { -@@ -250,7 +250,7 @@ PartitionLayout::createPartitions( Device* dev, - if ( availableSectors < 0 ) - { - availableSectors = totalSectors; -- for ( const auto& entry : std::as_const( m_partLayout ) ) -+ for ( const auto& entry : qAsConst( m_partLayout ) ) - { - qint64 sectors = partSectorsMap.value( &entry ); - if ( entry.partMinSize.isValid() ) -@@ -263,7 +263,7 @@ PartitionLayout::createPartitions( Device* dev, - } - - // Assign sectors for percentage-defined partitions. -- for ( const auto& entry : std::as_const( m_partLayout ) ) -+ for ( const auto& entry : qAsConst( m_partLayout ) ) - { - if ( entry.partSize.unit() == Calamares::Partition::SizeUnit::Percent ) - { -@@ -286,7 +286,7 @@ PartitionLayout::createPartitions( Device* dev, - // Create the partitions. - currentSector = firstSector; - availableSectors = totalSectors; -- for ( const auto& entry : std::as_const( m_partLayout ) ) -+ for ( const auto& entry : qAsConst( m_partLayout ) ) - { - // Adjust partition size based on available space. - qint64 sectors = partSectorsMap.value( &entry ); -diff --git a/src/modules/partition/gui/BootInfoWidget.cpp b/src/modules/partition/gui/BootInfoWidget.cpp -index b4339be9a..eb70b4aaf 100644 ---- a/src/modules/partition/gui/BootInfoWidget.cpp -+++ b/src/modules/partition/gui/BootInfoWidget.cpp -@@ -42,7 +42,8 @@ BootInfoWidget::BootInfoWidget( QWidget* parent ) - QFontMetrics fm = QFontMetrics( QFont() ); - m_bootLabel->setMinimumWidth( fm.boundingRect( "BIOS" ).width() + Calamares::defaultFontHeight() / 2 ); - m_bootLabel->setAlignment( Qt::AlignCenter ); +diff --git a/src/modules/partition/gui/BootInfoWidget.cpp b/src/modules/partition/gui/BootInfoWidget.cpp +index b4339be..eb70b4a 100644 +--- a/src/modules/partition/gui/BootInfoWidget.cpp ++++ b/src/modules/partition/gui/BootInfoWidget.cpp +@@ -42,7 +42,8 @@ BootInfoWidget::BootInfoWidget( QWidget* parent ) + QFontMetrics fm = QFontMetrics( QFont() ); + m_bootLabel->setMinimumWidth( fm.boundingRect( "BIOS" ).width() + Calamares::defaultFontHeight() / 2 ); + m_bootLabel->setAlignment( Qt::AlignCenter ); - + m_bootLabel->setStyleSheet("background-color:#FFFFFF;"); + m_bootIcon->setStyleSheet("background-color:#FFFFFF;"); QPalette palette; - palette.setBrush( WindowText, QColor( "#4D4D4D" ) ); //dark grey - -@@ -62,7 +63,12 @@ BootInfoWidget::retranslateUi() - "Modern systems usually use EFI, but " - "may also show up as BIOS if started in compatibility " - "mode." ) ); -- -+ m_bootIcon->setStyleSheet( -+ "QLabel {" -+ "background-color: #ffffff;" -+ "color: black;" -+ "}" -+ ); - QString bootToolTip; - if ( PartUtils::isEfiSystem() ) - { -diff --git a/src/modules/partition/gui/ChoicePage.cpp b/src/modules/partition/gui/ChoicePage.cpp -index a7665bbbc..6185d3ff5 100644 ---- a/src/modules/partition/gui/ChoicePage.cpp -+++ b/src/modules/partition/gui/ChoicePage.cpp -@@ -34,7 +34,6 @@ - #include "Branding.h" - #include "GlobalStorage.h" - #include "JobQueue.h" --#include "compat/CheckBox.h" - #include "partition/PartitionIterator.h" - #include "partition/PartitionQuery.h" - #include "utils/Gui.h" -@@ -141,7 +140,6 @@ ChoicePage::retranslate() - - updateSwapChoicesTr(); - updateChoiceButtonsTr(); -- updateActionDescriptionsTr(); - } - - /** @brief Sets the @p model for the given @p box and adjusts UI sizes to match. -@@ -188,7 +186,7 @@ ChoicePage::init( PartitionCoreModule* core ) - - connect( m_drivesCombo, qOverload< int >( &QComboBox::currentIndexChanged ), this, &ChoicePage::applyDeviceChoice ); - connect( m_encryptWidget, &EncryptWidget::stateChanged, this, &ChoicePage::onEncryptWidgetStateChanged ); -- connect( m_reuseHomeCheckBox, Calamares::checkBoxStateChangedSignal, this, &ChoicePage::onHomeCheckBoxStateChanged ); -+ connect( m_reuseHomeCheckBox, &QCheckBox::stateChanged, this, &ChoicePage::onHomeCheckBoxStateChanged ); - - ChoicePage::applyDeviceChoice(); - } -@@ -362,8 +360,10 @@ ChoicePage::setupChoices() - Device* - ChoicePage::selectedDevice() - { -- Device* const currentDevice -+ Device* currentDevice = nullptr; -+ currentDevice - = m_core->deviceModel()->deviceForIndex( m_core->deviceModel()->index( m_drivesCombo->currentIndex() ) ); -+ - return currentDevice; - } - -@@ -467,6 +467,8 @@ ChoicePage::onActionChanged() - { - m_encryptWidget->setFilesystem( FileSystem::typeForName( m_replaceFsTypesChoiceComboBox->currentText() ) ); - } -+ -+ m_encryptWidget->setEncryptionCheckbox( m_config->preCheckEncryption() ); - } - - Device* currd = selectedDevice(); -@@ -586,21 +588,8 @@ ChoicePage::applyActionChoice( InstallChoice choice ) - &ChoicePage::doAlongsideSetupSplitter, - Qt::UniqueConnection ); - break; -- case InstallChoice::Manual: -- if ( m_core->isDirty() ) -- { -- ScanningDialog::run( -- QtConcurrent::run( -- [ = ] -- { -- QMutexLocker locker( &m_coreMutex ); -- m_core->revertDevice( selectedDevice() ); -- } ), -- [] {}, -- this ); -- } -- break; - case InstallChoice::NoChoice: -+ case InstallChoice::Manual: - break; - } - updateNextEnabled(); -@@ -1046,11 +1035,6 @@ ChoicePage::updateActionChoicePreview( InstallChoice choice ) - if ( m_enableEncryptionWidget ) - { - m_encryptWidget->show(); -- if ( m_config->preCheckEncryption() && !m_preCheckActivated ) -- { -- m_encryptWidget->setEncryptionCheckbox( true ); -- m_preCheckActivated = true; -- } - } - m_previewBeforeLabel->setText( tr( "Current:", "@label" ) ); - m_selectLabel->setText( tr( "Select a partition to shrink, " -@@ -1103,15 +1087,7 @@ ChoicePage::updateActionChoicePreview( InstallChoice choice ) - case InstallChoice::Erase: - case InstallChoice::Replace: - { -- if ( shouldShowEncryptWidget( choice ) ) -- { -- m_encryptWidget->show(); -- if ( m_config->preCheckEncryption() && !m_preCheckActivated ) -- { -- m_encryptWidget->setEncryptionCheckbox( true ); -- m_preCheckActivated = true; -- } -- } -+ m_encryptWidget->setVisible( shouldShowEncryptWidget( choice ) ); - m_previewBeforeLabel->setText( tr( "Current:", "@label" ) ); - m_afterPartitionBarsView = new PartitionBarsView( m_previewAfterFrame ); - m_afterPartitionBarsView->setNestedPartitionsMode( mode ); -@@ -1359,10 +1335,27 @@ ChoicePage::setupActions() - } - } - -- m_osproberEntriesCount = osproberEntriesForCurrentDevice.count(); -- if ( m_osproberEntriesCount == 0 ) -+ if ( osproberEntriesForCurrentDevice.count() == 0 ) - { -- m_osproberOneEntryName.clear(); -+ CALAMARES_RETRANSLATE( -+ cDebug() << "Setting texts for 0 osprober entries"; -+ m_messageLabel->setText( tr( "This storage device does not seem to have an operating system on it. " -+ "What would you like to do?
    " -+ "You will be able to review and confirm your choices " -+ "before any change is made to the storage device." ) ); -+ -+ m_eraseButton->setText( tr( "Automatic partitioning
    " -+ "This will delete all data " -+ "currently present on the selected storage device." ) ); -+ -+ m_alongsideButton->setText( tr( "Install alongside
    " -+ "The installer will shrink a partition to make room for %1." ) -+ .arg( Calamares::Branding::instance()->shortVersionedName() ) ); -+ -+ m_replaceButton->setText( tr( "Replace a partition
    " -+ "Replaces a partition with %1." ) -+ .arg( Calamares::Branding::instance()->shortVersionedName() ) ); ); -+ - m_replaceButton->hide(); - m_alongsideButton->hide(); - m_grp->setExclusive( false ); -@@ -1370,16 +1363,78 @@ ChoicePage::setupActions() - m_alongsideButton->setChecked( false ); - m_grp->setExclusive( true ); - } -- else if ( m_osproberEntriesCount == 1 ) -+ else if ( osproberEntriesForCurrentDevice.count() == 1 ) - { -- m_osproberOneEntryName = osproberEntriesForCurrentDevice.first().prettyName; -+ QString osName = osproberEntriesForCurrentDevice.first().prettyName; -+ -+ if ( !osName.isEmpty() ) -+ { -+ CALAMARES_RETRANSLATE( -+ cDebug() << "Setting texts for 1 non-empty osprober entry"; -+ m_messageLabel->setText( tr( "This storage device has %1 on it. " -+ "What would you like to do?
    " -+ "You will be able to review and confirm your choices " -+ "before any change is made to the storage device." ) -+ .arg( osName ) ); -+ -+ m_alongsideButton->setText( tr( "Install alongside
    " -+ "The installer will shrink a partition to make room for %1." ) -+ .arg( Calamares::Branding::instance()->shortVersionedName() ) ); -+ -+ m_eraseButton->setText( tr( "Automatic partitioning
    " -+ "This will delete all data " -+ "currently present on the selected storage device." ) ); -+ -+ m_replaceButton->setText( tr( "Replace a partition
    " -+ "Replaces a partition with %1." ) -+ .arg( Calamares::Branding::instance()->shortVersionedName() ) ); ); -+ } -+ else -+ { -+ CALAMARES_RETRANSLATE( -+ cDebug() << "Setting texts for 1 empty osprober entry"; -+ m_messageLabel->setText( tr( "This storage device already has an operating system on it. " -+ "What would you like to do?
    " -+ "You will be able to review and confirm your choices " -+ "before any change is made to the storage device." ) ); -+ -+ m_alongsideButton->setText( tr( "Install alongside
    " -+ "The installer will shrink a partition to make room for %1." ) -+ .arg( Calamares::Branding::instance()->shortVersionedName() ) ); -+ -+ m_eraseButton->setText( tr( "Automatic partitioning
    " -+ "This will delete all data " -+ "currently present on the selected storage device." ) ); -+ -+ m_replaceButton->setText( tr( "Replace a partition
    " -+ "Replaces a partition with %1." ) -+ .arg( Calamares::Branding::instance()->shortVersionedName() ) ); ); -+ } - } - else - { - // osproberEntriesForCurrentDevice has at least 2 items. -- m_osproberOneEntryName.clear(); -+ -+ CALAMARES_RETRANSLATE( -+ cDebug() << "Setting texts for >= 2 osprober entries"; -+ -+ m_messageLabel->setText( tr( "This storage device has multiple operating systems on it. " -+ "What would you like to do?
    " -+ "You will be able to review and confirm your choices " -+ "before any change is made to the storage device." ) ); -+ -+ m_alongsideButton->setText( tr( "Install alongside
    " -+ "The installer will shrink a partition to make room for %1." ) -+ .arg( Calamares::Branding::instance()->shortVersionedName() ) ); -+ -+ m_eraseButton->setText( tr( "Automatic partitioning
    " -+ "This will delete all data " -+ "currently present on the selected storage device." ) ); -+ -+ m_replaceButton->setText( tr( "Replace a partition
    " -+ "Replaces a partition with %1." ) -+ .arg( Calamares::Branding::instance()->shortVersionedName() ) ); ); - } -- updateActionDescriptionsTr(); - - #ifdef DEBUG_PARTITION_UNSAFE - #ifdef DEBUG_PARTITION_BAIL_OUT -@@ -1538,7 +1593,7 @@ ChoicePage::calculateNextEnabled() const - { - case EncryptWidget::Encryption::Unconfirmed: - cDebug() << "No passphrase provided or passphrase mismatch."; -- return false; -+ //return false; - case EncryptWidget::Encryption::Disabled: - case EncryptWidget::Encryption::Confirmed: - // Checkbox not checked, **or** passphrases match -@@ -1717,97 +1772,3 @@ ChoicePage::shouldShowEncryptWidget( Config::InstallChoice choice ) const - = choice == InstallChoice::Erase || choice == InstallChoice::Alongside || choice == InstallChoice::Replace; - return suitableChoice && m_enableEncryptionWidget && suitableFS; - } -- --void --ChoicePage::updateActionDescriptionsTr() --{ -- if ( m_osproberEntriesCount == 0 ) -- { -- cDebug() << "Setting texts for 0 osprober entries"; -- m_messageLabel->setText( tr( "This storage device does not seem to have an operating system on it. " -- "What would you like to do?
    " -- "You will be able to review and confirm your choices " -- "before any change is made to the storage device." ) ); -- -- m_eraseButton->setText( tr( "Erase disk
    " -- "This will delete all data " -- "currently present on the selected storage device." ) ); -- -- m_alongsideButton->setText( tr( "Install alongside
    " -- "The installer will shrink a partition to make room for %1." ) -- .arg( Calamares::Branding::instance()->shortVersionedName() ) ); -- -- m_replaceButton->setText( tr( "Replace a partition
    " -- "Replaces a partition with %1." ) -- .arg( Calamares::Branding::instance()->shortVersionedName() ) ); -- } -- if ( m_osproberEntriesCount == 1 ) -- { -- if ( !m_osproberOneEntryName.isEmpty() ) -- { -- cDebug() << "Setting texts for 1 non-empty osprober entry"; -- m_messageLabel->setText( tr( "This storage device has %1 on it. " -- "What would you like to do?
    " -- "You will be able to review and confirm your choices " -- "before any change is made to the storage device." ) -- .arg( m_osproberOneEntryName ) ); -- -- m_alongsideButton->setText( tr( "Install alongside
    " -- "The installer will shrink a partition to make room for %1." ) -- .arg( Calamares::Branding::instance()->shortVersionedName() ) ); -- -- m_eraseButton->setText( tr( "Erase disk
    " -- "This will delete all data " -- "currently present on the selected storage device." ) ); -- -- m_replaceButton->setText( tr( "Replace a partition
    " -- "Replaces a partition with %1." ) -- .arg( Calamares::Branding::instance()->shortVersionedName() ) ); -- } -- else -- { -- cDebug() << "Setting texts for 1 empty osprober entry"; -- m_messageLabel->setText( tr( "This storage device already has an operating system on it. " -- "What would you like to do?
    " -- "You will be able to review and confirm your choices " -- "before any change is made to the storage device." ) ); -- -- m_alongsideButton->setText( tr( "Install alongside
    " -- "The installer will shrink a partition to make room for %1." ) -- .arg( Calamares::Branding::instance()->shortVersionedName() ) ); -- -- m_eraseButton->setText( tr( "Erase disk
    " -- "This will delete all data " -- "currently present on the selected storage device." ) ); -- -- m_replaceButton->setText( tr( "Replace a partition
    " -- "Replaces a partition with %1." ) -- .arg( Calamares::Branding::instance()->shortVersionedName() ) ); -- } -- } -- if ( m_osproberEntriesCount >= 2 ) -- { -- cDebug() << "Setting texts for >= 2 osprober entries"; -- -- m_messageLabel->setText( tr( "This storage device has multiple operating systems on it. " -- "What would you like to do?
    " -- "You will be able to review and confirm your choices " -- "before any change is made to the storage device." ) ); -- -- m_alongsideButton->setText( tr( "Install alongside
    " -- "The installer will shrink a partition to make room for %1." ) -- .arg( Calamares::Branding::instance()->shortVersionedName() ) ); -- -- m_eraseButton->setText( tr( "Erase disk
    " -- "This will delete all data " -- "currently present on the selected storage device." ) ); -- -- m_replaceButton->setText( tr( "Replace a partition
    " -- "Replaces a partition with %1." ) -- .arg( Calamares::Branding::instance()->shortVersionedName() ) ); -- } -- if ( m_osproberEntriesCount < 0 ) -- { -- cWarning() << "Invalid osprober count, labels and buttons not updated."; -- } --} -diff --git a/src/modules/partition/gui/ChoicePage.h b/src/modules/partition/gui/ChoicePage.h -index 6a777e20d..7deb4dec6 100644 ---- a/src/modules/partition/gui/ChoicePage.h -+++ b/src/modules/partition/gui/ChoicePage.h -@@ -136,7 +136,6 @@ private: - // Translations support - void updateSwapChoicesTr(); - void updateChoiceButtonsTr(); -- void updateActionDescriptionsTr(); - - Config* m_config; - bool m_nextEnabled; -@@ -169,11 +168,8 @@ private: - QPointer< QComboBox > m_efiComboBox; - - int m_lastSelectedDeviceIndex = -1; -- int m_osproberEntriesCount = -1; -- QString m_osproberOneEntryName; - - bool m_enableEncryptionWidget = false; -- bool m_preCheckActivated = false; - - QMutex m_coreMutex; - }; -diff --git a/src/modules/partition/gui/CreatePartitionDialog.cpp b/src/modules/partition/gui/CreatePartitionDialog.cpp -index 213f5c793..d18676138 100644 ---- a/src/modules/partition/gui/CreatePartitionDialog.cpp -+++ b/src/modules/partition/gui/CreatePartitionDialog.cpp -@@ -18,7 +18,6 @@ - #include "core/KPMHelpers.h" - #include "core/PartUtils.h" - #include "core/PartitionInfo.h" --#include "core/PartitionCoreModule.h" - #include "gui/PartitionDialogHelpers.h" - #include "gui/PartitionSizeController.h" - -@@ -47,14 +46,18 @@ - using Calamares::Partition::untranslatedFS; - using Calamares::Partition::userVisibleFS; - --CreatePartitionDialog::CreatePartitionDialog( PartitionCoreModule* core, -- Device* device, -+static QSet< FileSystem::Type > s_unmountableFS( { FileSystem::Unformatted, -+ FileSystem::LinuxSwap, -+ FileSystem::Extended, -+ FileSystem::Unknown, -+ FileSystem::Lvm2_PV } ); -+ -+CreatePartitionDialog::CreatePartitionDialog( Device* device, - PartitionNode* parentPartition, - const QStringList& usedMountPoints, - QWidget* parentWidget ) - : QDialog( parentWidget ) - , m_ui( new Ui_CreatePartitionDialog ) -- , m_core( core ) - , m_partitionSizeController( new PartitionSizeController( this ) ) - , m_device( device ) - , m_parent( parentPartition ) -@@ -79,7 +82,8 @@ CreatePartitionDialog::CreatePartitionDialog( PartitionCoreModule* core, - m_ui->lvNameLineEdit->setValidator( validator ); - } - -- if ( KPMHelpers::isMSDOSPartition( device->partitionTable()->type() ) ) -+ if ( device->partitionTable()->type() == PartitionTable::msdos -+ || device->partitionTable()->type() == PartitionTable::msdos_sectorbased ) - { - initMbrPartitionTypeUi(); - } -@@ -125,23 +129,17 @@ CreatePartitionDialog::CreatePartitionDialog( PartitionCoreModule* core, - this, - &CreatePartitionDialog::checkMountPointSelection ); - -- connect( m_ui->fsComboBox, -- &QComboBox::currentTextChanged, -- this, -- &CreatePartitionDialog::checkMountPointSelection ); -- - // Select a default - m_ui->fsComboBox->setCurrentIndex( defaultFsIndex ); - updateMountPointUi(); - checkMountPointSelection(); - } - --CreatePartitionDialog::CreatePartitionDialog( PartitionCoreModule* core, -- Device* device, -+CreatePartitionDialog::CreatePartitionDialog( Device* device, - const FreeSpace& freeSpacePartition, - const QStringList& usedMountPoints, - QWidget* parentWidget ) -- : CreatePartitionDialog( core, device, freeSpacePartition.p->parent(), usedMountPoints, parentWidget ) -+ : CreatePartitionDialog( device, freeSpacePartition.p->parent(), usedMountPoints, parentWidget ) - { - standardMountPoints( *( m_ui->mountPointComboBox ), QString() ); - setFlagList( *( m_ui->m_listFlags ), -@@ -150,12 +148,11 @@ CreatePartitionDialog::CreatePartitionDialog( PartitionCoreModule* core, - initPartResizerWidget( freeSpacePartition.p ); - } - --CreatePartitionDialog::CreatePartitionDialog( PartitionCoreModule* core, -- Device* device, -+CreatePartitionDialog::CreatePartitionDialog( Device* device, - const FreshPartition& existingNewPartition, - const QStringList& usedMountPoints, - QWidget* parentWidget ) -- : CreatePartitionDialog( core, device, existingNewPartition.p->parent(), usedMountPoints, parentWidget ) -+ : CreatePartitionDialog( device, existingNewPartition.p->parent(), usedMountPoints, parentWidget ) - { - standardMountPoints( *( m_ui->mountPointComboBox ), PartitionInfo::mountPoint( existingNewPartition.p ) ); - setFlagList( *( m_ui->m_listFlags ), -@@ -347,10 +344,8 @@ CreatePartitionDialog::updateMountPointUi() - void - CreatePartitionDialog::checkMountPointSelection() - { -- validateMountPoint( m_core, -- selectedMountPoint( m_ui->mountPointComboBox ), -+ validateMountPoint( selectedMountPoint( m_ui->mountPointComboBox ), - m_usedMountPoints, -- m_ui->fsComboBox->currentText(), - m_ui->mountPointExplanation, - m_ui->buttonBox->button( QDialogButtonBox::Ok ) ); - } -diff --git a/src/modules/partition/gui/CreatePartitionDialog.h b/src/modules/partition/gui/CreatePartitionDialog.h -index 75a0da096..38c65aaf6 100644 ---- a/src/modules/partition/gui/CreatePartitionDialog.h -+++ b/src/modules/partition/gui/CreatePartitionDialog.h -@@ -19,7 +19,7 @@ - #include - #include - --class PartitionCoreModule; -+ - class Device; - class Partition; - class PartitionNode; -@@ -39,8 +39,7 @@ private: - * - * This does all the shared UI setup. - */ -- CreatePartitionDialog( PartitionCoreModule* core, -- Device* device, -+ CreatePartitionDialog( Device* device, - PartitionNode* parentPartition, - const QStringList& usedMountPoints, - QWidget* parentWidget ); -@@ -60,8 +59,7 @@ public: - * Creating from free space makes a wholly new partition with - * no flags set at all. - */ -- CreatePartitionDialog( PartitionCoreModule* core, -- Device* device, -+ CreatePartitionDialog( Device* device, - const FreeSpace& freeSpacePartition, - const QStringList& usedMountPoints, - QWidget* parentWidget = nullptr ); -@@ -70,8 +68,7 @@ public: - * A partition previously newly created (e.g. via this dialog - * and the constructor above) can be re-edited. - */ -- CreatePartitionDialog( PartitionCoreModule* core, -- Device* device, -+ CreatePartitionDialog( Device* device, - const FreshPartition& existingNewPartition, - const QStringList& usedMountPoints, - QWidget* parentWidget = nullptr ); -@@ -87,7 +84,6 @@ private Q_SLOTS: - - private: - QScopedPointer< Ui_CreatePartitionDialog > m_ui; -- PartitionCoreModule* m_core; - PartitionSizeController* m_partitionSizeController; - Device* m_device; - PartitionNode* m_parent; -diff --git a/src/modules/partition/gui/DeviceInfoWidget.cpp b/src/modules/partition/gui/DeviceInfoWidget.cpp -index 628560fa4..a22344df9 100644 ---- a/src/modules/partition/gui/DeviceInfoWidget.cpp -+++ b/src/modules/partition/gui/DeviceInfoWidget.cpp -@@ -52,7 +52,18 @@ DeviceInfoWidget::DeviceInfoWidget( QWidget* parent ) - m_ptLabel->setAutoFillBackground( true ); - m_ptIcon->setPalette( palette ); - m_ptLabel->setPalette( palette ); -- -+ m_ptLabel->setStyleSheet( -+ "QLabel {" -+ "background-color: #ffffff;" -+ "color: black;" -+ "}" -+ ); -+ m_ptIcon->setStyleSheet( -+ "QLabel {" -+ "background-color: #ffffff;" -+ "color: black;" -+ "}" -+ ); - CALAMARES_RETRANSLATE_SLOT( &DeviceInfoWidget::retranslateUi ); - } - -@@ -73,15 +84,7 @@ DeviceInfoWidget::retranslateUi() - switch ( m_tableType ) - { - case PartitionTable::msdos: --#if WITH_KPMcore > 0x240801 -- // Pick your warning: either deprecation warning, or unchecked enum-switch --QT_WARNING_PUSH --QT_WARNING_DISABLE_DEPRECATED --#endif - case PartitionTable::msdos_sectorbased: --#if WITH_KPMcore > 0x240801 --QT_WARNING_POP --#endif - typeString = "MBR"; - toolTipString += tr( "

    This partition table type is only advisable on older " - "systems which start from a BIOS boot " -diff --git a/src/modules/partition/gui/EditExistingPartitionDialog.cpp b/src/modules/partition/gui/EditExistingPartitionDialog.cpp -index 2b9b9405b..7a3f4951a 100644 ---- a/src/modules/partition/gui/EditExistingPartitionDialog.cpp -+++ b/src/modules/partition/gui/EditExistingPartitionDialog.cpp -@@ -57,14 +57,12 @@ updateLabel( PartitionCoreModule* core, Device* device, Partition* partition, co - } - } - --EditExistingPartitionDialog::EditExistingPartitionDialog( PartitionCoreModule* core, -- Device* device, -+EditExistingPartitionDialog::EditExistingPartitionDialog( Device* device, - Partition* partition, - const QStringList& usedMountPoints, - QWidget* parentWidget ) - : QDialog( parentWidget ) - , m_ui( new Ui_EditExistingPartitionDialog ) -- , m_core( core ) - , m_device( device ) - , m_partition( partition ) - , m_partitionSizeController( new PartitionSizeController( this ) ) -@@ -83,11 +81,6 @@ EditExistingPartitionDialog::EditExistingPartitionDialog( PartitionCoreModule* c - this, - &EditExistingPartitionDialog::checkMountPointSelection ); - -- connect( m_ui->fileSystemComboBox, -- &QComboBox::currentTextChanged, -- this, -- &EditExistingPartitionDialog::checkMountPointSelection ); -- - // The filesystem label field is always enabled, because we may want to change - // the label on the current filesystem without formatting. - m_ui->fileSystemLabelEdit->setText( PartitionInfo::label( m_partition ) ); -@@ -352,10 +345,8 @@ EditExistingPartitionDialog::updateMountPointPicker() - void - EditExistingPartitionDialog::checkMountPointSelection() - { -- if ( validateMountPoint( m_core, -- selectedMountPoint( m_ui->mountPointComboBox ), -+ if ( validateMountPoint( selectedMountPoint( m_ui->mountPointComboBox ), - m_usedMountPoints, -- m_ui->fileSystemComboBox->currentText(), - m_ui->mountPointExplanation, - m_ui->buttonBox->button( QDialogButtonBox::Ok ) ) ) - { -diff --git a/src/modules/partition/gui/EditExistingPartitionDialog.h b/src/modules/partition/gui/EditExistingPartitionDialog.h -index 8674b8b62..5d1e7fd65 100644 ---- a/src/modules/partition/gui/EditExistingPartitionDialog.h -+++ b/src/modules/partition/gui/EditExistingPartitionDialog.h -@@ -37,8 +37,7 @@ public: - Partition* p; - }; - -- EditExistingPartitionDialog( PartitionCoreModule* core, -- Device* device, -+ EditExistingPartitionDialog( Device* device, - Partition* partition, - const QStringList& usedMountPoints, - QWidget* parentWidget = nullptr ); -@@ -51,7 +50,6 @@ private slots: - - private: - QScopedPointer< Ui_EditExistingPartitionDialog > m_ui; -- PartitionCoreModule* m_core; - Device* m_device; - Partition* m_partition; - PartitionSizeController* m_partitionSizeController; -diff --git a/src/modules/partition/gui/EncryptWidget.cpp b/src/modules/partition/gui/EncryptWidget.cpp -index 58c1f5143..ebb076ecf 100644 ---- a/src/modules/partition/gui/EncryptWidget.cpp -+++ b/src/modules/partition/gui/EncryptWidget.cpp -@@ -59,9 +59,8 @@ EncryptWidget::EncryptWidget( QWidget* parent ) - m_ui->m_encryptionUnsupportedLabel->setText( QStringLiteral( "🔓" ) ); - m_ui->m_encryptionUnsupportedLabel->show(); - } -- -- connect( -- m_ui->m_encryptCheckBox, Calamares::checkBoxStateChangedSignal, this, &EncryptWidget::onCheckBoxStateChanged ); -+ m_ui->m_encryptCheckBox->hide(); -+ connect( m_ui->m_encryptCheckBox, &QCheckBox::stateChanged, this, &EncryptWidget::onCheckBoxStateChanged ); - connect( m_ui->m_passphraseLineEdit, &QLineEdit::textEdited, this, &EncryptWidget::onPassphraseEdited ); - connect( m_ui->m_confirmLineEdit, &QLineEdit::textEdited, this, &EncryptWidget::onPassphraseEdited ); - -@@ -183,9 +182,7 @@ EncryptWidget::updateState( const bool notify ) - } - } - -- Encryption newState = state(); -- -- m_state = newState; -+ m_state = state(); - if ( notify ) - { - Q_EMIT stateChanged( m_state ); -@@ -204,12 +201,12 @@ EncryptWidget::onPassphraseEdited() - } - - void --EncryptWidget::onCheckBoxStateChanged( Calamares::checkBoxStateType checked ) -+EncryptWidget::onCheckBoxStateChanged( int checked ) - { -- const bool visible = ( checked != Calamares::checkBoxUncheckedValue ); -- m_ui->m_passphraseLineEdit->setVisible( visible ); -- m_ui->m_confirmLineEdit->setVisible( visible ); -- m_ui->m_iconLabel->setVisible( visible ); -+ // @p checked is a Qt::CheckState, 0 is "unchecked" and 2 is "checked" -+ m_ui->m_passphraseLineEdit->setVisible( checked ); -+ m_ui->m_confirmLineEdit->setVisible( checked ); -+ m_ui->m_iconLabel->setVisible( checked ); - m_ui->m_passphraseLineEdit->clear(); - m_ui->m_confirmLineEdit->clear(); - m_ui->m_iconLabel->clear(); -diff --git a/src/modules/partition/gui/EncryptWidget.h b/src/modules/partition/gui/EncryptWidget.h -index 6f3db7532..c7cc23daa 100644 ---- a/src/modules/partition/gui/EncryptWidget.h -+++ b/src/modules/partition/gui/EncryptWidget.h -@@ -13,8 +13,6 @@ - #ifndef ENCRYPTWIDGET_H - #define ENCRYPTWIDGET_H - --#include "compat/CheckBox.h" -- - #include - - #include -@@ -38,7 +36,7 @@ public: - - explicit EncryptWidget( QWidget* parent = nullptr ); - -- void setEncryptionCheckbox( bool preCheckEncrypt = false ); -+ void setEncryptionCheckbox( bool preCheckEncrypt = false); - void reset( bool checkVisible = true ); - - bool isEncryptionCheckboxChecked(); -@@ -61,7 +59,7 @@ signals: - private: - void updateState( const bool notify = true ); - void onPassphraseEdited(); -- void onCheckBoxStateChanged( Calamares::checkBoxStateType checked ); -+ void onCheckBoxStateChanged( int checked ); - - Ui::EncryptWidget* m_ui; - Encryption m_state; -diff --git a/src/modules/partition/gui/PartitionDialogHelpers.cpp b/src/modules/partition/gui/PartitionDialogHelpers.cpp -index db1943a23..b41c12cc9 100644 ---- a/src/modules/partition/gui/PartitionDialogHelpers.cpp -+++ b/src/modules/partition/gui/PartitionDialogHelpers.cpp -@@ -12,15 +12,12 @@ - #include "PartitionDialogHelpers.h" - - #include "core/PartUtils.h" --#include "core/PartitionCoreModule.h" - #include "gui/CreatePartitionDialog.h" - - #include "GlobalStorage.h" - #include "JobQueue.h" - #include "utils/Logger.h" - --#include -- - #include - #include - #include -@@ -84,7 +81,7 @@ setSelectedMountPoint( QComboBox& combo, const QString& selected ) - } - - bool --validateMountPoint( PartitionCoreModule* core, const QString& mountPoint, const QStringList& inUse, const QString& fileSystem, QLabel* label, QPushButton* button ) -+validateMountPoint( const QString& mountPoint, const QStringList& inUse, QLabel* label, QPushButton* button ) - { - QString msg; - bool ok = true; -@@ -98,58 +95,6 @@ validateMountPoint( PartitionCoreModule* core, const QString& mountPoint, const - { - msg = CreatePartitionDialog::tr( "Mountpoint must start with a /.", "@info" ); - ok = false; -- } else { -- // Validate the chosen filesystem + mountpoint combination. -- FileSystem::Type selectedFsType; -- PartUtils::canonicalFilesystemName( fileSystem, &selectedFsType ); -- bool fsTypeIsAllowed = false; -- if ( selectedFsType == FileSystem::Type::Unknown ) -- { -- fsTypeIsAllowed = true; -- } -- else -- { -- QList< FileSystem::Type > anyAllowedFsTypes = core->dirFSRestrictLayout().anyAllowedFSTypes(); -- for ( auto& anyAllowedFsType : anyAllowedFsTypes ) -- { -- if ( selectedFsType == anyAllowedFsType ) -- { -- fsTypeIsAllowed = true; -- break; -- } -- } -- } -- -- bool fsTypeIsAllowedForMountPoint = false; -- // We allow arbitrary unmountable filesystems here since an -- // unmountable filesystem has no mount point associated with it, thus -- // any filesystem restriction we'd find at this point would be -- // irrelevant. -- if ( selectedFsType == FileSystem::Type::Unknown || s_unmountableFS.contains( selectedFsType ) ) -- { -- fsTypeIsAllowedForMountPoint = true; -- } -- else -- { -- QList< FileSystem::Type > allowedFsTypes = core->dirFSRestrictLayout().allowedFSTypes( mountPoint, inUse, false ); -- for ( auto& allowedFsType : allowedFsTypes ) -- { -- if ( selectedFsType == allowedFsType ) -- { -- fsTypeIsAllowedForMountPoint = true; -- break; -- } -- } -- } -- -- if ( !fsTypeIsAllowed ) { -- msg = CreatePartitionDialog::tr( "Filesystem is prohibited by this distro. Consider selecting another one.", "@info" ); -- ok = true; -- } -- else if ( !fsTypeIsAllowedForMountPoint ) { -- msg = CreatePartitionDialog::tr( "Filesystem is prohibited for use on this mountpoint. Consider selecting a different filesystem or mountpoint.", "@info" ); -- ok = true; -- } - } - - if ( label ) -diff --git a/src/modules/partition/gui/PartitionDialogHelpers.h b/src/modules/partition/gui/PartitionDialogHelpers.h -index 4f77c3a71..eea0998c4 100644 ---- a/src/modules/partition/gui/PartitionDialogHelpers.h -+++ b/src/modules/partition/gui/PartitionDialogHelpers.h -@@ -13,23 +13,14 @@ - #define PARTITION_GUI_PARTITIONDIALOGHELPERS - - #include --#include - - #include --#include - --class PartitionCoreModule; - class QPushButton; - class QComboBox; - class QLabel; - class QListWidget; - --static QSet< FileSystem::Type > s_unmountableFS( { FileSystem::Unformatted, -- FileSystem::LinuxSwap, -- FileSystem::Extended, -- FileSystem::Unknown, -- FileSystem::Lvm2_PV } ); -- - /** - * Returns a list of standard mount points (e.g. /, /usr, ...). - * This also includes the EFI mount point if that is necessary -@@ -77,7 +68,7 @@ setSelectedMountPoint( QComboBox* combo, const QString& selected ) - * If it is not valid, returns @c false and sets the UI - * to explain why. - */ --bool validateMountPoint( PartitionCoreModule* core, const QString& mountPoint, const QStringList& inUse, const QString& fileSystem, QLabel* label, QPushButton* button ); -+bool validateMountPoint( const QString& mountPoint, const QStringList& inUse, QLabel* label, QPushButton* button ); - - /** - * Get the flags that have been checked in the list widget. -diff --git a/src/modules/partition/gui/PartitionPage.cpp b/src/modules/partition/gui/PartitionPage.cpp -index a5f4365d7..28b4d8583 100644 ---- a/src/modules/partition/gui/PartitionPage.cpp -+++ b/src/modules/partition/gui/PartitionPage.cpp -@@ -15,7 +15,6 @@ - #include "PartitionPage.h" - - // Local --#include "Config.h" - #include "core/BootLoaderModel.h" - #include "core/DeviceModel.h" - #include "core/KPMHelpers.h" -@@ -40,12 +39,14 @@ - #include "utils/Retranslator.h" - #include "widgets/TranslationFix.h" - -+// KPMcore - #include - #include - #include - #include - #include - -+// Qt - #include - #include - #include -@@ -54,17 +55,14 @@ - #include - #include - --PartitionPage::PartitionPage( PartitionCoreModule* core, const Config & config, QWidget* parent ) -+PartitionPage::PartitionPage( PartitionCoreModule* core, QWidget* parent ) - : QWidget( parent ) - , m_ui( new Ui_PartitionPage ) - , m_core( core ) - , m_lastSelectedBootLoaderIndex( -1 ) -- , m_isEfi( PartUtils::isEfiSystem() ) -+ , m_isEfi( false ) - { -- if ( config.installChoice() != Config::InstallChoice::Manual ) -- { -- cWarning() << "Manual partitioning page created without user choosing manual-partitioning."; -- } -+ m_isEfi = PartUtils::isEfiSystem(); - - m_ui->setupUi( this ); - m_ui->partitionLabelsView->setVisible( -@@ -78,8 +76,6 @@ PartitionPage::PartitionPage( PartitionCoreModule* core, const Config & config, - ? PartitionBarsView::DrawNestedPartitions - : PartitionBarsView::NoNestedPartitions; - m_ui->partitionBarsView->setNestedPartitionsMode( mode ); -- m_ui->lvmButtonPanel->setVisible( config.isLVMEnabled() ); -- - updateButtons(); - updateBootLoaderInstallPath(); - -@@ -119,10 +115,7 @@ PartitionPage::PartitionPage( PartitionCoreModule* core, const Config & config, - m_ui->label_3->hide(); - } - -- CALAMARES_RETRANSLATE( -- m_ui->retranslateUi( this ); -- m_core->bootLoaderModel()->update(); // Need to re-translate entries in the combo-box -- ); -+ CALAMARES_RETRANSLATE( m_ui->retranslateUi( this ); ); - } - - PartitionPage::~PartitionPage() {} -@@ -255,7 +248,7 @@ PartitionPage::checkCanCreate( Device* device ) - { - auto table = device->partitionTable(); - -- if ( KPMHelpers::isMSDOSPartition( table->type() ) ) -+ if ( table->type() == PartitionTable::msdos || table->type() == PartitionTable::msdos_sectorbased ) - { - cDebug() << "Checking MSDOS partition" << table->numPrimaries() << "primaries, max" << table->maxPrimaries(); - -@@ -411,7 +404,7 @@ PartitionPage::onCreateClicked() - } - - QPointer< CreatePartitionDialog > dlg = new CreatePartitionDialog( -- m_core, model->device(), CreatePartitionDialog::FreeSpace { partition }, getCurrentUsedMountpoints(), this ); -+ model->device(), CreatePartitionDialog::FreeSpace { partition }, getCurrentUsedMountpoints(), this ); - if ( dlg->exec() == QDialog::Accepted ) - { - Partition* newPart = dlg->getNewlyCreatedPartition(); -@@ -515,7 +508,7 @@ PartitionPage::updatePartitionToCreate( Device* device, Partition* partition ) - mountPoints.removeOne( PartitionInfo::mountPoint( partition ) ); - - QPointer< CreatePartitionDialog > dlg -- = new CreatePartitionDialog( m_core, device, CreatePartitionDialog::FreshPartition { partition }, mountPoints, this ); -+ = new CreatePartitionDialog( device, CreatePartitionDialog::FreshPartition { partition }, mountPoints, this ); - if ( dlg->exec() == QDialog::Accepted ) - { - Partition* newPartition = dlg->getNewlyCreatedPartition(); -@@ -532,14 +525,12 @@ PartitionPage::editExistingPartition( Device* device, Partition* partition ) - mountPoints.removeOne( PartitionInfo::mountPoint( partition ) ); - - QPointer< EditExistingPartitionDialog > dlg -- = new EditExistingPartitionDialog( m_core, device, partition, mountPoints, this ); -+ = new EditExistingPartitionDialog( device, partition, mountPoints, this ); - if ( dlg->exec() == QDialog::Accepted ) - { - dlg->applyChanges( m_core ); - } - delete dlg; -- -- updateBootLoaderInstallPath(); - } - - void -diff --git a/src/modules/partition/gui/PartitionPage.h b/src/modules/partition/gui/PartitionPage.h -index 85021d5a0..d3ae60eb8 100644 ---- a/src/modules/partition/gui/PartitionPage.h -+++ b/src/modules/partition/gui/PartitionPage.h -@@ -16,7 +16,6 @@ - #include - #include - --class Config; - class PartitionCoreModule; - class Ui_PartitionPage; - -@@ -33,7 +32,7 @@ class PartitionPage : public QWidget - { - Q_OBJECT - public: -- explicit PartitionPage( PartitionCoreModule* core, const Config & config, QWidget* parent = nullptr ); -+ explicit PartitionPage( PartitionCoreModule* core, QWidget* parent = nullptr ); - ~PartitionPage() override; - - void onRevertClicked(); -diff --git a/src/modules/partition/gui/PartitionPage.ui b/src/modules/partition/gui/PartitionPage.ui -index 7de478c33..ddbd21bf6 100644 ---- a/src/modules/partition/gui/PartitionPage.ui -+++ b/src/modules/partition/gui/PartitionPage.ui -@@ -11,7 +11,7 @@ SPDX-License-Identifier: GPL-3.0-or-later - 0 - 0 - 684 -- 327 -+ 304 - - - -@@ -129,38 +129,36 @@ SPDX-License-Identifier: GPL-3.0-or-later - - - -- -- -- -- -- -- New Volume Group -- -- -- -- -- -- -- Resize Volume Group -- -- -- -- -- -- -- Deactivate Volume Group -- -- -- -- -- -- -- Remove Volume Group -- -- -- -- -- -+ -+ -+ -+ -+ New Volume Group -+ -+ -+ -+ -+ -+ -+ Resize Volume Group -+ -+ -+ -+ -+ -+ -+ Deactivate Volume Group -+ -+ -+ -+ -+ -+ -+ Remove Volume Group -+ -+ -+ -+ - - - -diff --git a/src/modules/partition/jobs/ClearMountsJob.cpp b/src/modules/partition/jobs/ClearMountsJob.cpp -index 2865d9538..d36c4e512 100644 ---- a/src/modules/partition/jobs/ClearMountsJob.cpp -+++ b/src/modules/partition/jobs/ClearMountsJob.cpp -@@ -260,7 +260,7 @@ STATICTEST MessageAndPath - tryUmount( const QString& partPath ) - { - QProcess process; -- process.start( "umount", { partPath } ); -+ process.start( "umount", { "-l", partPath } ); - process.waitForFinished(); - if ( process.exitCode() == 0 ) - { -@@ -317,6 +317,51 @@ tryCryptoClose( const QString& mapperPath ) - return {}; - } - -+STATICTEST MessageAndPath -+tryClearLVM(const QString& LVMPath) -+{ -+ tryUmount( LVMPath ); -+ -+ QProcess process; -+ process.start( "dmsetup", {"remove", LVMPath } ); -+ process.waitForFinished(); -+ if ( process.exitCode() == 0 ) -+ { -+ return { QT_TRANSLATE_NOOP( "ClearMountsJob", "Successfully removed LVM %1." ), LVMPath }; -+ } -+ return {}; -+} -+ -+STATICTEST MessageAndPath -+mpathClear(const QString& deviceName) -+{ -+ QString devicePath = "/dev/" + deviceName; -+ QProcess process; -+ process.start("multipath", { "-ll", devicePath } ); -+ process.waitForFinished(); -+ if( process.exitCode() == 0 ) -+ { -+ QStringList multiPathLines = QString::fromLocal8Bit( process.readAllStandardOutput() ).split( '\n' ); -+ QStringList firstLines = multiPathLines.first().split(' '); -+ QString mpath = firstLines.first(); -+ return tryClearLVM("/dev/mapper/" + mpath); -+ } -+ return {}; -+} -+ -+STATICTEST MessageAndPath -+diskClear(const QString& diskPath) -+{ -+ QString devicePath = "/dev/" + diskPath; -+ QProcess process; -+ process.start( "wipefs", { "-af", devicePath } ); -+ process.waitForFinished(); -+ if( process.exitCode() == 0 ) -+ { -+ return { QT_TRANSLATE_NOOP( "ClearMountsJob", "Successfully cleared %1." ), diskPath }; -+ } -+ return {}; -+} - STATICTEST MessageAndPath - tryVGDisable( const QString& vgName ) - { -@@ -333,7 +378,7 @@ template < typename F > - void - apply( const QStringList& paths, F f, QList< MessageAndPath >& news ) - { -- for ( const QString& p : std::as_const( paths ) ) -+ for ( const QString& p : qAsConst( paths ) ) - { - auto n = f( p ); - if ( !n.isEmpty() ) -@@ -347,7 +392,7 @@ STATICTEST QStringList - stringify( const QList< MessageAndPath >& news ) - { - QStringList l; -- for ( const auto& m : std::as_const( news ) ) -+ for ( const auto& m : qAsConst( news ) ) - { - l << QString( m ); - } -@@ -380,12 +425,14 @@ ClearMountsJob::exec() - QList< MessageAndPath > goodNews; - - apply( getCryptoDevices( m_mapperExceptions ), tryCryptoClose, goodNews ); -- apply( getLVMVolumes(), tryUmount, goodNews ); -+ apply( getLVMVolumes(), tryClearLVM, goodNews ); - apply( getPVGroups( deviceName ), tryVGDisable, goodNews ); - - apply( getCryptoDevices( m_mapperExceptions ), tryCryptoClose, goodNews ); - apply( getPartitionsForDevice( deviceName ), tryUmount, goodNews ); - apply( getSwapsForDevice( m_deviceNode ), tryClearSwap, goodNews ); -+ diskClear(deviceName); -+ mpathClear(deviceName); - - Calamares::JobResult ok = Calamares::JobResult::ok(); - ok.setMessage( tr( "Cleared all mounts for %1" ).arg( m_deviceNode ) ); -diff --git a/src/modules/partition/jobs/ClearTempMountsJob.cpp b/src/modules/partition/jobs/ClearTempMountsJob.cpp -index f231983de..cb0fb572e 100644 ---- a/src/modules/partition/jobs/ClearTempMountsJob.cpp -+++ b/src/modules/partition/jobs/ClearTempMountsJob.cpp -@@ -56,7 +56,7 @@ ClearTempMountsJob::exec() - std::sort( targetMounts.begin(), targetMounts.end(), MtabInfo::mountPointOrder ); - - QStringList goodNews; -- for ( const auto& m : std::as_const( targetMounts ) ) -+ for ( const auto& m : qAsConst( targetMounts ) ) - { - cDebug() << o << "Will try to umount path" << m.mountPoint; - if ( Calamares::Partition::unmount( m.mountPoint, { "-lv" } ) == 0 ) -diff --git a/src/modules/partition/partition.conf b/src/modules/partition/partition.conf -index 2f56df715..3d335432f 100644 ---- a/src/modules/partition/partition.conf -+++ b/src/modules/partition/partition.conf -@@ -170,12 +170,11 @@ initialSwapChoice: none - # manual partitioning, this partition table exists already on disk - # and it is left unmodified. - # --# Possible values: gpt, msdos (or other names defined by KPMcore). --# Names are case-sensitive. --# -+# Suggested values: gpt, msdos - # If nothing is specified, Calamares defaults to "gpt" if system is --# efi or "msdos" otherwise. -+# efi or "msdos". - # -+# Names are case-sensitive and defined by KPMCore. - # defaultPartitionTableType: msdos - - # Requirement for partition table type -@@ -183,8 +182,7 @@ initialSwapChoice: none - # Restrict the installation on disks that match the type of partition - # tables that are specified. - # --# Possible values: msdos, gpt (or other names defined by KPMcore). --# Names are case-sensitive. -+# Possible values: msdos, gpt. Names are case-sensitive and defined by KPMCore. - # - # If nothing is specified, Calamares defaults to both "msdos" and "gpt". - # -@@ -223,49 +221,6 @@ defaultFileSystemType: "ext4" - # warning (this matches traditional no-choice-available behavior best). - # availableFileSystemTypes: ["ext4","f2fs"] - --# Per-directory filesystem restrictions. --# --# This optional setting specifies what filesystems the user can and cannot use --# for various directories and mountpoints when using manual partitioning. --# --# If nothing is specified, the only restriction enforced by default is that --# the EFI system partition must use the fat32 filesystem. --# --# Otherwise, the filesystem restrictions are defined as follow: --# --# directoryFilesystemRestrictions: --# - directory: "any" --# allowedFilesystemTypes: ["all"] --# - directory: "/" --# allowedFilesystemTypes: ["ext4","xfs","btrfs","jfs","f2fs"] --# - mountpoint: "efi" --# allowedFilesystemTypes: ["fat32"] --# onlyWhenMountpoint: true --# --# There can be any number of mountpoints listed, each entry having the --# following attributes: --# - mountpoint: mountpoint's full path --# or --# "any" to specify a global whitelist that applies to all --# mountpoints --# or --# "efi" to specify a whitelist specific to the EFI system --# partition, wherever that partition is located --# - allowedFilesystemTypes: the list of all filesystems valid for this --# mountpoint. If the list contains exactly one --# element, and that element is the special value --# "any", all filesystem types recognized by --# Calamares will be allowed. --# - onlyWhenMountpoint: Whether the restriction should apply only when the --# specified directory is a mountpoint. When set to --# true, Calamares will only enforce the listed --# restrictions when the user makes a separate partition --# for this directory and assigns the mountpoint --# accordingly. When set to false, Calamares will --# ensure this directory uses the specified filesystem --# even if the directory is part of a filesystem on a --# different mountpoint. Defaults to false. -- - # Show/hide LUKS related functionality in automated partitioning modes. - # Disable this if you choose not to deploy early unlocking support in GRUB2 - # and/or your distribution's initramfs solution. -@@ -290,13 +245,6 @@ defaultFileSystemType: "ext4" - # to cypher their disk when installing in enterprise (for exemple). - #preCheckEncryption: false - --# LVM support --# --# There is only one sub-key available, *enable* (defaults to true) --# which can be used to show (default) or hide the LVM buttons in the partitioning module. --lvm: -- enable: true -- - # Partition layout. - # - # This optional setting specifies a custom partition layout. -diff --git a/src/modules/partition/partition.schema.yaml b/src/modules/partition/partition.schema.yaml -index 4bd2fa4ae..65bc723f5 100644 ---- a/src/modules/partition/partition.schema.yaml -+++ b/src/modules/partition/partition.schema.yaml -@@ -20,12 +20,6 @@ properties: - mountPoint: { type: string } - additionalProperties: false - -- lvm: -- type: object -- properties: -- enable: { type: boolean, default: true } -- additionalProperties: false -- - userSwapChoices: { type: array, items: { type: string, enum: [ none, reuse, small, suspend, file ] } } - # ensureSuspendToDisk: { type: boolean, default: true } # Legacy - # neverCreateSwap: { type: boolean, default: false } # Legacy -@@ -37,7 +31,6 @@ properties: - - defaultFileSystemType: { type: string } - availableFileSystemTypes: { type: array, items: { type: string } } -- mountpointFilesystemRestrictions: { type: array } # TODO: specify items - - luksGeneration: { type: string, enum: [luks1, luks2] } # Also allows "luks" as alias of "luks1" - enableLuksAutomatedPartitioning: { type: boolean, default: false } -diff --git a/src/modules/partition/tests/CreateLayoutsTests.cpp b/src/modules/partition/tests/CreateLayoutsTests.cpp -index 3562ab958..87a1ea484 100644 ---- a/src/modules/partition/tests/CreateLayoutsTests.cpp -+++ b/src/modules/partition/tests/CreateLayoutsTests.cpp -@@ -53,19 +53,18 @@ CreateLayoutsTests::cleanup() - void - CreateLayoutsTests::testFixedSizePartition() - { -- const PartitionRole role( PartitionRole::Role::Any ); -- - PartitionLayout layout = PartitionLayout(); - TestDevice dev( QString( "test" ), LOGICAL_SIZE, 5_GiB / LOGICAL_SIZE ); -- PartitionTable table( PartitionTable::TableType::msdos, 0, 5_GiB ); -+ PartitionRole role( PartitionRole::Role::Any ); -+ QList< Partition* > partitions; - - if ( !layout.addEntry( { FileSystem::Type::Ext4, QString( "/" ), QString( "5MiB" ) } ) ) - { - QFAIL( qPrintable( "Unable to create / partition" ) ); - } - -- const auto partitions = layout.createPartitions( -- static_cast< Device* >( &dev ), 0, dev.totalLogical(), Config::LuksGeneration::Luks1, nullptr, &table, role ); -+ partitions = layout.createPartitions( -+ static_cast< Device* >( &dev ), 0, dev.totalLogical(), Config::LuksGeneration::Luks1, nullptr, nullptr, role ); - - QCOMPARE( partitions.count(), 1 ); + palette.setBrush( WindowText, QColor( "#4D4D4D" ) ); //dark grey -@@ -75,19 +74,18 @@ CreateLayoutsTests::testFixedSizePartition() - void - CreateLayoutsTests::testPercentSizePartition() - { -- const PartitionRole role( PartitionRole::Role::Any ); +@@ -62,7 +63,12 @@ BootInfoWidget::retranslateUi() + "Modern systems usually use EFI, but " + "may also show up as BIOS if started in compatibility " + "mode." ) ); - - PartitionLayout layout = PartitionLayout(); - TestDevice dev( QString( "test" ), LOGICAL_SIZE, 5_GiB / LOGICAL_SIZE ); -- PartitionTable table( PartitionTable::TableType::msdos, 0, 5_GiB ); -+ PartitionRole role( PartitionRole::Role::Any ); -+ QList< Partition* > partitions; - - if ( !layout.addEntry( { FileSystem::Type::Ext4, QString( "/" ), QString( "50%" ) } ) ) ++ m_bootIcon->setStyleSheet( ++ "QLabel {" ++ "background-color: #ffffff;" ++ "color: black;" ++ "}" ++ ); + QString bootToolTip; + if ( PartUtils::isEfiSystem() ) { - QFAIL( qPrintable( "Unable to create / partition" ) ); - } +diff --git a/src/modules/partition/gui/ChoicePage.cpp b/src/modules/partition/gui/ChoicePage.cpp +index 62cf0f6..6185d3f 100644 +--- a/src/modules/partition/gui/ChoicePage.cpp ++++ b/src/modules/partition/gui/ChoicePage.cpp +@@ -1344,7 +1344,7 @@ ChoicePage::setupActions() + "You will be able to review and confirm your choices " + "before any change is made to the storage device." ) ); -- const auto partitions = layout.createPartitions( -- static_cast< Device* >( &dev ), 0, dev.totalLogical(), Config::LuksGeneration::Luks1, nullptr, &table, role ); -+ partitions = layout.createPartitions( -+ static_cast< Device* >( &dev ), 0, dev.totalLogical(), Config::LuksGeneration::Luks1, nullptr, nullptr, role ); +- m_eraseButton->setText( tr( "Erase disk
    " ++ m_eraseButton->setText( tr( "Automatic partitioning
    " + "This will delete all data " + "currently present on the selected storage device." ) ); - QCOMPARE( partitions.count(), 1 ); +@@ -1381,7 +1381,7 @@ ChoicePage::setupActions() + "The installer will shrink a partition to make room for %1." ) + .arg( Calamares::Branding::instance()->shortVersionedName() ) ); -@@ -97,11 +95,10 @@ CreateLayoutsTests::testPercentSizePartition() - void - CreateLayoutsTests::testMixedSizePartition() - { -- const PartitionRole role( PartitionRole::Role::Any ); -- - PartitionLayout layout = PartitionLayout(); - TestDevice dev( QString( "test" ), LOGICAL_SIZE, 5_GiB / LOGICAL_SIZE ); -- PartitionTable table( PartitionTable::TableType::msdos, 0, 5_GiB ); -+ PartitionRole role( PartitionRole::Role::Any ); -+ QList< Partition* > partitions; +- m_eraseButton->setText( tr( "Erase disk
    " ++ m_eraseButton->setText( tr( "Automatic partitioning
    " + "This will delete all data " + "currently present on the selected storage device." ) ); - if ( !layout.addEntry( { FileSystem::Type::Ext4, QString( "/" ), QString( "5MiB" ) } ) ) - { -@@ -118,8 +115,8 @@ CreateLayoutsTests::testMixedSizePartition() - QFAIL( qPrintable( "Unable to create /bkup partition" ) ); - } +@@ -1402,7 +1402,7 @@ ChoicePage::setupActions() + "The installer will shrink a partition to make room for %1." ) + .arg( Calamares::Branding::instance()->shortVersionedName() ) ); -- const auto partitions = layout.createPartitions( -- static_cast< Device* >( &dev ), 0, dev.totalLogical(), Config::LuksGeneration::Luks1, nullptr, &table, role ); -+ partitions = layout.createPartitions( -+ static_cast< Device* >( &dev ), 0, dev.totalLogical(), Config::LuksGeneration::Luks1, nullptr, nullptr, role ); +- m_eraseButton->setText( tr( "Erase disk
    " ++ m_eraseButton->setText( tr( "Automatic partitioning
    " + "This will delete all data " + "currently present on the selected storage device." ) ); - QCOMPARE( partitions.count(), 3 ); +@@ -1427,7 +1427,7 @@ ChoicePage::setupActions() + "The installer will shrink a partition to make room for %1." ) + .arg( Calamares::Branding::instance()->shortVersionedName() ) ); -diff --git a/src/modules/plasmalnf/CMakeLists.txt b/src/modules/plasmalnf/CMakeLists.txt -index 930b3e441..50cb630f2 100644 ---- a/src/modules/plasmalnf/CMakeLists.txt -+++ b/src/modules/plasmalnf/CMakeLists.txt -@@ -13,7 +13,7 @@ if(WITH_QT6) - set(_plasma_libraries "Plasma::Plasma") - set(_plasma_name "Plasma") - find_package(${kfname} ${KF_VERSION} QUIET COMPONENTS Config Package) -- find_package(Plasma ${PLASMA_VERSION} QUIET) -+ find_package(Plasma ${PLASMA_VERSION}) - else() - set(_plasma_libraries "${kfname}::Plasma") - set(_plasma_name "KF5Plasma") -diff --git a/src/modules/preservefiles/PreserveFiles.cpp b/src/modules/preservefiles/PreserveFiles.cpp -index 8419d4c94..743b51fc4 100644 ---- a/src/modules/preservefiles/PreserveFiles.cpp -+++ b/src/modules/preservefiles/PreserveFiles.cpp -@@ -65,7 +65,7 @@ PreserveFiles::exec() - } +- m_eraseButton->setText( tr( "Erase disk
    " ++ m_eraseButton->setText( tr( "Automatic partitioning
    " + "This will delete all data " + "currently present on the selected storage device." ) ); - int count = 0; -- for ( const auto& it : std::as_const( m_items ) ) -+ for ( const auto& it : qAsConst( m_items ) ) - { - if ( !it ) +@@ -1593,7 +1593,7 @@ ChoicePage::calculateNextEnabled() const { -diff --git a/src/modules/shellprocess/ShellProcessJob.cpp b/src/modules/shellprocess/ShellProcessJob.cpp -index d6fa9acfa..3fe8cc613 100644 ---- a/src/modules/shellprocess/ShellProcessJob.cpp -+++ b/src/modules/shellprocess/ShellProcessJob.cpp -@@ -60,7 +60,6 @@ ShellProcessJob::setConfigurationMap( const QVariantMap& configurationMap ) - { - timeout = 30; - } -- bool verbose = Calamares::getBool( configurationMap, "verbose", false ); + case EncryptWidget::Encryption::Unconfirmed: + cDebug() << "No passphrase provided or passphrase mismatch."; +- return false; ++ //return false; + case EncryptWidget::Encryption::Disabled: + case EncryptWidget::Encryption::Confirmed: + // Checkbox not checked, **or** passphrases match +diff --git a/src/modules/partition/gui/DeviceInfoWidget.cpp b/src/modules/partition/gui/DeviceInfoWidget.cpp +index f57ed91..a22344d 100644 +--- a/src/modules/partition/gui/DeviceInfoWidget.cpp ++++ b/src/modules/partition/gui/DeviceInfoWidget.cpp +@@ -52,7 +52,18 @@ DeviceInfoWidget::DeviceInfoWidget( QWidget* parent ) + m_ptLabel->setAutoFillBackground( true ); + m_ptIcon->setPalette( palette ); + m_ptLabel->setPalette( palette ); +- ++ m_ptLabel->setStyleSheet( ++ "QLabel {" ++ "background-color: #ffffff;" ++ "color: black;" ++ "}" ++ ); ++ m_ptIcon->setStyleSheet( ++ "QLabel {" ++ "background-color: #ffffff;" ++ "color: black;" ++ "}" ++ ); + CALAMARES_RETRANSLATE_SLOT( &DeviceInfoWidget::retranslateUi ); + } - if ( configurationMap.contains( "script" ) ) - { -@@ -70,7 +69,6 @@ ShellProcessJob::setConfigurationMap( const QVariantMap& configurationMap ) - { - cDebug() << "ShellProcessJob: \"script\" contains no commands for" << moduleInstanceKey(); - } -- m_commands->updateVerbose( verbose ); +diff --git a/src/modules/partition/gui/EncryptWidget.cpp b/src/modules/partition/gui/EncryptWidget.cpp +index 8726df1..ebb076e 100644 +--- a/src/modules/partition/gui/EncryptWidget.cpp ++++ b/src/modules/partition/gui/EncryptWidget.cpp +@@ -59,7 +59,7 @@ EncryptWidget::EncryptWidget( QWidget* parent ) + m_ui->m_encryptionUnsupportedLabel->setText( QStringLiteral( "🔓" ) ); + m_ui->m_encryptionUnsupportedLabel->show(); } - else - { -diff --git a/src/modules/shellprocess/Tests.cpp b/src/modules/shellprocess/Tests.cpp -index 58957681d..be0028f6d 100644 ---- a/src/modules/shellprocess/Tests.cpp -+++ b/src/modules/shellprocess/Tests.cpp -@@ -49,7 +49,7 @@ ShellProcessTests::testProcessListSampleConfig() - - CommandList cl( Calamares::YAML::mapToVariant( doc ).value( "script" ) ); - QVERIFY( !cl.isEmpty() ); -- QCOMPARE( cl.count(), 4 ); -+ QCOMPARE( cl.count(), 3 ); - - QCOMPARE( cl.at( 0 ).timeout(), Calamares::CommandLine::TimeoutNotSet() ); - QCOMPARE( cl.at( 2 ).timeout(), 3600s ); // slowloris -diff --git a/src/modules/shellprocess/shellprocess.conf b/src/modules/shellprocess/shellprocess.conf -index 709d2a80f..41a7d2733 100644 ---- a/src/modules/shellprocess/shellprocess.conf -+++ b/src/modules/shellprocess/shellprocess.conf -@@ -46,12 +46,6 @@ - # - Setting a timeout of 3600 for a 1GB download is going to leave - # the user in uncertainty for a loooong time. - # --# The (global) verbosity of a command can be set to `true` or `false`. --# When set to `true`, command output is logged one line at a time. --# Otherwise the output is logged when the command completes. --# Line-at-a-time logging is appropriate for commands that take --# a long time to complete and produce their own (progress) output. --# - # If a command starts with "-" (a single minus sign), then the - # return value of the command following the - is ignored; otherwise, - # a failing command will abort the installation. This is much like -@@ -68,8 +62,7 @@ - # a key *timeout* to set the timeout for this specific - # command differently from the global setting. An optional - # key *environment* is a list of strings to put into the --# environment of the command. An optional key *verbose* --# overrides the global *verbose* setting in this file. -+# environment of the command. - # - # Using a single object is not generally useful because the same effect - # can be obtained with a single string and a global timeout, except -@@ -91,20 +84,8 @@ - --- - # Set to true to run in host, rather than target system - dontChroot: false - --# Tune this for the commands you're actually running, or --# use the list-of-items form of commands to tune the timeout --# for each command individually. --timeout: 10 -- --# This will copy the output from the command into the Calamares --# log file. No processing is done beyond log-each-line-separately, --# so this can introduce weirdness in the log if the script --# outputs e.g. escape codes. --# --# The default is `false`. This can also be set for each --# command individually. --verbose: false -+# Tune this for the commands you're actually running -+# timeout: 10 - - # Script may be a single string (because false returns an error exit - # code, this will trigger a failure in the installation): -@@ -120,18 +101,14 @@ verbose: false - # - "/bin/ls" - # - "/usr/bin/true" - --# Script may be a list of items --# - if the touch command fails, it is ignored --# - there is nothing special about the invocation of true --# - the slowloris command has a different timeout from the other commands --# - the echo command logs its output line-by-line -+# Script may be a list of items (if the touch command fails, it is -+# ignored; the slowloris command has a different timeout from the -+# other commands in the list): - script: - - "-touch ${ROOT}/tmp/thingy" - - "/usr/bin/true" - - command: "/usr/local/bin/slowloris" - timeout: 3600 -- - command: "echo -e '\e[33;2mred\e[33;0m' ; echo second line" -- verbose: true - - # You can change the description of the job (as it is displayed in the - # progress bar during installation) by defining an *i18n* key, which -diff --git a/src/modules/shellprocess/shellprocess.schema.yaml b/src/modules/shellprocess/shellprocess.schema.yaml -index c9f6c3410..af56707b7 100644 ---- a/src/modules/shellprocess/shellprocess.schema.yaml -+++ b/src/modules/shellprocess/shellprocess.schema.yaml -@@ -19,10 +19,7 @@ definitions: - timeout: - type: number - description: the (optional) timeout for this specific command (differently -- from the global setting). -- verbose: -- type: boolean -- description: when true, log output from the command to the Calamares log. -+ from the global setting) - required: - - command - type: object -@@ -37,9 +34,6 @@ properties: - type: number - description: The (global) timeout for the command list in seconds. If unset, defaults - to 30 seconds. -- verbose: -- type: boolean -- description: when true, log output from the command to the Calamares log. - script: - anyOf: - - $ref: '#definitions/command' -@@ -61,5 +55,3 @@ properties: - type: string - required: - - name --required: -- - script ++ m_ui->m_encryptCheckBox->hide(); + connect( m_ui->m_encryptCheckBox, &QCheckBox::stateChanged, this, &EncryptWidget::onCheckBoxStateChanged ); + connect( m_ui->m_passphraseLineEdit, &QLineEdit::textEdited, this, &EncryptWidget::onPassphraseEdited ); + connect( m_ui->m_confirmLineEdit, &QLineEdit::textEdited, this, &EncryptWidget::onPassphraseEdited ); diff --git a/src/modules/summary/SummaryPage.cpp b/src/modules/summary/SummaryPage.cpp -index 41881e479..08a4d5142 100644 +index 41881e4..08a4d51 100644 --- a/src/modules/summary/SummaryPage.cpp +++ b/src/modules/summary/SummaryPage.cpp @@ -35,7 +35,7 @@ SummaryPage::SummaryPage( Config* config, QWidget* parent ) @@ -4077,41 +1141,8 @@ index 41881e479..08a4d5142 100644 QPalette bodyPalette( palette() ); bodyPalette.setColor( WindowBackground, palette().window().color().lighter( 108 ) ); -diff --git a/src/modules/tracking/TrackingPage.cpp b/src/modules/tracking/TrackingPage.cpp -index 859abdfd9..df4b52385 100644 ---- a/src/modules/tracking/TrackingPage.cpp -+++ b/src/modules/tracking/TrackingPage.cpp -@@ -16,7 +16,6 @@ - #include "GlobalStorage.h" - #include "JobQueue.h" - #include "ViewManager.h" --#include "compat/CheckBox.h" - #include "utils/Gui.h" - #include "utils/Logger.h" - #include "utils/Retranslator.h" -@@ -33,7 +32,7 @@ TrackingPage::TrackingPage( Config* config, QWidget* parent ) - - ui->noneCheckBox->setChecked( true ); - ui->noneCheckBox->setEnabled( false ); -- connect( ui->noneCheckBox, Calamares::checkBoxStateChangedSignal, this, &TrackingPage::buttonNoneChecked ); -+ connect( ui->noneCheckBox, &QCheckBox::stateChanged, this, &TrackingPage::buttonNoneChecked ); - - // Each "panel" of configuration has the same kind of setup, - // where the xButton and xCheckBox is connected to the xTracking -@@ -41,9 +40,9 @@ TrackingPage::TrackingPage( Config* config, QWidget* parent ) - #define trackingSetup( x ) \ - do \ - { \ -- connect( ui->x##CheckBox, Calamares::checkBoxStateChangedSignal, this, &TrackingPage::buttonChecked ); \ -+ connect( ui->x##CheckBox, &QCheckBox::stateChanged, this, &TrackingPage::buttonChecked ); \ - connect( ui->x##CheckBox, \ -- Calamares::checkBoxStateChangedSignal, \ -+ &QCheckBox::stateChanged, \ - config->x##Tracking(), \ - QOverload< bool >::of( &TrackingStyleConfig::setTracking ) ); \ - connect( config->x##Tracking(), \ diff --git a/src/modules/umount/UmountJob.cpp b/src/modules/umount/UmountJob.cpp -index f899d8e27..90f237316 100644 +index 83cf2f1..90f2373 100644 --- a/src/modules/umount/UmountJob.cpp +++ b/src/modules/umount/UmountJob.cpp @@ -42,6 +42,29 @@ UmountJob::prettyName() const @@ -4144,77 +1175,19 @@ index f899d8e27..90f237316 100644 QDir targetMount( rootMountPoint ); if ( !targetMount.exists() ) { -@@ -63,7 +86,7 @@ unmountTargetMounts( const QString& rootMountPoint ) - std::sort( targetMounts.begin(), targetMounts.end(), MtabInfo::mountPointOrder ); - - cDebug() << "Read" << targetMounts.count() << "entries from" << targetMountPath; -- for ( const auto& m : std::as_const( targetMounts ) ) -+ for ( const auto& m : qAsConst( targetMounts ) ) - { - // Returns the program's exit code, so 0 is success and non-0 - // (truthy) is a failure. -@@ -78,18 +101,6 @@ unmountTargetMounts( const QString& rootMountPoint ) - .arg( m.device, m.mountPoint ) ); - } - } -- -- // Last we unmount the root -- if ( Calamares::Partition::unmount( rootMountPoint, { "-lv" } ) ) -- { -- return Calamares::JobResult::error( -- QCoreApplication::translate( UmountJob::staticMetaObject.className(), -- "Could not unmount the root of the target system." ), -- QCoreApplication::translate( UmountJob::staticMetaObject.className(), -- "The device mounted at '%1' could not be unmounted." ) -- .arg( rootMountPoint ) ); -- } -- - return Calamares::JobResult::ok(); - } - -@@ -151,7 +162,6 @@ UmountJob::exec() - return r; - } - } -- - // For ZFS systems, export the pools - { - auto r = exportZFSPools(); diff --git a/src/modules/unpackfs/main.py b/src/modules/unpackfs/main.py -index fdb4fc9a8..7db5f2ea6 100644 +index 814556f..4148720 100644 --- a/src/modules/unpackfs/main.py +++ b/src/modules/unpackfs/main.py -@@ -23,8 +23,11 @@ import sys +@@ -23,6 +23,7 @@ import sys import tempfile import libcalamares +import platform import gettext -+ -+import libcalamares.utils _ = gettext.translation("calamares-python", - localedir=libcalamares.utils.gettext_path(), - languages=libcalamares.utils.gettext_languages(), -@@ -48,7 +51,7 @@ class UnpackEntry: - :param destination: - """ - __slots__ = ('source', 'sourcefs', 'destination', 'copied', 'total', 'exclude', 'excludeFile', -- 'mountPoint', 'weight', 'condition', 'optional') -+ 'mountPoint', 'weight') - - def __init__(self, source, sourcefs, destination): - """ -@@ -71,8 +74,6 @@ class UnpackEntry: - self.total = 0 - self.mountPoint = None - self.weight = 1 -- self.condition = True -- self.optional = False - - def is_file(self): - return self.sourcefs == "file" -@@ -155,6 +156,40 @@ def global_excludes(): +@@ -153,6 +154,40 @@ def global_excludes(): return lst @@ -4255,16 +1228,7 @@ index fdb4fc9a8..7db5f2ea6 100644 def file_copy(source, entry, progress_cb): """ Extract given image using rsync. -@@ -172,7 +207,7 @@ def file_copy(source, entry, progress_cb): - # `source` *must* end with '/' otherwise a directory named after the source - # will be created in `dest`: ie if `source` is "/foo/bar" and `dest` is - # "/dest", then files will be copied in "/dest/bar". -- if not source.endswith("/") and not os.path.isfile(source): -+ if source and not source.endswith("/") and not os.path.isfile(source): - source += "/" - - num_files_total_local = 0 -@@ -228,9 +263,54 @@ def file_copy(source, entry, progress_cb): +@@ -226,9 +261,44 @@ def file_copy(source, entry, progress_cb): counter.last_timestamp_reported = now counter.last_total_reported = num_files_total_local progress_cb(num_files_copied, num_files_total_local) @@ -4272,7 +1236,6 @@ index fdb4fc9a8..7db5f2ea6 100644 try: - returncode = libcalamares.utils.host_env_process_output(args, output_cb) + returncode = 0 -+ + arch = platform.machine() + + libcalamares.utils.host_env_process_output(["mkdir", "-p", entry.destination + "/etc/yum.repos.d/"], output_cb) @@ -4282,7 +1245,6 @@ index fdb4fc9a8..7db5f2ea6 100644 + libcalamares.utils.host_env_process_output(["cp", "-af", "/etc/add_selinux_policy.sh", entry.destination + "/etc/add_selinux_policy.sh"], output_cb) + libcalamares.utils.host_env_process_output(["chmod", "+x", entry.destination + "/etc/add_selinux_policy.sh"], output_cb) + -+ completed_packages = 0 + if os.path.exists("/etc/yum.repos.d/local.repo"): + libcalamares.utils.host_env_process_output( + ["cp", "-af", "/etc/yum.repos.d/local.repo", entry.destination + "/etc/yum.repos.d/"], output_cb) @@ -4292,13 +1254,9 @@ index fdb4fc9a8..7db5f2ea6 100644 + else: + packages = ["yum", "grub2", "grub2-efi-x64", "grub2-pc", "passwd", "sudo"] + -+ for package in packages: -+ libcalamares.job.setprogress(completed_packages / len(packages)) -+ libcalamares.utils.host_env_process_output( -+ ["yum", "--installroot=" + entry.destination, "--disablerepo=*", "--enablerepo=local-repo", -+ "--releasever=/", "--nogpgcheck", "--setopt=sslverify=0", "install", "-y", package], output_cb) -+ completed_packages += 1 -+ libcalamares.job.setprogress(completed_packages / len(packages)) ++ libcalamares.utils.host_env_process_output( ++ ["yum", "--installroot=" + entry.destination, "--disablerepo=*", "--enablerepo=local-repo", ++ "--releasever=/", "--nogpgcheck", "--setopt=sslverify=0", "install", "-y"] + packages, output_cb) + else: + libcalamares.utils.host_env_process_output( + ["cp", "-af", "/etc/yum.repos.d/openEuler.repo", entry.destination + "/etc/yum.repos.d/"], output_cb) @@ -4307,13 +1265,9 @@ index fdb4fc9a8..7db5f2ea6 100644 + else: + packages = ["yum", "grub2", "grub2-efi-x64", "grub2-pc", "passwd", "sudo"] + -+ for package in packages: -+ libcalamares.job.setprogress(completed_packages / len(packages)) -+ libcalamares.utils.host_env_process_output( -+ ["yum", "--installroot=" + entry.destination, "--releasever=/", "--nogpgcheck", "--setopt=sslverify=0", -+ "install", "-y", package], output_cb) -+ completed_packages += 1 -+ libcalamares.job.setprogress(completed_packages / len(packages)) ++ libcalamares.utils.host_env_process_output( ++ ["yum", "--installroot=" + entry.destination, "--releasever=/", "--nogpgcheck", "--setopt=sslverify=0", ++ "install", "-y"] + packages, output_cb) + + libcalamares.utils.host_env_process_output(["rm", "-f", entry.destination + "/etc/shadow"], output_cb) + libcalamares.utils.host_env_process_output(["cp", "-af", "/etc/shadow", entry.destination + "/etc/shadow"], output_cb) @@ -4321,63 +1275,14 @@ index fdb4fc9a8..7db5f2ea6 100644 except subprocess.CalledProcessError as e: returncode = e.returncode -@@ -315,8 +395,6 @@ class UnpackOperation: - for entry in self.entries: - status = _("Starting to unpack {}").format(entry.source) - libcalamares.job.setprogress( ( 1.0 * complete ) / len(self.entries) ) -- entry.do_mount(source_mount_path) -- entry.do_count() # Fill in the entry.total - - self.report_progress() - error_msg = self.unpack_image(entry, entry.mountPoint) -@@ -357,7 +435,7 @@ class UnpackOperation: - - return file_copy(source, entry, progress_cb) - finally: -- if not entry.is_file(): -+ if imgmountdir and not entry.is_file() and os.path.isdir(imgmountdir): - subprocess.check_call(["umount", "-l", imgmountdir]) - - -@@ -421,18 +499,6 @@ def extract_weight(entry): - return 1 - - --def fetch_from_globalstorage(keys_list): -- value = libcalamares.globalstorage.value(keys_list[0]) -- if value is None: -- return None -- for key in keys_list[1:]: -- if isinstance(value, dict) and key in value: -- value = value[key] -- else: -- return None -- return value -- -- - def run(): - """ - Unsquash filesystem. -@@ -462,22 +528,16 @@ def run(): - for entry in libcalamares.job.configuration["unpack"]: - source = os.path.abspath(entry["source"]) - sourcefs = entry["sourcefs"] -- optional = entry.get("optional", False) - - if sourcefs not in supported_filesystems: - libcalamares.utils.warning("The filesystem for \"{}\" ({}) is not supported by your current kernel".format(source, sourcefs)) +@@ -454,10 +524,10 @@ def run(): libcalamares.utils.warning(" ... modprobe {} may solve the problem".format(sourcefs)) return (_("Bad unpackfs configuration"), _("The filesystem for \"{}\" ({}) is not supported by your current kernel").format(source, sourcefs)) - if not os.path.exists(source): -- if optional: -- libcalamares.utils.warning("The source filesystem \"{}\" does not exist but is marked as optional, skipping".format(source)) -- entry["condition"] = False -- continue -- else: -- libcalamares.utils.warning("The source filesystem \"{}\" does not exist".format(source)) -- return (_("Bad unpackfs configuration"), -- _("The source filesystem \"{}\" does not exist").format(source)) +- libcalamares.utils.warning("The source filesystem \"{}\" does not exist".format(source)) +- return (_("Bad unpackfs configuration"), +- _("The source filesystem \"{}\" does not exist").format(source)) + #if not os.path.exists(source): + # libcalamares.utils.warning("The source filesystem \"{}\" does not exist".format(source)) + # return (_("Bad unpackfs configuration"), @@ -4385,71 +1290,12 @@ index fdb4fc9a8..7db5f2ea6 100644 if sourcefs == "squashfs": if shutil.which("unsquashfs") is None: libcalamares.utils.warning("Failed to find unsquashfs") -@@ -494,28 +554,6 @@ def run(): - sourcefs = entry["sourcefs"] - destination = os.path.abspath(root_mount_point + entry["destination"]) - -- condition = entry.get("condition", True) -- if isinstance(condition, bool): -- pass # 'condition' is already True or False -- elif isinstance(condition, str): -- keys = condition.split(".") -- gs_value = fetch_from_globalstorage(keys) -- if gs_value is None: -- libcalamares.utils.warning("Condition key '{}' not found in global storage, assuming False".format(condition)) -- condition = False -- elif isinstance(gs_value, bool): -- condition = gs_value -- else: -- libcalamares.utils.warning("Condition key '{}' is not a boolean, assuming True".format(condition)) -- condition = True -- else: -- libcalamares.utils.warning("Invalid 'condition' value '{}', assuming True".format(condition)) -- condition = True -- -- if not condition: -- libcalamares.utils.debug("Skipping unpack of {} due to 'condition' being False".format(source)) -- continue -- - if not os.path.isdir(destination) and sourcefs != "file": - libcalamares.utils.warning(("The destination \"{}\" in the target system is not a directory").format(destination)) - if is_first: diff --git a/src/modules/unpackfs/unpackfs.conf b/src/modules/unpackfs/unpackfs.conf -index 1576fa7f3..1b053a6aa 100644 +index d12110b..1b053a6 100644 --- a/src/modules/unpackfs/unpackfs.conf +++ b/src/modules/unpackfs/unpackfs.conf -@@ -86,43 +86,9 @@ - # of trailing slashes apply. In order to *rename* a file as it is - # copied, specify one single file (e.g. CHANGES) and a full pathname +@@ -88,13 +88,7 @@ # for its destination name, as in the example below. --# --# It is also possible to dynamically (conditionally) unpack a source by passing a boolean --# value for *condition*. This may be true or false (constant) or name a globalstorage --# value. Use '.' to separate parts of a globalstorage name if it is nested. --# --# This is used in e.g. stacked squashfses, where the user can select a specific --# install type. The default value of *condition* is true. --# --# - source: ./example.minimal.sqfs --# sourcefs: squashfs --# destination: "" --# condition: false --# - source: ./example.standard.sqfs --# sourcefs: squashfs --# destination: "" --# condition: exampleGlobalStorageVariable.subkey --# --# You may also wish to include optional squashfses, which may not exist at certain times --# depending on your image tooling. If an optional squashfs is not found, it is simply --# skipped. --# --# - source: ./example.standard.sqfs --# sourcefs: squashfs --# destination: "" --# - source: ./example.extras.sqfs --# sourcefs: squashfs --# destination: "" --# optional: true unpack: - - source: ../CHANGES @@ -4465,503 +1311,22 @@ index 1576fa7f3..1b053a6aa 100644 - exclude: [ "*.qmlc", "qmldir" ] - weight: 5 # Lots of files - # excludeFile: /etc/calamares/modules/unpackfs/exclude-list.txt -diff --git a/src/modules/unpackfs/unpackfs.schema.yaml b/src/modules/unpackfs/unpackfs.schema.yaml -index 9dc53c446..0d96fe9cb 100644 ---- a/src/modules/unpackfs/unpackfs.schema.yaml -+++ b/src/modules/unpackfs/unpackfs.schema.yaml -@@ -18,9 +18,4 @@ properties: - excludeFile: { type: string } - exclude: { type: array, items: { type: string } } - weight: { type: integer, exclusiveMinimum: 0 } -- optional: { type: boolean } -- condition: -- anyOf: -- - type: boolean -- - type: string - required: [ source , sourcefs, destination ] -diff --git a/src/modules/users/Config.cpp b/src/modules/users/Config.cpp -index be754774b..cd56bc3e2 100644 ---- a/src/modules/users/Config.cpp -+++ b/src/modules/users/Config.cpp -@@ -19,7 +19,6 @@ - #include "JobQueue.h" - #include "compat/Variant.h" - #include "utils/Logger.h" --#include "utils/Permissions.h" - #include "utils/String.h" - #include "utils/StringExpander.h" - #include "utils/Variant.h" -@@ -928,30 +927,6 @@ tidy( QStringList& l ) - l.removeDuplicates(); - } - --static QString --unscrambleYAML( const QVariant& v ) --{ -- if ( Calamares::isIntegerVariantType( v ) ) -- { -- // YAML takes a string like "0755" and makes it an integer **anyway** -- const auto number = v.toLongLong(); -- if ( number < 0 ) -- { -- return QString(); -- } -- // Since YAML has parsed it as a decimal number, -- // turn it back into the string representation of -- // that decimal number, even though we intended it -- // to be octal (e.g. "755" written down becomes -- // seven-hundred-fifty-five, needs to be the string -- // "755" again, even though we meant octal 755 which -- // is four-hundred-ninety-three. -- if ( number > 777 ) { return QString(); } -- return QString::number( number ); -- } -- return v.toString(); --} -- - void - Config::setConfigurationMap( const QVariantMap& configurationMap ) - { -@@ -971,22 +946,6 @@ Config::setConfigurationMap( const QVariantMap& configurationMap ) - m_forbiddenLoginNames = Calamares::getStringList( userSettings, "forbidden_names" ); - m_forbiddenLoginNames << alwaysForbiddenLoginNames(); - tidy( m_forbiddenLoginNames ); -- -- const auto permissionKey = QStringLiteral( "home_permissions" ); -- if ( userSettings.contains( permissionKey ) ) -- { -- const auto value = unscrambleYAML( userSettings.value( permissionKey ) ); -- m_homeDirPermissions = Calamares::parseFileMode( value ); -- if ( m_homeDirPermissions < 0 ) -- { -- cWarning() << "Setting for" << permissionKey << '(' << value << userSettings[ permissionKey ] -- << ") is invalid."; -- } -- } -- else -- { -- m_homeDirPermissions = -1; -- } - } - - setAutoLoginGroup( either< QString, const QString& >( -diff --git a/src/modules/users/Config.h b/src/modules/users/Config.h -index 5d3776c62..07fa40d1f 100644 ---- a/src/modules/users/Config.h -+++ b/src/modules/users/Config.h -@@ -259,9 +259,6 @@ public: - const QStringList& forbiddenLoginNames() const; - const QStringList& forbiddenHostNames() const; - -- int homePermissions() const { return m_homeDirPermissions; } -- int homeUMask() const { return m_homeDirPermissions >= 0 ? ( ( ~m_homeDirPermissions ) & 0777 ) : -1; } -- - public Q_SLOTS: - /** @brief Sets the user's shell if possible - * -@@ -371,8 +368,6 @@ private: - QStringList m_forbiddenLoginNames; - - PasswordCheckList m_passwordChecks; -- -- int m_homeDirPermissions = -1; - }; - - #endif -diff --git a/src/modules/users/CreateUserJob.cpp b/src/modules/users/CreateUserJob.cpp -index c55ee1858..9699141a8 100644 ---- a/src/modules/users/CreateUserJob.cpp -+++ b/src/modules/users/CreateUserJob.cpp -@@ -46,7 +46,7 @@ CreateUserJob::prettyStatusMessage() const - } - - static Calamares::JobResult --createUser( const QString& loginName, const QString& fullName, const QString& shell, int umask ) -+createUser( const QString& loginName, const QString& fullName, const QString& shell ) - { - QStringList useraddCommand; - #ifdef __FreeBSD__ -@@ -58,7 +58,6 @@ createUser( const QString& loginName, const QString& fullName, const QString& sh - { - useraddCommand << "-s" << shell; - } -- Q_UNUSED( umask ) - #else - useraddCommand << "useradd" - << "-m" -@@ -68,11 +67,6 @@ createUser( const QString& loginName, const QString& fullName, const QString& sh - useraddCommand << "-s" << shell; - } - useraddCommand << "-c" << fullName; -- if ( umask >= 0 ) -- { -- // The QChar() is needed to disambiguate from the overload that takes a double -- useraddCommand << "-K" << ( QStringLiteral( "UMASK=%1" ).arg( umask, 3, 8, QChar( '0' ) ) ); -- } - useraddCommand << loginName; - #endif - -@@ -85,6 +79,23 @@ createUser( const QString& loginName, const QString& fullName, const QString& sh - return Calamares::JobResult::ok(); - } - -+static Calamares::JobResult -+config_root_bash(const QString& loginName) -+{ -+ QStringList copyBashFilesCommand; -+ copyBashFilesCommand << "cp" -+ << QString("/home/%1/.bashrc").arg(loginName) -+ << QString("/home/%1/.bash_profile").arg(loginName) -+ << "/root/"; -+ auto commandResult = Calamares::System::instance()->targetEnvCommand( copyBashFilesCommand ); -+ if ( commandResult.getExitCode() ) -+ { -+ cError() << "copy bash config file failed" << commandResult.getExitCode(); -+ return commandResult.explainProcess( copyBashFilesCommand, std::chrono::seconds( 10 ) /* bogus timeout */ ); -+ } -+ return Calamares::JobResult::ok(); -+} -+ - static Calamares::JobResult - setUserGroups( const QString& loginName, const QStringList& groups ) - { -@@ -142,8 +153,7 @@ CreateUserJob::exec() - - m_status = tr( "Creating user %1…", "@status" ).arg( m_config->loginName() ); - emit progress( 0.5 ); -- auto useraddResult -- = createUser( m_config->loginName(), m_config->fullName(), m_config->userShell(), m_config->homeUMask() ); -+ auto useraddResult = createUser( m_config->loginName(), m_config->fullName(), m_config->userShell() ); - if ( !useraddResult ) - { - return useraddResult; -@@ -162,6 +172,7 @@ CreateUserJob::exec() - QString userGroup = QString( "%1:%2" ).arg( m_config->loginName() ).arg( m_config->loginName() ); - QString homeDir = QString( "/home/%1" ).arg( m_config->loginName() ); - auto commandResult = Calamares::System::instance()->targetEnvCommand( { "chown", "-R", userGroup, homeDir } ); -+ config_root_bash(m_config->loginName()); - if ( commandResult.getExitCode() ) - { - cError() << "chown failed" << commandResult.getExitCode(); -diff --git a/src/modules/users/SetPasswordJob.cpp b/src/modules/users/SetPasswordJob.cpp -index ad1cebcda..f0c8b0b71 100644 ---- a/src/modules/users/SetPasswordJob.cpp -+++ b/src/modules/users/SetPasswordJob.cpp -@@ -64,7 +64,7 @@ SetPasswordJob::make_salt( int length ) - cWarning() << "Entropy data for salt is low-quality."; - } - -- salt_string.insert( 0, "$y$" ); -+ salt_string.insert( 0, "$6$" ); - salt_string.append( '$' ); - return salt_string; - } -diff --git a/src/modules/users/TestPasswordJob.cpp b/src/modules/users/TestPasswordJob.cpp -index 18e9b8ec2..1409e37b6 100644 ---- a/src/modules/users/TestPasswordJob.cpp -+++ b/src/modules/users/TestPasswordJob.cpp -@@ -36,14 +36,14 @@ void - PasswordTests::testSalt() - { - QString s = SetPasswordJob::make_salt( 8 ); -- QCOMPARE( s.length(), 4 + 8 ); // 8 salt chars, plus $y$, plus trailing $ -- QVERIFY( s.startsWith( "$y$" ) ); -+ QCOMPARE( s.length(), 4 + 8 ); // 8 salt chars, plus $6$, plus trailing $ -+ QVERIFY( s.startsWith( "$6$" ) ); - QVERIFY( s.endsWith( '$' ) ); - qDebug() << "Obtained salt" << s; - - s = SetPasswordJob::make_salt( 11 ); - QCOMPARE( s.length(), 4 + 11 ); -- QVERIFY( s.startsWith( "$y$" ) ); -+ QVERIFY( s.startsWith( "$6$" ) ); - QVERIFY( s.endsWith( '$' ) ); - qDebug() << "Obtained salt" << s; - } -diff --git a/src/modules/users/Tests.cpp b/src/modules/users/Tests.cpp -index 76446064c..ba2fd2dab 100644 ---- a/src/modules/users/Tests.cpp -+++ b/src/modules/users/Tests.cpp -@@ -56,8 +56,6 @@ private Q_SLOTS: - - void testUserYAML_data(); - void testUserYAML(); -- void testUserUmask_data(); -- void testUserUmask(); - }; - - UserTests::UserTests() {} -@@ -513,75 +511,6 @@ UserTests::testUserYAML() - QCOMPARE( c.userShell(), shell ); - } - --void --UserTests::testUserUmask_data() --{ -- QTest::addColumn< QString >( "filename" ); -- QTest::addColumn< int >( "permission" ); -- QTest::addColumn< int >( "umask" ); -- QTest::addColumn< QString >( "umask_string" ); -- -- QTest::newRow( "good " ) << "tests/8a-issue-2362.conf" << 0700 << 0077 << QStringLiteral( "077" ); -- QTest::newRow( "open " ) << "tests/8b-issue-2362.conf" << 0755 << 0022 << QStringLiteral( "022" ); -- QTest::newRow( "weird" ) << "tests/8c-issue-2362.conf" << 0126 << 0651 << QStringLiteral( "651" ); -- QTest::newRow( "rwxx " ) << "tests/8d-issue-2362.conf" << 0710 << 0067 << QStringLiteral( "067" ); -- QTest::newRow( "-wrd " ) << "tests/8e-issue-2362.conf" << 0214 << 0563 << QStringLiteral( "563" ); -- QTest::newRow( "bogus" ) << "tests/8f-issue-2362.conf" << -1 << -1 -- << QStringLiteral( "-01" ); // Bogus 3-character representation -- QTest::newRow( "good2" ) << "tests/8g-issue-2362.conf" << 0750 << 0027 << QStringLiteral( "027" ); -- QTest::newRow( "numrc" ) << "tests/8h-issue-2362.conf" << 0751 << 0026 << QStringLiteral( "026" ); --} -- --void --UserTests::testUserUmask() --{ -- static constexpr int no_permissions = -1; -- const QString old_shell = QStringLiteral( "/bin/ls" ); -- const QString new_shell = QStringLiteral( "/usr/bin/new" ); -- // nobody and root are always forbidden, even if not mentioned in the config, entries are alphabetical -- const QStringList forbidden { QStringLiteral( "me" ), -- QStringLiteral( "moi" ), -- QStringLiteral( "myself" ), -- QStringLiteral( "nobody" ), -- QStringLiteral( "root" ) }; -- Config c; -- c.setUserShell( old_shell ); -- QCOMPARE( c.homePermissions(), no_permissions ); -- QCOMPARE( c.homeUMask(), no_permissions ); -- -- QFETCH( QString, filename ); -- QFETCH( int, permission ); -- QFETCH( int, umask ); -- QFETCH( QString, umask_string ); -- -- // Checks that the test-data is valid -- if ( permission != -1 ) -- { -- QCOMPARE( permission & umask, 0 ); -- QCOMPARE( permission | umask, 0777 ); -- } -- -- QFileInfo fi( QString( "%1/%2" ).arg( BUILD_AS_TEST, filename ) ); -- QVERIFY( fi.exists() ); -- -- bool ok = false; -- const auto map = Calamares::YAML::load( fi, &ok ); -- QVERIFY( ok ); -- QVERIFY( map.count() > 0 ); -- -- QCOMPARE( c.userShell(), old_shell ); -- c.setConfigurationMap( map ); -- QCOMPARE( c.userShell(), new_shell ); -- -- QCOMPARE( c.homePermissions(), permission ); -- QCOMPARE( c.homeUMask(), umask ); -- // The QChar() is needed to disambiguate from the overload that takes a double -- QCOMPARE( QStringLiteral( "%1" ).arg( umask, 3, 8, QChar( '0' ) ), umask_string ); -- -- QCOMPARE( c.forbiddenLoginNames(), forbidden ); --} -- -- - QTEST_GUILESS_MAIN( UserTests ) - - #include "utils/moc-warnings.h" diff --git a/src/modules/users/UsersPage.cpp b/src/modules/users/UsersPage.cpp -index da235326c..a4edddfb0 100644 +index 1ecc0eb..72fb3e0 100644 --- a/src/modules/users/UsersPage.cpp +++ b/src/modules/users/UsersPage.cpp -@@ -22,7 +22,6 @@ - #include "GlobalStorage.h" - #include "JobQueue.h" - #include "Settings.h" --#include "compat/CheckBox.h" - #include "utils/Gui.h" - #include "utils/Logger.h" - #include "utils/Retranslator.h" -@@ -32,6 +31,9 @@ - #include - #include - #include -+#include -+#include -+#include - - /** @brief Add an error message and pixmap to a label. */ - static inline void -@@ -83,6 +85,105 @@ UsersPage::UsersPage( Config* config, QWidget* parent ) +@@ -82,7 +82,7 @@ UsersPage::UsersPage( Config* config, QWidget* parent ) , m_config( config ) { ui->setupUi( this ); +- + this->setContentsMargins(50,15,50,0); -+ -+ -+ //初始化参数 -+ userPassword=false; -+ userVertifyPassword=false; -+ rootPassword=false; -+ rootVertifyPassword=false; -+ -+ userButton=new QPushButton(); -+ userVertifyButton=new QPushButton(); -+ rootButton=new QPushButton(); -+ rootVertifyButton=new QPushButton(); -+ -+ hIcon = QIcon(imagePath + "password-hide.png"); -+ sIcon = QIcon(imagePath + "password-show.png"); -+ userButton->setIcon(hIcon); -+ userVertifyButton->setIcon(hIcon); -+ rootButton->setIcon(hIcon); -+ rootVertifyButton->setIcon(hIcon); -+ -+ userButton->setCursor(Qt::PointingHandCursor); -+ userButton->setStyleSheet("QPushButton:hover {background-color:transparent;border-style:outset;}"); -+ userButton->setWindowFlags(Qt::FramelessWindowHint); -+ userButton->setFlat(true); -+ -+ userVertifyButton->setCursor(Qt::PointingHandCursor); -+ userVertifyButton->setStyleSheet("QPushButton:hover {background-color:transparent;border-style:outset;}"); -+ userVertifyButton->setWindowFlags(Qt::FramelessWindowHint); -+ userVertifyButton->setFlat(true); -+ -+ rootButton->setCursor(Qt::PointingHandCursor); -+ rootButton->setStyleSheet("QPushButton:hover {background-color:transparent;border-style:outset;}"); -+ rootButton->setWindowFlags(Qt::FramelessWindowHint); -+ rootButton->setFlat(true); -+ -+ rootVertifyButton->setCursor(Qt::PointingHandCursor); -+ rootVertifyButton->setStyleSheet("QPushButton:hover {background-color:transparent;border-style:outset;}"); -+ rootVertifyButton->setWindowFlags(Qt::FramelessWindowHint); -+ rootVertifyButton->setFlat(true); -+ -+ QWidgetAction* userPasswordAction = new QWidgetAction(ui->textBoxUserPassword); -+ QWidgetAction* userVerifiedPasswordAction = new QWidgetAction(ui->textBoxUserVerifiedPassword); -+ QWidgetAction* rootPasswordAction = new QWidgetAction(ui->textBoxRootPassword); -+ QWidgetAction* rootVerifiedPasswordAction = new QWidgetAction(ui->textBoxVerifiedRootPassword); -+ -+ userPasswordAction->setDefaultWidget(userButton); -+ ui->textBoxUserPassword->addAction(userPasswordAction,QLineEdit::TrailingPosition); -+ userVerifiedPasswordAction->setDefaultWidget(userVertifyButton); -+ ui->textBoxUserVerifiedPassword->addAction(userVerifiedPasswordAction,QLineEdit::TrailingPosition); -+ rootPasswordAction->setDefaultWidget(rootButton); -+ ui->textBoxRootPassword->addAction(rootPasswordAction,QLineEdit::TrailingPosition); -+ rootVerifiedPasswordAction->setDefaultWidget(rootVertifyButton); -+ ui->textBoxVerifiedRootPassword->addAction(rootVerifiedPasswordAction,QLineEdit::TrailingPosition); -+ -+ connect( -+ userButton, -+ &QPushButton::clicked, -+ [this] ( ) { -+ userPassword =! userPassword; -+ if(userPassword){ -+ userButton->setIcon(sIcon); -+ ui->textBoxUserPassword->setEchoMode(QLineEdit::Normal); -+ } else { -+ userButton->setIcon(hIcon); -+ ui->textBoxUserPassword->setEchoMode(QLineEdit::Password); -+ } -+ }); -+ connect(userVertifyButton,&QPushButton::clicked, [this](){ -+ userVertifyPassword =! userVertifyPassword; -+ if(userVertifyPassword){ -+ userVertifyButton->setIcon(sIcon); -+ ui->textBoxUserVerifiedPassword->setEchoMode(QLineEdit::Normal); -+ } else { -+ userVertifyButton->setIcon(hIcon); -+ ui->textBoxUserVerifiedPassword->setEchoMode(QLineEdit::Password); -+ } -+ }); -+ connect(rootButton,&QPushButton::clicked, [this](){ -+ rootPassword =! rootPassword; -+ if(rootPassword){ -+ rootButton->setIcon(sIcon); -+ ui->textBoxRootPassword->setEchoMode(QLineEdit::Normal); -+ } else { -+ rootButton->setIcon(hIcon); -+ ui->textBoxRootPassword->setEchoMode(QLineEdit::Password); -+ } -+ }); -+ connect(rootVertifyButton,&QPushButton::clicked, [this](){ -+ rootVertifyPassword =! rootVertifyPassword; -+ if(rootVertifyPassword){ -+ rootVertifyButton->setIcon(sIcon); -+ ui->textBoxVerifiedRootPassword->setEchoMode(QLineEdit::Normal); -+ } else { -+ rootVertifyButton->setIcon(hIcon); -+ ui->textBoxVerifiedRootPassword->setEchoMode(QLineEdit::Password); -+ } -+ }); -+ - // Connect signals and slots ui->textBoxUserPassword->setText( config->userPassword() ); -@@ -138,10 +239,9 @@ UsersPage::UsersPage( Config* config, QWidget* parent ) - - ui->checkBoxDoAutoLogin->setChecked( m_config->doAutoLogin() ); - connect( ui->checkBoxDoAutoLogin, -- Calamares::checkBoxStateChangedSignal, -+ &QCheckBox::stateChanged, - this, -- [ this ]( Calamares::checkBoxStateType checked ) -- { m_config->setAutoLogin( checked != Calamares::checkBoxUncheckedValue ); } ); -+ [ this ]( int checked ) { m_config->setAutoLogin( checked != Qt::Unchecked ); } ); - connect( config, &Config::autoLoginChanged, ui->checkBoxDoAutoLogin, &QCheckBox::setChecked ); - - ui->checkBoxReusePassword->setVisible( m_config->writeRootPassword() ); -@@ -149,7 +249,7 @@ UsersPage::UsersPage( Config* config, QWidget* parent ) - if ( m_config->writeRootPassword() ) - { - connect( config, &Config::reuseUserPasswordForRootChanged, ui->checkBoxReusePassword, &QCheckBox::setChecked ); -- connect( ui->checkBoxReusePassword, Calamares::checkBoxStateChangedSignal, this, &UsersPage::onReuseUserPasswordChanged ); -+ connect( ui->checkBoxReusePassword, &QCheckBox::stateChanged, this, &UsersPage::onReuseUserPasswordChanged ); - } - - ui->checkBoxRequireStrongPassword->setVisible( m_config->permitWeakPasswords() ); -@@ -157,7 +257,7 @@ UsersPage::UsersPage( Config* config, QWidget* parent ) - if ( m_config->permitWeakPasswords() ) - { - connect( ui->checkBoxRequireStrongPassword, -- Calamares::checkBoxStateChangedSignal, -+ &QCheckBox::stateChanged, - this, - [ this ]( int checked ) { m_config->setRequireStrongPasswords( checked != Qt::Unchecked ); } ); - connect( -diff --git a/src/modules/users/UsersPage.h b/src/modules/users/UsersPage.h -index 379176ab2..fcee0f09b 100644 ---- a/src/modules/users/UsersPage.h -+++ b/src/modules/users/UsersPage.h -@@ -17,6 +17,10 @@ - #define USERSPAGE_H - - #include -+#include -+#include -+#include -+ - - class Config; - -@@ -51,6 +55,17 @@ private: - - Ui::Page_UserSetup* ui; - Config* m_config; -+ bool userPassword; -+ bool userVertifyPassword; -+ bool rootPassword; -+ bool rootVertifyPassword; -+ QIcon hIcon; -+ QIcon sIcon; -+ QPushButton* userButton; -+ QPushButton* userVertifyButton; -+ QPushButton* rootButton; -+ QPushButton* rootVertifyButton; -+ QString imagePath="/usr/share/calamares/branding/default/"; - }; - - #endif // USERSPAGE_H + connect( ui->textBoxUserPassword, &QLineEdit::textChanged, config, &Config::setUserPassword ); diff --git a/src/modules/users/page_usersetup.bak.ui b/src/modules/users/page_usersetup.bak.ui new file mode 100644 -index 000000000..f808c8943 +index 0000000..f808c89 --- /dev/null +++ b/src/modules/users/page_usersetup.bak.ui @@ -0,0 +1,710 @@ @@ -5676,7 +2041,7 @@ index 000000000..f808c8943 + + diff --git a/src/modules/users/page_usersetup.ui b/src/modules/users/page_usersetup.ui -index 6e6e5423e..2a5ccd298 100644 +index 6e6e542..2a5ccd2 100644 --- a/src/modules/users/page_usersetup.ui +++ b/src/modules/users/page_usersetup.ui @@ -21,10 +21,10 @@ SPDX-License-Identifier: GPL-3.0-or-later @@ -6014,7 +2379,7 @@ index 6e6e5423e..2a5ccd298 100644 diff --git a/src/modules/users/users.conf b/src/modules/users/users.conf -index d2624bf4d..57a82ddc9 100644 +index e6910bc..57a82dd 100644 --- a/src/modules/users/users.conf +++ b/src/modules/users/users.conf @@ -88,7 +88,7 @@ setRootPassword: true @@ -6026,42 +2391,8 @@ index d2624bf4d..57a82ddc9 100644 ### PASSWORDS AND LOGIN -@@ -214,21 +214,9 @@ allowWeakPasswordsDefault: false - # contains "root" and "nobody", but may be extended to list other special - # names for a given distro (eg. "video", or "mysql" might not be a valid - # end-user login name). --# - *home_permissions* Home directory of the user is given **approximately** --# this set of permissions. If not set, there is no default and no --# permission-setting is done (uses defaults of `useradd` in the target). --# A umask is computed from these permissions --# and passed to `useradd`. --# --# You may write permissions as: --# - write "NNN" (three octal digits) or --# - write "oNNN" (small 'o' and three octal digits) or --# - write "rwxrwxrwx" (like the output of ls, with a - for unset bits) --# The following permissions mean the same thing: "o750", "rwxr-x---" . - user: - shell: /bin/bash - forbidden_names: [ root ] -- home_permissions: "o700" - - - # Hostname settings -diff --git a/src/modules/users/users.schema.yaml b/src/modules/users/users.schema.yaml -index e0647e497..c751a5226 100644 ---- a/src/modules/users/users.schema.yaml -+++ b/src/modules/users/users.schema.yaml -@@ -13,7 +13,6 @@ properties: - # User shell, should be path to /bin/sh or so - shell: { type: string } - forbidden_names: { type: array, items: { type: string } } -- home_permissions: { type: string } - # Group settings - defaultGroups: - type: array diff --git a/src/modules/welcome/Config.cpp b/src/modules/welcome/Config.cpp -index ad5e2d8bc..7e50dc6c9 100644 +index 2bce564..7e50dc6 100644 --- a/src/modules/welcome/Config.cpp +++ b/src/modules/welcome/Config.cpp @@ -77,8 +77,7 @@ Config::retranslate() @@ -6074,39 +2405,8 @@ index ad5e2d8bc..7e50dc6c9 100644 .arg( branding ? branding->productName() : QString() ); } -@@ -116,18 +115,6 @@ Config::languageIcon() const - return m_languageIcon; - } - --static bool --languageAndTerritoryMatch( const QLocale& a, const QLocale& b ) --{ -- const bool languageMatch = a.language() == b.language(); --#if QT_VERSION < QT_VERSION_CHECK( 6, 6, 0 ) -- const bool placeMatch = a.country() == b.country(); --#else -- const bool placeMatch = a.territory() == b.territory(); --#endif -- return languageMatch && placeMatch; --} -- - void - Config::initLanguages() - { -@@ -143,8 +130,9 @@ Config::initLanguages() - QLocale defaultLocale = defaultTranslation.locale(); - - cDebug() << "Trying to match locale" << defaultLocale; -- matchedLocaleIndex = m_languages->find( [ &defaultLocale ]( const QLocale& x ) -- { return languageAndTerritoryMatch( defaultLocale, x ); } ); -+ matchedLocaleIndex = m_languages->find( -+ [ & ]( const QLocale& x ) -+ { return x.language() == defaultLocale.language() && x.country() == defaultLocale.country(); } ); - - if ( matchedLocaleIndex < 0 ) - { diff --git a/src/modules/welcome/WelcomePage.cpp b/src/modules/welcome/WelcomePage.cpp -index 30e3d6b21..88f38c256 100644 +index 30e3d6b..88f38c2 100644 --- a/src/modules/welcome/WelcomePage.cpp +++ b/src/modules/welcome/WelcomePage.cpp @@ -44,10 +44,10 @@ WelcomePage::WelcomePage( Config* config, QWidget* parent ) @@ -6299,7 +2599,7 @@ index 30e3d6b21..88f38c256 100644 void diff --git a/src/modules/welcome/WelcomePage.ui b/src/modules/welcome/WelcomePage.ui -index 0e3dcb09c..b25b4e0c2 100644 +index 0e3dcb0..b25b4e0 100644 --- a/src/modules/welcome/WelcomePage.ui +++ b/src/modules/welcome/WelcomePage.ui @@ -17,6 +17,9 @@ SPDX-License-Identifier: GPL-3.0-or-later @@ -6411,47 +2711,8 @@ index 0e3dcb09c..b25b4e0c2 100644 -diff --git a/src/modules/welcome/checker/CheckerContainer.cpp b/src/modules/welcome/checker/CheckerContainer.cpp -index 4b5698700..4e1ad6db5 100644 ---- a/src/modules/welcome/checker/CheckerContainer.cpp -+++ b/src/modules/welcome/checker/CheckerContainer.cpp -@@ -35,7 +35,7 @@ CheckerContainer::CheckerContainer( Config* config, QWidget* parent ) - - mainLayout->addWidget( m_waitingWidget ); - CALAMARES_RETRANSLATE( if ( m_waitingWidget ) -- m_waitingWidget->setText( tr( "Gathering system information…" ) ); ); -+ m_waitingWidget->setText( tr( "Gathering system information..." ) ); ); - } - - CheckerContainer::~CheckerContainer() -diff --git a/src/modules/welcome/checker/GeneralRequirements.cpp b/src/modules/welcome/checker/GeneralRequirements.cpp -index 693f81248..a58f3df83 100644 ---- a/src/modules/welcome/checker/GeneralRequirements.cpp -+++ b/src/modules/welcome/checker/GeneralRequirements.cpp -@@ -288,7 +288,7 @@ getCheckInternetUrls( const QVariantMap& configurationMap ) - if ( !checkInternetSetting.isEmpty() ) - { - QVector< QUrl > urls; -- for ( const auto& urlString : std::as_const( checkInternetSetting ) ) -+ for ( const auto& urlString : qAsConst( checkInternetSetting ) ) - { - QUrl url( urlString.trimmed() ); - if ( url.isValid() ) -diff --git a/src/modules/welcome/checker/ResultDelegate.cpp b/src/modules/welcome/checker/ResultDelegate.cpp -index ae74a36ed..19f906a0d 100644 ---- a/src/modules/welcome/checker/ResultDelegate.cpp -+++ b/src/modules/welcome/checker/ResultDelegate.cpp -@@ -35,7 +35,7 @@ paintRequirement( QPainter* painter, const QStyleOptionViewItem& option, const Q - - Calamares::ImageType statusImage = Calamares::StatusOk; - -- painter->setPen( option.palette.text().color() ); -+ painter->setPen( Qt::black ); - if ( index.data( Calamares::RequirementsModel::Satisfied ).toBool() ) - { - painter->fillRect( textRect, option.palette.window().color() ); diff --git a/src/modules/welcome/checker/ResultsListWidget.cpp b/src/modules/welcome/checker/ResultsListWidget.cpp -index 92e6668a5..e191b26ef 100644 +index 3f70c61..e191b26 100644 --- a/src/modules/welcome/checker/ResultsListWidget.cpp +++ b/src/modules/welcome/checker/ResultsListWidget.cpp @@ -26,7 +26,8 @@ @@ -6464,15 +2725,6 @@ index 92e6668a5..e191b26ef 100644 ResultsListWidget::ResultsListWidget( Config* config, QWidget* parent ) : QWidget( parent ) , m_config( config ) -@@ -44,7 +45,7 @@ ResultsListWidget::ResultsListWidget( Config* config, QWidget* parent ) - m_explanation->setObjectName( "resultsExplanation" ); - explanationLayout->addWidget( m_explanation ); - m_countdown = new CountdownWaitingWidget; -- m_countdown->setToolTip( tr( "Checking requirements again in a few seconds…" ) ); -+ m_countdown->setToolTip( tr( "Checking requirements again in a few seconds ..." ) ); - m_countdown->start(); - explanationLayout->addWidget( m_countdown ); - @@ -91,21 +92,28 @@ ResultsListWidget::requirementsComplete() if ( !Calamares::Branding::instance()->imagePath( Calamares::Branding::ProductWelcome ).isEmpty() ) @@ -6508,7 +2760,7 @@ index 92e6668a5..e191b26ef 100644 imageLabel->setContentsMargins( 4, Calamares::defaultFontHeight() * 3 / 4, 4, 4 ); diff --git a/src/modules/welcome/welcome.conf b/src/modules/welcome/welcome.conf -index b988eb2ff..15e08ce7b 100644 +index b988eb2..15e08ce 100644 --- a/src/modules/welcome/welcome.conf +++ b/src/modules/welcome/welcome.conf @@ -81,9 +81,9 @@ requirements: @@ -6533,519 +2785,24 @@ index b988eb2ff..15e08ce7b 100644 # GeoIP checking diff --git a/src/modules/welcome/welcome.qrc b/src/modules/welcome/welcome.qrc -index f270ee591..7182a4db6 100644 +index f270ee5..8806101 100644 --- a/src/modules/welcome/welcome.qrc +++ b/src/modules/welcome/welcome.qrc -@@ -1,6 +1,7 @@ +@@ -1,6 +1,8 @@ - - language-icon-128px.png - language-icon-48px.png - + ++ + WelcomePage.cpp + language-icon-128px.png + language-icon-48px.png + -diff --git a/src/modules/welcomeq/img/squid.png b/src/modules/welcomeq/img/squid.png -index 452e4450c56c10cda33dcc9c5d03753ace458862..4a7ac244e8d16f4d0252014c3e4e8556d246b6d5 100644 -GIT binary patch -literal 17377 -zcmaHTWmH>D)NXNiZSg?S;_fcR9g4fVJH-hOMT-?H?(P=c-7Q#gce{DNyYA2XW#z1_ -zmCTvhGiPSo^XveX6{XRTzaW45^a<^|jD+f^Pf((eivSTG@(ugS{Tk#0)>Z7gIwIud -zhiDf0=@a>$d -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 -zhlwKf@eP-uMYF7Vi18yrqi~lV<w(NwZS9 -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 -z12$*iF# -zlw1h0k?~PL&jM;Wy9-YO_Yltn3y68MLj=R%vwL=~+jW4R4teHhjzF9btkWNQET@Ca -zwhbi%@|YHy*5lRf%G4M~*U57_yoK^pB&*Y$<>PTB6|1Kfef -zM<^tUmp%FIxg!;*CQ%iR*X4EsZ3<|~ngP@9GW+8UGSKiIsMGHwCLxX558nh%dYQ3H -z5@OY{d#wE(D=$jOQ6Rs -z-k-RK`G$Di9#)Q{RU`BR7lRpefi2ZI?wc5T(bEb~a3Ih)BLKoLt#|a8TJ-`7F%~fJ{UV6gVg{QRTMg_-Q -zNT?MY%#!Uag6A+gOImNcNB=fAU?06EdPi4WMqHnfF9BQDoV~iG_SasAhsY$eu%g0* -ztVk$wZ=43Y{Us1VICp7%(}|c{L9}I0XC+N -z6xQD3T%`ksGrGwv>tH-m>k<@n)u>-4yyXp03fWS+auxV|17xC)3b2os2VR@DW^o_N -z*_VT*izBO`Tgw{cR>De>Dc9n4dg-FK%FRDV!{YRshtTI(G_ZL5oDZsIY5Bmbs}3Jc -zDG+yPY$K4ZslFuzB_skGqO -z(npiIAj1`7=HVZA%jG|Ypi_vkqJ&6pKLzBWkl -zndrIOCJ{X7(PlS)iP*2}ULWA(n|=LuPW-UN=7P~Qt0SQfKuD+a%8dEHL&Rj+VdB|5z@G=>v#H(lbM5Gz -z!qGJ~7{Uha)%dn*MY>rEpy-JTBt-~c{yx77#AZ(ovwXJi||$) -z#F5thRdk4Gi&_zkp{xnx5MoIU_ce+qt^a^93mF@AJgl^S)$XV>w2Hxzz?q-%sbq#$ -z9+rSaC#te2QcK1MQg -zBw_1uC$og%*lt!Mt=fV^Gt{)+T(=4@qS4c1+I8X#TmKFpN2DMTA~=`8gfhevpQ9ly -z`~X@G-xkpw+?YwDBxEpkYM3LxI+M#C#@qkdPcp>HVkmWJYEqPNY6xR=e5GSU=mO1{ -z;;5S`q|5D`dRb;Yx_e?CJ+go+Y(z4`ujr|RqoD(h9q;OjWpdx}#ixX&p9fG1nF<+v -z{CC`i`+$5f-035>h7A=jtj;Em%y(J8ZF{t6q&iN-_qc`7_#?Kr^><l9-m9>1yvW -zqFcyB%^0IC#X#EB5UDxJNWH9G3Z~dD`(I?vgeU$T8CgrWv<#(Lx=5vOAL{+HjAwAT -zpiXKbF~hrI4WT=ZBHGBS)D4Ks7S0H<%{komw?4-1ZO>nC@n_7@lLPrTN4}iTx@+e{ -z73@H|r!6btt~yeCa6PRzq+a7DeGMA<&eJd0MUG{&&4oRwuIIwHiA5Q(pR#QbHooNf -z4O-&stWR;Lsv+3v-YBcei@@QQ8|1zfRD&eP -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 -zEPr;H1A)Dk-J?A?FW*Us^3oYaC -zP!{PQ`|@cJCnA=jC7#KgH72bI_ML^-j^P_W>=6I1ozI~IUzJZ9Xw@?xThtD0wvt~a -zqJn}$BSZ3pT-@~zQ+F5~T4D@^8p@o0JFH6j3{M%qO=ya~%u-QHyHDZFl8h8S(t8o| -z=9kA{LE+yN4`iPrcTqRl(8VlX2p=B9R6AD;69?Y|Wmmsk*j8&OZuZn$44z5R?W5d_=Rt(qrQP!mz^9ZFKx-@n%*MYxRG -z&pz_bN|M%Ge|$Vq;s2%-z1D@}tn-=`Hkc&V39t$mJ1{>B1gpgmdu7Zgs{AFrx5%)& -zKoRQ4A)^jZfN-6jLQRceSW&5!bb`44VvCWbF}%;k&vd=fP|bRD4gi=baFwEu(qwX9 -z;Ug~I@XfBP-}gEGYp*aY65%IaCclp@!p#@xl`ho%i_Y0|?l{K>6pH{DtcJ}k0b`80S5>-j -zW3v8BO^4Tk8R%XA-9n|T-mx>9#hoY|-7p!{af22fWl1^+EItt{FtYvY!R2^OiPgvK -z57p10_Axh)?#sdmq%8qcjOjkiCITtiHROJ-{+>>1oz)@F@}riDknMg2F`sBX#;2pb!WBPwj -z5XbZ$o27jV+Eg%dKy*32X0{uX$>#^2K-3ZRQxMd(_*6(%^1m`ha-p`*&O}l-{Z|;e`B8$lwl{ -zih2#ISe0Jn=(0x~kwbZJvcU_0p>G^XB222s3Bw -zd*+G;tVzt^=GIs=VUKLL&I5gkRS)nKRi^HQ9)!?@jLSCUep*!R6fmWR=iFtyW|;7= -zVHVyhku(|?r*~jX{TGesdEY1q^{cNjK&*pP*3O^E*1$8?P5+I(1<071Zj4@nf9YcB -zemk7@@1ysZe3sHL1#<>fJvcA{k3fX~yWK1#HQ&E8poB)@1xKrhJ91}9`!}4n(6A>K -zV|TD!G7DdBPY0$fphWlJw41%-gW>k$@>2nGjI#XU-|x-XiD#Tyn$mLiQmeQ%>BBnm`5FVEl`n@M?$}wqJ}vQnFElNW#L?9>DKRi;WEp=11{z=uiJ_tyM5(8~z9-OxO)ThEHUeG3_q>NRIc>0~)I -z)IPF06Y2X(8jr0@V)|y!J>$IaGN53miw)uL!`-nJ6AC|ZP72%#x`eDGoiP(1<9oPO -zo!(_^IKtJsZJtU|B3c$?2xW49f-6dgM9ZUzWF%B+KBPmuG>P|jk@Y-k9;Ip0H!#12 -zUOvJ2URZ8l!4$^Ds*dCTMRG?`)eEcd(7tdCgBZD#?>xs;r?NPtqzEIQgXK9f4cGcs -zb*s%L&@OJZdR_Vb(td|E5TvFy6!KI(-O8boJ+d8=`Ujmt()K6;3ELb3uW0RE=^Kt= -zCV&@Em}T@~HuaG$(fV -zC#{c*0{2dvyCpt03(OGM)ml12E&UkhCt473L@ECaChH$T;~cW#B81c88jvRqZ-Z7P -zvlb7+wx7fe?~ni8`?~MA5DaY4UJ?`}Czb|e)yGpE9 -zGkvwR(nHL#f#Q&J28W^x+*ya`@Hx;`#Yh%(Y-bl^aV2 -zfCVw6Z}i0%YvLAEWUp`#&ht1H5jxSFis2{|G7IapQkSFfKNX;dVbpvpa!xL|%usDe -zs6R~l!g3E{!wiSnyj%Vof!7#P3?s!z*Z%4sT>v-uGWc0I0Dgi5uzD1Ub0m_rB7PbC -z*^m*{1_F)2=ROk`cekg_P`>TKmm#^=<7!DMEITciq^_uXgl*X7hZ00zv@~R&XEGI> -zwB;sSEh$9)`bnqNd($&!4N<@$FWsY;o0O^GQ7bM;eNg3p2hzAM&=|$s@?Qxv7p8S*V@))1-xLe^zIBvdG5TLBuiLM#FxncS!1UxJ;U%*nbhbF_h1gK-f7P^RA%a* -zQVNjh*R{wcofvUvoWg706s8Z%sZpZK@;brdE$T{i|HZYBS}H~gGv_P1Qfep-P4FAN -zFodd^HKFF=MQT~s@5%zp)t)_J?Mv(BZwYR3CG?jT0Nahk+V*TiYURt!*uyl -ze*3@gmIDnEK(9aw0)ma59zCJdR^W>xWmsbd|0`l5V4JW^FQr!eU+Uie -z_n%^-tu2Il4UCj<#<(@PI#Jv<1tC}KH2=WG{kSU$K4UC?ufaBR5YbPZ97Vo0{bzW=+ph+uJEtlncpYKz+iLS5XM#!clK0*&hhoh -z-<@c+PMy;>Ug0a%JJ8WDUk*}A@!Lzo4E(NM*xuKQZNvSAqkwr3_#~z^(g@otePy5; -z8%MmK1t0CMf -z7ZGocpzmQ` -zoanGw^@q((B)~^CDgo9^DQv_H$E5w8M&` -zb)S+Vrbg9jL?M*{*1IU9x=}ujmv0x91?bA{h}7clxyLUy%LBKQs#kxoC%lZl+zrgv -zFT6-9O4kA16}U>`I@Px@%k9M%7ApyGdNZnOKLeKKO!?(fbQ#@)RwY<|Oa!=Ew=6^& -zeqB&6TMXZ*U@p!u+*22jcV#a`-FZMh6m!Hm(V9Rh`oDM20MaY!NL}sIQkGb87B(}> -z?#pR{`dGRWZv-C)Hw8IKb3xqN0d}cxsb4VIxhXoD-Tc@s58E$em+u6Ux0fz00BG1S@IyRXT)qN@ZQ7C)EHZHH|r(q9jh%Z?~@Y+^!MU;H;Z -z-e+KwTl+d>pe^k`U+#%a`nHxlf;uLRt)WlWp -z;#w(Q-+t2Q(3oJhlN3sATXE>OVEY$T)QRHN9j7&4p4v7q+u6S}RL*13wBzKMa%fQE -zu_EK^rr*C~F^xL)?(^B=ymYOcWcKToF9XW{pLeV>g1&gJTGAA^op?-qqG-m1KR>?R -zc7D*_5Z1M8OE|G!etT!R7c4q6?J2&>7O^!aTJQ(nAJ0c2EpWD& -z#qNinV9lRN#G2dntM)933wBPjbk37)&@;j@jDwe)_(KhFp^uErie`nO#hta(> -z#V4X)7_u8P!u#(~IT=orzcb%GC3Drq_2M^lo3*@38Q67x3q|Bw>$Gfw^Zv3ieO!5H -zhhd$x8d}~Q)wXcWqCTs;dlkE$+K#yBBG}m02)oanKe5CRJSTJ$TQaZr0}-ntjcS2A -z`N$`vlQTJQUie$ZewU(WoEe%qRe6P0qq*W8;0OXj{Plg;#v78S30}ylCxt>~Upj2i -z#1arv^FMJ;{BfMs(_FA1hrM-{|D`$S=>Dk4htk)`Fax-09T3R9(9Zix>9m5|UA;K4 -zH#bimys+NS^lH1NX5Jbu%>Vk#7hk!kaR&SDIjd{>)cf8@oN0ERUHy6OKo+-Ghjj6% -zL{l$3t${UQxg<2*_tG*2Ury;SRu$14(tQ(se5HT`*LiVU&X8V}eN~lW -zid*fYZ;>ljug!&f=hk<@p^5#kUcvNy0t^bUL@SZDpKZdAik`X8{pyyF=MaS^!32z^ -z7EKG@>n!i=d<_3JI!o4%P4A2zAhW@n9=pbg6-3bw^8O3KD=GU?(r}{(e)x3xP&{zg -zR0z&%T^M{3mS>Oo=_Bb>i=A$5Q*^9iSP58;X_icS(p|P@?Kr!y5s1hMuca#0fOY)C -z69KQ>i~a*2g!Pp(%UO76)~m%R&drfjVj2Q6xa5K+VJ6 -z*2&u#e|HaP-1AB;(3(rV=6=Y>dX42r(UNvd|J%$M#B9XJo#68*lRb2n$LCBmsI*s8 -zJb6PXmuX|LO!N0~!*3bZc0#|9AUv;VLP -z7PJ;RT?}+D+Pl*3N~FBln`Usf;K^=t7&3nUO%TLR;#;=vNOY5R;VAU4h?n6zXTkUp -zsC?1o80}N_oq>X9oX*%$Wqp;eWr=vBy05TprD@%09Ygnx0sfSjobua)SJv^liet(? -zobJ~TN65xa6QTIg?_J)RQ#y&&Fy<2%(OStbU^?)HLUm%@;<$4`ZPVFCcex0{y2M!! -z61WqXR$I6;IJR|Ln798Lz1^>|SoE9kZc%%&Q!V+5MuV7JjlNQ6?NNRShnjcd>aMWC -zHVV^PeEHKSn4kasF90HZih!ai{&&aQ)U2ZOSlVvSC>P&SVTwIF_w%Bz&1*aN?8~-!Wy0IH98M -z6yjpkH_4J#)n~OfR3EJ_f2a*O*E2S#JNnaC7cbhD-)A_sA;MGHcKnpGzx#IFg?X3d -zz^`~Gn6N3SytVn`So_SAOP4o=s{EU8EpXcnXb?YTN@8JS8jIOWh2k4;nb~4jf;hPc -z_+=JA@ICh=|2#SfXFj#s3FG}uKT;d~e*%I6ef?poOW116&K~A>Hg}lm+gQ~P{|qGY -zGw>`F^Xi9Kjh|qWxvjibEgxs;ieJEgP`e!}$-*?arLd6rQsPa_UnIp$BGCvD1ix)8 -z#8S9#n(q@<>nxoFeu25ArJs&x@h?2tgtF(0pcnfKbsnFj`7fC;bE&H_J@e6nnNN|p -zk@*$EH?aVnpjsnFk~C(B9Eir7So*!cAcgl_AAnz=IWL(oC-Cp}vI=`zWHhr!SdBoQJRv3FI3&)8D -zl^Jvx_EfQNqeT$>7j!dBHYf1gyRfu7LO}I1eaR-Bzm{|FsdE2?x|V=sgX*dHE*!me -z)}xy8SNiPmY}a^v4(Cf&d9HvzuA8Wr`nF!acu$f<|0!oNy?2xD}H{s -z$>*-8F(s=!E_@w(nVX>0!@XR5U#n?gK_i=MU8_A`t>;NrS@u*SI2Tcw>o!-xpRMlU -z@2(y`R^@fndJSQEne0nj%QKXm1A}DjL%v2;xpYNi)(8-=AoF_~*7d%t$!`{-i -z4YkaHsL4Ef$@Vpq7XU=Lg*m9b1NOBD!qt82&ggiqDZeQRRmO|6RLn9 -zMGz2a2I&Zf8X(|5{$4*H;K^E9XU~;6vu9s3d(LDhv8Kkl=jeIp0RT9sucu`W03hlR -z1i)d`i(O!uJM{t$($KerQ(qBqH#}9Q^Vj~7d2f!uynjDv`1ix(nX#3V-}C>?dEr>@ -z9|$!h22gGzR|N60?cBbERn-W|)m>5b0xUnCtN}x_aN`)U{L+lvfVvw}8i?sbxdG5r -z=RN=~*p&ie(ZUHp`0oK{lTu>?7TmQ~3%X{29gG)as^@#xk1P -zMyU$VorzFC*;*i>rF!Atlge}tOT -z7p4@tOPo#K-Dw{Xgw;z|CpfNB0j4IG$I36>DYFusq7C^2M!pHEtm#k$^8};a)NSHc -z<3fqFg9=R&`+(32Jm1m}0#@wi885oE^Y -zs-GbIh2|QjWEs`qetUrT&MgrZQ8z%qoSHB4e}8vP{W;=`S)w=NDs}B-`Fm7A;B6)x -z!Ep-P-uOFj$R_tdc6u@3;h$|KY0OGl%+B~y$Fk6PToXX-E(mOQ*; -z3KRjipn#phT@tg=H}k%aJ=WSz0YT9UM6T}d&|(%s`xof1Eg%aWl>#CgN>b5LXfZnh -zEf1>yhf;OPdTLa(A4=rMsQ=i)stb>Zy8)`wfu!bRHbUO;Wd+w$kL|eNp27m+Jn85k -zh~~{|e>dwFbd5O+?MF4xxAzyr`|L2{dq#^+H3hwC&3N!&#W8&UBvR?`=tDx1LeyT~ -ziyio9H?X}XY(d6?IbuKofwv0dkEwB7UTt;kr7F#t=P!@hFyf@M(7pfspEl$dBi4J+ -z_Cc@X82S0Xx`6c&1ih=1{m|>tjQr>{UvMlUYRvtS8`$68Dfr -ztc2G0ELmsq;HC6jlgLDJZ=*g87BOyXbl -z&7N%?P3WlBgb)=)vV{GMq6=)^g!J(Bz-;uJB&wP2#|_!&DI#qrYn05lglvEtoq*4w -zbJL~>7Gyj7%4c8h16*|M46$C{*$9Q7-roW51ur0__uK2SGk|p@xiWG^F0lU#Qsw0H -zTebQ%=C+s_+rK|@K>e&#ZP0jh%sQ!vU7ZzenAP;xr%fB&x@nPVMT%bx88R(@7=hBJ -zI)GGbhM1*Tk{I4Of!zQpk#gabU=qVuU#dXI?tS|(C27UM&~C!cwGTcn~baLpFHIJ?at$fHZ00loS`X*@du6HP6Z1dXzxbkS(P8i~vMW -z43mWxA^PcgDix>te*EnqeFI12TBZBvGy7OI9knJZ@Cd>)4(-NVuVU2M46&a8bK`1P -zumdr9rj3~ba;gX#!1pXmcDxcg%76`p! -za&w0dqo62>VSOeJ<^tnJ<7_`e-|=IH54+XCEClKn_xR_&RLdvmyQ>&peTsUb`YH^d -zF>O8tgQ$Upc_l%mCC_kb7F!OK*(CLDF}6ZD|4aPSA~?+ -zN6p5e_Uu~f92$`E0{mc4CW_(J-`ZiUpRnE`0V%tePh&ey_%e -zTDv{fEwH1xpiex)efQG%Fu(b$w=o>R>p!ixRw1u-Wh5T@!G=2x_O=Yq> -zjj9x)uQJ^~uS@hRFkvQUaCscRwV@htMPdc|p)+$~ -zMk1s`%Zne3J8I;=??JhNQI3yvqE%~ed!LaXUNPalbNtV^)+7qhtk^{xvPGRlL|jdt -zx$vil$|gRa+fr%g;x&9XLF>UbF@yQ{kAG+z(o|`uVt3kSjGBG(y5ZB;n6?I>o|-Jh -ze)Mr-2Gz8#2VXVxDe?})jIsZ67N@BkkTukQ0<_*OwPGiiW!a*1*X%XzfldYbipFYe -zyJV5vuXI+D3}*`&6bHZy`o#f=?zdHA?||V?jhs(3gK8dJgA68_fD)HzZh@$hXL_&BCRNxAFO3D=%pc&S3bTYUiYC#$Qm4!=kKN0%+^&zvqoF>IhOLCy!q*ib(Hxv-gVagp#D2OQqX_$|Ktrc$Hld(nBhT-MAR~GM55%wkT2RVrm7e3-9zggJS2S -zs3Dn3wYb$w&F2nkl6I%%##}DY_(c;-2%3uRFNZ`IXjda45o -zQ_MiSDd{T_&BV4Kx?M8%>*$1bpz7A4Z8hchA%mv2=aILK$OcGWIqdp#8d~V6c+*?W -zNuL8B$<&ACGX{4943fdqta$v5?2>3HSgZA}s;Ik*aSR#61L0?jsi+tUR60~}6<&UY -z=cAIz_PC;=Z)rC%Rtgc6*8MLSbed-DW6JEEK$qFSJX_xw`S5kU+LM#5^Rp$rtk~I&9x9%Hf`C -zKHO;5H{oFiv6PoQ)8mg1!+;X0V_j!@M&J9xOm1bv^Ne4>ELm7F`gWxTXT8`p`-L&F -z4@}rT#)OWD1w -zYAdSgOkfNF;Rie02bCkZW}`o-+XFG4($OEDo=SgU!SgR%-O?WuEHK7n7@Y!m6e)^R -zl_t>z54i6x%N5>&?$M(f7?Ih)Cu>NK1kHQ|O-+D83NQZSpuXEW%HK_L%Ets`Q4KJ> -zM|*LWZJ;r5+mDb -zzjB}!pTTrNtM1ksIVeGFs=-Sp)ZxB>yzlgR{XNzuP>qlY_Qu}1g1 -zfuRnCpEvu_=BS*X68oGH!QOa?;c)VHTEQ!C_W2dgoMfQGRZ}R9*yJdYT#S+G}_j~N{uZ66YV&j3^7&NY9@>{D45>iICh^vBslQ&mzm -zHm%ho|J|vY{5A#Gw$~Avhj%`^R?sn`teT^QKruqpP6-7I`;!jmD0W?4LgdrK7UltA -zVek!;nlbFINc&dPHFgpNz4b?E;V=@k`d;mY?3B;LB9%W&3q8z0uInagyO=z%O%wGN -z*`d_iMWASl5^1qLJv0<@2d)3|U>17#<=k0mRH!b$(uS4iJb~lxPCEMCp+?pN?j~pK -zy=Lk0T^*X72Q=$Z82Yjo8aMoYt~v}}n~(1N?>1Gi-28FKexP<@Shn(JqCzp8s5mrR -zD^%lY0HTc{n_gd3lFglxr>z^(*LEiT! -z={Pcj{u&w?yUfqErskfE_ghSzbo+q^)G{U7%Qa2&Tf|e|D0h}=hA#}1S$!T&7l2M# -z9AaC4?s`UXdG_f4;yaO8cJ~kx*BtTpT^MydrN_0T>h*0#Epr>17}2EFvpudARXZ^b -zi+>2_S39MTOP+_cIwT*%*al7N;QL&Ei9UJzo#c3C7ZTYZGcPB;%@|Bp3jV_{EYii@ -zwbO}WR5|+P2R_2kD?Tky+nm}pb--L5r{8f2{(Gtzvh%7@=FRZD%sSuF8Xt}P>?DWI -z1;ojAZzn}%Xs{ru#eqWkiHklR*5Y#RZy_CTWaek@ohl!zI+l=IM@pG@-s_^sL`}sT -zK}^CgjL>FZW$wLJA)S`RJIMr+x$Ym$FuR8Oa=v`&isZhS)TGyjl95Tw%E~H>2LTJY -ziwn_^hUKP>$S;%gYP8ECHCz{WWP02F+h0}FvVT1Oay(9P|4)>2)V*`<$er+WjpwiN -z9^`aM5*}Apw+>BmgB)o=-)kXGk#BE^r1i_^zEhZfGvPh5&oXhzEg`TmA@ -zVw$wITj#G8XnXqxtUcV?__g_E1RRU#O+HbEE%X(CS?OFFq-o?m0Yi`?1fpAa -ziw5w#b@0NSwr6wmDrNi)!5%x-OBqbkV~HzreVlQZ6mPFkuDl=_&%n^OTpE3{D)LSH -z?~Wjw?#1iK+^4?&Kmz2OH%CI&@S4!^%Uf0LCSQ(!(BSWrm|3q~sfJ8gia*_FVamjq -zR#}^gvKNYeICn=4iDR9Y00Kw1{B*PotfWfMvZ>!DEGttb%8eixKX&3q5Qsby_*Yse -zjmA~92pG!g_N$W|W5;^Gj*BP)F1tRYBlono^HZIzZU*mi+>RKC*W+BGC|>DnoI6s= -zrM>6xKVHG{D=>VWX|Mg=oq>f?cPcrkiTrI>U#+yvp#mD@AlpL=#GOH&dTG9{JN`kT -z{22qObiw^Q>EesZFw^<_SxU@?Zb_5h>HwZ?N@&a_%u(j8Djip_eW57*(5?3qlPaf? -z@=ng|pI%fJoIq8d#K!uevJr4KO)dNh8?BQ%seQU9l_s4=r3Ccv}wwwcDK^VDsh7)TIbnpFA -z&aMWGzdd%l+jM)k`HP1%^?VAp+mZX)Tr6}pIzlx$X!r+fh!g;H2?(=5HH@C1I0;SW* -z>5FfqtPJDz!^vjD)W_<0*bGv~>f`Ho4`^?0RDWpWdcX1G{60d?^INUGTFsdA=`u{W -z(Gq8-K)IJ3d1hA=WaG)a=GohmVF!C6))uAqr0efr?`Ac?b#^GFvMlwxxayPRKQ{qv -zYiL}+dxOt|fpNx)Tmk_zR`%I8E!C@d!G{$mlt -zjy<_3kmy97eTA;su%J;J?A$(ND#Xhll75pLrU3R#Z#`9zl}<2_BnZwtxaab1{hQ*+ -zOc3M<)6tz`sJ`?gDWAQoyvkfFIV;F%le(+@T4A4m35bqW!!Qy+*_-RkrM}0?{#E>m*kF;f -zi4LpGNKkoGLq`WY&AC|C)PbcM-!9mBCCaJMHQe+X_(I9}z+Z8_R5GPxVdO7Qgjqfa?7b^1l*TKYEJ%=$(VvaeOc>?&6MBk`HS -zES&?As$`LIil2Y0?4DF#=B?tc41>XHoX3P)0`^3`RaH3}IB=EKjhxC7aLjq5(_kzs -zwy@~|Z3(S{3z@7c3cBhbRuCd!+;);vmR$8EpG;$@e(y(!t>`2wI8ZHOb_E0=yVe-g -z@N2wn@O)lIJIXC3^F&A%LwjI%FWv`W+VE+K4J*fpmR* -zKisioWA`Mw;}2|DQwC_4jkYKiHp^7Oatxm;=*-P9)XKi%U4IgAHTNOHc>9=T{SktN -z!SI~~CfXU9nU$~gv!}r2sDoAtb!u*MG_EuGb5EPEr&DPgYE#$OEjj6vYX|^wJ%UUs -z1U|_N*YP)*lZ#!Q{?}ptZi9;3RM8hcHpu-;YCX}o;Qh@<&d}JXvy8Vdy##fzE`(J5 -z$P9TVsZst=*(=hM<|g$tF5vWz?ac8*taS}9Uo3%RNXfm#!}RTQ6e<$#TCIvJvKV%C -zT1K_E+RRw>DinX%a=Gf;2uhdZx|J>(dtHMx(EBN|>Fr{jP4YsbLK5*;?4l@Ve15NY -z1HK+4puU&gRTUQ=59DvD`tGUvxAaB^~* -zUg0z=e{Lp`QB;2AgB_Er>mu?3Z~T`-d^Z4~CqoR4sEh@nK2_m_d9p4!Rhp%eA3h37 -z`ri1T<;^?Fw_>b@jc=$&=(9zA`V*pC_}2JMxouM+#BZ^M)(gL2ou>}T1 -z+U_(vcbbBaW_kju{DOv>-Zg@W3a_&Cae2wlhAxu~yb|Q{#4j>f&p0vKs!ByG4HjEU -z{6~Cxuj%9aX`Rni!&3emNSX3FjAFxOOsQ&*(vwp8aYWdTUyHDWmwBsjQU0?yLNhol -zw!+J{EkeoN-Myn~*0?9{vBK<;cICp?JU;WLT|bMDC31?9;iH1Tl?(frYqlvZVzVvI -zaC!$Wy0@%lzM- -z{RxyA?Pvbq)K&S{_JEL9*jt%fAhJuu0*FbN0TyYIR-Tz{t|urG!W)4$-^#C0`K`<<4A8a+j;hh -z8wB8jSN!OmZ#RMIm`_@f7r38vB5(Gj*{cCOU6|&%S8p@IEe)pT?;E|U;qxr>Si5NA -z9L0#&=0fX?$tFnNhLv0ijbis)XR@UWMP7*~h;3$+?oZ=R1NCy>)y&8L{K?A5bnbiD -z=0|5jnOQ~+ft3A$?j%o({=`+|)qB99EE`u_8!$LLd^;5Y3_c9ORW?H)i7&^OYmIFO -za{o*)o#eqJblxgukEJP1&tKE*>H=h%A)&fAD-0lsuA+f?{gYbo*^9TIf6bMMKH}#2 -zoy?qC1+k?!vXHtiANS-a94PLfE4m$a^5V$L;}SamJ#Ks@<43)1kdyr9lAud&`SZ*; -z9IOLrDv_T1z_WQmW9I0~WXgIuX-IN?`bFb&_ejn@!yCP+wuvCwXBKh^2}wl_HBQNN -znJAPdThr>U!Hw~x6Uu?CZPN+GKuQq>r*UzrsU7x9X6=)aDfYd-wtJg_$=2c&^1X7U -zfptIvn^59~=Kvz_opZfl`p6vn|;kv(0Mi|%Dw|AUResXn39Cqe3@iFD1Brb26B_N>Ka*Kx!EJg -z|AZW>U`bB`nNH2qK51#3bbM`|x=wSgQcP^qM74Gs+()H7x=5h8z&lJ+Z1XVBPL&x| -zXkLEnN@value( "zfsInfo" ).toList(); - -- for ( auto& partition : std::as_const( partitions ) ) -+ for ( auto& partition : qAsConst( partitions ) ) - { - QVariantMap pMap; - if ( partition.canConvert< QVariantMap >() ) -@@ -231,7 +231,7 @@ ZfsJob::exec() - // Look in the zfs info list to see if this partition should be encrypted - bool encrypt = false; - QString passphrase; -- for ( const QVariant& zfsInfo : std::as_const( zfsInfoList ) ) -+ for ( const QVariant& zfsInfo : qAsConst( zfsInfoList ) ) - { - if ( zfsInfo.canConvert< QVariantMap >() && zfsInfo.toMap().value( "encrypted" ).toBool() - && mountpoint == zfsInfo.toMap().value( "mountpoint" ) ) -@@ -276,7 +276,7 @@ ZfsJob::exec() - { - collectMountpoints( partitions ); - QVariantList datasetList; -- for ( const auto& dataset : std::as_const( m_datasets ) ) -+ for ( const auto& dataset : qAsConst( m_datasets ) ) - { - QVariantMap datasetMap = dataset.toMap(); - -- -2.46.0 +2.43.0 diff --git a/0007-root.patch b/0007-root.patch index 3d88564..3966aae 100644 --- a/0007-root.patch +++ b/0007-root.patch @@ -1,25 +1,175 @@ -From 1aa2969cfc3d28e0da99f549cbf0ad28cfc95e78 Mon Sep 17 00:00:00 2001 -From: lizixin <2271170409@qq.com> -Date: Fri, 27 Dec 2024 15:19:04 +0800 -Subject: [PATCH 5/6] root +From 1c55eb532ed186baf5b0ac4b7b8504c8e84bfc8e Mon Sep 17 00:00:00 2001 +From: cui-gaoleng <562344211@qq.com> +Date: Fri, 8 Nov 2024 02:53:37 +0800 +Subject: [PATCH] =?UTF-8?q?/=E7=9B=AE=E5=BD=95=E4=B8=8B=E7=9A=84=E9=85=8D?= + =?UTF-8?q?=E7=BD=AE=E6=96=87=E4=BB=B6=E4=BF=AE=E6=94=B9?= +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit --- - CMakeLists.txt | 3 ++- - 1 file changed, 2 insertions(+), 1 deletion(-) + .editorconfig | 29 +++++++++++++++++++++++++++++ + .gitattributes | 14 ++++++++++++++ + .gitmodules | 0 + CMakeLists.txt | 21 +++++++++------------ + settings.conf | 18 ++++++++++-------- + 8 files changed, 114 insertions(+), 20 deletions(-) + create mode 100644 .editorconfig + create mode 100644 .gitattributes + create mode 100644 .gitmodules +diff --git a/.editorconfig b/.editorconfig +new file mode 100644 +index 0000000..44e191e +--- /dev/null ++++ b/.editorconfig +@@ -0,0 +1,29 @@ ++# SPDX-FileCopyrightText: no ++# SPDX-License-Identifier: CC0-1.0 ++ ++root = true ++ ++[*] ++charset = utf-8 ++end_of_line = lf ++trim_trailing_whitespace = true ++ ++[CMakeLists.txt] ++indent_style = space ++indent_size = 4 ++insert_final_newline = true ++ ++[*.cmake] ++indent_style = space ++indent_size = 4 ++insert_final_newline = true ++ ++[*.{py,cpp,h}] ++indent_style = space ++indent_size = 4 ++insert_final_newline = true ++ ++[*.sh] ++indent_style = tab ++insert_final_newline = true ++ +diff --git a/.gitattributes b/.gitattributes +new file mode 100644 +index 0000000..6a8126f +--- /dev/null ++++ b/.gitattributes +@@ -0,0 +1,14 @@ ++# SPDX-FileCopyrightText: no ++# SPDX-License-Identifier: CC0-1.0 ++ ++.editorconfig export-ignore ++.gitattributes export-ignore ++.github export-ignore ++.gitignore export-ignore ++.gitmodules export-ignore ++.travis.yml export-ignore ++.tx export-ignore ++ ++src/modules/testmodule.py export-ignore ++src/modules/globalStorage.yaml export-ignore ++ +diff --git a/.gitmodules b/.gitmodules +new file mode 100644 +index 0000000..e69de29 diff --git a/CMakeLists.txt b/CMakeLists.txt -index 21e6a1a..40ae7e0 100644 +index 9da614e..19395d4 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt -@@ -741,6 +741,7 @@ set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "A Linux system installer") - set(CPACK_PACKAGE_DESCRIPTION - "Calamares is a Linux system installer, intended for Linux distributions to use on their ISOs and other bootable media to install the distribution to the end-user's computer. Calamares can also be used as an OEM configuration tool. It is modular, extensible and highly-configurable for Linux distributions from all five major Linux families." - ) --set(CPACK_PACKAGE_ICON "/usr/share/calamares/branching/default/openEuler-icon.png") -+set(CPACK_PACKAGE_ICON "data/images/squid.png") +@@ -78,8 +78,8 @@ set(CALAMARES_SOVERSION "${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}") + ### OPTIONS + # + option(INSTALL_POLKIT "Install Polkit configuration" ON) +-option(INSTALL_COMPLETION "Install shell completions" OFF) +-option(INSTALL_CONFIG "Install configuration files" OFF) ++option(INSTALL_COMPLETION "Install shell completions" ON) ++option(INSTALL_CONFIG "Install configuration files" ON) + # When adding WITH_* that affects the ABI offered by libcalamares, + # also update libcalamares/CalamaresConfig.h.in + option(WITH_PYBIND11 "Use bundled pybind11 instead of Boost::Python" ON) +@@ -128,9 +128,9 @@ set(USE_services "" CACHE STRING "Select the services module to use") - include(CPack) -+ + ### Calamares application info + # +-set(CALAMARES_ORGANIZATION_NAME "Calamares") +-set(CALAMARES_ORGANIZATION_DOMAIN "github.com/calamares") +-set(CALAMARES_APPLICATION_NAME "Calamares") ++set(CALAMARES_ORGANIZATION_NAME "openEuler") ++set(CALAMARES_ORGANIZATION_DOMAIN "https://gitee.com/organizations/openeuler/") ++set(CALAMARES_APPLICATION_NAME "easysoftware") + set(CALAMARES_DESCRIPTION_SUMMARY "The distribution-independent installer framework") + + ### Transifex (languages) info +@@ -155,13 +155,10 @@ set(CALAMARES_DESCRIPTION_SUMMARY "The distribution-independent installer framew + # `txstats.py -e`. See also + # + # Total 80 languages +-set( _tx_complete de en es_AR fi_FI hr hu ja lt tr_TR uk zh_TW ) +-set( _tx_good az az_AZ be bg ca cs_CZ es fr fur he hi is it_IT ko +- pl pt_BR pt_PT ru si sq sv zh_CN ) +-set( _tx_ok ar as ast bn ca@valencia da el en_GB eo es_MX et eu fa +- gl id ka ml mr nb nl oc ro sk sl sr sr@latin tg th vi ) +-set( _tx_incomplete bqi es_PR gu ie ja-Hira kk kn lo lv mk ne_NP +- ro_RO ta_IN te ur uz zh zh_HK ) ++set( _tx_complete zh_TW ) ++set( _tx_good zh_CN ) ++set( _tx_ok en_GB ) ++set( _tx_incomplete ) + # Total 80 languages + + ### Required versions +diff --git a/settings.conf b/settings.conf +index f4cbd05..f2d1106 100644 +--- a/settings.conf ++++ b/settings.conf +@@ -118,9 +118,10 @@ sequence: + # - notesqml + # - packagechooserq@licenseq + - locale +- - keyboard +- - partition ++# - keyboard + - users ++ - packagechooser ++ - partition + # - tracking + - summary + - exec: +@@ -134,23 +135,24 @@ sequence: + - machineid + - fstab + - locale +- - keyboard ++# - keyboard + - localecfg + # - luksbootkeyfile + # - luksopenswaphookcfg +-# - dracutlukscfg ++ - dracutlukscfg + # - plymouthcfg + # - zfshostid +- - initcpiocfg +- - initcpio ++ #- initcpiocfg ++ #- initcpio + - users + - displaymanager + - networkcfg + - hwclock + - services-systemd + # - dracut +- - initramfs +-# - grubcfg ++# - initramfs ++ - packages ++ - grubcfg + - bootloader + - umount + - show: -- -2.46.0 +2.43.0 diff --git a/0008-progromTree.patch b/0008-progromTree.patch index 389fd59..8063e8f 100644 --- a/0008-progromTree.patch +++ b/0008-progromTree.patch @@ -1,71 +1,660 @@ -From d85d6cfbf0b690335e0817a6c4c28e9cfd7d15c5 Mon Sep 17 00:00:00 2001 -From: lizixin <2271170409@qq.com> -Date: Fri, 27 Dec 2024 15:21:56 +0800 -Subject: [PATCH 6/6] progromTree - ---- - src/calamares/progresstree/ProgressTreeDelegate.cpp | 2 ++ - src/calamares/progresstree/ProgressTreeView.cpp | 6 +----- - 2 files changed, 3 insertions(+), 5 deletions(-) - -diff --git a/src/calamares/progresstree/ProgressTreeDelegate.cpp b/src/calamares/progresstree/ProgressTreeDelegate.cpp -index 7541356..5b988d6 100644 ---- a/src/calamares/progresstree/ProgressTreeDelegate.cpp -+++ b/src/calamares/progresstree/ProgressTreeDelegate.cpp -@@ -53,6 +53,7 @@ static QString getTypeOfStep(const QString& stepString){ - - // 将地区枚举值转换为字符串 - QString countryString = QLocale::countryToString(country); +From dd87845d5196cb45fc409ea0d445ff157cda7d33 Mon Sep 17 00:00:00 2001 +From: cui-gaoleng <562344211@qq.com> +Date: Fri, 8 Nov 2024 00:48:41 +0800 +Subject: [PATCH] =?UTF-8?q?=E8=BF=9B=E5=BA=A6=E6=9D=A1=E9=83=A8=E5=88=86?= +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +--- + .../progresstree/ProgressTreeDelegate.cpp | 338 ++++++++++++------ + .../progresstree/ProgressTreeDelegate.h | 62 ++-- + .../progresstree/ProgressTreeView.cpp | 142 ++++---- + src/calamares/progresstree/ProgressTreeView.h | 80 +++-- + 5 files changed, 375 insertions(+), 250 deletions(-) + +diff --git a/src/calamares/progresstree/ProgressTreeDelegate.cpp b/src/calamares/progresstree/ProgressTreeDelegate.cpp +index df513f2..6d5f865 100644 +--- a/src/calamares/progresstree/ProgressTreeDelegate.cpp ++++ b/src/calamares/progresstree/ProgressTreeDelegate.cpp +@@ -1,119 +1,219 @@ +-/* === This file is part of Calamares - === +- * +- * SPDX-FileCopyrightText: 2014-2015 Teo Mrnjavac +- * SPDX-FileCopyrightText: 2017 Adriaan de Groot +- * SPDX-License-Identifier: GPL-3.0-or-later +- * +- * Calamares is Free Software: see the License-Identifier above. +- * +- */ +- +-#include "ProgressTreeDelegate.h" +- +-#include "Branding.h" +-#include "CalamaresApplication.h" +-#include "CalamaresWindow.h" +-#include "ViewManager.h" +-#include "utils/Gui.h" +- +-#include +- +-static constexpr int const item_margin = 8; +-static inline int +-item_fontsize() +-{ +- return Calamares::defaultFontSize() + 4; +-} +- +-static void +-paintViewStep( QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index ) +-{ +- QRect textRect = option.rect.adjusted( item_margin, item_margin, -item_margin, -item_margin ); +- QFont font = qApp->font(); +- font.setPointSize( item_fontsize() ); +- font.setBold( false ); +- painter->setFont( font ); +- +- if ( index.row() == index.data( Calamares::ViewManager::ProgressTreeItemCurrentIndex ).toInt() ) +- { +- painter->setPen( Calamares::Branding::instance()->styleString( Calamares::Branding::SidebarTextCurrent ) ); +- QString textHighlight +- = Calamares::Branding::instance()->styleString( Calamares::Branding::SidebarBackgroundCurrent ); +- if ( textHighlight.isEmpty() ) +- { +- painter->setBrush( CalamaresApplication::instance()->mainWindow()->palette().window() ); +- } +- else +- { +- painter->setBrush( QColor( textHighlight ) ); +- } +- } +- +- // Draw the text at least once. If it doesn't fit, then shrink the font +- // being used by 1 pt on each iteration, up to a maximum of maximumShrink +- // times. On each loop, we'll have to blank out the rectangle again, so this +- // is an expensive (in terms of drawing operations) thing to do. +- // +- // (The loop uses <= because the counter is incremented at the start). +- static constexpr int const maximumShrink = 4; +- int shrinkSteps = 0; +- do +- { +- painter->fillRect( option.rect, painter->brush().color() ); +- shrinkSteps++; +- +- QRectF boundingBox; +- painter->drawText( +- textRect, Qt::AlignHCenter | Qt::AlignVCenter | Qt::TextSingleLine, index.data().toString(), &boundingBox ); +- +- // The extra check here is to avoid the changing-font-size if we're not going to use +- // it in the next iteration of the loop anyway. +- if ( ( shrinkSteps <= maximumShrink ) && ( boundingBox.width() > textRect.width() ) ) +- { +- font.setPointSize( item_fontsize() - shrinkSteps ); +- painter->setFont( font ); +- } +- else +- { +- break; // It fits +- } +- } while ( shrinkSteps <= maximumShrink ); +-} +- +-QSize +-ProgressTreeDelegate::sizeHint( const QStyleOptionViewItem& option, const QModelIndex& index ) const +-{ +- if ( !index.isValid() ) +- { +- return option.rect.size(); +- } +- +- QFont font = qApp->font(); +- +- font.setPointSize( item_fontsize() ); +- QFontMetrics fm( font ); +- int height = fm.height(); +- +- height += 2 * item_margin; +- +- return QSize( option.rect.width(), height ); +-} +- +-void +-ProgressTreeDelegate::paint( QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index ) const +-{ +- QStyleOptionViewItem opt = option; +- +- painter->save(); +- +- initStyleOption( &opt, index ); +- opt.text.clear(); +- +- painter->setBrush( +- QColor( Calamares::Branding::instance()->styleString( Calamares::Branding::SidebarBackground ) ) ); +- painter->setPen( QColor( Calamares::Branding::instance()->styleString( Calamares::Branding::SidebarText ) ) ); +- +- paintViewStep( painter, opt, index ); +- +- painter->restore(); +-} ++/* === This file is part of Calamares - === ++ * ++ * SPDX-FileCopyrightText: 2014-2015 Teo Mrnjavac ++ * SPDX-FileCopyrightText: 2017 Adriaan de Groot ++ * SPDX-License-Identifier: GPL-3.0-or-later ++ * ++ * Calamares is Free Software: see the License-Identifier above. ++ * ++ */ ++ ++#include "ProgressTreeDelegate.h" ++ ++#include "Branding.h" ++#include "CalamaresApplication.h" ++#include "CalamaresWindow.h" ++#include "ViewManager.h" ++#include "utils/Gui.h" ++#include "utils/Logger.h" ++ ++#include ++#include ++static constexpr int const item_margin = 8; ++static inline int ++item_fontsize() ++{ ++ return Calamares::defaultFontSize(); ++} ++static bool contains(const std::vector& vec,const QString& value){ ++ for(const QString& v : vec){ ++ if(v==value){ ++ return true; ++ } ++ } ++ return false; ++} ++static QString getTypeOfStep(const QString& stepString){ ++ std::vector baseSetting1 = {"Location","Keyboard"}; ++ std::vector userSetting1 = {"Users","Packages"}; ++ std::vector installSteps1 = {"Partitions","Summary","Install","Finish"}; ++ std::vector baseSetting2 = {"位置","键盘"}; ++ std::vector userSetting2 = {"用户","桌面"}; ++ std::vector installSteps2 = {"分区","摘要","安装","结束"}; ++ std::vector baseSetting3 = {"位置", "鍵盤"}; ++ std::vector userSetting3 = {"使用者", "軟體包"}; ++ std::vector installSteps3 = {"分割區", "總覽", "安裝", "完成"}; ++ // 获取当前系统的语言设置 ++ QLocale locale; ++ QLocale::Language lang = locale.language(); ++ ++ // 将语言枚举值转换为字符串 ++ QString languageString = QLocale::languageToString(lang); ++ QLocale::Country country = locale.country(); ++ ++ // 将地区枚举值转换为字符串 ++ QString countryString = QLocale::countryToString(country); + // 输出当前语言 - if(contains(baseSetting1,stepString)){ - return "BaseSetting"; - } -@@ -202,6 +203,7 @@ ProgressTreeDelegate::paint( QPainter* painter, const QStyleOptionViewItem& opti - QColor( Calamares::Branding::instance()->styleString( Calamares::Branding::SidebarBackground ) ) ); - painter->setPen( QColor( Calamares::Branding::instance()->styleString( Calamares::Branding::SidebarText ) ) ); - if(index.data().toString()=="欢迎" || index.data().toString()=="Welcome"){ -+ - }else{ - paintViewStep( painter, opt, index ); - } -diff --git a/src/calamares/progresstree/ProgressTreeView.cpp b/src/calamares/progresstree/ProgressTreeView.cpp -index a9a15b8..5ea761c 100644 ---- a/src/calamares/progresstree/ProgressTreeView.cpp -+++ b/src/calamares/progresstree/ProgressTreeView.cpp -@@ -22,11 +22,10 @@ ProgressTreeView::ProgressTreeView( QWidget* parent ) - setFrameShape( QFrame::NoFrame ); - setContentsMargins( 0, 0, 0, 0 ); - -- setFlow(QListView::LeftToRight);// -+ setFlow(QListView::LeftToRight); - setSelectionMode( QAbstractItemView::NoSelection ); - setDragDropMode( QAbstractItemView::NoDragDrop ); - setAcceptDrops( false ); --// setVisible( false); - - setItemDelegate( new ProgressTreeDelegate( this ) ); - -@@ -34,13 +33,11 @@ ProgressTreeView::ProgressTreeView( QWidget* parent ) - plt.setColor( QPalette::Base, - Calamares::Branding::instance()->styleString( Calamares::Branding::SidebarBackground ) ); - setPalette( plt ); --// connect(parent, SIGNAL(currentStepChanged(int)), this, SLOT(updateVisibility(int))); - connect( Calamares::ViewManager::instance(), - &Calamares::ViewManager::currentStepChanged, - this, - &ProgressTreeView::updateVisibility, - Qt::UniqueConnection ); --// connect(viewManager, &ViewManager::currentStepChanged, this, &ProgressTreeView::updateVisibility); - } - - -@@ -74,6 +71,5 @@ ProgressTreeView::update() - void - ProgressTreeView::updateVisibility(int currentStep) - { -- // 在第一个步骤隐藏,其他步骤显示 - this->setVisible(currentStep > 0); - } --- -2.46.0 - ++ cDebug() << "-------------------------------------------当前系统语言:" << languageString; ++ cDebug() << "-------------------------------------------当前系统地区:" << countryString; ++ if(contains(baseSetting1,stepString)){ ++ return "BaseSetting"; ++ } ++ if(contains(userSetting1,stepString)){ ++ return "UserSetting"; ++ } ++ if(contains(installSteps1,stepString)){ ++ return "InstallSetting"; ++ } ++ if(contains(baseSetting2,stepString) && countryString=="China"){ ++ return "基础设置"; ++ } ++ if(contains(userSetting2,stepString) && countryString=="China"){ ++ return "用户设置"; ++ } ++ if(contains(installSteps2,stepString) && countryString=="China"){ ++ return "安装设置"; ++ } ++ if (contains(baseSetting3, stepString) && countryString=="Taiwan") { ++ return "基礎設定"; ++ } ++ if (contains(userSetting3, stepString) && countryString=="Taiwan"){ ++ return "使用者設定"; ++ } ++ if (contains(installSteps3, stepString) && countryString=="Taiwan") { ++ return "安裝設定"; ++ } ++ return 0; ++} ++static int getTypeOfStep(int val){ ++ if(val<=1){ ++ return 1; ++ } ++ else if(val<=3){ ++ return 2; ++ } ++ else if(val<=8){ ++ return 3; ++ } ++ else{ ++ return 0; ++ } ++} ++static bool isVisable(const QString& stepString){ ++ std::vector installSteps = {"鍵盤", "軟體包", "總覽", "安裝", "完成", ++ "Keyboard","Packages","Summary","Install","Finish", ++ "键盘","桌面","摘要","安装","结束"}; ++ return !contains(installSteps, stepString); ++} ++static void ++paintViewStep( QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index ) ++{ ++ QRect textRect = option.rect.adjusted( item_margin, item_margin, -item_margin, -item_margin ); ++ QFont font = qApp->font(); ++ font.setPointSize( item_fontsize() ); ++ font.setBold( false ); ++ painter->setFont( font ); ++ ++ int CurrentTypeOfStep = getTypeOfStep(index.data( Calamares::ViewManager::ProgressTreeItemCurrentIndex ).toInt()); ++ int TypeOfStep = getTypeOfStep(index.row()); ++ if ( CurrentTypeOfStep == TypeOfStep ) ++ { ++ painter->setPen( Calamares::Branding::instance()->styleString( Calamares::Branding::SidebarTextCurrent ) ); ++ QString textHighlight ++ = Calamares::Branding::instance()->styleString( Calamares::Branding::SidebarBackgroundCurrent ); ++ if ( textHighlight.isEmpty() ) ++ { ++ painter->setBrush( CalamaresApplication::instance()->mainWindow()->palette().window() ); ++ } ++ else ++ { ++ painter->setBrush( QColor( textHighlight ) ); ++ } ++ } ++ ++ // Draw the text at least once. If it doesn't fit, then shrink the font ++ // being used by 1 pt on each iteration, up to a maximum of maximumShrink ++ // times. On each loop, we'll have to blank out the rectangle again, so this ++ // is an expensive (in terms of drawing operations) thing to do. ++ // ++ // (The loop uses <= because the counter is incremented at the start). ++ static constexpr int const maximumShrink = 4; ++ int shrinkSteps = 0; ++ do ++ { ++ ++ shrinkSteps++; ++ ++ QRectF boundingBox; ++ cDebug() << "index.data().toString()" << index.data().toString(); ++ QString text; ++ if(index.data().toString()=="欢迎" || index.data().toString()=="Welcome"||!isVisable(index.data().toString())){ ++ text = ""; ++ }else{ ++ text = getTypeOfStep(index.data().toString()); ++ painter->fillRect( option.rect, painter->brush().color() ); ++ } ++ painter->drawText( ++ textRect, Qt::AlignHCenter | Qt::AlignVCenter | Qt::TextSingleLine, text, &boundingBox ); ++ ++ // The extra check here is to avoid the changing-font-size if we're not going to use ++ // it in the next iteration of the loop anyway. ++ if ( ( shrinkSteps <= maximumShrink ) && ( boundingBox.width() > textRect.width() ) ) ++ { ++ font.setPointSize( item_fontsize() ); ++ painter->setFont( font ); ++ } ++ else ++ { ++ break; // It fits ++ } ++ } while ( shrinkSteps <= maximumShrink ); ++} ++ ++QSize ++ProgressTreeDelegate::sizeHint( const QStyleOptionViewItem& option, const QModelIndex& index ) const ++{ ++ if ( !index.isValid() ) ++ { ++ return option.rect.size(); ++ } ++ ++ QFont font = qApp->font(); ++ cDebug() << "ProgressTreeDelegate::sizeHint"; ++ ++ font.setPointSize( item_fontsize() ); ++ QFontMetrics fm( font ); ++ int height = fm.height(); ++ height += 2 * item_margin; ++ if(index.data().toString()=="欢迎" || index.data().toString()=="Welcome"||!isVisable(index.data().toString())){ ++ return QSize( 0, 0 ); ++ }else{ ++ return QSize( (Calamares::windowMinimumWidth*0.9)/3, height*2 ); ++ } ++// return QSize( option.rect.width(), height ); ++ ++} ++ ++void ++ProgressTreeDelegate::paint( QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index ) const ++{ ++ cDebug() << "ProgressTreeDelegate::paint----------"; ++ QStyleOptionViewItem opt = option; ++ ++ painter->save(); ++ ++ initStyleOption( &opt, index ); ++ opt.text.clear(); ++ ++ painter->setBrush( ++ QColor( Calamares::Branding::instance()->styleString( Calamares::Branding::SidebarBackground ) ) ); ++ painter->setPen( QColor( Calamares::Branding::instance()->styleString( Calamares::Branding::SidebarText ) ) ); ++ if(index.data().toString()=="欢迎" || index.data().toString()=="Welcome"){ ++ cDebug() << "ProgressTreeDelegate::欢迎Welcome--------Nopaint----------"; ++ }else{ ++ paintViewStep( painter, opt, index ); ++ } ++ //paintViewStep( painter, opt, index ); ++ ++ painter->restore(); ++} +diff --git a/src/calamares/progresstree/ProgressTreeDelegate.h b/src/calamares/progresstree/ProgressTreeDelegate.h +index d5a5abc..af4fef9 100644 +--- a/src/calamares/progresstree/ProgressTreeDelegate.h ++++ b/src/calamares/progresstree/ProgressTreeDelegate.h +@@ -1,31 +1,31 @@ +-/* === This file is part of Calamares - === +- * +- * SPDX-FileCopyrightText: 2014-2015 Teo Mrnjavac +- * SPDX-FileCopyrightText: 2019 Adriaan de Groot +- * SPDX-License-Identifier: GPL-3.0-or-later +- * +- * Calamares is Free Software: see the License-Identifier above. +- * +- */ +- +-#ifndef PROGRESSTREEDELEGATE_H +-#define PROGRESSTREEDELEGATE_H +- +-#include +- +-/** +- * @brief The ProgressTreeDelegate class customizes the look and feel of the +- * ProgressTreeView elements. +- * @see ProgressTreeView +- */ +-class ProgressTreeDelegate : public QStyledItemDelegate +-{ +-public: +- using QStyledItemDelegate::QStyledItemDelegate; +- +-protected: +- QSize sizeHint( const QStyleOptionViewItem& option, const QModelIndex& index ) const override; +- void paint( QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index ) const override; +-}; +- +-#endif // PROGRESSTREEDELEGATE_H ++/* === This file is part of Calamares - === ++ * ++ * SPDX-FileCopyrightText: 2014-2015 Teo Mrnjavac ++ * SPDX-FileCopyrightText: 2019 Adriaan de Groot ++ * SPDX-License-Identifier: GPL-3.0-or-later ++ * ++ * Calamares is Free Software: see the License-Identifier above. ++ * ++ */ ++ ++#ifndef PROGRESSTREEDELEGATE_H ++#define PROGRESSTREEDELEGATE_H ++ ++#include ++ ++/** ++ * @brief The ProgressTreeDelegate class customizes the look and feel of the ++ * ProgressTreeView elements. ++ * @see ProgressTreeView ++ */ ++class ProgressTreeDelegate : public QStyledItemDelegate ++{ ++public: ++ using QStyledItemDelegate::QStyledItemDelegate; ++ ++protected: ++ QSize sizeHint( const QStyleOptionViewItem& option, const QModelIndex& index ) const override; ++ void paint( QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index ) const override; ++}; ++ ++#endif // PROGRESSTREEDELEGATE_H +diff --git a/src/calamares/progresstree/ProgressTreeView.cpp b/src/calamares/progresstree/ProgressTreeView.cpp +index 9d49ea2..29ee7ee 100644 +--- a/src/calamares/progresstree/ProgressTreeView.cpp ++++ b/src/calamares/progresstree/ProgressTreeView.cpp +@@ -1,61 +1,81 @@ +-/* === This file is part of Calamares - === +- * +- * SPDX-FileCopyrightText: 2014 Teo Mrnjavac +- * SPDX-License-Identifier: GPL-3.0-or-later +- * +- * Calamares is Free Software: see the License-Identifier above. +- * +- */ +- +-#include "ProgressTreeView.h" +- +-#include "ProgressTreeDelegate.h" +- +-#include "Branding.h" +-#include "ViewManager.h" +- +-ProgressTreeView::ProgressTreeView( QWidget* parent ) +- : QListView( parent ) +-{ +- this->setObjectName( "sidebarMenuApp" ); +- setFrameShape( QFrame::NoFrame ); +- setContentsMargins( 0, 0, 0, 0 ); +- +- setSelectionMode( QAbstractItemView::NoSelection ); +- setDragDropMode( QAbstractItemView::NoDragDrop ); +- setAcceptDrops( false ); +- +- setItemDelegate( new ProgressTreeDelegate( this ) ); +- +- QPalette plt = palette(); +- plt.setColor( QPalette::Base, +- Calamares::Branding::instance()->styleString( Calamares::Branding::SidebarBackground ) ); +- setPalette( plt ); +-} +- +- +-ProgressTreeView::~ProgressTreeView() {} +- +- +-void +-ProgressTreeView::setModel( QAbstractItemModel* model ) +-{ +- if ( ProgressTreeView::model() ) +- { +- return; +- } +- +- QListView::setModel( model ); +- +- connect( Calamares::ViewManager::instance(), +- &Calamares::ViewManager::currentStepChanged, +- this, +- &ProgressTreeView::update, +- Qt::UniqueConnection ); +-} +- +-void +-ProgressTreeView::update() +-{ +- viewport()->update(); +-} ++/* === This file is part of Calamares - === ++ * ++ * SPDX-FileCopyrightText: 2014 Teo Mrnjavac ++ * SPDX-License-Identifier: GPL-3.0-or-later ++ * ++ * Calamares is Free Software: see the License-Identifier above. ++ * ++ */ ++ ++#include "ProgressTreeView.h" ++ ++#include "ProgressTreeDelegate.h" ++ ++#include "Branding.h" ++#include "ViewManager.h" ++#include "utils/Logger.h" ++ ++ProgressTreeView::ProgressTreeView( QWidget* parent ) ++ : QListView( parent ) ++{ ++ this->setObjectName( "sidebarMenuApp" ); ++ setFrameShape( QFrame::NoFrame ); ++ setContentsMargins( 0, 0, 0, 0 ); ++ ++ setFlow(QListView::LeftToRight);// ++ setSelectionMode( QAbstractItemView::NoSelection ); ++ setDragDropMode( QAbstractItemView::NoDragDrop ); ++ setAcceptDrops( false ); ++// setVisible( false); ++ ++ setItemDelegate( new ProgressTreeDelegate( this ) ); ++ ++ QPalette plt = palette(); ++ plt.setColor( QPalette::Base, ++ Calamares::Branding::instance()->styleString( Calamares::Branding::SidebarBackground ) ); ++ setPalette( plt ); ++// connect(parent, SIGNAL(currentStepChanged(int)), this, SLOT(updateVisibility(int))); ++ connect( Calamares::ViewManager::instance(), ++ &Calamares::ViewManager::currentStepChanged, ++ this, ++ &ProgressTreeView::updateVisibility, ++ Qt::UniqueConnection ); ++// connect(viewManager, &ViewManager::currentStepChanged, this, &ProgressTreeView::updateVisibility); ++} ++ ++ ++ProgressTreeView::~ProgressTreeView() {} ++ ++ ++ ++void ++ProgressTreeView::setModel( QAbstractItemModel* model ) ++{ ++ if ( ProgressTreeView::model() ) ++ { ++ return; ++ } ++ ++ QListView::setModel( model ); ++ ++ connect( Calamares::ViewManager::instance(), ++ &Calamares::ViewManager::currentStepChanged, ++ this, ++ &ProgressTreeView::update, ++ Qt::UniqueConnection ); ++} ++ ++void ++ProgressTreeView::update() ++{ ++ cDebug() << "update ---------------------"; ++ viewport()->update(); ++} ++ ++void ++ProgressTreeView::updateVisibility(int currentStep) ++{ ++ cDebug() << "int currentStep ------------------ " << currentStep; ++ // 在第一个步骤隐藏,其他步骤显示 ++ this->setVisible(currentStep > 0); ++} +diff --git a/src/calamares/progresstree/ProgressTreeView.h b/src/calamares/progresstree/ProgressTreeView.h +index d845cc7..b02b9ce 100644 +--- a/src/calamares/progresstree/ProgressTreeView.h ++++ b/src/calamares/progresstree/ProgressTreeView.h +@@ -1,39 +1,41 @@ +-/* === This file is part of Calamares - === +- * +- * SPDX-FileCopyrightText: 2014 Teo Mrnjavac +- * SPDX-FileCopyrightText: 2017 Adriaan de Groot +- * SPDX-License-Identifier: GPL-3.0-or-later +- * +- * Calamares is Free Software: see the License-Identifier above. +- * +- */ +- +-#ifndef PROGRESSTREEVIEW_H +-#define PROGRESSTREEVIEW_H +- +-#include +- +-/** +- * @brief Displays progress through the list of (visible) steps +- * +- * The ProgressTreeView class is a modified QListView which displays the +- * available view steps and the user's progress through them. +- * Since Calamares doesn't support "sub steps", it isn't really a tree. +- */ +-class ProgressTreeView : public QListView +-{ +- Q_OBJECT +-public: +- explicit ProgressTreeView( QWidget* parent = nullptr ); +- ~ProgressTreeView() override; +- +- /** +- * @brief setModel assigns a model to this view. +- */ +- void setModel( QAbstractItemModel* model ) override; +- +-public Q_SLOTS: +- void update(); +-}; +- +-#endif // PROGRESSTREEVIEW_H ++/* === This file is part of Calamares - === ++ * ++ * SPDX-FileCopyrightText: 2014 Teo Mrnjavac ++ * SPDX-FileCopyrightText: 2017 Adriaan de Groot ++ * SPDX-License-Identifier: GPL-3.0-or-later ++ * ++ * Calamares is Free Software: see the License-Identifier above. ++ * ++ */ ++ ++#ifndef PROGRESSTREEVIEW_H ++#define PROGRESSTREEVIEW_H ++ ++#include ++#include "utils/Logger.h" ++ ++/** ++ * @brief Displays progress through the list of (visible) steps ++ * ++ * The ProgressTreeView class is a modified QListView which displays the ++ * available view steps and the user's progress through them. ++ * Since Calamares doesn't support "sub steps", it isn't really a tree. ++ */ ++class ProgressTreeView : public QListView ++{ ++ Q_OBJECT ++public: ++ explicit ProgressTreeView( QWidget* parent = nullptr ); ++ ~ProgressTreeView() override; ++ ++ /** ++ * @brief setModel assigns a model to this view. ++ */ ++ void setModel( QAbstractItemModel* model ) override; ++ ++public Q_SLOTS: ++ void update(); ++ void updateVisibility(int currentStep); ++}; ++ ++#endif // PROGRESSTREEVIEW_H +-- +2.43.0 + diff --git a/0009-qss.patch b/0009-qss.patch index 2f91bb3..4078c5d 100644 --- a/0009-qss.patch +++ b/0009-qss.patch @@ -1,14 +1,17 @@ -From e68872d6412297d49e3824136ba19521f643a77c Mon Sep 17 00:00:00 2001 -From: lizixin <2271170409@qq.com> -Date: Fri, 27 Dec 2024 12:28:51 +0800 -Subject: [PATCH 9/9] qss patch +From 0c7571051e9bf0a051bb44f40cffe85bc44c1791 Mon Sep 17 00:00:00 2001 +From: cui-gaoleng <562344211@qq.com> +Date: Sat, 9 Nov 2024 11:38:16 +0800 +Subject: [PATCH] =?UTF-8?q?qss=E6=96=87=E4=BB=B6=E6=8F=90=E4=BA=A4?= +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit --- src/branding/default/stylesheet.qss | 67 +++++++++++++++++++++++++++-- 1 file changed, 64 insertions(+), 3 deletions(-) diff --git a/src/branding/default/stylesheet.qss b/src/branding/default/stylesheet.qss -index 5c3673847..85498f600 100644 +index 5c36738..85498f6 100644 --- a/src/branding/default/stylesheet.qss +++ b/src/branding/default/stylesheet.qss @@ -34,10 +34,71 @@ The examples are not exhaustive. @@ -87,5 +90,5 @@ index 5c3673847..85498f600 100644 * * The main application window has the sidebar, which in turn -- -2.46.0 +2.43.0 diff --git a/calamares.spec b/calamares.spec index 68ecff6..6c36659 100644 --- a/calamares.spec +++ b/calamares.spec @@ -2,7 +2,7 @@ Name: calamares Version: 3.3.7 -Release: 2 +Release: 1 Summary: Installer from a live CD/DVD/USB to disk License: GPL-3.0-or-later @@ -335,9 +335,5 @@ cd %{_builddir} || exit 0 rm -rf %{buildroot} %changelog -* Fri Dec 27 2024 lizixin - 3.3.7-2 -- 1230 patch update - - * Wed Oct 9 2024 Li Ping - 3.3.7-1 - Initial package -- Gitee From 7e36685afa537087bfb8937356ef61befae090df Mon Sep 17 00:00:00 2001 From: lizixin <2271170409@qq.com> Date: Fri, 27 Dec 2024 18:54:41 +0800 Subject: [PATCH 3/5] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E6=8F=92=E4=BB=B6?= =?UTF-8?q?=E5=88=B01230=E7=89=88=E6=9C=AC=5F1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 0001-branding-patch.patch | 6 +- 0006-modules-file.patch | 718 --- 0010-cDebugDelect.patch | 400 ++ 0011-fix-87-position-and-translate.patch | 230 + 0012-replace-icon.patch | 29 + 0013-1230.patch | 5496 ++++++++++++++++++++++ calamares.spec | 19 +- openEuler-icon.png | Bin 0 -> 12843 bytes password-hide.png | Bin 0 -> 269 bytes 9 files changed, 6172 insertions(+), 726 deletions(-) create mode 100644 0010-cDebugDelect.patch create mode 100644 0011-fix-87-position-and-translate.patch create mode 100644 0012-replace-icon.patch create mode 100644 0013-1230.patch create mode 100644 openEuler-icon.png create mode 100644 password-hide.png diff --git a/0001-branding-patch.patch b/0001-branding-patch.patch index 52f9719..f8d2e8c 100644 --- a/0001-branding-patch.patch +++ b/0001-branding-patch.patch @@ -122,7 +122,7 @@ index f4c50e629..f91d520cd 100644 - width: 200; height: 200 + id: background1 + source: "Slide1.png" -+ width: 980; height: 980 ++ width: 800; height: 800 fillMode: Image.PreserveAspectFit - anchors.centerIn: parent - } @@ -148,7 +148,7 @@ index f4c50e629..f91d520cd 100644 + Image { + id: background2 + source: "Slide2.png" -+ width: 980; height: 980 ++ width: 800; height: 800 + fillMode: Image.PreserveAspectFit + anchors.horizontalCenter:parent.horizontalCenter + y:parent.height / 2 - height / 2 -25 @@ -161,7 +161,7 @@ index f4c50e629..f91d520cd 100644 + Image { + id: background3 + source: "Slide3.png" -+ width: 980; height: 980 ++ width: 800; height: 800 + fillMode: Image.PreserveAspectFit + anchors.horizontalCenter:parent.horizontalCenter + y:parent.height / 2 - height / 2 -25 diff --git a/0006-modules-file.patch b/0006-modules-file.patch index d7473ea..a03be44 100644 --- a/0006-modules-file.patch +++ b/0006-modules-file.patch @@ -36,7 +36,6 @@ Subject: [PATCH 4/4] modules Commit without .png, .svg, and .svgz files src/modules/unpackfs/main.py | 82 +- src/modules/unpackfs/unpackfs.conf | 12 +- src/modules/users/UsersPage.cpp | 2 +- - src/modules/users/page_usersetup.bak.ui | 710 ++++++++++++++++++ src/modules/users/page_usersetup.ui | 158 ++-- src/modules/users/users.conf | 2 +- src/modules/welcome/Config.cpp | 3 +- @@ -50,7 +49,6 @@ Subject: [PATCH 4/4] modules Commit without .png, .svg, and .svgz files mode change 100755 => 100644 src/modules/fstab/main.py mode change 100755 => 100644 src/modules/initramfscfg/encrypt_hook mode change 100755 => 100644 src/modules/initramfscfg/encrypt_hook_nokey - create mode 100644 src/modules/users/page_usersetup.bak.ui diff --git a/src/modules/bootloader/bootloader.conf b/src/modules/bootloader/bootloader.conf @@ -1324,722 +1322,6 @@ index 1ecc0eb..72fb3e0 100644 // Connect signals and slots ui->textBoxUserPassword->setText( config->userPassword() ); connect( ui->textBoxUserPassword, &QLineEdit::textChanged, config, &Config::setUserPassword ); -diff --git a/src/modules/users/page_usersetup.bak.ui b/src/modules/users/page_usersetup.bak.ui -new file mode 100644 -index 0000000..f808c89 ---- /dev/null -+++ b/src/modules/users/page_usersetup.bak.ui -@@ -0,0 +1,710 @@ -+ -+ -+ -+SPDX-FileCopyrightText: 2014 Teo Mrnjavac <teo@kde.org> -+SPDX-License-Identifier: GPL-3.0-or-later -+ -+ Page_UserSetup -+ -+ -+ -+ 0 -+ 0 -+ 862 -+ 683 -+ -+ -+ -+ Form -+ -+ -+ -+ -+ -+ Qt::Orientation::Vertical -+ -+ -+ QSizePolicy::Policy::Fixed -+ -+ -+ -+ 20 -+ 6 -+ -+ -+ -+ -+ -+ -+ -+ What is your name? -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ 200 -+ 0 -+ -+ -+ -+ Your Full Name -+ -+ -+ -+ -+ -+ -+ -+ 0 -+ 0 -+ -+ -+ -+ -+ 24 -+ 24 -+ -+ -+ -+ -+ 24 -+ 24 -+ -+ -+ -+ -+ -+ -+ true -+ -+ -+ -+ -+ -+ -+ -+ 1 -+ 0 -+ -+ -+ -+ -+ -+ -+ true -+ -+ -+ -+ -+ -+ -+ -+ -+ Qt::Orientation::Vertical -+ -+ -+ QSizePolicy::Policy::Fixed -+ -+ -+ -+ 20 -+ 20 -+ -+ -+ -+ -+ -+ -+ -+ What name do you want to use to log in? -+ -+ -+ false -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ 0 -+ 0 -+ -+ -+ -+ -+ 200 -+ 0 -+ -+ -+ -+ login -+ -+ -+ -+ -+ -+ -+ -+ 0 -+ 0 -+ -+ -+ -+ -+ 24 -+ 24 -+ -+ -+ -+ -+ 24 -+ 24 -+ -+ -+ -+ true -+ -+ -+ -+ -+ -+ -+ -+ 1 -+ 0 -+ -+ -+ -+ -+ 200 -+ 0 -+ -+ -+ -+ -+ -+ -+ Qt::AlignmentFlag::AlignVCenter -+ -+ -+ true -+ -+ -+ -+ -+ -+ -+ -+ -+ Qt::Orientation::Vertical -+ -+ -+ QSizePolicy::Policy::Fixed -+ -+ -+ -+ 20 -+ 20 -+ -+ -+ -+ -+ -+ -+ -+ What is the name of this computer? -+ -+ -+ false -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ 0 -+ 0 -+ -+ -+ -+ -+ 200 -+ 0 -+ -+ -+ -+ <small>This name will be used if you make the computer visible to others on a network.</small> -+ -+ -+ Computer Name -+ -+ -+ -+ -+ -+ -+ -+ 0 -+ 0 -+ -+ -+ -+ -+ 24 -+ 24 -+ -+ -+ -+ -+ 24 -+ 24 -+ -+ -+ -+ true -+ -+ -+ -+ -+ -+ -+ -+ 1 -+ 0 -+ -+ -+ -+ -+ 200 -+ 0 -+ -+ -+ -+ -+ -+ -+ Qt::AlignmentFlag::AlignVCenter -+ -+ -+ true -+ -+ -+ -+ -+ -+ -+ -+ -+ Qt::Orientation::Vertical -+ -+ -+ QSizePolicy::Policy::Fixed -+ -+ -+ -+ 20 -+ 20 -+ -+ -+ -+ -+ -+ -+ -+ Choose a password to keep your account safe. -+ -+ -+ false -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ 0 -+ 0 -+ -+ -+ -+ -+ 200 -+ 0 -+ -+ -+ -+ <small>Enter the same password twice, so that it can be checked for typing errors. A good password will contain a mixture of letters, numbers and punctuation, should be at least eight characters long, and should be changed at regular intervals.</small> -+ -+ -+ QLineEdit::EchoMode::Password -+ -+ -+ Password -+ -+ -+ -+ -+ -+ -+ -+ 0 -+ 0 -+ -+ -+ -+ -+ 200 -+ 0 -+ -+ -+ -+ <small>Enter the same password twice, so that it can be checked for typing errors. A good password will contain a mixture of letters, numbers and punctuation, should be at least eight characters long, and should be changed at regular intervals.</small> -+ -+ -+ QLineEdit::EchoMode::Password -+ -+ -+ Repeat Password -+ -+ -+ -+ -+ -+ -+ -+ 0 -+ 0 -+ -+ -+ -+ -+ 24 -+ 24 -+ -+ -+ -+ -+ 24 -+ 24 -+ -+ -+ -+ true -+ -+ -+ -+ -+ -+ -+ -+ 1 -+ 0 -+ -+ -+ -+ -+ 100 -+ 0 -+ -+ -+ -+ -+ -+ -+ Qt::AlignmentFlag::AlignVCenter -+ -+ -+ true -+ -+ -+ -+ -+ -+ -+ -+ -+ Qt::Orientation::Vertical -+ -+ -+ QSizePolicy::Policy::Fixed -+ -+ -+ -+ 20 -+ 20 -+ -+ -+ -+ -+ -+ -+ -+ When this box is checked, password-strength checking is done and you will not be able to use a weak password. -+ -+ -+ Require strong passwords. -+ -+ -+ -+ -+ -+ -+ Log in automatically without asking for the password. -+ -+ -+ -+ -+ -+ -+ Use the same password for the administrator account. -+ -+ -+ -+ -+ -+ -+ Qt::Orientation::Vertical -+ -+ -+ QSizePolicy::Policy::Fixed -+ -+ -+ -+ 20 -+ 20 -+ -+ -+ -+ -+ -+ -+ -+ Choose a password for the administrator account. -+ -+ -+ false -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ 0 -+ 0 -+ -+ -+ -+ -+ 200 -+ 0 -+ -+ -+ -+ <small>Enter the same password twice, so that it can be checked for typing errors.</small> -+ -+ -+ QLineEdit::EchoMode::Password -+ -+ -+ Password -+ -+ -+ -+ -+ -+ -+ -+ 0 -+ 0 -+ -+ -+ -+ -+ 200 -+ 0 -+ -+ -+ -+ <small>Enter the same password twice, so that it can be checked for typing errors.</small> -+ -+ -+ QLineEdit::EchoMode::Password -+ -+ -+ Repeat Password -+ -+ -+ -+ -+ -+ -+ -+ 0 -+ 0 -+ -+ -+ -+ -+ 24 -+ 24 -+ -+ -+ -+ -+ 24 -+ 24 -+ -+ -+ -+ true -+ -+ -+ -+ -+ -+ -+ -+ 1 -+ 0 -+ -+ -+ -+ -+ 100 -+ 0 -+ -+ -+ -+ -+ -+ -+ Qt::AlignmentFlag::AlignVCenter -+ -+ -+ true -+ -+ -+ -+ -+ -+ -+ -+ -+ Qt::Orientation::Vertical -+ -+ -+ QSizePolicy::Policy::Fixed -+ -+ -+ -+ 20 -+ 6 -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ Use Active Directory -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ Domain: -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ Domain Administrator: -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ Password: -+ -+ -+ -+ -+ -+ -+ QLineEdit::EchoMode::Password -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ IP Address (optional): -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ Qt::Orientation::Vertical -+ -+ -+ -+ 20 -+ 1 -+ -+ -+ -+ -+ -+ -+ -+ -+ diff --git a/src/modules/users/page_usersetup.ui b/src/modules/users/page_usersetup.ui index 6e6e542..2a5ccd2 100644 --- a/src/modules/users/page_usersetup.ui diff --git a/0010-cDebugDelect.patch b/0010-cDebugDelect.patch new file mode 100644 index 0000000..c5f63fe --- /dev/null +++ b/0010-cDebugDelect.patch @@ -0,0 +1,400 @@ +From 662c8f4cdf8838d44f4a5b8be5455f840c0e314c Mon Sep 17 00:00:00 2001 +From: cui-gaoleng <562344211@qq.com> +Date: Tue, 19 Nov 2024 13:43:48 +0800 +Subject: [PATCH] =?UTF-8?q?=E8=B0=83=E8=AF=95=E4=BF=A1=E6=81=AF=E5=92=8C?= + =?UTF-8?q?=E5=B7=B2=E6=B3=A8=E9=87=8A=E4=BB=A3=E7=A0=81=E5=88=A0=E9=99=A4?= +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +--- + src/calamares/CalamaresWindow.cpp | 3 - + .../progresstree/ProgressTreeDelegate.cpp | 9 - + .../progresstree/ProgressTreeView.cpp | 2 - + src/libcalamares/CalamaresAbout.cpp | 1 - + .../modulesystem/CppJobModule.cpp | 4 - + src/modules/keyboard/KeyboardPage.cpp | 19 - + src/modules/keyboard/KeyboardPage.ui | 3 - + src/modules/locale/LocalePage.cpp | 20 +- + .../packagechooser/packagechooser.conf | 16 +- + src/modules/welcome/WelcomePage.cpp | 74 +- + 11 files changed, 7 insertions(+), 862 deletions(-) + +diff --git a/src/calamares/CalamaresWindow.cpp b/src/calamares/CalamaresWindow.cpp +index 4721cb9..4917f75 100644 +--- a/src/calamares/CalamaresWindow.cpp ++++ b/src/calamares/CalamaresWindow.cpp +@@ -440,7 +440,6 @@ CalamaresWindow::CalamaresWindow( QWidget* parent ) + int h = qBound( minimumSize.height(), windowDimensionToPixels( brandingSizes.second ), availableSize.height() ); + + cDebug() << Logger::SubEntry << "Proposed window size:" << w << h; +- //resize( availableSize.width(), availableSize.height() );//通用桌面大小作为窗口大小 + resize( w, h );//通用桌面大小作为窗口大小 + QWidget* baseWidget = this; + if ( !( branding->imagePath( ImageEntry::ProductWallpaper ).isEmpty() ) ) +@@ -519,8 +518,6 @@ CalamaresWindow::CalamaresWindow( QWidget* parent ) + Calamares::unmarginLayout( contentsLayout ); + baseWidget->setLayout( mainLayout ); + setStyleSheet( Calamares::Branding::instance()->stylesheet() ); +- cDebug()<<"<---------------------------WindowWindowSize-------------------------------------->"<size(); +- cDebug()<< "<--------------------sideBox->size()-------------------->"<< sideBox->size(); + this->setFixedSize(this->size()); + } + +diff --git a/src/calamares/progresstree/ProgressTreeDelegate.cpp b/src/calamares/progresstree/ProgressTreeDelegate.cpp +index 6d5f865..7541356 100644 +--- a/src/calamares/progresstree/ProgressTreeDelegate.cpp ++++ b/src/calamares/progresstree/ProgressTreeDelegate.cpp +@@ -53,9 +53,6 @@ static QString getTypeOfStep(const QString& stepString){ + + // 将地区枚举值转换为字符串 + QString countryString = QLocale::countryToString(country); +- // 输出当前语言 +- cDebug() << "-------------------------------------------当前系统语言:" << languageString; +- cDebug() << "-------------------------------------------当前系统地区:" << countryString; + if(contains(baseSetting1,stepString)){ + return "BaseSetting"; + } +@@ -145,7 +142,6 @@ paintViewStep( QPainter* painter, const QStyleOptionViewItem& option, const QMod + shrinkSteps++; + + QRectF boundingBox; +- cDebug() << "index.data().toString()" << index.data().toString(); + QString text; + if(index.data().toString()=="欢迎" || index.data().toString()=="Welcome"||!isVisable(index.data().toString())){ + text = ""; +@@ -179,7 +175,6 @@ ProgressTreeDelegate::sizeHint( const QStyleOptionViewItem& option, const QModel + } + + QFont font = qApp->font(); +- cDebug() << "ProgressTreeDelegate::sizeHint"; + + font.setPointSize( item_fontsize() ); + QFontMetrics fm( font ); +@@ -190,14 +185,12 @@ ProgressTreeDelegate::sizeHint( const QStyleOptionViewItem& option, const QModel + }else{ + return QSize( (Calamares::windowMinimumWidth*0.9)/3, height*2 ); + } +-// return QSize( option.rect.width(), height ); + + } + + void + ProgressTreeDelegate::paint( QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index ) const + { +- cDebug() << "ProgressTreeDelegate::paint----------"; + QStyleOptionViewItem opt = option; + + painter->save(); +@@ -209,11 +202,9 @@ ProgressTreeDelegate::paint( QPainter* painter, const QStyleOptionViewItem& opti + QColor( Calamares::Branding::instance()->styleString( Calamares::Branding::SidebarBackground ) ) ); + painter->setPen( QColor( Calamares::Branding::instance()->styleString( Calamares::Branding::SidebarText ) ) ); + if(index.data().toString()=="欢迎" || index.data().toString()=="Welcome"){ +- cDebug() << "ProgressTreeDelegate::欢迎Welcome--------Nopaint----------"; + }else{ + paintViewStep( painter, opt, index ); + } +- //paintViewStep( painter, opt, index ); + + painter->restore(); + } +diff --git a/src/calamares/progresstree/ProgressTreeView.cpp b/src/calamares/progresstree/ProgressTreeView.cpp +index 29ee7ee..a9a15b8 100644 +--- a/src/calamares/progresstree/ProgressTreeView.cpp ++++ b/src/calamares/progresstree/ProgressTreeView.cpp +@@ -68,14 +68,12 @@ ProgressTreeView::setModel( QAbstractItemModel* model ) + void + ProgressTreeView::update() + { +- cDebug() << "update ---------------------"; + viewport()->update(); + } + + void + ProgressTreeView::updateVisibility(int currentStep) + { +- cDebug() << "int currentStep ------------------ " << currentStep; + // 在第一个步骤隐藏,其他步骤显示 + this->setVisible(currentStep > 0); + } + +diff --git a/src/libcalamares/CalamaresAbout.cpp b/src/libcalamares/CalamaresAbout.cpp +index 65a1b9d..595efc7 100644 +--- a/src/libcalamares/CalamaresAbout.cpp ++++ b/src/libcalamares/CalamaresAbout.cpp +@@ -65,7 +65,6 @@ Calamares::aboutString() + { + return substituteVersions( QCoreApplication::translate( "AboutData", s_header ) ) + aboutMaintainers() + + QCoreApplication::translate( "AboutData", s_footer ); +- // return aboutMaintainers()+ QCoreApplication::translate( "AboutData", s_footer ); + } + + const QString +diff --git a/src/libcalamaresui/modulesystem/CppJobModule.cpp b/src/libcalamaresui/modulesystem/CppJobModule.cpp +index c211006..b35a457 100644 +--- a/src/libcalamaresui/modulesystem/CppJobModule.cpp ++++ b/src/libcalamaresui/modulesystem/CppJobModule.cpp +@@ -53,10 +53,6 @@ CppJobModule::loadSelf() + cDebug() << "Could not load module:" << m_loader->errorString(); + return; + } +- // cDebug() << "CppJobModule loading self for instance" << instanceKey() +- // << "\nCppJobModule at address" << this +- // << "\nCalamares::PluginFactory at address" << pf +- // << "\nCppJob at address" << cppJob; + + cppJob->setModuleInstanceKey( instanceKey() ); + cppJob->setConfigurationMap( m_configurationMap ); +diff --git a/src/modules/keyboard/KeyboardPage.cpp b/src/modules/keyboard/KeyboardPage.cpp +index 3f06158..be60521 100644 +--- a/src/modules/keyboard/KeyboardPage.cpp ++++ b/src/modules/keyboard/KeyboardPage.cpp +@@ -48,9 +48,6 @@ KeyboardPage::KeyboardPage( Config* config, QWidget* parent ) + { + ui->setupUi( this ); + this->setContentsMargins(50,0,50,0); +- // Keyboard Preview +- // ui->KBPreviewLayout->addWidget( m_keyboardPreview ); +- + + { + auto* model = config->keyboardModels(); +@@ -93,27 +90,11 @@ KeyboardPage::KeyboardPage( Config* config, QWidget* parent ) + &QItemSelectionModel::currentChanged, + [ this ]( const QModelIndex& current ) + { m_config->keyboardLayouts()->setCurrentIndex( current.row() ); } ); +- // connect( config->keyboardLayouts(), +- // &KeyboardLayoutModel::currentIndexChanged, +- // [ this ]( int index ) +- // { +- // ui->layoutSelector->setCurrentIndex( m_config->keyboardLayouts()->index( index ) ); +- // m_keyboardPreview->setLayout( m_config->keyboardLayouts()->key( index ) ); +- // m_keyboardPreview->setVariant( +- // m_config->keyboardVariants()->key( m_config->keyboardVariants()->currentIndex() ) ); +- // } ); + + connect( ui->variantSelector->selectionModel(), + &QItemSelectionModel::currentChanged, + [ this ]( const QModelIndex& current ) + { m_config->keyboardVariants()->setCurrentIndex( current.row() ); } ); +- // connect( config->keyboardVariants(), +- // &KeyboardVariantsModel::currentIndexChanged, +- // [ this ]( int index ) +- // { +- // ui->variantSelector->setCurrentIndex( m_config->keyboardVariants()->index( index ) ); +- // m_keyboardPreview->setVariant( m_config->keyboardVariants()->key( index ) ); +- // } ); + + connect( ui->groupSelector, + QOverload< int >::of( &QComboBox::currentIndexChanged ), +diff --git a/src/modules/keyboard/KeyboardPage.ui b/src/modules/keyboard/KeyboardPage.ui +index 1d6afbf..70cfca3 100644 +--- a/src/modules/keyboard/KeyboardPage.ui ++++ b/src/modules/keyboard/KeyboardPage.ui +@@ -45,9 +45,6 @@ SPDX-License-Identifier: GPL-3.0-or-later + + + +- + + + +diff --git a/src/modules/locale/LocalePage.cpp b/src/modules/locale/LocalePage.cpp +index 0568067..ed50574 100644 +--- a/src/modules/locale/LocalePage.cpp ++++ b/src/modules/locale/LocalePage.cpp +@@ -32,13 +32,6 @@ LocalePage::LocalePage( Config* config, QWidget* parent ) + { + QBoxLayout* mainLayout = new QVBoxLayout; + mainLayout->setContentsMargins(50,0,50,0); +- //QBoxLayout* tzwLayout = new QHBoxLayout; +- //m_tzWidget = new TimeZoneWidget( m_config->zonesModel(), this ); +- //tzwLayout->addStretch(); +- //tzwLayout->addWidget( m_tzWidget ); +- //tzwLayout->addStretch(); +- // Adjust for margins and spacing in this page +- //m_tzWidget->setMinimumHeight( m_tzWidget->minimumHeight() + 12 ); // 2 * spacing + + QBoxLayout* zoneAndRegionLayout = new QVBoxLayout; + m_regionLabel = new QLabel( this ); +@@ -90,7 +83,7 @@ LocalePage::LocalePage( Config* config, QWidget* parent ) + m_formatsChangeButton->setSizePolicy( QSizePolicy::Preferred, QSizePolicy::Preferred ); + formatsLayout->addWidget( m_formatsChangeButton ); + formatsLayout->addSpacing(20); +- //mainLayout->addLayout( tzwLayout ); ++ + mainLayout->addStretch(); + mainLayout->addLayout( zoneAndRegionLayout ); + mainLayout->addStretch(); +@@ -100,7 +93,7 @@ LocalePage::LocalePage( Config* config, QWidget* parent ) + mainLayout->addSpacing(20); + mainLayout->addLayout( timezoneLayout ); + mainLayout->addStretch(); +- //setMinimumWidth( m_tzWidget->width() ); ++ + setLayout( mainLayout ); + + m_localeChangeButton->hide(); +@@ -114,20 +107,15 @@ LocalePage::LocalePage( Config* config, QWidget* parent ) + zones->setRegion( location->region() ); + m_regionCombo->setModel( regions ); + m_zoneCombo->setModel( zones ); +- //m_tzWidget->setCurrentLocation( location ); ++ + locationChanged( location ); // doesn't inform TZ widget + } + + connect( config, &Config::currentLCStatusChanged, m_formatsLabel, &QLabel::setText ); + connect( config, &Config::currentLanguageStatusChanged, m_localeLabel, &QLabel::setText ); + connect( config, &Config::currentZoneChanged, m_timezoneLabel , &QLabel::setText); +- //connect( config, &Config::currentLocationChanged, m_tzWidget, &TimeZoneWidget::setCurrentLocation ); ++ + connect( config, &Config::currentLocationChanged, this, &LocalePage::locationChanged ); +- // connect( m_tzWidget, +- // &TimeZoneWidget::locationChanged, +- // config, +- // QOverload< const Calamares::Locale::TimeZoneData* >::of( &Config::setCurrentLocation ) ); +- + connect( m_regionCombo, QOverload< int >::of( &QComboBox::currentIndexChanged ), this, &LocalePage::regionChanged ); + connect( m_zoneCombo, QOverload< int >::of( &QComboBox::currentIndexChanged ), this, &LocalePage::zoneChanged ); + +diff --git a/src/modules/packagechooser/packagechooser.conf b/src/modules/packagechooser/packagechooser.conf +index e7b9b00..aa048e2 100644 +--- a/src/modules/packagechooser/packagechooser.conf ++++ b/src/modules/packagechooser/packagechooser.conf +@@ -157,11 +157,7 @@ items: + description[nl]: "Kies eventueel een desktop-omgeving uit deze lijst. Als u geen desktop-omgeving wenst te gebruiken, kies er dan geen. In dat geval start het systeem straks op in tekst-modus en kunt u later alsnog een desktop-omgeving installeren." + description[zh]: "请选择一个桌面环境。如果您不想安装桌面环境也没关系,您可以稍后再为系统安装桌面环境。" + screenshot: ":/images/Minimal-Install.png" +- # - id: kde +- # packages: [ kde-frameworks, kde-plasma, kde-gear ] +- # name: Plasma Desktop +- # description: "KDE Plasma Desktop, simple by default, a clean work area for real-world usage which intends to stay out of your way. Plasma is powerful when needed, enabling the user to create the workflow that makes them more effective to complete their tasks." +- # screenshot: ":/images/Plasma.png" ++ + - id: gnome + packages: [ checkpolicy, code, xorg-*, dejavu-fonts, liberation-fonts, gnu-*-fonts, google-*-fonts, adwaita-icon-theme, atk, atkmm, at-spi2-atk, at-spi2-core, baobab, abattis-cantarell-fonts, cheese, clutter, clutter-gst3, clutter-gtk, cogl, dconf, dconf-editor, devhelp, eog, epiphany, evince, evolution-data-server, file-roller, folks, gcab, gcr, gdk-pixbuf2, gdm, gedit, geocode-glib, gfbgraph, gjs, glib2, glibmm24, glib-networking, gmime30, gnome-autoar, gnome-backgrounds, gnome-bluetooth, gnome-builder, gnome-calculator, gnome-calendar, gnome-characters, gnome-clocks, gnome-color-manager, gnome-contacts, gnome-control-center, gnome-desktop3, gnome-disk-utility, gnome-font-viewer, gnome-getting-started-docs, gnome-initial-setup, gnome-keyring, gnome-logs, gnome-menus, gnome-music, gnome-online-accounts, gnome-online-miners, gnome-photos, gnome-remote-desktop, gnome-screenshot, gnome-session, gnome-settings-daemon, gnome-shell, gnome-shell-extensions, gnome-software, gnome-system-monitor, gnome-terminal, gnome-tour, gnome-user-docs, gnome-user-share, gnome-video-effects, gnome-weather, gobject-introspection, gom, grilo, grilo-plugins, gsettings-desktop-schemas, gsound, gspell, gssdp, gtk3, gtk4, gtk-doc, gtkmm30, gtksourceview4, gtk-vnc2, gupnp, gupnp-av, gupnp-dlna, gvfs, json-glib, libchamplain, libdazzle, libgdata, libgee, libgnomekbd, libgsf, libgtop2, libgweather, libgxps, libhandy, libmediaart, libnma, libnotify, libpeas, librsvg2, libsecret, libsigc++20, libsoup, mm-common, mutter, nautilus, orca, pango, pangomm, libphodav, python3-pyatspi, python3-gobject, rest, rygel, simple-scan, sushi, sysprof, tepl, totem, totem-pl-parser, tracker3, tracker3-miners, vala, vte291, yelp, yelp-tools, yelp-xsl, zenity, devstation-config, ibus-libpinyin ] + name: DevStation +@@ -169,13 +165,3 @@ items: + description: GNU Networked Object Modeling Environment Desktop + description[zh]: Devstation系统桌面 + screenshot: ":/images/gnome.png" +- #- id: ukui +- # packages: [ ukui ] +- # name: UKUI +- # description: Linux Desktop +- # screenshot: ":/images/UKUI.png" +- # - id: calamares +- # appdata: ../io.calamares.calamares.appdata.xml +- # screenshot: ":/images/calamares.png" +- # - id: kate +- # appstream: org.kde.kwrite.desktop +diff --git a/src/modules/welcome/WelcomePage.cpp b/src/modules/welcome/WelcomePage.cpp +index 88f38c2..471187b 100644 +--- a/src/modules/welcome/WelcomePage.cpp ++++ b/src/modules/welcome/WelcomePage.cpp +@@ -91,21 +91,7 @@ WelcomePage::WelcomePage( Config* config, QWidget* parent ) + } + + void +-WelcomePage::init() +-{ +- //setup the url buttons +- // setupButton( WelcomePage::Button::Support, m_conf->supportUrl() ); +- // setupButton( WelcomePage::Button::KnownIssues, m_conf->knownIssuesUrl() ); +- // setupButton( WelcomePage::Button::ReleaseNotes, m_conf->releaseNotesUrl() ); +- // setupButton( WelcomePage::Button::Donate, m_conf->donateUrl() ); +- +- //language icon +- // auto icon = Calamares::Branding::instance()->image( m_conf->languageIcon(), QSize( 48, 48 ) ); +- // if ( !icon.isNull() ) +- // { +- // setLanguageIcon( icon ); +- // } +-} ++WelcomePage::init(){} + + void + WelcomePage::initLanguages() +@@ -125,57 +111,6 @@ WelcomePage::initLanguages() + &Config::setLocaleIndex ); + } + +-// void +-// WelcomePage::setupButton( Button role, const QString& url ) +-// { +-// QPushButton* button = nullptr; +-// Calamares::ImageType icon = Calamares::Information; +- +-// switch ( role ) +-// { +-// case Button::Donate: +-// button = ui->donateButton; +-// icon = Calamares::Donate; +-// break; +-// case Button::KnownIssues: +-// button = ui->knownIssuesButton; +-// icon = Calamares::Bugs; +-// break; +-// case Button::ReleaseNotes: +-// button = ui->releaseNotesButton; +-// icon = Calamares::Release; +-// break; +-// case Button::Support: +-// button = ui->supportButton; +-// icon = Calamares::Help; +-// break; +-// } +-// if ( !button ) +-// { +-// cWarning() << "Unknown button role" << smash( role ); +-// return; +-// } +- +-// if ( url.isEmpty() ) +-// { +-// button->hide(); +-// return; +-// } +- +-// QUrl u( url ); +-// if ( u.isValid() ) +-// { +-// auto size = 2 * QSize( Calamares::defaultFontHeight(), Calamares::defaultFontHeight() ); +-// button->setIcon( Calamares::defaultPixmap( icon, Calamares::Original, size ) ); +-// connect( button, &QPushButton::clicked, [ u ]() { QDesktopServices::openUrl( u ); } ); +-// } +-// else +-// { +-// cWarning() << "Welcome button" << smash( role ) << "URL" << url << "is invalid."; +-// button->hide(); +-// } +-// } +- + void + WelcomePage::focusInEvent( QFocusEvent* e ) + { +@@ -201,11 +136,6 @@ WelcomePage::externallySelectedLanguage( int row ) + } + } + +-// void +-// WelcomePage::setLanguageIcon( QPixmap i ) +-// { +-// ui->languageIcon->setPixmap( i ); +-// } + + void + WelcomePage::retranslate() +@@ -214,8 +144,6 @@ WelcomePage::retranslate() + + ui->mainText->setText( message.arg( Calamares::Branding::instance()->versionedName() ) ); + ui->retranslateUi( this ); +- // ui->supportButton->setText( +- // tr( "%1 Support", "@action" ).arg( Calamares::Branding::instance()->shortProductName() ) ); + } + + void + diff --git a/0011-fix-87-position-and-translate.patch b/0011-fix-87-position-and-translate.patch new file mode 100644 index 0000000..0419506 --- /dev/null +++ b/0011-fix-87-position-and-translate.patch @@ -0,0 +1,230 @@ +From 057721ec933fc439d9e9b9887dc69704cd49472e Mon Sep 17 00:00:00 2001 +From: cui-gaoleng <562344211@qq.com> +Date: Fri, 22 Nov 2024 12:14:08 +0800 +Subject: [PATCH] =?UTF-8?q?fix=20progress=20bar=20has=20been=20at=20the=20?= + =?UTF-8?q?87%=20position=20for=20a=20long=20time+=E4=B8=A4=E5=A4=84?= + =?UTF-8?q?=E7=B9=81=E4=BD=93=E7=BF=BB=E8=AF=91=E8=A1=A5=E9=BD=90?= +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +--- + calamares.desktop | 2 +- + lang/calamares_zh_TW.ts | 6 +-- + src/modules/packages/main.py | 70 +++++++++++++++++++------------- + src/modules/packages/module.desc | 1 + + src/modules/unpackfs/main.py | 24 ++++++++--- + 5 files changed, 65 insertions(+), 38 deletions(-) + +diff --git a/calamares.desktop b/calamares.desktop +index 9a1416e..9d33495 100644 +--- a/calamares.desktop ++++ b/calamares.desktop +@@ -5,7 +5,7 @@ Name=Install System + GenericName=System Installer + Keywords=calamares;system;installer; + TryExec=calamares +-Exec=sh -c "pkexec calamares" ++Exec=sh -c "pkexec calamares -style Adwaita" + Comment=Calamares — System Installer + Icon=calamares + Terminal=false +diff --git a/lang/calamares_zh_TW.ts b/lang/calamares_zh_TW.ts +index 8689629..3cc473c 100644 +--- a/lang/calamares_zh_TW.ts ++++ b/lang/calamares_zh_TW.ts +@@ -613,9 +613,9 @@ The system will reboot or you can enter the debug mode for further investigation + + + +- &Debug ++ &Try Now + @button +- 調試(&D) ++ 立即試用(&D) + + + Do you really want to cancel the current install process? +@@ -4526,7 +4526,7 @@ Output: + + + language +- ++ 語言 + + + Open donations website +diff --git a/src/modules/packages/main.py b/src/modules/packages/main.py +index 8c165e8..1fbe276 100644 +--- a/src/modules/packages/main.py ++++ b/src/modules/packages/main.py +@@ -138,10 +138,11 @@ class PackageManager(metaclass=abc.ABCMeta): + self.install([packagedata], from_local=from_local, options=options) + else: + self.run(packagedata["pre-script"]) +- if isinstance(packagedata["package"], list): +- self.install(packagedata["package"], from_local=from_local, options=options) +- else: +- self.install([packagedata["package"]], from_local=from_local, options=options) ++ if "package" in packagedata: ++ if isinstance(packagedata["package"], list): ++ self.install(packagedata["package"], from_local=from_local, options=options) ++ else: ++ self.install([packagedata["package"]], from_local=from_local, options=options) + if isinstance(packagedata["post-script"], list): + for script in packagedata["post-script"]: + self.run(script) +@@ -787,41 +788,54 @@ def run_operations(pkgman, entry, options): + names (strings) or package information dictionaries with pre- + and post-scripts. + """ +- global group_packages, completed_packages, mode_packages +- +- if "source" in entry and entry["source"] == "packagechooser@packagechooser": +- handle_packagechooser(entry) ++ global group_packages, completed_packages, mode_packages, custom_status_message + + for key in entry.keys(): + package_list = subst_locale(entry[key]) ++ libcalamares.utils.warning(str(package_list)) + group_packages = len(package_list) + +- if key == "install": +- _change_mode(INSTALL) +- pkgman.operation_install(package_list, options=options) +- elif key == "try_install": ++ if key in ["install", "try_install", "localInstall"]: + _change_mode(INSTALL) +- pkgman.operation_try_install(package_list, options=options) +- elif key == "remove": +- _change_mode(REMOVE) +- pkgman.operation_remove(package_list, options=options) +- elif key == "try_remove": ++ for package in package_list: ++ custom_status_message = f"Installing package: {package}" ++ try: ++ if key == "localInstall": ++ pkgman.operation_install([package], from_local=True, options=options) ++ elif key == "try_install": ++ pkgman.operation_try_install([package], options=options) ++ else: ++ pkgman.operation_install([package], options=options) ++ except Exception as e: ++ libcalamares.utils.warning("Failed to install package {}: {}".format(package, str(e))) ++ ++ completed_packages += 1 ++ progress = completed_packages / total_packages ++ libcalamares.job.setprogress(progress) ++ libcalamares.utils.debug("Progress: {:.2f}, Package: {}".format(progress, package)) ++ elif key in ["remove", "try_remove"]: + _change_mode(REMOVE) +- pkgman.operation_try_remove(package_list, options=options) +- elif key == "localInstall": +- _change_mode(INSTALL) +- pkgman.operation_install(package_list, from_local=True, options=options) +- elif key == "source": +- libcalamares.utils.debug("Package-list from {!s}".format(entry[key])) ++ for package in package_list: ++ try: ++ if key == "remove": ++ pkgman.operation_remove([package], options=options) ++ elif key == "try_remove": ++ pkgman.operation_try_remove([package], options=options) ++ except Exception as e: ++ libcalamares.utils.warning("Failed to remove package {}: {}".format(package, str(e))) ++ ++ completed_packages += 1 ++ progress = completed_packages / total_packages ++ libcalamares.job.setprogress(progress) ++ libcalamares.utils.debug("Progress: {:.2f}, Package: {}".format(progress, package)) + else: + libcalamares.utils.warning("Unknown package-operation key {!s}".format(key)) +- completed_packages += len(package_list) +- libcalamares.job.setprogress(completed_packages * 1.0 / total_packages) +- libcalamares.utils.debug("Pretty name: {!s}, setting progress..".format(pretty_name())) + ++ if "source" in entry and entry["source"] == "packagechooser@packagechooser": ++ packagemeta = handle_packagechooser() ++ pkgman.operation_install([packagemeta], from_local=True, options=options) + group_packages = 0 +- _change_mode(None) +- ++ _change_mode(None) + + def run(): + """ +diff --git a/src/modules/packages/module.desc b/src/modules/packages/module.desc +index 3e3053b..9529af6 100644 +--- a/src/modules/packages/module.desc ++++ b/src/modules/packages/module.desc +@@ -5,3 +5,4 @@ type: "job" + name: "packages" + interface: "python" + script: "main.py" ++weight: 50 +diff --git a/src/modules/unpackfs/main.py b/src/modules/unpackfs/main.py +index 4148720..4c5518e 100644 +--- a/src/modules/unpackfs/main.py ++++ b/src/modules/unpackfs/main.py +@@ -26,6 +26,8 @@ import libcalamares + import platform + + import gettext ++ ++import libcalamares.utils + _ = gettext.translation("calamares-python", + localedir=libcalamares.utils.gettext_path(), + languages=libcalamares.utils.gettext_languages(), +@@ -263,6 +265,7 @@ def file_copy(source, entry, progress_cb): + progress_cb(num_files_copied, num_files_total_local) + try: + returncode = 0 ++ + arch = platform.machine() + + libcalamares.utils.host_env_process_output(["mkdir", "-p", entry.destination + "/etc/yum.repos.d/"], output_cb) +@@ -272,6 +275,7 @@ def file_copy(source, entry, progress_cb): + libcalamares.utils.host_env_process_output(["cp", "-af", "/etc/add_selinux_policy.sh", entry.destination + "/etc/add_selinux_policy.sh"], output_cb) + libcalamares.utils.host_env_process_output(["chmod", "+x", entry.destination + "/etc/add_selinux_policy.sh"], output_cb) + ++ completed_packages = 0 + if os.path.exists("/etc/yum.repos.d/local.repo"): + libcalamares.utils.host_env_process_output( + ["cp", "-af", "/etc/yum.repos.d/local.repo", entry.destination + "/etc/yum.repos.d/"], output_cb) +@@ -281,9 +285,13 @@ def file_copy(source, entry, progress_cb): + else: + packages = ["yum", "grub2", "grub2-efi-x64", "grub2-pc", "passwd", "sudo"] + +- libcalamares.utils.host_env_process_output( +- ["yum", "--installroot=" + entry.destination, "--disablerepo=*", "--enablerepo=local-repo", +- "--releasever=/", "--nogpgcheck", "--setopt=sslverify=0", "install", "-y"] + packages, output_cb) ++ for package in packages: ++ libcalamares.job.setprogress(completed_packages / len(packages)) ++ libcalamares.utils.host_env_process_output( ++ ["yum", "--installroot=" + entry.destination, "--disablerepo=*", "--enablerepo=local-repo", ++ "--releasever=/", "--nogpgcheck", "--setopt=sslverify=0", "install", "-y", package], output_cb) ++ completed_packages += 1 ++ libcalamares.job.setprogress(completed_packages / len(packages)) + else: + libcalamares.utils.host_env_process_output( + ["cp", "-af", "/etc/yum.repos.d/openEuler.repo", entry.destination + "/etc/yum.repos.d/"], output_cb) +@@ -292,9 +300,13 @@ def file_copy(source, entry, progress_cb): + else: + packages = ["yum", "grub2", "grub2-efi-x64", "grub2-pc", "passwd", "sudo"] + +- libcalamares.utils.host_env_process_output( +- ["yum", "--installroot=" + entry.destination, "--releasever=/", "--nogpgcheck", "--setopt=sslverify=0", +- "install", "-y"] + packages, output_cb) ++ for package in packages: ++ libcalamares.job.setprogress(completed_packages / len(packages)) ++ libcalamares.utils.host_env_process_output( ++ ["yum", "--installroot=" + entry.destination, "--releasever=/", "--nogpgcheck", "--setopt=sslverify=0", ++ "install", "-y", package], output_cb) ++ completed_packages += 1 ++ libcalamares.job.setprogress(completed_packages / len(packages)) + + libcalamares.utils.host_env_process_output(["rm", "-f", entry.destination + "/etc/shadow"], output_cb) + libcalamares.utils.host_env_process_output(["cp", "-af", "/etc/shadow", entry.destination + "/etc/shadow"], output_cb) +-- +2.43.0 + diff --git a/0012-replace-icon.patch b/0012-replace-icon.patch new file mode 100644 index 0000000..9a36c87 --- /dev/null +++ b/0012-replace-icon.patch @@ -0,0 +1,29 @@ +From ec4ad9b45ba894afb73ae30ae6e8631fb701f1dd Mon Sep 17 00:00:00 2001 +From: cui-gaoleng <562344211@qq.com> +Date: Fri, 22 Nov 2024 12:44:38 +0800 +Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=9B=BE=E6=A0=87=E9=85=8D?= + =?UTF-8?q?=E7=BD=AE?= +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +--- + calamares.desktop | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/calamares.desktop b/calamares.desktop +index 9d33495..00c2368 100644 +--- a/calamares.desktop ++++ b/calamares.desktop +@@ -7,7 +7,7 @@ Keywords=calamares;system;installer; + TryExec=calamares + Exec=sh -c "pkexec calamares -style Adwaita" + Comment=Calamares — System Installer +-Icon=calamares ++Icon=/usr/share/calamares/branding/default/openEuler-icon.png + Terminal=false + StartupNotify=true + Categories=Qt;System; +-- +2.43.0 + diff --git a/0013-1230.patch b/0013-1230.patch new file mode 100644 index 0000000..063cdbd --- /dev/null +++ b/0013-1230.patch @@ -0,0 +1,5496 @@ +From 3d9f1fa95d537a7925fd8eb5841bf89e151852df Mon Sep 17 00:00:00 2001 +From: lizixin <2271170409@qq.com> +Date: Fri, 27 Dec 2024 18:07:52 +0800 +Subject: [PATCH] 1230 + +--- + CMakeLists.txt | 1 + + calamares.desktop | 10 +- + lang/calamares_zh_CN.ts | 2 +- + src/branding/default/show.qml | 6 +- + src/calamares/CMakeLists.txt | 134 +- + src/calamares/CalamaresApplication.cpp | 4 +- + src/calamares/DebugWindow.cpp | 530 ++++---- + src/calamares/DebugWindow.h | 192 +-- + src/calamares/VariantModel.cpp | 570 ++++---- + src/calamares/VariantModel.h | 208 +-- + src/calamares/calamares-navigation.qml | 166 +-- + src/calamares/calamares-sidebar.qml | 250 ++-- + src/calamares/calamares.qrc | 20 +- + src/calamares/main.cpp | 308 ++--- + .../progresstree/ProgressTreeDelegate.cpp | 422 +++--- + .../progresstree/ProgressTreeDelegate.h | 62 +- + .../progresstree/ProgressTreeView.cpp | 154 ++- + src/calamares/progresstree/ProgressTreeView.h | 82 +- + src/calamares/test_conf.cpp | 218 ++-- + src/calamares/testmain.cpp | 1144 ++++++++--------- + src/libcalamares/CalamaresAbout.cpp | 1 + + .../modulesystem/CppJobModule.cpp | 4 + + src/modules/displaymanager/main.py | 10 + + src/modules/keyboard/KeyboardPage.cpp | 19 + + src/modules/keyboard/KeyboardPage.ui | 3 + + src/modules/locale/Config.cpp | 43 + + src/modules/locale/LocalePage.cpp | 20 +- + .../packagechooser/packagechooser.conf | 20 +- + src/modules/packagechooser/packagechooser.qrc | 5 - + src/modules/packages/main.py | 14 +- + src/modules/packages/packages.conf | 4 +- + src/modules/partition/core/DeviceList.cpp | 23 +- + src/modules/partition/jobs/ClearMountsJob.cpp | 51 +- + src/modules/unpackfs/main.py | 6 +- + src/modules/users/CreateUserJob.cpp | 18 + + src/modules/users/UsersPage.cpp | 102 ++ + src/modules/users/UsersPage.h | 15 + + src/modules/welcome/WelcomePage.cpp | 74 +- + src/modules/welcome/welcome.qrc | 1 - + 39 files changed, 2643 insertions(+), 2273 deletions(-) + +diff --git a/CMakeLists.txt b/CMakeLists.txt +index 19395d4..40ae7e0 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -744,3 +744,4 @@ set(CPACK_PACKAGE_DESCRIPTION + set(CPACK_PACKAGE_ICON "data/images/squid.png") + + include(CPack) ++ +diff --git a/calamares.desktop b/calamares.desktop +index 00c2368..b0d6c27 100644 +--- a/calamares.desktop ++++ b/calamares.desktop +@@ -7,7 +7,7 @@ Keywords=calamares;system;installer; + TryExec=calamares + Exec=sh -c "pkexec calamares -style Adwaita" + Comment=Calamares — System Installer +-Icon=/usr/share/calamares/branding/default/openEuler-icon.png ++Icon=/usr/share/applications/openEuler.png + Terminal=false + StartupNotify=true + Categories=Qt;System; +@@ -66,7 +66,7 @@ Icon[el]=calamares + GenericName[el]=Εγκατάσταση συστήματος + Comment[el]=Calamares — Εγκατάσταση συστήματος + Name[en_GB]=Install System +-Icon[en_GB]=calamares ++Icon[en_GB]=/usr/share/applications/openEuler.png + GenericName[en_GB]=System Installer + Comment[en_GB]=Calamares — System Installer + Name[eo]=Instali Sistemo +@@ -226,7 +226,7 @@ Icon[tr_TR]=calamares + GenericName[tr_TR]=Sistem Yükleyici + Comment[tr_TR]=Calamares — Sistem Yükleyici + Name[uk]=Встановити Систему +-Icon[uk]=calamares ++Icon[uk]=/usr/share/applications/openEuler.png + GenericName[uk]=Встановлювач системи + Comment[uk]=Calamares - Встановлювач системи + Name[vi]=Cài đặt hệ thống +@@ -234,10 +234,10 @@ Icon[vi]=calamares + GenericName[vi]=Bộ cài đặt hệ thống + Comment[vi]=Calamares — Bộ cài đặt hệ thống + Name[zh_CN]=安装系统 +-Icon[zh_CN]=calamares ++Icon[zh_CN]=/usr/share/applications/openEuler.png + GenericName[zh_CN]=系统安装程序 + Comment[zh_CN]=Calamares — 系统安装程序 + Name[zh_TW]=安裝系統 +-Icon[zh_TW]=calamares ++Icon[zh_TW]=/usr/share/applications/openEuler.png + GenericName[zh_TW]=系統安裝程式 + Comment[zh_TW]=Calamares ── 系統安裝程式 +diff --git a/lang/calamares_zh_CN.ts b/lang/calamares_zh_CN.ts +index 75ffe95..3479fd1 100644 +--- a/lang/calamares_zh_CN.ts ++++ b/lang/calamares_zh_CN.ts +@@ -1032,7 +1032,7 @@ The installer will quit and all changes will be lost. + + The timezone will be set to %1. + @info +- 设置时区为 %1. ++ 设置时区为 %1。 + + + The timezone whill be set to %1. +diff --git a/src/branding/default/show.qml b/src/branding/default/show.qml +index f6223c0..f91d520 100644 +--- a/src/branding/default/show.qml ++++ b/src/branding/default/show.qml +@@ -33,7 +33,7 @@ Presentation + Image { + id: background1 + source: "Slide1.png" +- width: 800; height: 800 ++ width: 980; height: 980 + fillMode: Image.PreserveAspectFit + anchors.horizontalCenter:parent.horizontalCenter + y:parent.height / 2 - height / 2 -25 +@@ -44,7 +44,7 @@ Presentation + Image { + id: background2 + source: "Slide2.png" +- width: 800; height: 800 ++ width: 980; height: 980 + fillMode: Image.PreserveAspectFit + anchors.horizontalCenter:parent.horizontalCenter + y:parent.height / 2 - height / 2 -25 +@@ -55,7 +55,7 @@ Presentation + Image { + id: background3 + source: "Slide3.png" +- width: 800; height: 800 ++ width: 980; height: 980 + fillMode: Image.PreserveAspectFit + anchors.horizontalCenter:parent.horizontalCenter + y:parent.height / 2 - height / 2 -25 +diff --git a/src/calamares/CMakeLists.txt b/src/calamares/CMakeLists.txt +index 3be6b92..9f806c7 100644 +--- a/src/calamares/CMakeLists.txt ++++ b/src/calamares/CMakeLists.txt +@@ -1,67 +1,67 @@ +-# === This file is part of Calamares - === +-# +-# SPDX-FileCopyrightText: 2020 Adriaan de Groot +-# SPDX-License-Identifier: BSD-2-Clause +-# +- +-set(calamaresSources +- main.cpp +- CalamaresApplication.cpp +- CalamaresWindow.cpp +- DebugWindow.cpp +- VariantModel.cpp +- progresstree/ProgressTreeDelegate.cpp +- progresstree/ProgressTreeView.cpp +-) +- +-include_directories( +- ${CMAKE_SOURCE_DIR}/src/libcalamares +- ${CMAKE_SOURCE_DIR}/src/libcalamaresui +- ${CMAKE_BINARY_DIR}/src/libcalamares +- ${CMAKE_CURRENT_SOURCE_DIR} +-) +- +-### EXECUTABLE +-# +-# "calamares_bin" is the main application, not to be confused with +-# the target "calamares" which is the non-GUI library part. +-# +-# The calamares-i18n.cxx file -- full path in CALAMARES_TRANSLATIONS_SOURCE -- +-# is created as a target in the lang/ directory. This is compiled to a +-# library (it's just the result of a QRC compile). +-add_executable(calamares_bin ${calamaresSources} calamares.qrc) +-target_include_directories(calamares_bin PRIVATE ${CMAKE_SOURCE_DIR}) +-set_target_properties(calamares_bin PROPERTIES ENABLE_EXPORTS TRUE RUNTIME_OUTPUT_NAME calamares) +-calamares_automoc( calamares_bin ) +-calamares_autouic( calamares_bin ) +-calamares_autorcc( calamares_bin ) +- +-target_link_libraries( +- calamares_bin +- PRIVATE calamares calamaresui calamares-i18n kdsingleapplication ${qtname}::Core ${qtname}::Widgets +-) +-target_link_libraries(calamares_bin PRIVATE ${kfname}::CoreAddons) +-if(BUILD_CRASH_REPORTING) +- target_link_libraries(calamares_bin PRIVATE ${kfname}::Crash) +- target_compile_definitions(calamares_bin PRIVATE BUILD_CRASH_REPORTING) +-endif() +- +-install(TARGETS calamares_bin BUNDLE DESTINATION . RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}) +- +-install( +- FILES ${CMAKE_SOURCE_DIR}/data/images/squid.svg +- RENAME calamares.svg +- DESTINATION ${CMAKE_INSTALL_DATADIR}/icons/hicolor/scalable/apps +-) +- +-### TESTS +-# +-# +-if(BUILD_TESTING) +- # Don't install, these are just for enable_testing +- add_executable(loadmodule testmain.cpp) +- target_link_libraries(loadmodule PRIVATE ${qtname}::Core ${qtname}::Widgets calamares calamaresui) +- +- add_executable(test_conf test_conf.cpp) +- target_link_libraries(test_conf PUBLIC yamlcpp::yamlcpp ${qtname}::Core) +-endif() ++# === This file is part of Calamares - === ++# ++# SPDX-FileCopyrightText: 2020 Adriaan de Groot ++# SPDX-License-Identifier: BSD-2-Clause ++# ++ ++set(calamaresSources ++ main.cpp ++ CalamaresApplication.cpp ++ CalamaresWindow.cpp ++ DebugWindow.cpp ++ VariantModel.cpp ++ progresstree/ProgressTreeDelegate.cpp ++ progresstree/ProgressTreeView.cpp ++) ++ ++include_directories( ++ ${CMAKE_SOURCE_DIR}/src/libcalamares ++ ${CMAKE_SOURCE_DIR}/src/libcalamaresui ++ ${CMAKE_BINARY_DIR}/src/libcalamares ++ ${CMAKE_CURRENT_SOURCE_DIR} ++) ++ ++### EXECUTABLE ++# ++# "calamares_bin" is the main application, not to be confused with ++# the target "calamares" which is the non-GUI library part. ++# ++# The calamares-i18n.cxx file -- full path in CALAMARES_TRANSLATIONS_SOURCE -- ++# is created as a target in the lang/ directory. This is compiled to a ++# library (it's just the result of a QRC compile). ++add_executable(calamares_bin ${calamaresSources} calamares.qrc) ++target_include_directories(calamares_bin PRIVATE ${CMAKE_SOURCE_DIR}) ++set_target_properties(calamares_bin PROPERTIES ENABLE_EXPORTS TRUE RUNTIME_OUTPUT_NAME calamares) ++calamares_automoc( calamares_bin ) ++calamares_autouic( calamares_bin ) ++calamares_autorcc( calamares_bin ) ++ ++target_link_libraries( ++ calamares_bin ++ PRIVATE calamares calamaresui calamares-i18n kdsingleapplication ${qtname}::Core ${qtname}::Widgets ++) ++target_link_libraries(calamares_bin PRIVATE ${kfname}::CoreAddons) ++if(BUILD_CRASH_REPORTING) ++ target_link_libraries(calamares_bin PRIVATE ${kfname}::Crash) ++ target_compile_definitions(calamares_bin PRIVATE BUILD_CRASH_REPORTING) ++endif() ++ ++install(TARGETS calamares_bin BUNDLE DESTINATION . RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}) ++ ++install( ++ FILES ${CMAKE_SOURCE_DIR}/data/images/squid.svg ++ RENAME calamares.svg ++ DESTINATION ${CMAKE_INSTALL_DATADIR}/icons/hicolor/scalable/apps ++) ++ ++### TESTS ++# ++# ++if(BUILD_TESTING) ++ # Don't install, these are just for enable_testing ++ add_executable(loadmodule testmain.cpp) ++ target_link_libraries(loadmodule PRIVATE ${qtname}::Core ${qtname}::Widgets calamares calamaresui) ++ ++ add_executable(test_conf test_conf.cpp) ++ target_link_libraries(test_conf PUBLIC yamlcpp::yamlcpp ${qtname}::Core) ++endif() +diff --git a/src/calamares/CalamaresApplication.cpp b/src/calamares/CalamaresApplication.cpp +index a07edad..6b62fd6 100644 +--- a/src/calamares/CalamaresApplication.cpp ++++ b/src/calamares/CalamaresApplication.cpp +@@ -51,8 +51,8 @@ CalamaresApplication::CalamaresApplication( int& argc, char* argv[] ) + // directory -- where Calamares stores logs, for instance -- + // //, so we end up with ~/.cache/Calamares/calamares/ + // which is excessively squidly. +- // +- // setOrganizationName( QStringLiteral( CALAMARES_ORGANIZATION_NAME ) ); ++ ++ + setOrganizationDomain( QStringLiteral( CALAMARES_ORGANIZATION_DOMAIN ) ); + setApplicationName( QStringLiteral( CALAMARES_APPLICATION_NAME ) ); + setApplicationVersion( QStringLiteral( CALAMARES_VERSION ) ); +diff --git a/src/calamares/DebugWindow.cpp b/src/calamares/DebugWindow.cpp +index b28661e..69584b8 100644 +--- a/src/calamares/DebugWindow.cpp ++++ b/src/calamares/DebugWindow.cpp +@@ -1,265 +1,265 @@ +-/* === This file is part of Calamares - === +- * +- * SPDX-FileCopyrightText: 2015-2016 Teo Mrnjavac +- * SPDX-FileCopyrightText: 2019 Adriaan de Groot +- * SPDX-License-Identifier: GPL-3.0-or-later +- * +- * Calamares is Free Software: see the License-Identifier above. +- * +- */ +- +-#include "DebugWindow.h" +-#include "ui_DebugWindow.h" +- +-#include "Branding.h" +-#include "CalamaresAbout.h" +-#include "CalamaresVersion.h" +-#include "GlobalStorage.h" +-#include "Job.h" +-#include "JobQueue.h" +-#include "Settings.h" +-#include "VariantModel.h" +-#include "modulesystem/Module.h" +-#include "modulesystem/ModuleManager.h" +-#include "utils/Gui.h" +-#include "utils/Logger.h" +-#include "utils/Paste.h" +-#include "utils/Retranslator.h" +-#include "widgets/TranslationFix.h" +- +-#include +-#include +-#include +-#include +-#include +- +-#include +-#include +- +-/** +- * @brief crash makes Calamares crash immediately. +- */ +-static void +-crash() +-{ +- kill( getpid(), SIGTRAP ); +-} +- +-/// @brief Print out the widget tree (names) in indented form. +-static void +-dumpWidgetTree( QDebug& deb, const QWidget* widget, int depth ) +-{ +- if ( !widget ) +- { +- return; +- } +- +- deb << Logger::Continuation; +- for ( int i = 0; i < depth; ++i ) +- { +- deb << ' '; +- } +- deb << widget->metaObject()->className() << widget->objectName(); +- +- for ( const auto* w : widget->findChildren< QWidget* >( QString(), Qt::FindDirectChildrenOnly ) ) +- { +- dumpWidgetTree( deb, w, depth + 1 ); +- } +-} +- +-namespace Calamares +-{ +- +-DebugWindow::DebugWindow() +- : QWidget( nullptr ) +- , m_ui( new Ui::DebugWindow ) +- , m_globals( JobQueue::instance()->globalStorage()->data() ) +- , m_globals_model( std::make_unique< VariantModel >( &m_globals ) ) +- , m_module_model( std::make_unique< VariantModel >( &m_module ) ) +-{ +- GlobalStorage* gs = JobQueue::instance()->globalStorage(); +- +- m_ui->setupUi( this ); +- +- m_ui->globalStorageView->setModel( m_globals_model.get() ); +- m_ui->globalStorageView->expandAll(); +- +- // Do above when the GS changes, too +- connect( gs, +- &GlobalStorage::changed, +- this, +- [ = ] +- { +- m_globals = JobQueue::instance()->globalStorage()->data(); +- m_globals_model->reload(); +- m_ui->globalStorageView->expandAll(); +- } ); +- +- // JobQueue page +- m_ui->jobQueueText->setReadOnly( true ); +- connect( JobQueue::instance(), +- &JobQueue::queueChanged, +- this, +- [ this ]( const QStringList& jobs ) { m_ui->jobQueueText->setText( jobs.join( '\n' ) ); } ); +- +- // Modules page +- QStringList modulesKeys; +- for ( const auto& m : ModuleManager::instance()->loadedInstanceKeys() ) +- { +- modulesKeys << m.toString(); +- } +- +- QStringListModel* modulesModel = new QStringListModel( modulesKeys ); +- m_ui->modulesListView->setModel( modulesModel ); +- m_ui->modulesListView->setSelectionMode( QAbstractItemView::SingleSelection ); +- +- m_ui->moduleConfigView->setModel( m_module_model.get() ); +- +- connect( m_ui->modulesListView->selectionModel(), +- &QItemSelectionModel::selectionChanged, +- this, +- [ this ] +- { +- QString moduleName = m_ui->modulesListView->currentIndex().data().toString(); +- Module* module +- = ModuleManager::instance()->moduleInstance( ModuleSystem::InstanceKey::fromString( moduleName ) ); +- if ( module ) +- { +- m_module = module->configurationMap(); +- m_module_model->reload(); +- m_ui->moduleConfigView->expandAll(); +- m_ui->moduleTypeLabel->setText( module->typeString() ); +- m_ui->moduleInterfaceLabel->setText( module->interfaceString() ); +- } +- } ); +- +- // Tools page +- connect( m_ui->crashButton, &QPushButton::clicked, this, [] { ::crash(); } ); +- connect( m_ui->reloadStylesheetButton, +- &QPushButton::clicked, +- []() +- { +- for ( auto* w : qApp->topLevelWidgets() ) +- { +- // Needs to match what's set in CalamaresWindow +- if ( w->objectName() == QStringLiteral( "mainApp" ) ) +- { +- w->setStyleSheet( Calamares::Branding::instance()->stylesheet() ); +- } +- } +- } ); +- connect( m_ui->widgetTreeButton, +- &QPushButton::clicked, +- []() +- { +- for ( auto* w : qApp->topLevelWidgets() ) +- { +- Logger::CDebug deb; +- dumpWidgetTree( deb, w, 0 ); +- } +- } ); +- +- // Send Log button only if it would be useful +- m_ui->sendLogButton->setVisible( Calamares::Paste::isEnabled() ); +- connect( m_ui->sendLogButton, &QPushButton::clicked, [ this ]() { Calamares::Paste::doLogUploadUI( this ); } ); +- +- CALAMARES_RETRANSLATE( m_ui->retranslateUi( this ); setWindowTitle( tr( "Debug Information", "@title" ) ); ); +-} +- +-void +-DebugWindow::closeEvent( QCloseEvent* e ) +-{ +- Q_UNUSED( e ) +- emit closed(); +-} +- +-DebugWindowManager::DebugWindowManager( QObject* parent ) +- : QObject( parent ) +-{ +-} +- +-bool +-DebugWindowManager::enabled() const +-{ +- const auto* s = Settings::instance(); +- return ( Logger::logLevel() >= Logger::LOGVERBOSE ) || ( s ? s->debugMode() : false ); +-} +- +-void +-DebugWindowManager::show( bool visible ) +-{ +- if ( !enabled() ) +- { +- visible = false; +- } +- if ( m_visible == visible ) +- { +- return; +- } +- +- if ( visible ) +- { +- m_debugWindow = new Calamares::DebugWindow(); +- m_debugWindow->show(); +- connect( m_debugWindow.data(), +- &Calamares::DebugWindow::closed, +- this, +- [ = ]() +- { +- m_debugWindow->deleteLater(); +- m_visible = false; +- emit visibleChanged( false ); +- } ); +- m_visible = true; +- emit visibleChanged( true ); +- } +- else +- { +- if ( m_debugWindow ) +- { +- m_debugWindow->deleteLater(); +- } +- m_visible = false; +- emit visibleChanged( false ); +- } +-} +- +-void +-DebugWindowManager::toggle() +-{ +- show( !m_visible ); +-} +- +-void +-DebugWindowManager::about() +-{ +- QString title = Calamares::Settings::instance()->isSetupMode() +- ? QCoreApplication::translate( "WelcomePage", "About %1 Setup", "@title" ) +- : QCoreApplication::translate( "WelcomePage", "About %1 Installer", "@title" ); +- QMessageBox mb( QMessageBox::Information, +- title.arg( CALAMARES_APPLICATION_NAME ), +- Calamares::aboutString().arg( Calamares::Branding::instance()->versionedName() ), +- QMessageBox::Ok, +- nullptr ); +- Calamares::fixButtonLabels( &mb ); +- mb.setStyleSheet( +- "QMessageBox {" +- "border: 1px solid hsl(240,2%,79%);" +- "border-radius: 5px;" +- "background-color: #FFFFFF;" // 设置对话框背景颜色 +- "}" +- ); +- mb.setWindowFlags(Qt::FramelessWindowHint | Qt::Dialog); +- mb.setIconPixmap( +- Calamares::defaultPixmap( Calamares::BigLogo,//Biglogo.svg +- Calamares::Original, +- QSize( 321/1.9, 297/2 ) ) ); +- QGridLayout* layout = reinterpret_cast< QGridLayout* >( mb.layout() ); +- if ( layout ) +- { +- layout->setColumnMinimumWidth( 2, Calamares::defaultFontHeight() * 24 ); +- } +- mb.exec(); +-} +- +-} // namespace Calamares ++/* === This file is part of Calamares - === ++ * ++ * SPDX-FileCopyrightText: 2015-2016 Teo Mrnjavac ++ * SPDX-FileCopyrightText: 2019 Adriaan de Groot ++ * SPDX-License-Identifier: GPL-3.0-or-later ++ * ++ * Calamares is Free Software: see the License-Identifier above. ++ * ++ */ ++ ++#include "DebugWindow.h" ++#include "ui_DebugWindow.h" ++ ++#include "Branding.h" ++#include "CalamaresAbout.h" ++#include "CalamaresVersion.h" ++#include "GlobalStorage.h" ++#include "Job.h" ++#include "JobQueue.h" ++#include "Settings.h" ++#include "VariantModel.h" ++#include "modulesystem/Module.h" ++#include "modulesystem/ModuleManager.h" ++#include "utils/Gui.h" ++#include "utils/Logger.h" ++#include "utils/Paste.h" ++#include "utils/Retranslator.h" ++#include "widgets/TranslationFix.h" ++ ++#include ++#include ++#include ++#include ++#include ++ ++#include ++#include ++ ++/** ++ * @brief crash makes Calamares crash immediately. ++ */ ++static void ++crash() ++{ ++ kill( getpid(), SIGTRAP ); ++} ++ ++/// @brief Print out the widget tree (names) in indented form. ++static void ++dumpWidgetTree( QDebug& deb, const QWidget* widget, int depth ) ++{ ++ if ( !widget ) ++ { ++ return; ++ } ++ ++ deb << Logger::Continuation; ++ for ( int i = 0; i < depth; ++i ) ++ { ++ deb << ' '; ++ } ++ deb << widget->metaObject()->className() << widget->objectName(); ++ ++ for ( const auto* w : widget->findChildren< QWidget* >( QString(), Qt::FindDirectChildrenOnly ) ) ++ { ++ dumpWidgetTree( deb, w, depth + 1 ); ++ } ++} ++ ++namespace Calamares ++{ ++ ++DebugWindow::DebugWindow() ++ : QWidget( nullptr ) ++ , m_ui( new Ui::DebugWindow ) ++ , m_globals( JobQueue::instance()->globalStorage()->data() ) ++ , m_globals_model( std::make_unique< VariantModel >( &m_globals ) ) ++ , m_module_model( std::make_unique< VariantModel >( &m_module ) ) ++{ ++ GlobalStorage* gs = JobQueue::instance()->globalStorage(); ++ ++ m_ui->setupUi( this ); ++ ++ m_ui->globalStorageView->setModel( m_globals_model.get() ); ++ m_ui->globalStorageView->expandAll(); ++ ++ // Do above when the GS changes, too ++ connect( gs, ++ &GlobalStorage::changed, ++ this, ++ [ = ] ++ { ++ m_globals = JobQueue::instance()->globalStorage()->data(); ++ m_globals_model->reload(); ++ m_ui->globalStorageView->expandAll(); ++ } ); ++ ++ // JobQueue page ++ m_ui->jobQueueText->setReadOnly( true ); ++ connect( JobQueue::instance(), ++ &JobQueue::queueChanged, ++ this, ++ [ this ]( const QStringList& jobs ) { m_ui->jobQueueText->setText( jobs.join( '\n' ) ); } ); ++ ++ // Modules page ++ QStringList modulesKeys; ++ for ( const auto& m : ModuleManager::instance()->loadedInstanceKeys() ) ++ { ++ modulesKeys << m.toString(); ++ } ++ ++ QStringListModel* modulesModel = new QStringListModel( modulesKeys ); ++ m_ui->modulesListView->setModel( modulesModel ); ++ m_ui->modulesListView->setSelectionMode( QAbstractItemView::SingleSelection ); ++ ++ m_ui->moduleConfigView->setModel( m_module_model.get() ); ++ ++ connect( m_ui->modulesListView->selectionModel(), ++ &QItemSelectionModel::selectionChanged, ++ this, ++ [ this ] ++ { ++ QString moduleName = m_ui->modulesListView->currentIndex().data().toString(); ++ Module* module ++ = ModuleManager::instance()->moduleInstance( ModuleSystem::InstanceKey::fromString( moduleName ) ); ++ if ( module ) ++ { ++ m_module = module->configurationMap(); ++ m_module_model->reload(); ++ m_ui->moduleConfigView->expandAll(); ++ m_ui->moduleTypeLabel->setText( module->typeString() ); ++ m_ui->moduleInterfaceLabel->setText( module->interfaceString() ); ++ } ++ } ); ++ ++ // Tools page ++ connect( m_ui->crashButton, &QPushButton::clicked, this, [] { ::crash(); } ); ++ connect( m_ui->reloadStylesheetButton, ++ &QPushButton::clicked, ++ []() ++ { ++ for ( auto* w : qApp->topLevelWidgets() ) ++ { ++ // Needs to match what's set in CalamaresWindow ++ if ( w->objectName() == QStringLiteral( "mainApp" ) ) ++ { ++ w->setStyleSheet( Calamares::Branding::instance()->stylesheet() ); ++ } ++ } ++ } ); ++ connect( m_ui->widgetTreeButton, ++ &QPushButton::clicked, ++ []() ++ { ++ for ( auto* w : qApp->topLevelWidgets() ) ++ { ++ Logger::CDebug deb; ++ dumpWidgetTree( deb, w, 0 ); ++ } ++ } ); ++ ++ // Send Log button only if it would be useful ++ m_ui->sendLogButton->setVisible( Calamares::Paste::isEnabled() ); ++ connect( m_ui->sendLogButton, &QPushButton::clicked, [ this ]() { Calamares::Paste::doLogUploadUI( this ); } ); ++ ++ CALAMARES_RETRANSLATE( m_ui->retranslateUi( this ); setWindowTitle( tr( "Debug Information", "@title" ) ); ); ++} ++ ++void ++DebugWindow::closeEvent( QCloseEvent* e ) ++{ ++ Q_UNUSED( e ) ++ emit closed(); ++} ++ ++DebugWindowManager::DebugWindowManager( QObject* parent ) ++ : QObject( parent ) ++{ ++} ++ ++bool ++DebugWindowManager::enabled() const ++{ ++ const auto* s = Settings::instance(); ++ return ( Logger::logLevel() >= Logger::LOGVERBOSE ) || ( s ? s->debugMode() : false ); ++} ++ ++void ++DebugWindowManager::show( bool visible ) ++{ ++ if ( !enabled() ) ++ { ++ visible = false; ++ } ++ if ( m_visible == visible ) ++ { ++ return; ++ } ++ ++ if ( visible ) ++ { ++ m_debugWindow = new Calamares::DebugWindow(); ++ m_debugWindow->show(); ++ connect( m_debugWindow.data(), ++ &Calamares::DebugWindow::closed, ++ this, ++ [ = ]() ++ { ++ m_debugWindow->deleteLater(); ++ m_visible = false; ++ emit visibleChanged( false ); ++ } ); ++ m_visible = true; ++ emit visibleChanged( true ); ++ } ++ else ++ { ++ if ( m_debugWindow ) ++ { ++ m_debugWindow->deleteLater(); ++ } ++ m_visible = false; ++ emit visibleChanged( false ); ++ } ++} ++ ++void ++DebugWindowManager::toggle() ++{ ++ show( !m_visible ); ++} ++ ++void ++DebugWindowManager::about() ++{ ++ QString title = Calamares::Settings::instance()->isSetupMode() ++ ? QCoreApplication::translate( "WelcomePage", "About %1 Setup", "@title" ) ++ : QCoreApplication::translate( "WelcomePage", "About %1 Installer", "@title" ); ++ QMessageBox mb( QMessageBox::Information, ++ title.arg( CALAMARES_APPLICATION_NAME ), ++ Calamares::aboutString().arg( Calamares::Branding::instance()->versionedName() ), ++ QMessageBox::Ok, ++ nullptr ); ++ Calamares::fixButtonLabels( &mb ); ++ mb.setStyleSheet( ++ "QMessageBox {" ++ "border: 1px solid hsl(240,2%,79%);" ++ "border-radius: 5px;" ++ "background-color: #FFFFFF;" // 设置对话框背景颜色 ++ "}" ++ ); ++ mb.setWindowFlags(Qt::FramelessWindowHint | Qt::Dialog); ++ mb.setIconPixmap( ++ Calamares::defaultPixmap( Calamares::BigLogo,//Biglogo.svg ++ Calamares::Original, ++ QSize( 321/1.9, 297/2 ) ) ); ++ QGridLayout* layout = reinterpret_cast< QGridLayout* >( mb.layout() ); ++ if ( layout ) ++ { ++ layout->setColumnMinimumWidth( 2, Calamares::defaultFontHeight() * 24 ); ++ } ++ mb.exec(); ++} ++ ++} // namespace Calamares +diff --git a/src/calamares/DebugWindow.h b/src/calamares/DebugWindow.h +index 83bfb08..9ed77e5 100644 +--- a/src/calamares/DebugWindow.h ++++ b/src/calamares/DebugWindow.h +@@ -1,96 +1,96 @@ +-/* === This file is part of Calamares - === +- * +- * SPDX-FileCopyrightText: 2015 Teo Mrnjavac +- * SPDX-FileCopyrightText: 2019 Adriaan de Groot +- * SPDX-License-Identifier: GPL-3.0-or-later +- * +- * Calamares is Free Software: see the License-Identifier above. +- * +- */ +- +-#ifndef CALAMARES_DEBUGWINDOW_H +-#define CALAMARES_DEBUGWINDOW_H +- +-#include "VariantModel.h" +- +-#include +-#include +-#include +- +-#include +- +-namespace Calamares +-{ +- +-// From the .ui file +-namespace Ui +-{ +-class DebugWindow; +-} // namespace Ui +- +-class DebugWindow : public QWidget +-{ +- Q_OBJECT +- +-public: +- explicit DebugWindow(); +- +-signals: +- void closed(); +- +-protected: +- void closeEvent( QCloseEvent* e ) override; +- +-private: +- Ui::DebugWindow* m_ui; +- QVariant m_globals; +- QVariant m_module; +- std::unique_ptr< VariantModel > m_globals_model; +- std::unique_ptr< VariantModel > m_module_model; +-}; +- +-/** @brief Manager for meta-windows (Debug and About windows) +- * +- * Only one DebugWindow is expected to be around. This class manages +- * (exactly one) DebugWindow and can create and destroy it as needed. +- * It is available to the Calamares panels as object `DebugWindow`. +- * +- * The about() method shows a modal pop-up about Calamares. +- */ +-class DebugWindowManager : public QObject +-{ +- Q_OBJECT +- +- /// @brief Proxy to Settings::debugMode() default @c false +- Q_PROPERTY( bool enabled READ enabled CONSTANT FINAL ) +- +- /** @brief Is the debug window visible? +- * +- * Writing @c true to this **may** make the debug window visible to +- * the user; only if debugMode() is on. +- */ +- Q_PROPERTY( bool visible READ visible WRITE show NOTIFY visibleChanged ) +- +-public: +- DebugWindowManager( QObject* parent = nullptr ); +- virtual ~DebugWindowManager() override = default; +- +-public Q_SLOTS: +- bool enabled() const; +- bool visible() const { return m_visible; } +- void show( bool visible ); +- void toggle(); +- +- void about(); +- +-signals: +- void visibleChanged( bool visible ); +- +-private: +- QPointer< DebugWindow > m_debugWindow; +- bool m_visible = false; +-}; +- +- +-} // namespace Calamares +-#endif ++/* === This file is part of Calamares - === ++ * ++ * SPDX-FileCopyrightText: 2015 Teo Mrnjavac ++ * SPDX-FileCopyrightText: 2019 Adriaan de Groot ++ * SPDX-License-Identifier: GPL-3.0-or-later ++ * ++ * Calamares is Free Software: see the License-Identifier above. ++ * ++ */ ++ ++#ifndef CALAMARES_DEBUGWINDOW_H ++#define CALAMARES_DEBUGWINDOW_H ++ ++#include "VariantModel.h" ++ ++#include ++#include ++#include ++ ++#include ++ ++namespace Calamares ++{ ++ ++// From the .ui file ++namespace Ui ++{ ++class DebugWindow; ++} // namespace Ui ++ ++class DebugWindow : public QWidget ++{ ++ Q_OBJECT ++ ++public: ++ explicit DebugWindow(); ++ ++signals: ++ void closed(); ++ ++protected: ++ void closeEvent( QCloseEvent* e ) override; ++ ++private: ++ Ui::DebugWindow* m_ui; ++ QVariant m_globals; ++ QVariant m_module; ++ std::unique_ptr< VariantModel > m_globals_model; ++ std::unique_ptr< VariantModel > m_module_model; ++}; ++ ++/** @brief Manager for meta-windows (Debug and About windows) ++ * ++ * Only one DebugWindow is expected to be around. This class manages ++ * (exactly one) DebugWindow and can create and destroy it as needed. ++ * It is available to the Calamares panels as object `DebugWindow`. ++ * ++ * The about() method shows a modal pop-up about Calamares. ++ */ ++class DebugWindowManager : public QObject ++{ ++ Q_OBJECT ++ ++ /// @brief Proxy to Settings::debugMode() default @c false ++ Q_PROPERTY( bool enabled READ enabled CONSTANT FINAL ) ++ ++ /** @brief Is the debug window visible? ++ * ++ * Writing @c true to this **may** make the debug window visible to ++ * the user; only if debugMode() is on. ++ */ ++ Q_PROPERTY( bool visible READ visible WRITE show NOTIFY visibleChanged ) ++ ++public: ++ DebugWindowManager( QObject* parent = nullptr ); ++ virtual ~DebugWindowManager() override = default; ++ ++public Q_SLOTS: ++ bool enabled() const; ++ bool visible() const { return m_visible; } ++ void show( bool visible ); ++ void toggle(); ++ ++ void about(); ++ ++signals: ++ void visibleChanged( bool visible ); ++ ++private: ++ QPointer< DebugWindow > m_debugWindow; ++ bool m_visible = false; ++}; ++ ++ ++} // namespace Calamares ++#endif +diff --git a/src/calamares/VariantModel.cpp b/src/calamares/VariantModel.cpp +index da4f556..6d175d5 100644 +--- a/src/calamares/VariantModel.cpp ++++ b/src/calamares/VariantModel.cpp +@@ -1,285 +1,285 @@ +-/* === This file is part of Calamares - === +- * +- * SPDX-FileCopyrightText: 2019 Adriaan de Groot +- * SPDX-License-Identifier: GPL-3.0-or-later +- * +- * Calamares is Free Software: see the License-Identifier above. +- * +- */ +- +-#include "VariantModel.h" +- +-#include "compat/Variant.h" +- +-static bool +-isMapLike( const QVariant& item ) +-{ +- return item.canConvert< QVariantMap >(); +-} +- +-static bool +-isListLike( const QVariant& item ) +-{ +- return item.canConvert< QVariantList >() && !( Calamares::typeOf( item ) == Calamares::StringVariantType ); +-} +- +-static void +-overallLength( const QVariant& item, quintptr& c, quintptr parent, VariantModel::IndexVector* skiplist ) +-{ +- if ( skiplist ) +- { +- skiplist->append( parent ); +- } +- +- parent = c++; +- if ( isMapLike( item ) ) +- { +- for ( const auto& subitem : item.toMap() ) +- { +- overallLength( subitem, c, parent, skiplist ); +- } +- } +- else if ( isListLike( item ) ) +- { +- for ( const auto& subitem : item.toList() ) +- { +- overallLength( subitem, c, parent, skiplist ); +- } +- } +-} +- +-static quintptr +-findNth( const VariantModel::IndexVector& skiplist, quintptr value, int n ) +-{ +- constexpr const quintptr invalid_index = static_cast< quintptr >( -1 ); +- +- if ( n < 0 ) +- { +- return invalid_index; +- } +- +- int index = static_cast< int >( value ); +- while ( ( n >= 0 ) && ( index < skiplist.count() ) ) +- { +- if ( skiplist[ index ] == value ) +- { +- if ( --n < 0 ) +- { +- // It's bigger than 0 +- return static_cast< quintptr >( index ); +- } +- } +- index++; +- } +- return invalid_index; +-} +- +- +-VariantModel::VariantModel( const QVariant* p ) +- : m_p( p ) +-{ +- reload(); +-} +- +-VariantModel::~VariantModel() {} +- +-void +-VariantModel::reload() +-{ +- constexpr const quintptr invalid_index = static_cast< quintptr >( -1 ); +- +- quintptr x = 0; +- m_rows.clear(); // Start over +- if ( m_rows.capacity() < 64 ) +- { +- m_rows.reserve( 64 ); // Start reasonably-sized +- } +- overallLength( *m_p, x, invalid_index, &m_rows ); +-} +- +-int +-VariantModel::columnCount( const QModelIndex& ) const +-{ +- return 2; +-} +- +-int +-VariantModel::rowCount( const QModelIndex& index ) const +-{ +- quintptr p = index.isValid() ? index.internalId() : 0; +- return m_rows.count( p ); +-} +- +-QModelIndex +-VariantModel::index( int row, int column, const QModelIndex& parent ) const +-{ +- quintptr p = 0; +- +- if ( parent.isValid() ) +- { +- if ( inRange( parent ) ) +- { +- p = parent.internalId(); +- } +- } +- +- return createIndex( row, column, findNth( m_rows, p, row ) ); +-} +- +-static inline quintptr +-deref( const VariantModel::IndexVector& v, quintptr i ) +-{ +- return v[ static_cast< int >( i ) ]; +-} +- +-QModelIndex +-VariantModel::parent( const QModelIndex& index ) const +-{ +- if ( !index.isValid() || !inRange( index ) ) +- { +- return QModelIndex(); +- } +- +- quintptr p = deref( m_rows, index.internalId() ); +- if ( p == 0 ) +- { +- return QModelIndex(); +- } +- +- if ( !inRange( p ) ) +- { +- return QModelIndex(); +- } +- quintptr p_pid = deref( m_rows, p ); +- int row = 0; +- for ( int i = static_cast< int >( p_pid ); i < static_cast< int >( p ); ++i ) +- { +- if ( m_rows[ i ] == p_pid ) +- { +- row++; +- } +- } +- +- return createIndex( row, index.column(), p ); +-} +- +-QVariant +-VariantModel::data( const QModelIndex& index, int role ) const +-{ +- if ( role != Qt::DisplayRole ) +- { +- return QVariant(); +- } +- +- if ( !index.isValid() ) +- { +- return QVariant(); +- } +- +- if ( ( index.column() < 0 ) || ( index.column() > 1 ) ) +- { +- return QVariant(); +- } +- +- if ( !inRange( index ) ) +- { +- return QVariant(); +- } +- +- const QVariant thing = underlying( parent( index ) ); +- +- if ( !thing.isValid() ) +- { +- return QVariant(); +- } +- +- if ( isMapLike( thing ) ) +- { +- QVariantMap the_map = thing.toMap(); +- const auto key = the_map.keys().at( index.row() ); +- if ( index.column() == 0 ) +- { +- return key; +- } +- else +- { +- return the_map[ key ]; +- } +- } +- else if ( isListLike( thing ) ) +- { +- if ( index.column() == 0 ) +- { +- return index.row(); +- } +- else +- { +- QVariantList the_list = thing.toList(); +- return the_list.at( index.row() ); +- } +- } +- else +- { +- if ( index.column() == 0 ) +- { +- return QVariant(); +- } +- else +- { +- return thing; +- } +- } +-} +- +-QVariant +-VariantModel::headerData( int section, Qt::Orientation orientation, int role ) const +-{ +- if ( role != Qt::DisplayRole ) +- { +- return QVariant(); +- } +- +- if ( orientation == Qt::Horizontal ) +- { +- if ( section == 0 ) +- { +- return tr( "Key", "Column header for key/value" ); +- } +- else if ( section == 1 ) +- { +- return tr( "Value", "Column header for key/value" ); +- } +- else +- { +- return QVariant(); +- } +- } +- else +- { +- return QVariant(); +- } +-} +- +-const QVariant +-VariantModel::underlying( const QModelIndex& index ) const +-{ +- if ( !index.isValid() ) +- { +- return *m_p; +- } +- +- const auto& thing = underlying( parent( index ) ); +- if ( isMapLike( thing ) ) +- { +- const auto& the_map = thing.toMap(); +- return the_map[ the_map.keys()[ index.row() ] ]; +- } +- else if ( isListLike( thing ) ) +- { +- return thing.toList()[ index.row() ]; +- } +- else +- { +- return thing; +- } +-} ++/* === This file is part of Calamares - === ++ * ++ * SPDX-FileCopyrightText: 2019 Adriaan de Groot ++ * SPDX-License-Identifier: GPL-3.0-or-later ++ * ++ * Calamares is Free Software: see the License-Identifier above. ++ * ++ */ ++ ++#include "VariantModel.h" ++ ++#include "compat/Variant.h" ++ ++static bool ++isMapLike( const QVariant& item ) ++{ ++ return item.canConvert< QVariantMap >(); ++} ++ ++static bool ++isListLike( const QVariant& item ) ++{ ++ return item.canConvert< QVariantList >() && !( Calamares::typeOf( item ) == Calamares::StringVariantType ); ++} ++ ++static void ++overallLength( const QVariant& item, quintptr& c, quintptr parent, VariantModel::IndexVector* skiplist ) ++{ ++ if ( skiplist ) ++ { ++ skiplist->append( parent ); ++ } ++ ++ parent = c++; ++ if ( isMapLike( item ) ) ++ { ++ for ( const auto& subitem : item.toMap() ) ++ { ++ overallLength( subitem, c, parent, skiplist ); ++ } ++ } ++ else if ( isListLike( item ) ) ++ { ++ for ( const auto& subitem : item.toList() ) ++ { ++ overallLength( subitem, c, parent, skiplist ); ++ } ++ } ++} ++ ++static quintptr ++findNth( const VariantModel::IndexVector& skiplist, quintptr value, int n ) ++{ ++ constexpr const quintptr invalid_index = static_cast< quintptr >( -1 ); ++ ++ if ( n < 0 ) ++ { ++ return invalid_index; ++ } ++ ++ int index = static_cast< int >( value ); ++ while ( ( n >= 0 ) && ( index < skiplist.count() ) ) ++ { ++ if ( skiplist[ index ] == value ) ++ { ++ if ( --n < 0 ) ++ { ++ // It's bigger than 0 ++ return static_cast< quintptr >( index ); ++ } ++ } ++ index++; ++ } ++ return invalid_index; ++} ++ ++ ++VariantModel::VariantModel( const QVariant* p ) ++ : m_p( p ) ++{ ++ reload(); ++} ++ ++VariantModel::~VariantModel() {} ++ ++void ++VariantModel::reload() ++{ ++ constexpr const quintptr invalid_index = static_cast< quintptr >( -1 ); ++ ++ quintptr x = 0; ++ m_rows.clear(); // Start over ++ if ( m_rows.capacity() < 64 ) ++ { ++ m_rows.reserve( 64 ); // Start reasonably-sized ++ } ++ overallLength( *m_p, x, invalid_index, &m_rows ); ++} ++ ++int ++VariantModel::columnCount( const QModelIndex& ) const ++{ ++ return 2; ++} ++ ++int ++VariantModel::rowCount( const QModelIndex& index ) const ++{ ++ quintptr p = index.isValid() ? index.internalId() : 0; ++ return m_rows.count( p ); ++} ++ ++QModelIndex ++VariantModel::index( int row, int column, const QModelIndex& parent ) const ++{ ++ quintptr p = 0; ++ ++ if ( parent.isValid() ) ++ { ++ if ( inRange( parent ) ) ++ { ++ p = parent.internalId(); ++ } ++ } ++ ++ return createIndex( row, column, findNth( m_rows, p, row ) ); ++} ++ ++static inline quintptr ++deref( const VariantModel::IndexVector& v, quintptr i ) ++{ ++ return v[ static_cast< int >( i ) ]; ++} ++ ++QModelIndex ++VariantModel::parent( const QModelIndex& index ) const ++{ ++ if ( !index.isValid() || !inRange( index ) ) ++ { ++ return QModelIndex(); ++ } ++ ++ quintptr p = deref( m_rows, index.internalId() ); ++ if ( p == 0 ) ++ { ++ return QModelIndex(); ++ } ++ ++ if ( !inRange( p ) ) ++ { ++ return QModelIndex(); ++ } ++ quintptr p_pid = deref( m_rows, p ); ++ int row = 0; ++ for ( int i = static_cast< int >( p_pid ); i < static_cast< int >( p ); ++i ) ++ { ++ if ( m_rows[ i ] == p_pid ) ++ { ++ row++; ++ } ++ } ++ ++ return createIndex( row, index.column(), p ); ++} ++ ++QVariant ++VariantModel::data( const QModelIndex& index, int role ) const ++{ ++ if ( role != Qt::DisplayRole ) ++ { ++ return QVariant(); ++ } ++ ++ if ( !index.isValid() ) ++ { ++ return QVariant(); ++ } ++ ++ if ( ( index.column() < 0 ) || ( index.column() > 1 ) ) ++ { ++ return QVariant(); ++ } ++ ++ if ( !inRange( index ) ) ++ { ++ return QVariant(); ++ } ++ ++ const QVariant thing = underlying( parent( index ) ); ++ ++ if ( !thing.isValid() ) ++ { ++ return QVariant(); ++ } ++ ++ if ( isMapLike( thing ) ) ++ { ++ QVariantMap the_map = thing.toMap(); ++ const auto key = the_map.keys().at( index.row() ); ++ if ( index.column() == 0 ) ++ { ++ return key; ++ } ++ else ++ { ++ return the_map[ key ]; ++ } ++ } ++ else if ( isListLike( thing ) ) ++ { ++ if ( index.column() == 0 ) ++ { ++ return index.row(); ++ } ++ else ++ { ++ QVariantList the_list = thing.toList(); ++ return the_list.at( index.row() ); ++ } ++ } ++ else ++ { ++ if ( index.column() == 0 ) ++ { ++ return QVariant(); ++ } ++ else ++ { ++ return thing; ++ } ++ } ++} ++ ++QVariant ++VariantModel::headerData( int section, Qt::Orientation orientation, int role ) const ++{ ++ if ( role != Qt::DisplayRole ) ++ { ++ return QVariant(); ++ } ++ ++ if ( orientation == Qt::Horizontal ) ++ { ++ if ( section == 0 ) ++ { ++ return tr( "Key", "Column header for key/value" ); ++ } ++ else if ( section == 1 ) ++ { ++ return tr( "Value", "Column header for key/value" ); ++ } ++ else ++ { ++ return QVariant(); ++ } ++ } ++ else ++ { ++ return QVariant(); ++ } ++} ++ ++const QVariant ++VariantModel::underlying( const QModelIndex& index ) const ++{ ++ if ( !index.isValid() ) ++ { ++ return *m_p; ++ } ++ ++ const auto& thing = underlying( parent( index ) ); ++ if ( isMapLike( thing ) ) ++ { ++ const auto& the_map = thing.toMap(); ++ return the_map[ the_map.keys()[ index.row() ] ]; ++ } ++ else if ( isListLike( thing ) ) ++ { ++ return thing.toList()[ index.row() ]; ++ } ++ else ++ { ++ return thing; ++ } ++} +diff --git a/src/calamares/VariantModel.h b/src/calamares/VariantModel.h +index 9d33231..4e47a93 100644 +--- a/src/calamares/VariantModel.h ++++ b/src/calamares/VariantModel.h +@@ -1,104 +1,104 @@ +-/* === This file is part of Calamares - === +- * +- * SPDX-FileCopyrightText: 2019 Adriaan de Groot +- * SPDX-License-Identifier: GPL-3.0-or-later +- * +- * Calamares is Free Software: see the License-Identifier above. +- * +- */ +- +-#ifndef VARIANTMODEL_H +-#define VARIANTMODEL_H +- +-#include +-#include +-#include +- +-/** @brief A model that operates directly on a QVariant +- * +- * A VariantModel operates directly on an underlying +- * QVariant, treating QVariantMap and QVariantList as +- * nodes with multiple children. In general, putting +- * a QVariantMap into a QVariant and passing that into +- * the model will get you a tree-like model of the +- * VariantMap's data structure. +- * +- * Take care of object lifetimes and that the underlying +- * QVariant does not change during use. If the QVariant +- * **does** change, call reload() to re-build the internal +- * representation of the tree. +- */ +-class VariantModel : public QAbstractItemModel +-{ +- Q_OBJECT +-public: +- /** @brief Auxiliary data +- * +- * The nodes of the tree are enumerated into a vector +- * (of length equal to the number of nodes in the tree + 1) +- * which are used to do index and parent calculations. +- */ +- using IndexVector = QVector< quintptr >; +- +- /** @brief Constructor +- * +- * The QVariant's lifetime is **not** affected by the model, +- * so take care that the QVariant lives at least as long as +- * the model). Also, don't change the QVariant underneath the model. +- */ +- VariantModel( const QVariant* p ); +- +- ~VariantModel() override; +- +- /** @brief Re-build the internal tree +- * +- * Call this when the underlying variant is changed, which +- * might impact how the tree is laid out. +- */ +- void reload(); +- +- int columnCount( const QModelIndex& index ) const override; +- int rowCount( const QModelIndex& index ) const override; +- +- QModelIndex index( int row, int column, const QModelIndex& parent ) const override; +- QModelIndex parent( const QModelIndex& index ) const override; +- QVariant data( const QModelIndex& index, int role ) const override; +- QVariant headerData( int section, Qt::Orientation orientation, int role ) const override; +- +-private: +- const QVariant* const m_p; +- +- /** @brief Tree representation of the variant. +- * +- * At index 0 in the vector , we store -1 to indicate the root. +- * +- * Then we enumerate all the elements in the tree (by traversing +- * the variant and using QVariantMap and QVariantList as having +- * children, and everything else being a leaf node) and at the index +- * for a child, store the index of its parent. This means that direct +- * children of the root store a 0 in their indexes, children of the first +- * child of the root store a 1, and we can "pointer chase" from an index +- * through parents back to index 0. +- * +- * Because of this structure, the value stored at index i must be +- * less than i (except for index 0, which is special). This makes it +- * slightly easier to search for a given value *p*, because we can start +- * at index *p* (or even *p+1*). +- * +- * Given an index *i* into the vector corresponding to a child, we know the +- * parent, but can also count which row this child should have, by counting +- * *other* indexes before *i* with the same parent (and by the ordering +- * of values, we can start counting at index *parent-index*). +- * +- */ +- IndexVector m_rows; +- +- /// @brief Implementation of walking an index through the variant-tree +- const QVariant underlying( const QModelIndex& index ) const; +- +- /// @brief Helpers for range-checking +- inline bool inRange( quintptr p ) const { return p < static_cast< quintptr >( m_rows.count() ); } +- inline bool inRange( const QModelIndex& index ) const { return inRange( index.internalId() ); } +-}; +- +-#endif ++/* === This file is part of Calamares - === ++ * ++ * SPDX-FileCopyrightText: 2019 Adriaan de Groot ++ * SPDX-License-Identifier: GPL-3.0-or-later ++ * ++ * Calamares is Free Software: see the License-Identifier above. ++ * ++ */ ++ ++#ifndef VARIANTMODEL_H ++#define VARIANTMODEL_H ++ ++#include ++#include ++#include ++ ++/** @brief A model that operates directly on a QVariant ++ * ++ * A VariantModel operates directly on an underlying ++ * QVariant, treating QVariantMap and QVariantList as ++ * nodes with multiple children. In general, putting ++ * a QVariantMap into a QVariant and passing that into ++ * the model will get you a tree-like model of the ++ * VariantMap's data structure. ++ * ++ * Take care of object lifetimes and that the underlying ++ * QVariant does not change during use. If the QVariant ++ * **does** change, call reload() to re-build the internal ++ * representation of the tree. ++ */ ++class VariantModel : public QAbstractItemModel ++{ ++ Q_OBJECT ++public: ++ /** @brief Auxiliary data ++ * ++ * The nodes of the tree are enumerated into a vector ++ * (of length equal to the number of nodes in the tree + 1) ++ * which are used to do index and parent calculations. ++ */ ++ using IndexVector = QVector< quintptr >; ++ ++ /** @brief Constructor ++ * ++ * The QVariant's lifetime is **not** affected by the model, ++ * so take care that the QVariant lives at least as long as ++ * the model). Also, don't change the QVariant underneath the model. ++ */ ++ VariantModel( const QVariant* p ); ++ ++ ~VariantModel() override; ++ ++ /** @brief Re-build the internal tree ++ * ++ * Call this when the underlying variant is changed, which ++ * might impact how the tree is laid out. ++ */ ++ void reload(); ++ ++ int columnCount( const QModelIndex& index ) const override; ++ int rowCount( const QModelIndex& index ) const override; ++ ++ QModelIndex index( int row, int column, const QModelIndex& parent ) const override; ++ QModelIndex parent( const QModelIndex& index ) const override; ++ QVariant data( const QModelIndex& index, int role ) const override; ++ QVariant headerData( int section, Qt::Orientation orientation, int role ) const override; ++ ++private: ++ const QVariant* const m_p; ++ ++ /** @brief Tree representation of the variant. ++ * ++ * At index 0 in the vector , we store -1 to indicate the root. ++ * ++ * Then we enumerate all the elements in the tree (by traversing ++ * the variant and using QVariantMap and QVariantList as having ++ * children, and everything else being a leaf node) and at the index ++ * for a child, store the index of its parent. This means that direct ++ * children of the root store a 0 in their indexes, children of the first ++ * child of the root store a 1, and we can "pointer chase" from an index ++ * through parents back to index 0. ++ * ++ * Because of this structure, the value stored at index i must be ++ * less than i (except for index 0, which is special). This makes it ++ * slightly easier to search for a given value *p*, because we can start ++ * at index *p* (or even *p+1*). ++ * ++ * Given an index *i* into the vector corresponding to a child, we know the ++ * parent, but can also count which row this child should have, by counting ++ * *other* indexes before *i* with the same parent (and by the ordering ++ * of values, we can start counting at index *parent-index*). ++ * ++ */ ++ IndexVector m_rows; ++ ++ /// @brief Implementation of walking an index through the variant-tree ++ const QVariant underlying( const QModelIndex& index ) const; ++ ++ /// @brief Helpers for range-checking ++ inline bool inRange( quintptr p ) const { return p < static_cast< quintptr >( m_rows.count() ); } ++ inline bool inRange( const QModelIndex& index ) const { return inRange( index.internalId() ); } ++}; ++ ++#endif +diff --git a/src/calamares/calamares-navigation.qml b/src/calamares/calamares-navigation.qml +index becc1b4..58c233d 100644 +--- a/src/calamares/calamares-navigation.qml ++++ b/src/calamares/calamares-navigation.qml +@@ -1,83 +1,83 @@ +-/* Sample of QML navigation. +- +- SPDX-FileCopyrightText: 2020 Adriaan de Groot +- SPDX-License-Identifier: GPL-3.0-or-later +- +- +- The navigation panel is generally "horizontal" in layout, with +- buttons for next and previous; this particular one copies +- the layout and size of the widgets panel. +-*/ +-import io.calamares.ui 1.0 +-import io.calamares.core 1.0 +- +-import QtQuick 2.3 +-import QtQuick.Controls 2.10 +-import QtQuick.Layouts 1.3 +- +-Rectangle { +- id: navigationBar; +- color: Branding.styleString( Branding.SidebarBackground ); +- height: 48; +- +- RowLayout { +- id: buttonBar +- anchors.fill: parent; +- +- Item +- { +- Layout.fillWidth: true; +- } +- +- Button +- { +- text: ViewManager.backLabel; +- icon.name: ViewManager.backIcon; +- +- enabled: ViewManager.backEnabled; +- visible: ViewManager.backAndNextVisible; +- onClicked: { ViewManager.back(); } +- } +- Button +- { +- text: ViewManager.nextLabel; +- icon.name: ViewManager.nextIcon; +- +- enabled: ViewManager.nextEnabled; +- visible: ViewManager.backAndNextVisible; +- onClicked: { ViewManager.next(); } +- // This margin goes in the "next" button, because the "quit" +- // button can vanish and we want to keep the margin to +- // the next-thing-in-the-navigation-panel around. +- Layout.rightMargin: 3 * buttonBar.spacing; +- } +- Button +- { +- Layout.rightMargin: 2 * buttonBar.spacing +- text: ViewManager.quitLabel; +- icon.name: ViewManager.quitIcon; +- +- ToolTip.visible: hovered +- ToolTip.timeout: 5000 +- ToolTip.delay: 1000 +- ToolTip.text: ViewManager.quitTooltip; +- +- /* +- * The ViewManager has settings -- user-controlled via the +- * branding component, and party based on program state -- +- * whether the quit button should be enabled and visible. +- * +- * QML navigation *should* follow this pattern, but can also +- * add other qualifications. For instance, you may have a +- * "finished" module that handles quit in its own way, and +- * want to hide the quit button then. The ViewManager has a +- * current step and a total count, so compare them: +- * +- * visible: ViewManager.quitVisible && ( ViewManager.currentStepIndex < ViewManager.rowCount()-1); +- */ +- enabled: ViewManager.quitEnabled; +- visible: ViewManager.quitVisible; +- onClicked: { ViewManager.quit(); } +- } +- } +-} ++/* Sample of QML navigation. ++ ++ SPDX-FileCopyrightText: 2020 Adriaan de Groot ++ SPDX-License-Identifier: GPL-3.0-or-later ++ ++ ++ The navigation panel is generally "horizontal" in layout, with ++ buttons for next and previous; this particular one copies ++ the layout and size of the widgets panel. ++*/ ++import io.calamares.ui 1.0 ++import io.calamares.core 1.0 ++ ++import QtQuick 2.3 ++import QtQuick.Controls 2.10 ++import QtQuick.Layouts 1.3 ++ ++Rectangle { ++ id: navigationBar; ++ color: Branding.styleString( Branding.SidebarBackground ); ++ height: 48; ++ ++ RowLayout { ++ id: buttonBar ++ anchors.fill: parent; ++ ++ Item ++ { ++ Layout.fillWidth: true; ++ } ++ ++ Button ++ { ++ text: ViewManager.backLabel; ++ icon.name: ViewManager.backIcon; ++ ++ enabled: ViewManager.backEnabled; ++ visible: ViewManager.backAndNextVisible; ++ onClicked: { ViewManager.back(); } ++ } ++ Button ++ { ++ text: ViewManager.nextLabel; ++ icon.name: ViewManager.nextIcon; ++ ++ enabled: ViewManager.nextEnabled; ++ visible: ViewManager.backAndNextVisible; ++ onClicked: { ViewManager.next(); } ++ // This margin goes in the "next" button, because the "quit" ++ // button can vanish and we want to keep the margin to ++ // the next-thing-in-the-navigation-panel around. ++ Layout.rightMargin: 3 * buttonBar.spacing; ++ } ++ Button ++ { ++ Layout.rightMargin: 2 * buttonBar.spacing ++ text: ViewManager.quitLabel; ++ icon.name: ViewManager.quitIcon; ++ ++ ToolTip.visible: hovered ++ ToolTip.timeout: 5000 ++ ToolTip.delay: 1000 ++ ToolTip.text: ViewManager.quitTooltip; ++ ++ /* ++ * The ViewManager has settings -- user-controlled via the ++ * branding component, and party based on program state -- ++ * whether the quit button should be enabled and visible. ++ * ++ * QML navigation *should* follow this pattern, but can also ++ * add other qualifications. For instance, you may have a ++ * "finished" module that handles quit in its own way, and ++ * want to hide the quit button then. The ViewManager has a ++ * current step and a total count, so compare them: ++ * ++ * visible: ViewManager.quitVisible && ( ViewManager.currentStepIndex < ViewManager.rowCount()-1); ++ */ ++ enabled: ViewManager.quitEnabled; ++ visible: ViewManager.quitVisible; ++ onClicked: { ViewManager.quit(); } ++ } ++ } ++} +diff --git a/src/calamares/calamares-sidebar.qml b/src/calamares/calamares-sidebar.qml +index 4780823..3a75d95 100644 +--- a/src/calamares/calamares-sidebar.qml ++++ b/src/calamares/calamares-sidebar.qml +@@ -1,125 +1,125 @@ +-/* Sample of QML progress tree. +- +- SPDX-FileCopyrightText: 2020 Adriaan de Groot +- SPDX-FileCopyrightText: 2021 Anke Boersma +- SPDX-License-Identifier: GPL-3.0-or-later +- +- +- The progress tree (actually a list) is generally "vertical" in layout, +- with the steps going "down", but it could also be a more compact +- horizontal layout with suitable branding settings. +- +- This example emulates the layout and size of the widgets progress tree. +-*/ +-import io.calamares.ui 1.0 +-import io.calamares.core 1.0 +- +-import QtQuick 2.3 +-import QtQuick.Layouts 1.3 +- +-Rectangle { +- id: sideBar; +- color: Branding.styleString( Branding.SidebarBackground ); +- anchors.fill: parent; +- +- ColumnLayout { +- anchors.fill: parent; +- spacing: 0; +- +- Image { +- Layout.topMargin: 12; +- Layout.bottomMargin: 12; +- Layout.alignment: Qt.AlignHCenter | Qt.AlignTop +- id: logo; +- width: 80; +- height: width; // square +- source: "file:/" + Branding.imagePath(Branding.ProductLogo); +- sourceSize.width: width; +- sourceSize.height: height; +- } +- +- Repeater { +- model: ViewManager +- Rectangle { +- Layout.leftMargin: 6; +- Layout.rightMargin: 6; +- Layout.fillWidth: true; +- height: 35; +- radius: 6; +- color: Branding.styleString( index == ViewManager.currentStepIndex ? Branding.SidebarBackgroundCurrent : Branding.SidebarBackground ); +- +- Text { +- anchors.verticalCenter: parent.verticalCenter; +- anchors.horizontalCenter: parent.horizontalCenter; +- color: Branding.styleString( index == ViewManager.currentStepIndex ? Branding.SidebarTextCurrent : Branding.SidebarText ); +- text: display; +- } +- } +- } +- +- Item { +- Layout.fillHeight: true; +- } +- +- Rectangle { +- id: metaArea +- Layout.fillWidth: true; +- height: 35 +- Layout.alignment: Qt.AlignHCenter | Qt.AlignBottom +- color: Branding.styleString( Branding.SidebarBackground ); +- visible: true; +- +- Rectangle { +- id: aboutArea +- height: 35 +- width: parent.width / 2; +- anchors.left: parent.left +- color: Branding.styleString( Branding.SidebarBackgroundCurrent ); +- visible: true; +- +- MouseArea { +- id: mouseAreaAbout +- anchors.fill: parent; +- cursorShape: Qt.PointingHandCursor +- hoverEnabled: true +- Text { +- anchors.verticalCenter: parent.verticalCenter; +- anchors.horizontalCenter: parent.horizontalCenter; +- x: parent.x + 4; +- text: qsTr("About") +- color: Branding.styleString( Branding.SidebarTextCurrent ); +- font.pointSize : 9 +- } +- +- onClicked: debug.about() +- } +- } +- +- Rectangle { +- id: debugArea +- height: 35 +- width: parent.width / 2; +- anchors.right: parent.right +- color: Branding.styleString( Branding.SidebarBackgroundCurrent ); +- visible: debug.enabled +- +- MouseArea { +- id: mouseAreaDebug +- anchors.fill: parent; +- cursorShape: Qt.PointingHandCursor +- hoverEnabled: true +- Text { +- anchors.verticalCenter: parent.verticalCenter; +- anchors.horizontalCenter: parent.horizontalCenter; +- x: parent.x + 4; +- text: qsTr("Debug") +- color: Branding.styleString( Branding.SidebarTextCurrent ); +- font.pointSize : 9 +- } +- +- onClicked: debug.toggle() +- } +- } +- } +- } +-} ++/* Sample of QML progress tree. ++ ++ SPDX-FileCopyrightText: 2020 Adriaan de Groot ++ SPDX-FileCopyrightText: 2021 Anke Boersma ++ SPDX-License-Identifier: GPL-3.0-or-later ++ ++ ++ The progress tree (actually a list) is generally "vertical" in layout, ++ with the steps going "down", but it could also be a more compact ++ horizontal layout with suitable branding settings. ++ ++ This example emulates the layout and size of the widgets progress tree. ++*/ ++import io.calamares.ui 1.0 ++import io.calamares.core 1.0 ++ ++import QtQuick 2.3 ++import QtQuick.Layouts 1.3 ++ ++Rectangle { ++ id: sideBar; ++ color: Branding.styleString( Branding.SidebarBackground ); ++ anchors.fill: parent; ++ ++ ColumnLayout { ++ anchors.fill: parent; ++ spacing: 0; ++ ++ Image { ++ Layout.topMargin: 12; ++ Layout.bottomMargin: 12; ++ Layout.alignment: Qt.AlignHCenter | Qt.AlignTop ++ id: logo; ++ width: 80; ++ height: width; // square ++ source: "file:/" + Branding.imagePath(Branding.ProductLogo); ++ sourceSize.width: width; ++ sourceSize.height: height; ++ } ++ ++ Repeater { ++ model: ViewManager ++ Rectangle { ++ Layout.leftMargin: 6; ++ Layout.rightMargin: 6; ++ Layout.fillWidth: true; ++ height: 35; ++ radius: 6; ++ color: Branding.styleString( index == ViewManager.currentStepIndex ? Branding.SidebarBackgroundCurrent : Branding.SidebarBackground ); ++ ++ Text { ++ anchors.verticalCenter: parent.verticalCenter; ++ anchors.horizontalCenter: parent.horizontalCenter; ++ color: Branding.styleString( index == ViewManager.currentStepIndex ? Branding.SidebarTextCurrent : Branding.SidebarText ); ++ text: display; ++ } ++ } ++ } ++ ++ Item { ++ Layout.fillHeight: true; ++ } ++ ++ Rectangle { ++ id: metaArea ++ Layout.fillWidth: true; ++ height: 35 ++ Layout.alignment: Qt.AlignHCenter | Qt.AlignBottom ++ color: Branding.styleString( Branding.SidebarBackground ); ++ visible: true; ++ ++ Rectangle { ++ id: aboutArea ++ height: 35 ++ width: parent.width / 2; ++ anchors.left: parent.left ++ color: Branding.styleString( Branding.SidebarBackgroundCurrent ); ++ visible: true; ++ ++ MouseArea { ++ id: mouseAreaAbout ++ anchors.fill: parent; ++ cursorShape: Qt.PointingHandCursor ++ hoverEnabled: true ++ Text { ++ anchors.verticalCenter: parent.verticalCenter; ++ anchors.horizontalCenter: parent.horizontalCenter; ++ x: parent.x + 4; ++ text: qsTr("About") ++ color: Branding.styleString( Branding.SidebarTextCurrent ); ++ font.pointSize : 9 ++ } ++ ++ onClicked: debug.about() ++ } ++ } ++ ++ Rectangle { ++ id: debugArea ++ height: 35 ++ width: parent.width / 2; ++ anchors.right: parent.right ++ color: Branding.styleString( Branding.SidebarBackgroundCurrent ); ++ visible: debug.enabled ++ ++ MouseArea { ++ id: mouseAreaDebug ++ anchors.fill: parent; ++ cursorShape: Qt.PointingHandCursor ++ hoverEnabled: true ++ Text { ++ anchors.verticalCenter: parent.verticalCenter; ++ anchors.horizontalCenter: parent.horizontalCenter; ++ x: parent.x + 4; ++ text: qsTr("Debug") ++ color: Branding.styleString( Branding.SidebarTextCurrent ); ++ font.pointSize : 9 ++ } ++ ++ onClicked: debug.toggle() ++ } ++ } ++ } ++ } ++} +diff --git a/src/calamares/calamares.qrc b/src/calamares/calamares.qrc +index 5733ea0..8517bad 100644 +--- a/src/calamares/calamares.qrc ++++ b/src/calamares/calamares.qrc +@@ -1,10 +1,10 @@ +- +- +- +- +- calamares-sidebar.qml +- calamares-navigation.qml +- +- ++ ++ ++ ++ ++ calamares-sidebar.qml ++ calamares-navigation.qml ++ ++ +diff --git a/src/calamares/main.cpp b/src/calamares/main.cpp +index e0491e5..af1b13a 100644 +--- a/src/calamares/main.cpp ++++ b/src/calamares/main.cpp +@@ -1,154 +1,154 @@ +-/* === This file is part of Calamares - === +- * +- * SPDX-FileCopyrightText: 2014 Teo Mrnjavac +- * SPDX-FileCopyrightText: 2017-2020 Adriaan de Groot +- * SPDX-License-Identifier: GPL-3.0-or-later +- * +- * Calamares is Free Software: see the License-Identifier above. +- * +- */ +- +-#include "CalamaresApplication.h" +- +-#include "Settings.h" +-#include "utils/Dirs.h" +-#include "utils/Logger.h" +-#include "utils/Retranslator.h" +- +-// From 3rdparty/ +-#include "kdsingleapplication.h" +- +-#include +-#ifdef BUILD_CRASH_REPORTING +-#include +-#endif +- +-#include +-#include +-#include +- +-#include +- +-/** @brief Gets debug-level from -D command-line-option +- * +- * If unset, use LOGERROR (corresponding to -D1), although +- * effectively -D2 is the lowest level you can set for +- * logging-to-the-console, and everything always gets +- * logged to the session file). +- */ +-static unsigned int +-debug_level( QCommandLineParser& parser, QCommandLineOption& levelOption ) +-{ +- if ( !parser.isSet( levelOption ) ) +- { +- return Logger::LOGERROR; +- } +- +- bool ok = true; +- int l = parser.value( levelOption ).toInt( &ok ); +- if ( !ok || ( l < 0 ) ) +- { +- return Logger::LOGVERBOSE; +- } +- else +- { +- return static_cast< unsigned int >( l ); // l >= 0 +- } +-} +- +-/** @brief Handles the command-line arguments +- * +- * Sets up internals for Calamares based on command-line arguments like `-D`, +- * `-d`, etc. Returns @c true if this is a *debug* run, i.e. if the `-d` +- * command-line flag is given, @c false otherwise. +- */ +-static bool +-handle_args( CalamaresApplication& a ) +-{ +- QCommandLineOption debugOption( QStringList { "d", "debug" }, +- "Also look in current directory for configuration. Implies -D8." ); +- QCommandLineOption debugLevelOption( +- QStringLiteral( "D" ), "Verbose output for debugging purposes (0-8).", "level" ); +- QCommandLineOption debugTxOption( QStringList { "T", "debug-translation" }, +- "Also look in the current directory for translation." ); +- +- QCommandLineOption configOption( +- QStringList { "c", "config" }, "Configuration directory to use, for testing purposes.", "config" ); +- QCommandLineOption xdgOption( QStringList { "X", "xdg-config" }, "Use XDG_{CONFIG,DATA}_DIRS as well." ); +- +- QCommandLineParser parser; +- parser.setApplicationDescription( "Distribution-independent installer framework" ); +- parser.addHelpOption(); +- parser.addVersionOption(); +- +- parser.addOption( debugOption ); +- parser.addOption( debugLevelOption ); +- parser.addOption( configOption ); +- parser.addOption( xdgOption ); +- parser.addOption( debugTxOption ); +- +- parser.process( a ); +- +- Logger::setupLogLevel( parser.isSet( debugOption ) ? Logger::LOGVERBOSE : debug_level( parser, debugLevelOption ) ); +- if ( parser.isSet( configOption ) ) +- { +- Calamares::setAppDataDir( QDir( parser.value( configOption ) ) ); +- } +- if ( parser.isSet( xdgOption ) ) +- { +- Calamares::setXdgDirs(); +- } +- Calamares::setAllowLocalTranslation( parser.isSet( debugOption ) || parser.isSet( debugTxOption ) ); +- +- return parser.isSet( debugOption ); +-} +- +-int +-main( int argc, char* argv[] ) +-{ +-#if QT_VERSION < QT_VERSION_CHECK( 6, 0, 0 ) +- // Not needed in Qt6 +- QApplication::setAttribute( Qt::AA_EnableHighDpiScaling ); +-#endif +- CalamaresApplication a( argc, argv ); +- +- KAboutData aboutData( "calamares", +- "Calamares", +- a.applicationVersion(), +- "The universal system installer", +- KAboutLicense::GPL_V3, +- QString(), +- QString(), +- "https://calamares.io", +- "https://github.com/calamares/calamares/issues" ); +- KAboutData::setApplicationData( aboutData ); +- a.setApplicationDisplayName( QString() ); // To avoid putting an extra "Calamares/" into the log-file +- +-#ifdef BUILD_CRASH_REPORTING +- KCrash::initialize(); +- // KCrash::setCrashHandler(); +- KCrash::setDrKonqiEnabled( true ); +- KCrash::setFlags( KCrash::SaferDialog | KCrash::AlwaysDirectly ); +-#endif +- +- std::unique_ptr< KDSingleApplication > possiblyUnique; +- const bool is_debug = handle_args( a ); +- if ( !is_debug ) +- { +- possiblyUnique = std::make_unique< KDSingleApplication >(); +- if ( !possiblyUnique->isPrimaryInstance() ) +- { +- qCritical() << "Calamares is already running."; +- return 87; // EUSERS on Linux +- } +- } +- +- Calamares::Settings::init( is_debug ); +- if ( !Calamares::Settings::instance() || !Calamares::Settings::instance()->isValid() ) +- { +- qCritical() << "Calamares has invalid settings, shutting down."; +- return 78; // EX_CONFIG on FreeBSD +- } +- a.init(); +- return a.exec(); +-} ++/* === This file is part of Calamares - === ++ * ++ * SPDX-FileCopyrightText: 2014 Teo Mrnjavac ++ * SPDX-FileCopyrightText: 2017-2020 Adriaan de Groot ++ * SPDX-License-Identifier: GPL-3.0-or-later ++ * ++ * Calamares is Free Software: see the License-Identifier above. ++ * ++ */ ++ ++#include "CalamaresApplication.h" ++ ++#include "Settings.h" ++#include "utils/Dirs.h" ++#include "utils/Logger.h" ++#include "utils/Retranslator.h" ++ ++// From 3rdparty/ ++#include "kdsingleapplication.h" ++ ++#include ++#ifdef BUILD_CRASH_REPORTING ++#include ++#endif ++ ++#include ++#include ++#include ++ ++#include ++ ++/** @brief Gets debug-level from -D command-line-option ++ * ++ * If unset, use LOGERROR (corresponding to -D1), although ++ * effectively -D2 is the lowest level you can set for ++ * logging-to-the-console, and everything always gets ++ * logged to the session file). ++ */ ++static unsigned int ++debug_level( QCommandLineParser& parser, QCommandLineOption& levelOption ) ++{ ++ if ( !parser.isSet( levelOption ) ) ++ { ++ return Logger::LOGERROR; ++ } ++ ++ bool ok = true; ++ int l = parser.value( levelOption ).toInt( &ok ); ++ if ( !ok || ( l < 0 ) ) ++ { ++ return Logger::LOGVERBOSE; ++ } ++ else ++ { ++ return static_cast< unsigned int >( l ); // l >= 0 ++ } ++} ++ ++/** @brief Handles the command-line arguments ++ * ++ * Sets up internals for Calamares based on command-line arguments like `-D`, ++ * `-d`, etc. Returns @c true if this is a *debug* run, i.e. if the `-d` ++ * command-line flag is given, @c false otherwise. ++ */ ++static bool ++handle_args( CalamaresApplication& a ) ++{ ++ QCommandLineOption debugOption( QStringList { "d", "debug" }, ++ "Also look in current directory for configuration. Implies -D8." ); ++ QCommandLineOption debugLevelOption( ++ QStringLiteral( "D" ), "Verbose output for debugging purposes (0-8).", "level" ); ++ QCommandLineOption debugTxOption( QStringList { "T", "debug-translation" }, ++ "Also look in the current directory for translation." ); ++ ++ QCommandLineOption configOption( ++ QStringList { "c", "config" }, "Configuration directory to use, for testing purposes.", "config" ); ++ QCommandLineOption xdgOption( QStringList { "X", "xdg-config" }, "Use XDG_{CONFIG,DATA}_DIRS as well." ); ++ ++ QCommandLineParser parser; ++ parser.setApplicationDescription( "Distribution-independent installer framework" ); ++ parser.addHelpOption(); ++ parser.addVersionOption(); ++ ++ parser.addOption( debugOption ); ++ parser.addOption( debugLevelOption ); ++ parser.addOption( configOption ); ++ parser.addOption( xdgOption ); ++ parser.addOption( debugTxOption ); ++ ++ parser.process( a ); ++ ++ Logger::setupLogLevel( parser.isSet( debugOption ) ? Logger::LOGVERBOSE : debug_level( parser, debugLevelOption ) ); ++ if ( parser.isSet( configOption ) ) ++ { ++ Calamares::setAppDataDir( QDir( parser.value( configOption ) ) ); ++ } ++ if ( parser.isSet( xdgOption ) ) ++ { ++ Calamares::setXdgDirs(); ++ } ++ Calamares::setAllowLocalTranslation( parser.isSet( debugOption ) || parser.isSet( debugTxOption ) ); ++ ++ return parser.isSet( debugOption ); ++} ++ ++int ++main( int argc, char* argv[] ) ++{ ++#if QT_VERSION < QT_VERSION_CHECK( 6, 0, 0 ) ++ // Not needed in Qt6 ++ QApplication::setAttribute( Qt::AA_EnableHighDpiScaling ); ++#endif ++ CalamaresApplication a( argc, argv ); ++ ++ KAboutData aboutData( "calamares", ++ "Calamares", ++ a.applicationVersion(), ++ "The universal system installer", ++ KAboutLicense::GPL_V3, ++ QString(), ++ QString(), ++ "https://calamares.io", ++ "https://github.com/calamares/calamares/issues" ); ++ KAboutData::setApplicationData( aboutData ); ++ a.setApplicationDisplayName( QString() ); // To avoid putting an extra "Calamares/" into the log-file ++ ++#ifdef BUILD_CRASH_REPORTING ++ KCrash::initialize(); ++ // KCrash::setCrashHandler(); ++ KCrash::setDrKonqiEnabled( true ); ++ KCrash::setFlags( KCrash::SaferDialog | KCrash::AlwaysDirectly ); ++#endif ++ ++ std::unique_ptr< KDSingleApplication > possiblyUnique; ++ const bool is_debug = handle_args( a ); ++ if ( !is_debug ) ++ { ++ possiblyUnique = std::make_unique< KDSingleApplication >(); ++ if ( !possiblyUnique->isPrimaryInstance() ) ++ { ++ qCritical() << "Calamares is already running."; ++ return 87; // EUSERS on Linux ++ } ++ } ++ ++ Calamares::Settings::init( is_debug ); ++ if ( !Calamares::Settings::instance() || !Calamares::Settings::instance()->isValid() ) ++ { ++ qCritical() << "Calamares has invalid settings, shutting down."; ++ return 78; // EX_CONFIG on FreeBSD ++ } ++ a.init(); ++ return a.exec(); ++} +diff --git a/src/calamares/progresstree/ProgressTreeDelegate.cpp b/src/calamares/progresstree/ProgressTreeDelegate.cpp +index f0a2470..5b988d6 100644 +--- a/src/calamares/progresstree/ProgressTreeDelegate.cpp ++++ b/src/calamares/progresstree/ProgressTreeDelegate.cpp +@@ -1,210 +1,212 @@ +-/* === This file is part of Calamares - === +- * +- * SPDX-FileCopyrightText: 2014-2015 Teo Mrnjavac +- * SPDX-FileCopyrightText: 2017 Adriaan de Groot +- * SPDX-License-Identifier: GPL-3.0-or-later +- * +- * Calamares is Free Software: see the License-Identifier above. +- * +- */ +- +-#include "ProgressTreeDelegate.h" +- +-#include "Branding.h" +-#include "CalamaresApplication.h" +-#include "CalamaresWindow.h" +-#include "ViewManager.h" +-#include "utils/Gui.h" +-#include "utils/Logger.h" +- +-#include +-#include +-static constexpr int const item_margin = 8; +-static inline int +-item_fontsize() +-{ +- return Calamares::defaultFontSize(); +-} +-static bool contains(const std::vector& vec,const QString& value){ +- for(const QString& v : vec){ +- if(v==value){ +- return true; +- } +- } +- return false; +-} +-static QString getTypeOfStep(const QString& stepString){ +- std::vector baseSetting1 = {"Location","Keyboard"}; +- std::vector userSetting1 = {"Users","Packages"}; +- std::vector installSteps1 = {"Partitions","Summary","Install","Finish"}; +- std::vector baseSetting2 = {"位置","键盘"}; +- std::vector userSetting2 = {"用户","桌面"}; +- std::vector installSteps2 = {"分区","摘要","安装","结束"}; +- std::vector baseSetting3 = {"位置", "鍵盤"}; +- std::vector userSetting3 = {"使用者", "軟體包"}; +- std::vector installSteps3 = {"分割區", "總覽", "安裝", "完成"}; +- // 获取当前系统的语言设置 +- QLocale locale; +- QLocale::Language lang = locale.language(); +- +- // 将语言枚举值转换为字符串 +- QString languageString = QLocale::languageToString(lang); +- QLocale::Country country = locale.country(); +- +- // 将地区枚举值转换为字符串 +- QString countryString = QLocale::countryToString(country); +- if(contains(baseSetting1,stepString)){ +- return "BaseSetting"; +- } +- if(contains(userSetting1,stepString)){ +- return "UserSetting"; +- } +- if(contains(installSteps1,stepString)){ +- return "InstallSetting"; +- } +- if(contains(baseSetting2,stepString) && countryString=="China"){ +- return "基础设置"; +- } +- if(contains(userSetting2,stepString) && countryString=="China"){ +- return "用户设置"; +- } +- if(contains(installSteps2,stepString) && countryString=="China"){ +- return "安装设置"; +- } +- if (contains(baseSetting3, stepString) && countryString=="Taiwan") { +- return "基礎設定"; +- } +- if (contains(userSetting3, stepString) && countryString=="Taiwan"){ +- return "使用者設定"; +- } +- if (contains(installSteps3, stepString) && countryString=="Taiwan") { +- return "安裝設定"; +- } +- return 0; +-} +-static int getTypeOfStep(int val){ +- if(val<=1){ +- return 1; +- } +- else if(val<=3){ +- return 2; +- } +- else if(val<=8){ +- return 3; +- } +- else{ +- return 0; +- } +-} +-static bool isVisable(const QString& stepString){ +- std::vector installSteps = {"鍵盤", "軟體包", "總覽", "安裝", "完成", +- "Keyboard","Packages","Summary","Install","Finish", +- "键盘","桌面","摘要","安装","结束"}; +- return !contains(installSteps, stepString); +-} +-static void +-paintViewStep( QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index ) +-{ +- QRect textRect = option.rect.adjusted( item_margin, item_margin, -item_margin, -item_margin ); +- QFont font = qApp->font(); +- font.setPointSize( item_fontsize() ); +- font.setBold( false ); +- painter->setFont( font ); +- +- int CurrentTypeOfStep = getTypeOfStep(index.data( Calamares::ViewManager::ProgressTreeItemCurrentIndex ).toInt()); +- int TypeOfStep = getTypeOfStep(index.row()); +- if ( CurrentTypeOfStep == TypeOfStep ) +- { +- painter->setPen( Calamares::Branding::instance()->styleString( Calamares::Branding::SidebarTextCurrent ) ); +- QString textHighlight +- = Calamares::Branding::instance()->styleString( Calamares::Branding::SidebarBackgroundCurrent ); +- if ( textHighlight.isEmpty() ) +- { +- painter->setBrush( CalamaresApplication::instance()->mainWindow()->palette().window() ); +- } +- else +- { +- painter->setBrush( QColor( textHighlight ) ); +- } +- } +- +- // Draw the text at least once. If it doesn't fit, then shrink the font +- // being used by 1 pt on each iteration, up to a maximum of maximumShrink +- // times. On each loop, we'll have to blank out the rectangle again, so this +- // is an expensive (in terms of drawing operations) thing to do. +- // +- // (The loop uses <= because the counter is incremented at the start). +- static constexpr int const maximumShrink = 4; +- int shrinkSteps = 0; +- do +- { +- +- shrinkSteps++; +- +- QRectF boundingBox; +- QString text; +- if(index.data().toString()=="欢迎" || index.data().toString()=="Welcome"||!isVisable(index.data().toString())){ +- text = ""; +- }else{ +- text = getTypeOfStep(index.data().toString()); +- painter->fillRect( option.rect, painter->brush().color() ); +- } +- painter->drawText( +- textRect, Qt::AlignHCenter | Qt::AlignVCenter | Qt::TextSingleLine, text, &boundingBox ); +- +- // The extra check here is to avoid the changing-font-size if we're not going to use +- // it in the next iteration of the loop anyway. +- if ( ( shrinkSteps <= maximumShrink ) && ( boundingBox.width() > textRect.width() ) ) +- { +- font.setPointSize( item_fontsize() ); +- painter->setFont( font ); +- } +- else +- { +- break; // It fits +- } +- } while ( shrinkSteps <= maximumShrink ); +-} +- +-QSize +-ProgressTreeDelegate::sizeHint( const QStyleOptionViewItem& option, const QModelIndex& index ) const +-{ +- if ( !index.isValid() ) +- { +- return option.rect.size(); +- } +- +- QFont font = qApp->font(); +- +- font.setPointSize( item_fontsize() ); +- QFontMetrics fm( font ); +- int height = fm.height(); +- height += 2 * item_margin; +- if(index.data().toString()=="欢迎" || index.data().toString()=="Welcome"||!isVisable(index.data().toString())){ +- return QSize( 0, 0 ); +- }else{ +- return QSize( (Calamares::windowMinimumWidth*0.9)/3, height*2 ); +- } +- +-} +- +-void +-ProgressTreeDelegate::paint( QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index ) const +-{ +- QStyleOptionViewItem opt = option; +- +- painter->save(); +- +- initStyleOption( &opt, index ); +- opt.text.clear(); +- +- painter->setBrush( +- QColor( Calamares::Branding::instance()->styleString( Calamares::Branding::SidebarBackground ) ) ); +- painter->setPen( QColor( Calamares::Branding::instance()->styleString( Calamares::Branding::SidebarText ) ) ); +- if(index.data().toString()=="欢迎" || index.data().toString()=="Welcome"){ +- }else{ +- paintViewStep( painter, opt, index ); +- } +- +- painter->restore(); +-} ++/* === This file is part of Calamares - === ++ * ++ * SPDX-FileCopyrightText: 2014-2015 Teo Mrnjavac ++ * SPDX-FileCopyrightText: 2017 Adriaan de Groot ++ * SPDX-License-Identifier: GPL-3.0-or-later ++ * ++ * Calamares is Free Software: see the License-Identifier above. ++ * ++ */ ++ ++#include "ProgressTreeDelegate.h" ++ ++#include "Branding.h" ++#include "CalamaresApplication.h" ++#include "CalamaresWindow.h" ++#include "ViewManager.h" ++#include "utils/Gui.h" ++#include "utils/Logger.h" ++ ++#include ++#include ++static constexpr int const item_margin = 8; ++static inline int ++item_fontsize() ++{ ++ return Calamares::defaultFontSize(); ++} ++static bool contains(const std::vector& vec,const QString& value){ ++ for(const QString& v : vec){ ++ if(v==value){ ++ return true; ++ } ++ } ++ return false; ++} ++static QString getTypeOfStep(const QString& stepString){ ++ std::vector baseSetting1 = {"Location","Keyboard"}; ++ std::vector userSetting1 = {"Users","Packages"}; ++ std::vector installSteps1 = {"Partitions","Summary","Install","Finish"}; ++ std::vector baseSetting2 = {"位置","键盘"}; ++ std::vector userSetting2 = {"用户","桌面"}; ++ std::vector installSteps2 = {"分区","摘要","安装","结束"}; ++ std::vector baseSetting3 = {"位置", "鍵盤"}; ++ std::vector userSetting3 = {"使用者", "軟體包"}; ++ std::vector installSteps3 = {"分割區", "總覽", "安裝", "完成"}; ++ // 获取当前系统的语言设置 ++ QLocale locale; ++ QLocale::Language lang = locale.language(); ++ ++ // 将语言枚举值转换为字符串 ++ QString languageString = QLocale::languageToString(lang); ++ QLocale::Country country = locale.country(); ++ ++ // 将地区枚举值转换为字符串 ++ QString countryString = QLocale::countryToString(country); ++ // 输出当前语言 ++ if(contains(baseSetting1,stepString)){ ++ return "BaseSetting"; ++ } ++ if(contains(userSetting1,stepString)){ ++ return "UserSetting"; ++ } ++ if(contains(installSteps1,stepString)){ ++ return "InstallSetting"; ++ } ++ if(contains(baseSetting2,stepString) && countryString=="China"){ ++ return "基础设置"; ++ } ++ if(contains(userSetting2,stepString) && countryString=="China"){ ++ return "用户设置"; ++ } ++ if(contains(installSteps2,stepString) && countryString=="China"){ ++ return "安装设置"; ++ } ++ if (contains(baseSetting3, stepString) && countryString=="Taiwan") { ++ return "基礎設定"; ++ } ++ if (contains(userSetting3, stepString) && countryString=="Taiwan"){ ++ return "使用者設定"; ++ } ++ if (contains(installSteps3, stepString) && countryString=="Taiwan") { ++ return "安裝設定"; ++ } ++ return 0; ++} ++static int getTypeOfStep(int val){ ++ if(val<=1){ ++ return 1; ++ } ++ else if(val<=3){ ++ return 2; ++ } ++ else if(val<=8){ ++ return 3; ++ } ++ else{ ++ return 0; ++ } ++} ++static bool isVisable(const QString& stepString){ ++ std::vector installSteps = {"鍵盤", "軟體包", "總覽", "安裝", "完成", ++ "Keyboard","Packages","Summary","Install","Finish", ++ "键盘","桌面","摘要","安装","结束"}; ++ return !contains(installSteps, stepString); ++} ++static void ++paintViewStep( QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index ) ++{ ++ QRect textRect = option.rect.adjusted( item_margin, item_margin, -item_margin, -item_margin ); ++ QFont font = qApp->font(); ++ font.setPointSize( item_fontsize() ); ++ font.setBold( false ); ++ painter->setFont( font ); ++ ++ int CurrentTypeOfStep = getTypeOfStep(index.data( Calamares::ViewManager::ProgressTreeItemCurrentIndex ).toInt()); ++ int TypeOfStep = getTypeOfStep(index.row()); ++ if ( CurrentTypeOfStep == TypeOfStep ) ++ { ++ painter->setPen( Calamares::Branding::instance()->styleString( Calamares::Branding::SidebarTextCurrent ) ); ++ QString textHighlight ++ = Calamares::Branding::instance()->styleString( Calamares::Branding::SidebarBackgroundCurrent ); ++ if ( textHighlight.isEmpty() ) ++ { ++ painter->setBrush( CalamaresApplication::instance()->mainWindow()->palette().window() ); ++ } ++ else ++ { ++ painter->setBrush( QColor( textHighlight ) ); ++ } ++ } ++ ++ // Draw the text at least once. If it doesn't fit, then shrink the font ++ // being used by 1 pt on each iteration, up to a maximum of maximumShrink ++ // times. On each loop, we'll have to blank out the rectangle again, so this ++ // is an expensive (in terms of drawing operations) thing to do. ++ // ++ // (The loop uses <= because the counter is incremented at the start). ++ static constexpr int const maximumShrink = 4; ++ int shrinkSteps = 0; ++ do ++ { ++ ++ shrinkSteps++; ++ ++ QRectF boundingBox; ++ QString text; ++ if(index.data().toString()=="欢迎" || index.data().toString()=="Welcome"||!isVisable(index.data().toString())){ ++ text = ""; ++ }else{ ++ text = getTypeOfStep(index.data().toString()); ++ painter->fillRect( option.rect, painter->brush().color() ); ++ } ++ painter->drawText( ++ textRect, Qt::AlignHCenter | Qt::AlignVCenter | Qt::TextSingleLine, text, &boundingBox ); ++ ++ // The extra check here is to avoid the changing-font-size if we're not going to use ++ // it in the next iteration of the loop anyway. ++ if ( ( shrinkSteps <= maximumShrink ) && ( boundingBox.width() > textRect.width() ) ) ++ { ++ font.setPointSize( item_fontsize() ); ++ painter->setFont( font ); ++ } ++ else ++ { ++ break; // It fits ++ } ++ } while ( shrinkSteps <= maximumShrink ); ++} ++ ++QSize ++ProgressTreeDelegate::sizeHint( const QStyleOptionViewItem& option, const QModelIndex& index ) const ++{ ++ if ( !index.isValid() ) ++ { ++ return option.rect.size(); ++ } ++ ++ QFont font = qApp->font(); ++ ++ font.setPointSize( item_fontsize() ); ++ QFontMetrics fm( font ); ++ int height = fm.height(); ++ height += 2 * item_margin; ++ if(index.data().toString()=="欢迎" || index.data().toString()=="Welcome"||!isVisable(index.data().toString())){ ++ return QSize( 0, 0 ); ++ }else{ ++ return QSize( (Calamares::windowMinimumWidth*0.9)/3, height*2 ); ++ } ++ ++} ++ ++void ++ProgressTreeDelegate::paint( QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index ) const ++{ ++ QStyleOptionViewItem opt = option; ++ ++ painter->save(); ++ ++ initStyleOption( &opt, index ); ++ opt.text.clear(); ++ ++ painter->setBrush( ++ QColor( Calamares::Branding::instance()->styleString( Calamares::Branding::SidebarBackground ) ) ); ++ painter->setPen( QColor( Calamares::Branding::instance()->styleString( Calamares::Branding::SidebarText ) ) ); ++ if(index.data().toString()=="欢迎" || index.data().toString()=="Welcome"){ ++ ++ }else{ ++ paintViewStep( painter, opt, index ); ++ } ++ ++ painter->restore(); ++} +diff --git a/src/calamares/progresstree/ProgressTreeDelegate.h b/src/calamares/progresstree/ProgressTreeDelegate.h +index d5a5abc..af4fef9 100644 +--- a/src/calamares/progresstree/ProgressTreeDelegate.h ++++ b/src/calamares/progresstree/ProgressTreeDelegate.h +@@ -1,31 +1,31 @@ +-/* === This file is part of Calamares - === +- * +- * SPDX-FileCopyrightText: 2014-2015 Teo Mrnjavac +- * SPDX-FileCopyrightText: 2019 Adriaan de Groot +- * SPDX-License-Identifier: GPL-3.0-or-later +- * +- * Calamares is Free Software: see the License-Identifier above. +- * +- */ +- +-#ifndef PROGRESSTREEDELEGATE_H +-#define PROGRESSTREEDELEGATE_H +- +-#include +- +-/** +- * @brief The ProgressTreeDelegate class customizes the look and feel of the +- * ProgressTreeView elements. +- * @see ProgressTreeView +- */ +-class ProgressTreeDelegate : public QStyledItemDelegate +-{ +-public: +- using QStyledItemDelegate::QStyledItemDelegate; +- +-protected: +- QSize sizeHint( const QStyleOptionViewItem& option, const QModelIndex& index ) const override; +- void paint( QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index ) const override; +-}; +- +-#endif // PROGRESSTREEDELEGATE_H ++/* === This file is part of Calamares - === ++ * ++ * SPDX-FileCopyrightText: 2014-2015 Teo Mrnjavac ++ * SPDX-FileCopyrightText: 2019 Adriaan de Groot ++ * SPDX-License-Identifier: GPL-3.0-or-later ++ * ++ * Calamares is Free Software: see the License-Identifier above. ++ * ++ */ ++ ++#ifndef PROGRESSTREEDELEGATE_H ++#define PROGRESSTREEDELEGATE_H ++ ++#include ++ ++/** ++ * @brief The ProgressTreeDelegate class customizes the look and feel of the ++ * ProgressTreeView elements. ++ * @see ProgressTreeView ++ */ ++class ProgressTreeDelegate : public QStyledItemDelegate ++{ ++public: ++ using QStyledItemDelegate::QStyledItemDelegate; ++ ++protected: ++ QSize sizeHint( const QStyleOptionViewItem& option, const QModelIndex& index ) const override; ++ void paint( QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index ) const override; ++}; ++ ++#endif // PROGRESSTREEDELEGATE_H +diff --git a/src/calamares/progresstree/ProgressTreeView.cpp b/src/calamares/progresstree/ProgressTreeView.cpp +index cdbafeb..5ea761c 100644 +--- a/src/calamares/progresstree/ProgressTreeView.cpp ++++ b/src/calamares/progresstree/ProgressTreeView.cpp +@@ -1,79 +1,75 @@ +-/* === This file is part of Calamares - === +- * +- * SPDX-FileCopyrightText: 2014 Teo Mrnjavac +- * SPDX-License-Identifier: GPL-3.0-or-later +- * +- * Calamares is Free Software: see the License-Identifier above. +- * +- */ +- +-#include "ProgressTreeView.h" +- +-#include "ProgressTreeDelegate.h" +- +-#include "Branding.h" +-#include "ViewManager.h" +-#include "utils/Logger.h" +- +-ProgressTreeView::ProgressTreeView( QWidget* parent ) +- : QListView( parent ) +-{ +- this->setObjectName( "sidebarMenuApp" ); +- setFrameShape( QFrame::NoFrame ); +- setContentsMargins( 0, 0, 0, 0 ); +- +- setFlow(QListView::LeftToRight);// +- setSelectionMode( QAbstractItemView::NoSelection ); +- setDragDropMode( QAbstractItemView::NoDragDrop ); +- setAcceptDrops( false ); +-// setVisible( false); +- +- setItemDelegate( new ProgressTreeDelegate( this ) ); +- +- QPalette plt = palette(); +- plt.setColor( QPalette::Base, +- Calamares::Branding::instance()->styleString( Calamares::Branding::SidebarBackground ) ); +- setPalette( plt ); +-// connect(parent, SIGNAL(currentStepChanged(int)), this, SLOT(updateVisibility(int))); +- connect( Calamares::ViewManager::instance(), +- &Calamares::ViewManager::currentStepChanged, +- this, +- &ProgressTreeView::updateVisibility, +- Qt::UniqueConnection ); +-// connect(viewManager, &ViewManager::currentStepChanged, this, &ProgressTreeView::updateVisibility); +-} +- +- +-ProgressTreeView::~ProgressTreeView() {} +- +- +- +-void +-ProgressTreeView::setModel( QAbstractItemModel* model ) +-{ +- if ( ProgressTreeView::model() ) +- { +- return; +- } +- +- QListView::setModel( model ); +- +- connect( Calamares::ViewManager::instance(), +- &Calamares::ViewManager::currentStepChanged, +- this, +- &ProgressTreeView::update, +- Qt::UniqueConnection ); +-} +- +-void +-ProgressTreeView::update() +-{ +- viewport()->update(); +-} +- +-void +-ProgressTreeView::updateVisibility(int currentStep) +-{ +- // 在第一个步骤隐藏,其他步骤显示 +- this->setVisible(currentStep > 0); +-} ++/* === This file is part of Calamares - === ++ * ++ * SPDX-FileCopyrightText: 2014 Teo Mrnjavac ++ * SPDX-License-Identifier: GPL-3.0-or-later ++ * ++ * Calamares is Free Software: see the License-Identifier above. ++ * ++ */ ++ ++#include "ProgressTreeView.h" ++ ++#include "ProgressTreeDelegate.h" ++ ++#include "Branding.h" ++#include "ViewManager.h" ++#include "utils/Logger.h" ++ ++ProgressTreeView::ProgressTreeView( QWidget* parent ) ++ : QListView( parent ) ++{ ++ this->setObjectName( "sidebarMenuApp" ); ++ setFrameShape( QFrame::NoFrame ); ++ setContentsMargins( 0, 0, 0, 0 ); ++ ++ setFlow(QListView::LeftToRight); ++ setSelectionMode( QAbstractItemView::NoSelection ); ++ setDragDropMode( QAbstractItemView::NoDragDrop ); ++ setAcceptDrops( false ); ++ ++ setItemDelegate( new ProgressTreeDelegate( this ) ); ++ ++ QPalette plt = palette(); ++ plt.setColor( QPalette::Base, ++ Calamares::Branding::instance()->styleString( Calamares::Branding::SidebarBackground ) ); ++ setPalette( plt ); ++ connect( Calamares::ViewManager::instance(), ++ &Calamares::ViewManager::currentStepChanged, ++ this, ++ &ProgressTreeView::updateVisibility, ++ Qt::UniqueConnection ); ++} ++ ++ ++ProgressTreeView::~ProgressTreeView() {} ++ ++ ++ ++void ++ProgressTreeView::setModel( QAbstractItemModel* model ) ++{ ++ if ( ProgressTreeView::model() ) ++ { ++ return; ++ } ++ ++ QListView::setModel( model ); ++ ++ connect( Calamares::ViewManager::instance(), ++ &Calamares::ViewManager::currentStepChanged, ++ this, ++ &ProgressTreeView::update, ++ Qt::UniqueConnection ); ++} ++ ++void ++ProgressTreeView::update() ++{ ++ viewport()->update(); ++} ++ ++void ++ProgressTreeView::updateVisibility(int currentStep) ++{ ++ this->setVisible(currentStep > 0); ++} +diff --git a/src/calamares/progresstree/ProgressTreeView.h b/src/calamares/progresstree/ProgressTreeView.h +index 11491e4..b02b9ce 100644 +--- a/src/calamares/progresstree/ProgressTreeView.h ++++ b/src/calamares/progresstree/ProgressTreeView.h +@@ -1,41 +1,41 @@ +-/* === This file is part of Calamares - === +- * +- * SPDX-FileCopyrightText: 2014 Teo Mrnjavac +- * SPDX-FileCopyrightText: 2017 Adriaan de Groot +- * SPDX-License-Identifier: GPL-3.0-or-later +- * +- * Calamares is Free Software: see the License-Identifier above. +- * +- */ +- +-#ifndef PROGRESSTREEVIEW_H +-#define PROGRESSTREEVIEW_H +- +-#include +-#include "utils/Logger.h" +- +-/** +- * @brief Displays progress through the list of (visible) steps +- * +- * The ProgressTreeView class is a modified QListView which displays the +- * available view steps and the user's progress through them. +- * Since Calamares doesn't support "sub steps", it isn't really a tree. +- */ +-class ProgressTreeView : public QListView +-{ +- Q_OBJECT +-public: +- explicit ProgressTreeView( QWidget* parent = nullptr ); +- ~ProgressTreeView() override; +- +- /** +- * @brief setModel assigns a model to this view. +- */ +- void setModel( QAbstractItemModel* model ) override; +- +-public Q_SLOTS: +- void update(); +- void updateVisibility(int currentStep); +-}; +- +-#endif // PROGRESSTREEVIEW_H ++/* === This file is part of Calamares - === ++ * ++ * SPDX-FileCopyrightText: 2014 Teo Mrnjavac ++ * SPDX-FileCopyrightText: 2017 Adriaan de Groot ++ * SPDX-License-Identifier: GPL-3.0-or-later ++ * ++ * Calamares is Free Software: see the License-Identifier above. ++ * ++ */ ++ ++#ifndef PROGRESSTREEVIEW_H ++#define PROGRESSTREEVIEW_H ++ ++#include ++#include "utils/Logger.h" ++ ++/** ++ * @brief Displays progress through the list of (visible) steps ++ * ++ * The ProgressTreeView class is a modified QListView which displays the ++ * available view steps and the user's progress through them. ++ * Since Calamares doesn't support "sub steps", it isn't really a tree. ++ */ ++class ProgressTreeView : public QListView ++{ ++ Q_OBJECT ++public: ++ explicit ProgressTreeView( QWidget* parent = nullptr ); ++ ~ProgressTreeView() override; ++ ++ /** ++ * @brief setModel assigns a model to this view. ++ */ ++ void setModel( QAbstractItemModel* model ) override; ++ ++public Q_SLOTS: ++ void update(); ++ void updateVisibility(int currentStep); ++}; ++ ++#endif // PROGRESSTREEVIEW_H +diff --git a/src/calamares/test_conf.cpp b/src/calamares/test_conf.cpp +index 73b19aa..81f4e36 100644 +--- a/src/calamares/test_conf.cpp ++++ b/src/calamares/test_conf.cpp +@@ -1,109 +1,109 @@ +-/* === This file is part of Calamares - === +- * +- * SPDX-FileCopyrightText: 2017-2018 Adriaan de Groot +- * SPDX-License-Identifier: GPL-3.0-or-later +- * +- * Calamares is Free Software: see the License-Identifier above. +- * +- */ +- +-/** +- * This is a test-application that just checks the YAML config-file +- * shipped with each module for correctness -- well, for parseability. +- */ +- +-#include "utils/Yaml.h" +- +-#include +-#include +- +-#include +- +-#include +-#include +- +-using std::cerr; +- +-static const char usage[] = "Usage: test_conf [-v] [-b] ...\n"; +- +-int +-main( int argc, char** argv ) +-{ +- bool verbose = false; +- bool bytes = false; +- +- int opt; +- while ( ( opt = getopt( argc, argv, "vb" ) ) != -1 ) +- { +- switch ( opt ) +- { +- case 'v': +- verbose = true; +- break; +- case 'b': +- bytes = true; +- break; +- default: /* '?' */ +- cerr << usage; +- return 1; +- } +- } +- +- if ( optind >= argc ) +- { +- cerr << usage; +- return 1; +- } +- +- const char* filename = argv[ optind ]; +- try +- { +- YAML::Node doc; +- if ( bytes ) +- { +- QFile f( filename ); +- if ( f.open( QFile::ReadOnly | QFile::Text ) ) +- { +- doc = YAML::Load( f.readAll().constData() ); +- } +- } +- else +- { +- doc = YAML::LoadFile( filename ); +- } +- +- if ( doc.IsNull() ) +- { +- // Special case: empty config files are valid, +- // but aren't a map. For the example configs, +- // this is still an error. +- cerr << "WARNING:" << filename << '\n'; +- cerr << "WARNING: empty YAML\n"; +- return 1; +- } +- +- if ( !doc.IsMap() ) +- { +- cerr << "WARNING:" << filename << '\n'; +- cerr << "WARNING: not-a-YAML-map (type=" << doc.Type() << ")\n"; +- return 1; +- } +- +- if ( verbose ) +- { +- cerr << "Keys:\n"; +- for ( auto i = doc.begin(); i != doc.end(); ++i ) +- { +- cerr << i->first.as< std::string >() << '\n'; +- } +- } +- } +- catch ( YAML::Exception& e ) +- { +- cerr << "WARNING:" << filename << '\n'; +- cerr << "WARNING: YAML parser error " << e.what() << '\n'; +- return 1; +- } +- +- return 0; +-} ++/* === This file is part of Calamares - === ++ * ++ * SPDX-FileCopyrightText: 2017-2018 Adriaan de Groot ++ * SPDX-License-Identifier: GPL-3.0-or-later ++ * ++ * Calamares is Free Software: see the License-Identifier above. ++ * ++ */ ++ ++/** ++ * This is a test-application that just checks the YAML config-file ++ * shipped with each module for correctness -- well, for parseability. ++ */ ++ ++#include "utils/Yaml.h" ++ ++#include ++#include ++ ++#include ++ ++#include ++#include ++ ++using std::cerr; ++ ++static const char usage[] = "Usage: test_conf [-v] [-b] ...\n"; ++ ++int ++main( int argc, char** argv ) ++{ ++ bool verbose = false; ++ bool bytes = false; ++ ++ int opt; ++ while ( ( opt = getopt( argc, argv, "vb" ) ) != -1 ) ++ { ++ switch ( opt ) ++ { ++ case 'v': ++ verbose = true; ++ break; ++ case 'b': ++ bytes = true; ++ break; ++ default: /* '?' */ ++ cerr << usage; ++ return 1; ++ } ++ } ++ ++ if ( optind >= argc ) ++ { ++ cerr << usage; ++ return 1; ++ } ++ ++ const char* filename = argv[ optind ]; ++ try ++ { ++ YAML::Node doc; ++ if ( bytes ) ++ { ++ QFile f( filename ); ++ if ( f.open( QFile::ReadOnly | QFile::Text ) ) ++ { ++ doc = YAML::Load( f.readAll().constData() ); ++ } ++ } ++ else ++ { ++ doc = YAML::LoadFile( filename ); ++ } ++ ++ if ( doc.IsNull() ) ++ { ++ // Special case: empty config files are valid, ++ // but aren't a map. For the example configs, ++ // this is still an error. ++ cerr << "WARNING:" << filename << '\n'; ++ cerr << "WARNING: empty YAML\n"; ++ return 1; ++ } ++ ++ if ( !doc.IsMap() ) ++ { ++ cerr << "WARNING:" << filename << '\n'; ++ cerr << "WARNING: not-a-YAML-map (type=" << doc.Type() << ")\n"; ++ return 1; ++ } ++ ++ if ( verbose ) ++ { ++ cerr << "Keys:\n"; ++ for ( auto i = doc.begin(); i != doc.end(); ++i ) ++ { ++ cerr << i->first.as< std::string >() << '\n'; ++ } ++ } ++ } ++ catch ( YAML::Exception& e ) ++ { ++ cerr << "WARNING:" << filename << '\n'; ++ cerr << "WARNING: YAML parser error " << e.what() << '\n'; ++ return 1; ++ } ++ ++ return 0; ++} +diff --git a/src/calamares/testmain.cpp b/src/calamares/testmain.cpp +index c25bc51..7ab15c9 100644 +--- a/src/calamares/testmain.cpp ++++ b/src/calamares/testmain.cpp +@@ -1,572 +1,572 @@ +-/* === This file is part of Calamares - === +- * +- * SPDX-FileCopyrightText: 2018 Adriaan de Groot +- * SPDX-License-Identifier: GPL-3.0-or-later +- * +- * Calamares is Free Software: see the License-Identifier above. +- * +- */ +- +-/* +- * This executable loads and runs a Calamares Python module +- * within a C++ application, in order to test the different +- * bindings. +- */ +- +-#include "Branding.h" +-#include "CppJob.h" +-#include "GlobalStorage.h" +-#include "Job.h" +-#include "JobQueue.h" +-#include "Settings.h" +-#include "ViewManager.h" +-#include "modulesystem/Module.h" +-#include "modulesystem/ModuleManager.h" +-#include "modulesystem/ViewModule.h" +-#include "utils/Logger.h" +-#include "utils/Retranslator.h" +-#include "utils/System.h" +-#include "utils/Yaml.h" +-#include "viewpages/ExecutionViewStep.h" +- +-// Optional features of Calamares +-// - Python support with pybind11 +-// - Python support with older Boost implementation +-// - QML support +-#ifdef WITH_PYTHON +-#ifdef WITH_PYBIND11 +-#include "python/PythonJob.h" +-#else +-#include "PythonJob.h" +-#endif +-#endif +-#ifdef WITH_QML +-#include "utils/Qml.h" +-#endif +- +-#include +-#include +-#include +-#include +-#include +-#include +-#include +-#include +-#include +- +-#include +- +-struct ModuleConfig +-{ +- QString moduleName() const { return m_module; } +- QString configFile() const { return m_jobConfig; } +- QString language() const { return m_language; } +- QString globalConfigFile() const { return m_globalConfig; } +- +- QString m_module; +- QString m_jobConfig; +- QString m_globalConfig; +- QString m_settingsConfig; +- QString m_language; +- QString m_branding; +- bool m_ui; +- bool m_pythonInjection; +-}; +- +-static ModuleConfig +-handle_args( QCoreApplication& a ) +-{ +- QCommandLineOption debugLevelOption( +- QStringLiteral( "D" ), "Verbose output for debugging purposes (0-8), ignored.", "level" ); +- QCommandLineOption settingsOption( { QStringLiteral( "S" ), QStringLiteral( "settings" ) }, +- QStringLiteral( "Settings.conf document" ), +- QString( "settings.conf" ) ); +- QCommandLineOption globalOption( { QStringLiteral( "g" ), QStringLiteral( "global" ) }, +- QStringLiteral( "Global storage settings document" ), +- "global.yaml" ); +- QCommandLineOption jobOption( +- { QStringLiteral( "j" ), QStringLiteral( "job" ) }, QStringLiteral( "Job settings document" ), "job.yaml" ); +- QCommandLineOption langOption( { QStringLiteral( "l" ), QStringLiteral( "language" ) }, +- QStringLiteral( "Language (global)" ), +- "languagecode" ); +- QCommandLineOption brandOption( { QStringLiteral( "b" ), QStringLiteral( "branding" ) }, +- QStringLiteral( "Branding directory" ), +- "path/to/branding.desc", +- "src/branding/default/branding.desc" ); +- QCommandLineOption uiOption( { QStringLiteral( "U" ), QStringLiteral( "ui" ) }, QStringLiteral( "Enable UI" ) ); +- QCommandLineOption slideshowOption( { QStringLiteral( "s" ), QStringLiteral( "slideshow" ) }, +- QStringLiteral( "Run slideshow module" ) ); +- QCommandLineParser parser; +- parser.setApplicationDescription( "Calamares module tester" ); +- parser.addHelpOption(); +- parser.addVersionOption(); +- +- parser.addOption( debugLevelOption ); +- parser.addOption( settingsOption ); +- parser.addOption( globalOption ); +- parser.addOption( jobOption ); +- parser.addOption( langOption ); +- parser.addOption( brandOption ); +- parser.addOption( uiOption ); +- parser.addOption( slideshowOption ); +-#ifdef WITH_PYTHON +- QCommandLineOption pythonOption( { QStringLiteral( "P" ), QStringLiteral( "no-injected-python" ) }, +- QStringLiteral( "Do not disable potentially-harmful Python commands" ) ); +- parser.addOption( pythonOption ); +-#endif +- +- parser.addPositionalArgument( "module", "Path or name of module to run." ); +- parser.addPositionalArgument( "job.yaml", "Path of job settings document to use.", "[job.yaml]" ); +- +- parser.process( a ); +- +- const QStringList args = parser.positionalArguments(); +- if ( args.isEmpty() && !parser.isSet( slideshowOption ) ) +- { +- cError() << "Missing path.\n"; +- parser.showHelp(); +- } +- else if ( args.size() > 2 ) +- { +- cError() << "More than one path.\n"; +- parser.showHelp(); +- } +- else +- { +- QString jobSettings( parser.value( jobOption ) ); +- if ( jobSettings.isEmpty() && ( args.size() == 2 ) ) +- { +- jobSettings = args.at( 1 ); +- } +- +- bool pythonInjection = true; +-#ifdef WITH_PYTHON +- if ( parser.isSet( pythonOption ) ) +- { +- pythonInjection = false; +- } +-#endif +- return ModuleConfig { parser.isSet( slideshowOption ) ? QStringLiteral( "-" ) : args.first(), +- jobSettings, +- parser.value( globalOption ), +- parser.value( settingsOption ), +- parser.value( langOption ), +- parser.value( brandOption ), +- parser.isSet( slideshowOption ) || parser.isSet( uiOption ), +- pythonInjection }; +- } +-} +- +-/** @brief Bogus Job for --slideshow option +- * +- * Generally one would use DummyCppJob for this kind of dummy +- * job, but that class lives in a module so isn't available +- * in this test application. +- * +- * This bogus job just sleeps for 3. +- */ +-class ExecViewJob : public Calamares::CppJob +-{ +-public: +- explicit ExecViewJob( const QString& name, unsigned long t = 3 ) +- : m_name( name ) +- , m_delay( t ) +- { +- } +- ~ExecViewJob() override; +- +- QString prettyName() const override { return m_name; } +- +- Calamares::JobResult exec() override +- { +- QThread::sleep( m_delay ); +- return Calamares::JobResult::ok(); +- } +- +- void setConfigurationMap( const QVariantMap& ) override {} +- +-private: +- QString m_name; +- unsigned long m_delay; +-}; +- +-ExecViewJob::~ExecViewJob() {} +- +-/** @brief Bogus module for --slideshow option +- * +- * Normally the slideshow -- displayed by ExecutionViewStep -- is not +- * associated with any particular module in the Calamares configuration. +- * It is added internally by the module manager. For the module-loader +- * testing application, we need something that pretends to be the +- * module for the ExecutionViewStep. +- */ +-class ExecViewModule : public Calamares::Module +-{ +-public: +- ExecViewModule(); +- ~ExecViewModule() override; +- +- void loadSelf() override; +- +- virtual Calamares::ModuleSystem::Type type() const override; +- virtual Calamares::ModuleSystem::Interface interface() const override; +- +- virtual Calamares::JobList jobs() const override; +- +-protected: +- void initFrom( const Calamares::ModuleSystem::Descriptor& ) override; +-}; +- +-ExecViewModule::ExecViewModule() +- : Calamares::Module() +-{ +- // Normally the module-loader gives the module an instance key +- // (out of the settings file, or the descriptor of the module). +- // We don't have one, so build one -- this gives us "execView@execView". +- QVariantMap m; +- const QString execView = QStringLiteral( "execView" ); +- m.insert( "name", execView ); +- Calamares::Module::initFrom( Calamares::ModuleSystem::Descriptor::fromDescriptorData( m, execView ), execView ); +-} +- +-ExecViewModule::~ExecViewModule() {} +- +-void +-ExecViewModule::initFrom( const Calamares::ModuleSystem::Descriptor& ) +-{ +-} +- +-void +-ExecViewModule::loadSelf() +-{ +- auto* viewStep = new Calamares::ExecutionViewStep(); +- viewStep->setModuleInstanceKey( instanceKey() ); +- viewStep->setConfigurationMap( m_configurationMap ); +- viewStep->appendJobModuleInstanceKey( instanceKey() ); +- Calamares::ViewManager::instance()->addViewStep( viewStep ); +- m_loaded = true; +-} +- +-Calamares::Module::Type +-ExecViewModule::type() const +-{ +- return Module::Type::View; +-} +- +-Calamares::Module::Interface +-ExecViewModule::interface() const +-{ +- return Module::Interface::QtPlugin; +-} +- +-Calamares::JobList +-ExecViewModule::jobs() const +-{ +- Calamares::JobList l; +- const auto* gs = Calamares::JobQueue::instance()->globalStorage(); +- if ( gs && gs->contains( "jobs" ) ) +- { +- QVariantList joblist = gs->value( "jobs" ).toList(); +- for ( const auto& jd : joblist ) +- { +- QVariantMap jobdescription = jd.toMap(); +- if ( jobdescription.contains( "name" ) && jobdescription.contains( "delay" ) ) +- { +- l.append( Calamares::job_ptr( new ExecViewJob( jobdescription.value( "name" ).toString(), +- jobdescription.value( "delay" ).toULongLong() ) ) ); +- } +- } +- } +- if ( l.count() > 0 ) +- { +- return l; +- } +- +- l.append( Calamares::job_ptr( new ExecViewJob( QStringLiteral( "step 1" ) ) ) ); +- l.append( Calamares::job_ptr( new ExecViewJob( QStringLiteral( "step two" ) ) ) ); +- l.append( Calamares::job_ptr( new ExecViewJob( QStringLiteral( "locking mutexes" ), 20 ) ) ); +- l.append( Calamares::job_ptr( new ExecViewJob( QStringLiteral( "unlocking mutexes" ), 1 ) ) ); +- for ( const QString& s : QStringList { "Harder", "Better", "Faster", "Stronger" } ) +- { +- l.append( Calamares::job_ptr( new ExecViewJob( s, 0 ) ) ); +- } +- l.append( Calamares::job_ptr( new ExecViewJob( QStringLiteral( "cleaning up" ), 20 ) ) ); +- return l; +-} +- +-static Calamares::Module* +-load_module( const ModuleConfig& moduleConfig ) +-{ +- QString moduleName = moduleConfig.moduleName(); +- if ( moduleName == "-" ) +- { +- return new ExecViewModule; +- } +- +- QFileInfo fi; // This is kept around to hold the path of the module descriptor +- +- bool ok = false; +- QVariantMap descriptor; +- +- QStringList moduleDirectories { "./", "src/modules/", "modules/", CMAKE_INSTALL_FULL_LIBDIR "/calamares/modules/" }; +- for ( const QString& prefix : qAsConst( moduleDirectories ) ) +- { +- // Could be a complete path, eg. src/modules/dummycpp/module.desc +- fi = QFileInfo( prefix + moduleName ); +- if ( fi.exists() && fi.isFile() ) +- { +- descriptor = Calamares::YAML::load( fi, &ok ); +- } +- if ( ok ) +- { +- break; +- } +- +- // Could be a path without module.desc +- fi = QFileInfo( prefix + moduleName ); +- if ( fi.exists() && fi.isDir() ) +- { +- fi = QFileInfo( prefix + moduleName + "/module.desc" ); +- if ( fi.exists() && fi.isFile() ) +- { +- descriptor = Calamares::YAML::load( fi, &ok ); +- } +- if ( ok ) +- { +- break; +- } +- else +- { +- if ( !fi.exists() ) +- { +- cDebug() << "Expected a descriptor file" << fi.path(); +- } +- else +- { +- cDebug() << "Read descriptor" << fi.path() << "and it was empty."; +- } +- } +- } +- } +- +- if ( !ok ) +- { +- cWarning() << "No suitable module descriptor found in" << Logger::DebugList( moduleDirectories ); +- return nullptr; +- } +- +- QString name = descriptor.value( "name" ).toString(); +- if ( name.isEmpty() ) +- { +- cWarning() << "No name found in module descriptor" << fi.absoluteFilePath(); +- return nullptr; +- } +- +- QString moduleDirectory = fi.absolutePath(); +- QString configFile( moduleConfig.configFile().isEmpty() ? moduleDirectory + '/' + name + ".conf" +- : moduleConfig.configFile() ); +- +- cDebug() << Logger::SubEntry << "Module" << moduleName << "job-configuration:" << configFile; +- +- Calamares::Module* module = Calamares::moduleFromDescriptor( +- Calamares::ModuleSystem::Descriptor::fromDescriptorData( descriptor, fi.absoluteFilePath() ), +- name, +- configFile, +- moduleDirectory ); +- +- return module; +-} +- +-static bool +-is_ui_option( const char* s ) +-{ +- return !qstrcmp( s, "--ui" ) || !qstrcmp( s, "-U" ); +-} +- +-static bool +-is_slideshow_option( const char* s ) +-{ +- return !qstrcmp( s, "--slideshow" ) || !qstrcmp( s, "-s" ); +-} +- +-/** @brief Create the right kind of QApplication +- * +- * Does primitive parsing of argv[] to find the --ui option and returns +- * a UI-enabled application if it does. +- * +- * @p argc must be a reference (to main's argc) because the QCoreApplication +- * constructors take a reference as well, and that would otherwise be a +- * reference to a temporary. +- */ +-QCoreApplication* +-createApplication( int& argc, char* argv[] ) +-{ +- for ( int i = 1; i < argc; ++i ) +- { +- if ( is_slideshow_option( argv[ i ] ) || is_ui_option( argv[ i ] ) ) +- { +- auto* aw = new QApplication( argc, argv ); +- aw->setQuitOnLastWindowClosed( true ); +- return aw; +- } +- } +- return new QCoreApplication( argc, argv ); +-} +- +-#ifdef WITH_PYTHON +-static const char pythonPreScript[] = R"%( +-# This is Python code executed by Python modules *before* the +-# script file (e.g. main.py) is executed. +-# +-# Calls to suprocess methods that execute something are +-# suppressed and logged -- scripts should really be using libcalamares +-# methods instead. +-_calamares_subprocess = __import__("subprocess", globals(), locals(), [], 0) +-import sys +-import libcalamares +-class fake_subprocess(object): +- PIPE = object() +- STDOUT = object() +- STDERR = object() +- class CompletedProcess(object): +- returncode = 0 +- stdout = "" +- stderr = "" +- @staticmethod +- def call(*args, **kwargs): +- libcalamares.utils.debug("subprocess.call(%r,%r) X ignored" % (args, kwargs)) +- return 0 +- @staticmethod +- def check_call(*args, **kwargs): +- libcalamares.utils.debug("subprocess.check_call(%r,%r) X ignored" % (args, kwargs)) +- return 0 +- # This is a 3.5-and-later method, is supposed to return a CompletedProcess +- @staticmethod +- def run(*args, **kwargs): +- libcalamares.utils.debug("subprocess.run(%r,%r) X ignored" % (args, kwargs)) +- return fake_subprocess.CompletedProcess() +-for attr in ("CalledProcessError",): +- setattr(fake_subprocess,attr,getattr(_calamares_subprocess,attr)) +-sys.modules["subprocess"] = fake_subprocess +-libcalamares.utils.debug('pre-script for testing purposes injected') +- +-)%"; +-#endif +- +-int +-main( int argc, char* argv[] ) +-{ +- QCoreApplication* application = createApplication( argc, argv ); +- +- Logger::setupLogLevel( Logger::LOGVERBOSE ); +- +- ModuleConfig module = handle_args( *application ); +- if ( module.moduleName().isEmpty() ) +- { +- return 1; +- } +- +- std::unique_ptr< Calamares::Settings > settings_p( Calamares::Settings::init( module.m_settingsConfig ) ); +- std::unique_ptr< Calamares::JobQueue > jobqueue_p( new Calamares::JobQueue( nullptr ) ); +- std::unique_ptr< Calamares::System > system_p( new Calamares::System( settings_p->doChroot() ) ); +- +- QMainWindow* mainWindow = nullptr; +- +- auto* gs = jobqueue_p->globalStorage(); +- if ( !module.globalConfigFile().isEmpty() ) +- { +- gs->loadYaml( module.globalConfigFile() ); +- } +- if ( !module.language().isEmpty() ) +- { +- QVariantMap vm; +- vm.insert( "LANG", module.language() ); +- gs->insert( "localeConf", vm ); +- } +- +-#ifdef WITH_PYTHON +- if ( module.m_pythonInjection ) +- { +-#ifdef WITH_PYBIND11 +- Calamares::Python::Job::setInjectedPreScript( pythonPreScript ); +-#else +- // Old Boost approach +- Calamares::PythonJob::setInjectedPreScript( pythonPreScript ); +-#endif +- } +-#endif +-#ifdef WITH_QML +- Calamares::initQmlModulesDir(); // don't care if failed +-#endif +- +- cDebug() << "Calamares module-loader testing" << module.moduleName(); +- Calamares::Module* m = load_module( module ); +- if ( !m ) +- { +- cError() << "Could not load module" << module.moduleName(); +- return 1; +- } +- +- cDebug() << Logger::SubEntry << "got" << m->name() << m->typeString() << m->interfaceString(); +- if ( m->type() == Calamares::Module::Type::View ) +- { +- // If we forgot the --ui, any ViewModule will core dump as it +- // tries to create the widget **which won't be used anyway**. +- // +- // To avoid that crash, re-create the QApplication, now with GUI +- if ( !qobject_cast< QApplication* >( application ) ) +- { +- auto* replace_app = new QApplication( argc, argv ); +- replace_app->setQuitOnLastWindowClosed( true ); +- application = replace_app; +- } +- mainWindow = module.m_ui ? new QMainWindow() : nullptr; +- if ( mainWindow ) +- { +- mainWindow->installEventFilter( Calamares::Retranslator::instance() ); +- } +- +- (void)new Calamares::Branding( module.m_branding ); +- auto* modulemanager = new Calamares::ModuleManager( QStringList(), nullptr ); +- (void)Calamares::ViewManager::instance( mainWindow ); +- modulemanager->addModule( m ); +- } +- +- if ( !m->isLoaded() ) +- { +- m->loadSelf(); +- } +- +- if ( !m->isLoaded() ) +- { +- cError() << "Module" << module.moduleName() << "could not be loaded."; +- return 1; +- } +- +- if ( mainWindow ) +- { +- auto* vm = Calamares::ViewManager::instance(); +- vm->onInitComplete(); +- QWidget* w = vm->currentStep()->widget(); +- w->setParent( mainWindow ); +- mainWindow->setCentralWidget( w ); +- w->show(); +- mainWindow->show(); +- return application->exec(); +- } +- +- using TR = Logger::DebugRow< const char*, const QString >; +- +- cDebug() << Logger::SubEntry << "Module metadata" << TR( "name", m->name() ) << TR( "type", m->typeString() ) +- << TR( "interface", m->interfaceString() ); +- +- Calamares::JobQueue::instance()->enqueue( 100, m->jobs() ); +- +- QObject::connect( Calamares::JobQueue::instance(), +- &Calamares::JobQueue::finished, +- [ application ]() +- { QTimer::singleShot( std::chrono::seconds( 3 ), application, &QApplication::quit ); } ); +- QTimer::singleShot( 0, []() { Calamares::JobQueue::instance()->start(); } ); +- +- return application->exec(); +-} ++/* === This file is part of Calamares - === ++ * ++ * SPDX-FileCopyrightText: 2018 Adriaan de Groot ++ * SPDX-License-Identifier: GPL-3.0-or-later ++ * ++ * Calamares is Free Software: see the License-Identifier above. ++ * ++ */ ++ ++/* ++ * This executable loads and runs a Calamares Python module ++ * within a C++ application, in order to test the different ++ * bindings. ++ */ ++ ++#include "Branding.h" ++#include "CppJob.h" ++#include "GlobalStorage.h" ++#include "Job.h" ++#include "JobQueue.h" ++#include "Settings.h" ++#include "ViewManager.h" ++#include "modulesystem/Module.h" ++#include "modulesystem/ModuleManager.h" ++#include "modulesystem/ViewModule.h" ++#include "utils/Logger.h" ++#include "utils/Retranslator.h" ++#include "utils/System.h" ++#include "utils/Yaml.h" ++#include "viewpages/ExecutionViewStep.h" ++ ++// Optional features of Calamares ++// - Python support with pybind11 ++// - Python support with older Boost implementation ++// - QML support ++#ifdef WITH_PYTHON ++#ifdef WITH_PYBIND11 ++#include "python/PythonJob.h" ++#else ++#include "PythonJob.h" ++#endif ++#endif ++#ifdef WITH_QML ++#include "utils/Qml.h" ++#endif ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include ++ ++struct ModuleConfig ++{ ++ QString moduleName() const { return m_module; } ++ QString configFile() const { return m_jobConfig; } ++ QString language() const { return m_language; } ++ QString globalConfigFile() const { return m_globalConfig; } ++ ++ QString m_module; ++ QString m_jobConfig; ++ QString m_globalConfig; ++ QString m_settingsConfig; ++ QString m_language; ++ QString m_branding; ++ bool m_ui; ++ bool m_pythonInjection; ++}; ++ ++static ModuleConfig ++handle_args( QCoreApplication& a ) ++{ ++ QCommandLineOption debugLevelOption( ++ QStringLiteral( "D" ), "Verbose output for debugging purposes (0-8), ignored.", "level" ); ++ QCommandLineOption settingsOption( { QStringLiteral( "S" ), QStringLiteral( "settings" ) }, ++ QStringLiteral( "Settings.conf document" ), ++ QString( "settings.conf" ) ); ++ QCommandLineOption globalOption( { QStringLiteral( "g" ), QStringLiteral( "global" ) }, ++ QStringLiteral( "Global storage settings document" ), ++ "global.yaml" ); ++ QCommandLineOption jobOption( ++ { QStringLiteral( "j" ), QStringLiteral( "job" ) }, QStringLiteral( "Job settings document" ), "job.yaml" ); ++ QCommandLineOption langOption( { QStringLiteral( "l" ), QStringLiteral( "language" ) }, ++ QStringLiteral( "Language (global)" ), ++ "languagecode" ); ++ QCommandLineOption brandOption( { QStringLiteral( "b" ), QStringLiteral( "branding" ) }, ++ QStringLiteral( "Branding directory" ), ++ "path/to/branding.desc", ++ "src/branding/default/branding.desc" ); ++ QCommandLineOption uiOption( { QStringLiteral( "U" ), QStringLiteral( "ui" ) }, QStringLiteral( "Enable UI" ) ); ++ QCommandLineOption slideshowOption( { QStringLiteral( "s" ), QStringLiteral( "slideshow" ) }, ++ QStringLiteral( "Run slideshow module" ) ); ++ QCommandLineParser parser; ++ parser.setApplicationDescription( "Calamares module tester" ); ++ parser.addHelpOption(); ++ parser.addVersionOption(); ++ ++ parser.addOption( debugLevelOption ); ++ parser.addOption( settingsOption ); ++ parser.addOption( globalOption ); ++ parser.addOption( jobOption ); ++ parser.addOption( langOption ); ++ parser.addOption( brandOption ); ++ parser.addOption( uiOption ); ++ parser.addOption( slideshowOption ); ++#ifdef WITH_PYTHON ++ QCommandLineOption pythonOption( { QStringLiteral( "P" ), QStringLiteral( "no-injected-python" ) }, ++ QStringLiteral( "Do not disable potentially-harmful Python commands" ) ); ++ parser.addOption( pythonOption ); ++#endif ++ ++ parser.addPositionalArgument( "module", "Path or name of module to run." ); ++ parser.addPositionalArgument( "job.yaml", "Path of job settings document to use.", "[job.yaml]" ); ++ ++ parser.process( a ); ++ ++ const QStringList args = parser.positionalArguments(); ++ if ( args.isEmpty() && !parser.isSet( slideshowOption ) ) ++ { ++ cError() << "Missing path.\n"; ++ parser.showHelp(); ++ } ++ else if ( args.size() > 2 ) ++ { ++ cError() << "More than one path.\n"; ++ parser.showHelp(); ++ } ++ else ++ { ++ QString jobSettings( parser.value( jobOption ) ); ++ if ( jobSettings.isEmpty() && ( args.size() == 2 ) ) ++ { ++ jobSettings = args.at( 1 ); ++ } ++ ++ bool pythonInjection = true; ++#ifdef WITH_PYTHON ++ if ( parser.isSet( pythonOption ) ) ++ { ++ pythonInjection = false; ++ } ++#endif ++ return ModuleConfig { parser.isSet( slideshowOption ) ? QStringLiteral( "-" ) : args.first(), ++ jobSettings, ++ parser.value( globalOption ), ++ parser.value( settingsOption ), ++ parser.value( langOption ), ++ parser.value( brandOption ), ++ parser.isSet( slideshowOption ) || parser.isSet( uiOption ), ++ pythonInjection }; ++ } ++} ++ ++/** @brief Bogus Job for --slideshow option ++ * ++ * Generally one would use DummyCppJob for this kind of dummy ++ * job, but that class lives in a module so isn't available ++ * in this test application. ++ * ++ * This bogus job just sleeps for 3. ++ */ ++class ExecViewJob : public Calamares::CppJob ++{ ++public: ++ explicit ExecViewJob( const QString& name, unsigned long t = 3 ) ++ : m_name( name ) ++ , m_delay( t ) ++ { ++ } ++ ~ExecViewJob() override; ++ ++ QString prettyName() const override { return m_name; } ++ ++ Calamares::JobResult exec() override ++ { ++ QThread::sleep( m_delay ); ++ return Calamares::JobResult::ok(); ++ } ++ ++ void setConfigurationMap( const QVariantMap& ) override {} ++ ++private: ++ QString m_name; ++ unsigned long m_delay; ++}; ++ ++ExecViewJob::~ExecViewJob() {} ++ ++/** @brief Bogus module for --slideshow option ++ * ++ * Normally the slideshow -- displayed by ExecutionViewStep -- is not ++ * associated with any particular module in the Calamares configuration. ++ * It is added internally by the module manager. For the module-loader ++ * testing application, we need something that pretends to be the ++ * module for the ExecutionViewStep. ++ */ ++class ExecViewModule : public Calamares::Module ++{ ++public: ++ ExecViewModule(); ++ ~ExecViewModule() override; ++ ++ void loadSelf() override; ++ ++ virtual Calamares::ModuleSystem::Type type() const override; ++ virtual Calamares::ModuleSystem::Interface interface() const override; ++ ++ virtual Calamares::JobList jobs() const override; ++ ++protected: ++ void initFrom( const Calamares::ModuleSystem::Descriptor& ) override; ++}; ++ ++ExecViewModule::ExecViewModule() ++ : Calamares::Module() ++{ ++ // Normally the module-loader gives the module an instance key ++ // (out of the settings file, or the descriptor of the module). ++ // We don't have one, so build one -- this gives us "execView@execView". ++ QVariantMap m; ++ const QString execView = QStringLiteral( "execView" ); ++ m.insert( "name", execView ); ++ Calamares::Module::initFrom( Calamares::ModuleSystem::Descriptor::fromDescriptorData( m, execView ), execView ); ++} ++ ++ExecViewModule::~ExecViewModule() {} ++ ++void ++ExecViewModule::initFrom( const Calamares::ModuleSystem::Descriptor& ) ++{ ++} ++ ++void ++ExecViewModule::loadSelf() ++{ ++ auto* viewStep = new Calamares::ExecutionViewStep(); ++ viewStep->setModuleInstanceKey( instanceKey() ); ++ viewStep->setConfigurationMap( m_configurationMap ); ++ viewStep->appendJobModuleInstanceKey( instanceKey() ); ++ Calamares::ViewManager::instance()->addViewStep( viewStep ); ++ m_loaded = true; ++} ++ ++Calamares::Module::Type ++ExecViewModule::type() const ++{ ++ return Module::Type::View; ++} ++ ++Calamares::Module::Interface ++ExecViewModule::interface() const ++{ ++ return Module::Interface::QtPlugin; ++} ++ ++Calamares::JobList ++ExecViewModule::jobs() const ++{ ++ Calamares::JobList l; ++ const auto* gs = Calamares::JobQueue::instance()->globalStorage(); ++ if ( gs && gs->contains( "jobs" ) ) ++ { ++ QVariantList joblist = gs->value( "jobs" ).toList(); ++ for ( const auto& jd : joblist ) ++ { ++ QVariantMap jobdescription = jd.toMap(); ++ if ( jobdescription.contains( "name" ) && jobdescription.contains( "delay" ) ) ++ { ++ l.append( Calamares::job_ptr( new ExecViewJob( jobdescription.value( "name" ).toString(), ++ jobdescription.value( "delay" ).toULongLong() ) ) ); ++ } ++ } ++ } ++ if ( l.count() > 0 ) ++ { ++ return l; ++ } ++ ++ l.append( Calamares::job_ptr( new ExecViewJob( QStringLiteral( "step 1" ) ) ) ); ++ l.append( Calamares::job_ptr( new ExecViewJob( QStringLiteral( "step two" ) ) ) ); ++ l.append( Calamares::job_ptr( new ExecViewJob( QStringLiteral( "locking mutexes" ), 20 ) ) ); ++ l.append( Calamares::job_ptr( new ExecViewJob( QStringLiteral( "unlocking mutexes" ), 1 ) ) ); ++ for ( const QString& s : QStringList { "Harder", "Better", "Faster", "Stronger" } ) ++ { ++ l.append( Calamares::job_ptr( new ExecViewJob( s, 0 ) ) ); ++ } ++ l.append( Calamares::job_ptr( new ExecViewJob( QStringLiteral( "cleaning up" ), 20 ) ) ); ++ return l; ++} ++ ++static Calamares::Module* ++load_module( const ModuleConfig& moduleConfig ) ++{ ++ QString moduleName = moduleConfig.moduleName(); ++ if ( moduleName == "-" ) ++ { ++ return new ExecViewModule; ++ } ++ ++ QFileInfo fi; // This is kept around to hold the path of the module descriptor ++ ++ bool ok = false; ++ QVariantMap descriptor; ++ ++ QStringList moduleDirectories { "./", "src/modules/", "modules/", CMAKE_INSTALL_FULL_LIBDIR "/calamares/modules/" }; ++ for ( const QString& prefix : qAsConst( moduleDirectories ) ) ++ { ++ // Could be a complete path, eg. src/modules/dummycpp/module.desc ++ fi = QFileInfo( prefix + moduleName ); ++ if ( fi.exists() && fi.isFile() ) ++ { ++ descriptor = Calamares::YAML::load( fi, &ok ); ++ } ++ if ( ok ) ++ { ++ break; ++ } ++ ++ // Could be a path without module.desc ++ fi = QFileInfo( prefix + moduleName ); ++ if ( fi.exists() && fi.isDir() ) ++ { ++ fi = QFileInfo( prefix + moduleName + "/module.desc" ); ++ if ( fi.exists() && fi.isFile() ) ++ { ++ descriptor = Calamares::YAML::load( fi, &ok ); ++ } ++ if ( ok ) ++ { ++ break; ++ } ++ else ++ { ++ if ( !fi.exists() ) ++ { ++ cDebug() << "Expected a descriptor file" << fi.path(); ++ } ++ else ++ { ++ cDebug() << "Read descriptor" << fi.path() << "and it was empty."; ++ } ++ } ++ } ++ } ++ ++ if ( !ok ) ++ { ++ cWarning() << "No suitable module descriptor found in" << Logger::DebugList( moduleDirectories ); ++ return nullptr; ++ } ++ ++ QString name = descriptor.value( "name" ).toString(); ++ if ( name.isEmpty() ) ++ { ++ cWarning() << "No name found in module descriptor" << fi.absoluteFilePath(); ++ return nullptr; ++ } ++ ++ QString moduleDirectory = fi.absolutePath(); ++ QString configFile( moduleConfig.configFile().isEmpty() ? moduleDirectory + '/' + name + ".conf" ++ : moduleConfig.configFile() ); ++ ++ cDebug() << Logger::SubEntry << "Module" << moduleName << "job-configuration:" << configFile; ++ ++ Calamares::Module* module = Calamares::moduleFromDescriptor( ++ Calamares::ModuleSystem::Descriptor::fromDescriptorData( descriptor, fi.absoluteFilePath() ), ++ name, ++ configFile, ++ moduleDirectory ); ++ ++ return module; ++} ++ ++static bool ++is_ui_option( const char* s ) ++{ ++ return !qstrcmp( s, "--ui" ) || !qstrcmp( s, "-U" ); ++} ++ ++static bool ++is_slideshow_option( const char* s ) ++{ ++ return !qstrcmp( s, "--slideshow" ) || !qstrcmp( s, "-s" ); ++} ++ ++/** @brief Create the right kind of QApplication ++ * ++ * Does primitive parsing of argv[] to find the --ui option and returns ++ * a UI-enabled application if it does. ++ * ++ * @p argc must be a reference (to main's argc) because the QCoreApplication ++ * constructors take a reference as well, and that would otherwise be a ++ * reference to a temporary. ++ */ ++QCoreApplication* ++createApplication( int& argc, char* argv[] ) ++{ ++ for ( int i = 1; i < argc; ++i ) ++ { ++ if ( is_slideshow_option( argv[ i ] ) || is_ui_option( argv[ i ] ) ) ++ { ++ auto* aw = new QApplication( argc, argv ); ++ aw->setQuitOnLastWindowClosed( true ); ++ return aw; ++ } ++ } ++ return new QCoreApplication( argc, argv ); ++} ++ ++#ifdef WITH_PYTHON ++static const char pythonPreScript[] = R"%( ++# This is Python code executed by Python modules *before* the ++# script file (e.g. main.py) is executed. ++# ++# Calls to suprocess methods that execute something are ++# suppressed and logged -- scripts should really be using libcalamares ++# methods instead. ++_calamares_subprocess = __import__("subprocess", globals(), locals(), [], 0) ++import sys ++import libcalamares ++class fake_subprocess(object): ++ PIPE = object() ++ STDOUT = object() ++ STDERR = object() ++ class CompletedProcess(object): ++ returncode = 0 ++ stdout = "" ++ stderr = "" ++ @staticmethod ++ def call(*args, **kwargs): ++ libcalamares.utils.debug("subprocess.call(%r,%r) X ignored" % (args, kwargs)) ++ return 0 ++ @staticmethod ++ def check_call(*args, **kwargs): ++ libcalamares.utils.debug("subprocess.check_call(%r,%r) X ignored" % (args, kwargs)) ++ return 0 ++ # This is a 3.5-and-later method, is supposed to return a CompletedProcess ++ @staticmethod ++ def run(*args, **kwargs): ++ libcalamares.utils.debug("subprocess.run(%r,%r) X ignored" % (args, kwargs)) ++ return fake_subprocess.CompletedProcess() ++for attr in ("CalledProcessError",): ++ setattr(fake_subprocess,attr,getattr(_calamares_subprocess,attr)) ++sys.modules["subprocess"] = fake_subprocess ++libcalamares.utils.debug('pre-script for testing purposes injected') ++ ++)%"; ++#endif ++ ++int ++main( int argc, char* argv[] ) ++{ ++ QCoreApplication* application = createApplication( argc, argv ); ++ ++ Logger::setupLogLevel( Logger::LOGVERBOSE ); ++ ++ ModuleConfig module = handle_args( *application ); ++ if ( module.moduleName().isEmpty() ) ++ { ++ return 1; ++ } ++ ++ std::unique_ptr< Calamares::Settings > settings_p( Calamares::Settings::init( module.m_settingsConfig ) ); ++ std::unique_ptr< Calamares::JobQueue > jobqueue_p( new Calamares::JobQueue( nullptr ) ); ++ std::unique_ptr< Calamares::System > system_p( new Calamares::System( settings_p->doChroot() ) ); ++ ++ QMainWindow* mainWindow = nullptr; ++ ++ auto* gs = jobqueue_p->globalStorage(); ++ if ( !module.globalConfigFile().isEmpty() ) ++ { ++ gs->loadYaml( module.globalConfigFile() ); ++ } ++ if ( !module.language().isEmpty() ) ++ { ++ QVariantMap vm; ++ vm.insert( "LANG", module.language() ); ++ gs->insert( "localeConf", vm ); ++ } ++ ++#ifdef WITH_PYTHON ++ if ( module.m_pythonInjection ) ++ { ++#ifdef WITH_PYBIND11 ++ Calamares::Python::Job::setInjectedPreScript( pythonPreScript ); ++#else ++ // Old Boost approach ++ Calamares::PythonJob::setInjectedPreScript( pythonPreScript ); ++#endif ++ } ++#endif ++#ifdef WITH_QML ++ Calamares::initQmlModulesDir(); // don't care if failed ++#endif ++ ++ cDebug() << "Calamares module-loader testing" << module.moduleName(); ++ Calamares::Module* m = load_module( module ); ++ if ( !m ) ++ { ++ cError() << "Could not load module" << module.moduleName(); ++ return 1; ++ } ++ ++ cDebug() << Logger::SubEntry << "got" << m->name() << m->typeString() << m->interfaceString(); ++ if ( m->type() == Calamares::Module::Type::View ) ++ { ++ // If we forgot the --ui, any ViewModule will core dump as it ++ // tries to create the widget **which won't be used anyway**. ++ // ++ // To avoid that crash, re-create the QApplication, now with GUI ++ if ( !qobject_cast< QApplication* >( application ) ) ++ { ++ auto* replace_app = new QApplication( argc, argv ); ++ replace_app->setQuitOnLastWindowClosed( true ); ++ application = replace_app; ++ } ++ mainWindow = module.m_ui ? new QMainWindow() : nullptr; ++ if ( mainWindow ) ++ { ++ mainWindow->installEventFilter( Calamares::Retranslator::instance() ); ++ } ++ ++ (void)new Calamares::Branding( module.m_branding ); ++ auto* modulemanager = new Calamares::ModuleManager( QStringList(), nullptr ); ++ (void)Calamares::ViewManager::instance( mainWindow ); ++ modulemanager->addModule( m ); ++ } ++ ++ if ( !m->isLoaded() ) ++ { ++ m->loadSelf(); ++ } ++ ++ if ( !m->isLoaded() ) ++ { ++ cError() << "Module" << module.moduleName() << "could not be loaded."; ++ return 1; ++ } ++ ++ if ( mainWindow ) ++ { ++ auto* vm = Calamares::ViewManager::instance(); ++ vm->onInitComplete(); ++ QWidget* w = vm->currentStep()->widget(); ++ w->setParent( mainWindow ); ++ mainWindow->setCentralWidget( w ); ++ w->show(); ++ mainWindow->show(); ++ return application->exec(); ++ } ++ ++ using TR = Logger::DebugRow< const char*, const QString >; ++ ++ cDebug() << Logger::SubEntry << "Module metadata" << TR( "name", m->name() ) << TR( "type", m->typeString() ) ++ << TR( "interface", m->interfaceString() ); ++ ++ Calamares::JobQueue::instance()->enqueue( 100, m->jobs() ); ++ ++ QObject::connect( Calamares::JobQueue::instance(), ++ &Calamares::JobQueue::finished, ++ [ application ]() ++ { QTimer::singleShot( std::chrono::seconds( 3 ), application, &QApplication::quit ); } ); ++ QTimer::singleShot( 0, []() { Calamares::JobQueue::instance()->start(); } ); ++ ++ return application->exec(); ++} +diff --git a/src/libcalamares/CalamaresAbout.cpp b/src/libcalamares/CalamaresAbout.cpp +index 595efc7..65a1b9d 100644 +--- a/src/libcalamares/CalamaresAbout.cpp ++++ b/src/libcalamares/CalamaresAbout.cpp +@@ -65,6 +65,7 @@ Calamares::aboutString() + { + return substituteVersions( QCoreApplication::translate( "AboutData", s_header ) ) + aboutMaintainers() + + QCoreApplication::translate( "AboutData", s_footer ); ++ // return aboutMaintainers()+ QCoreApplication::translate( "AboutData", s_footer ); + } + + const QString +diff --git a/src/libcalamaresui/modulesystem/CppJobModule.cpp b/src/libcalamaresui/modulesystem/CppJobModule.cpp +index b35a457..c211006 100644 +--- a/src/libcalamaresui/modulesystem/CppJobModule.cpp ++++ b/src/libcalamaresui/modulesystem/CppJobModule.cpp +@@ -53,6 +53,10 @@ CppJobModule::loadSelf() + cDebug() << "Could not load module:" << m_loader->errorString(); + return; + } ++ // cDebug() << "CppJobModule loading self for instance" << instanceKey() ++ // << "\nCppJobModule at address" << this ++ // << "\nCalamares::PluginFactory at address" << pf ++ // << "\nCppJob at address" << cppJob; + + cppJob->setModuleInstanceKey( instanceKey() ); + cppJob->setConfigurationMap( m_configurationMap ); +diff --git a/src/modules/displaymanager/main.py b/src/modules/displaymanager/main.py +index 6ca279e..02fec0f 100644 +--- a/src/modules/displaymanager/main.py ++++ b/src/modules/displaymanager/main.py +@@ -410,6 +410,11 @@ class DMgdm(DisplayManager): + if self.config is None: + raise ValueError( "No config file for GDM has been set." ) + ++ ++ libcalamares.utils.target_env_call( ++ ['hostnamectl', 'set-hostname', username] ++ ) ++ + # Systems with GDM as Desktop Manager + gdm_conf_path = os.path.join(self.root_mount_point, self.config) + +@@ -571,6 +576,11 @@ class DMlightdm(DisplayManager): + # Ideally, we should use configparser for the ini conf file, + # but we just do a simple text replacement for now, as it + # worksforme(tm) ++ ++ libcalamares.utils.target_env_call( ++ ['hostnamectl', 'set-hostname', username] ++ ) ++ + lightdm_conf_path = os.path.join( + self.root_mount_point, "etc/lightdm/lightdm.conf" + ) +diff --git a/src/modules/keyboard/KeyboardPage.cpp b/src/modules/keyboard/KeyboardPage.cpp +index be60521..3f06158 100644 +--- a/src/modules/keyboard/KeyboardPage.cpp ++++ b/src/modules/keyboard/KeyboardPage.cpp +@@ -48,6 +48,9 @@ KeyboardPage::KeyboardPage( Config* config, QWidget* parent ) + { + ui->setupUi( this ); + this->setContentsMargins(50,0,50,0); ++ // Keyboard Preview ++ // ui->KBPreviewLayout->addWidget( m_keyboardPreview ); ++ + + { + auto* model = config->keyboardModels(); +@@ -90,11 +93,27 @@ KeyboardPage::KeyboardPage( Config* config, QWidget* parent ) + &QItemSelectionModel::currentChanged, + [ this ]( const QModelIndex& current ) + { m_config->keyboardLayouts()->setCurrentIndex( current.row() ); } ); ++ // connect( config->keyboardLayouts(), ++ // &KeyboardLayoutModel::currentIndexChanged, ++ // [ this ]( int index ) ++ // { ++ // ui->layoutSelector->setCurrentIndex( m_config->keyboardLayouts()->index( index ) ); ++ // m_keyboardPreview->setLayout( m_config->keyboardLayouts()->key( index ) ); ++ // m_keyboardPreview->setVariant( ++ // m_config->keyboardVariants()->key( m_config->keyboardVariants()->currentIndex() ) ); ++ // } ); + + connect( ui->variantSelector->selectionModel(), + &QItemSelectionModel::currentChanged, + [ this ]( const QModelIndex& current ) + { m_config->keyboardVariants()->setCurrentIndex( current.row() ); } ); ++ // connect( config->keyboardVariants(), ++ // &KeyboardVariantsModel::currentIndexChanged, ++ // [ this ]( int index ) ++ // { ++ // ui->variantSelector->setCurrentIndex( m_config->keyboardVariants()->index( index ) ); ++ // m_keyboardPreview->setVariant( m_config->keyboardVariants()->key( index ) ); ++ // } ); + + connect( ui->groupSelector, + QOverload< int >::of( &QComboBox::currentIndexChanged ), +diff --git a/src/modules/keyboard/KeyboardPage.ui b/src/modules/keyboard/KeyboardPage.ui +index 70cfca3..1d6afbf 100644 +--- a/src/modules/keyboard/KeyboardPage.ui ++++ b/src/modules/keyboard/KeyboardPage.ui +@@ -45,6 +45,9 @@ SPDX-License-Identifier: GPL-3.0-or-later + + + ++ + + + +diff --git a/src/modules/locale/Config.cpp b/src/modules/locale/Config.cpp +index 0d70ff3..fbcbf48 100644 +--- a/src/modules/locale/Config.cpp ++++ b/src/modules/locale/Config.cpp +@@ -426,6 +426,33 @@ Config::currentLCStatus() const + .arg( localeLabel( m_selectedLocaleConfiguration.lc_numeric ) ); + } + ++ ++static QString ++getTranRes(QString& filePath,QString& keyWord) { ++ QFile file(filePath); ++ if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) { ++ qDebug() << "无法打开文件"; ++ return QString(); ++ } ++ ++ QTextStream in(&file); ++ QString currentLine; ++ QString resLine; ++ ++ while (!in.atEnd()) { ++ currentLine = in.readLine(); ++ if (currentLine.contains(keyWord, Qt::CaseInsensitive)) { ++ in.readLine(); ++ resLine = in.readLine(); ++ file.close(); ++ return resLine.trimmed().replace("","").replace("",""); ++ } ++ } ++ ++ return keyWord; ++} ++ ++ + QString + Config::currentTimeZoneStatus() const + { +@@ -434,6 +461,22 @@ Config::currentTimeZoneStatus() const + { + zone = "Hong Kong(China)"; + } ++ ++ ++ zone.replace("_"," "); ++ QString translationFile = ""; ++ if( m_selectedLocaleConfiguration.language() == "zh_CN.utf8"){ ++ translationFile = "tz_zh_CN.ts"; ++ } else if( m_selectedLocaleConfiguration.language() == "zh_TW.utf8"){ ++ translationFile="tz_zh_TW.ts"; ++ } ++ ++ QString transFilePath = QStringLiteral("/usr/share/calamares/") + translationFile; ++ cDebug() << "transFilePath" << transFilePath; ++ if(translationFile != ""){ ++ zone = getTranRes(transFilePath, zone); ++ } ++ + return tr("The timezone will be set to %1.","@info") + .arg( zone ); + } +diff --git a/src/modules/locale/LocalePage.cpp b/src/modules/locale/LocalePage.cpp +index ed50574..0568067 100644 +--- a/src/modules/locale/LocalePage.cpp ++++ b/src/modules/locale/LocalePage.cpp +@@ -32,6 +32,13 @@ LocalePage::LocalePage( Config* config, QWidget* parent ) + { + QBoxLayout* mainLayout = new QVBoxLayout; + mainLayout->setContentsMargins(50,0,50,0); ++ //QBoxLayout* tzwLayout = new QHBoxLayout; ++ //m_tzWidget = new TimeZoneWidget( m_config->zonesModel(), this ); ++ //tzwLayout->addStretch(); ++ //tzwLayout->addWidget( m_tzWidget ); ++ //tzwLayout->addStretch(); ++ // Adjust for margins and spacing in this page ++ //m_tzWidget->setMinimumHeight( m_tzWidget->minimumHeight() + 12 ); // 2 * spacing + + QBoxLayout* zoneAndRegionLayout = new QVBoxLayout; + m_regionLabel = new QLabel( this ); +@@ -83,7 +90,7 @@ LocalePage::LocalePage( Config* config, QWidget* parent ) + m_formatsChangeButton->setSizePolicy( QSizePolicy::Preferred, QSizePolicy::Preferred ); + formatsLayout->addWidget( m_formatsChangeButton ); + formatsLayout->addSpacing(20); +- ++ //mainLayout->addLayout( tzwLayout ); + mainLayout->addStretch(); + mainLayout->addLayout( zoneAndRegionLayout ); + mainLayout->addStretch(); +@@ -93,7 +100,7 @@ LocalePage::LocalePage( Config* config, QWidget* parent ) + mainLayout->addSpacing(20); + mainLayout->addLayout( timezoneLayout ); + mainLayout->addStretch(); +- ++ //setMinimumWidth( m_tzWidget->width() ); + setLayout( mainLayout ); + + m_localeChangeButton->hide(); +@@ -107,15 +114,20 @@ LocalePage::LocalePage( Config* config, QWidget* parent ) + zones->setRegion( location->region() ); + m_regionCombo->setModel( regions ); + m_zoneCombo->setModel( zones ); +- ++ //m_tzWidget->setCurrentLocation( location ); + locationChanged( location ); // doesn't inform TZ widget + } + + connect( config, &Config::currentLCStatusChanged, m_formatsLabel, &QLabel::setText ); + connect( config, &Config::currentLanguageStatusChanged, m_localeLabel, &QLabel::setText ); + connect( config, &Config::currentZoneChanged, m_timezoneLabel , &QLabel::setText); +- ++ //connect( config, &Config::currentLocationChanged, m_tzWidget, &TimeZoneWidget::setCurrentLocation ); + connect( config, &Config::currentLocationChanged, this, &LocalePage::locationChanged ); ++ // connect( m_tzWidget, ++ // &TimeZoneWidget::locationChanged, ++ // config, ++ // QOverload< const Calamares::Locale::TimeZoneData* >::of( &Config::setCurrentLocation ) ); ++ + connect( m_regionCombo, QOverload< int >::of( &QComboBox::currentIndexChanged ), this, &LocalePage::regionChanged ); + connect( m_zoneCombo, QOverload< int >::of( &QComboBox::currentIndexChanged ), this, &LocalePage::zoneChanged ); + +diff --git a/src/modules/packagechooser/packagechooser.conf b/src/modules/packagechooser/packagechooser.conf +index aa048e2..3f35638 100644 +--- a/src/modules/packagechooser/packagechooser.conf ++++ b/src/modules/packagechooser/packagechooser.conf +@@ -147,6 +147,8 @@ labels: + # + # An item for AppStream may also contain an *id* and a *screenshot* + # key which will override the data from AppStream. ++# liberation-fonts, gnu-*-fonts, google-*-fonts, adwaita-icon-theme, atk, atkmm, at-spi2-atk, at-spi2-core, baobab, abattis-cantarell-fonts, cheese, clutter, clutter-gst3, clutter-gtk, cogl, dconf, dconf-editor, devhelp, eog, epiphany, evince, evolution-data-server, file-roller, folks, gcab, gcr, gdk-pixbuf2, gdm, gedit, geocode-glib, gfbgraph, gjs, glib2, glibmm24, glib-networking, gmime30, gnome-autoar, gnome-backgrounds, gnome-bluetooth, gnome-builder, gnome-calculator, gnome-calendar, gnome-characters, gnome-clocks, gnome-color-manager, gnome-contacts, gnome-control-center, gnome-desktop3, gnome-disk-utility, gnome-font-viewer, gnome-getting-started-docs, gnome-initial-setup, gnome-keyring, gnome-logs, gnome-menus, gnome-music, gnome-online-accounts, gnome-online-miners, gnome-photos, gnome-remote-desktop, gnome-screenshot, gnome-session, gnome-settings-daemon, gnome-shell, gnome-shell-extensions, gnome-software, gnome-system-monitor, gnome-terminal, gnome-tour, gnome-user-docs, gnome-user-share, gnome-video-effects, gnome-weather, gobject-introspection, gom, grilo, grilo-plugins, gsettings-desktop-schemas, gsound, gspell, gssdp, gtk3, gtk4, gtk-doc, gtkmm30, gtksourceview4, gtk-vnc2, gupnp, gupnp-av, gupnp-dlna, gvfs, json-glib, libchamplain, libdazzle, libgdata, libgee, libgnomekbd, libgsf, libgtop2, libgweather, libgxps, libhandy, libmediaart, libnma, libnotify, libpeas, librsvg2, libsecret, libsigc++20, libsoup, mm-common, mutter, nautilus, orca, pango, pangomm, libphodav, python3-pyatspi, python3-gobject, rest, rygel, simple-scan, sushi, sysprof, tepl, totem, totem-pl-parser, tracker3, tracker3-miners, vala, vte291, yelp, yelp-tools, yelp-xsl, zenity, devstation-config, ibus-libpinyin ] ++ + items: + - id: "" + # packages: [] # This item installs no packages +@@ -157,11 +159,25 @@ items: + description[nl]: "Kies eventueel een desktop-omgeving uit deze lijst. Als u geen desktop-omgeving wenst te gebruiken, kies er dan geen. In dat geval start het systeem straks op in tekst-modus en kunt u later alsnog een desktop-omgeving installeren." + description[zh]: "请选择一个桌面环境。如果您不想安装桌面环境也没关系,您可以稍后再为系统安装桌面环境。" + screenshot: ":/images/Minimal-Install.png" +- ++ # - id: kde ++ # packages: [ kde-frameworks, kde-plasma, kde-gear ] ++ # name: Plasma Desktop ++ # description: "KDE Plasma Desktop, simple by default, a clean work area for real-world usage which intends to stay out of your way. Plasma is powerful when needed, enabling the user to create the workflow that makes them more effective to complete their tasks." ++ # screenshot: ":/images/Plasma.png" + - id: gnome +- packages: [ checkpolicy, code, xorg-*, dejavu-fonts, liberation-fonts, gnu-*-fonts, google-*-fonts, adwaita-icon-theme, atk, atkmm, at-spi2-atk, at-spi2-core, baobab, abattis-cantarell-fonts, cheese, clutter, clutter-gst3, clutter-gtk, cogl, dconf, dconf-editor, devhelp, eog, epiphany, evince, evolution-data-server, file-roller, folks, gcab, gcr, gdk-pixbuf2, gdm, gedit, geocode-glib, gfbgraph, gjs, glib2, glibmm24, glib-networking, gmime30, gnome-autoar, gnome-backgrounds, gnome-bluetooth, gnome-builder, gnome-calculator, gnome-calendar, gnome-characters, gnome-clocks, gnome-color-manager, gnome-contacts, gnome-control-center, gnome-desktop3, gnome-disk-utility, gnome-font-viewer, gnome-getting-started-docs, gnome-initial-setup, gnome-keyring, gnome-logs, gnome-menus, gnome-music, gnome-online-accounts, gnome-online-miners, gnome-photos, gnome-remote-desktop, gnome-screenshot, gnome-session, gnome-settings-daemon, gnome-shell, gnome-shell-extensions, gnome-software, gnome-system-monitor, gnome-terminal, gnome-tour, gnome-user-docs, gnome-user-share, gnome-video-effects, gnome-weather, gobject-introspection, gom, grilo, grilo-plugins, gsettings-desktop-schemas, gsound, gspell, gssdp, gtk3, gtk4, gtk-doc, gtkmm30, gtksourceview4, gtk-vnc2, gupnp, gupnp-av, gupnp-dlna, gvfs, json-glib, libchamplain, libdazzle, libgdata, libgee, libgnomekbd, libgsf, libgtop2, libgweather, libgxps, libhandy, libmediaart, libnma, libnotify, libpeas, librsvg2, libsecret, libsigc++20, libsoup, mm-common, mutter, nautilus, orca, pango, pangomm, libphodav, python3-pyatspi, python3-gobject, rest, rygel, simple-scan, sushi, sysprof, tepl, totem, totem-pl-parser, tracker3, tracker3-miners, vala, vte291, yelp, yelp-tools, yelp-xsl, zenity, devstation-config, ibus-libpinyin ] ++ packages: [ checkpolicy, code, dejavu-fonts, liberation-fonts, gnome-shell, gnome-session, gnome-terminal, gnome-software, gnome-menus, nautilus, xdg-utils, google-droid-sans-fonts, google-noto-fonts-common, google-noto-sans-arabic-vf-fonts, google-noto-sans-armenian-vf-fonts, google-noto-sans-bengali-vf-fonts, google-noto-sans-canadian-aboriginal-vf-fonts, google-noto-sans-cherokee-vf-fonts, google-noto-sans-devanagari-vf-fonts, google-noto-sans-ethiopic-vf-fonts, google-noto-sans-georgian-vf-fonts, google-noto-sans-hebrew-vf-fonts, google-noto-sans-kannada-vf-fonts, google-noto-sans-khmer-vf-fonts, google-noto-sans-lao-vf-fonts, google-noto-sans-math-fonts, google-noto-sans-mono-vf-fonts, google-noto-sans-sinhala-vf-fonts, google-noto-sans-symbols2-fonts, google-noto-sans-symbols-vf-fonts, google-noto-sans-tamil-vf-fonts, google-noto-sans-thaana-vf-fonts, google-noto-sans-thai-vf-fonts, google-noto-sans-vf-fonts, google-noto-serif-armenian-vf-fonts, google-noto-serif-ethiopic-vf-fonts, google-noto-serif-georgian-vf-fonts, google-noto-serif-gujarati-vf-fonts, google-noto-serif-gurmukhi-vf-fonts, google-noto-serif-hebrew-vf-fonts, google-noto-serif-kannada-vf-fonts, google-noto-serif-khmer-vf-fonts, google-noto-serif-lao-vf-fonts, google-noto-serif-sinhala-vf-fonts, google-noto-serif-tamil-vf-fonts, google-noto-serif-thai-vf-fonts, google-noto-serif-vf-fonts, gdm, ibus-libpinyin, webp-pixbuf-loader, firefox, devstation-config, wqy-zenhei-fonts ] + name: DevStation + name[zh]: DevStation + description: GNU Networked Object Modeling Environment Desktop + description[zh]: Devstation系统桌面 + screenshot: ":/images/gnome.png" ++ #- id: ukui ++ # packages: [ ukui ] ++ # name: UKUI ++ # description: Linux Desktop ++ # screenshot: ":/images/UKUI.png" ++ # - id: calamares ++ # appdata: ../io.calamares.calamares.appdata.xml ++ # screenshot: ":/images/calamares.png" ++ # - id: kate ++ # appstream: org.kde.kwrite.desktop +diff --git a/src/modules/packagechooser/packagechooser.qrc b/src/modules/packagechooser/packagechooser.qrc +index 2f76726..b5c4a9c 100644 +--- a/src/modules/packagechooser/packagechooser.qrc ++++ b/src/modules/packagechooser/packagechooser.qrc +@@ -1,12 +1,7 @@ + + + images/no-selection.png +- images/calamares.png +- + images/gnome.png +- +- +- + images/Minimal-Install.png + + +diff --git a/src/modules/packages/main.py b/src/modules/packages/main.py +index 1fbe276..2c6e6ad 100644 +--- a/src/modules/packages/main.py ++++ b/src/modules/packages/main.py +@@ -756,7 +756,7 @@ def subst_locale_orig(plist): + return ret + + +-def handle_packagechooser(entry): ++def handle_packagechooser(): + """ + Handle special logic for entries with source "packagechooser@packagechooser". + Modifies the entry to include specific pre- and post-scripts. +@@ -764,13 +764,11 @@ def handle_packagechooser(entry): + :param entry: dict + The operation entry to process. + """ +- if "install" in entry: +- item = { +- "package": entry["install"], +- "pre-script": "", +- "post-script": ["/bin/bash /etc/add_selinux_policy.sh", "systemctl enable gdm", "systemctl set-default graphical.target"] +- } +- entry["install"] = [item] ++ item = { ++ "pre-script": "", ++ "post-script": ["/bin/bash /etc/add_selinux_policy.sh", "systemctl enable gdm", "systemctl set-default graphical.target"] ++ } ++ return item + + + def run_operations(pkgman, entry, options): +diff --git a/src/modules/packages/packages.conf b/src/modules/packages/packages.conf +index 490c289..31e51c2 100644 +--- a/src/modules/packages/packages.conf ++++ b/src/modules/packages/packages.conf +@@ -215,7 +215,7 @@ operations: + - coreutils + - efibootmgr + - shim +- - java-11-openjdk-devel ++ - java-21-openjdk-devel + - vim + - gdb + - perf +@@ -229,5 +229,3 @@ operations: + options: + - --nogpgcheck + - --setopt=sslverify=0 +- - --disablerepo=* +- - --enablerepo=local-repo +diff --git a/src/modules/partition/core/DeviceList.cpp b/src/modules/partition/core/DeviceList.cpp +index 16723c7..1885949 100644 +--- a/src/modules/partition/core/DeviceList.cpp ++++ b/src/modules/partition/core/DeviceList.cpp +@@ -43,6 +43,17 @@ hasRootPartition( Device* device ) + return false; + } + ++/** ++ * Does the given @p device path should point to a device ++ */ ++static bool ++isValidDevice(const QString& devicePath) ++{ ++ auto result = Calamares::System::runCommand({ "blkid", devicePath }, std::chrono::seconds(30)); ++ ++ return result.getExitCode() == 0 && !result.getOutput().isEmpty(); ++} ++ + /** @brief Check if @p path holds an iso9660 filesystem + * + * The @p path should point to a device; blkid is used to check the FS type. +@@ -187,7 +198,17 @@ getDevices( DeviceType which ) + } + else + { +- ++it; ++ const QString devicePath = (*it)->deviceNode(); ++ ++ if (!isValidDevice(devicePath)) ++ { ++ cDebug() << Logger::SubEntry << "Skipping device due to blkid failure: " << devicePath; ++ it = removeInAllModes(devices, it); ++ } ++ else ++ { ++ ++it; ++ } + } + } + cDebug() << Logger::SubEntry << "there are" << devices.count() << "devices left."; +diff --git a/src/modules/partition/jobs/ClearMountsJob.cpp b/src/modules/partition/jobs/ClearMountsJob.cpp +index ce1355b..d36c4e5 100644 +--- a/src/modules/partition/jobs/ClearMountsJob.cpp ++++ b/src/modules/partition/jobs/ClearMountsJob.cpp +@@ -260,7 +260,7 @@ STATICTEST MessageAndPath + tryUmount( const QString& partPath ) + { + QProcess process; +- process.start( "umount", { partPath } ); ++ process.start( "umount", { "-l", partPath } ); + process.waitForFinished(); + if ( process.exitCode() == 0 ) + { +@@ -317,6 +317,51 @@ tryCryptoClose( const QString& mapperPath ) + return {}; + } + ++STATICTEST MessageAndPath ++tryClearLVM(const QString& LVMPath) ++{ ++ tryUmount( LVMPath ); ++ ++ QProcess process; ++ process.start( "dmsetup", {"remove", LVMPath } ); ++ process.waitForFinished(); ++ if ( process.exitCode() == 0 ) ++ { ++ return { QT_TRANSLATE_NOOP( "ClearMountsJob", "Successfully removed LVM %1." ), LVMPath }; ++ } ++ return {}; ++} ++ ++STATICTEST MessageAndPath ++mpathClear(const QString& deviceName) ++{ ++ QString devicePath = "/dev/" + deviceName; ++ QProcess process; ++ process.start("multipath", { "-ll", devicePath } ); ++ process.waitForFinished(); ++ if( process.exitCode() == 0 ) ++ { ++ QStringList multiPathLines = QString::fromLocal8Bit( process.readAllStandardOutput() ).split( '\n' ); ++ QStringList firstLines = multiPathLines.first().split(' '); ++ QString mpath = firstLines.first(); ++ return tryClearLVM("/dev/mapper/" + mpath); ++ } ++ return {}; ++} ++ ++STATICTEST MessageAndPath ++diskClear(const QString& diskPath) ++{ ++ QString devicePath = "/dev/" + diskPath; ++ QProcess process; ++ process.start( "wipefs", { "-af", devicePath } ); ++ process.waitForFinished(); ++ if( process.exitCode() == 0 ) ++ { ++ return { QT_TRANSLATE_NOOP( "ClearMountsJob", "Successfully cleared %1." ), diskPath }; ++ } ++ return {}; ++} + STATICTEST MessageAndPath + tryVGDisable( const QString& vgName ) + { +@@ -380,12 +425,14 @@ ClearMountsJob::exec() + QList< MessageAndPath > goodNews; + + apply( getCryptoDevices( m_mapperExceptions ), tryCryptoClose, goodNews ); +- apply( getLVMVolumes(), tryUmount, goodNews ); ++ apply( getLVMVolumes(), tryClearLVM, goodNews ); + apply( getPVGroups( deviceName ), tryVGDisable, goodNews ); + + apply( getCryptoDevices( m_mapperExceptions ), tryCryptoClose, goodNews ); + apply( getPartitionsForDevice( deviceName ), tryUmount, goodNews ); + apply( getSwapsForDevice( m_deviceNode ), tryClearSwap, goodNews ); ++ diskClear(deviceName); ++ mpathClear(deviceName); + + Calamares::JobResult ok = Calamares::JobResult::ok(); + ok.setMessage( tr( "Cleared all mounts for %1" ).arg( m_deviceNode ) ); +diff --git a/src/modules/unpackfs/main.py b/src/modules/unpackfs/main.py +index 4c5518e..7db5f2e 100644 +--- a/src/modules/unpackfs/main.py ++++ b/src/modules/unpackfs/main.py +@@ -207,7 +207,7 @@ def file_copy(source, entry, progress_cb): + # `source` *must* end with '/' otherwise a directory named after the source + # will be created in `dest`: ie if `source` is "/foo/bar" and `dest` is + # "/dest", then files will be copied in "/dest/bar". +- if not source.endswith("/") and not os.path.isfile(source): ++ if source and not source.endswith("/") and not os.path.isfile(source): + source += "/" + + num_files_total_local = 0 +@@ -395,8 +395,6 @@ class UnpackOperation: + for entry in self.entries: + status = _("Starting to unpack {}").format(entry.source) + libcalamares.job.setprogress( ( 1.0 * complete ) / len(self.entries) ) +- entry.do_mount(source_mount_path) +- entry.do_count() # Fill in the entry.total + + self.report_progress() + error_msg = self.unpack_image(entry, entry.mountPoint) +@@ -437,7 +435,7 @@ class UnpackOperation: + + return file_copy(source, entry, progress_cb) + finally: +- if not entry.is_file(): ++ if imgmountdir and not entry.is_file() and os.path.isdir(imgmountdir): + subprocess.check_call(["umount", "-l", imgmountdir]) + + +diff --git a/src/modules/users/CreateUserJob.cpp b/src/modules/users/CreateUserJob.cpp +index 4e36c50..9699141 100644 +--- a/src/modules/users/CreateUserJob.cpp ++++ b/src/modules/users/CreateUserJob.cpp +@@ -79,6 +79,23 @@ createUser( const QString& loginName, const QString& fullName, const QString& sh + return Calamares::JobResult::ok(); + } + ++static Calamares::JobResult ++config_root_bash(const QString& loginName) ++{ ++ QStringList copyBashFilesCommand; ++ copyBashFilesCommand << "cp" ++ << QString("/home/%1/.bashrc").arg(loginName) ++ << QString("/home/%1/.bash_profile").arg(loginName) ++ << "/root/"; ++ auto commandResult = Calamares::System::instance()->targetEnvCommand( copyBashFilesCommand ); ++ if ( commandResult.getExitCode() ) ++ { ++ cError() << "copy bash config file failed" << commandResult.getExitCode(); ++ return commandResult.explainProcess( copyBashFilesCommand, std::chrono::seconds( 10 ) /* bogus timeout */ ); ++ } ++ return Calamares::JobResult::ok(); ++} ++ + static Calamares::JobResult + setUserGroups( const QString& loginName, const QStringList& groups ) + { +@@ -155,6 +172,7 @@ CreateUserJob::exec() + QString userGroup = QString( "%1:%2" ).arg( m_config->loginName() ).arg( m_config->loginName() ); + QString homeDir = QString( "/home/%1" ).arg( m_config->loginName() ); + auto commandResult = Calamares::System::instance()->targetEnvCommand( { "chown", "-R", userGroup, homeDir } ); ++ config_root_bash(m_config->loginName()); + if ( commandResult.getExitCode() ) + { + cError() << "chown failed" << commandResult.getExitCode(); +diff --git a/src/modules/users/UsersPage.cpp b/src/modules/users/UsersPage.cpp +index 72fb3e0..a4edddf 100644 +--- a/src/modules/users/UsersPage.cpp ++++ b/src/modules/users/UsersPage.cpp +@@ -31,6 +31,9 @@ + #include + #include + #include ++#include ++#include ++#include + + /** @brief Add an error message and pixmap to a label. */ + static inline void +@@ -83,6 +86,105 @@ UsersPage::UsersPage( Config* config, QWidget* parent ) + { + ui->setupUi( this ); + this->setContentsMargins(50,15,50,0); ++ ++ ++ //初始化参数 ++ userPassword=false; ++ userVertifyPassword=false; ++ rootPassword=false; ++ rootVertifyPassword=false; ++ ++ userButton=new QPushButton(); ++ userVertifyButton=new QPushButton(); ++ rootButton=new QPushButton(); ++ rootVertifyButton=new QPushButton(); ++ ++ hIcon = QIcon(imagePath + "password-hide.png"); ++ sIcon = QIcon(imagePath + "password-show.png"); ++ userButton->setIcon(hIcon); ++ userVertifyButton->setIcon(hIcon); ++ rootButton->setIcon(hIcon); ++ rootVertifyButton->setIcon(hIcon); ++ ++ userButton->setCursor(Qt::PointingHandCursor); ++ userButton->setStyleSheet("QPushButton:hover {background-color:transparent;border-style:outset;}"); ++ userButton->setWindowFlags(Qt::FramelessWindowHint); ++ userButton->setFlat(true); ++ ++ userVertifyButton->setCursor(Qt::PointingHandCursor); ++ userVertifyButton->setStyleSheet("QPushButton:hover {background-color:transparent;border-style:outset;}"); ++ userVertifyButton->setWindowFlags(Qt::FramelessWindowHint); ++ userVertifyButton->setFlat(true); ++ ++ rootButton->setCursor(Qt::PointingHandCursor); ++ rootButton->setStyleSheet("QPushButton:hover {background-color:transparent;border-style:outset;}"); ++ rootButton->setWindowFlags(Qt::FramelessWindowHint); ++ rootButton->setFlat(true); ++ ++ rootVertifyButton->setCursor(Qt::PointingHandCursor); ++ rootVertifyButton->setStyleSheet("QPushButton:hover {background-color:transparent;border-style:outset;}"); ++ rootVertifyButton->setWindowFlags(Qt::FramelessWindowHint); ++ rootVertifyButton->setFlat(true); ++ ++ QWidgetAction* userPasswordAction = new QWidgetAction(ui->textBoxUserPassword); ++ QWidgetAction* userVerifiedPasswordAction = new QWidgetAction(ui->textBoxUserVerifiedPassword); ++ QWidgetAction* rootPasswordAction = new QWidgetAction(ui->textBoxRootPassword); ++ QWidgetAction* rootVerifiedPasswordAction = new QWidgetAction(ui->textBoxVerifiedRootPassword); ++ ++ userPasswordAction->setDefaultWidget(userButton); ++ ui->textBoxUserPassword->addAction(userPasswordAction,QLineEdit::TrailingPosition); ++ userVerifiedPasswordAction->setDefaultWidget(userVertifyButton); ++ ui->textBoxUserVerifiedPassword->addAction(userVerifiedPasswordAction,QLineEdit::TrailingPosition); ++ rootPasswordAction->setDefaultWidget(rootButton); ++ ui->textBoxRootPassword->addAction(rootPasswordAction,QLineEdit::TrailingPosition); ++ rootVerifiedPasswordAction->setDefaultWidget(rootVertifyButton); ++ ui->textBoxVerifiedRootPassword->addAction(rootVerifiedPasswordAction,QLineEdit::TrailingPosition); ++ ++ connect( ++ userButton, ++ &QPushButton::clicked, ++ [this] ( ) { ++ userPassword =! userPassword; ++ if(userPassword){ ++ userButton->setIcon(sIcon); ++ ui->textBoxUserPassword->setEchoMode(QLineEdit::Normal); ++ } else { ++ userButton->setIcon(hIcon); ++ ui->textBoxUserPassword->setEchoMode(QLineEdit::Password); ++ } ++ }); ++ connect(userVertifyButton,&QPushButton::clicked, [this](){ ++ userVertifyPassword =! userVertifyPassword; ++ if(userVertifyPassword){ ++ userVertifyButton->setIcon(sIcon); ++ ui->textBoxUserVerifiedPassword->setEchoMode(QLineEdit::Normal); ++ } else { ++ userVertifyButton->setIcon(hIcon); ++ ui->textBoxUserVerifiedPassword->setEchoMode(QLineEdit::Password); ++ } ++ }); ++ connect(rootButton,&QPushButton::clicked, [this](){ ++ rootPassword =! rootPassword; ++ if(rootPassword){ ++ rootButton->setIcon(sIcon); ++ ui->textBoxRootPassword->setEchoMode(QLineEdit::Normal); ++ } else { ++ rootButton->setIcon(hIcon); ++ ui->textBoxRootPassword->setEchoMode(QLineEdit::Password); ++ } ++ }); ++ connect(rootVertifyButton,&QPushButton::clicked, [this](){ ++ rootVertifyPassword =! rootVertifyPassword; ++ if(rootVertifyPassword){ ++ rootVertifyButton->setIcon(sIcon); ++ ui->textBoxVerifiedRootPassword->setEchoMode(QLineEdit::Normal); ++ } else { ++ rootVertifyButton->setIcon(hIcon); ++ ui->textBoxVerifiedRootPassword->setEchoMode(QLineEdit::Password); ++ } ++ }); ++ ++ + // Connect signals and slots + ui->textBoxUserPassword->setText( config->userPassword() ); + connect( ui->textBoxUserPassword, &QLineEdit::textChanged, config, &Config::setUserPassword ); +diff --git a/src/modules/users/UsersPage.h b/src/modules/users/UsersPage.h +index 379176a..fcee0f0 100644 +--- a/src/modules/users/UsersPage.h ++++ b/src/modules/users/UsersPage.h +@@ -17,6 +17,10 @@ + #define USERSPAGE_H + + #include ++#include ++#include ++#include ++ + + class Config; + +@@ -51,6 +55,17 @@ private: + + Ui::Page_UserSetup* ui; + Config* m_config; ++ bool userPassword; ++ bool userVertifyPassword; ++ bool rootPassword; ++ bool rootVertifyPassword; ++ QIcon hIcon; ++ QIcon sIcon; ++ QPushButton* userButton; ++ QPushButton* userVertifyButton; ++ QPushButton* rootButton; ++ QPushButton* rootVertifyButton; ++ QString imagePath="/usr/share/calamares/branding/default/"; + }; + + #endif // USERSPAGE_H +diff --git a/src/modules/welcome/WelcomePage.cpp b/src/modules/welcome/WelcomePage.cpp +index 471187b..88f38c2 100644 +--- a/src/modules/welcome/WelcomePage.cpp ++++ b/src/modules/welcome/WelcomePage.cpp +@@ -91,7 +91,21 @@ WelcomePage::WelcomePage( Config* config, QWidget* parent ) + } + + void +-WelcomePage::init(){} ++WelcomePage::init() ++{ ++ //setup the url buttons ++ // setupButton( WelcomePage::Button::Support, m_conf->supportUrl() ); ++ // setupButton( WelcomePage::Button::KnownIssues, m_conf->knownIssuesUrl() ); ++ // setupButton( WelcomePage::Button::ReleaseNotes, m_conf->releaseNotesUrl() ); ++ // setupButton( WelcomePage::Button::Donate, m_conf->donateUrl() ); ++ ++ //language icon ++ // auto icon = Calamares::Branding::instance()->image( m_conf->languageIcon(), QSize( 48, 48 ) ); ++ // if ( !icon.isNull() ) ++ // { ++ // setLanguageIcon( icon ); ++ // } ++} + + void + WelcomePage::initLanguages() +@@ -111,6 +125,57 @@ WelcomePage::initLanguages() + &Config::setLocaleIndex ); + } + ++// void ++// WelcomePage::setupButton( Button role, const QString& url ) ++// { ++// QPushButton* button = nullptr; ++// Calamares::ImageType icon = Calamares::Information; ++ ++// switch ( role ) ++// { ++// case Button::Donate: ++// button = ui->donateButton; ++// icon = Calamares::Donate; ++// break; ++// case Button::KnownIssues: ++// button = ui->knownIssuesButton; ++// icon = Calamares::Bugs; ++// break; ++// case Button::ReleaseNotes: ++// button = ui->releaseNotesButton; ++// icon = Calamares::Release; ++// break; ++// case Button::Support: ++// button = ui->supportButton; ++// icon = Calamares::Help; ++// break; ++// } ++// if ( !button ) ++// { ++// cWarning() << "Unknown button role" << smash( role ); ++// return; ++// } ++ ++// if ( url.isEmpty() ) ++// { ++// button->hide(); ++// return; ++// } ++ ++// QUrl u( url ); ++// if ( u.isValid() ) ++// { ++// auto size = 2 * QSize( Calamares::defaultFontHeight(), Calamares::defaultFontHeight() ); ++// button->setIcon( Calamares::defaultPixmap( icon, Calamares::Original, size ) ); ++// connect( button, &QPushButton::clicked, [ u ]() { QDesktopServices::openUrl( u ); } ); ++// } ++// else ++// { ++// cWarning() << "Welcome button" << smash( role ) << "URL" << url << "is invalid."; ++// button->hide(); ++// } ++// } ++ + void + WelcomePage::focusInEvent( QFocusEvent* e ) + { +@@ -136,6 +201,11 @@ WelcomePage::externallySelectedLanguage( int row ) + } + } + ++// void ++// WelcomePage::setLanguageIcon( QPixmap i ) ++// { ++// ui->languageIcon->setPixmap( i ); ++// } + + void + WelcomePage::retranslate() +@@ -144,6 +214,8 @@ WelcomePage::retranslate() + + ui->mainText->setText( message.arg( Calamares::Branding::instance()->versionedName() ) ); + ui->retranslateUi( this ); ++ // ui->supportButton->setText( ++ // tr( "%1 Support", "@action" ).arg( Calamares::Branding::instance()->shortProductName() ) ); + } + + void +diff --git a/src/modules/welcome/welcome.qrc b/src/modules/welcome/welcome.qrc +index d338d73..7182a4d 100644 +--- a/src/modules/welcome/welcome.qrc ++++ b/src/modules/welcome/welcome.qrc +@@ -1,6 +1,5 @@ + + +- + WelcomePage.cpp + language-icon-128px.png + language-icon-48px.png +-- +2.46.0 + diff --git a/calamares.spec b/calamares.spec index 6c36659..12c0e60 100644 --- a/calamares.spec +++ b/calamares.spec @@ -38,7 +38,7 @@ Source16: information.svgz Source17: openEuler.png Source18: openEulerWord-blus.png Source19: openEulerWord.png - +Source20: openEuler-icon.png # patch Patch0: 0001-branding-patch.patch Patch1: 0002-lang.patch @@ -49,6 +49,11 @@ Patch5: 0006-modules-file.patch Patch6: 0007-root.patch Patch7: 0008-progromTree.patch Patch8: 0009-qss.patch +Patch9: 0010-cDebugDelect.patch +Patch10: 0011-fix-87-position-and-translate.patch +Patch11: 0012-replace-icon.patch +Patch12: 0013-1230.patch + # Calamares is only supported where live images (and GRUB) are. (#1171380) # This list matches the arches where grub2-efi is used to boot the system ExclusiveArch: %{ix86} x86_64 aarch64 riscv64 @@ -213,6 +218,7 @@ mkdir -p %{_builddir}/calamares-3.3.7/data/images install -Dm 0644 %{SOURCE8} %{_builddir}/calamares-3.3.7/data/images/Biglogo.svgz install -Dm 0644 %{SOURCE9} %{_builddir}/calamares-3.3.7/data/images/Biglogo.svg install -Dm 0644 %{SOURCE16} %{_builddir}/calamares-3.3.7/data/images/information.svgz + mkdir -p %{_builddir}/calamares-3.3.7/src/modules/packagechooser/images install -Dm 0644 %{SOURCE10} %{_builddir}/calamares-3.3.7/src/branding/default/Biglogo.png install -Dm 0644 %{SOURCE11} %{_builddir}/calamares-3.3.7/src/modules/packagechooser/images/Minimal-Install.png @@ -226,6 +232,7 @@ install -Dm 0644 %{SOURCE15} %{_builddir}/calamares-3.3.7/src/branding/default/S install -Dm 0644 %{SOURCE17} %{_builddir}/calamares-3.3.7/src/branding/default/openEuler.png install -Dm 0644 %{SOURCE18} %{_builddir}/calamares-3.3.7/src/branding/default/openEulerWord-blus.png install -Dm 0644 %{SOURCE19} %{_builddir}/calamares-3.3.7/src/branding/default/openEulerWord.png +install -Dm 0644 %{SOURCE20} %{_builddir}/calamares-3.3.7/src/branding/default/openEuler-icon.png %build mkdir build cd build @@ -261,7 +268,6 @@ mkdir -p %{buildroot}/data/images install -Dm 0644 %{SOURCE8} %{buildroot}/data/images/Biglogo.svgz install -Dm 0644 %{SOURCE9} %{buildroot}/data/images/Biglogo.svg install -Dm 0644 %{SOURCE16} %{buildroot}/data/images/information.svgz - # calamares模块图片目录 mkdir -p %{buildroot}%{_datadir}/calamares/modules/packagechooser/images install -Dm 0644 %{SOURCE10} %{buildroot}%{_datadir}/calamares/branding/default/Biglogo.png @@ -276,7 +282,7 @@ install -Dm 0644 %{SOURCE15} %{buildroot}%{_datadir}/calamares/branding/default/ install -Dm 0644 %{SOURCE17} %{buildroot}%{_datadir}/calamares/branding/default/openEuler.png install -Dm 0644 %{SOURCE18} %{buildroot}%{_datadir}/calamares/branding/default/openEulerWord-blus.png install -Dm 0644 %{SOURCE19} %{buildroot}%{_datadir}/calamares/branding/default/openEulerWord.png - +install -Dm 0644 %{SOURCE20} %{buildroot}%{_datadir}/calamares/branding/default/openEuler-icon.png %files %doc AUTHORS %license LICENSES/* @@ -313,7 +319,7 @@ install -Dm 0644 %{SOURCE19} %{buildroot}%{_datadir}/calamares/branding/default/ %{_datadir}/calamares/branding/default/openEulerWord-blus.png %{_datadir}/calamares/branding/default/openEulerWord.png %{_datadir}/calamares/branding/default/openEuler.png - +%{_datadir}/calamares/branding/default/openEuler-icon.png %files libs %{_libdir}/libcalamares.so.* %{_libdir}/libcalamaresui.so.* @@ -335,5 +341,8 @@ cd %{_builddir} || exit 0 rm -rf %{buildroot} %changelog +* Fri Dec 27 2024 Li Zixin - 3.3.7-2 + Update to 1230 version + * Wed Oct 9 2024 Li Ping - 3.3.7-1 -- Initial package + Initial package diff --git a/openEuler-icon.png b/openEuler-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..db2afafdd36eabdd5c5fd083d9bc00aff9911e6c GIT binary patch literal 12843 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 literal 0 HcmV?d00001 diff --git a/password-hide.png b/password-hide.png new file mode 100644 index 0000000000000000000000000000000000000000..424b4feb99d3f66926d22b36f32949da45ed0819 GIT binary patch literal 269 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#Vf9UfwVLrC0ZDr=g18)(;IER_yq<++W_@00fl0 z#llMWOrIDmw4>tN4@WjOwl>$zzh#*YP3DpS0+Fd#Ur7S#lqXYIx{MD!_$6`Cx9<0^ zr>;PSY_-YW)hUPP+wA)O@Za6&-mX(wU-RSl@7a-2wx2o1NWo_1f(@%4+nU)QieW3} z^pQK3o|ur3aAQN!JrFVdQ I&MBb@09uM;-v9sr literal 0 HcmV?d00001 -- Gitee From 84ac8479b4c034b41e0f31129ab238b35e801279 Mon Sep 17 00:00:00 2001 From: lizixin <2271170409@qq.com> Date: Fri, 27 Dec 2024 19:08:57 +0800 Subject: [PATCH 4/5] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E6=8F=92=E4=BB=B6?= =?UTF-8?q?=E5=88=B01230=E7=89=88=E6=9C=AC=5F2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 0013-1230.patch | 5298 ++++++++++++++++++++++++++++++++++++++++++++- calamares.spec | 8 +- password-show.png | Bin 0 -> 339 bytes 3 files changed, 5290 insertions(+), 16 deletions(-) create mode 100644 password-show.png diff --git a/0013-1230.patch b/0013-1230.patch index 063cdbd..75ee734 100644 --- a/0013-1230.patch +++ b/0013-1230.patch @@ -1,29 +1,31 @@ -From 3d9f1fa95d537a7925fd8eb5841bf89e151852df Mon Sep 17 00:00:00 2001 +From 9dd33a244e37407d18a5a8e3903ec9d4fd59cde9 Mon Sep 17 00:00:00 2001 From: lizixin <2271170409@qq.com> -Date: Fri, 27 Dec 2024 18:07:52 +0800 +Date: Fri, 27 Dec 2024 19:27:11 +0800 Subject: [PATCH] 1230 --- CMakeLists.txt | 1 + calamares.desktop | 10 +- lang/calamares_zh_CN.ts | 2 +- + lang/tz_zh_CN.ts | 2626 +++++++++++++++++ + lang/tz_zh_TW.ts | 2626 +++++++++++++++++ src/branding/default/show.qml | 6 +- src/calamares/CMakeLists.txt | 134 +- src/calamares/CalamaresApplication.cpp | 4 +- - src/calamares/DebugWindow.cpp | 530 ++++---- - src/calamares/DebugWindow.h | 192 +-- - src/calamares/VariantModel.cpp | 570 ++++---- - src/calamares/VariantModel.h | 208 +-- - src/calamares/calamares-navigation.qml | 166 +-- - src/calamares/calamares-sidebar.qml | 250 ++-- + src/calamares/DebugWindow.cpp | 530 ++-- + src/calamares/DebugWindow.h | 192 +- + src/calamares/VariantModel.cpp | 570 ++-- + src/calamares/VariantModel.h | 208 +- + src/calamares/calamares-navigation.qml | 166 +- + src/calamares/calamares-sidebar.qml | 250 +- src/calamares/calamares.qrc | 20 +- - src/calamares/main.cpp | 308 ++--- - .../progresstree/ProgressTreeDelegate.cpp | 422 +++--- + src/calamares/main.cpp | 308 +- + .../progresstree/ProgressTreeDelegate.cpp | 422 +-- .../progresstree/ProgressTreeDelegate.h | 62 +- - .../progresstree/ProgressTreeView.cpp | 154 ++- + .../progresstree/ProgressTreeView.cpp | 154 +- src/calamares/progresstree/ProgressTreeView.h | 82 +- - src/calamares/test_conf.cpp | 218 ++-- - src/calamares/testmain.cpp | 1144 ++++++++--------- + src/calamares/test_conf.cpp | 218 +- + src/calamares/testmain.cpp | 1144 +++---- src/libcalamares/CalamaresAbout.cpp | 1 + .../modulesystem/CppJobModule.cpp | 4 + src/modules/displaymanager/main.py | 10 + @@ -39,11 +41,13 @@ Subject: [PATCH] 1230 src/modules/partition/jobs/ClearMountsJob.cpp | 51 +- src/modules/unpackfs/main.py | 6 +- src/modules/users/CreateUserJob.cpp | 18 + - src/modules/users/UsersPage.cpp | 102 ++ + src/modules/users/UsersPage.cpp | 102 + src/modules/users/UsersPage.h | 15 + src/modules/welcome/WelcomePage.cpp | 74 +- src/modules/welcome/welcome.qrc | 1 - - 39 files changed, 2643 insertions(+), 2273 deletions(-) + 41 files changed, 7895 insertions(+), 2273 deletions(-) + create mode 100644 lang/tz_zh_CN.ts + create mode 100644 lang/tz_zh_TW.ts diff --git a/CMakeLists.txt b/CMakeLists.txt index 19395d4..40ae7e0 100644 @@ -111,6 +115,5270 @@ index 75ffe95..3479fd1 100644 The timezone whill be set to %1. +diff --git a/lang/tz_zh_CN.ts b/lang/tz_zh_CN.ts +new file mode 100644 +index 0000000..b154b93 +--- /dev/null ++++ b/lang/tz_zh_CN.ts +@@ -0,0 +1,2626 @@ ++ ++ ++ ++ ++ ++ QObject ++ ++ ++ Africa ++ tz_regions ++ 非洲 ++ ++ ++ ++ America ++ tz_regions ++ 美洲 ++ ++ ++ ++ Antarctica ++ tz_regions ++ 南极洲 ++ ++ ++ ++ Arctic ++ tz_regions ++ 北极 ++ ++ ++ ++ Asia ++ tz_regions ++ 亚洲 ++ ++ ++ ++ Atlantic ++ tz_regions ++ 大西洋 ++ ++ ++ ++ Australia ++ tz_regions ++ 澳大利亚 ++ ++ ++ ++ Europe ++ tz_regions ++ 欧洲 ++ ++ ++ ++ Indian ++ tz_regions ++ 印度 ++ ++ ++ ++ Pacific ++ tz_regions ++ 太平洋 ++ ++ ++ ++ Abidjan ++ tz_names ++ 阿比让 ++ ++ ++ ++ Accra ++ tz_names ++ 阿克拉 ++ ++ ++ ++ Adak ++ tz_names ++ 阿达克 ++ ++ ++ ++ Addis Ababa ++ tz_names ++ 亚的斯亚贝巴 ++ ++ ++ ++ Adelaide ++ tz_names ++ 阿德莱德 ++ ++ ++ ++ Aden ++ tz_names ++ 亚丁 ++ ++ ++ ++ Algiers ++ tz_names ++ 阿尔及尔 ++ ++ ++ ++ Almaty ++ tz_names ++ 阿拉木图 ++ ++ ++ ++ Amman ++ tz_names ++ 安曼 ++ ++ ++ ++ Amsterdam ++ tz_names ++ 阿姆斯特丹 ++ ++ ++ ++ Anadyr ++ tz_names ++ 阿纳迪尔 ++ ++ ++ ++ Anchorage ++ tz_names ++ 安克雷奇 ++ ++ ++ ++ Andorra ++ tz_names ++ 安道尔 ++ ++ ++ ++ Anguilla ++ tz_names ++ 安圭拉 ++ ++ ++ ++ Antananarivo ++ tz_names ++ 塔那那利佛 ++ ++ ++ ++ Antigua ++ tz_names ++ 安提瓜 ++ ++ ++ ++ Apia ++ tz_names ++ 阿皮亚 ++ ++ ++ ++ Aqtau ++ tz_names ++ 阿克托 ++ ++ ++ ++ Aqtobe ++ tz_names ++ 阿克托贝 ++ ++ ++ ++ Araguaina ++ tz_names ++ 阿拉瓜伊纳 ++ ++ ++ ++ Argentina/Buenos Aires ++ tz_names ++ 阿根廷/布宜诺斯艾利斯 ++ ++ ++ ++ Argentina/Catamarca ++ tz_names ++ 阿根廷/卡塔马卡 ++ ++ ++ ++ Argentina/Cordoba ++ tz_names ++ 阿根廷/科尔多瓦 ++ ++ ++ ++ Argentina/Jujuy ++ tz_names ++ 阿根廷/胡胡伊 ++ ++ ++ ++ Argentina/La Rioja ++ tz_names ++ 阿根廷/拉里奥哈 ++ ++ ++ ++ Argentina/Mendoza ++ tz_names ++ 阿根廷/门多萨 ++ ++ ++ ++ Argentina/Rio Gallegos ++ tz_names ++ 阿根廷/里奥加列戈斯 ++ ++ ++ ++ Argentina/Salta ++ tz_names ++ 阿根廷/萨尔塔 ++ ++ ++ ++ Argentina/San Juan ++ tz_names ++ 阿根廷/圣胡安 ++ ++ ++ ++ Argentina/San Luis ++ tz_names ++ 阿根廷/圣路易斯 ++ ++ ++ ++ Argentina/Tucuman ++ tz_names ++ 阿根廷/图库曼 ++ ++ ++ ++ Argentina/Ushuaia ++ tz_names ++ 阿根廷/乌斯怀亚 ++ ++ ++ ++ Aruba ++ tz_names ++ 阿鲁巴 ++ ++ ++ ++ Ashgabat ++ tz_names ++ 阿什哈巴德 ++ ++ ++ ++ Asmara ++ tz_names ++ 阿斯马拉 ++ ++ ++ ++ Astrakhan ++ tz_names ++ 阿斯特拉罕 ++ ++ ++ ++ Asuncion ++ tz_names ++ 亚松森 ++ ++ ++ ++ Athens ++ tz_names ++ 雅典 ++ ++ ++ ++ Atikokan ++ tz_names ++ 阿提科坎 ++ ++ ++ ++ Atyrau ++ tz_names ++ 阿特劳 ++ ++ ++ ++ Auckland ++ tz_names ++ 奥克兰 ++ ++ ++ ++ Azores ++ tz_names ++ 亚速尔群岛 ++ ++ ++ ++ Baghdad ++ tz_names ++ 巴格达 ++ ++ ++ ++ Bahia ++ tz_names ++ 巴伊亚 ++ ++ ++ ++ Bahia Banderas ++ tz_names ++ 巴伊亚·班德拉斯 ++ ++ ++ ++ Bahrain ++ tz_names ++ 巴林 ++ ++ ++ ++ Baku ++ tz_names ++ 巴库 ++ ++ ++ ++ Bamako ++ tz_names ++ 巴马科 ++ ++ ++ ++ Bangkok ++ tz_names ++ 曼谷 ++ ++ ++ ++ Bangui ++ tz_names ++ 班吉 ++ ++ ++ ++ Banjul ++ tz_names ++ 班珠尔 ++ ++ ++ ++ Barbados ++ tz_names ++ 巴巴多斯 ++ ++ ++ ++ Barnaul ++ tz_names ++ 巴尔瑙尔 ++ ++ ++ ++ Beirut ++ tz_names ++ 贝鲁特 ++ ++ ++ ++ Belem ++ tz_names ++ 贝伦 ++ ++ ++ ++ Belgrade ++ tz_names ++ 贝尔格莱德 ++ ++ ++ ++ Belize ++ tz_names ++ 伯利兹 ++ ++ ++ ++ Berlin ++ tz_names ++ 柏林 ++ ++ ++ ++ Bermuda ++ tz_names ++ 百慕大 ++ ++ ++ ++ Bishkek ++ tz_names ++ 比什凯克 ++ ++ ++ ++ Bissau ++ tz_names ++ 比绍 ++ ++ ++ ++ Blanc-Sablon ++ tz_names ++ 布兰克·萨布隆 ++ ++ ++ ++ Blantyre ++ tz_names ++ 布兰太尔 ++ ++ ++ ++ Boa Vista ++ tz_names ++ 博阿维斯塔 ++ ++ ++ ++ Bogota ++ tz_names ++ 波哥大 ++ ++ ++ ++ Boise ++ tz_names ++ 博伊西 ++ ++ ++ ++ Bougainville ++ tz_names ++ 布干维尔 ++ ++ ++ ++ Bratislava ++ tz_names ++ 布拉迪斯拉发 ++ ++ ++ ++ Brazzaville ++ tz_names ++ 布拉柴维尔 ++ ++ ++ ++ Brisbane ++ tz_names ++ 布里斯班 ++ ++ ++ ++ Broken Hill ++ tz_names ++ 布罗肯希尔 ++ ++ ++ ++ Brunei ++ tz_names ++ 文莱 ++ ++ ++ ++ Brussels ++ tz_names ++ 布鲁塞尔 ++ ++ ++ ++ Beijing ++ tz_names ++ 北京 ++ ++ ++ ++ Bucharest ++ tz_names ++ 布加勒斯特 ++ ++ ++ ++ Budapest ++ tz_names ++ 布达佩斯 ++ ++ ++ ++ Bujumbura ++ tz_names ++ 布琼布拉 ++ ++ ++ ++ Busingen ++ tz_names ++ 比辛根 ++ ++ ++ ++ Cairo ++ tz_names ++ 开罗 ++ ++ ++ ++ Cambridge Bay ++ tz_names ++ 剑桥湾 ++ ++ ++ ++ Campo Grande ++ tz_names ++ 坎波格兰德 ++ ++ ++ ++ Canary ++ tz_names ++ 加那利群岛 ++ ++ ++ ++ Cancun ++ tz_names ++ 坎昆 ++ ++ ++ ++ Cape Verde ++ tz_names ++ 佛得角 ++ ++ ++ ++ Caracas ++ tz_names ++ 加拉加斯 ++ ++ ++ ++ Casablanca ++ tz_names ++ 卡萨布兰卡 ++ ++ ++ ++ Casey ++ tz_names ++ 凯西 ++ ++ ++ ++ Cayenne ++ tz_names ++ 卡宴 ++ ++ ++ ++ Cayman ++ tz_names ++ 开曼群岛 ++ ++ ++ ++ Ceuta ++ tz_names ++ 休达 ++ ++ ++ ++ Chagos ++ tz_names ++ 查戈斯 ++ ++ ++ ++ Chatham ++ tz_names ++ 查塔姆 ++ ++ ++ ++ Chicago ++ tz_names ++ 芝加哥 ++ ++ ++ ++ Chihuahua ++ tz_names ++ 吉娃娃 ++ ++ ++ ++ Chisinau ++ tz_names ++ 基希讷乌 ++ ++ ++ ++ Chita ++ tz_names ++ 赤塔 ++ ++ ++ ++ Choibalsan ++ tz_names ++ 乔巴桑 ++ ++ ++ ++ Christmas ++ tz_names ++ 伯利恒 ++ ++ ++ ++ Chuuk ++ tz_names ++ 楚克 ++ ++ ++ ++ Cocos ++ tz_names ++ 科科斯 ++ ++ ++ ++ Colombo ++ tz_names ++ 科伦坡 ++ ++ ++ ++ Comoro ++ tz_names ++ 科摩罗 ++ ++ ++ ++ Conakry ++ tz_names ++ 科纳克里 ++ ++ ++ ++ Copenhagen ++ tz_names ++ 哥本哈根 ++ ++ ++ ++ Costa Rica ++ tz_names ++ 哥斯达黎加 ++ ++ ++ ++ Creston ++ tz_names ++ 克雷斯顿 ++ ++ ++ ++ Cuiaba ++ tz_names ++ 库亚巴 ++ ++ ++ ++ Curacao ++ tz_names ++ 库拉索 ++ ++ ++ ++ Currie ++ tz_names ++ 柯里 ++ ++ ++ ++ Dakar ++ tz_names ++ 达喀尔 ++ ++ ++ ++ Damascus ++ tz_names ++ 大马士革 ++ ++ ++ ++ Danmarkshavn ++ tz_names ++ 丹麦 ++ ++ ++ ++ Dar es Salaam ++ tz_names ++ 达累斯萨拉姆 ++ ++ ++ ++ Darwin ++ tz_names ++ 达尔文 ++ ++ ++ ++ Davis ++ tz_names ++ 戴维斯 ++ ++ ++ ++ Dawson ++ tz_names ++ 道森 ++ ++ ++ ++ Dawson Creek ++ tz_names ++ 道森溪 ++ ++ ++ ++ Denver ++ tz_names ++ 丹佛 ++ ++ ++ ++ Detroit ++ tz_names ++ 底特律 ++ ++ ++ ++ Dhaka ++ tz_names ++ 达卡 ++ ++ ++ ++ Dili ++ tz_names ++ 帝力 ++ ++ ++ ++ Djibouti ++ tz_names ++ 吉布提 ++ ++ ++ ++ Dominica ++ tz_names ++ 多米尼克 ++ ++ ++ ++ Douala ++ tz_names ++ 杜阿拉 ++ ++ ++ ++ Dubai ++ tz_names ++ 迪拜 ++ ++ ++ ++ Dublin ++ tz_names ++ 都柏林 ++ ++ ++ ++ DumontDUrville ++ tz_names ++ 杜蒙·杜维尔 ++ ++ ++ ++ Dushanbe ++ tz_names ++ 杜尚别 ++ ++ ++ ++ Easter ++ tz_names ++ 伊斯特迪 ++ ++ ++ ++ Edmonton ++ tz_names ++ 埃德蒙顿 ++ ++ ++ ++ Efate ++ tz_names ++ 埃法特岛 ++ ++ ++ ++ Eirunepe ++ tz_names ++ 埃鲁内佩 ++ ++ ++ ++ El Aaiun ++ tz_names ++ 阿尤恩 ++ ++ ++ ++ El Salvador ++ tz_names ++ 萨尔瓦多 ++ ++ ++ ++ Enderbury ++ tz_names ++ 恩德伯里 ++ ++ ++ ++ Eucla ++ tz_names ++ 尤克拉 ++ ++ ++ ++ Fakaofo ++ tz_names ++ 法考福 ++ ++ ++ ++ Famagusta ++ tz_names ++ 法马古斯塔 ++ ++ ++ ++ Faroe ++ tz_names ++ 法罗 ++ ++ ++ ++ Fiji ++ tz_names ++ 斐济 ++ ++ ++ ++ Fort Nelson ++ tz_names ++ 纳尔逊堡 ++ ++ ++ ++ Fortaleza ++ tz_names ++ 福塔莱萨 ++ ++ ++ ++ Freetown ++ tz_names ++ 弗里敦 ++ ++ ++ ++ Funafuti ++ tz_names ++ 富纳富提 ++ ++ ++ ++ Gaborone ++ tz_names ++ 哈博罗内 ++ ++ ++ ++ Galapagos ++ tz_names ++ 加拉帕戈斯群岛 ++ ++ ++ ++ Gambier ++ tz_names ++ 甘比尔 ++ ++ ++ ++ Gaza ++ tz_names ++ 加沙 ++ ++ ++ ++ Gibraltar ++ tz_names ++ 直布罗陀 ++ ++ ++ ++ Glace Bay ++ tz_names ++ 格莱斯湾 ++ ++ ++ ++ Godthab ++ tz_names ++ 戈德萨布 ++ ++ ++ ++ Goose Bay ++ tz_names ++ 鹅湾 ++ ++ ++ ++ Grand Turk ++ tz_names ++ 大特克 ++ ++ ++ ++ Grenada ++ tz_names ++ 格林纳达 ++ ++ ++ ++ Guadalcanal ++ tz_names ++ 瓜达尔卡纳尔岛 ++ ++ ++ ++ Guadeloupe ++ tz_names ++ 瓜德罗普岛 ++ ++ ++ ++ Guam ++ tz_names ++ 关岛 ++ ++ ++ ++ Guatemala ++ tz_names ++ 危地马拉 ++ ++ ++ ++ Guayaquil ++ tz_names ++ 瓜亚基尔 ++ ++ ++ ++ Guernsey ++ tz_names ++ 根西岛 ++ ++ ++ ++ Guyana ++ tz_names ++ 圭亚那 ++ ++ ++ ++ Halifax ++ tz_names ++ 哈利法克斯 ++ ++ ++ ++ Harare ++ tz_names ++ 哈拉雷 ++ ++ ++ ++ Havana ++ tz_names ++ 哈瓦那 ++ ++ ++ ++ Hebron ++ tz_names ++ 希伯伦 ++ ++ ++ ++ Helsinki ++ tz_names ++ 赫尔辛基 ++ ++ ++ ++ Hermosillo ++ tz_names ++ 埃莫西洛 ++ ++ ++ ++ Ho Chi Minh ++ tz_names ++ 胡志明 ++ ++ ++ ++ Hobart ++ tz_names ++ 霍巴特 ++ ++ ++ ++ Hong Kong(China) ++ tz_names ++ 香港(中国) ++ ++ ++ ++ Honolulu ++ tz_names ++ 檀香山 ++ ++ ++ ++ Hovd ++ tz_names ++ 科布多 ++ ++ ++ ++ Indiana/Indianapolis ++ tz_names ++ 印第安纳州/印第安纳波利斯 ++ ++ ++ ++ Indiana/Knox ++ tz_names ++ 印第安纳州/诺克斯 ++ ++ ++ ++ Indiana/Marengo ++ tz_names ++ 印度/马伦戈 ++ ++ ++ ++ Indiana/Petersburg ++ tz_names ++ 印第安纳州/彼得堡 ++ ++ ++ ++ Indiana/Tell City ++ tz_names ++ 印第安纳州/泰尔城 ++ ++ ++ ++ Indiana/Vevay ++ tz_names ++ 印度/沃韦 ++ ++ ++ ++ Indiana/Vincennes ++ tz_names ++ 印第安纳州/文森斯 ++ ++ ++ ++ Indiana/Winamac ++ tz_names ++ 印第安纳州/威纳马克 ++ ++ ++ ++ Inuvik ++ tz_names ++ 伊努维克 ++ ++ ++ ++ Iqaluit ++ tz_names ++ 伊魁特 ++ ++ ++ ++ Irkutsk ++ tz_names ++ 伊尔库茨克 ++ ++ ++ ++ Isle of Man ++ tz_names ++ 马恩岛 ++ ++ ++ ++ Istanbul ++ tz_names ++ 伊斯坦布尔 ++ ++ ++ ++ Jakarta ++ tz_names ++ 雅加达 ++ ++ ++ ++ Jamaica ++ tz_names ++ 牙买加 ++ ++ ++ ++ Jayapura ++ tz_names ++ 查亚普拉 ++ ++ ++ ++ Jersey ++ tz_names ++ 泽西岛 ++ ++ ++ ++ Jerusalem ++ tz_names ++ 耶路撒冷 ++ ++ ++ ++ Johannesburg ++ tz_names ++ 约翰内斯堡 ++ ++ ++ ++ Juba ++ tz_names ++ 朱巴 ++ ++ ++ ++ Juneau ++ tz_names ++ 朱诺 ++ ++ ++ ++ Kabul ++ tz_names ++ 喀布尔 ++ ++ ++ ++ Kaliningrad ++ tz_names ++ 加里宁格勒 ++ ++ ++ ++ Kamchatka ++ tz_names ++ 堪察加半岛 ++ ++ ++ ++ Kampala ++ tz_names ++ 坎帕拉 ++ ++ ++ ++ Karachi ++ tz_names ++ 卡拉奇 ++ ++ ++ ++ Kathmandu ++ tz_names ++ 加德满都 ++ ++ ++ ++ Kentucky/Louisville ++ tz_names ++ 肯塔基州/路易斯维尔 ++ ++ ++ ++ Kentucky/Monticello ++ tz_names ++ 肯塔基州/蒙蒂塞洛 ++ ++ ++ ++ Kerguelen ++ tz_names ++ 凯尔盖朗 ++ ++ ++ ++ Khandyga ++ tz_names ++ 坎代加 ++ ++ ++ ++ Khartoum ++ tz_names ++ 喀土穆 ++ ++ ++ ++ Kiev ++ tz_names ++ 基辅 ++ ++ ++ ++ Kigali ++ tz_names ++ 基加利 ++ ++ ++ ++ Kinshasa ++ tz_names ++ 金沙萨 ++ ++ ++ ++ Kiritimati ++ tz_names ++ 基里蒂马提斯 ++ ++ ++ ++ Kirov ++ tz_names ++ 基洛夫 ++ ++ ++ ++ Kolkata ++ tz_names ++ 加尔格达 ++ ++ ++ ++ Kosrae ++ tz_names ++ 科斯雷 ++ ++ ++ ++ Kralendijk ++ tz_names ++ 克罗地亚 ++ ++ ++ ++ Krasnoyarsk ++ tz_names ++ 克拉斯诺亚尔斯克 ++ ++ ++ ++ Kuala Lumpur ++ tz_names ++ 吉隆坡 ++ ++ ++ ++ Kuching ++ tz_names ++ 古晋 ++ ++ ++ ++ Kuwait ++ tz_names ++ 科威特 ++ ++ ++ ++ Kwajalein ++ tz_names ++ 夸贾林 ++ ++ ++ ++ La Paz ++ tz_names ++ 拉巴斯 ++ ++ ++ ++ Lagos ++ tz_names ++ 拉各斯 ++ ++ ++ ++ Libreville ++ tz_names ++ 利伯维尔 ++ ++ ++ ++ Lima ++ tz_names ++ 利马 ++ ++ ++ ++ Lindeman ++ tz_names ++ 林德曼 ++ ++ ++ ++ Lisbon ++ tz_names ++ 里斯本 ++ ++ ++ ++ Ljubljana ++ tz_names ++ 卢布尔雅那 ++ ++ ++ ++ Lome ++ tz_names ++ 多哥 ++ ++ ++ ++ London ++ tz_names ++ 伦敦 ++ ++ ++ ++ Longyearbyen ++ tz_names ++ 朗伊尔城 ++ ++ ++ ++ Lord Howe ++ tz_names ++ 豪勋爵 ++ ++ ++ ++ Los Angeles ++ tz_names ++ 洛杉矶 ++ ++ ++ ++ Lower Princes ++ tz_names ++ 圣马丁 ++ ++ ++ ++ Luanda ++ tz_names ++ 罗安达 ++ ++ ++ ++ Lubumbashi ++ tz_names ++ 卢本巴希 ++ ++ ++ ++ Lusaka ++ tz_names ++ 卢萨卡 ++ ++ ++ ++ Luxembourg ++ tz_names ++ 卢森堡 ++ ++ ++ ++ Macau(China) ++ tz_names ++ 澳门(中国) ++ ++ ++ ++ Maceio ++ tz_names ++ 马塞奥 ++ ++ ++ ++ Macquarie ++ tz_names ++ 麦格理 ++ ++ ++ ++ Madeira ++ tz_names ++ 马德拉 ++ ++ ++ ++ Madrid ++ tz_names ++ 马德里 ++ ++ ++ ++ Magadan ++ tz_names ++ 马加丹 ++ ++ ++ ++ Mahe ++ tz_names ++ 马埃 ++ ++ ++ ++ Majuro ++ tz_names ++ 马朱罗 ++ ++ ++ ++ Makassar ++ tz_names ++ 望加锡 ++ ++ ++ ++ Malabo ++ tz_names ++ 马拉博 ++ ++ ++ ++ Maldives ++ tz_names ++ 马尔代夫 ++ ++ ++ ++ Malta ++ tz_names ++ 马耳他 ++ ++ ++ ++ Managua ++ tz_names ++ 马那瓜 ++ ++ ++ ++ Manaus ++ tz_names ++ 马瑙斯 ++ ++ ++ ++ Manila ++ tz_names ++ 马尼拉 ++ ++ ++ ++ Maputo ++ tz_names ++ 马普托 ++ ++ ++ ++ Mariehamn ++ tz_names ++ 玛丽港 ++ ++ ++ ++ Marigot ++ tz_names ++ 马里戈 ++ ++ ++ ++ Marquesas ++ tz_names ++ 马克萨斯 ++ ++ ++ ++ Martinique ++ tz_names ++ 马提尼克岛 ++ ++ ++ ++ Maseru ++ tz_names ++ 马塞卢 ++ ++ ++ ++ Matamoros ++ tz_names ++ 马塔莫罗斯 ++ ++ ++ ++ Mauritius ++ tz_names ++ 毛里求斯 ++ ++ ++ ++ Mawson ++ tz_names ++ 莫森 ++ ++ ++ ++ Mayotte ++ tz_names ++ 马约特岛 ++ ++ ++ ++ Mazatlan ++ tz_names ++ 马萨特兰 ++ ++ ++ ++ Mbabane ++ tz_names ++ 姆巴巴内 ++ ++ ++ ++ McMurdo ++ tz_names ++ 麦克默多 ++ ++ ++ ++ Melbourne ++ tz_names ++ 墨尔本 ++ ++ ++ ++ Menominee ++ tz_names ++ 梅诺米尼 ++ ++ ++ ++ Merida ++ tz_names ++ 梅里达 ++ ++ ++ ++ Metlakatla ++ tz_names ++ 梅特拉卡特拉 ++ ++ ++ ++ Mexico City ++ tz_names ++ 墨西哥城 ++ ++ ++ ++ Midway ++ tz_names ++ 中途岛 ++ ++ ++ ++ Minsk ++ tz_names ++ 明斯克 ++ ++ ++ ++ Miquelon ++ tz_names ++ 密克隆 ++ ++ ++ ++ Mogadishu ++ tz_names ++ 摩加迪沙 ++ ++ ++ ++ Monaco ++ tz_names ++ 摩纳哥 ++ ++ ++ ++ Moncton ++ tz_names ++ 蒙克顿 ++ ++ ++ ++ Monrovia ++ tz_names ++ 蒙罗维亚 ++ ++ ++ ++ Monterrey ++ tz_names ++ 蒙特雷 ++ ++ ++ ++ Montevideo ++ tz_names ++ 蒙得维的亚 ++ ++ ++ ++ Montserrat ++ tz_names ++ 蒙特塞拉特 ++ ++ ++ ++ Moscow ++ tz_names ++ 莫斯科 ++ ++ ++ ++ Muscat ++ tz_names ++ 马斯喀特 ++ ++ ++ ++ Nairobi ++ tz_names ++ 内罗毕 ++ ++ ++ ++ Nassau ++ tz_names ++ 拿骚 ++ ++ ++ ++ Nauru ++ tz_names ++ 瑙鲁 ++ ++ ++ ++ Ndjamena ++ tz_names ++ 恩贾梅纳 ++ ++ ++ ++ New York ++ tz_names ++ 纽约 ++ ++ ++ ++ Niamey ++ tz_names ++ 尼亚美 ++ ++ ++ ++ Nicosia ++ tz_names ++ 尼科西亚 ++ ++ ++ ++ Nipigon ++ tz_names ++ 尼皮贡 ++ ++ ++ ++ Niue ++ tz_names ++ 纽埃 ++ ++ ++ ++ Nome ++ tz_names ++ 诺姆 ++ ++ ++ ++ Norfolk ++ tz_names ++ 诺福克 ++ ++ ++ ++ Noronha ++ tz_names ++ 诺罗尼亚 ++ ++ ++ ++ North Dakota/Beulah ++ tz_names ++ 北达科他州/比拉 ++ ++ ++ ++ North Dakota/Center ++ tz_names ++ 北达科他州/中心 ++ ++ ++ ++ North Dakota/New Salem ++ tz_names ++ 北达科他州/新塞勒姆 ++ ++ ++ ++ Nouakchott ++ tz_names ++ 努瓦克肖特 ++ ++ ++ ++ Noumea ++ tz_names ++ 努美阿 ++ ++ ++ ++ Novokuznetsk ++ tz_names ++ 新库兹涅茨克 ++ ++ ++ ++ Novosibirsk ++ tz_names ++ 新西伯利亚 ++ ++ ++ ++ Ojinaga ++ tz_names ++ 魁北克 ++ ++ ++ ++ Omsk ++ tz_names ++ 鄂木斯克 ++ ++ ++ ++ Oral ++ tz_names ++ 多拉 ++ ++ ++ ++ Oslo ++ tz_names ++ 奥斯陆 ++ ++ ++ ++ Ouagadougou ++ tz_names ++ 瓦加杜古 ++ ++ ++ ++ Pago Pago ++ tz_names ++ 帕果帕果 ++ ++ ++ ++ Palau ++ tz_names ++ 帕劳 ++ ++ ++ ++ Palmer ++ tz_names ++ 帕尔默 ++ ++ ++ ++ Panama ++ tz_names ++ 巴拿马 ++ ++ ++ ++ Pangnirtung ++ tz_names ++ 巴芬岛的旁涅唐 ++ ++ ++ ++ Paramaribo ++ tz_names ++ 帕拉马里博 ++ ++ ++ ++ Paris ++ tz_names ++ 巴黎 ++ ++ ++ ++ Perth ++ tz_names ++ 珀斯 ++ ++ ++ ++ Phnom Penh ++ tz_names ++ 金边 ++ ++ ++ ++ Phoenix ++ tz_names ++ 凤凰城 ++ ++ ++ ++ Pitcairn ++ tz_names ++ 皮特凯恩 ++ ++ ++ ++ Podgorica ++ tz_names ++ 波德戈里察 ++ ++ ++ ++ Pohnpei ++ tz_names ++ 波纳佩岛 ++ ++ ++ ++ Pontianak ++ tz_names ++ 坤甸 ++ ++ ++ ++ Port Moresby ++ tz_names ++ 莫尔兹比港 ++ ++ ++ ++ Port of Spain ++ tz_names ++ 西班牙港 ++ ++ ++ ++ Port-au-Prince ++ tz_names ++ 太子港 ++ ++ ++ ++ Porto Velho ++ tz_names ++ 维略港 ++ ++ ++ ++ Porto-Novo ++ tz_names ++ 波多诺伏 ++ ++ ++ ++ Prague ++ tz_names ++ 布拉格 ++ ++ ++ ++ Puerto Rico ++ tz_names ++ 波多黎各 ++ ++ ++ ++ Punta Arenas ++ tz_names ++ 蓬塔阿雷纳斯 ++ ++ ++ ++ Pyongyang ++ tz_names ++ 平壤 ++ ++ ++ ++ Qatar ++ tz_names ++ 卡塔尔 ++ ++ ++ ++ Qostanay ++ tz_names ++ 库斯塔 ++ ++ ++ ++ Qyzylorda ++ tz_names ++ 克孜勒奥尔达 ++ ++ ++ ++ Rainy River ++ tz_names ++ 雷尼河 ++ ++ ++ ++ Rankin Inlet ++ tz_names ++ 兰京海口 ++ ++ ++ ++ Rarotonga ++ tz_names ++ 拉罗汤加 ++ ++ ++ ++ Recife ++ tz_names ++ 累西腓 ++ ++ ++ ++ Regina ++ tz_names ++ 里贾纳 ++ ++ ++ ++ Resolute ++ tz_names ++ 雷索卢特 ++ ++ ++ ++ Reunion ++ tz_names ++ 留尼旺岛 ++ ++ ++ ++ Reykjavik ++ tz_names ++ 雷克雅未克 ++ ++ ++ ++ Riga ++ tz_names ++ 里加 ++ ++ ++ ++ Rio Branco ++ tz_names ++ 里奥·布兰科 ++ ++ ++ ++ Riyadh ++ tz_names ++ 利雅得 ++ ++ ++ ++ Rome ++ tz_names ++ 罗马 ++ ++ ++ ++ Rothera ++ tz_names ++ 罗瑟拉 ++ ++ ++ ++ Saipan ++ tz_names ++ 塞班岛 ++ ++ ++ ++ Sakhalin ++ tz_names ++ 萨哈林 ++ ++ ++ ++ Samara ++ tz_names ++ 萨马拉 ++ ++ ++ ++ Samarkand ++ tz_names ++ 撒马尔罕 ++ ++ ++ ++ San Marino ++ tz_names ++ 圣马力诺 ++ ++ ++ ++ Santarem ++ tz_names ++ 圣塔伦 ++ ++ ++ ++ Santiago ++ tz_names ++ 圣地亚哥 ++ ++ ++ ++ Santo Domingo ++ tz_names ++ 圣多明各 ++ ++ ++ ++ Sao Paulo ++ tz_names ++ 圣保罗 ++ ++ ++ ++ Sao Tome ++ tz_names ++ 圣多美 ++ ++ ++ ++ Sarajevo ++ tz_names ++ 萨拉热窝 ++ ++ ++ ++ Saratov ++ tz_names ++ 萨拉托夫 ++ ++ ++ ++ Scoresbysund ++ tz_names ++ 斯科斯比基金 ++ ++ ++ ++ Seoul ++ tz_names ++ 首尔 ++ ++ ++ ++ Shanghai ++ tz_names ++ 上海 ++ ++ ++ ++ Simferopol ++ tz_names ++ 辛菲罗波尔 ++ ++ ++ ++ Singapore ++ tz_names ++ 新加坡 ++ ++ ++ ++ Sitka ++ tz_names ++ 锡特卡 ++ ++ ++ ++ Skopje ++ tz_names ++ 斯科普里 ++ ++ ++ ++ Sofia ++ tz_names ++ 索菲亚 ++ ++ ++ ++ South Georgia ++ tz_names ++ 南乔治亚州 ++ ++ ++ ++ Srednekolymsk ++ tz_names ++ 雅库特 ++ ++ ++ ++ St Barthelemy ++ tz_names ++ 圣巴泰勒米 ++ ++ ++ ++ St Helena ++ tz_names ++ 圣赫勒拿 ++ ++ ++ ++ St Johns ++ tz_names ++ 圣约翰 ++ ++ ++ ++ St Kitts ++ tz_names ++ 圣基茨 ++ ++ ++ ++ St Lucia ++ tz_names ++ 圣卢西亚 ++ ++ ++ ++ St Thomas ++ tz_names ++ 圣托马斯 ++ ++ ++ ++ St Vincent ++ tz_names ++ 圣文森特 ++ ++ ++ ++ Stanley ++ tz_names ++ 斯坦利 ++ ++ ++ ++ Stockholm ++ tz_names ++ 斯德哥尔摩 ++ ++ ++ ++ Swift Current ++ tz_names ++ 斯威夫特卡伦特 ++ ++ ++ ++ Sydney ++ tz_names ++ 悉尼 ++ ++ ++ ++ Syowa ++ tz_names ++ 圣何塞 ++ ++ ++ ++ Tahiti ++ tz_names ++ 大溪地 ++ ++ ++ ++ Taipei(China) ++ tz_names ++ 台北(中国) ++ ++ ++ ++ Tallinn ++ tz_names ++ 塔林 ++ ++ ++ ++ Tarawa ++ tz_names ++ 塔拉瓦 ++ ++ ++ ++ Tashkent ++ tz_names ++ 塔什干 ++ ++ ++ ++ Tbilisi ++ tz_names ++ 第比利斯 ++ ++ ++ ++ Tegucigalpa ++ tz_names ++ 特古西加尔巴 ++ ++ ++ ++ Tehran ++ tz_names ++ 德黑兰 ++ ++ ++ ++ Thimphu ++ tz_names ++ 廷布 ++ ++ ++ ++ Thule ++ tz_names ++ 图勒 ++ ++ ++ ++ Thunder Bay ++ tz_names ++ 雷湾 ++ ++ ++ ++ Tijuana ++ tz_names ++ 蒂华纳 ++ ++ ++ ++ Tirane ++ tz_names ++ 地拉那 ++ ++ ++ ++ Tokyo ++ tz_names ++ 东京 ++ ++ ++ ++ Tomsk ++ tz_names ++ 托木斯克 ++ ++ ++ ++ Tongatapu ++ tz_names ++ 汤加塔布 ++ ++ ++ ++ Toronto ++ tz_names ++ 多伦多 ++ ++ ++ ++ Tortola ++ tz_names ++ 托托拉岛 ++ ++ ++ ++ Tripoli ++ tz_names ++ 的黎波里 ++ ++ ++ ++ Troll ++ tz_names ++ 特罗尔海坦 ++ ++ ++ ++ Tunis ++ tz_names ++ 突尼斯 ++ ++ ++ ++ Ulaanbaatar ++ tz_names ++ 乌兰巴托 ++ ++ ++ ++ Ulyanovsk ++ tz_names ++ 乌里扬诺夫斯克 ++ ++ ++ ++ Urumqi ++ tz_names ++ 乌鲁木齐 ++ ++ ++ ++ Ust-Nera ++ tz_names ++ 乌斯季挪拉 ++ ++ ++ ++ Uzhgorod ++ tz_names ++ 乌日哥罗德 ++ ++ ++ ++ Vaduz ++ tz_names ++ 瓦杜兹 ++ ++ ++ ++ Vancouver ++ tz_names ++ 温哥华 ++ ++ ++ ++ Vatican ++ tz_names ++ 梵蒂冈 ++ ++ ++ ++ Vienna ++ tz_names ++ 维也纳 ++ ++ ++ ++ Vientiane ++ tz_names ++ 万象 ++ ++ ++ ++ Vilnius ++ tz_names ++ 维尔纽斯 ++ ++ ++ ++ Vladivostok ++ tz_names ++ 符拉迪沃斯托克 ++ ++ ++ ++ Volgograd ++ tz_names ++ 伏尔加格勒 ++ ++ ++ ++ Vostok ++ tz_names ++ 沃斯托克 ++ ++ ++ ++ Wake ++ tz_names ++ 韦克 ++ ++ ++ ++ Wallis ++ tz_names ++ 沃利斯 ++ ++ ++ ++ Warsaw ++ tz_names ++ 华沙 ++ ++ ++ ++ Whitehorse ++ tz_names ++ 怀特霍斯 ++ ++ ++ ++ Windhoek ++ tz_names ++ 温得和克 ++ ++ ++ ++ Winnipeg ++ tz_names ++ 温尼伯 ++ ++ ++ ++ Yakutat ++ tz_names ++ 雅库特 ++ ++ ++ ++ Yakutsk ++ tz_names ++ 雅库茨克 ++ ++ ++ ++ Yangon ++ tz_names ++ 仰光 ++ ++ ++ ++ Yekaterinburg ++ tz_names ++ 叶卡捷琳堡 ++ ++ ++ ++ Yellowknife ++ tz_names ++ 耶洛奈夫 ++ ++ ++ ++ Yerevan ++ tz_names ++ 埃里温 ++ ++ ++ ++ Zagreb ++ tz_names ++ 萨格勒布 ++ ++ ++ ++ Zaporozhye ++ tz_names ++ 扎波罗热 ++ ++ ++ ++ Zurich ++ tz_names ++ 苏黎世 ++ ++ ++ +diff --git a/lang/tz_zh_TW.ts b/lang/tz_zh_TW.ts +new file mode 100644 +index 0000000..2713d37 +--- /dev/null ++++ b/lang/tz_zh_TW.ts +@@ -0,0 +1,2626 @@ ++ ++ ++ ++ ++ ++ QObject ++ ++ ++ Africa ++ tz_regions ++ 非洲 ++ ++ ++ ++ America ++ tz_regions ++ 美洲 ++ ++ ++ ++ Antarctica ++ tz_regions ++ 南極洲 ++ ++ ++ ++ Arctic ++ tz_regions ++ 北極 ++ ++ ++ ++ Asia ++ tz_regions ++ 亞洲 ++ ++ ++ ++ Atlantic ++ tz_regions ++ 大西洋 ++ ++ ++ ++ Australia ++ tz_regions ++ 澳大利亞 ++ ++ ++ ++ Europe ++ tz_regions ++ 歐洲 ++ ++ ++ ++ Indian ++ tz_regions ++ 印度 ++ ++ ++ ++ Pacific ++ tz_regions ++ 太平洋 ++ ++ ++ ++ Abidjan ++ tz_names ++ 阿必尚 ++ ++ ++ ++ Accra ++ tz_names ++ 阿克拉 ++ ++ ++ ++ Adak ++ tz_names ++ 阿達克 ++ ++ ++ ++ Addis Ababa ++ tz_names ++ 阿迪斯阿貝巴 ++ ++ ++ ++ Adelaide ++ tz_names ++ 阿德萊德 ++ ++ ++ ++ Aden ++ tz_names ++ 亞丁 ++ ++ ++ ++ Algiers ++ tz_names ++ 阿爾及爾 ++ ++ ++ ++ Almaty ++ tz_names ++ 阿拉木圖 ++ ++ ++ ++ Amman ++ tz_names ++ 安曼 ++ ++ ++ ++ Amsterdam ++ tz_names ++ 阿姆斯特丹 ++ ++ ++ ++ Anadyr ++ tz_names ++ 阿納迪爾 ++ ++ ++ ++ Anchorage ++ tz_names ++ 安克雷奇 ++ ++ ++ ++ Andorra ++ tz_names ++ 安道爾 ++ ++ ++ ++ Anguilla ++ tz_names ++ 安圭拉 ++ ++ ++ ++ Antananarivo ++ tz_names ++ 安塔那那利佛 ++ ++ ++ ++ Antigua ++ tz_names ++ 安提瓜 ++ ++ ++ ++ Apia ++ tz_names ++ 亞庇 ++ ++ ++ ++ Aqtau ++ tz_names ++ 阿克托 ++ ++ ++ ++ Aqtobe ++ tz_names ++ 阿克托貝 ++ ++ ++ ++ Araguaina ++ tz_names ++ 阿拉瓜伊納 ++ ++ ++ ++ Argentina/Buenos Aires ++ tz_names ++ 阿根廷/布宜諾賽勒斯 ++ ++ ++ ++ Argentina/Catamarca ++ tz_names ++ 阿根廷/卡塔馬卡 ++ ++ ++ ++ Argentina/Cordoba ++ tz_names ++ 阿根廷/科爾多瓦 ++ ++ ++ ++ Argentina/Jujuy ++ tz_names ++ 阿根廷/胡胡伊 ++ ++ ++ ++ Argentina/La Rioja ++ tz_names ++ 阿根廷/拉里奧哈 ++ ++ ++ ++ Argentina/Mendoza ++ tz_names ++ 阿根廷/門多薩 ++ ++ ++ ++ Argentina/Rio Gallegos ++ tz_names ++ 阿根廷/裏奧加列戈斯 ++ ++ ++ ++ Argentina/Salta ++ tz_names ++ 阿根廷/薩爾塔 ++ ++ ++ ++ Argentina/San Juan ++ tz_names ++ 阿根廷/聖胡安 ++ ++ ++ ++ Argentina/San Luis ++ tz_names ++ 阿根廷/聖路易斯 ++ ++ ++ ++ Argentina/Tucuman ++ tz_names ++ 阿根廷/圖庫曼 ++ ++ ++ ++ Argentina/Ushuaia ++ tz_names ++ 阿根廷/烏斯懷亞 ++ ++ ++ ++ Aruba ++ tz_names ++ 阿魯巴 ++ ++ ++ ++ Ashgabat ++ tz_names ++ 阿什哈巴德 ++ ++ ++ ++ Asmara ++ tz_names ++ 阿斯馬拉 ++ ++ ++ ++ Astrakhan ++ tz_names ++ 阿斯特拉罕 ++ ++ ++ ++ Asuncion ++ tz_names ++ 亞松森 ++ ++ ++ ++ Athens ++ tz_names ++ 雅典 ++ ++ ++ ++ Atikokan ++ tz_names ++ 阿提科坎 ++ ++ ++ ++ Atyrau ++ tz_names ++ 阿特勞 ++ ++ ++ ++ Auckland ++ tz_names ++ 奧克蘭 ++ ++ ++ ++ Azores ++ tz_names ++ 亞速爾群島 ++ ++ ++ ++ Baghdad ++ tz_names ++ 巴格達 ++ ++ ++ ++ Bahia ++ tz_names ++ 巴伊亞 ++ ++ ++ ++ Bahia Banderas ++ tz_names ++ 巴伊亞·班德拉斯 ++ ++ ++ ++ Bahrain ++ tz_names ++ 巴林 ++ ++ ++ ++ Baku ++ tz_names ++ 巴庫 ++ ++ ++ ++ Bamako ++ tz_names ++ 巴馬科 ++ ++ ++ ++ Bangkok ++ tz_names ++ 曼谷 ++ ++ ++ ++ Bangui ++ tz_names ++ 班基 ++ ++ ++ ++ Banjul ++ tz_names ++ 班竹 ++ ++ ++ ++ Barbados ++ tz_names ++ 巴巴多斯 ++ ++ ++ ++ Barnaul ++ tz_names ++ 巴爾瑙爾 ++ ++ ++ ++ Beirut ++ tz_names ++ 貝魯特 ++ ++ ++ ++ Belem ++ tz_names ++ 貝倫 ++ ++ ++ ++ Belgrade ++ tz_names ++ 貝爾格勒 ++ ++ ++ ++ Belize ++ tz_names ++ 貝裡斯 ++ ++ ++ ++ Berlin ++ tz_names ++ 柏林 ++ ++ ++ ++ Bermuda ++ tz_names ++ 百慕大 ++ ++ ++ ++ Bishkek ++ tz_names ++ 比什凱克 ++ ++ ++ ++ Bissau ++ tz_names ++ 比索 ++ ++ ++ ++ Beijing ++ tz_names ++ 北京 ++ ++ ++ ++ Blanc-Sablon ++ tz_names ++ 布蘭克·薩布隆 ++ ++ ++ ++ Blantyre ++ tz_names ++ 布蘭太爾 ++ ++ ++ ++ Boa Vista ++ tz_names ++ 博阿維斯塔 ++ ++ ++ ++ Bogota ++ tz_names ++ 波哥大 ++ ++ ++ ++ Boise ++ tz_names ++ 博伊西 ++ ++ ++ ++ Bougainville ++ tz_names ++ 布幹維爾 ++ ++ ++ ++ Bratislava ++ tz_names ++ 布拉提斯拉瓦 ++ ++ ++ ++ Brazzaville ++ tz_names ++ 布拉柴維爾 ++ ++ ++ ++ Brisbane ++ tz_names ++ 布里斯班 ++ ++ ++ ++ Broken Hill ++ tz_names ++ 布羅肯希爾 ++ ++ ++ ++ Brunei ++ tz_names ++ 汶萊 ++ ++ ++ ++ Brussels ++ tz_names ++ 布魯塞爾 ++ ++ ++ ++ Bucharest ++ tz_names ++ 布加勒斯特 ++ ++ ++ ++ Budapest ++ tz_names ++ 布達佩斯 ++ ++ ++ ++ Bujumbura ++ tz_names ++ 布松布拉 ++ ++ ++ ++ Busingen ++ tz_names ++ 匯流排 ++ ++ ++ ++ Cairo ++ tz_names ++ 開羅 ++ ++ ++ ++ Cambridge Bay ++ tz_names ++ 劍橋灣 ++ ++ ++ ++ Campo Grande ++ tz_names ++ 坎波格蘭德 ++ ++ ++ ++ Canary ++ tz_names ++ 加那利群島 ++ ++ ++ ++ Cancun ++ tz_names ++ 坎昆 ++ ++ ++ ++ Cape Verde ++ tz_names ++ 佛得角 ++ ++ ++ ++ Caracas ++ tz_names ++ 卡拉卡斯 ++ ++ ++ ++ Casablanca ++ tz_names ++ 卡薩布蘭卡 ++ ++ ++ ++ Casey ++ tz_names ++ 凱西 ++ ++ ++ ++ Cayenne ++ tz_names ++ 卡宴 ++ ++ ++ ++ Cayman ++ tz_names ++ 開曼群島 ++ ++ ++ ++ Ceuta ++ tz_names ++ 休達 ++ ++ ++ ++ Chagos ++ tz_names ++ 查戈斯 ++ ++ ++ ++ Chatham ++ tz_names ++ 查塔姆 ++ ++ ++ ++ Chicago ++ tz_names ++ 芝加哥 ++ ++ ++ ++ Chihuahua ++ tz_names ++ 吉娃娃 ++ ++ ++ ++ Chisinau ++ tz_names ++ 基希訥烏 ++ ++ ++ ++ Chita ++ tz_names ++ 赤塔 ++ ++ ++ ++ Choibalsan ++ tz_names ++ 喬巴桑 ++ ++ ++ ++ Christmas ++ tz_names ++ 耶誕節 ++ ++ ++ ++ Chuuk ++ tz_names ++ 楚克 ++ ++ ++ ++ Cocos ++ tz_names ++ 科科斯 ++ ++ ++ ++ Colombo ++ tz_names ++ 可倫坡 ++ ++ ++ ++ Comoro ++ tz_names ++ 科摩羅 ++ ++ ++ ++ Conakry ++ tz_names ++ 柯那克里 ++ ++ ++ ++ Copenhagen ++ tz_names ++ 哥本哈根 ++ ++ ++ ++ Costa Rica ++ tz_names ++ 哥斯大黎加 ++ ++ ++ ++ Creston ++ tz_names ++ 克雷斯頓 ++ ++ ++ ++ Cuiaba ++ tz_names ++ 庫亞巴 ++ ++ ++ ++ Curacao ++ tz_names ++ 庫拉索 ++ ++ ++ ++ Currie ++ tz_names ++ 柯裡 ++ ++ ++ ++ Dakar ++ tz_names ++ 達喀爾 ++ ++ ++ ++ Damascus ++ tz_names ++ 大馬士革 ++ ++ ++ ++ Danmarkshavn ++ tz_names ++ 丹麥 ++ ++ ++ ++ Dar es Salaam ++ tz_names ++ 沙蘭港 ++ ++ ++ ++ Darwin ++ tz_names ++ 達爾文 ++ ++ ++ ++ Davis ++ tz_names ++ 大衛斯 ++ ++ ++ ++ Dawson ++ tz_names ++ 道森 ++ ++ ++ ++ Dawson Creek ++ tz_names ++ 道森溪 ++ ++ ++ ++ Denver ++ tz_names ++ 丹佛 ++ ++ ++ ++ Detroit ++ tz_names ++ 底特律 ++ ++ ++ ++ Dhaka ++ tz_names ++ 達卡 ++ ++ ++ ++ Dili ++ tz_names ++ 帝利 ++ ++ ++ ++ Djibouti ++ tz_names ++ 吉佈提 ++ ++ ++ ++ Dominica ++ tz_names ++ 多明尼克 ++ ++ ++ ++ Douala ++ tz_names ++ 杜阿拉 ++ ++ ++ ++ Dubai ++ tz_names ++ 迪拜 ++ ++ ++ ++ Dublin ++ tz_names ++ 都柏林 ++ ++ ++ ++ DumontDUrville ++ tz_names ++ 杜蒙·杜維爾 ++ ++ ++ ++ Dushanbe ++ tz_names ++ 杜桑貝 ++ ++ ++ ++ Easter ++ tz_names ++ 復活節 ++ ++ ++ ++ Edmonton ++ tz_names ++ 埃德蒙頓 ++ ++ ++ ++ Efate ++ tz_names ++ 埃法特島 ++ ++ ++ ++ Eirunepe ++ tz_names ++ 埃魯內佩 ++ ++ ++ ++ El Aaiun ++ tz_names ++ 阿尤恩 ++ ++ ++ ++ El Salvador ++ tz_names ++ 薩爾瓦多 ++ ++ ++ ++ Enderbury ++ tz_names ++ 恩德伯裡 ++ ++ ++ ++ Eucla ++ tz_names ++ 尤克拉 ++ ++ ++ ++ Fakaofo ++ tz_names ++ 法攷福 ++ ++ ++ ++ Famagusta ++ tz_names ++ 法馬古斯塔 ++ ++ ++ ++ Faroe ++ tz_names ++ 法羅 ++ ++ ++ ++ Fiji ++ tz_names ++ 斐濟 ++ ++ ++ ++ Fort Nelson ++ tz_names ++ 納爾遜堡 ++ ++ ++ ++ Fortaleza ++ tz_names ++ 福塔雷薩 ++ ++ ++ ++ Freetown ++ tz_names ++ 弗裏敦 ++ ++ ++ ++ Funafuti ++ tz_names ++ 福納佛提 ++ ++ ++ ++ Gaborone ++ tz_names ++ 嘉柏隆里 ++ ++ ++ ++ Galapagos ++ tz_names ++ 加拉帕戈斯群島 ++ ++ ++ ++ Gambier ++ tz_names ++ 甘比爾 ++ ++ ++ ++ Gaza ++ tz_names ++ 加沙 ++ ++ ++ ++ Gibraltar ++ tz_names ++ 直布羅陀 ++ ++ ++ ++ Glace Bay ++ tz_names ++ 格萊斯灣 ++ ++ ++ ++ Godthab ++ tz_names ++ 戈德薩布 ++ ++ ++ ++ Goose Bay ++ tz_names ++ 鹅灣 ++ ++ ++ ++ Grand Turk ++ tz_names ++ 大特克 ++ ++ ++ ++ Grenada ++ tz_names ++ 格林伍德 ++ ++ ++ ++ Guadalcanal ++ tz_names ++ 瓜達爾卡納爾島 ++ ++ ++ ++ Guadeloupe ++ tz_names ++ 瓜德羅普島 ++ ++ ++ ++ Guam ++ tz_names ++ 關島 ++ ++ ++ ++ Guatemala ++ tz_names ++ 瓜地馬拉 ++ ++ ++ ++ Guayaquil ++ tz_names ++ 瓜亞基爾 ++ ++ ++ ++ Guernsey ++ tz_names ++ 根西島 ++ ++ ++ ++ Guyana ++ tz_names ++ 蓋亞那 ++ ++ ++ ++ Halifax ++ tz_names ++ 哈利法克斯 ++ ++ ++ ++ Harare ++ tz_names ++ 哈拉雷 ++ ++ ++ ++ Havana ++ tz_names ++ 哈瓦那 ++ ++ ++ ++ Hebron ++ tz_names ++ 希伯倫 ++ ++ ++ ++ Helsinki ++ tz_names ++ 赫爾辛基 ++ ++ ++ ++ Hermosillo ++ tz_names ++ 埃莫西洛 ++ ++ ++ ++ Ho Chi Minh ++ tz_names ++ 胡志明 ++ ++ ++ ++ Hobart ++ tz_names ++ 霍巴特 ++ ++ ++ ++ Hong Kong(China) ++ tz_names ++ 香港(中国) ++ ++ ++ ++ Honolulu ++ tz_names ++ 檀香山 ++ ++ ++ ++ Hovd ++ tz_names ++ 科布多 ++ ++ ++ ++ Indiana/Indianapolis ++ tz_names ++ 印第安那州/印弟安納波里斯 ++ ++ ++ ++ Indiana/Knox ++ tz_names ++ 印第安那州/諾克斯 ++ ++ ++ ++ Indiana/Marengo ++ tz_names ++ 印度/馬倫戈 ++ ++ ++ ++ Indiana/Petersburg ++ tz_names ++ 印第安那州/彼得堡 ++ ++ ++ ++ Indiana/Tell City ++ tz_names ++ 印第安那州/泰爾城 ++ ++ ++ ++ Indiana/Vevay ++ tz_names ++ 印度/沃韋 ++ ++ ++ ++ Indiana/Vincennes ++ tz_names ++ 印第安那州/文森斯 ++ ++ ++ ++ Indiana/Winamac ++ tz_names ++ 印第安那州/威納馬克 ++ ++ ++ ++ Inuvik ++ tz_names ++ 伊努維克 ++ ++ ++ ++ Iqaluit ++ tz_names ++ 伊魁特 ++ ++ ++ ++ Irkutsk ++ tz_names ++ 伊爾庫茨克 ++ ++ ++ ++ Isle of Man ++ tz_names ++ 曼島 ++ ++ ++ ++ Istanbul ++ tz_names ++ 蓋章 ++ ++ ++ ++ Jakarta ++ tz_names ++ 雅加達 ++ ++ ++ ++ Jamaica ++ tz_names ++ 牙買加 ++ ++ ++ ++ Jayapura ++ tz_names ++ 查亞普拉 ++ ++ ++ ++ Jersey ++ tz_names ++ 澤西島 ++ ++ ++ ++ Jerusalem ++ tz_names ++ 耶路撒冷 ++ ++ ++ ++ Johannesburg ++ tz_names ++ 約翰尼斯堡 ++ ++ ++ ++ Juba ++ tz_names ++ 朱巴 ++ ++ ++ ++ Juneau ++ tz_names ++ 朱諾 ++ ++ ++ ++ Kabul ++ tz_names ++ 喀布爾 ++ ++ ++ ++ Kaliningrad ++ tz_names ++ 加里寧格勒 ++ ++ ++ ++ Kamchatka ++ tz_names ++ 堪察加半島 ++ ++ ++ ++ Kampala ++ tz_names ++ 坎帕拉 ++ ++ ++ ++ Karachi ++ tz_names ++ 卡拉奇 ++ ++ ++ ++ Kathmandu ++ tz_names ++ 加德滿都 ++ ++ ++ ++ Kentucky/Louisville ++ tz_names ++ 肯塔基州/路易斯維爾 ++ ++ ++ ++ Kentucky/Monticello ++ tz_names ++ 肯塔基州/蒙蒂塞洛 ++ ++ ++ ++ Kerguelen ++ tz_names ++ 凱爾蓋朗 ++ ++ ++ ++ Khandyga ++ tz_names ++ 坎代加 ++ ++ ++ ++ Khartoum ++ tz_names ++ 喀土穆 ++ ++ ++ ++ Kiev ++ tz_names ++ 基輔 ++ ++ ++ ++ Kigali ++ tz_names ++ 吉佳利 ++ ++ ++ ++ Kinshasa ++ tz_names ++ 金夏沙 ++ ++ ++ ++ Kiritimati ++ tz_names ++ 基裏蒂馬提斯 ++ ++ ++ ++ Kirov ++ tz_names ++ 基洛夫 ++ ++ ++ ++ Kolkata ++ tz_names ++ 加爾格達 ++ ++ ++ ++ Kosrae ++ tz_names ++ 科斯雷 ++ ++ ++ ++ Kralendijk ++ tz_names ++ 克羅地亞 ++ ++ ++ ++ Krasnoyarsk ++ tz_names ++ 克拉斯諾亞爾斯克 ++ ++ ++ ++ Kuala Lumpur ++ tz_names ++ 吉隆玻 ++ ++ ++ ++ Kuching ++ tz_names ++ 古晋 ++ ++ ++ ++ Kuwait ++ tz_names ++ 科威特 ++ ++ ++ ++ Kwajalein ++ tz_names ++ 誇賈林 ++ ++ ++ ++ La Paz ++ tz_names ++ 拉巴斯 ++ ++ ++ ++ Lagos ++ tz_names ++ 拉各斯 ++ ++ ++ ++ Libreville ++ tz_names ++ 利伯維爾 ++ ++ ++ ++ Lima ++ tz_names ++ 利馬 ++ ++ ++ ++ Lindeman ++ tz_names ++ 林德曼 ++ ++ ++ ++ Lisbon ++ tz_names ++ 里斯本 ++ ++ ++ ++ Ljubljana ++ tz_names ++ 盧布亞納 ++ ++ ++ ++ Lome ++ tz_names ++ 多哥 ++ ++ ++ ++ London ++ tz_names ++ 倫敦 ++ ++ ++ ++ Longyearbyen ++ tz_names ++ 龍宜爾比恩 ++ ++ ++ ++ Lord Howe ++ tz_names ++ 豪勳爵 ++ ++ ++ ++ Los Angeles ++ tz_names ++ 洛杉磯 ++ ++ ++ ++ Lower Princes ++ tz_names ++ 聖馬丁 ++ ++ ++ ++ Luanda ++ tz_names ++ 魯安達 ++ ++ ++ ++ Lubumbashi ++ tz_names ++ 盧本巴希 ++ ++ ++ ++ Lusaka ++ tz_names ++ 路沙卡 ++ ++ ++ ++ Luxembourg ++ tz_names ++ 盧森堡 ++ ++ ++ ++ Macau ++ tz_names ++ 澳門(中国) ++ ++ ++ ++ Maceio ++ tz_names ++ 馬塞奧 ++ ++ ++ ++ Macquarie ++ tz_names ++ 麥格理 ++ ++ ++ ++ Madeira ++ tz_names ++ 馬德拉 ++ ++ ++ ++ Madrid ++ tz_names ++ 馬德里 ++ ++ ++ ++ Magadan ++ tz_names ++ 馬加丹 ++ ++ ++ ++ Mahe ++ tz_names ++ 馬埃 ++ ++ ++ ++ Majuro ++ tz_names ++ 麥哲魯 ++ ++ ++ ++ Makassar ++ tz_names ++ 望加錫 ++ ++ ++ ++ Malabo ++ tz_names ++ 馬拉博 ++ ++ ++ ++ Maldives ++ tz_names ++ 瑪律地夫 ++ ++ ++ ++ Malta ++ tz_names ++ 馬爾他 ++ ++ ++ ++ Managua ++ tz_names ++ 馬納瓜 ++ ++ ++ ++ Manaus ++ tz_names ++ 馬瑙斯 ++ ++ ++ ++ Manila ++ tz_names ++ 馬尼拉 ++ ++ ++ ++ Maputo ++ tz_names ++ 馬布多 ++ ++ ++ ++ Mariehamn ++ tz_names ++ 瑪麗港 ++ ++ ++ ++ Marigot ++ tz_names ++ 馬裏戈 ++ ++ ++ ++ Marquesas ++ tz_names ++ 馬克薩斯 ++ ++ ++ ++ Martinique ++ tz_names ++ 馬提尼克島 ++ ++ ++ ++ Maseru ++ tz_names ++ 馬塞魯 ++ ++ ++ ++ Matamoros ++ tz_names ++ 馬塔莫羅斯 ++ ++ ++ ++ Mauritius ++ tz_names ++ 模裡西斯 ++ ++ ++ ++ Mawson ++ tz_names ++ 莫森 ++ ++ ++ ++ Mayotte ++ tz_names ++ 馬約特島 ++ ++ ++ ++ Mazatlan ++ tz_names ++ 馬薩特蘭 ++ ++ ++ ++ Mbabane ++ tz_names ++ 姆巴班 ++ ++ ++ ++ McMurdo ++ tz_names ++ 麥克默多 ++ ++ ++ ++ Melbourne ++ tz_names ++ 墨爾本 ++ ++ ++ ++ Menominee ++ tz_names ++ 梅諾米尼 ++ ++ ++ ++ Merida ++ tz_names ++ 梅里達 ++ ++ ++ ++ Metlakatla ++ tz_names ++ 梅特拉卡特拉 ++ ++ ++ ++ Mexico City ++ tz_names ++ 墨西哥城 ++ ++ ++ ++ Midway ++ tz_names ++ 中途島 ++ ++ ++ ++ Minsk ++ tz_names ++ 明斯克 ++ ++ ++ ++ Miquelon ++ tz_names ++ 密克隆 ++ ++ ++ ++ Mogadishu ++ tz_names ++ 摩加迪休 ++ ++ ++ ++ Monaco ++ tz_names ++ 摩納哥 ++ ++ ++ ++ Moncton ++ tz_names ++ 蒙克頓 ++ ++ ++ ++ Monrovia ++ tz_names ++ 蒙羅維亞 ++ ++ ++ ++ Monterrey ++ tz_names ++ 蒙特雷 ++ ++ ++ ++ Montevideo ++ tz_names ++ 蒙特維多 ++ ++ ++ ++ Montserrat ++ tz_names ++ 蒙特塞拉特 ++ ++ ++ ++ Moscow ++ tz_names ++ 莫斯科 ++ ++ ++ ++ Muscat ++ tz_names ++ 馬斯喀特 ++ ++ ++ ++ Nairobi ++ tz_names ++ 奈洛比 ++ ++ ++ ++ Nassau ++ tz_names ++ 拿索 ++ ++ ++ ++ Nauru ++ tz_names ++ 瑙魯 ++ ++ ++ ++ Ndjamena ++ tz_names ++ 恩賈梅納 ++ ++ ++ ++ New York ++ tz_names ++ 紐約 ++ ++ ++ ++ Niamey ++ tz_names ++ 尼阿美 ++ ++ ++ ++ Nicosia ++ tz_names ++ 尼古西亞 ++ ++ ++ ++ Nipigon ++ tz_names ++ 尼皮貢 ++ ++ ++ ++ Niue ++ tz_names ++ 紐埃 ++ ++ ++ ++ Nome ++ tz_names ++ 諾姆 ++ ++ ++ ++ Norfolk ++ tz_names ++ 諾福克 ++ ++ ++ ++ Noronha ++ tz_names ++ 諾羅尼亞 ++ ++ ++ ++ North Dakota/Beulah ++ tz_names ++ 北達科他州/比拉 ++ ++ ++ ++ North Dakota/Center ++ tz_names ++ 北達科他州/中心 ++ ++ ++ ++ North Dakota/New Salem ++ tz_names ++ 北達科他州/新賽勒姆 ++ ++ ++ ++ Nouakchott ++ tz_names ++ 諾克少 ++ ++ ++ ++ Noumea ++ tz_names ++ 諾美亞 ++ ++ ++ ++ Novokuznetsk ++ tz_names ++ 新庫茲涅茨克 ++ ++ ++ ++ Novosibirsk ++ tz_names ++ 新西伯利亞 ++ ++ ++ ++ Ojinaga ++ tz_names ++ 魁北克 ++ ++ ++ ++ Omsk ++ tz_names ++ 鄂木斯克 ++ ++ ++ ++ Oral ++ tz_names ++ 朵拉 ++ ++ ++ ++ Oslo ++ tz_names ++ 奧斯陸 ++ ++ ++ ++ Ouagadougou ++ tz_names ++ 瓦加杜古 ++ ++ ++ ++ Pago Pago ++ tz_names ++ 帕果帕果 ++ ++ ++ ++ Palau ++ tz_names ++ 帕勞 ++ ++ ++ ++ Palmer ++ tz_names ++ 帕爾默 ++ ++ ++ ++ Panama ++ tz_names ++ 巴拿馬 ++ ++ ++ ++ Pangnirtung ++ tz_names ++ 巴芬島的旁涅唐 ++ ++ ++ ++ Paramaribo ++ tz_names ++ 巴拉馬利波 ++ ++ ++ ++ Paris ++ tz_names ++ 巴黎 ++ ++ ++ ++ Perth ++ tz_names ++ 珀斯 ++ ++ ++ ++ Phnom Penh ++ tz_names ++ 金邊 ++ ++ ++ ++ Phoenix ++ tz_names ++ 鳳凰城 ++ ++ ++ ++ Pitcairn ++ tz_names ++ 皮特凱恩 ++ ++ ++ ++ Podgorica ++ tz_names ++ 波德戈裡察 ++ ++ ++ ++ Pohnpei ++ tz_names ++ 波納佩島 ++ ++ ++ ++ Pontianak ++ tz_names ++ 坤甸 ++ ++ ++ ++ Port Moresby ++ tz_names ++ 莫爾斯貝港 ++ ++ ++ ++ Port of Spain ++ tz_names ++ 西班牙港 ++ ++ ++ ++ Port-au-Prince ++ tz_names ++ 太子港 ++ ++ ++ ++ Porto Velho ++ tz_names ++ 維略港 ++ ++ ++ ++ Porto-Novo ++ tz_names ++ 波多洛 ++ ++ ++ ++ Prague ++ tz_names ++ 布拉格 ++ ++ ++ ++ Puerto Rico ++ tz_names ++ 波多黎各 ++ ++ ++ ++ Punta Arenas ++ tz_names ++ 蓬塔阿雷納斯 ++ ++ ++ ++ Pyongyang ++ tz_names ++ 平壤 ++ ++ ++ ++ Qatar ++ tz_names ++ 卡塔爾 ++ ++ ++ ++ Qostanay ++ tz_names ++ 庫斯塔 ++ ++ ++ ++ Qyzylorda ++ tz_names ++ 克孜勒奧爾達 ++ ++ ++ ++ Rainy River ++ tz_names ++ 雷尼河 ++ ++ ++ ++ Rankin Inlet ++ tz_names ++ 蘭京海口 ++ ++ ++ ++ Rarotonga ++ tz_names ++ 拉羅湯加 ++ ++ ++ ++ Recife ++ tz_names ++ 累西腓 ++ ++ ++ ++ Regina ++ tz_names ++ 里賈納 ++ ++ ++ ++ Resolute ++ tz_names ++ 雷索盧特 ++ ++ ++ ++ Reunion ++ tz_names ++ 留尼旺島 ++ ++ ++ ++ Reykjavik ++ tz_names ++ 雷克雅維克 ++ ++ ++ ++ Riga ++ tz_names ++ 裏加 ++ ++ ++ ++ Rio Branco ++ tz_names ++ 裏奧·布蘭科 ++ ++ ++ ++ Riyadh ++ tz_names ++ 利雅德 ++ ++ ++ ++ Rome ++ tz_names ++ 羅馬 ++ ++ ++ ++ Rothera ++ tz_names ++ 羅瑟拉 ++ ++ ++ ++ Saipan ++ tz_names ++ 塞班島 ++ ++ ++ ++ Sakhalin ++ tz_names ++ 薩哈林 ++ ++ ++ ++ Samara ++ tz_names ++ 薩馬拉 ++ ++ ++ ++ Samarkand ++ tz_names ++ 撒馬爾罕 ++ ++ ++ ++ San Marino ++ tz_names ++ 聖馬利諾 ++ ++ ++ ++ Santarem ++ tz_names ++ 聖塔倫 ++ ++ ++ ++ Santiago ++ tz_names ++ 聖地牙哥 ++ ++ ++ ++ Santo Domingo ++ tz_names ++ 聖多明哥 ++ ++ ++ ++ Sao Paulo ++ tz_names ++ 聖保羅 ++ ++ ++ ++ Sao Tome ++ tz_names ++ 聖多美 ++ ++ ++ ++ Sarajevo ++ tz_names ++ 塞拉耶佛 ++ ++ ++ ++ Saratov ++ tz_names ++ 薩拉托夫 ++ ++ ++ ++ Scoresbysund ++ tz_names ++ 斯科斯比基金 ++ ++ ++ ++ Seoul ++ tz_names ++ 首爾 ++ ++ ++ ++ Shanghai ++ tz_names ++ 上海 ++ ++ ++ ++ Simferopol ++ tz_names ++ 辛菲羅波爾 ++ ++ ++ ++ Singapore ++ tz_names ++ 新加坡 ++ ++ ++ ++ Sitka ++ tz_names ++ 錫特卡 ++ ++ ++ ++ Skopje ++ tz_names ++ 斯高彼亞 ++ ++ ++ ++ Sofia ++ tz_names ++ 索菲亞 ++ ++ ++ ++ South Georgia ++ tz_names ++ 南喬治亞州 ++ ++ ++ ++ Srednekolymsk ++ tz_names ++ 雅庫特 ++ ++ ++ ++ St Barthelemy ++ tz_names ++ 聖巴泰勒米 ++ ++ ++ ++ St Helena ++ tz_names ++ 聖赫倫那 ++ ++ ++ ++ St Johns ++ tz_names ++ 聖約翰 ++ ++ ++ ++ St Kitts ++ tz_names ++ 聖基茨 ++ ++ ++ ++ St Lucia ++ tz_names ++ 聖盧西亞 ++ ++ ++ ++ St Thomas ++ tz_names ++ 聖托馬斯 ++ ++ ++ ++ St Vincent ++ tz_names ++ 聖文森特 ++ ++ ++ ++ Stanley ++ tz_names ++ 斯坦利 ++ ++ ++ ++ Stockholm ++ tz_names ++ 斯德哥爾摩 ++ ++ ++ ++ Swift Current ++ tz_names ++ 斯威夫特卡倫特 ++ ++ ++ ++ Sydney ++ tz_names ++ 雪梨 ++ ++ ++ ++ Syowa ++ tz_names ++ 聖約瑟 ++ ++ ++ ++ Tahiti ++ tz_names ++ 大溪地 ++ ++ ++ ++ Taipei(China) ++ tz_names ++ 臺北(中国) ++ ++ ++ ++ Tallinn ++ tz_names ++ 數位行 ++ ++ ++ ++ Tarawa ++ tz_names ++ 塔拉瓦 ++ ++ ++ ++ Tashkent ++ tz_names ++ 塔什干 ++ ++ ++ ++ Tbilisi ++ tz_names ++ 第比利斯 ++ ++ ++ ++ Tegucigalpa ++ tz_names ++ 德古西加巴 ++ ++ ++ ++ Tehran ++ tz_names ++ 德黑蘭 ++ ++ ++ ++ Thimphu ++ tz_names ++ 辛布 ++ ++ ++ ++ Thule ++ tz_names ++ 圖勒 ++ ++ ++ ++ Thunder Bay ++ tz_names ++ 雷灣 ++ ++ ++ ++ Tijuana ++ tz_names ++ 蒂華納 ++ ++ ++ ++ Tirane ++ tz_names ++ 地拉那 ++ ++ ++ ++ Tokyo ++ tz_names ++ 東京 ++ ++ ++ ++ Tomsk ++ tz_names ++ 托木斯克 ++ ++ ++ ++ Tongatapu ++ tz_names ++ 湯加塔布 ++ ++ ++ ++ Toronto ++ tz_names ++ 多倫多 ++ ++ ++ ++ Tortola ++ tz_names ++ 托托拉島 ++ ++ ++ ++ Tripoli ++ tz_names ++ 的黎波里 ++ ++ ++ ++ Troll ++ tz_names ++ 特羅爾海坦 ++ ++ ++ ++ Tunis ++ tz_names ++ 突尼斯 ++ ++ ++ ++ Ulaanbaatar ++ tz_names ++ 烏蘭巴托 ++ ++ ++ ++ Ulyanovsk ++ tz_names ++ 烏裡揚諾夫斯克 ++ ++ ++ ++ Urumqi ++ tz_names ++ 烏魯木齊 ++ ++ ++ ++ Ust-Nera ++ tz_names ++ 烏斯季挪拉 ++ ++ ++ ++ Uzhgorod ++ tz_names ++ 烏日哥羅德 ++ ++ ++ ++ Vaduz ++ tz_names ++ 瓦都茲 ++ ++ ++ ++ Vancouver ++ tz_names ++ 溫哥華 ++ ++ ++ ++ Vatican ++ tz_names ++ 梵蒂岡 ++ ++ ++ ++ Vienna ++ tz_names ++ 維也納 ++ ++ ++ ++ Vientiane ++ tz_names ++ 萬象 ++ ++ ++ ++ Vilnius ++ tz_names ++ 維爾紐斯 ++ ++ ++ ++ Vladivostok ++ tz_names ++ 符拉迪沃斯托克 ++ ++ ++ ++ Volgograd ++ tz_names ++ 伏爾加格勒 ++ ++ ++ ++ Vostok ++ tz_names ++ 沃斯托克 ++ ++ ++ ++ Wake ++ tz_names ++ 韋克 ++ ++ ++ ++ Wallis ++ tz_names ++ 沃利斯 ++ ++ ++ ++ Warsaw ++ tz_names ++ 華沙 ++ ++ ++ ++ Whitehorse ++ tz_names ++ 懷特霍斯 ++ ++ ++ ++ Windhoek ++ tz_names ++ 溫吐克 ++ ++ ++ ++ Winnipeg ++ tz_names ++ 溫尼伯 ++ ++ ++ ++ Yakutat ++ tz_names ++ 雅庫特 ++ ++ ++ ++ Yakutsk ++ tz_names ++ 亞庫次克 ++ ++ ++ ++ Yangon ++ tz_names ++ 仰光 ++ ++ ++ ++ Yekaterinburg ++ tz_names ++ 葉卡捷琳堡 ++ ++ ++ ++ Yellowknife ++ tz_names ++ 黃刀 ++ ++ ++ ++ Yerevan ++ tz_names ++ 葉里溫 ++ ++ ++ ++ Zagreb ++ tz_names ++ 札格雷布 ++ ++ ++ ++ Zaporozhye ++ tz_names ++ 紮波羅熱 ++ ++ ++ ++ Zurich ++ tz_names ++ 蘇黎世 ++ ++ ++ diff --git a/src/branding/default/show.qml b/src/branding/default/show.qml index f6223c0..f91d520 100644 --- a/src/branding/default/show.qml diff --git a/calamares.spec b/calamares.spec index 12c0e60..fd94333 100644 --- a/calamares.spec +++ b/calamares.spec @@ -39,6 +39,8 @@ Source17: openEuler.png Source18: openEulerWord-blus.png Source19: openEulerWord.png Source20: openEuler-icon.png +Source21: password-hide.png +Source22: password-show.png # patch Patch0: 0001-branding-patch.patch Patch1: 0002-lang.patch @@ -52,7 +54,7 @@ Patch8: 0009-qss.patch Patch9: 0010-cDebugDelect.patch Patch10: 0011-fix-87-position-and-translate.patch Patch11: 0012-replace-icon.patch -Patch12: 0013-1230.patch +Patch12: 0013-1230.patch # Calamares is only supported where live images (and GRUB) are. (#1171380) # This list matches the arches where grub2-efi is used to boot the system @@ -233,6 +235,8 @@ install -Dm 0644 %{SOURCE17} %{_builddir}/calamares-3.3.7/src/branding/default/o install -Dm 0644 %{SOURCE18} %{_builddir}/calamares-3.3.7/src/branding/default/openEulerWord-blus.png install -Dm 0644 %{SOURCE19} %{_builddir}/calamares-3.3.7/src/branding/default/openEulerWord.png install -Dm 0644 %{SOURCE20} %{_builddir}/calamares-3.3.7/src/branding/default/openEuler-icon.png +install -Dm 0644 %{SOURCE21} %{_builddir}/calamares-3.3.7/src/branding/default/password-hide.png +install -Dm 0644 %{SOURCE22} %{_builddir}/calamares-3.3.7/src/branding/default/password-show.png %build mkdir build cd build @@ -283,6 +287,8 @@ install -Dm 0644 %{SOURCE17} %{buildroot}%{_datadir}/calamares/branding/default/ install -Dm 0644 %{SOURCE18} %{buildroot}%{_datadir}/calamares/branding/default/openEulerWord-blus.png install -Dm 0644 %{SOURCE19} %{buildroot}%{_datadir}/calamares/branding/default/openEulerWord.png install -Dm 0644 %{SOURCE20} %{buildroot}%{_datadir}/calamares/branding/default/openEuler-icon.png +install -Dm 0644 %{SOURCE21} %{_builddir}/calamares-3.3.7/src/branding/default/password-hide.png +install -Dm 0644 %{SOURCE22} %{_builddir}/calamares-3.3.7/src/branding/default/password-show.png %files %doc AUTHORS %license LICENSES/* diff --git a/password-show.png b/password-show.png new file mode 100644 index 0000000000000000000000000000000000000000..2ff2c6717fa8e188177d52d924d7dd5068bfb372 GIT binary patch literal 339 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`EX7WqAsj$Z!;#X#z`)4m>Eak- z(VLtg@u@*@x{E_a5Tm?&Jp(f{^Wo+G^5!`amibJ9Y)6)g$z3qtwk16wAz??ww;zs) zfrYhfKp<(U+Sr}mFCSyF`#xi&t+3JZ4XYmS-LPWEzlVRVxw?%HNk~daNW8nh_v(%N zVTu(M|NESPTK^te)%QIjHX!2a$A52MPZv)#JMhCm{LA)GjzcjTI$G=aA0IY74z$wY zoBbx=!j-M;6P`}|>B9pA`SJVrbiC2Av-`)8VhA$Hf4*IwLl|?hWSss19``b%UE%>r zjLTmByBpmr9d>RuL-#4y&A(-t4o&6~nR@lr#KX*o8D{YQIyUW_zuev548@E^TNb%1 eALY!HU|^64p72U&TRbR~7(8A5T-G@yGywo)pMv!O literal 0 HcmV?d00001 -- Gitee From 5a6061fa8bb86d2ba195a01e7f524d30b9d52efd Mon Sep 17 00:00:00 2001 From: xinxin <2271170409@qq.com> Date: Fri, 27 Dec 2024 12:42:28 +0000 Subject: [PATCH 5/5] update calamares.spec. Signed-off-by: xinxin <2271170409@qq.com> --- calamares.spec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/calamares.spec b/calamares.spec index fd94333..a34d426 100644 --- a/calamares.spec +++ b/calamares.spec @@ -2,7 +2,7 @@ Name: calamares Version: 3.3.7 -Release: 1 +Release: 2 Summary: Installer from a live CD/DVD/USB to disk License: GPL-3.0-or-later -- Gitee

    _Yt`288y8Dt4HUy@LM -z_wpP}6J!3w3syU=Wm-HupS*E)Nf5Okqop2ZRp#=M*0B1d-yMZ8u=m~(o=K;#E8P|e<4 -zuWzthM(%tlf_aw`tGSY?yFHXdWDm22Pq3R%57lX$-ps2rl@|8Whgc&OPJks*uNNDZ -ziLng6sc$#zgmO&G5Bk_SLxij}c26NdA(`=6F<{kL(r95af&{M8SHYc7TP!(Vw+U!M -zu0J!`X5}?THHs~L>@DZP{mpzV;|+tWFaNJ$dPf) -zENe=kYyWx4Jj0%R-z4UBr+)^VQi853)m&>ERJ0&?g)h0QjcZIt^%>bx9LCwyzF5j_ -zTmaP>cdGKxu;?Hbm@cPx`gs944W(d9{gW)vljT_#P7VIbhDAg%Rsn*K3>bUVNq4IM -z5e$vOt4#I%?rx=oX6ogOlH#zL_oHs~N6Y5~Qe+1UVd==tCO1Dre>U*^RWQ)#zZmuF -z-LC`k8SIi$>_%f7#cs}V>UhbiKMZbqH}#8>dfbN$g@wDf6nV(A{GD^g>cpec?ss(U -z>x;)XLga)K=o)<=ZB{P3>6(16!^iOBg!yw^d|G~Q%#x?;q5G8oM)m?rJGrS5bx9%{ -z6Xl(iLq;5$Mh;y#j=UCrAAg!UtZ6cl#vwLU$8eZ_nzHdHYyBIW6~yzema~DNpP;+F -z#v<_nWX_`!SGRr0;q8d)KD0-=8^A-!-m7*R-m+0iGT%W8u4@;l4u}2I{Dv>09D#cg -zYaRCZxKHwOjkLe`zV4QhI)U8>U6hveKR&U@2L5yT*5xNKye17;k0Qpn?Rk<$u0ccn -zgNzaxS$7}o!~DG~HAm4@4YNL(o~T?8aI_$}`~NF~vXAhXU1apgpbA)|;~W2{{F;0Q -z!m8kS60KKcvx?k^zF|^GQ1P)D3vMFLeFk0NU+Zp1ADEN`#BJKEY5g| -zfe-vB*ErdF3Vx>=+1)I0_iJ$)r|4WONajJ>LA(b^O1I#Dwb9)c{{W`9`fAXlB>{cOsX^dA+InK0EyW=#x!_;wO$e>Ti@*J~L4RZm>^AW|=^q47%x -zxnZIBJI9w405I9lC8bOz9#WL_i7!!ikLDjz_Oh?UgK)u*^Y;^y;1y-I<~v!eizSZ8 -zrJEHT<7CCjlB5Gl@Z$l=UI4l&GI)IjA0JxAbLn7_%9rnOmw;X2K -zG^jz|@zwl7pZB7T*X@C>@jrvdjqfwml)B0R(HFZ(-*9b4_B}>UJd_S0DRWlL!9Y&S -zKWA3_?E#~^A<1S8JaHG-oSz^UiuA6+4f>L86Pp78M0t4MBkAj~*AE#oJ{r&oH!V3F -zMkg(uo*A=9>Qh+%QICCyrDv!N9pYYZ83iyhcq^T{j2ye&UHpP`V>=j2V^q%=w11wR -zm{Z6Iw^N^F1};T+VX(_*w@ilsm)|%Xv>0 -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 -zCQil`lO8B(I+ -z-dhCR_$jKTN0{8GdAdjH_`NN>N~;x8+KzT4!oe?*ZXomjB8 -zk{TKRU;958{XQxUDs2c-=>N*}hEQM+ee4cp>rJ{{1TxvngWLPt>}yMZ -zt-hPMyLsu`3PKm4j!H64+`seWBQtb)wkPbA7+P=J-xem6p*6kdO(o)xqtr8Q746wk -zNwy7Ex|r7H3_O3Iye4UVg#v-zK2g*GPlx=FOcQz2onG7j42znFHFE7!0y9#LX|zUF -zM&-y5GeXgy)JL1H_}a3PN2gu+BJ^p>g*G6(CZAY`r8AjMJs@F`eaz%PTbX@&tuA{~ -zL#Z{`FAj}DuL>Z3_wXWigFAASR*&|J;;$JEiuA@Z82oe1?KR8mPg==jSj+l`Zka}n -zLa!WbuNPKWfumSK -zfYO3|cM*`l^FW3EV^R35*Sml(I`a8H8Kk+@Y6DB2FSb+MZta|7Ldk2Y^`g@0PC|1^ -zHZDP7$H=|6?wp!@{*|b0H}LLt*_f3#i^C%SKypFdg6ilcMYk$$3m$lId(>JL&?QvX -z?oOsk(jdF~qJ3BQbjX*>4_ur^d()RJxnI{c!0fTIQF%<{JbLO%Tv1NZFklwgz15l6 -zw<7r^2|WSRH1LCYmScaAyEPG)w6Afuw!+KeB15@5vWYfWO}mk6WTggM__MD=h1=p6 -z!n~7^47e#czUSNbzAMx}3jE8W^O*EMAeW2p9OtMfkaOo*)q9T9NnBg=N5;H8mw;jI -z?$>N-U2xA9aT98tpRZNY#Ib_7f@P>}f@w5yEMgqkse3UNpBLFzsXi7Z{ApBs{oM=( -zxNYkB=BW9e6His#lLtRAr*bPfAo$MctEcMRpntH&fy$EZmY)fR;d?96fdOn9RO+C} -z;jdX7@>4%HlAFBk~ZVM-cPcBuNUnR%hme@+MEEu&;T-h@hY9+-DdMhZ0a|!u+#( -zOjf;Wq-9YvZ=$(f$bi(c5!k`IrGCLoId^1%E=*&QGtzN77eFY$-dC@x;8gz^ukTw0 -zgQAiNxeyI-U%)wAMWpF?ac5DX6RHde=o?pKHjIs$Nh|3TIo -zRv05SlqT_W+g&+gXyy;m&5`>TkA!`iz2LR)|KPSg3Q;RmQN2`I$vRONUKt%mU*nE^RA1>} -zny2~-nQ8EA1}yCS0`!qnDH8hBav-LHM+$gSFb#OXL1~t|3Sn(BLeS1t(r`s1eXECem2w*2n~K@xg2|zUcXIv;Dt;&oBewo -zqgsu2*>U&Bu*F|G}>rP%KaHl&}biK=zsmh8)H{6a%MVDM#; -zwb|@*Q`Yb31BOI?2W6M?)0%dQ>=3*Zw3;pfM4t!>UzQN|@>GWx61Sy4;y#Wp-xaiG -zscDneUDIM*58%?1>(s|3i=_<<3 -z=Ete-A-A&@Hzy+PmkHnf<+A?-#FAp-QV#7T?*A(zq1>gHbg589=)*MFEp{Hu_1_D9 -z_cvOW)6)mAzs-oGF@fnbsn75s=ybwA58-}y1=?fmSd(cBl>TPp(?VkSI7Hp1Yn0_D -z-97xY$w`KZG)eam)7k_porNh9K08_^=T)npn|v(39jm7`?MG)}55yEW)clDJo}&g9 -zbsORc6m;LlsMa$dTIm~|Z^)-o?f8)fld`mM@Z)}jb=>?q=x=Lf{cjjgA8)+)d%*y! -z2iM@We(V-*!qy0D8+kI;ryN%+nal`bI(qSp)rf=H<%F(^!v{W(oYu>uCX4{HINe3rFWx^&`}k -zXGws=a@E|Q0=K^wStO24Zqpgxem!xvR@~ExOJ4igfRH{s -zLD_Ilw>zqh4#U)qh`qET!oo3`4_sG`S$ET2B9ZdpN8P`=8AUbPWQI2uXkx-q21cW= -zOap{gxQmf9_Do{mFT<$l7CsBPDt(q$jAzXK*0{q?tMT&v-ccCiy)5)MBjZ@hbGfm7BrcAf{|Xh1q)PGVnT -z@W_#&k9(BxU6V>&x8?6 -z9_OVM_mIWsq@mQ;QJi-IT%`d#n~ryvRLyVj85Z$WntWE;2%T0pU1z}=<&Aa&^6NXg -zXaais{k8wK41Fj-zxJgzeb4zQ8AGb=-U{LMWskb!5L-PTf{e>*d#sn!a7aJC{S>Qh7g1%*zvY7 -z4G=;dRC%PJ!~^%D?EV)DsYq)X{d9*%fFu#N(q^NE6eKCcPc`!j|<3 -zlh)iY5?2NB(#;==o;IVo_QdCz^YkQSq$kO4FJ~Ak;d( -zZ+b{dhp|D=zgv?5YRm{3x?rifFGYdC1>ex+%Iu$Qaw0W#V`|LZUwz9Zj;m4@mpwF! -zoC0~dX-~Et?~qg;A5#odyiDH4roWMY|KylkHj0t`1_z)*>otvGi5JSi4>7pEcMTES -zE(FGZ7_9UrEnOQ&3M$#%J3-Aa_;O_e-c=&di~OE`Z^FSU6_@2KEEeNf?r$x3MS%IP -z@46$;w+@gsWTnB+H-(S)BY=Yb$N2*enIKgZ_Q46A!P!R-c}S1}!_J$8!Bkq77(_z< -ztHQVJkzMNSib9?I?1X}7z+_Ef0l7F*({o*f|F?5SxH}qX^hcgCFS)$JNB)&z3q7e6 -zQp%E-*By1jHh~b8J*753ku?LRe3Xky|I{A$wiXX{Xiq&M7UEz#W^u21|6DxX|9Ahq -zqM@=ue!-vo0{YP+xnem@Kf`OU=A%QGvZPC4#W&UsDh2USO(`!Gp3-0bO??l3s#JlR -zLz6?}t~;r6|MGb3jraaa+z|x4$<1H;QU5QC~AOa_44@sQt^D8V$xRX%5um<);#@;6B*yqd%_Tk2_P6Pp$sBX{k%IeWH|D -zl9~~&X*~Loy-d`q<^du*rWb~Or4;|)57E`sck4T}54InVS{Z@&19?fQQ8F8;D&ETL3Xu7!lEO4tBL<%N_Ok9`m<+caME|lj -zG5yLSd6JzG(tB2t=4dEhlJe|c_%DaNcn!T{ed^{}03?k-I((T}_CN)QZ<_9%`YiS~ -zxI)jgu%LDl3Xs{>J0{Yd!Jr&ED^CrD@mcrFt`4W&uCA9(*x6=ZO3=j1_1~_Wh@qhC -zz%>lTw~5c-MD{Rrjt~ -zQoy-{1ar4@f@Png&iHB|ih3s+C|OkXVJQvrHkO0$`Ikzlo-#LoNvoQjz6D*hST^Mg -zWdFCRD9$h)1>1&4XpR~~)b^=1o_aA;*U0Xn7JG<00~;aVz=eErDPJ5_MBJxI6!|f} -z6MdorsX>styJ#$nBaSykU(yC1I=AnMVTW*YHqdEgtPt}PzorDUaj4>njES9rz -zrG!0h%?cTGlZIyhKMrN0+g-=Pdi8%yb2wy;7?#Bi>*ND$U2f}E%~i70m=5alN4Cz5 -zgz+yW8CFnL%6WA@FIVtH4K*&ef3do-Dpd2zV9o70#HQDA{CL*hf17)@z^m-8l^igp -z6yG30cbLdTswDgGbJ9*$5qovoo4Z{|2^yg?tNihgfrkNHJ6a55%j4++wxiz^4L0A3 -zJ>Dt;XlI&dz+ -zWj^y~a!i -z8I;ilkZ!@bHuUMdWBZ#)KiF{6(ux$1sz`2k%!sH?;dT+uiJYR|Qxot5+C@CcjZBPK$3mQBxvkAqsg>I-!T -z_)ws0;NaNm?r#U1eX(5j#KU>=VbL6XEO@5jbeNXg?I;SAy&q6((VAub*Tu*R(y*XY -zkpP2`jP>jOL&e#xkSwg}3*|HAsplGECXb}o61vc$` -z$o@Y7U_qb0vdQH96w?b*2*k*W+3=vjFi}tf38ob!nNw=AqB6--ds3|4ZSlyi6f=vH -zj1})pR-9Y5B^Z{SV0@mK{w?k{}*#P~pysl52`B0%Gh -zTvO-4^H;?b$OvVMQR#y50YnsiVp%l?s#ghiDbXQy!Xe3IKGXmnbo^ -zP9`21@ybl7go)y-snVVpc}|sCN?Mxyp2}P`KEMnwb=7rAEc2t0eTcabU<6)dZYYr` -zWnEx-o(D#hm>v~I1B~*&C?L~O(6Rz2Gq%i4D=)q9GO=|PVbhddrT3{M<&dHT51Q(`Fq^V%7Y*UxwwV9scOkupp1 -zz+4Pqd<90n`P<&&QrhNGC8<Ne@EO2N>Bq7UQ_dkvP0o5@Thq$&wtC -zhqjq4_{QLYFO%H=d6F3$lH9RA$<+4^CcKm2_O%A1-i#}V8TM+7n_rA`{qu3IdoIQ` -zX^8pFQyOA^^+Z&G%r72`DTon}5rFyWia7r+YRscie*8#8uazwoe@sFtF#;}EF4mI? -zF`~$b*FPhe$UgaPxT^v{?93nL6n$2SjNm}Jm` -z1brTC=6ee}mG@!L>~5}{-N|KhA`F@r<6mZWGf>RQb2=F~zl**z>-oV0=lIF2ef;*p -zQto=|D9>bd@Lr`$_F4I0gDQX%!|%tt;i+%hnEU=&u3cKe6%z~j{-nM9a9S;cCpR)+ -zS~K69+Q9!arH($6+UPr}iGCB$FmS>t29B?z|Aa>RPHa{&$lslG_FDk+Ej32LPrZ7b -zdhMhp`b=q6X8ubjo?!f6yLq|5>?(QUo`=b;c*6>nx -zLf|E>yqq&QSZ8pwG0BO>B&V89PPdxWwwcr`c(G{iwrTO<^RVER5FN=<_Pa}5m}8J?I- -zC=n3xNBU*_@vmjx`;P$TLXeQh{|qMnx6fVp>j-f9*Z$di3OIdtPC~7aT{1V*`=dh< -zq=QEQ=F*3f3Sh2WV(^n?20u&tUw-*yieEo%^4n)kM1lEd0Mn9mdg7GZQnD5%#(Wg4 -z_+A%ZdGP^8)R|@rPIg-yZclO|=1^yOG?rAjE3hPe6VtPSXk__q}*fG9*@<#VR?zelRFJQIBt{E -z<`C$BcaFiDok^A#g!$lrrM!N7+r{^i;Bbe-30WKKusIrb71V7y;__U6oK2@>ZOl=j -z26<=Uo4pB&j~R%Uq$%prDiiT&h+5P}O_hSFRG2P-7>nkltvanr&%ydqiw`9JSK8;x -zOt$Q?sjPLB`Xc{LAB{j(4SbZFq~NecohWH3s5e~B#Nn`nowUoU7kqOR))WfBxGMeY -z&H{(&(rFTcNkN#H4^y%tyisKmb+rE_>y*ob!349j3_d%I`T|72O;+csB`NNZ%ZIxx -zUM`0h#A8wbt3w_Sg>)?PLpcsl1YI7>g*hRZlH)Qy+hRt*Wqwe1zeq34f}AAJ6(-rV -z2fnI-&v(P;`#d)6b=bJu;fp=+K@~hw=rSqC=Ei^&H@e)C?Qm1J$IUq@X64zuyhHn6 -z)|EM|Ep=G8!{yBqhZlFi$`Vv?!5<1-1uT*$BFC$h -zd0#9O@P5X;c5mY;Eu#m2D&A1B^gSCddrQw$)z(^%p^)Cfi8^%=r-0 -ztH}7^qL0_9b+fcelLi@Iq4B}xnk-9oykvI0^mM-DII6(%+8jrbr_iU0P)@^$Usfr{ -z3*ja6u_!RT@FM53UUnhGxZIHMD3iXlstUx&+)(7bk12N*oQQ8m63iy=(hwtln9-#=bxhO^6-O+|Wh#PM -zgN&#$x+6xfat+&IGpy86UKsJi_`NU!I74=zQp*HLq}xRRB@5|T%J0rODtbFVJihj0nAyCx6Zn}ea2A=%*6m^bG^;h -zdJ7+53Y%R@T0BZyT`Jl=M1?sR(R~?G*mlma6~HvcB-&R;K?=Z#5%rCd2&?i^JQ6T@ -zILl(uW`lWO8O-`3$;{7E+_gT*v=0m>ziTjVU4qeX#u@oWjNz}w8S+w$8~-K{6XV*y -z#`xni(X<~X%5R>~N{py60x|!ol$a<#T_F?W-~`NbItV4=(@cD5}bZ05foYltJ^N$WcIM;DU&rg;51D10U4tjzG-d1>LIU -zebC$pgXV@AG`EvMbD|8mr;97*#I>kZI{*M607*naR2eKL@7W#nQ6Ljh%FTco9b7&u -zPM;a=^trc{zV|dS;NE5i&TOIYT}|}4vzb13wbJJO=|j0JV(FDXX!Voj=mG?(^E&ki5H(9kWu$HGGJmO{U_JaXL22v -zOqCR}bNp~pDK8hoYXxEDd-s*J@GQX4BAa)70tE+-1|+ZPONZXpcGyTtsmZcnQZ{1uPm| -zY~o2rO(NxDm|o8$EDxEu>8cUHiKL)g(xn7q#3US-wICG4NSvyCb1DUQN5U>O-43Nu -zk6}-@bLss8F5iZiOo$PH@yCZ8A7FZ5M)_wX1V96f4>7)Sk_jYo?t_Yd6o8R)|G5kA -z_aCc!(h5u_L}Z@-GpP9AJmddcUu^LGrAhvE -zg~87rOYom-B$nOaS5Kw*-7^;e%sM|txmSUaGD{y!{Pi#eF=?Z|S~oNu6_+g6C33mN -zl)oS1H#0dNcBxltjHo%#Xrg+RO6n3+wpvPYIhV3IZ92+Nwe^@u?rE3p%^vwJ7NKTQ -zUtEgnJ>^d;6_dMo;i6C=F~(;d-aKsb<`H=Fu*2HJNjBCwDpEPnq*s7*C1SZ*t1zP0 -z1iEc3s1x(gw#Rq$CbiUGUoWIIoo(gj!&Gr_Ig|$U5SYwb!IE0bPzuYZTg|0x}l$ -zQR&LkX8Q)Y7J-I{B*$rg%jRl}4|lqJu*>EBQi)IY$UEY&zX?uu!Rds_p)hRN;jp2= -zVo$ArC)61(wFyThkR1ub(N5Uk3LoxqS(>MdBWL7#+)>~#HP7RY08Gt=+e0>Y=CrG# -z%OofOdbu*itYC`e`8M0n$=aGII-Xhu-f_<3n;KjF{{FVZB{Eso_Qd=0MybaOrLb6%#6k{N6~XTc -zrN~m(a!4APcwt0+@w)`&_!sF~DexFw3<5A>;2#@=8@9+Qn9GPPmw7p`;u~1J)#KhQ -zxMhpWZ?jx}or5y%%Zk`l*)G4$hTmmtXc2JH)4Mh%03-ez38_-0m1#&BS>Q2JAWBxp -zWPPnrkF1pm!2CHNsl6It1d6`%^+}uZb8!yTg(*4{;p3xm9@!OPT3#390#U|h$Cwa^ -zF)=r)lF26JYk*NP$^}s-ghYKwFf!X?0Vc&yrHX{E)ya))U}Hn--ACq}>D?YSu?<)@T-qk;koEXL+qj1Jn2%+ZRA -zGW2KLj7*OJj7lpLqrbq68i(OI0yFyYP*G;G9St)%jslsRvjk=wZb;8xvTeOymhGUx -zMc_pNj6VK3OVk*x$XuJ@f4L^x;ZIULnd5Lxjz0H~a$U}^RVfkNH2`YZ$7{j3cz^WBqfsDT_j$4xcEVK -zavsD;N|$uU+`Ln(Be$1(%KtH~(qoFOiYb4HrvPQlPM6zD9mbbyv;X9@Cq^F2^;^@C -z#J#Yi3ou2Ak&z@bfh6&pjF+jDG%|;wWqO57Vw*>)SY@47Ceh2H#3-Y_S{)ORarsM$ -zr{;PAoHV@n03)wavCZievRfpHY^NwYqC`0im$FW^LMCZz;(hTLCo$0J)iL=qO|Ed& -zOsTS&UgfB$>AS03?%ZQDv&Q71gEp&=c|3F6#LybIsh1MVxF|4|QefWP5oUG1$+D2iqXCP> -z+fpq2CdIrjO=fRQa_^_fG{nT2{BDAAYc<5&`g)wy>D`Na?d4zvou0ckxl*RecQt`&fN?DBW -zDE={M>8=|8D~ehP2|Z0Z>>v4wtKP8dFMn5qPO< -zv#4*kY3#6Q?zCv>wrC4mbVO~sViw`JLqsOw5=l73k{*TtOUfl_dZbKG9p(JONhqih -zi1CP}Tn#Z2jhmEqcCExTsJLZU#aBx=&#`WgJrRRF-5&3j$N0g_76!~pD79sPs4n+) -z)Bip>M$}P$W&>yG86e6_TA2}`$%GlbS{9@K1Bspyi0J{3^lDi@<)x9xW`URl{pLwL -zv!RauHKpF9Uwa+^3E-%Elj9s*kmzbXgBBWG{-DA4A5QV3N0a>P$|V1~D$dVV$N9zM2ETeb#Z}LmT;nS+ue%IQ -zr;y#ZQ3H(lpxROn9Vu6hjz@+LNfr~IR7#$=Xiuf+FdgN2k=3ztQTad`M`E~Z4T(>7 -zX-;{1ZL9;z>rxz)ge`WAP3h -znY_BnWz8;+R6ot -zr=&xs(^L2FZiSai4Hk&{kq5JKJ?_qhJJMY&cND;_ISzC3V=9ul%Y}+YSe$3EC@;l^ -zL$F`Gime_8TcNVaBj>2Y#%hOm%HYX-k2L|CXMzrELK2OvJ71RPy8JaCRs~^7wxd3$ -zPA~MBlPjf_4zoip3j#I*K%ei0O?y2)+YO)X5hK6Lr@Ji`r~FwpJXYjzyVxtFxG^L! -zA_jIxMJP|twRnD~C{?HwvvuXV2j-0ukJrlta$!cH!}WO%R~Kl-MJX_nJSLwp^Q1>m -zD=&Xmt7DS-L^(Gb(Z$L -zNWaVPvbAa%8 -zT)jA5H$pDib7vPx#CBFpIo -z;*l{JA4)JfpjDIM*>Q&FB)BbPFfKo#lF23FuoGdkN~WOkAv0fSMYICtbHm|v1& -zS%uB2-7d?kEf$p~xuYn_h@2!hZ8I36qL!sVQxeY%rWTq^F0h!8YcVD$YK(@I;c^Vf -zxyi^Jt-=VzsMN9?iy;bL^ka1`4K=c2Hay2=XpYN}Y=@h39BvZHPD+EaEw0b9=>eGx -z!~bQSi?;(9K -znNiD`27lEJqe?Da1u#m5k#(}|T6GciMXhm3l(8r>B_2b!d)%~B3MEBp(J{jEL0$kx -z*2N^1?DkTWssHw!Fs>Y=^JS8(h^c!70`yvz6hr#ukfPj3kBoqdS|h85+bZPs4%5mV -z?%WNd$}NVLISemHsXSu%A1SM40v%Fcjbr@qf{7&dHZda9QJtP -zxIm1niY`|jwRrTf$)ksDmP_oV0vLyih=))GahTtI=n0Ja?a+1vo;@|wfW?n -z!)J9Ko9bLP*SQK{0u4?Nz!bN7>=1zIaH#0A*&VSsED_3L*q7o;Wq3BJPnhQeOldc3 -z3R0{LrC1R(S(;_=(B>oyzDhE8QkP)enPBuAaYntGVA#uX -zhP;^IrWX?2@Ye*_KAYf=PsjNElTogEBFgWci1Vv8F*O=uqWtHoDF3lC!p~O-#6{w%uH!g(|@w4C;zjN*JR#1XnZ@DOljnjsb?7=5Hq=*{!^M6vAT(u18uxj*vSfV_F_EDN~-)&kNKf -z(n^eYWV+LS2T@^K3>~#xC%y(51u&>x{(YUUidO#Ff|D7*(nY_SG6FDB1u+_61U|bJ -zfGW7jST$1+(_{V@e@u)455#+>2UvV?Nyjy-c;>k=`lUN&@s++++ahkB$Ua@ -zn8(-6APHw%TOINvE;}M7+mrA~lgG01I17tXEH8uAQdn6ItI9l<6~W(XECO8~JE9P1 -zlP(yKMcG|EU!J729ZndsdTFaQy8UgEI%aY*ZgVgSTaP-tS{UV>N{fP4D2>66PLFT) -zr^wl3a<~~}RZmtsTM{nKhNFCHvPvdinC7sj07e2hMER<&clfL<#k+;@{!TIP+k9G? -zAm^~h-ga4ghB^u8=!UITF7Jda@{hQP_oXS}(vXC@gr`b`CBFV-*keZ%JY5uL-ZqQ7 -z^WlMz%Y6Zu5ri3e9+UGthHdp&QDPz9mlIK0>$RDa?ehFihn;njW(YOyaG(WB&boYa -zz~$3QPnqT=VeIiBJe!;1v5?7vY43R30kb{(0&Mh!`v&>Zm -znD3N}0;5L&=G9VIxm!xF%mKEwU!&t1f>DN!5m=j_J8UC4bqBFNP^;^<`+j -ztD>5(-Xcm1%*ugBvRxk8<}rI4+$w8a0xq&HCW=drKK3dua?MlMua?xXbZMqQj94db -z$jwk+(g35^$UJT>gxiWVM2QdPCh>a*q^d;XleO9-31{E=&v%;{x3!D4hb=1VQyi#^ -zva3GES7!{Ktw}PkB*`RMDGNlAvdYOJQD?%cV?;2_*!%?d7AMpi*~%&lnMGwbcNALO8c1?WmZ_4& -zh6hZ>XclUEk=J!C6?WgWpRV3GTD}%bb8r!qR?cE5+g9Ilm^y?tvJ&?mzAUnTr5SrramzzFOm(`DKO7_rM6m_~-u72N)^1l)0hM -z<;G&vh&rJZm$WBlyTb68@kif03#5yt9PADen0a2RjXuawdMK} -zo9lOYN|h0Kk&)+Rl=|XBj8b4Uz(|0>g#e=Cr`rT$6?h`hgFAdRvxmHKj!hH4o@Dn`Rj2} -zVRR3SnE2P8ae42Y%lqeC1u!3-b68)i0p^Q3mv1rvMwMB%xD>UxDv7MD&0$xkMRnLz -zYh))QQjq9Sn~?v}n=}}f`p3F9ZgVsNYshnEJerl{;VlM>zDY9w%OnqM -zOfqvrf_pxWbH|4UQ{FL{ur|Tix8jU>!(h~F2}ZnZD2Tc7g*bottD%$_@x=V$sVG-J -z72~SMWBhiF1{rPemzAjnTjB?q+*m?07E%X_?m%kRnx`GZq+7a!6mrYesHt&v;Qxhk5 -ze}e6Y5|kcGQgK3*7g-zA@N%d=#j(Z|C!0)8w}|J(roPRhvE8J()25}%qBU&O5wSJA -zL~Xj`Ru8}kyu_0pvM!bhFQx^(<6>G)dV19vBfU~4024Mnx-Gp%Ch1d>P9}aBQ5(-j -zY_&!v#e;{!4!hf7(i^S(K-T?48N0WW0r$$WyJrT@)IU2>(FA4$VAN64$})U1nQDxf -z{bl_1GBN!7@!>@PMwAN`7A;t%o -z%xk^p$(}Vi0T?mxe}8d`A1+Pu!(~Z+wA@et^V2nk0vIvzs~#9pV0?g)6|#4uhyruk -zMy1qsrX2LRbfqM@POhhmDn*46xJjG##jt;*Eum7Z#OETu2}vBQPohlU2O49Xkt8bz -z&N^_^@YvPjP<+N>d!0*3vqw>jM`4qrjQgdH4i(J~)e^`NhMG9+XoqjkB>C`|$=jzr -z)}0Yke3Ew#nS5DmXn2vNvL=t*CY!uAk6^oaWgK!1hcCO~nZM_LuP*Lp!#N0aK~AT~ -zwpMs;Z<1H`8f>VOl1kXr;wsbqrh1RB8ypI{VP_mlUHD8syjP@nFwbOJ87xzqE*7hH -z!Qw)X6{ShOI0rk!P!RTb<*3B{Iy_sPQsD#wZYQE12RaR;sP}NItYUf`OWN#^X8U53 -z7xQ9ltA*0AOJx@XkJ)@x(anJtk5(Ji=hPN=6~HvfG4AT%j0`*=gtS@)@a&L+fNgj*nh;;F{>}i4z^DRE#l~M(jEe5p29JM;y7(*2SpN=>x -zPCa-A9?wg$Fw0|p4$KNV%*=JTFV|Iy%xxi5c+^KnA>lyil*h8dC=ch^Y&|YLGNQm( -zDvYI~7IKeTY^t&OsNCak1smI -zxp^M5Log%Yurk-;lS<&tbzxy4a`)(KnSFI!xGv(4>+7XcK3 -zm`s4VTGGMR>y)`eYr`Lr92oazLzw>s1>pTPr-`-jDU=o`=ul1x*T2lE-H^7 -z&-|V5z23zY@3blN{@eTG6rPS#(-5VyKEl>B25%lpvS53dae)Y<1EQqFm=X#rQ@=pT -z^ujpP3S!C^BgK}IJ~ld-j#|!6Fgj>3E+qbzl=8Sp0p_j27{h~cZV5ygDhXzxgz~^F -zC{41g%2YFNr^y`!rrPxrzlzMzfX(QT$+%qUoDpzJF*)C6T&}Iun32I0BLYd}C=fFu -zDC00Js9&q#MX52O$oM0`qGw1@U`C*(cLZkS`5vH2t1|*KnINO0n9~p=Fe4rp8Q=RN -zt75+5k_j@I*W|nhV0=D_7!i@qI1=Fk*C{P^Cd76Jm5! -zvCD1c4x@KDsw+nBpIYT|ceSGcW@44BwONRPU#U0c8eqf|Bfl4c58uyngCvxtK}L=O -zEjoGZ;sA5Y&h+}&1pqVB|Fy~_BHH)%IE>xpsID7r;J2ApX{&a-FgAoJ_TwHouw$71|K*2z{z -zkhL;_n4c|+^Y6=I{A5{_pDa)G6ktjT=8vR9Mw$Kf(FYj+`2B~|t7U0$5m33<$bB;E -zxd&rh`CyDI7Dc&yVeGuQY(bRE7DTvgL72-IM$|oW@8yf)3VM8q@d4(tc@Zv~7v-{f -zF)ovJve{t;Ednk+!1xd&YRsUSoeaDP#0bdrz)TuqM1>hRy+zH1Ad?9x7dw~NWrEKo -zQyaKsdIJNdHgVacGYo&CmDhH*^I=IB>r0|+C=Vm>vSm-4ZF>`h_QfeY6ldoVgI&jy -z>^`O8Wq)moL-iKN8Z526w3y2GQrE8GrKuyO;iX&P#i1+e&>hnwo)IPC9CQPbt|@RyBT -zdiM#fh|TDr{|s60>xGz1fDw4?=zk%^{9l2K|GokzKD7A9On4C}`Tq+r@_Ur`mld*s3k@z?oZ<%$r!N|U3}?CWqi*zIyq6o?MkbUemKN0YpJ64srDH;;R~eK@H~B17#K`E3@V29$E1+ma$* -z;HA?h6m!|y4Szdgvbr?P+s7c-33=@nx$T}>J$tPt$;Y)GU$r_4UN*ME=M4^D)LGWlz8?Yq;&s4{GI6uMCVpvfID=Sj0s!Fk>*x`{PkJpYQDH7m`z{W;cQfBc`uF2OY -zbdOSP!c`qrhuTscZFM=4R%AqB+IZ05Z}}D<@7DlS6@kK&@Xf9m<)<84)PIK_oe5}5 -zm^8<=`qCDMj+hSaXiL~Mo383?$v@$$#IkpGxa!0ByQL1F?s5qo^Vr)4rz5Cn2i2qZPfpfMrDi;>yy3ESAxlepBl5i!f -zWrcM)xXDQf~Hy#TahPG$qq|` -z7E40#a-qk&JKVE%XaE2p07*naRA9|^m?YMRfW`eGm>2YTAmlMK7trxM9tE%R8AZ!juoFhqPQA&*fZ4KQ+kZ_wfSGI)2F%R6NbZ3!L5^M?HTJ5WXNH|3iAu~4Uv$(oo37*8oL@|jS537!Yn7w9#vTZ=r#3A}9AQN{v3 -zzmiR&EQgsnu=?-4D{D5pJdgu7Z__<2nd*zc%l{N$WOeKoDXUDck7t17m38kQn%$8$A -zCYY3GFfN#6bWT#Ol!=fvgvWfW?x93{i7SyrKBLgW$25ki~!vk`3)cLT0rGQ4D#)lYzlOBi(m<$P| -zdLTyK6SNr`auL8$Fe5+{(5q%QBdSbVkx{Bl8f3(%FNS>?0hJ3OM!>}f -z7=aSK4%U0jgcZFOc0RoLDvN*Yg%ur**ZbI0o)~#73XGWguPcJSFL1COFSrg -zWZmnwwE8hz`A{@Kj8q1Gy&fi|m40!h81lzSv1K}C%s17z4KO3b7b8Gbt|3O^mo>-;tT;U**VL4xi!#$kxh4Q3 -z03?&Cz+4D0qa{YU{Ct2Bh?!EM*T?RubQHkcyVqrAjmxZkHgjrh=I;}TF -zmrow?c;c|j>LV7J03#~Q%O_o4J>@8XS$D?f?K84Q=3X3N8Z^L&0+ZJ)QOdHL?NTOv -zFl{y!9TqhzPT5tx7^mfb@Ci#5ya~WaV#~>-?9O)aTyc`83Q{~N5EC$1mYrbfR)fXg -z7%cqKVD1+Nvo|ET?~^2Vf0X2o_cg>!SR3c|H)7oOT8vSz#2EfkdY$ZV8f5YoY -z8|Rv*MU9Db_2Y4+#)!e+2bup`<%5id7y%jSjPd7RWxY(Tn8gvpzbG_6c_hYy4IgqhTlB12LlD -zTrQw9FQQbK%jZYAa(3N-sFkwm -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 -zCF%L5!9V6}+&*99me(}}F`~psOW9xN>RdlpyG -z7x_2^Frvhyt1;;y)BRC-Asxbuys(ywASV5p4l3ziKlkJR{orXXdhi6@A8w(?Lx-84 -z<+E;!$=5YH>#I8WaeF(lT^c!ib@KP=lpN5hQgz7&JB}OdK4Br}loSD&2wvp*a{v?C$U=yTwqc?+ -zvZziu0+xe+hJ!1)U?5hvJNhLXn*RjsT3!40b&F&(O-YDm~{fozjfoq&vhjl6(8(h;z=$y2IJX)BaBo0K=2lr{L2 -zNCTCq7H42<3+#!*ZVk%X9KJoS@#!IpPi2_)B&v+9V&*R?KrjUl`gp7B!vZ5wi^ofa8gEw_WVgW<3-z2`YB4q2Wc@xk -zCS#ChI0AdL!{OI12T`>EG{DUiVhC8L5B|w34xU$ -zgcsT2aa^UoNDG-Qv-Y2;O*Qvi?;++oBvk5z{?${&||Jdqu~+1@`32E;(h1_tJc65-K5W-+xC7FNJY`Ri2{u(%8r -z++SSav7i*5lh-&|Hn-=&-}9w)EKrcrQ!>~p#2n*+0Uh3>d8TU2HW*DQ#j=yIA^D;N|92^m{4j?j0>CXBrFqQfrcHsWPCg4@u3Q@Ds-+!VxwL~z -zmnP`3Oyj>6b@0Cyw$NiqE7yI}#tTIWemHJWQKwOH%3$MRkHtGJ=9RZIE~lOQ#7>r> -zGbB@IWLA>*~jcWSjI? -z!#$z(OtLl)=IcCNV)N1#he>4)S>jnd`)(H>V@_C?9A#e4 -z_Y5s%U9b{v!9*3x5x4~OEcof&AwI~00QD?Fh2rli36yFwSOJOHy(F~nD-}glnm#FO -znOMvQ%B8~o{RMWUa#;W-b@K6$atZOLvMuG%S3WNH86cUH%0Q_$qpQO#%;=Q8Y(Pao -zfAxEYzpucDrDF6NB0kKGAq+rOucY -z0x?NOF4h_LvCfc>GzNaC(eDF|dm@N=TjP$mll=2do!jT@-1?fvEw3iIlc$;GfCr`Nd{L>)Vb;fjjJXK -z)Fc(yh_y@rM=3Rvw9X8T%FLvzFcXpp#7HLQlJOzPL{Cv=IxS^Sc7cqjGD?McECd(@ -zF^_qWU77#@AOJ~3K~%QT?a^kssjNm57pkY^Hk!Fmz~HLB|-&xf0o -z^3@{+k0C&YicB}LlBveB&{oz3FFV`Oav$Llpjm~T!1Eon(+5gwaG6ST%=CtB7vBRqP~PVm@6h*Ts_s`+8HJh!2D&t -zMO35w&ks%R`8c5OGKb+Sb)Mdk;G`QijkT-hG0D6H$i_>pE*2<9sV=7lT5Ml^U8;Id -zNh6&s!AtF~WH3@KWHM%1-QZH$;84-xQ{LiJChAL*z)PUimy$D{vL5bB!p?;3y!fm? -zYO?x>&6<-wYflBNKkoA7373s$B;x{7t|I?l&T0tT#`2m13YvV1I-np4-#5YhEzNwi -z$6{lvG>8SNN$ks$HcR)!S$e=?Z5_%oCV7`NwLUA3x-8mn^23>codz7R0xC54aIeFp -zB8{nKHgl^2W>k30DtDPv;WN3!=AE6kYBH-4cuBx}+bt%>+W7Ktz#$ocl`R#`4GS*> -zVA=wXbim#uc%NwS)6zwZZ1fILF(d#gojLO_SKgBm*O7%6Mp~wlrIk -ziScPMELxm^qwVlzh0lUKhovPh%S${~l)$nQk2PB@DozIqTx#0`rNYQ2&(d;}cQ&=N -z<$zcNp~<#s)@>SOtTqXU^njBI`FjsVwXmT^=gTUKq7x{a+gJPGxqOp5#BsC9W$`|! -zmCT$2#iuOZ$kE6>=Cid))R%xg^{Da8oWnXB4@#{wyr1nbH#1;%Hq6fUnVD-dakJ0- -zEcmn>R@O+hF$~}AFgn|2yg*APJf01Y#4KjzIjk&&uPc4l)W9byxF7IUwa*td0yHos -z*JFe@heUbFmR%H|dvkmSN?v3$jL5cluRLH`IY?WZSnn2=1bk3pv$O=>ErR=UJ^r32 -z3QQ0JOSX@Cy(l@D)QR#UuMH(c-!DH^S1iy_h*DqV=L(SA{39w>@j`~n>>mRjmg-{x -zn2m7rW{Bw!?GPl<-3f|b5uTNM2^ES8NU>ei2z3akCJKA -zFEfN6QDu}e6Z7etI^{c*2D5WdsWhV0gm-sl2rd!GL;xeIOz(7n5s1n1>6IODr;xGw -zJfLTm&mGy~4HSU!I!^)2`5;DAmK^aio_$dUCjIN@sxYcLIi&4iXeX2J5jCdY7HJ#{o5>>UnSz+AfRWV!L#hHKUn7vyKb47z07ja~1YXhsrgu>Y -zF@5CERuX1+MDdXma8d9gWdbs`Sr(o^l_*Dp%S37NRfY1fGB*V<{(l58<7+&g+2$&U -zd10r=%e#E0?G9^{=j?TqeM}n2RE_dMpZ8_Z@?h9R_Hjyuks$x76QKgLrq*M9t;bh& -z9-_dc1B_I1<_f?xcnH8q4yL+A><*&B`0S4R98J9|c{~}Y7BT^tHCsDau*K%XQddFD -zI|UYR8~>^dC&7e5>>FS0)oTm^`=Mu=xT$9SL#ZM8NF0z -z%0H%!yHVVc49 -zQ@ifEDMko0kzzB|}b@S>rb^>HOwJlV87RaLpuL0nOEuLVyu?2^AVq -zXS%X8st7>B{E>|;1uz0J67CmxNr#!pQl?-gm5WKYm34ot%gPkl%fg(D)G&v4F0lOE -z*SkI5K)1)6xaR4@d{P77Rwwv&dz|n0Xk_oU$lGgBbikzSkV)lHi>=2^cAPNTTWhfY -zw8`Om8-bUT%^r2FKBwD!>f1dU+C3H8Z%#<#SXh}Xtz%*v3$0^a@DkQ0htO -z1SO)boC`1VdDuqQ1u&M>C`$=|9jFk$+JX@anfT+y8kEYw$P1gpan#Po?l#!g4$rPW -zNskAQ)9t|~x1;rr^b(+w+!c%rNBs#|H>4={APxP`1R02Hs9*3Q5Jyd -zvk>|%a~QT#I}2dcJMm&&vI0))9s;ZKLR?gpGq$hleC1;So0ADkWdQ3X3nT08rc?t< -z*1@2v$)&p4R|Aa|Euz541(el0Y-w<)X>-^q0Gtfe&dU$SEj~S9vi4ZOhEuTqq|4VQ -z9Wuo()&inZh$^1b;F8nik<$`T(Be|s;_%P9?f@%oq&1|Wbfz8nmGR|F;%^~ -z?A`1>?X$ljU~8>I-m!o$cEkI57O!QPD)%xw6BXc}n&UAk!(?F@tlthFR=}7{myw%o -z9*G4!n+@Y~;9&{!=U6P*BEJ``uL^6EKie+V$u8@vT-I!dcPrrWn1j68K1?=bl=9-M -zLC3!GqCdlDT%OOOO34cas&aa9all7K9v@5oMe4E(0{Uk;+@2f4O9U~u%bVRP%UA?2 -zcSyTgYA90etrSAPLby}xW7z>WWCYy45k_Xfv`mhQ`oL -zgW;l}WZMkOu@&U>P1P;;%QDn}=Ho>s&z8D8SLQOVz+#Nb*ockHR@N?gDu~H)7@p%Y -zD$fl!V-(2P43+Uq1u~HmV=*x1C?%%9dOGxrd7al+hJ<3CYOUxKbLqS+k3Q;r`egYE -zWYm64nw6}VK#g>GXNjFG1eXY2L_+J8EnoA(XO7PusgvbYIf0o@fJs4&fQhIv>45U@ -zK8|4KT!87^f9bT2ogZF$$^V%}PAr0+a%vPZ48jYbs6327OnI155zEy8m5E6$+n0vT -zVPYv$nUXEO0*@i(0xn?=MgT}aXox_JWMJe3Vgx3njyVN9qeO+N2^hUqYMEhpWe7t8 -zGSZGF)-_Rp?kbTW|2Y67cCnNaBM@`16ceOWmng8WiU>+Q29^5ZZ3&R}vB9DQr2rAPKK?RJ>EHx=MN==1L3 -zAOx60F8?~@C>zU`)L5hk8Hgh*ys>x;g_c~L) -zwRq`ElNUA^Oju{|^ctOUpBf5c9$KL>cDc^zrA7*3bcQU@82q6|e^s-r(dRvl-tWrj -zrNNzVY25LaK~KrY%-6a7b&cCzOLFV0Nu|!*Hc#hPxw#sDpQ~}}965vA((cyTI=9Z! -zxpk(&-{oeQ{C&Ei?&j$_ayLyk_}g>=n=Zh)VVbFc=7tp1{AH@aU#6N|H`U_L3S>l) -z(G|%2?qx%P%(X9yDkF-FhCs|!6Xil{*%gzLTsbkkE2Pov`2?3gCyiurE>{4faruPs -zB;bGPGXgOQE*T$Jck$C>aAn)%)H$M|eJe7`Nuk2~XR+-H!t$Dv@qNy#CL@*@`2$1S#>wAp>iWPhE> -zK~Y~MwBHn}FLkXRXWCsFIy_|^YmR%gB-3nTQD9&9JC&CZUPOHfm6QJjU_x+-EM;K1 -zfjUzFMvYkpMD{UhA!|;nQI;1#vV$b=`pUb?d)qv!+I{YwS;xf>3$!%RUEn3U2OH_} -za5EP_5(13C%tfhOj6jV1_3Z?hNR5$-CW`@mVX)R?x1r=#86E#N^8~HUPOVf3c0uzBs1TN82zJ31xRgeNc)!iy*{Qll&uvddpK`PF1YDKHVh{Ar%f^(lb4?LCX03oQC9 -z^y#fr?P;Eo?mPBjc0;F1d|9 -z1&u!WjUIVT9(gSRd96^`YEzc7hkdZaVorHn?YUH#P}t)0-3gDyJ4}}Dwba(j+PZ)> -zb*@t0*VF|pKVtF4af{OSfCHY--T(@d@Zk=J83hSuRk%#A4wzX5ua(2x@_>njCU0-G -zRSsvH246M6#GH2K6j)R?`P5q$jq=wl0ks_-``bPCcLZtx`HR?%o%i7}(S?xaG -zA29f#QfFU%K&vCIe-16CL8~RfeYXo>Dod3Uh<#9Mp%>)QPR0pi73HZFmVO_Pux@`d;*TAHFmtpb-d#=x@Oc*J^kOKpx;y62?pX|*P -zz>0EMQWmhZ$Y)`(z>BA`R>H><@ymW=|Kdo~4XcvJp2KbsM#J;c9m@|C^ph76CtWd{5^cjnt -zE8<+aGR_q%6I{L`&ZSG^bYIlLFozhviKf&vj -zamMAgGde4&>|%qmbcW}djFwP;uFj}DUG2B1Y)ndx5nEY*8NZB)GGnNpHzZqQXtt@; -zn0_%!9IZjLjFtCA6hU!`MBWOtk|e3#h|#97g2WjLx&U -zKhI)Bj?3^|mtnacL$X~3GZD~;olIRyi3!yhm;PA-G_E?;UKVrcle&AeTm>)!F%ig! -zDkI8^K+CxoS;!Q~#9Vr13&4bTSB}q}xdJj?>g3~qo|0$D?)o^&xTNP?(!X}TkI#ab -zTu)_Ql=_nApQXNt64R-?2)xKXjHoXufQj~1Bwr$#7lDT%GE^z{uvEBTvMF~LJM=D* -zd`hUs43M@mrN)Gn$pgzpMG12-!z#NVNFYW|!u_JID2S=_8By(XU$w{mTLT{03Zlr2 -ztdgo`fublE6XtZpN)|zk3qIPs00R -z9}6MIWo&i8*y?c5@>~m&B84fAD5W?tJvhde1o@gWp5jF=C;{u#Yqb -zFGw=*gCu?5kJI-(jXv)r>HT(syXD@})b)B(|6o*i6&I -zo33-?bW`15r<>d`-Q>Dy27j7j@Q0Ume)qD*Z(mCC+m|$c^I}q6XfM;a>KsKT%+6?B -zE`k5&!UnStV#G?;b(cOP@Y10!1ez|3nNnravN58_oO|*jT2AVIqlu$AGWHu3?{g_WXi;|5rs}vu%?TUXd)ZrObMTDGp?Z_! -z$~u5=rgO+r4>+c~97)=0>qCOcyV_hbYvG!)2kAEEv;vpz -zV;bnZu?_TisELaoZsw9lTGaC*Wi#sv_eYR;K`I;5?eTVGH|C-z;_5mf=E(%zGpJ-i^fNvhhU?A>?w^4pVZU{rr63PAEPod=@6q-nN+oM8o)$QBOnthEnVdR5dfX_ -zJdb5e;6)%KU4e-JCwv;6@DeI3U7tq~BVUiKW6{?xoDjlG2uE5cz=(ZJ6qw6jvbf@9 -zLjlaMr8E0L%?y1_jFj6JItx4d;rKTNf+5>7@rG7V{O74tDb-k<9>pjVU -z-4;|N;Jc$5>krv%IO_BDiGa)o$Zv)G7LS4khx~e5J&T)t3Yy&TT73%I0t(taaucv< -zm%)Oq3BEfWwt>lyeSOkq`7V=X2Ld+Kq3-ijHln(JRvYliQJ>EaxRkcRK?ja_E|og0 -zI^;0D#A5E2fO%EE0vJ(W-m37KRbnwQFUjh|9#tkPCo{Py!PJrju`}||i)^yENcFLd -zL>_K;*xwd#H11Pt25fH+_->!h=LcX@3w*Xs=c`JGqmp@X0$MdkoivLn)kQ}=!!c1A -z7#(+;1SS^+6&mOq05<&E%WmdUbw -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 -zOG81-#B~PGeWo-16PIQzGG2nfT -z{_pAZdsn01I~x7o(&_h>LEkrZ?wzmEcfQ8GuWR&qP2-+dld03W=T)8F^E7(T)wz3) -z#$B`Z)S2{}C8|u4J7#JMW&~(@&eZwmOpSleH2B91o!h4y+?ukSi82$~%|wj}%K>gs -zAY*aeG*dy0s4)UEol49ky)*28^~5A{Vk?uN|5cN81u?QAb1uNh=h4>`#5|i&HOx_i -znSe|LGXgRfKiQ_j{!!>(1^>r&&^>h#$ejC(fF}BSk0<3tbql{7*UqKmj`3c;%f@{^ -z83%1*M|72YDLrCQdCX?(Nt>OuE_+Vf9IUrF(qM6{$>yZMORIwl?RU5|CH%8(V<~VE -zh)I|}>3Ns4Y-4HgA`laTN;p=T4lqiYaUp`2PW8o-@k&ow$2x2oGDNi>$%~vby1eu5 -zb21TdT(U1o865Q3A?;FaaPzZ=xMXY-mr5I31TO+G57evABY+WzNe38dZT45%ncJjk6#orNGG7x~J5a?#~)$DKY1Rl;~>$E78aD{I~ETVDfJO -zCW04vp8NCvQ-C=OUc~M;p(|4(_OWiyhXHvkd+?*Wmis -zOf_P8%R6=oU`+Zfa_PU^X2fcZXTC~sTxFen1YjCPb(0n{0T|f^F@5R{SJ}w~ZW;t& -z3}4kKpU`1`jjRhs|{8iF!}nFMTri1ZSdtumlX#b -zRv!&mdlEiB8SwcDm$fHdK0O(*S~g`4Iea4(=29!{xE%8Zh~V8V7ITVB=2ZpE*%~mn -z%IEc}fVt%`slZ}hrNQPVDAeJNZ3&*;T*ns&drm)VV4CYF8a!$bHET8e4EM^rrtlI$} -z6vNY*KBICR#^(4uoC6PLiH*!stz>Je;hQR-b=59ww)w1;%H(RF^}Arnc6cG*<33Sb -za$rcd3{?gU%<~wW=c(|%yk;Dk=kltmO!k#(^-&2dD0EpW>Prc{R1AG`#5(3FtC+Nl -ziCs)iAm-KxVC2nn*_M&+U#@89lI2bOaZLx0ZEk1bR)Zf7>uf!pU`Ks|l3JZF4!OKpZK+Yr5m}0>OAj@P(j=|7e$;TKBjhV`3)-Thf -ze@uolE$+*)c`(=I(E^_b@?;anRv@BAD`OJu4>K+j;2)Y3=4(Qb@fex!Gc2zQV!CW) -zVlNACK$b)LNl0oyw)?XH6M@RPPqCND*OU??aFX41y;2|(!At}(5y%L<^pa+Vw3E6! -zxd>qX-7_6*BK76mFn>D0ocnRF0v~lLfDt7|GBJ0^K%_K$N%+0ORS+X8j9AKsN~LlN -zVEU9uy|S+WL)9#og@7WNmjSXDQy%7BhLwA&eN0rG0p&7o89r5@ULdC2=e`P2UjoL| -z1dQG4bAPo!465BsAm-jJ(5EcugqX9yMKzX%024t>q{K*Zz<|;e#FRdBQFRlWZG15X-=`l9dLe`mq5paoK+hj54M~hkCn@s!K -z{5*fmg?NU#9-7SgZma5jQH4K*aD3q -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 -zSyAV3P=mM^{P~D-av^1MJgIRkVJUd2x8R5 -zmQEKf@V2xWLCTmUgUPgu8fv-3ESnD3RViOPt31~1b6A<@v%JU+l!HQ8SLCu~e}d>4 -zxhVo|37g9)hf6kOpM|O4C;2SuAtjcQcGjVJbS7=(k5L^@QdBFk*_OvC3#!k$)Sh)X -z95Xo@cPMLzcM4tl?KYUON29pWq2Bft#O0oLnYXW#<$nW(+KX_s$>l_o!=Xm_@d(V# -z()eUg056~Az}#$`&$D#i&hdD8ufz1*1m7QlMYS+upU3blPl3yr2t1qZGi9&MiZa+y -zBgtbHRo**$&$D-vnE$5nHmcwzQQ;ibeSd#Z0n -zI%hDp#)+V@NZH$}Nw)3wWV+`JzU`AP-El1*%T-2$Q9Q3mm8;?26 -zs7Ucrev&bf6oYe<49QJ0B1dCnj-g=Y>1c|l^EAdrbmf;Bnk@h#@F8)>vfd@iiot*^ -zStpau7aQ@o2%z-eV<=b=m1d+Qjzw*T=Q<3{v4iBXy{1|%>z`%OFUwM3A|Nv`N7R?V -z)IT&LM?1Yz7J!btr+;pGA_2q*$n;N-z>Gl6Q#rxNTA5lcll8LngfMdjTz(p0WG_+X -z@f=@`kZ7Ou2GFX76 -z%wwP=n2ADC8pJCL#E6N1WTn81$M|ZGak5gT*2!GNGb1qcgg{JjkWkjASUfTUD*?DD -zcu@co^uP$Xs5Q6ZzzZ{|#6@OknJ6(b4x`F~)v>25eV(awd9KPs%=_WU3fYVMU0zas -zFp@&%@|s#9^Zu^@X3jB}`Ntg=op4xkDpX+{wMMr7ysQjQnVW4fd!NN;dkj9^Wib7FlMlbMc<*b2cXsG$H72E2 -z%3j-;;?+!@mo^x@xZdFTwFb|uk<~JR8I3V31DF}TTxaxBgON*gMlCiNxkzW!LY)x{ -z4TjA#7&=d9$QL?;=IC7@(|=Zq0kcx{|13qn87caHs-;J#@25IXexmb)%*O_O)R^@7 -z*rd;NU4c#S>B#_UJ~H|9M+SfT(BQ#o`qdCKO%J+ers@302Ri?*%>6;+vPvnF?wGfA -z?s+RvWCURDoFX)xRajJy_w{L{r5lv)2I)|0VCe1!=}u|B^pFG0&`Ng-QqrB$-6fzj -z((s<&`#k^a;bNGJv(MUltOyW`Ip3m$a(`(MAr+W`DvDVXlcvk+;m7Xcn1aG;Ajmt}s -zjfVxM+Z=@>)cgW0u3}O!8<&Ch7@J%nfHIJcpD5SO=KqUJD(b}LyCmQvDlkB8m`dZ! -zx*U6ZG#5x9>fjAt0E)LW5g@YEzO-YXzA{k7e!`vVD|C4*J3^v03sTk89Req{Y`?eN -zCNUuA->a#ZkTW^_sM#jDm1Z0>D4`wi7cFmq{qi>x^OVdt?_|idWU+-zV#uUq5gzr* -z+g)be;DX>8^y3{WDj)aY+tAii8xTDfU9AD|_8MxOA9E{R%T77SYS;ZEbK@ckvZ$BbnUG)_!r-!T#GFE!QtO&Bm7$;7&=K`u*ey-)OHUnzAY8%kN_ggCXT} -zk2zzi_LMgxNK&Fgz`}Ew{Fgf&KR!&>Skb`d&RW-4+>aCkzB{}_@MHyO+RD(s?tG`3 -zZY$f?{KrrF(L+B<&1H2{gT(|F0I@2lig2snKGw_zG+j|_Qp*=7QM+D)d)yp`2Sz -z=ozcHn;<~Je{6^1&RR-5clZ3<1w<9GS*~wwKzcQI|7;+mQ4%_a -zjKsZsj?St#g*oG4<5;FPr$<vA0#;p8x)!+*nYzK>LGlwTr -z3u>)oz`T1UN`?>O5jV1uZ7v7j@6v(t5*;8(4CKtC;F>fuCBDo7s1(`;DTr0;Sh@LA -zh=vS`;=jl^$Yl3V&609{24y59WBI)n>?t2Irs;8qeXyu)IKHrk12~bAg%2Or!v|CY -z!P#r$(+s8D%6DFG|x5n)L3ncg-}GhcP@pIg7?QJt&6rXj3(E^Zxk -z%yIS^WG(8VWYD+$enW-o=@Ff -zw%l5l4`eGR%7wCL?L%9MJX_X|X2^U$s}8fpDzqOE&Iaua&LcqQOp4)vJDlJf6;hlM -z!PT!nj`Es=Gth>>)R`O00IxWarSti?xH#pE7rfc+f?};&15DGR&@(@(#Afu8-3p?P -zj(-F{5=4d)td3hj;D^H1mWxc=fW*!xDKvOZgR+KMp6j7uXi8J(iRtm5aI&y;Ai;}i -z`T|3cml;*7N=kchAo -zyc%aLj9@Xeixin3GNzhlEaR;dr -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 -z4a}?%xn?l`D3+?)%p-@dT -z3FfJIDfum1*~r3$p+OytZee@IK|B3OPNInpGV -z0o;fmK0L;Cpk -z5L!}|ZT_0A*$tjzTB$TRmhWn^3QCFuqIK2EKAZqeI9E#fNMSq)w$+1d7Q`71zSURhzVa>%;1H%;O -zELoSV)!GixE{OvqJKu7xgUG7u7n#_U^|f&>zNdH86fc>$veh|9giPbOxh(~DUOB&C -z$zbwSFQ|M7SxSX(3rd76HBWXPtJ4Xn -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 -za?ZlPubCfv?RePoC`C -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 -z3mtC==a68->U(aq^@u%>hRwBOj_n -z6S8JQLBiRI)Gqv50-}=lFpFS;$zy_CdfwmXdj}CRP;!P4Z?i|D*R1{m_E7w*P8PY* -zsRQUS#A-=>6GN>3mcHC-hQjP~L(QvoRFWmAfEmP%eG?bKUBHGZ#NzL2?yunED0wKJ;o=;!AP1)*}y(nzw -z@5Jk;)Y+}@_Dpd&kht)G{3%M450j%~NJeaTp$5hq#q57qMJEG=W_b!BnF7FO1)B>y -zj-4^(kA{Ye#~bkD(f9gS=1>Fm<*@PI3bObLD~_roa|;!*c--%e1%xD~Jd8gI~LCP$%DHG|L;(YG^EzA2*><^Gc}oVf+%GX(m6H;X;3` -z{DwCv-jMD(m&Tuiejt%A2vhuFxc=8+tP7!JhSl9hmv35uA}a*j95^>yX&SSBElj-R -z2XJhx);2N<@tT&SHPVpFLND&7w6q4GGPxT+M#J}Q_*(=J?+JG?)IOBl__$n<&w!CI -zCWV;$qF3DLZ-sw}{LDx{^Df_af(MugfarIH{D;HB4UVm<2L(3N>dpi4jjL`J)RHwT -zaI5rKddhXQwnXof;j*GJM(4xxPv1-JrEr -zD@eY4pp78DX@H~>3#=PQ0mSiJnc^E%NdE9=b}jD3)2c{r+VFiT9jT%P+XmX5AN@ef -z4=m&litbTZ1xv0uT=u|#E9s0s_v}_KcJ7D86R@f4`JiD$Y$ecV&s06*@0mV%twYhM -zOF3@j+~AZxnWe*YqH9oPWZ&SBIap9k;t4Yh?C9UBW)vkP8NSr*RcWzognm~2wDcEa+iQ#)WI&jDX`gjl5xa5F -z*|ns_yJC=2Yro9%N?QdHIE{Xzpnq2=51A#5z)#jV^mr0`TbQSJ@dM-%DADtiko!_e -zK3mC>?Wc8x?#VHe8gT)Q)0HrT%v)Y4At-(pBbpxr&)_H(33O4SsPJjAD3C(4Q&Uq` -zCFKeYm4k(QtT?T|G=NR8!Zh=8zovfRKCOB#T?;ga3h&>diGQT}>m@v6?^(89&_>uP -zigeo*9G5Ns!>tdl8jxUrFvtsQwFeh!nugES+qwj|$t8rtO0!#Ks#65bG|UH^+#(Rh -z`3dURO0>zm(>%lA-;rjo?tKD&{*tLB9k?PW98zQ9(JSY!MKLAQFmGc{jpZ&mL`lf2 -zMMn$PFnUQrqVG&SF1$X -zmB*q0^vlfoC3~z&o`w6S9n){w7YdNwq)#=9 -z?GSyS5QshNOZMg#PAu_V1rVO&YsYp+hZI1b)_|kc;y8d+nw#X#$_M<7s)e -zE7KdKgD!N^>bjNXvOn2G*KQRTP_t#pCDe~NHfi%M|Bn|Kn63`=r&{d4Fl^>{jKqIp -zuuWZexagC+Gfabd*6kJyz(~P9#@G1sK;fgVwtZSNO82zGvVbs2LUX@N;li+LHtuGA -zBTx})?vgt+u9TmIiA^$Zs0cbhRny(rijQE@x)h5szWnU--sNOiDdT#GN`;&XC~^h; -zj*Mc1JGn`q5-MLAja2c^ovDv!H1WoMiuM^QT~AfC##m0)_fn*IyEveJhChq!U9x^T -z=a6Z;V*ESwC%SXS{xS!J6QP>v*e=mRn55`Ezv4R4x?p``S?nSE^ -z(}*sbHy<(ntf={Jx4iW%r-%cpe=^f|j-rgO9!kaWay-lu>5S2i?hRrh`7 -z5Xc9c=|tg1(D4X_w`Hz#AM*)dM$DL|q(tT&`xvO>V#P_2kO*_Iz4dd~&%pA$+D5%# -zRQAyC-%k1bwd1KC;YFRLyn*XyVV=Vez3KjYnk15zo)ITKSvsDB~Rk -z8Z*9~9jsmW;Bgp5=IaFZxE)kIU8g$CQ#mT^9?wAOTFTP)oN5;KbvoIr;fAg?P46{> -zv$KUx*6N!gqPy&^o;Da7N5P#E7FvEidv2eY(X*j{sy`Tn7~9ztC35%;+Mziz`F!+b&83HLGUs#v{Ovn^+N`1 -zXK^limz>()V|*y+6@CgFvVApCDCbdNi_mEh2hmshuvEFHXLfb06ntONvKRfr?eIs~ -zl`V7`pau+D9vWo-wd44IG@WHw)9>5H0fC>S(jg@=8b)`C^yqFF-ICHNC8KMjyQN#Y -zVRVCZN+`leL3s9m@x0oOV|(}AvHQNx>pVZFPfp`%@VrjbuP?(Hyb)8Sfb0_Jw=oNs -zu<`Z4INc6R_C~x68zYW!pn=zDYyUmh!m|5M6=H@R`KDCb=JnCX@*UsL%Mvf%H_aUaWd^VB&H6)^O -zneS>0EgStJ$CuLujWbSa%$ysolgB49M6JkvJ_(y2pZSUYvvs(JIm`w`$t0doN|c>= -z}1)_jPJ*b*Poeg3Dmf@j~W#pw30L99svqK!xO -zErWv%w-VOT>s+!ZCvhnb5c`6!t-Y{TRHeW$@P!41D9uv&eHj|XNfJfT+y^=UDlZxk -zbtr}q$*JylTnh;&M`8nGm7>TyT(ig%@oV?z>KqmS@qU2I=yvfv(45st*Pg#fePRjO -z@vK@twvJD{ui#n?Fi9fGt@w6(#yt{rQ*tM-f9*y%T&(#+)+o2#5HDp4v|LC=<=s(7a%{R`9&|yaPe;jWuZp@TR0R+ -z1y@CnU+If# -zG59~&FruU%$%3-p@F-F^&IeW`lWTWpaFH5b{=GmSVyx!fZOPfQA@FtJs!|?UDJqZ? -zH{7NuiII7EM5)jYnN@n6qjQN-ihB>>jHYa+EMusGr!siwQCL;9G#rm+KRKlI=a;|k -zf_4cm988H&UQ90dh9plbz;V}W8|{1h3*qvqTiGt67akA(pFavzs;nEd?0Oi}F(G3t -z$d)&P&&eI>p|G>g(Zhs@p{m*QXJz_-kQ<(7}2JZ -zG={TX4hW}B%n%_&Tn4aS-EKDoY9fB{_Jr_#U%H3QHnk?P)(Iw&V*Q+;hzg -zzc=msIS0bfIO*Pv%j3RdV1G=`!041$_{YJZ6)9~D>>2tI>%VcU#$<-^7HVGWQkBWy -z_^+-k3Wu1E2hU9sJ48^2CZ|$VpTg{^i{V?lj>V27BnN8t}bM2KT``RL> -zqh&=7L^c|&Lc~E+8)48FY_rCJp@zOLZj>c}N+5U7UvDYW?YPr`ur}F4CIZ+Ku#aD! -znMZAyAbCHGbFUsbD(Y_9$V!3-jyd(4(1RiusN)Jt)jjHtZmQp -z`R?TFYD1Fvt@f}I?*`k9?EWvs|9b(fOV158%>@PioZD(5okvCD-vuTXj1Nao{md4# -z@OX?|5>gv06GnyPece^kd>*~z$CM`=QXyxWY;46jfd#4Fqt-ukBmBzWk?Wbv^yT<> -z+I+mHXBa8p3mI>|7grh4pj+S+3We6Lky7*FE^#u_FiHK|xAHey~G<6b|ZmY05=)X;y!FZ5+EUUBMjh2vh~=}n+)^+u|6P?=hX -z9P&TPLV^jx6_cF` -zfkx?A_h*K_F>J#SLt1v6uNP{^l;+mH3~08^l>x+p}kBspHvg&CXEr7Y%+ -z{9lVSw0+)}l+ghdnmFzbj_-_;UW_Af1iv+9rnn|RO@aGv1P-sgeV&K?s?Bny{z;Rq|$cOA>!8|rZGHxP0O+V -zq`iM+Ka8@8Yuj42wtvDo;t(dPGVe`FOO(W8=sRTnY?;~-jca=$1ii@~hnRbnT`a&_ -z_3b8HBb3DO0Iot5y}EWAw(&gg_95#9Jm8>$5nMy7Kl^O)w0a{Hjr7xFhwdZXE3lq< -z>u2m-5_a$9I^b&Og!Q9xd_0_UnM1&^dDY_Y|JW9IQPV3A9vSl6Fv=j?pV(mkso4{e -z&4R~k#w1wPf{kOnQJJ)D$_N>efMhoLF;T2pMoVKX<~QckC(oP_vHiU+0lod326r>+ -zcgKf3?$4s~``lJu0^G`9K|o4%+*rg%H0zJ?eovz) -z7DfOWP}R^JfDRy@9YR*T*0#&Y%Cr3i8$$lV)PH`5__;zjMYW$?_s-Y)(<@f<5qln> -z{5oB(Z3I~S@}F+-#^?O}x(BK{>~*;M$^eWlw(6!s$Ii21>)=CoF*YMp_E$qN#@4_VYYQW%03&s^F|0`tiZh^*Ro3Uw^5kCkgutgd&hJMJs}HMuSwX&%J%-H -zD@jS9JB-xSHFf?(kk#~e()=M8tLepp$%7$V`ik5W7m`ueS8`pUggsC2PF9>A(Lf<`&nJUMlFCe -zQEkRJE1PP?B4cl`SH0R5e`zqq>#mY#>*T9crBh();;v{VgV(&g!KpW*a8Df>C|HBg -z4$KyB$BZhMcZ6q3TVkb=qLON&;-MRa6BHyYfMaS4N)I)1^`uV31x=1)2{6?Y2$90J -zYtD5yv`cvWfLq%OgS&1T=8I}g10VY2(*(vO2QH5-o?S;16yrrvB{MG((_>A&{r9nu@?uFcFJbPo -ze--M6L!~9_dLcp?OApvI2`l~+xZH0-8l9Y#Ps3S`aH3Q?uzGdC&K -zznM$agJ{|_uw4x^+?rUp)y5?>jRNTtSPT=CspC$Hsti7=s@w>TuS1bZt;L@*fgU<{ -zvv`^QGvy_O8FuX)YHbF_*7dcD^r@D9wQ%lZ4#ui>9%IZ4_&lF-^O9Jn<^~t1;$^Q&35cmexA{*6q)G6%sx* -z%#h5Ds`Mp2)HnImax}de_sT6I<~Ev|XPyV0qiNToJyNTo_a+&31C8f>Kq;Y>!)#eh -zseiUjcf?iXe|MOmI&VMn^#*{71Ij8>M)1=IYqcfM)b2TE5C+CORl1GWas5VXcPBjS -z^&bGa;rXSHY*8I938Ty+f(%!dFlkWjOqa>x1hfK~lEi7WwC8%_ -z+dR5)&TJd9s_}o>;WVUGab6vp&@;wzN#Ueg3rzO-ba{7FOiX?f;m5GKyEI7puL*S1 -zVdAq~`p+`Hmnu@9DO_Z8pCr~s?JijoR=nL4vI7 -z`au3>*4`l8e-|q4p*01Or||bmv`$(U&pq325Dk0@B*2gKulay>-(jgaBbegZ>4OYs -zDhBu~J&3)^a^&)LlkzFl*l1>h2yaq^z{b@uP42LTL(DthhJ?U2$K&MMSc1E*dpNav -zXw`gXVK2^5e}?ZJWg0z_x6Z~hhsOM2wD(rQ -zo2S#=-zik`?B$QY -z3C0h5uW2cY%nt{$GjU0jIyY|Uzg;Nb&^$~n%JJgxc_t79u_S=6R8mpOCbdx*-V&u5`s0e6@HB5If7NNF2pO>jM-DG~ -z3NB2qO=?AEpboLnPBN7fSS*`0q+vH1%0P``dBbflTvYrlk?0LuT|=g7kMYV3 -zLcxboBvNLipjj=&EAZANh8@Fp1>-+h?lFfz!1UVKc@=QYPuXr%36&!E7c*{a2BkC7 -zJT|vxP|{E+Z5Py2Ds8LVIz7P=ad;Ai1{+r3B&88F_%vqGBYv~y20Ye}SnGvOZrA~> -z633fOF|~buf;P%{f>mTt^gA`Hj?LF1J3a`dMvJknMlFbT^|dzdRMr%^Y=n(v`NY -z=~uDxe&(0oAJ(MghAjG;rA$Pfi3?5cz;-cbaEYL?2*~vq?vk&Ey~)(RlzciR0}5hw -zR`?rZze7wJ;Mb_IL(1uOvG^sv-b4xs%sMrsV(iN$+%kMEM42Zwy~NgBXcnBL6emNI -zh&!u0U^r3mpSa*pQ8#?CnOYSM^5_B4xcT+=uSPu@ILB4P9Mt+k5JJNDrn1MU5-qph -zh5ZWhdVML(_mpX22L7>Zr{NuMBd#3tu}^m1dIocXq)@)~uoU=}dy20gV!!A|8;h@3 -zMlB`~%=c83%at3=cW%7@_QOT1^rG~KDF!h9&wNu>S_zg8)G8nQUcWkh&Zz)}@SBDbl12p`KbzFBmpN3tiM|)HPy!2zRUKY7ni7o%>_JkRsI<2h -z19!BNsr^h{q;HeQz=vWKw#kA6CBuqw&6=1F#dz~0(2{sTC2E@_(G5Bqs2bwE%uquG -zJ9a2xb@Wt^lAZyYJ=P+r=2Q5L$)5+JPjmJU+BtfI{1}{xZ^(w__A50-)f1O}eQHK% -zN6xy0HIGZjF+*UsS8XSl*k-oxy2Q43B8CC9oaxhK5$Y@CUaJ=K?x`}{-|&Ovg4WzK -znIhEw=%0H9iJsqryGK~LgfDL^?)#P`ju -z$=#awl--Jp`nLp^)Zdw6_4`O{vR$(NumAGM;992xrVGb;cy}C$*<~|^MCm52f0_pu -zdC9Y@8wx(|k9E@lcbZY*(<0Xrf%#0#MUDbZ>ybaMwreSJ60;{BJ^27Me45rfs9I)N -z)rcy?bRz9;?j@SVVN*(eO$!r8)3|n*qHL~CRCfkNx;RS0WGaY>3Y($H6E_#zxRX`w -z^d4@$?kExk0gw8SolfC?_#&+TY6(xn_`*Z%w31L+)7*8n{xnB6|J4nyN}{&!D6{SN -z#SzNImF>(JpUn~@EiBG_qaS6y89kj&i&Q7LOd4K|*|mQUTJ -zYTMD97&qr*%fjB;%OinY%QF2E(Cp)@1(}FT3K|@AGhT7M1N4c}dImwM--%7FxL;jA -z$O}wLFqI~AT~N*5^Nw1$BkynL+|jDcmP%nYTJO#!T-5CJ$h!RvN -zQP2pSWijq6AEolQ9w6)Z-HenKqvekHP5v)XD@gDD-2`vo~DUQ2ru?Du@ZMAmY5SJouPq9Gb8B=?3j -z{}2+J^tgXi=H9)L?Kutd`z4(kD}|2S5?Pxmu>dV|JYECG*(Q;MmTGxATV+d5Z5*dp -zp&~SvKJL_rIEG0vv*DU6N?WB34?oE8ApvP_0`R6}yssGV$y*jry|&`8vZYZT5Cp^% -z|6UkoCp5uk2(c3yz8@SBo^ee;EDBP@+qF4jyAClU4giMS)yJ23H{uOU6YK%}{xk`V -zT_(q?c-dF~i85F1r-{#s`2Vm#kZAu3!sl-JnQzB5KgO>c#rk%EbwRp|2YhvrY&S14 -zQ|6R6Mb_xyqoZ$$k^;DGs7b2S{hc%>Po;_@Q@Fdi6x6gzy3OkU}sM1{Tuqg!X~3~Tb5K#vOa#tD@nfg0At&9B?7 -zAF2uzQ2+)wkKKmmbW9Ys9~71Jl%C7aJ~wTmD0_6tFEM=~3!_-8egg8x9R3%&@S5v= -z-+=(?WPqO*hr@!Xxy~CQ4J*R`Q31X%%LTHg@Ro(r?|x2RLE^@-lCX5h4ZU$f{~57(l*3w4u4`Qa4#zinnKKUye=^J`_D%-7PfjO!#%AP-+j0D^0y9fu@1BvAC1S@t^K_Hq!Cdzm}eYDCXaGtQ99W0NOO|TW%x!M -zyGlaY5u_FqEuG>;xijXHDM3cs-XC@v){q4?A_!&YHt#!f_2N)y0OF -z)L2DTkXC3-$GWMo&)PJPg%?om3DUF8su`;{$a8JHt{6^XAdPzi;}ErP{1ZC-WX^f? -z?95}AKRhXcJc=nmTQ0<8d!$5{M -zz<`$Vu5?TlJ&GCwtNOr}=|&RFxS^lDW7ZQN;s}syE|?pyeXZKd8sgB7}M=gjPhxOO?*D|cFZf8u;w>4`_XL|D80mv!zN07aLS(s4c!{}x5v<&kf$ -z{;0!KP|gVZzSpy;-u}!!T8y7NWSUmt?8!218V9MCQd^=ITgW3>j~l@F^5A)2f9Te0 -zUUl3#-*e`8J*Bq{LJ;0@WEUL-xv-`r`T+7p4$!Z8#)qM*blU0@LM{A{fC+}}MZ{Q} -z0P^jJi51F3{6$~uq~VY^G0D6YQ5mm(|9Sqx2KZfP`+_ID725fbn%#HxItPLt9HD(9 -zX?GgLcFNTH1FuX?>yHMz{guv>&PTv&tRxazm{psFk}Y1)(dNNJUZ&!|J2tCrEn?uy1hfxT)%?#U(0xVW2Iw8JJ%;kD54v{ZsP9QS;< -zf0D)LPP63^lf&5LAs!6wMz9_`yOkh@ZiZHc`shyh(Whmg2&en-oyDkJs=2G7wZOgg -z5*!&>MeVTc0oOlPO>tdzZ+!XHX0alnX+gD|vmopR->oITji(b)4Su=f)P!)j3b%GP -z%v9YPcq`d~Vbf6OIFU%2-mTEo&Ki%u91_KI2*n5^h13$ssVm|V6G3q{Ei_lgrJ#bOI;(6nK0gS8cu+WgpeF2HVjR?$j -zU^uaGUtn^5+?d^2A1?CeRXR>PY>fjM9I-{=+6~2nwnAVRpw7ZF!)X2dQZpMH+@n{@xpr}5L -zq)K_gN2h>|I(Ly5l-vBTP0UhibACE|t2dbWML+6W`>cMtaTPCE>S5M^q7Mx***$|s -zZ0-Yt#`Gi8Qq+7JFQWfW~w}deKGOV#LmSzB{)gpjb68TQP=ETYeE)k -z4duTDY~s%%aNjO;D$}IC3s@@{zdXsn3*sv!lA}p73iK3Lq{&XbXaX+ivs;1J$=s&* -z#PfGMQmmb>5*SBpeY?^RE0-GDJQz_YaYXe!cK(Uyw;{xz-@nQAEL2TM6sK}E-C;Ph -zuA>!r;NP_DXHD#GvyhG&H~!DXO!+RN{eYoInJhqcFP<-4@d#;<9sp@-SeINJ1|0@q -z35GKA2z4=&_&Q_~p+NfLyau`gI9NJ#{&>V-rFsF?{IbUBOk#mK4l%@dv%r>#O -z_d54ZAFuPy|UfrOf8t<1y*G>Unv4}TxSJ0i>4a-a2O&Ts!VUIpCRv3+2|XucfQP~ -z1Ons#&a -zI;|ljy+?lXdYqx!^cNw+MM#<(!ZL-B=&$#|-JJaVG&VYzQI6wJy%$@GH}6k9Y>5f+ -zziE%y;J-O*{%rL&F_1Eb`eIf5Tna -zV`YC;!U5tl-a%WIvc^W=#sSu*3S+pEAlo~abZdOJxWjsME?iUlO@mCi?5|}dwf0i`hhegZNtK`BadQ-ax&D7FpybP*& -z!$1wYx!{P%UfATzu=Q`rRKox~4Bmy$6rdljK)>wiAx_MFp%chv0Y;OW-J+4~)R?ZQ -zmHs=Bkqxg){P4K|z*GMW=_Uh)qz~sDk}hN#fy|tF9FvEWFfg~Lku9>gIaWXmAK*Vb -ziZK=&+fKEM6Hy7>Ita0iqgS#k%t40Ys9c+WT|MD)&N??lRnYfy(XW{%w|zV_nsUUkyZf`a+J0#RvNgp0S=ea*jdF4oCO!r+83WBKj~-6vMWl%j -z)0ABf&7xSKg9pkt8jBbfz!hri8Ye4np#-`B15T%Kq|$MNIMUht8C<+zl2;F( -zI&F*Ubmd}~jVPAso!ntb#CI)t*kNHcAGLo@-+(AM08sd(nY}}mPEq1X|5f`1_UW3@ -z_(asg*-a26E;XA<>#})m#^ky6#RxXJ*!5FyRau1BufeMt=dZOr>sW`*)X}j -zPZ@8U70ZocYl)iDmoDIGiK^f>mVDI(Xbu0aUYQ~pLtkMvWmD2*wE{2Jx$>V!_hc@b -z>6YA(#wg_kIXY~qJaHkfdJmQ#b5Bf*<^LhO0_q&IZW3le#F>%==q6cr)#Zls{1@BO -zSN!kDOCJhWF97IBZ}*Y;FbT0BSt-MK#5J(%OO^6I?0$U~&KQz_3>W8D|84pw!)#L_ -zQ-w15I#sWj1Kq+Xp2uE5zWmUhB7(Ho%P5}L&$(H)dRNdvmIH(H^cYKpnaGl$aDurU -zE%SY+)+;#zVqd=xlI0Azd3u;Z47;9lzA~&_sO?XFRnzbVuV*eLD?Yp}sLN%dpWp>& -z^MggK+>b-SUq}~!>&Q-Ayl5_lna}<8sujGdms2#1CCSJoG;YCT -z@3d3TexR_OtSjevy9MHhYW5Rm=7wm*q)~Ll8;dj5)u8dcm1@9u-97U2_Opil1bB)z -zY4$X^W6(+1FHFZc#?NaS4o*5*QQ?`X?yFvFU~uJ3JCf}$M-bfMT-lr7n!ZX+SF_L;E3@nocz{1yE>|$^F+D9#oDE2{c=h5`SwZ}jyPql4vX2>V*dj+STs!d -zYMj7saXG8{W)Sy@Q}c&hlZ)4a^nxn?f()OD7qcR@cwoPsP1*3@51H}Iha+1y4qO%mw^x6*FPRLjqtC&pXFTDc -z4;e{N%{}s{-a@i~F6Wkn(ZVI)aev6pKRZDZ4i8>cd`nj&&wo;p>^&SE7rXE{LN)p3 -zUD^JIJ>l`mYZdu-JD7u;SxQmQVOjvUv&F=fbOds4GwoxhZAR8)|1r%Q-@Y9zk9Hx= -z_R_%+?G8s!nv6zU4oWpSce6e=EcTNqv)nfVGO`kF^%Xa+8nU -zo|@8&lG{b<$%9|$m8cPh&{uKj7L5n%b~0Qbc=WWEQu42gFFawHpBsnw_o|5v4YyN* -z$zm1tup0atMUSrX(5VlRD7E!Nk*?I=e-dRet-ey`qADwYg^ -zU;D}_^CaHKgh_oNV;u>6gpNv;ssk)n$!u7ucrN15iqrm=gtAfEDV@99W4AfJ8KkMB -zMGj+K?ys%Wuo;v=ykk_My%%m;mNb}ThP2u!eB$4~YKjPeSYm*sz#<*!$tZ>eQv6N; -zb~6s(UJmC}=)dJt_?9jJywCyee^u@Lo%rVnX;|+ri(dSus6!J{WEKHPB3nPwI%2?ftR@ize=+h12dQk~g>WdGI -zM~ScCY1CT2KdVZ^QzBM@J`%m9XSXmXe(>UwmjSJ$AeC9|-*b0g6t=H+yc2nUYMob4 -zLuat5B{@GWo*Ml35UdMEj;(8#??aOX8aaB=KmETKAR4vI9L)j~*~>f2iw>oQoBof| -z0TJH^9zmvrO9xg#qG!OvoI!pi#_v14kKiO_!Hc4)A~?PZ_gYQ+dHreC=wBz-Bt@T1 -zxh^0Y&v&;~Y>VJ-m!_A5seUnhg$vP=ZO^gV=J9Sf?KGA)aRPUi)S+CXBr|9bnU_y) -z+nV>5=9yK%jM2HaGN@o6hOqbuGMuL^_+5P+8|;&@=FHx-rbX`vDP4rdM`jqY8)rH- -z$cI73t3YuiCuL|b8wHLGnpOjkS=+hbY>eKl$$x9s389lTxv=keWfwqbim?M9*D -zN`UzMFPcQ3&TAjQ!m{U_ymNSanF|AxKkkhd_MB5~ff@p|dN@)5c?%$9cd;YBJ7hcuBrXRg|e1lpU -z<6&Lj`-*OgL?um}=WSV=jcpL){_!(HCtjO-v&a;0{w8U}EjjL{XC^|h%AuS0h^0kt -zg4C(>kLD9YR9#vo{3hW_JN7>nBw37zedtlk>isTZQI`p1a7|Rd6qr}x%}Qn!lB=LJ -zbl5(`AoaFo;Lv(~5iS3K%;5z#S_47gYau?SFP)bW*r -z_E(H0*OroK!XoYPf`vV@BblvCQWk;wlP{zzpu~l&L8igd`Q}QWQWGt3f@!*PhUXyo -z$EDGgYk;FJC%CAK7mZuiqgT%H498Sl%YB=eiDEZsTq&=Qw3x?Tyz38gR4!z_IoNpG=?h<}&HmFV -zm-$Gv(DT%RsX0aX!-P9mW8OyFiD8#6MVxsyD}c6V0- -z#Mb*pA6)=s18$kSnFy}O>5lW-(D)9(_rz=}kz>zmO6T6!#aE?qKzS$Dq%`{jNZ${R -zi8vO5`5XFN?rxl&IPpY$3_;nimbQhyX5vRUeFptx5MK>{VmJ -z2o97~#k}-KF~88qx*QaXt<3*MJk$YqvZuTC;=-+d`!On+#jRJ?_7V+ehE9IJq7|8H%(YswF -zMV_Nh;!O<+WI`)fx6}TeG<+1=lvbNIap%hUU;h&%`~5Dbr!F;k#bU)J!X{GykhA!} -z)f=|8hNm1$Q1P}nL?K;^v|PVd?Lu5ubw(W7*j7%ZshLB!%(b~+TrB94C|Y%PNW@wx -z?)ay&B-!R`zmy_N>IFgQN#60i#EN=N#+p|W4GevZMe*TH0ew9^=F1D#|3Fv!$Bf~% -z?!zDwYNfTg3kB&i)r6JT{ImdMjVqSY7qc^t%Q4^nn-E1>oPH+$Kg_+stJ{P<`0B|Y -z2QP4D-m;-3A%S?(hr3vofEb?Eckks6lfL~YC -z>&IeYDOv}W!B7nWf)|xKtxQQ9t{`<`Y-|5azf+0BcveDt_Xm0`GjyXxs?U_EV~n+i -zJ51O8U$8;Fyb2_S_-VZG)E>4bDvrpEl#f31OrhlZHv_m*F8?J@khm^TB5V3Y^uHyu -z#)!BvpfvqS87ztuRN?y3o2c9KyWWuQsB^Po;QYJI`?m~ilZD@F!=aD~6fmQ1dBu96 -zPTog(s&qwdQi7P+#*4s$A#^$hpjFdd*I?Qut3f#ki@76XpCm(@e>imNGl=PjPFBO2g%@>~lPojUq* -z&~47;d)MUQHXP0#LknKtp5aVv+Yd=RKgCqa?`qJ8Cg*<&$`+q-q)zj3O6C(tgT6ap -zx|C%#=Yg;4SOFJmg1$~E(vS=dOMWw0!Q~1T<@>QGo34j|7>aL~Pd|}kYswt)q`1Tf -zlrk*v0aly%32736RWn2y#4yH443oE!|CWg%8Tr;4ZNZzUk6%4J(>e*O4#WCGXtK7< -zeDei`<9$1NU&?xm -zC@OE5Qm@<$lBHZ#7RkcdJSL6RHDXq|8ex2an&32lDb{KFa!S9G -z^0ymBk-pP6rou!1Ll~CyVZ)pUCeq4yPmb&<`4*L3m0x-|YheRg9znC8OB+}@WsVqK -z{4!fqIkU^hpqfW*bG2a~aXd=i1zbKz1W)JNU(H)*_kvn{4f|}OYWogb471qE1MPae -zy2ziLVuuyr0_(N2_Py&RgGSK_^EZvEdIAoV3s6rpYq(Y9m%)B%3obw81>Yv%H)$cSdWKpvd3^w)qS -zO}8T_b5C|*zsuEg`jdzg21cc^+DhY@R$7keSgf=edV+30w~&O7S;N|AxYeWSs{emJ -zn_-)uhmLm}i<%SmV&E<_#q$jv>=FRwpvw-c>!hnm-4*d3)sVhtrv%tIIid^N-CRXpza^+kpYmjL -zk>tS$e;i6{l1Y!)*ed!^a0hv#s4b&B87)LX=idb$_;(wKb~B2oEpYkhq=t*%;PZs- -z4eO=TJ%^a1=T1pq+)$C&Mts(W8&LNyPCA?XAv0|?(7is42bOj9eW^1x+<3ECJ{3(> -zr9X~^8*i^EnZ*w4pZ%u}6DLhpb2~BOt!OMJ8rt89yaa@8`(TRVBv0c6 -zJZfU5a+h{RuVl&Q4cd|O?s*Nw_!ohcu0LTh>zE@|LtiX~<)ddm;w=%vnnb2olV{N( -z7ZH9pJF-YOo;2i%R|a-?fx{^)chnm^R%NAVTY?3?q6e`-fTaadtQbomc0%7u1sw{W -zhZ&AaD?NAWCY3X&w%*L%yyFrX--S*Nt%tzYn${G;soD>0nxqVPyYG`D?-8XzR10lM9l1BT+m@E6JK9AOWsz-vIdAPh>?COyFa_oY=00r= -zUPMf|up$BIS&7*8U+_EhQn%58g%k9W#5^l;$dJs=DNz{B57hgws^P&^OFrNm|S8Nb&$K18g&&ywC4c -z|DgfL8Guc713FD-X@k?LNLrR0G82uQF#3&P!y{;^s#;g+PK{hYEL_UQvvA{6%pRj?{7;e(;w~_^;Wje#=zdum@V^j^DRn -z7VDot%xr*;HWs(E9UqR%Z75|kk=|#}adauA6c^7u61>rdgNMOmF7N>|9x8$vWEYJ> -zRDR46|9dYQRypTa)=$Q#iox@%+@Tp(hL|Ic2vOznHK()vI{qWo+bq8XvHmf>R~3S2 -zi}gpd#(fs;-O7BQxQtA?^4j1xMe>S+_@YWXf{-`B{;3=Qv7nZ7;7Ph4rknhQ?P` -zq0OmYLL2#cco9GC+d?FaP771sUa}x-k-J*yu}WTbqL1>%3=xcm@1Av2A*YkroOh>q -z7Mw|H%I>h%5tTuGX3u5Hl>*4%pX$`1Co20|>W#BV=Jzd-OM*5DkZM4ra>n^p#ijU^ -zuuml(trDf|6paMXAP7KNC^Dz63}V1WLhr1tZ8)ej&CxB==C9rkJ>{c8`rsjGP-_cK -zY`APF5t}tOuop)e^h!HuN0Z=QLk3^Uu|$~?%9gyUw>#Q?d6;$;#fXgb(VKaYnFb8K8Py>24?y6@Q52L -zPdY4j94|uYHWiPUexjp)h$scP=!-TR;{93{^;#t_h68eGjH&+quBT`>w(I-Nvi-Yr -z#*fHVt`sp`G=l&1_NGj(n=_X+h5raJvhOjeA0&eYv?IiPRuMIsi$H@TG}UFMVjbg% -z_WY7RHc}!BPWP9PeO-!ycXCSHL^CQI+EM<7k!efyE_SbcS!2RM@+41zgSrGG0j`~= -z{-Z9d{%=~hB3q6FGe`xJ9{cpa-CaGVLl2A-A{pa1GjuuNM~%NcOd@RToXdz$Ys6gK -z56aZ%f)cNcg#BsDNV02clUx}WvGq$`-8Xqf>P}2%Oi -z@zO4p=MNYG_F6Dy~fs2h1bJSP}M#c!R5hE -z!8f?ZsLI{H*g|8oQp}D#yO;O$A}W{nYK?*2#FCGk(<^@SpGg_tnf3nC@}1xP#6#8l -z+OC?PYq2Be`>UoVm!9Wg3uSzkC8j~kNc1;~*6xB3DIFv#1fNOZQ^UkzX7#MpkNrb) -za3IXh^ABZ-`ISiEGW}U#60r5Bea_TyRCwiJo8@mM{fDv_??o+(%iyS)=us2Nu@sWO -z1$K4bop3u58i_b2=dlBXc%0?~keSx@=r7Al9I^h9zhkbm3=Ps#-{YL!d#rdxj&1fo -z(C^k178~1#kS1TVgTkxtB7(Gs{#6fVzeBb-KKY6*>^?eQy7oiq<68goHj_NM0+V*- -zFxBr}F7spx@n+#Zq5<~;{KRBC?KHk7DpTRK`J#gfC*n#VvDiKdaNZ5!54`w3%qU)kzQ0iVX4~7dwoG|Y{`I=Z+^r+oAM^#17$P2s=uS>qbDewLpj7oPo -zu^O8~m*^wX-#q26lqa~Rh9ZI{*!VT0%O_+1y>k53M_Y_#K((+493t4y)!l8+Y -z0fAcQ3ubaW{~ZN{QN`-Grk>3MxMLJDUS6@su%-11RA!v4n)xAmS`HPtv~4`$_zHIyf`0is-?E55!J$H=k%kT|8c>8C -zt{iejz+HMIPFR?ZzH1kapras1%`xog1`;e<5E{5F-;=Om!nNq#2zX0Qo{YWdoPke_Qf=s;f`vaJ(n>i`35VlkuvqlDB2_TU3xj> -z&N;Yawr>kT`N*|?{(Xmq#P-53JLs5t(Q!=#`HD0+&rqC;IW^othJP;rzN;CXbF{6w -z4}gs;hnERczm2N4l2SP9(OK2=%vcAtj(2jz2~Ys46DexM9UJ#z#v3C5D)>;2zf&63 -zHi%%-L`Z*5Hzwlt=j0ZN-BE%tAJXf*S;c1)H-0b$NEI}Kn7Z-Uc8~vTAuV1ehnRfh -z1E-JFr*~!*!Udu@=I-4aM&88X^_V-e$=Uv)kEr8i3?XT5a#bBdB&HBpbROubvf^;0JrV&15&O;+D -z!+b=Szlnvo^52=#SxEk3&z?{vbEzF9jfN-d&c49#vqN`XiDBD>JW)?cjD&dnNFZzZ -z`DG}nM76`*_f7&mYgG=vtew&*y;qJ7A_WP}!C|L_weh7l)kvGX-BrnT9kZX-fBZ?j -z8pN49AZl_vvp3FkE*g;LIsvWW{NtLvgzkv~+kgxNX@qGr4JjF??tDc(o_#_qt20V-6 -zJR3XXyQ1pxvwlW0%_E*ggb7%Z#UW`kXXq#HJbn%-g$0Lo+SemG4J&r1T|6rLzeFfs -zpmm7fA99!DN`J_eZ(`>r>Yq$hZ2NtaU5V$SZlmzpbeZ#PgBO_64EiiKT@($=DJ{=4 -z!LW-uea)zngZXpny$gp;F(u6mpwfC)a|b8W9&> -z6)h@mWi*(AZD|es@x10s!{|N-TWsY`8{3=Tlr$^e`ZwH4I$ouy1nhs%b;bIPa#^_d -zG&i(qjy-bgiprfh!@|GJga6T(e2AID`ws?nVIOk`0licGXUdu>Tk}2{=3O*2Z0Pa~ -zs5DAs*f>y0x@lbYl{TXORzMRt@aa}ijhNxYnXeAQJhBhWwXCRzvi$&1BG-FzUgq9^ -z6|EbI{jtBqPUyM))lmV;g7)(OX0%E?2t$wQ{fO#Uh6|8~87&(p5KLL$-! -z{oQ%$=yz}Uc`y2&z~q5r)`4X#?||IKphtYC#-I$_{>4H3GZnmvYR!K@G1o^nz=L@& -zERb1qR)6QGZlWw1C%)P3n#NJn4s>{gD!YsQ(@(&p=zf*iKq4fWPd=Zf=m@egnHV-+IH%O!1JqM2?#ELKuqm{%CaawJhJO7>a5-z(7g(>r|XG -zs1`9q8qx>xwYE)L;>BRr1$ -zW&}jz72A7ypYwkJ?LZR0ZE^m%T}!AkQJ&i>W2q#wKW&fl?r%{#rAHZAqOtCh%l=zX -z_(1a9ZHj88ecWc}b)9ABb*7bT{8$ucK%S&X1PNv0i|Lqa&?(oTt0*yr7X1nh`W71W -z$QO@{6#!4BL@*1$=(JBaX`j(FpJbSb8Y7X*opW5e=DPIA_vl&R(?hM6IdqXy%p999 -za%?)}1ZMvB37GjT$KiJ)Ew4$_AstW?wQlspi24%F?>#c%&mll0*8(s~ -zIg#YC1i*Y!5djI5T4N5*2;37Z{dCOb+DwilahD>B$xXt1TgWOJVUV_>m9%Vb@q!J2e~)yFJW -z9yM5g$Y9w)gC+Ze)iN>q%PiPyGHf3sjn#O1bX;|3s2JK&I?qa%#wbHUjDXBja;+f7 -zit7&GmM7~zEQ5}qNv$f*G4+Xh+;uA{}*b)N~=Lp9{(y%t3feZ4vf;We;qCRMQ9-_TYc(C -z?HwUaMw#X-Y2ND&DLn#JrO|{hpprD=Yms%aH1WD5sV)jy`qt30udIvJ(6V1`aQ3gE -z)j)w4IcsS-FhW}Y+5lJ*t7D?Rv=s2_U#})jfmS`K0|a2|)G60#0xtvW8z*&812O`2 -zEx(Q{$V(Mi`AXm=8Yoj=MU|SB_Kik3sS -zHP_(ndAb6Z_ZA4a{C}*y_m@<4`mX)`N8WQBvtmFU9d$;>F=5UKqF?}2auP+dC?Yuv -z7!VN=$)M!WbPmwu+~iEhiaYOpy>owdRd?&mIcvRZy+1r_@2alquC6xhtM2ePJf~{p -zc@D39XYu+EHXVPocypn{dq3H9Tax9yWf|UI<4Qz6x2ricHZUJ(>6=b`K%DUoC#Te -z9+?Pm@tzd=hrVRqgcAlG3ch1ux=U0GrRj`B3g?u;gmUO!81U5gfJY0Zeh41m -ziK39li?p0lN=qJMv~y2NP5eQ!akrS=b|LKqA6tBS7x^qd1ATU6`1_WCzsn*fd)F2% -zmX!Ju@`!f8NP)>&#aeZ=Lfq7tk3@`U@i1^$3h}H^B{``OXZmp;H)&?^MWVY8c -zxS$S&`$rVlp_=8#_vorbytchyONBo -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 -zO6382d_S=%Pl7!adW$2TxK5gO%7(x -z36F11`FwZEXZ|UVA5VGwblQzu$&`mV=dtpPQc#FyYsYM;rM4NE7R7Y}V9xtU4aB>Ue05YmPhocFgAYqgmD+&hq;q -zi{B5biaB7#{)kn3eOB#tS+UzTAhT?j%hF1Rr4=r}mb)w|i$P{#p~H_mq{di$zs2Ue -z%?{sewE1SE!`$^2bJw|i{hQ6~wHCA1*vwpQH-pU7r8bk7I!yZ2X5tcu@jvH4CI>Of -z$c&yJH#RoIv=|02e-RU;(Oc%shyg4{yr|t{a4+h^Kf9)paa<_>{P4ruf#xx&;&kr|og7R?CT%uORK -z;&HfXgu{))ZEhH5as5zPin83GrGsX_jKvKfWx0M(=0E1TfoZNAnEm4nu+4>doQaWT -zDif;>#!i;VK}!l<)W@UqB-i)VMZO>=27zlnY~(LJnz&YzS3|lbxTb4@Yu<|k_W9i{ -z`JDg$`ZxFcjuII+Sja=8e!OXS2 -z8oBnvcvLcQeb0m$o$G#6JkX=58Cq0GpfUEjR;o)LUas$(MI(r5eSWQgCI>HhfYC93 -zo(C3L#ja5xUly@HO&%!o8K&z7+h(C@i<+W_u)L}wOPGZ~MSoY-aNqPv%cz=L72WxU -zyEu&RaOX&ewj({-juNzZ+^w>S&pqz_+~xkUE)RU^@b~e`ws>ZTi@@d4=^jta3VD2H -zz>_n5p8DG3`FSoce4FLv`3^774{84+bX@4u<>xH#EzR)miVR&>I1E@`&+ujE(V|H$ -zpj1Yq!OGC!IHo4I!S`vB!rs?B?PMx -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 -zT~{Bm>X)}SY4fE -z`(clh37-Z}un^JYcySot^UZ=v%ZiL`%ylC?h4W<-^C0W#Jc5Q?>m0X2x -z>rxD_%y76-nHRW}g?cs0X|biiOQiyqGEP!nA`)4T#;ni9takfA%9W)oVC|WZ&YK$P -zvN^$TXVnr0H5cIMiHJQ1eaa8{>^=pD&%^d3FnV*AKASB*D~y=21Ey_nXEz5!;k4?v6=VjP+5!RiA -z0Xr;S-X8FrY*e`*`%^^<>uV!@ycgy90=aiWJ}QMiQeLEtl==+b5i+AReoa%#BE}U5 -zOx~g9F)jIojs+gi6nJstnCg;cLleXlhdf>ik4tgMHI6-{)e$B}0IwIvODmr!hre&} -zd3CGD{39^4Myij^!`mGmD0GdrOV!BD@KOMesq$C=CTQ6nHY+evVe+Hbpq!6d#$M8T -zkK!1d6y$$O7B_|dRS1xqM+7m(J{A!#u+$REKPoW!F#kWAA*KajT3gEgPayL@UDscs -z+xja;h52AZEj>2Y8i?t;wSj(H8yK*qmVsNZGNiDP;U!5%l*me!8&xg~Xv*stU0%<~ -z$|gouCKy%O$QZ#)WjzzCo0zgE%ZMtM_P;gp_r -ze_avJJu5TZv%=z@6*hle>G0Q;HutS^j52fE%78Y@EZQzj^7#4;Z|_JkbXSINkEBh7 -ztXYIvXS27_p`tEJ;ngg^owxbnq{ZaJHe>c#^r;lcWa(0prBku8D*y -zZQ!R&Ig!BFs9sgby~K+FCI>S4%*ab6VY9vL#au;kGfCvIw -zZ3Y-YjIuEA?i7ebd{`aQGpC@aMJzwYR<_6E{oNj2cYC~B?IVCOvnxOf&HK4MGdd~@ -z(`%=Xs+9Zg4e7H#G-3W2U;?AUd?E#Ae;nplpnuo_myrh?qr!|iC>xoom0czrc3P=0 -zF4K>@%sSyQ=cLEH6RuHV=AUv|csgz+`{hgwF-y;QtUQ;iR#r3Fd5?`3eYRZo*?!rj -z;EG4V)mVusx$2r_mpkh{_SCDvCst$REw4$~oJu;>Bs^o+(1N(iD*@||W%>QM!`i&9 -ztOi!sL?$Qm+Yy`J4%@6bq+E>4s{PI%ASMPGhvmCGmKu=p49Mj3F#?%bk#SkD-80s* -z@3**ow>gFxDKeT^k+EZ#S)C93OO44}%UmY>;_&6qHlP1w8IT#dz-HJFHlNPdIDGQG -z!$;q_^#9hT?>w8{bM07(nd2CUd2d$EN;bpht?4$MWG9=N<@G5RuT61yd5Xh}Q*2(C -z9FG(k12dB>o|l(|MvNL&*F*%w%#0X?Y+s*3CEvDVfLe;nmZ_84ok-bP4!+DU2 -z&+S$UO$*Q%%h>>3xW^aox^TatU(4jx7AY>8JiOdAAj6IQQb++2$QYREorrJizCMj+ -zuIt^%^%`RXi@KZA*1%4s3q*8YjMG|IO~R-vD7@KWtgzM#$*0I -zmo0U${en&TrFfsr!gC%ybS5b;RqUH3m0J&nTxwE#m`i;!%hh_HOAS(CA}*y|>YRvubuhg=O}|2yssto0S=|E8 -z%LG%-{O9)R)#^^FQ4-)S;1$O!MKUdV1uh_m+lS -zE~b`&1r2;$*uBFv0ChEbcJ&vGgARCJ!&Ml}zeOihGtPa}bl^uPZX#yV5e? -zB6zviK#YaprtR_!cdW?Lc4e9eS2yweh9o@-(~Q~U^3z$1wO4J5&E5--ef2iGuG;25 -zCM(Z5{BXkJ%R??7SKIWi%$miQZx%ZyztW}Drb}_g)Gl`~w|HM+|H_=btkTQ1msz~I -z!)nQ-6nS(g_Dt?Y`Iom!Y~C%8ThBf$^XO6T^I>_&`(+Awxx8BvFUQnBd&h!ZW%kKhkYVkU^c&!_iZkDhy7KHTH|$1+Uq -zg6V3YMxlO>4|aL<-s#e3mrI{L9zFNv+Q{}Q2NT=KKH29pWS_@Sqr&)Rx#h?Mo(c4~ -zWMN#!9kyeLIqDe|X4-L=nKf!9^O$qO=bMwBQDGLG%tK5Z>X!;5JDDJ6t=SKgTXK29 -zH+dMflWn`=8i*;nsy#8Dv0m=1_syOJ*)k3{Ivi`VIMI~lWWwfT(&Kn4G8Yi~q_gCb -z!}^*e>uOxq*7&SB7O>`s&$?rwnct51tU2VyBQ@rL+X`f4EAx!4EQT00mMP@#vbZ!3 -z`Ttbpu&~fGLH`BYT@&_?LB=zR%)AX!WMnO~aygk8Vy3T(ZDo^}S|%Seeu>l=HI~_o -z{>f&>I1Ky2F(C8te4ByuZTf$grQbIez2{l=WnqWRav -zjG0F#Sv)$~=HcmC9-fxrq3IbOnr4}KaH_-olO67zU~|tnHJQZ)04f16HZx;2lS0!1 -zHL*gIrOil(J}Z-_9TPdtBQuX+Z6|{wXxq -z4rrO{^m`A=n$dfq^BC&V=6x|=%jHp;m8)FdNEsvDr@Tt*iSNt3#~?(Qv^_ -zycbA+ul&9s?P$^8FkUhlhw%k1cZ{$MxJYRcwA}N#@>X$)glvmaTLdltm=J^WBa>|& -zo$B)BG?%Alx^XCfjuub4yzq@{5nDHEvo@2u2$~at71+cBJ1teWmJK